typescript-express-starter 8.0.2 → 8.1.7

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 (163) hide show
  1. package/README.kr.md +21 -21
  2. package/README.md +25 -25
  3. package/lib/default/.env.development.local +13 -0
  4. package/lib/default/.env.production.local +13 -0
  5. package/lib/default/.env.test.local +13 -0
  6. package/lib/default/.swcrc +1 -0
  7. package/lib/default/Makefile +26 -3
  8. package/lib/default/package.json +2 -4
  9. package/lib/default/src/app.ts +6 -7
  10. package/lib/default/src/config/index.ts +5 -0
  11. package/lib/default/src/middlewares/auth.middleware.ts +2 -2
  12. package/lib/default/src/server.ts +0 -2
  13. package/lib/default/src/services/auth.service.ts +2 -2
  14. package/lib/default/src/utils/logger.ts +2 -2
  15. package/lib/default/tsconfig.json +1 -0
  16. package/lib/graphql/.env.development.local +20 -0
  17. package/lib/graphql/.env.production.local +20 -0
  18. package/lib/graphql/.env.test.local +20 -0
  19. package/lib/graphql/.swcrc +1 -0
  20. package/lib/graphql/Makefile +26 -3
  21. package/lib/graphql/package.json +2 -4
  22. package/lib/graphql/src/app.ts +12 -10
  23. package/lib/graphql/src/config/index.ts +6 -0
  24. package/lib/graphql/src/databases/index.ts +6 -8
  25. package/lib/graphql/src/entities/users.entity.ts +1 -1
  26. package/lib/graphql/src/middlewares/auth.middleware.ts +2 -2
  27. package/lib/graphql/src/repositories/auth.repository.ts +3 -3
  28. package/lib/graphql/src/repositories/users.repository.ts +1 -1
  29. package/lib/graphql/src/server.ts +0 -3
  30. package/lib/graphql/src/utils/logger.ts +2 -2
  31. package/lib/graphql/tsconfig.json +1 -0
  32. package/lib/knex/.env.development.local +20 -0
  33. package/lib/knex/.env.production.local +20 -0
  34. package/lib/knex/.env.test.local +20 -0
  35. package/lib/knex/.swcrc +1 -0
  36. package/lib/knex/Makefile +26 -3
  37. package/lib/knex/knexfile.ts +6 -10
  38. package/lib/knex/package.json +2 -4
  39. package/lib/knex/src/app.ts +6 -7
  40. package/lib/knex/src/config/index.ts +5 -0
  41. package/lib/knex/src/databases/index.ts +6 -8
  42. package/lib/knex/src/middlewares/auth.middleware.ts +2 -2
  43. package/lib/knex/src/server.ts +0 -2
  44. package/lib/knex/src/services/auth.service.ts +2 -2
  45. package/lib/knex/src/utils/logger.ts +2 -2
  46. package/lib/knex/tsconfig.json +1 -0
  47. package/lib/mongoose/.env.development.local +18 -0
  48. package/lib/mongoose/.env.production.local +18 -0
  49. package/lib/mongoose/.env.test.local +18 -0
  50. package/lib/mongoose/.swcrc +1 -0
  51. package/lib/mongoose/Makefile +26 -3
  52. package/lib/mongoose/package.json +2 -4
  53. package/lib/mongoose/src/app.ts +6 -7
  54. package/lib/mongoose/src/config/index.ts +5 -0
  55. package/lib/mongoose/src/databases/index.ts +2 -5
  56. package/lib/mongoose/src/middlewares/auth.middleware.ts +2 -2
  57. package/lib/mongoose/src/server.ts +0 -2
  58. package/lib/mongoose/src/services/auth.service.ts +2 -2
  59. package/lib/mongoose/src/utils/logger.ts +2 -2
  60. package/lib/mongoose/tsconfig.json +1 -0
  61. package/lib/prisma/.env.development.local +16 -0
  62. package/lib/prisma/.env.production.local +16 -0
  63. package/lib/prisma/.env.test.local +16 -0
  64. package/lib/prisma/.swcrc +1 -0
  65. package/lib/prisma/Makefile +26 -3
  66. package/lib/prisma/package.json +2 -4
  67. package/lib/prisma/src/app.ts +6 -7
  68. package/lib/prisma/src/config/index.ts +5 -0
  69. package/lib/prisma/src/middlewares/auth.middleware.ts +2 -2
  70. package/lib/prisma/src/server.ts +0 -2
  71. package/lib/prisma/src/services/auth.service.ts +2 -2
  72. package/lib/prisma/src/utils/logger.ts +2 -2
  73. package/lib/prisma/tsconfig.json +1 -0
  74. package/lib/routing-controllers/.env.development.local +13 -0
  75. package/lib/routing-controllers/.env.production.local +13 -0
  76. package/lib/routing-controllers/.env.test.local +13 -0
  77. package/lib/routing-controllers/.swcrc +1 -0
  78. package/lib/routing-controllers/Makefile +26 -3
  79. package/lib/routing-controllers/package.json +2 -4
  80. package/lib/routing-controllers/src/app.ts +7 -8
  81. package/lib/routing-controllers/src/config/index.ts +5 -0
  82. package/lib/routing-controllers/src/middlewares/auth.middleware.ts +2 -2
  83. package/lib/routing-controllers/src/server.ts +0 -2
  84. package/lib/routing-controllers/src/services/auth.service.ts +2 -2
  85. package/lib/routing-controllers/src/utils/logger.ts +2 -2
  86. package/lib/routing-controllers/tsconfig.json +1 -0
  87. package/lib/sequelize/.env.development.local +20 -0
  88. package/lib/sequelize/.env.production.local +20 -0
  89. package/lib/sequelize/.env.test.local +20 -0
  90. package/lib/sequelize/.swcrc +1 -0
  91. package/lib/sequelize/Makefile +26 -3
  92. package/lib/sequelize/package.json +2 -4
  93. package/lib/sequelize/src/app.ts +6 -7
  94. package/lib/sequelize/src/config/index.ts +5 -0
  95. package/lib/sequelize/src/databases/index.ts +7 -8
  96. package/lib/sequelize/src/middlewares/auth.middleware.ts +2 -2
  97. package/lib/sequelize/src/server.ts +0 -2
  98. package/lib/sequelize/src/services/auth.service.ts +2 -2
  99. package/lib/sequelize/src/utils/logger.ts +2 -2
  100. package/lib/sequelize/tsconfig.json +1 -0
  101. package/lib/starter.js +30 -8
  102. package/lib/typegoose/Makefile +26 -3
  103. package/lib/typegoose/package.json +3 -3
  104. package/lib/typeorm/.env.development.local +20 -0
  105. package/lib/typeorm/.env.production.local +20 -0
  106. package/lib/typeorm/.env.test.local +20 -0
  107. package/lib/typeorm/.swcrc +1 -0
  108. package/lib/typeorm/Makefile +26 -3
  109. package/lib/typeorm/package.json +2 -4
  110. package/lib/typeorm/src/app.ts +6 -7
  111. package/lib/typeorm/src/config/index.ts +5 -0
  112. package/lib/typeorm/src/databases/index.ts +6 -8
  113. package/lib/typeorm/src/middlewares/auth.middleware.ts +2 -2
  114. package/lib/typeorm/src/server.ts +0 -2
  115. package/lib/typeorm/src/services/auth.service.ts +2 -2
  116. package/lib/typeorm/src/utils/logger.ts +2 -2
  117. package/lib/typeorm/tsconfig.json +1 -0
  118. package/package.json +1 -1
  119. package/lib/default/.env +0 -1
  120. package/lib/default/src/configs/development.json +0 -12
  121. package/lib/default/src/configs/production.json +0 -12
  122. package/lib/default/src/configs/test.json +0 -12
  123. package/lib/default/src/index.ts +0 -1
  124. package/lib/graphql/.env +0 -1
  125. package/lib/graphql/src/configs/development.json +0 -19
  126. package/lib/graphql/src/configs/production.json +0 -19
  127. package/lib/graphql/src/configs/test.json +0 -19
  128. package/lib/graphql/src/index.ts +0 -1
  129. package/lib/graphql/src/interfaces/db.interface.ts +0 -7
  130. package/lib/knex/.env +0 -1
  131. package/lib/knex/src/configs/development.json +0 -19
  132. package/lib/knex/src/configs/production.json +0 -19
  133. package/lib/knex/src/configs/test.json +0 -19
  134. package/lib/knex/src/index.ts +0 -1
  135. package/lib/knex/src/interfaces/db.interface.ts +0 -7
  136. package/lib/mongoose/.env +0 -1
  137. package/lib/mongoose/src/configs/development.json +0 -17
  138. package/lib/mongoose/src/configs/production.json +0 -17
  139. package/lib/mongoose/src/configs/test.json +0 -17
  140. package/lib/mongoose/src/index.ts +0 -1
  141. package/lib/mongoose/src/interfaces/db.interface.ts +0 -5
  142. package/lib/prisma/.env +0 -10
  143. package/lib/prisma/src/configs/development.json +0 -12
  144. package/lib/prisma/src/configs/production.json +0 -12
  145. package/lib/prisma/src/configs/test.json +0 -12
  146. package/lib/prisma/src/index.ts +0 -1
  147. package/lib/routing-controllers/.env +0 -1
  148. package/lib/routing-controllers/src/configs/development.json +0 -12
  149. package/lib/routing-controllers/src/configs/production.json +0 -12
  150. package/lib/routing-controllers/src/configs/test.json +0 -12
  151. package/lib/routing-controllers/src/index.ts +0 -1
  152. package/lib/sequelize/.env +0 -1
  153. package/lib/sequelize/src/configs/development.json +0 -22
  154. package/lib/sequelize/src/configs/production.json +0 -22
  155. package/lib/sequelize/src/configs/test.json +0 -22
  156. package/lib/sequelize/src/index.ts +0 -1
  157. package/lib/sequelize/src/interfaces/db.interface.ts +0 -10
  158. package/lib/typeorm/.env +0 -1
  159. package/lib/typeorm/src/configs/development.json +0 -18
  160. package/lib/typeorm/src/configs/production.json +0 -18
  161. package/lib/typeorm/src/configs/test.json +0 -18
  162. package/lib/typeorm/src/index.ts +0 -1
  163. package/lib/typeorm/src/interfaces/db.interface.ts +0 -6
@@ -0,0 +1,5 @@
1
+ import { config } from 'dotenv';
2
+ config({ path: `.env.${process.env.NODE_ENV || 'development'}.local` });
3
+
4
+ export const CREDENTIALS = process.env.CREDENTIALS === 'true';
5
+ export const { NODE_ENV, PORT, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE, SECRET_KEY, LOG_FORMAT, LOG_DIR, ORIGIN } = process.env;
@@ -1,13 +1,12 @@
1
- import config from 'config';
2
1
  import Sequelize from 'sequelize';
3
- import { dbConfig } from '@interfaces/db.interface';
2
+ import { NODE_ENV, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE } from '@config';
4
3
  import UserModel from '@models/users.model';
5
4
  import { logger } from '@utils/logger';
6
5
 
7
- const { host, user, password, database, pool }: dbConfig = config.get('dbConfig');
8
- const sequelize = new Sequelize.Sequelize(database, user, password, {
9
- host: host,
6
+ const sequelize = new Sequelize.Sequelize(DB_DATABASE, DB_USER, DB_PASSWORD, {
10
7
  dialect: 'mysql',
8
+ host: DB_HOST,
9
+ port: DB_PORT,
11
10
  timezone: '+09:00',
12
11
  define: {
13
12
  charset: 'utf8mb4',
@@ -16,10 +15,10 @@ const sequelize = new Sequelize.Sequelize(database, user, password, {
16
15
  freezeTableName: true,
17
16
  },
18
17
  pool: {
19
- min: pool.min,
20
- max: pool.max,
18
+ min: 0,
19
+ max: 5,
21
20
  },
22
- logQueryParameters: process.env.NODE_ENV === 'development',
21
+ logQueryParameters: NODE_ENV === 'development',
23
22
  logging: (query, time) => {
24
23
  logger.info(time + 'ms' + ' ' + query);
25
24
  },
@@ -1,6 +1,6 @@
1
- import config from 'config';
2
1
  import { NextFunction, Response } from 'express';
3
2
  import { verify } from 'jsonwebtoken';
3
+ import { SECRET_KEY } from '@config';
4
4
  import DB from '@databases';
5
5
  import { HttpException } from '@exceptions/HttpException';
6
6
  import { DataStoredInToken, RequestWithUser } from '@interfaces/auth.interface';
@@ -10,7 +10,7 @@ const authMiddleware = async (req: RequestWithUser, res: Response, next: NextFun
10
10
  const Authorization = req.cookies['Authorization'] || (req.header('Authorization') ? req.header('Authorization').split('Bearer ')[1] : null);
11
11
 
12
12
  if (Authorization) {
13
- const secretKey: string = config.get('secretKey');
13
+ const secretKey: string = SECRET_KEY;
14
14
  const verificationResponse = verify(Authorization, secretKey) as DataStoredInToken;
15
15
  const userId = verificationResponse.id;
16
16
  const findUser = await DB.Users.findByPk(userId);
@@ -1,5 +1,3 @@
1
- import 'dotenv/config';
2
- import '@/index';
3
1
  import App from '@/app';
4
2
  import AuthRoute from '@routes/auth.route';
5
3
  import IndexRoute from '@routes/index.route';
@@ -1,6 +1,6 @@
1
1
  import { compare, hash } from 'bcrypt';
2
- import config from 'config';
3
2
  import { sign } from 'jsonwebtoken';
3
+ import { SECRET_KEY } from '@config';
4
4
  import DB from '@databases';
5
5
  import { CreateUserDto } from '@dtos/users.dto';
6
6
  import { HttpException } from '@exceptions/HttpException';
@@ -49,7 +49,7 @@ class AuthService {
49
49
 
50
50
  public createToken(user: User): TokenData {
51
51
  const dataStoredInToken: DataStoredInToken = { id: user.id };
52
- const secretKey: string = config.get('secretKey');
52
+ const secretKey: string = SECRET_KEY;
53
53
  const expiresIn: number = 60 * 60;
54
54
 
55
55
  return { expiresIn, token: sign(dataStoredInToken, secretKey, { expiresIn }) };
@@ -1,11 +1,11 @@
1
- import config from 'config';
2
1
  import { existsSync, mkdirSync } from 'fs';
3
2
  import { join } from 'path';
4
3
  import winston from 'winston';
5
4
  import winstonDaily from 'winston-daily-rotate-file';
5
+ import { LOG_DIR } from '@config';
6
6
 
7
7
  // logs dir
8
- const logDir: string = join(__dirname, config.get('log.dir'));
8
+ const logDir: string = join(__dirname, LOG_DIR);
9
9
 
10
10
  if (!existsSync(logDir)) {
11
11
  mkdirSync(logDir);
@@ -22,6 +22,7 @@
22
22
  "baseUrl": "src",
23
23
  "paths": {
24
24
  "@/*": ["*"],
25
+ "@config": ["config"],
25
26
  "@controllers/*": ["controllers/*"],
26
27
  "@databases": ["databases"],
27
28
  "@dtos/*": ["dtos/*"],
package/lib/starter.js CHANGED
@@ -29,7 +29,8 @@ const createProject = async (projectName) => {
29
29
 
30
30
  try {
31
31
  const template = await chooseTemplates();
32
- const { isUpdated, isDeduped } = await setupModuleManagement();
32
+ const isUpdated = await dependenciesUpdates();
33
+ const isDeduped = await dependenciesDeduped();
33
34
 
34
35
  console.log("[ 1 / 3 ] 🔍 copying project...");
35
36
  console.log("[ 2 / 3 ] 🚚 fetching node_modules...");
@@ -91,29 +92,50 @@ const chooseTemplates = async () => {
91
92
  };
92
93
 
93
94
  /**
94
- * @method setupModuleManagement
95
- * @description Set up npm management features.
95
+ * @method dependenciesUpdates
96
+ * @description npm dependencies updated.
96
97
  */
97
- const setupModuleManagement = async () => {
98
+ const dependenciesUpdates = async () => {
98
99
  const { isUpdated } = await inquirer.prompt([
99
100
  {
100
101
  type: "confirm",
101
102
  name: "isUpdated",
102
103
  message:
103
- "This command will update all the packages listed to the latest version.",
104
+ "Do you want to update all packages in the node_modules directory and dependency ?"
104
105
  },
105
106
  ]);
106
107
 
108
+ if (isUpdated) {
109
+ const { isUpdatedReconfirm } = await inquirer.prompt([
110
+ {
111
+ type: "confirm",
112
+ name: "isUpdatedReconfirm",
113
+ message:
114
+ "However, updating to the latest version may cause package dependency issues. Do you still want to update ?"
115
+ },
116
+ ]);
117
+
118
+ return isUpdatedReconfirm;
119
+ }
120
+
121
+ return false;
122
+ };
123
+
124
+ /**
125
+ * @method dependenciesDeduped
126
+ * @description npm duplicate dependencies removed.
127
+ */
128
+ const dependenciesDeduped = async () => {
107
129
  const { isDeduped } = await inquirer.prompt([
108
130
  {
109
131
  type: "confirm",
110
132
  name: "isDeduped",
111
- message: "It is used to clean up duplicate packages in npm.",
133
+ message: "Used to removed duplicate packages at npm. Do you want to ?",
112
134
  },
113
135
  ]);
114
136
 
115
- return { isUpdated, isDeduped };
116
- };
137
+ return isDeduped;
138
+ }
117
139
 
118
140
  /**
119
141
  * @method copyProjectFiles
@@ -1,6 +1,29 @@
1
+ # app name should be overridden.
2
+ # ex) production-stage: make build APP_NAME=<APP_NAME>
3
+ # ex) development-stage: make build-dev APP_NAME=<APP_NAME>
4
+
5
+ APP_NAME = typescript-express
6
+ APP_NAME := $(APP_NAME)
7
+
8
+ .PHONY: build
9
+ # Build the container image - Dvelopment
10
+ build-dev:
11
+ docker build -t ${APP_NAME}\
12
+ --target development-build-stage\
13
+ -f Dockerfile .
14
+
15
+ # Build the container image - Production
1
16
  build:
2
- docker build -t ${tag} .
17
+ docker build -t ${APP_NAME}\
18
+ --target production-build-stage\
19
+ -f Dockerfile .
20
+
21
+ # Clean the container image
3
22
  clean:
4
- docker rmi -f ${tag}
23
+ docker rmi -f ${APP_NAME}
24
+
25
+ # Run the container image
5
26
  run:
6
- docker run -d -p ${port}:${port} --name ${name} ${tag}
27
+ docker run -d -it -p 3000:3000 ${APP_NAME}
28
+
29
+ all: build
@@ -7,8 +7,8 @@
7
7
  "scripts": {
8
8
  "start": "npm run build && cross-env NODE_ENV=production node dist/server.js",
9
9
  "dev": "cross-env NODE_ENV=development nodemon",
10
- "build": "tsc && tsc-alias",
11
- "build:swc": "swc src -d dist --source-maps --copy-files",
10
+ "build": "swc src -d dist --source-maps --copy-files",
11
+ "build:tsc": "tsc && tsc-alias",
12
12
  "test": "jest --forceExit --detectOpenHandles",
13
13
  "lint": "eslint --ignore-path .gitignore --ext .ts src/",
14
14
  "lint:fix": "npm run lint -- --fix",
@@ -29,7 +29,7 @@
29
29
  "helmet": "^4.6.0",
30
30
  "hpp": "^0.2.3",
31
31
  "jsonwebtoken": "^8.5.1",
32
- "mongoose": "~6.1.3",
32
+ "mongoose": "~6.2.3",
33
33
  "morgan": "^1.10.0",
34
34
  "swagger-jsdoc": "^6.0.0",
35
35
  "swagger-ui-express": "^4.1.6",
@@ -0,0 +1,20 @@
1
+ # PORT
2
+ PORT = 3000
3
+
4
+ # DATABASE
5
+ DB_HOST = localhost
6
+ DB_PORT = 5432
7
+ DB_USER = root
8
+ DB_PASSWORD = password
9
+ DB_DATABASE = test
10
+
11
+ # TOKEN
12
+ SECRET_KEY = secretKey
13
+
14
+ # LOG
15
+ LOG_FORMAT = dev
16
+ LOG_DIR = ../logs
17
+
18
+ # CORS
19
+ ORIGIN = *
20
+ CREDENTIALS = true
@@ -0,0 +1,20 @@
1
+ # PORT
2
+ PORT = 3000
3
+
4
+ # DATABASE
5
+ DB_HOST = localhost
6
+ DB_PORT = 5432
7
+ DB_USER = root
8
+ DB_PASSWORD = password
9
+ DB_DATABASE = test
10
+
11
+ # TOKEN
12
+ SECRET_KEY = secretKey
13
+
14
+ # LOG
15
+ LOG_FORMAT = combined
16
+ LOG_DIR = ../logs
17
+
18
+ # CORS
19
+ ORIGIN = your.domain.com
20
+ CREDENTIALS = true
@@ -0,0 +1,20 @@
1
+ # PORT
2
+ PORT = 3000
3
+
4
+ # DATABASE
5
+ DB_HOST = localhost
6
+ DB_PORT = 5432
7
+ DB_USER = root
8
+ DB_PASSWORD = password
9
+ DB_DATABASE = test
10
+
11
+ # TOKEN
12
+ SECRET_KEY = secretKey
13
+
14
+ # LOG
15
+ LOG_FORMAT = dev
16
+ LOG_DIR = ../logs
17
+
18
+ # CORS
19
+ ORIGIN = *
20
+ CREDENTIALS = true
@@ -21,6 +21,7 @@
21
21
  "baseUrl": "src",
22
22
  "paths": {
23
23
  "@/*": ["*"],
24
+ "@config": ["config"],
24
25
  "@controllers/*": ["controllers/*"],
25
26
  "@databases": ["databases"],
26
27
  "@dtos/*": ["dtos/*"],
@@ -1,6 +1,29 @@
1
+ # app name should be overridden.
2
+ # ex) production-stage: make build APP_NAME=<APP_NAME>
3
+ # ex) development-stage: make build-dev APP_NAME=<APP_NAME>
4
+
5
+ APP_NAME = typescript-express
6
+ APP_NAME := $(APP_NAME)
7
+
8
+ .PHONY: build
9
+ # Build the container image - Dvelopment
10
+ build-dev:
11
+ docker build -t ${APP_NAME}\
12
+ --target development-build-stage\
13
+ -f Dockerfile .
14
+
15
+ # Build the container image - Production
1
16
  build:
2
- docker build -t ${tag} .
17
+ docker build -t ${APP_NAME}\
18
+ --target production-build-stage\
19
+ -f Dockerfile .
20
+
21
+ # Clean the container image
3
22
  clean:
4
- docker rmi -f ${tag}
23
+ docker rmi -f ${APP_NAME}
24
+
25
+ # Run the container image
5
26
  run:
6
- docker run -d -p ${port}:${port} --name ${name} ${tag}
27
+ docker run -d -it -p 3000:3000 ${APP_NAME}
28
+
29
+ all: build
@@ -7,8 +7,8 @@
7
7
  "scripts": {
8
8
  "start": "npm run build && cross-env NODE_ENV=production node dist/server.js",
9
9
  "dev": "cross-env NODE_ENV=development nodemon",
10
- "build": "tsc && tsc-alias",
11
- "build:swc": "swc src -d dist --source-maps --copy-files",
10
+ "build": "swc src -d dist --source-maps --copy-files",
11
+ "build:tsc": "tsc && tsc-alias",
12
12
  "test": "jest --forceExit --detectOpenHandles",
13
13
  "lint": "eslint --ignore-path .gitignore --ext .ts src/",
14
14
  "lint:fix": "npm run lint -- --fix",
@@ -20,7 +20,6 @@
20
20
  "class-transformer": "^0.4.0",
21
21
  "class-validator": "^0.13.1",
22
22
  "compression": "^1.7.4",
23
- "config": "^3.3.6",
24
23
  "cookie-parser": "^1.4.5",
25
24
  "cors": "^2.8.5",
26
25
  "dotenv": "^10.0.0",
@@ -43,7 +42,6 @@
43
42
  "@swc/core": "^1.2.108",
44
43
  "@types/bcrypt": "^5.0.0",
45
44
  "@types/compression": "^1.7.1",
46
- "@types/config": "^0.0.39",
47
45
  "@types/cookie-parser": "^1.4.2",
48
46
  "@types/cors": "^2.8.11",
49
47
  "@types/dotenv": "^8.2.0",
@@ -1,8 +1,6 @@
1
1
  import 'reflect-metadata';
2
- import '@/index';
3
2
  import cookieParser from 'cookie-parser';
4
3
  import cors from 'cors';
5
- import config from 'config';
6
4
  import express from 'express';
7
5
  import helmet from 'helmet';
8
6
  import hpp from 'hpp';
@@ -11,6 +9,7 @@ import compression from 'compression';
11
9
  import swaggerUi from 'swagger-ui-express';
12
10
  import swaggerJSDoc from 'swagger-jsdoc';
13
11
  import { createConnection } from 'typeorm';
12
+ import { NODE_ENV, PORT, LOG_FORMAT, ORIGIN, CREDENTIALS } from '@config';
14
13
  import { dbConnection } from '@databases';
15
14
  import { Routes } from '@interfaces/routes.interface';
16
15
  import errorMiddleware from '@middlewares/error.middleware';
@@ -18,13 +17,13 @@ import { logger, stream } from '@utils/logger';
18
17
 
19
18
  class App {
20
19
  public app: express.Application;
21
- public port: string | number;
22
20
  public env: string;
21
+ public port: string | number;
23
22
 
24
23
  constructor(routes: Routes[]) {
25
24
  this.app = express();
26
- this.port = process.env.PORT || 3000;
27
- this.env = process.env.NODE_ENV || 'development';
25
+ this.env = NODE_ENV || 'development';
26
+ this.port = PORT || 3000;
28
27
 
29
28
  this.env !== 'test' && this.connectToDatabase();
30
29
  this.initializeMiddlewares();
@@ -51,8 +50,8 @@ class App {
51
50
  }
52
51
 
53
52
  private initializeMiddlewares() {
54
- this.app.use(morgan(config.get('log.format'), { stream }));
55
- this.app.use(cors({ origin: config.get('cors.origin'), credentials: config.get('cors.credentials') }));
53
+ this.app.use(morgan(LOG_FORMAT, { stream }));
54
+ this.app.use(cors({ origin: ORIGIN, credentials: CREDENTIALS }));
56
55
  this.app.use(hpp());
57
56
  this.app.use(helmet());
58
57
  this.app.use(compression());
@@ -0,0 +1,5 @@
1
+ import { config } from 'dotenv';
2
+ config({ path: `.env.${process.env.NODE_ENV || 'development'}.local` });
3
+
4
+ export const CREDENTIALS = process.env.CREDENTIALS === 'true';
5
+ export const { NODE_ENV, PORT, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE, SECRET_KEY, LOG_FORMAT, LOG_DIR, ORIGIN } = process.env;
@@ -1,16 +1,14 @@
1
- import config from 'config';
2
1
  import { join } from 'path';
3
2
  import { ConnectionOptions } from 'typeorm';
4
- import { dbConfig } from '@interfaces/db.interface';
3
+ import { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE } from '@config';
5
4
 
6
- const { host, user, password, database }: dbConfig = config.get('dbConfig');
7
5
  export const dbConnection: ConnectionOptions = {
8
6
  type: 'postgres',
9
- host: host,
10
- port: 5432,
11
- username: user,
12
- password: password,
13
- database: database,
7
+ host: DB_HOST,
8
+ port: DB_PORT,
9
+ username: DB_USER,
10
+ password: DB_PASSWORD,
11
+ database: DB_DATABASE,
14
12
  synchronize: true,
15
13
  logging: false,
16
14
  entities: [join(__dirname, '../**/*.entity{.ts,.js}')],
@@ -1,6 +1,6 @@
1
- import config from 'config';
2
1
  import { NextFunction, Response } from 'express';
3
2
  import { verify } from 'jsonwebtoken';
3
+ import { SECRET_KEY } from '@config';
4
4
  import { UserEntity } from '@entities/users.entity';
5
5
  import { HttpException } from '@exceptions/HttpException';
6
6
  import { DataStoredInToken, RequestWithUser } from '@interfaces/auth.interface';
@@ -10,7 +10,7 @@ const authMiddleware = async (req: RequestWithUser, res: Response, next: NextFun
10
10
  const Authorization = req.cookies['Authorization'] || (req.header('Authorization') ? req.header('Authorization').split('Bearer ')[1] : null);
11
11
 
12
12
  if (Authorization) {
13
- const secretKey: string = config.get('secretKey');
13
+ const secretKey: string = SECRET_KEY;
14
14
  const { id } = (await verify(Authorization, secretKey)) as DataStoredInToken;
15
15
  const findUser = await UserEntity.findOne(id, { select: ['id', 'email', 'password'] });
16
16
 
@@ -1,5 +1,3 @@
1
- import 'dotenv/config';
2
- import '@/index';
3
1
  import App from '@/app';
4
2
  import AuthRoute from '@routes/auth.route';
5
3
  import IndexRoute from '@routes/index.route';
@@ -1,7 +1,7 @@
1
1
  import { compare, hash } from 'bcrypt';
2
- import config from 'config';
3
2
  import { sign } from 'jsonwebtoken';
4
3
  import { EntityRepository, Repository } from 'typeorm';
4
+ import { SECRET_KEY } from '@config';
5
5
  import { CreateUserDto } from '@dtos/users.dto';
6
6
  import { UserEntity } from '@entities/users.entity';
7
7
  import { HttpException } from '@exceptions/HttpException';
@@ -48,7 +48,7 @@ class AuthService extends Repository<UserEntity> {
48
48
 
49
49
  public createToken(user: User): TokenData {
50
50
  const dataStoredInToken: DataStoredInToken = { id: user.id };
51
- const secretKey: string = config.get('secretKey');
51
+ const secretKey: string = SECRET_KEY;
52
52
  const expiresIn: number = 60 * 60;
53
53
 
54
54
  return { expiresIn, token: sign(dataStoredInToken, secretKey, { expiresIn }) };
@@ -1,11 +1,11 @@
1
- import config from 'config';
2
1
  import { existsSync, mkdirSync } from 'fs';
3
2
  import { join } from 'path';
4
3
  import winston from 'winston';
5
4
  import winstonDaily from 'winston-daily-rotate-file';
5
+ import { LOG_DIR } from '@config';
6
6
 
7
7
  // logs dir
8
- const logDir: string = join(__dirname, config.get('log.dir'));
8
+ const logDir: string = join(__dirname, LOG_DIR);
9
9
 
10
10
  if (!existsSync(logDir)) {
11
11
  mkdirSync(logDir);
@@ -22,6 +22,7 @@
22
22
  "baseUrl": "src",
23
23
  "paths": {
24
24
  "@/*": ["*"],
25
+ "@config": ["config"],
25
26
  "@controllers/*": ["controllers/*"],
26
27
  "@databases": ["databases"],
27
28
  "@dtos/*": ["dtos/*"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typescript-express-starter",
3
- "version": "8.0.2",
3
+ "version": "8.1.7",
4
4
  "description": "Quick and Easy TypeScript Express Starter",
5
5
  "author": "AGUMON <ljlm0402@gmail.com>",
6
6
  "license": "MIT",
package/lib/default/.env DELETED
@@ -1 +0,0 @@
1
- PORT=3000
@@ -1,12 +0,0 @@
1
- {
2
- "env": "development",
3
- "secretKey": "secretKey",
4
- "log": {
5
- "format": "dev",
6
- "dir": "../logs"
7
- },
8
- "cors": {
9
- "origin": true,
10
- "credentials": true
11
- }
12
- }
@@ -1,12 +0,0 @@
1
- {
2
- "env": "production",
3
- "secretKey": "secretKey",
4
- "log": {
5
- "format": "combined",
6
- "dir": "../logs"
7
- },
8
- "cors": {
9
- "origin": "your.domain.com",
10
- "credentials": true
11
- }
12
- }
@@ -1,12 +0,0 @@
1
- {
2
- "env": "test",
3
- "secretKey": "secretKey",
4
- "log": {
5
- "format": "dev",
6
- "dir": "../logs"
7
- },
8
- "cors": {
9
- "origin": true,
10
- "credentials": true
11
- }
12
- }
@@ -1 +0,0 @@
1
- process.env['NODE_CONFIG_DIR'] = __dirname + '/configs';
package/lib/graphql/.env DELETED
@@ -1 +0,0 @@
1
- PORT=3000
@@ -1,19 +0,0 @@
1
- {
2
- "env": "development",
3
- "dbConfig": {
4
- "host": "localhost",
5
- "user": "root",
6
- "port": 5432,
7
- "password": "password",
8
- "database": "test"
9
- },
10
- "secretKey": "secretKey",
11
- "log": {
12
- "format": "dev",
13
- "dir": "../logs"
14
- },
15
- "cors": {
16
- "origin": true,
17
- "credentials": true
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- {
2
- "env": "production",
3
- "dbConfig": {
4
- "host": "localhost",
5
- "user": "root",
6
- "port": 5432,
7
- "password": "password",
8
- "database": "test"
9
- },
10
- "secretKey": "secretKey",
11
- "log": {
12
- "format": "combined",
13
- "dir": "../logs"
14
- },
15
- "cors": {
16
- "origin": "your.domain.com",
17
- "credentials": true
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- {
2
- "env": "test",
3
- "dbConfig": {
4
- "host": "localhost",
5
- "user": "root",
6
- "port": 5432,
7
- "password": "password",
8
- "database": "test"
9
- },
10
- "secretKey": "secretKey",
11
- "log": {
12
- "format": "dev",
13
- "dir": "../logs"
14
- },
15
- "cors": {
16
- "origin": true,
17
- "credentials": true
18
- }
19
- }
@@ -1 +0,0 @@
1
- process.env['NODE_CONFIG_DIR'] = __dirname + '/configs';
@@ -1,7 +0,0 @@
1
- export interface dbConfig {
2
- host: string;
3
- user: string;
4
- port: number;
5
- password: string;
6
- database: string;
7
- }
package/lib/knex/.env DELETED
@@ -1 +0,0 @@
1
- PORT=3000