@ifecodes/backend-template 1.1.8 → 1.4.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.
Files changed (93) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +423 -365
  3. package/bin/cli.js +1276 -836
  4. package/bin/lib/microservice-config.js +155 -150
  5. package/bin/lib/prompts.js +277 -241
  6. package/bin/lib/readme-generator.js +364 -335
  7. package/bin/lib/service-setup.js +901 -679
  8. package/package.json +64 -55
  9. package/template/base/js/.env.example +5 -5
  10. package/template/base/js/.eslintrc.json +10 -13
  11. package/template/base/js/.husky/pre-commit +1 -7
  12. package/template/base/js/.prettierrc +7 -7
  13. package/template/base/js/eslint.config.js +33 -31
  14. package/template/base/js/package.json +29 -28
  15. package/template/base/js/src/app.js +20 -15
  16. package/template/base/js/src/config/env.js +32 -2
  17. package/template/base/js/src/config/index.js +2 -2
  18. package/template/base/js/src/docs/index.js +5 -0
  19. package/template/base/js/src/docs/route-registry.js +63 -0
  20. package/template/base/js/src/middlewares/error-handler.middleware.js +22 -0
  21. package/template/base/js/src/middlewares/index.js +9 -3
  22. package/template/base/js/src/middlewares/method-not-allowed.middleware.js +8 -2
  23. package/template/base/js/src/middlewares/not-found.middleware.js +4 -1
  24. package/template/base/js/src/middlewares/observability.middleware.js +24 -0
  25. package/template/base/js/src/middlewares/root.middleware.js +7 -5
  26. package/template/base/js/src/middlewares/validation.middleware.js +39 -0
  27. package/template/base/js/src/modules/index.js +8 -8
  28. package/template/base/js/src/modules/v1/health/health.controller.auth.js +29 -0
  29. package/template/base/js/src/modules/v1/health/health.controller.js +4 -4
  30. package/template/base/js/src/modules/v1/health/health.route.js +70 -5
  31. package/template/base/js/src/modules/v1/health/index.js +1 -1
  32. package/template/base/js/src/modules/v1/index.js +3 -3
  33. package/template/base/js/src/routes.js +13 -6
  34. package/template/base/js/src/server.js +18 -18
  35. package/template/base/js/src/utils/http-error.js +27 -6
  36. package/template/base/js/src/utils/index.js +28 -22
  37. package/template/base/js/src/utils/logger.js +57 -67
  38. package/template/base/ts/.eslintrc.json +13 -17
  39. package/template/base/ts/.prettierrc +7 -7
  40. package/template/base/ts/eslint.config.js +33 -33
  41. package/template/base/ts/package.json +41 -39
  42. package/template/base/ts/src/app.ts +20 -15
  43. package/template/base/ts/src/config/db.ts +4 -4
  44. package/template/base/ts/src/config/env.ts +40 -10
  45. package/template/base/ts/src/config/index.ts +2 -2
  46. package/template/base/ts/src/docs/index.ts +3 -0
  47. package/template/base/ts/src/docs/route-registry.ts +98 -0
  48. package/template/base/ts/src/middlewares/error-handler.middleware.ts +26 -0
  49. package/template/base/ts/src/middlewares/index.ts +6 -3
  50. package/template/base/ts/src/middlewares/method-not-allowed.middleware.ts +23 -16
  51. package/template/base/ts/src/middlewares/not-found.middleware.ts +10 -8
  52. package/template/base/ts/src/middlewares/observability.middleware.ts +25 -0
  53. package/template/base/ts/src/middlewares/root.middleware.ts +16 -14
  54. package/template/base/ts/src/middlewares/validation.middleware.ts +46 -0
  55. package/template/base/ts/src/modules/index.ts +8 -8
  56. package/template/base/ts/src/modules/v1/health/health.controller.auth.ts +26 -0
  57. package/template/base/ts/src/modules/v1/health/health.controller.ts +18 -18
  58. package/template/base/ts/src/modules/v1/health/health.route.ts +68 -9
  59. package/template/base/ts/src/modules/v1/health/index.ts +1 -1
  60. package/template/base/ts/src/modules/v1/index.ts +8 -8
  61. package/template/base/ts/src/routes.ts +23 -15
  62. package/template/base/ts/src/server.ts +19 -19
  63. package/template/base/ts/src/utils/http-error.ts +63 -45
  64. package/template/base/ts/src/utils/index.ts +14 -11
  65. package/template/base/ts/src/utils/logger.ts +58 -68
  66. package/template/base/ts/tsconfig.json +21 -22
  67. package/template/features/auth/argon2/inject.js +50 -50
  68. package/template/features/auth/base/health-openapi.ts +62 -0
  69. package/template/features/auth/base/inject.js +174 -172
  70. package/template/features/auth/bcrypt/inject.js +40 -40
  71. package/template/features/auth/models/user.model.js +24 -24
  72. package/template/features/auth/models/user.model.ts +1 -1
  73. package/template/features/auth/modules/auth.controller.js +21 -21
  74. package/template/features/auth/modules/auth.controller.ts +28 -20
  75. package/template/features/auth/modules/auth.routes.js +89 -10
  76. package/template/features/auth/modules/auth.routes.ts +86 -11
  77. package/template/features/auth/modules/auth.service.js +29 -29
  78. package/template/features/auth/modules/auth.service.ts +38 -38
  79. package/template/features/auth/modules/index.js +1 -1
  80. package/template/features/auth/utils/hash.ts +20 -20
  81. package/template/features/auth/utils/jwt.js +12 -12
  82. package/template/features/cors/inject.js +14 -13
  83. package/template/features/helmet/inject.js +7 -6
  84. package/template/features/morgan/inject.js +8 -7
  85. package/template/features/rate-limit/inject.js +7 -6
  86. package/template/gateway/js/app.js +42 -42
  87. package/template/gateway/js/inject.js +33 -31
  88. package/template/gateway/js/server.js +19 -19
  89. package/template/gateway/ts/app.ts +43 -43
  90. package/template/gateway/ts/inject.js +33 -33
  91. package/template/gateway/ts/server.ts +19 -19
  92. package/template/microservice/docker/docker-compose.yml +5 -5
  93. package/template/microservice/nodocker/pm2.config.js +3 -3
@@ -0,0 +1,29 @@
1
+ const mongoose = require('mongoose');
2
+ const { logger } = require('../../../utils');
3
+
4
+ const healthCheck = async (_, res) => {
5
+ const mongoState = mongoose.connection.readyState;
6
+
7
+ const healthy = mongoState === 1;
8
+
9
+ const failed = [];
10
+ if (mongoState !== 1) failed.push('mongodb');
11
+
12
+ return res.status(healthy ? 200 : 503).json({
13
+ status: healthy ? 'healthy' : 'unhealthy',
14
+ uptime: process.uptime(),
15
+ timestamp: new Date().toISOString(),
16
+ services: {
17
+ mongodb: mongoState === 1 ? 'connected' : 'disconnected',
18
+ memory: {
19
+ rss: process.memoryUsage().rss,
20
+ heapUsed: process.memoryUsage().heapUsed,
21
+ },
22
+ },
23
+ failed,
24
+ });
25
+ };
26
+
27
+ module.exports = {
28
+ healthCheck,
29
+ };
@@ -1,10 +1,10 @@
1
- const { logger } = require("../../../utils");
1
+ const { logger } = require('../../../utils');
2
2
 
3
3
  const healthCheck = async (_, res) => {
4
- logger.info("Health", "healthy");
4
+ logger.info('Health', 'healthy');
5
5
 
6
6
  return res.status(200).json({
7
- status: "healthy",
7
+ status: 'healthy',
8
8
  uptime: process.uptime(),
9
9
  timestamp: new Date().toISOString(),
10
10
  services: {
@@ -17,5 +17,5 @@ const healthCheck = async (_, res) => {
17
17
  };
18
18
 
19
19
  module.exports = {
20
- healthCheck
20
+ healthCheck,
21
21
  };
@@ -1,9 +1,74 @@
1
- const { Router } = require("express");
2
- const { healthCheck } = require("./health.controller");
3
- const { methodNotAllowedHandler } = require("../../../middlewares");
1
+ const { Router } = require('express');
2
+ const { healthCheck } = require('./health.controller');
3
+ const { z } = require('zod');
4
+ const {
5
+ methodNotAllowedHandler,
6
+ validateRequest,
7
+ } = require('../../../middlewares');
8
+ const { routeRegistry } = require('../../../docs');
4
9
 
5
10
  const router = Router();
6
- router.use(methodNotAllowedHandler(["GET"]));
7
- router.get("/", healthCheck);
11
+ const healthQuerySchema = z
12
+ .object({
13
+ verbose: z.coerce.boolean().optional(),
14
+ })
15
+ .strict();
16
+
17
+ // Register route schema with auto-generated docs
18
+ routeRegistry.register({
19
+ method: 'GET',
20
+ path: '/api/v1/health',
21
+ handler: healthCheck,
22
+ docs: {
23
+ tags: ['Health'],
24
+ summary: 'Health check endpoint',
25
+ description:
26
+ 'Returns API health status and runtime metrics including uptime and memory usage.',
27
+ parameters: [
28
+ {
29
+ name: 'verbose',
30
+ in: 'query',
31
+ required: false,
32
+ schema: { type: 'boolean' },
33
+ description: 'Optional verbose mode for detailed diagnostics.',
34
+ },
35
+ ],
36
+ responses: {
37
+ 200: {
38
+ description: 'Healthy response with system metrics',
39
+ content: {
40
+ 'application/json': {
41
+ schema: {
42
+ type: 'object',
43
+ properties: {
44
+ status: { type: 'string', example: 'healthy' },
45
+ uptime: { type: 'number', example: 123.45 },
46
+ timestamp: {
47
+ type: 'string',
48
+ example: '2024-01-01T00:00:00.000Z',
49
+ },
50
+ services: {
51
+ type: 'object',
52
+ properties: {
53
+ memory: {
54
+ type: 'object',
55
+ properties: {
56
+ rss: { type: 'number' },
57
+ heapUsed: { type: 'number' },
58
+ },
59
+ },
60
+ },
61
+ },
62
+ },
63
+ },
64
+ },
65
+ },
66
+ },
67
+ },
68
+ },
69
+ });
70
+
71
+ router.use(methodNotAllowedHandler(['GET']));
72
+ router.get('/', healthCheck);
8
73
 
9
74
  module.exports = router;
@@ -1,4 +1,4 @@
1
- const healthRoutes = require("./health.route");
1
+ const healthRoutes = require('./health.route');
2
2
 
3
3
  module.exports = {
4
4
  healthRoutes,
@@ -1,8 +1,8 @@
1
- const { Router } = require("express");
2
- const { healthRoutes } = require("./health");
1
+ const { Router } = require('express');
2
+ const { healthRoutes } = require('./health');
3
3
 
4
4
  const router = Router();
5
5
 
6
- router.use("/health", healthRoutes);
6
+ router.use('/health', healthRoutes);
7
7
 
8
8
  module.exports = router;
@@ -1,16 +1,23 @@
1
- const { Router } = require("express");
2
- const modulesRouter = require("./modules");
3
- const { notFound, rootHandler } = require("./middlewares");
1
+ const { Router } = require('express');
2
+ const modulesRouter = require('./modules');
3
+ const { notFound, rootHandler } = require('./middlewares');
4
+ const swaggerUi = require('swagger-ui-express');
5
+ const { routeRegistry } = require('./docs');
4
6
 
5
7
  const router = Router();
6
8
 
7
9
  // Root endpoint
8
- router.get("/", rootHandler);
10
+ router.get('/', rootHandler);
9
11
 
10
- router.use("/api", modulesRouter);
12
+ // Swagger UI with auto-generated spec
13
+ router.use('/api-docs', swaggerUi.serve, (_, res, next) => {
14
+ const spec = routeRegistry.generateOpenAPI('/*__PROJECT_NAME__*/', '1.0.0');
15
+ swaggerUi.setup(spec)(_, res, next);
16
+ });
17
+
18
+ router.use('/api', modulesRouter);
11
19
 
12
20
  // 404 handler - must be last
13
21
  router.use(notFound);
14
22
 
15
23
  module.exports = router;
16
-
@@ -1,18 +1,18 @@
1
- const app = require("./app");
2
- const { ENV/*__DB_IMPORT__*/ } = require("./config");
3
- const { logger } = require("./utils");
4
-
5
- const PORT = ENV.PORT || 3000;
6
-
7
- const startServer = async () => {
8
- /*__DB_CONNECT__*/
9
-
10
- app.listen(PORT, () => {
11
- logger.info("Server", `Server is running on port ${PORT}`);
12
- });
13
- };
14
-
15
- startServer().catch((error) => {
16
- logger.error("Server", "Failed to start server", error);
17
- process.exit(1);
18
- });
1
+ const app = require('./app');
2
+ const { ENV /*__DB_IMPORT__*/ } = require('./config');
3
+ const { logger } = require('./utils');
4
+
5
+ const PORT = ENV.PORT || 3000;
6
+
7
+ const startServer = async () => {
8
+ /*__DB_CONNECT__*/
9
+
10
+ app.listen(PORT, () => {
11
+ logger.info('Server', `Server is running on port ${PORT}`);
12
+ });
13
+ };
14
+
15
+ startServer().catch((error) => {
16
+ logger.error('Server', 'Failed to start server', error);
17
+ process.exit(1);
18
+ });
@@ -7,37 +7,55 @@ class HttpError extends Error {
7
7
  }
8
8
 
9
9
  class BadRequestError extends HttpError {
10
- constructor(message = "Bad Request") {
10
+ constructor(message = 'Bad Request') {
11
11
  super(400, message);
12
12
  }
13
13
  }
14
14
 
15
+ class UnprocessableEntityError extends HttpError {
16
+ constructor(message = 'Unprocessable Entity') {
17
+ super(422, message);
18
+ }
19
+ }
20
+
15
21
  class UnauthorizedError extends HttpError {
16
- constructor(message = "Unauthorized") {
22
+ constructor(message = 'Unauthorized') {
17
23
  super(401, message);
18
24
  }
19
25
  }
20
26
 
21
27
  class ForbiddenError extends HttpError {
22
- constructor(message = "Forbidden") {
28
+ constructor(message = 'Forbidden') {
23
29
  super(403, message);
24
30
  }
25
31
  }
26
32
 
27
33
  class NotFoundError extends HttpError {
28
- constructor(message = "Not Found") {
34
+ constructor(message = 'Not Found') {
29
35
  super(404, message);
30
36
  }
31
37
  }
32
38
 
33
39
  class ConflictError extends HttpError {
34
- constructor(message = "Conflict") {
40
+ constructor(message = 'Conflict') {
35
41
  super(409, message);
36
42
  }
37
43
  }
38
44
 
45
+ class TooManyRequestsError extends HttpError {
46
+ constructor(message = 'Too Many Requests') {
47
+ super(429, message);
48
+ }
49
+ }
50
+
51
+ class BadGatewayError extends HttpError {
52
+ constructor(message = 'Bad Gateway') {
53
+ super(502, message);
54
+ }
55
+ }
56
+
39
57
  class InternalServerError extends HttpError {
40
- constructor(message = "Internal Server Error") {
58
+ constructor(message = 'Internal Server Error') {
41
59
  super(500, message);
42
60
  }
43
61
  }
@@ -45,9 +63,12 @@ class InternalServerError extends HttpError {
45
63
  module.exports = {
46
64
  HttpError,
47
65
  BadRequestError,
66
+ UnprocessableEntityError,
48
67
  UnauthorizedError,
49
68
  ForbiddenError,
50
69
  NotFoundError,
51
70
  ConflictError,
71
+ TooManyRequestsError,
72
+ BadGatewayError,
52
73
  InternalServerError,
53
74
  };
@@ -1,22 +1,28 @@
1
- const {
2
- HttpError,
3
- BadRequestError,
4
- UnauthorizedError,
5
- ForbiddenError,
6
- NotFoundError,
7
- ConflictError,
8
- InternalServerError,
9
- } = require("./http-error");
10
-
11
- const logger = require("./logger");
12
-
13
- module.exports = {
14
- HttpError,
15
- BadRequestError,
16
- UnauthorizedError,
17
- ForbiddenError,
18
- NotFoundError,
19
- ConflictError,
20
- InternalServerError,
21
- logger,
22
- };
1
+ const {
2
+ HttpError,
3
+ BadRequestError,
4
+ UnprocessableEntityError,
5
+ UnauthorizedError,
6
+ ForbiddenError,
7
+ NotFoundError,
8
+ ConflictError,
9
+ TooManyRequestsError,
10
+ BadGatewayError,
11
+ InternalServerError,
12
+ } = require('./http-error');
13
+
14
+ const logger = require('./logger');
15
+
16
+ module.exports = {
17
+ HttpError,
18
+ BadRequestError,
19
+ UnprocessableEntityError,
20
+ UnauthorizedError,
21
+ ForbiddenError,
22
+ NotFoundError,
23
+ ConflictError,
24
+ TooManyRequestsError,
25
+ BadGatewayError,
26
+ InternalServerError,
27
+ logger,
28
+ };
@@ -1,67 +1,57 @@
1
- const { ENV } = require("../config/env");
2
- // ANSI color codes for terminal output
3
- const colors = {
4
- reset: "\x1b[0m",
5
- blue: "\x1b[34m",
6
- cyan: "\x1b[36m",
7
- yellow: "\x1b[33m",
8
- red: "\x1b[31m",
9
- bold: "\x1b[1m",
10
- };
11
-
12
- function format(tag, color) {
13
- return `${color}${colors.bold}[${tag}]${colors.reset}`;
14
- }
15
-
16
- function getEnvironment() {
17
- return ENV.NODE_ENV === "development" || ENV.NODE_ENV === "staging"
18
- ? "development"
19
- : ENV.NODE_ENV;
20
- }
21
-
22
- console.log(
23
- format("logger", colors.blue),
24
- `Logger initialized for ${getEnvironment()} environment.`,
25
- );
26
-
27
- const requiredKeys = ENV && Object.keys(ENV).length ? Object.keys(ENV) : [];
28
-
29
- const missing = requiredKeys.filter(
30
- (k) => ENV == null || ENV[k] === undefined || ENV[k] === "",
31
- );
32
-
33
- if (missing.length === requiredKeys.length) {
34
- console.warn(
35
- format("logger", colors.yellow),
36
- "ENV values missing — make sure to set up your environment variables correctly.",
37
- );
38
- } else if (missing.length > 0) {
39
- console.warn(
40
- format("logger", colors.yellow),
41
- `Missing ENV keys: ${missing.join(", ")}`,
42
- );
43
- }
44
-
45
- const logger = {
46
- log(tag, ...args) {
47
- if (getEnvironment() !== "development") return;
48
- console.log(format(tag, colors.blue), ...args);
49
- },
50
-
51
- info(tag, ...args) {
52
- if (getEnvironment() !== "development") return;
53
- console.info(format(tag, colors.cyan), ...args);
54
- },
55
-
56
- warn(tag, ...args) {
57
- if (getEnvironment() !== "development") return;
58
- console.warn(format(tag, colors.yellow), ...args);
59
- },
60
-
61
- error(tag, ...args) {
62
- if (getEnvironment() !== "development") return;
63
- console.error(format(tag, colors.red), ...args);
64
- },
65
- };
66
-
67
- module.exports = logger;
1
+ const { ENV } = require('../config/env');
2
+ // ANSI color codes for terminal output
3
+ const colors = {
4
+ reset: '\x1b[0m',
5
+ blue: '\x1b[34m',
6
+ cyan: '\x1b[36m',
7
+ yellow: '\x1b[33m',
8
+ red: '\x1b[31m',
9
+ bold: '\x1b[1m',
10
+ };
11
+
12
+ function format(tag, color) {
13
+ return `${color}${colors.bold}[${tag}]${colors.reset}`;
14
+ }
15
+
16
+ function getEnvironment() {
17
+ return ENV.NODE_ENV === 'development' || ENV.NODE_ENV === 'staging'
18
+ ? 'development'
19
+ : ENV.NODE_ENV;
20
+ }
21
+
22
+ function shouldLog(level) {
23
+ if (level === 'log') {
24
+ return getEnvironment() === 'development';
25
+ }
26
+
27
+ return true;
28
+ }
29
+
30
+ console.log(
31
+ format('logger', colors.blue),
32
+ `Logger initialized for ${getEnvironment()} environment.`
33
+ );
34
+
35
+ const logger = {
36
+ log(tag, ...args) {
37
+ if (!shouldLog('log')) return;
38
+ console.log(format(tag, colors.blue), ...args);
39
+ },
40
+
41
+ info(tag, ...args) {
42
+ if (!shouldLog('info')) return;
43
+ console.info(format(tag, colors.cyan), ...args);
44
+ },
45
+
46
+ warn(tag, ...args) {
47
+ if (!shouldLog('warn')) return;
48
+ console.warn(format(tag, colors.yellow), ...args);
49
+ },
50
+
51
+ error(tag, ...args) {
52
+ if (!shouldLog('error')) return;
53
+ console.error(format(tag, colors.red), ...args);
54
+ },
55
+ };
56
+
57
+ module.exports = logger;
@@ -1,17 +1,13 @@
1
- {
2
- "parser": "@typescript-eslint/parser",
3
- "plugins": ["@typescript-eslint"],
4
- "extends": [
5
- "eslint:recommended",
6
- "plugin:@typescript-eslint/recommended",
7
- "prettier"
8
- ],
9
- "env": {
10
- "node": true,
11
- "es2021": true
12
- },
13
- "rules": {
14
- "@typescript-eslint/no-unused-vars": ["warn"],
15
- "@typescript-eslint/no-explicit-any": "error"
16
- }
17
- }
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "plugins": ["@typescript-eslint"],
4
+ "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"],
5
+ "env": {
6
+ "node": true,
7
+ "es2021": true
8
+ },
9
+ "rules": {
10
+ "@typescript-eslint/no-unused-vars": ["warn"],
11
+ "@typescript-eslint/no-explicit-any": "error"
12
+ }
13
+ }
@@ -1,7 +1,7 @@
1
- {
2
- "semi": true,
3
- "singleQuote": false,
4
- "trailingComma": "all",
5
- "printWidth": 90,
6
- "tabWidth": 2
7
- }
1
+ {
2
+ "semi": true,
3
+ "singleQuote": false,
4
+ "trailingComma": "all",
5
+ "printWidth": 90,
6
+ "tabWidth": 2
7
+ }
@@ -1,33 +1,33 @@
1
- const tsParser = require("@typescript-eslint/parser");
2
- const tsPlugin = require("@typescript-eslint/eslint-plugin");
3
-
4
- module.exports = [
5
- // Files/paths to ignore (replaces .eslintignore usage in flat config)
6
- {
7
- ignores: ["node_modules/**", "dist/**"],
8
- },
9
-
10
- // TypeScript rules for source files
11
- {
12
- files: ["src/**/*.{ts,tsx}"],
13
- languageOptions: {
14
- parser: tsParser,
15
- parserOptions: {
16
- project: "./tsconfig.json",
17
- tsconfigRootDir: __dirname,
18
- ecmaVersion: 2020,
19
- sourceType: "module",
20
- },
21
- },
22
- plugins: {
23
- "@typescript-eslint": tsPlugin,
24
- },
25
- rules: {
26
- // Disallow explicit `any`
27
- "@typescript-eslint/no-explicit-any": "error",
28
-
29
- // You can add or tune more TypeScript rules here
30
- "@typescript-eslint/explicit-module-boundary-types": "off",
31
- },
32
- },
33
- ];
1
+ const tsParser = require("@typescript-eslint/parser");
2
+ const tsPlugin = require("@typescript-eslint/eslint-plugin");
3
+
4
+ module.exports = [
5
+ // Files/paths to ignore (replaces .eslintignore usage in flat config)
6
+ {
7
+ ignores: ["node_modules/**", "dist/**"],
8
+ },
9
+
10
+ // TypeScript rules for source files
11
+ {
12
+ files: ["src/**/*.{ts,tsx}"],
13
+ languageOptions: {
14
+ parser: tsParser,
15
+ parserOptions: {
16
+ project: "./tsconfig.json",
17
+ tsconfigRootDir: __dirname,
18
+ ecmaVersion: 2020,
19
+ sourceType: "module",
20
+ },
21
+ },
22
+ plugins: {
23
+ "@typescript-eslint": tsPlugin,
24
+ },
25
+ rules: {
26
+ // Disallow explicit `any`
27
+ "@typescript-eslint/no-explicit-any": "error",
28
+
29
+ // You can add or tune more TypeScript rules here
30
+ "@typescript-eslint/explicit-module-boundary-types": "off",
31
+ },
32
+ },
33
+ ];
@@ -1,39 +1,41 @@
1
- {
2
- "version": "1.0.0",
3
- "description": "",
4
- "main": "index.js",
5
- "scripts": {
6
- "dev": "ts-node-dev --respawn --transpile-only -r tsconfig-paths/register src/server.ts",
7
- "start": "node dist/server.js",
8
- "build": "tsc",
9
- "lint": "eslint \"src/**/*.{ts,tsx}\"",
10
- "format": "prettier --write \"src/**/*.{ts,json}\"",
11
- "check-format": "prettier --check \"src/**/*.{ts,json}\"",
12
- "prepare": "husky"
13
- },
14
- "keywords": [],
15
- "author": "",
16
- "license": "ISC",
17
- "type": "commonjs",
18
- "dependencies": {
19
- "dotenv": "^16.3.1",
20
- "express": "^5.2.1",
21
- "module-alias": "^2.2.3"
22
- },
23
- "devDependencies": {
24
- "@types/express": "^5.0.6",
25
- "@types/node": "^25.0.3",
26
- "@typescript-eslint/eslint-plugin": "^8.50.1",
27
- "@typescript-eslint/parser": "^8.50.1",
28
- "eslint": "^9.39.2",
29
- "eslint-config-prettier": "^10.1.8",
30
- "husky": "^9.1.7",
31
- "prettier": "^3.7.4",
32
- "ts-node-dev": "^2.0.0",
33
- "tsconfig-paths": "^4.2.0",
34
- "typescript": "^5.9.3"
35
- },
36
- "_moduleAliases": {
37
- "@": "dist"
38
- }
39
- }
1
+ {
2
+ "version": "1.0.0",
3
+ "description": "",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "dev": "ts-node-dev --respawn --transpile-only -r tsconfig-paths/register src/server.ts",
7
+ "start": "node -r module-alias/register dist/server.js",
8
+ "build": "tsc",
9
+ "lint": "eslint \"src/**/*.{ts,tsx}\"",
10
+ "format": "prettier --write \"src/**/*.{ts,json}\"",
11
+ "check-format": "prettier --check \"src/**/*.{ts,json}\"",
12
+ "prepare": "husky"
13
+ },
14
+ "keywords": [],
15
+ "author": "",
16
+ "license": "ISC",
17
+ "type": "commonjs",
18
+ "dependencies": {
19
+ "dotenv": "^16.3.1",
20
+ "express": "^5.2.1",
21
+ "module-alias": "^2.2.3",
22
+ "swagger-ui-express": "^5.0.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/express": "^5.0.6",
26
+ "@types/node": "^25.0.3",
27
+ "@typescript-eslint/eslint-plugin": "^8.50.1",
28
+ "@typescript-eslint/parser": "^8.50.1",
29
+ "@types/swagger-ui-express": "^4.1.8",
30
+ "eslint": "^9.39.2",
31
+ "eslint-config-prettier": "^10.1.8",
32
+ "husky": "^9.1.7",
33
+ "prettier": "^3.7.4",
34
+ "ts-node-dev": "^2.0.0",
35
+ "tsconfig-paths": "^4.2.0",
36
+ "typescript": "^5.9.3"
37
+ },
38
+ "_moduleAliases": {
39
+ "@": "dist"
40
+ }
41
+ }