@ifecodes/backend-template 1.1.9 → 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 (94) hide show
  1. package/README.md +423 -383
  2. package/bin/cli.js +1276 -964
  3. package/bin/lib/microservice-config.js +155 -150
  4. package/bin/lib/prompts.js +277 -241
  5. package/bin/lib/readme-generator.js +364 -329
  6. package/bin/lib/service-setup.js +901 -684
  7. package/package.json +64 -55
  8. package/template/base/js/.eslintrc.json +10 -13
  9. package/template/base/js/.prettierrc +7 -7
  10. package/template/base/js/eslint.config.js +33 -31
  11. package/template/base/js/package.json +29 -28
  12. package/template/base/js/src/app.js +20 -18
  13. package/template/base/js/src/config/db.js +8 -8
  14. package/template/base/js/src/config/env.js +44 -14
  15. package/template/base/js/src/config/index.js +7 -7
  16. package/template/base/js/src/docs/index.js +5 -0
  17. package/template/base/js/src/docs/route-registry.js +63 -0
  18. package/template/base/js/src/middlewares/error-handler.middleware.js +22 -19
  19. package/template/base/js/src/middlewares/index.js +15 -11
  20. package/template/base/js/src/middlewares/method-not-allowed.middleware.js +19 -13
  21. package/template/base/js/src/middlewares/not-found.middleware.js +13 -10
  22. package/template/base/js/src/middlewares/observability.middleware.js +24 -0
  23. package/template/base/js/src/middlewares/root.middleware.js +18 -16
  24. package/template/base/js/src/middlewares/validation.middleware.js +39 -0
  25. package/template/base/js/src/modules/index.js +8 -8
  26. package/template/base/js/src/modules/v1/health/health.controller.auth.js +29 -0
  27. package/template/base/js/src/modules/v1/health/health.controller.js +21 -21
  28. package/template/base/js/src/modules/v1/health/health.route.js +74 -9
  29. package/template/base/js/src/modules/v1/health/index.js +5 -5
  30. package/template/base/js/src/modules/v1/index.js +8 -8
  31. package/template/base/js/src/routes.js +23 -16
  32. package/template/base/js/src/server.js +18 -18
  33. package/template/base/js/src/utils/http-error.js +74 -74
  34. package/template/base/js/src/utils/index.js +28 -28
  35. package/template/base/js/src/utils/logger.js +57 -67
  36. package/template/base/ts/.eslintrc.json +13 -17
  37. package/template/base/ts/.prettierrc +7 -7
  38. package/template/base/ts/eslint.config.js +33 -33
  39. package/template/base/ts/package.json +41 -39
  40. package/template/base/ts/src/app.ts +20 -18
  41. package/template/base/ts/src/config/db.ts +4 -4
  42. package/template/base/ts/src/config/env.ts +40 -10
  43. package/template/base/ts/src/config/index.ts +2 -2
  44. package/template/base/ts/src/docs/index.ts +3 -0
  45. package/template/base/ts/src/docs/route-registry.ts +98 -0
  46. package/template/base/ts/src/middlewares/error-handler.middleware.ts +4 -1
  47. package/template/base/ts/src/middlewares/index.ts +6 -4
  48. package/template/base/ts/src/middlewares/method-not-allowed.middleware.ts +23 -18
  49. package/template/base/ts/src/middlewares/not-found.middleware.ts +10 -8
  50. package/template/base/ts/src/middlewares/observability.middleware.ts +25 -0
  51. package/template/base/ts/src/middlewares/root.middleware.ts +16 -14
  52. package/template/base/ts/src/middlewares/validation.middleware.ts +46 -0
  53. package/template/base/ts/src/modules/index.ts +8 -8
  54. package/template/base/ts/src/modules/v1/health/health.controller.auth.ts +26 -0
  55. package/template/base/ts/src/modules/v1/health/health.controller.ts +18 -18
  56. package/template/base/ts/src/modules/v1/health/health.route.ts +68 -9
  57. package/template/base/ts/src/modules/v1/health/index.ts +1 -1
  58. package/template/base/ts/src/modules/v1/index.ts +8 -8
  59. package/template/base/ts/src/routes.ts +23 -15
  60. package/template/base/ts/src/server.ts +19 -19
  61. package/template/base/ts/src/utils/http-error.ts +63 -63
  62. package/template/base/ts/src/utils/index.ts +14 -14
  63. package/template/base/ts/src/utils/logger.ts +58 -68
  64. package/template/base/ts/tsconfig.json +21 -21
  65. package/template/features/auth/argon2/inject.js +50 -50
  66. package/template/features/auth/base/health-openapi.ts +62 -0
  67. package/template/features/auth/base/inject.js +174 -172
  68. package/template/features/auth/bcrypt/inject.js +40 -40
  69. package/template/features/auth/models/index.ts +1 -1
  70. package/template/features/auth/models/user.model.js +24 -24
  71. package/template/features/auth/models/user.model.ts +28 -28
  72. package/template/features/auth/modules/auth.controller.js +21 -21
  73. package/template/features/auth/modules/auth.controller.ts +28 -20
  74. package/template/features/auth/modules/auth.routes.js +89 -10
  75. package/template/features/auth/modules/auth.routes.ts +86 -11
  76. package/template/features/auth/modules/auth.service.js +29 -29
  77. package/template/features/auth/modules/auth.service.ts +38 -38
  78. package/template/features/auth/modules/index.js +1 -1
  79. package/template/features/auth/modules/index.ts +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/auth/utils/jwt.ts +15 -15
  83. package/template/features/cors/inject.js +14 -13
  84. package/template/features/helmet/inject.js +7 -6
  85. package/template/features/morgan/inject.js +8 -7
  86. package/template/features/rate-limit/inject.js +7 -6
  87. package/template/gateway/js/app.js +42 -42
  88. package/template/gateway/js/inject.js +33 -33
  89. package/template/gateway/js/server.js +19 -19
  90. package/template/gateway/ts/app.ts +43 -43
  91. package/template/gateway/ts/inject.js +33 -33
  92. package/template/gateway/ts/server.ts +19 -19
  93. package/template/microservice/docker/docker-compose.yml +5 -5
  94. package/template/microservice/nodocker/pm2.config.js +3 -3
@@ -1,28 +1,28 @@
1
- import { Schema, model, Document } from "mongoose";
2
-
3
- export interface IUser extends Document {
4
- email: string;
5
- password: string;
6
- fullName: string;
7
- }
8
-
9
- const userSchema = new Schema<IUser>(
10
- {
11
- email: {
12
- type: String,
13
- required: true,
14
- unique: true,
15
- },
16
- password: {
17
- type: String,
18
- required: true,
19
- },
20
- fullName: {
21
- type: String,
22
- required: true,
23
- },
24
- },
25
- { timestamps: true },
26
- );
27
-
28
- export const UserModel = model<IUser>("User", userSchema);
1
+ import { Schema, model, Document } from "mongoose";
2
+
3
+ export interface IUser extends Document {
4
+ email: string;
5
+ password: string;
6
+ fullName: string;
7
+ }
8
+
9
+ const userSchema = new Schema<IUser>(
10
+ {
11
+ email: {
12
+ type: String,
13
+ required: true,
14
+ unique: true,
15
+ },
16
+ password: {
17
+ type: String,
18
+ required: true,
19
+ },
20
+ fullName: {
21
+ type: String,
22
+ required: true,
23
+ },
24
+ },
25
+ { timestamps: true }
26
+ );
27
+
28
+ export const UserModel = model<IUser>("User", userSchema);
@@ -1,21 +1,21 @@
1
- const { loginService, registerService } = require("./auth.service");
2
-
3
- async function login(req, res, next) {
4
- try {
5
- const token = await loginService(req.body);
6
- return res.status(200).json({ token });
7
- } catch (err) {
8
- return next(err);
9
- }
10
- }
11
-
12
- async function register(req, res, next) {
13
- try {
14
- const token = await registerService(req.body);
15
- return res.status(201).json({ token });
16
- } catch (err) {
17
- return next(err);
18
- }
19
- }
20
-
21
- module.exports = { login, register };
1
+ const { loginService, registerService } = require("./auth.service");
2
+
3
+ async function login(req, res, next) {
4
+ try {
5
+ const token = await loginService(req.body);
6
+ return res.status(200).json({ token });
7
+ } catch (err) {
8
+ return next(err);
9
+ }
10
+ }
11
+
12
+ async function register(req, res, next) {
13
+ try {
14
+ const token = await registerService(req.body);
15
+ return res.status(201).json({ token });
16
+ } catch (err) {
17
+ return next(err);
18
+ }
19
+ }
20
+
21
+ module.exports = { login, register };
@@ -1,20 +1,28 @@
1
- import { Request, Response, NextFunction } from "express";
2
- import { loginService, registerService } from "./auth.service";
3
-
4
- export const login = async (req: Request, res: Response, next: NextFunction) => {
5
- try {
6
- const token = await loginService(req.body);
7
- return res.status(200).json({ token });
8
- } catch (err) {
9
- return next(err);
10
- }
11
- };
12
-
13
- export const register = async (req: Request, res: Response, next: NextFunction) => {
14
- try {
15
- const token = await registerService(req.body);
16
- return res.status(201).json({ token });
17
- } catch (err) {
18
- return next(err);
19
- }
20
- };
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { loginService, registerService } from "./auth.service";
3
+
4
+ export const login = async (
5
+ req: Request,
6
+ res: Response,
7
+ next: NextFunction
8
+ ) => {
9
+ try {
10
+ const token = await loginService(req.body);
11
+ return res.status(200).json({ token });
12
+ } catch (err) {
13
+ return next(err);
14
+ }
15
+ };
16
+
17
+ export const register = async (
18
+ req: Request,
19
+ res: Response,
20
+ next: NextFunction
21
+ ) => {
22
+ try {
23
+ const token = await registerService(req.body);
24
+ return res.status(201).json({ token });
25
+ } catch (err) {
26
+ return next(err);
27
+ }
28
+ };
@@ -1,10 +1,89 @@
1
- const { Router } = require("express");
2
- const { register, login } = require("./auth.controller");
3
- const { methodNotAllowedHandler } = require("../../../middlewares");
4
-
5
- const router = Router();
6
- router.use(methodNotAllowedHandler(["POST"]));
7
- router.post("/login", login);
8
- router.post("/register", register);
9
-
10
- module.exports = router;
1
+ const { Router } = require("express");
2
+ const { register, login } = require("./auth.controller");
3
+ const {
4
+ methodNotAllowedHandler,
5
+ validateRequest,
6
+ } = require("../../../middlewares");
7
+ const { z } = require("zod");
8
+ const { routeRegistry } = require("../../../docs");
9
+
10
+ const router = Router();
11
+
12
+ // Define request schemas for validation
13
+ const registerSchema = z
14
+ .object({
15
+ username: z.string().min(3, "Username must be at least 3 characters"),
16
+ password: z.string().min(6, "Password must be at least 6 characters"),
17
+ })
18
+ .strict();
19
+
20
+ const loginSchema = z
21
+ .object({
22
+ username: z.string().min(1, "Username is required"),
23
+ password: z.string().min(1, "Password is required"),
24
+ })
25
+ .strict();
26
+
27
+ // Register route docs for auto OpenAPI generation
28
+ routeRegistry.register({
29
+ method: "POST",
30
+ path: "/api/v1/auth/login",
31
+ handler: login,
32
+ docs: {
33
+ tags: ["Auth"],
34
+ summary: "User login",
35
+ requestBody: {
36
+ required: true,
37
+ content: {
38
+ "application/json": {
39
+ schema: {
40
+ type: "object",
41
+ properties: {
42
+ username: { type: "string" },
43
+ password: { type: "string" },
44
+ },
45
+ },
46
+ },
47
+ },
48
+ },
49
+ responses: {
50
+ 200: { description: "Successful login" },
51
+ 400: { description: "Invalid request" },
52
+ 401: { description: "Unauthorized" },
53
+ },
54
+ },
55
+ });
56
+
57
+ routeRegistry.register({
58
+ method: "POST",
59
+ path: "/api/v1/auth/register",
60
+ handler: register,
61
+ docs: {
62
+ tags: ["Auth"],
63
+ summary: "Register new user",
64
+ requestBody: {
65
+ required: true,
66
+ content: {
67
+ "application/json": {
68
+ schema: {
69
+ type: "object",
70
+ properties: {
71
+ username: { type: "string" },
72
+ password: { type: "string" },
73
+ },
74
+ },
75
+ },
76
+ },
77
+ },
78
+ responses: {
79
+ 201: { description: "User created" },
80
+ 400: { description: "Invalid request" },
81
+ },
82
+ },
83
+ });
84
+
85
+ router.use(methodNotAllowedHandler(["POST"]));
86
+ router.post("/login", validateRequest({ body: loginSchema }), login);
87
+ router.post("/register", validateRequest({ body: registerSchema }), register);
88
+
89
+ module.exports = router;
@@ -1,11 +1,86 @@
1
- import { Router } from "express";
2
- import { register, login } from "./auth.controller";
3
- import { methodNotAllowedHandler } from "@/middlewares";
4
-
5
- const router = Router();
6
- router.use(methodNotAllowedHandler(["POST"]));
7
- router.post("/login", login);
8
- router.post("/register", register);
9
-
10
- export default router;
11
-
1
+ import { Router } from "express";
2
+ import { register, login } from "./auth.controller";
3
+ import { methodNotAllowedHandler, validateRequest } from "@/middlewares";
4
+ import { z } from "zod";
5
+ import { routeRegistry } from "@/docs";
6
+
7
+ const router = Router();
8
+
9
+ // Define request schemas for validation
10
+ const registerSchema = z
11
+ .object({
12
+ username: z.string().min(3, "Username must be at least 3 characters"),
13
+ password: z.string().min(6, "Password must be at least 6 characters"),
14
+ })
15
+ .strict();
16
+
17
+ const loginSchema = z
18
+ .object({
19
+ username: z.string().min(1, "Username is required"),
20
+ password: z.string().min(1, "Password is required"),
21
+ })
22
+ .strict();
23
+
24
+ router.use(methodNotAllowedHandler(["POST"]));
25
+ // Register route docs for auto OpenAPI generation
26
+ routeRegistry.register({
27
+ method: "POST",
28
+ path: "/api/v1/auth/login",
29
+ handler: login,
30
+ docs: {
31
+ tags: ["Auth"],
32
+ summary: "User login",
33
+ requestBody: {
34
+ required: true,
35
+ content: {
36
+ "application/json": {
37
+ schema: {
38
+ type: "object",
39
+ properties: {
40
+ username: { type: "string" },
41
+ password: { type: "string" },
42
+ },
43
+ },
44
+ },
45
+ },
46
+ },
47
+ responses: {
48
+ 200: { description: "Successful login" },
49
+ 400: { description: "Invalid request" },
50
+ 401: { description: "Unauthorized" },
51
+ },
52
+ },
53
+ });
54
+
55
+ routeRegistry.register({
56
+ method: "POST",
57
+ path: "/api/v1/auth/register",
58
+ handler: register,
59
+ docs: {
60
+ tags: ["Auth"],
61
+ summary: "Register new user",
62
+ requestBody: {
63
+ required: true,
64
+ content: {
65
+ "application/json": {
66
+ schema: {
67
+ type: "object",
68
+ properties: {
69
+ username: { type: "string" },
70
+ password: { type: "string" },
71
+ },
72
+ },
73
+ },
74
+ },
75
+ },
76
+ responses: {
77
+ 201: { description: "User created" },
78
+ 400: { description: "Invalid request" },
79
+ },
80
+ },
81
+ });
82
+
83
+ router.post("/login", validateRequest({ body: loginSchema }), login);
84
+ router.post("/register", validateRequest({ body: registerSchema }), register);
85
+
86
+ export default router;
@@ -1,29 +1,29 @@
1
- const { generateToken } = require("../../../utils/jwt");
2
- const { UserModel } = require("../../../models/user.model");
3
- const { hashPassword, verifyPassword } = require("../../../utils/hash");
4
- const {
5
- UnauthorizedError,
6
- ConflictError,
7
- } = require("../../../utils/http-error");
8
-
9
- async function loginService({ email, password }) {
10
- const user = await UserModel.findOne({ email }).exec();
11
- if (!user) throw new UnauthorizedError("User not found");
12
-
13
- const match = await verifyPassword(user.password, password);
14
- if (!match) throw new UnauthorizedError("Invalid credentials");
15
-
16
- return generateToken({ email: user.email });
17
- }
18
-
19
- async function registerService({ email, password, fullName }) {
20
- const exists = await UserModel.findOne({ email }).exec();
21
- if (exists) throw new ConflictError("Email already registered");
22
-
23
- const hashed = await hashPassword(password);
24
- const user = await UserModel.create({ email, password: hashed, fullName });
25
-
26
- return generateToken({ email: user.email });
27
- }
28
-
29
- module.exports = { loginService, registerService };
1
+ const { generateToken } = require("../../../utils/jwt");
2
+ const { UserModel } = require("../../../models/user.model");
3
+ const { hashPassword, verifyPassword } = require("../../../utils/hash");
4
+ const {
5
+ UnauthorizedError,
6
+ ConflictError,
7
+ } = require("../../../utils/http-error");
8
+
9
+ async function loginService({ email, password }) {
10
+ const user = await UserModel.findOne({ email }).exec();
11
+ if (!user) throw new UnauthorizedError("User not found");
12
+
13
+ const match = await verifyPassword(user.password, password);
14
+ if (!match) throw new UnauthorizedError("Invalid credentials");
15
+
16
+ return generateToken({ email: user.email });
17
+ }
18
+
19
+ async function registerService({ email, password, fullName }) {
20
+ const exists = await UserModel.findOne({ email }).exec();
21
+ if (exists) throw new ConflictError("Email already registered");
22
+
23
+ const hashed = await hashPassword(password);
24
+ const user = await UserModel.create({ email, password: hashed, fullName });
25
+
26
+ return generateToken({ email: user.email });
27
+ }
28
+
29
+ module.exports = { loginService, registerService };
@@ -1,38 +1,38 @@
1
- import { generateToken } from "@/utils";
2
- import { UserModel } from "@/models/user.model";
3
- import { hashPassword, verifyPassword } from "@/utils";
4
- import { UnauthorizedError, ConflictError } from "@/utils";
5
-
6
- export const loginService = async ({
7
- email,
8
- password,
9
- }: {
10
- email: string;
11
- password: string;
12
- }) => {
13
- const user = await UserModel.findOne({ email }).exec();
14
- if (!user) throw new UnauthorizedError("User not found");
15
-
16
- const match = await verifyPassword(user.password, password);
17
- if (!match) throw new UnauthorizedError("Invalid credentials");
18
-
19
- return generateToken({ email: user.email });
20
- };
21
-
22
- export const registerService = async ({
23
- email,
24
- password,
25
- fullName,
26
- }: {
27
- email: string;
28
- password: string;
29
- fullName: string;
30
- }) => {
31
- const exists = await UserModel.findOne({ email }).exec();
32
- if (exists) throw new ConflictError("Email already registered");
33
-
34
- const hashed = await hashPassword(password);
35
- const user = await UserModel.create({ email, password: hashed, fullName });
36
-
37
- return generateToken({ email: user.email });
38
- };
1
+ import { generateToken } from "@/utils";
2
+ import { UserModel } from "@/models/user.model";
3
+ import { hashPassword, verifyPassword } from "@/utils";
4
+ import { UnauthorizedError, ConflictError } from "@/utils";
5
+
6
+ export const loginService = async ({
7
+ email,
8
+ password,
9
+ }: {
10
+ email: string;
11
+ password: string;
12
+ }) => {
13
+ const user = await UserModel.findOne({ email }).exec();
14
+ if (!user) throw new UnauthorizedError("User not found");
15
+
16
+ const match = await verifyPassword(user.password, password);
17
+ if (!match) throw new UnauthorizedError("Invalid credentials");
18
+
19
+ return generateToken({ email: user.email });
20
+ };
21
+
22
+ export const registerService = async ({
23
+ email,
24
+ password,
25
+ fullName,
26
+ }: {
27
+ email: string;
28
+ password: string;
29
+ fullName: string;
30
+ }) => {
31
+ const exists = await UserModel.findOne({ email }).exec();
32
+ if (exists) throw new ConflictError("Email already registered");
33
+
34
+ const hashed = await hashPassword(password);
35
+ const user = await UserModel.create({ email, password: hashed, fullName });
36
+
37
+ return generateToken({ email: user.email });
38
+ };
@@ -1 +1 @@
1
- module.exports = { authRoutes: require("./auth.routes") };
1
+ module.exports = { authRoutes: require("./auth.routes") };
@@ -1 +1 @@
1
- export { default as authRoutes } from "./auth.routes";
1
+ export { default as authRoutes } from "./auth.routes";
@@ -1,20 +1,20 @@
1
- /**
2
- * This base hash utility defines generic hashing function signatures.
3
- * The actual implementation will be replaced by bcrypt or argon2 depending
4
- * on user selection during template generation.
5
- */
6
-
7
- export async function hashPassword(_password: string): Promise<string> {
8
- throw new Error(
9
- "hashPassword() not implemented — hashing method not selected (bcrypt or argon2)"
10
- );
11
- }
12
-
13
- export async function verifyPassword(
14
- _hashed: string,
15
- _password: string
16
- ): Promise<boolean> {
17
- throw new Error(
18
- "verifyPassword() not implemented — hashing method not selected (bcrypt or argon2)"
19
- );
20
- }
1
+ /**
2
+ * This base hash utility defines generic hashing function signatures.
3
+ * The actual implementation will be replaced by bcrypt or argon2 depending
4
+ * on user selection during template generation.
5
+ */
6
+
7
+ export async function hashPassword(_password: string): Promise<string> {
8
+ throw new Error(
9
+ "hashPassword() not implemented — hashing method not selected (bcrypt or argon2)"
10
+ );
11
+ }
12
+
13
+ export async function verifyPassword(
14
+ _hashed: string,
15
+ _password: string
16
+ ): Promise<boolean> {
17
+ throw new Error(
18
+ "verifyPassword() not implemented — hashing method not selected (bcrypt or argon2)"
19
+ );
20
+ }
@@ -1,12 +1,12 @@
1
- const jwt = require("jsonwebtoken");
2
- const { ENV } = require("../config");
3
-
4
- async function generateToken(payload) {
5
- return jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
6
- }
7
-
8
- function verifyToken(token) {
9
- return jwt.verify(token, ENV.JWT_SECRET);
10
- }
11
-
12
- module.exports = { generateToken, verifyToken };
1
+ const jwt = require("jsonwebtoken");
2
+ const { ENV } = require("../config");
3
+
4
+ async function generateToken(payload) {
5
+ return jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
6
+ }
7
+
8
+ function verifyToken(token) {
9
+ return jwt.verify(token, ENV.JWT_SECRET);
10
+ }
11
+
12
+ module.exports = { generateToken, verifyToken };
@@ -1,15 +1,15 @@
1
- import jwt from "jsonwebtoken";
2
- import { ENV } from "@/config";
3
-
4
- // JwtPayload mirrors the global JwtPayload declared in `src/types/express.d.ts`.
5
- export type JwtPayload = {
6
- email?: string;
7
- iat?: number;
8
- exp?: number;
9
- };
10
-
11
- export const generateToken = (payload: JwtPayload) =>
12
- jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
13
-
14
- export const verifyToken = (token: string): JwtPayload =>
15
- jwt.verify(token, ENV.JWT_SECRET) as JwtPayload;
1
+ import jwt from "jsonwebtoken";
2
+ import { ENV } from "@/config";
3
+
4
+ // JwtPayload mirrors the global JwtPayload declared in `src/types/express.d.ts`.
5
+ export type JwtPayload = {
6
+ email?: string;
7
+ iat?: number;
8
+ exp?: number;
9
+ };
10
+
11
+ export const generateToken = (payload: JwtPayload) =>
12
+ jwt.sign(payload, ENV.JWT_SECRET, { expiresIn: "7d" });
13
+
14
+ export const verifyToken = (token: string): JwtPayload =>
15
+ jwt.verify(token, ENV.JWT_SECRET) as JwtPayload;
@@ -1,13 +1,14 @@
1
- export const deps = ["cors"];
2
- export const devDeps = ["@types/cors"];
3
- export const getImports = (language) => language === "javascript"
4
- ? `const cors = require("cors");\nconst { ENV } = require("./config");`
5
- : `import cors from "cors";\nimport { ENV } from "@/config";`;
6
- export const imports = getImports("typescript");
7
- export const middleware = `
8
- const corsOptions = {
9
- origin: ENV.ALLOWED_ORIGIN,
10
- credentials: true,
11
- };
12
-
13
- app.use(cors(corsOptions));`;
1
+ export const deps = ["cors"];
2
+ export const devDeps = ["@types/cors"];
3
+ export const getImports = (language) =>
4
+ language === "javascript"
5
+ ? `const cors = require("cors");\nconst { ENV } = require("./config");`
6
+ : `import cors from "cors";\nimport { ENV } from "@/config";`;
7
+ export const imports = getImports("typescript");
8
+ export const middleware = `
9
+ const corsOptions = {
10
+ origin: ENV.ALLOWED_ORIGIN,
11
+ credentials: true,
12
+ };
13
+
14
+ app.use(cors(corsOptions));`;
@@ -1,6 +1,7 @@
1
- export const deps = ["helmet"];
2
- export const getImports = (language) => language === "javascript"
3
- ? `const helmet = require("helmet");`
4
- : `import helmet from "helmet";`;
5
- export const imports = getImports("typescript");
6
- export const middleware = `app.use(helmet());`;
1
+ export const deps = ["helmet"];
2
+ export const getImports = (language) =>
3
+ language === "javascript"
4
+ ? `const helmet = require("helmet");`
5
+ : `import helmet from "helmet";`;
6
+ export const imports = getImports("typescript");
7
+ export const middleware = `app.use(helmet());`;
@@ -1,7 +1,8 @@
1
- export const deps = ["morgan"];
2
- export const devDeps = ["@types/morgan"];
3
- export const getImports = (language) => language === "javascript"
4
- ? `const morgan = require("morgan");`
5
- : `import morgan from "morgan";`;
6
- export const imports = getImports("typescript");
7
- export const middleware = `app.use(morgan("dev"));`;
1
+ export const deps = ["morgan"];
2
+ export const devDeps = ["@types/morgan"];
3
+ export const getImports = (language) =>
4
+ language === "javascript"
5
+ ? `const morgan = require("morgan");`
6
+ : `import morgan from "morgan";`;
7
+ export const imports = getImports("typescript");
8
+ export const middleware = `app.use(morgan("dev"));`;