typescript-express-starter 10.2.1 → 11.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.
Files changed (607) hide show
  1. package/README.kr.md +136 -287
  2. package/README.md +134 -274
  3. package/bin/ast-utils.js +226 -0
  4. package/bin/common.js +312 -0
  5. package/bin/config.js +80 -0
  6. package/bin/db-map.js +169 -0
  7. package/bin/errors.js +129 -0
  8. package/bin/performance.js +203 -0
  9. package/bin/starter.js +359 -0
  10. package/bin/validators.js +146 -0
  11. package/devtools/biome/.biome.json +34 -0
  12. package/devtools/biome/.biomeignore +29 -0
  13. package/devtools/docker/.dockerignore +27 -0
  14. package/devtools/docker/Dockerfile.dev +20 -0
  15. package/devtools/docker/Dockerfile.prod +35 -0
  16. package/{lib/default → devtools/docker}/Makefile +3 -0
  17. package/devtools/docker/nginx.conf +67 -0
  18. package/devtools/eslint/eslint.config.cjs +23 -0
  19. package/devtools/husky/.husky/commit-msg +4 -0
  20. package/devtools/husky/.husky/pre-commit +4 -0
  21. package/devtools/husky/.husky/pre-push +4 -0
  22. package/devtools/jest/jest.config.cjs +2 -0
  23. package/devtools/jest/jest.config.ts +25 -0
  24. package/devtools/jest/src/test/e2e/auth.e2e.spec.ts +40 -0
  25. package/devtools/jest/src/test/e2e/users.e2e.spec.ts +63 -0
  26. package/devtools/jest/src/test/setup.ts +31 -0
  27. package/devtools/jest/src/test/unit/entities/user.entity.spec.ts +279 -0
  28. package/devtools/jest/src/test/unit/services/auth.service.spec.ts +75 -0
  29. package/devtools/jest/src/test/unit/services/users.service.spec.ts +109 -0
  30. package/devtools/oxlint/.oxlintrc.json +57 -0
  31. package/devtools/pm2/ecosystem.config.js +59 -0
  32. package/devtools/swagger/swagger.yaml +124 -0
  33. package/{lib/prisma → devtools/swc}/.swcrc +2 -1
  34. package/devtools/tsup/tsup.config.ts +15 -0
  35. package/devtools/vitest/src/test/e2e/auth.e2e.spec.ts +41 -0
  36. package/devtools/vitest/src/test/e2e/users.e2e.spec.ts +64 -0
  37. package/devtools/vitest/src/test/setup.ts +31 -0
  38. package/devtools/vitest/src/test/unit/services/auth.service.spec.ts +70 -0
  39. package/devtools/vitest/src/test/unit/services/users.service.spec.ts +90 -0
  40. package/devtools/vitest/vitest.config.ts +22 -0
  41. package/package.json +24 -11
  42. package/templates/default/nodemon.json +7 -0
  43. package/templates/default/package.json +48 -0
  44. package/templates/default/src/app.ts +118 -0
  45. package/templates/default/src/config/env.ts +78 -0
  46. package/templates/default/src/controllers/auth.controller.ts +40 -0
  47. package/templates/default/src/controllers/users.controller.ts +46 -0
  48. package/templates/default/src/dtos/users.dto.ts +42 -0
  49. package/templates/default/src/entities/user.entity.ts +190 -0
  50. package/templates/default/src/exceptions/httpException.ts +14 -0
  51. package/{lib/knex → templates/default}/src/interfaces/auth.interface.ts +3 -3
  52. package/templates/default/src/interfaces/users.interface.ts +9 -0
  53. package/templates/default/src/middlewares/auth.middleware.ts +49 -0
  54. package/templates/default/src/middlewares/error.middleware.ts +89 -0
  55. package/templates/default/src/middlewares/notFound.middleware.ts +6 -0
  56. package/templates/default/src/middlewares/validation.middleware.ts +15 -0
  57. package/templates/default/src/repositories/users.repository.ts +55 -0
  58. package/templates/default/src/routes/auth.route.ts +31 -0
  59. package/templates/default/src/routes/users.route.ts +32 -0
  60. package/templates/default/src/server.ts +35 -0
  61. package/templates/default/src/services/auth.service.ts +67 -0
  62. package/templates/default/src/services/users.service.ts +48 -0
  63. package/templates/default/src/utils/asyncHandler.ts +8 -0
  64. package/templates/default/src/utils/logger.ts +113 -0
  65. package/{lib/typeorm → templates/default}/tsconfig.json +23 -22
  66. package/CONTRIBUTORS.md +0 -69
  67. package/bin/cli.js +0 -18
  68. package/lib/default/.dockerignore +0 -18
  69. package/lib/default/.editorconfig +0 -9
  70. package/lib/default/.env.development.local +0 -13
  71. package/lib/default/.env.production.local +0 -13
  72. package/lib/default/.env.test.local +0 -13
  73. package/lib/default/.eslintignore +0 -1
  74. package/lib/default/.eslintrc +0 -18
  75. package/lib/default/.huskyrc +0 -5
  76. package/lib/default/.lintstagedrc.json +0 -5
  77. package/lib/default/.prettierrc +0 -8
  78. package/lib/default/.swcrc +0 -39
  79. package/lib/default/.vscode/launch.json +0 -35
  80. package/lib/default/.vscode/settings.json +0 -6
  81. package/lib/default/Dockerfile.dev +0 -18
  82. package/lib/default/Dockerfile.prod +0 -18
  83. package/lib/default/docker-compose.yml +0 -35
  84. package/lib/default/ecosystem.config.js +0 -57
  85. package/lib/default/jest.config.js +0 -12
  86. package/lib/default/nginx.conf +0 -40
  87. package/lib/default/nodemon.json +0 -12
  88. package/lib/default/package.json +0 -76
  89. package/lib/default/src/app.ts +0 -81
  90. package/lib/default/src/config/index.ts +0 -5
  91. package/lib/default/src/controllers/auth.controller.ts +0 -44
  92. package/lib/default/src/controllers/users.controller.ts +0 -63
  93. package/lib/default/src/dtos/users.dto.ts +0 -20
  94. package/lib/default/src/exceptions/HttpException.ts +0 -10
  95. package/lib/default/src/http/auth.http +0 -27
  96. package/lib/default/src/http/users.http +0 -34
  97. package/lib/default/src/interfaces/auth.interface.ts +0 -15
  98. package/lib/default/src/interfaces/users.interface.ts +0 -5
  99. package/lib/default/src/middlewares/auth.middleware.ts +0 -38
  100. package/lib/default/src/middlewares/error.middleware.ts +0 -15
  101. package/lib/default/src/middlewares/validation.middleware.ts +0 -27
  102. package/lib/default/src/models/users.model.ts +0 -9
  103. package/lib/default/src/routes/auth.route.ts +0 -21
  104. package/lib/default/src/routes/users.route.ts +0 -23
  105. package/lib/default/src/server.ts +0 -10
  106. package/lib/default/src/services/auth.service.ts +0 -52
  107. package/lib/default/src/services/users.service.ts +0 -51
  108. package/lib/default/src/test/auth.test.ts +0 -52
  109. package/lib/default/src/test/users.test.ts +0 -62
  110. package/lib/default/src/utils/logger.ts +0 -65
  111. package/lib/default/src/utils/validateEnv.ts +0 -8
  112. package/lib/default/swagger.yaml +0 -123
  113. package/lib/default/tsconfig.json +0 -39
  114. package/lib/graphql/.dockerignore +0 -18
  115. package/lib/graphql/.editorconfig +0 -9
  116. package/lib/graphql/.env.development.local +0 -20
  117. package/lib/graphql/.env.production.local +0 -20
  118. package/lib/graphql/.env.test.local +0 -20
  119. package/lib/graphql/.eslintignore +0 -1
  120. package/lib/graphql/.eslintrc +0 -18
  121. package/lib/graphql/.huskyrc +0 -5
  122. package/lib/graphql/.lintstagedrc.json +0 -5
  123. package/lib/graphql/.prettierrc +0 -8
  124. package/lib/graphql/.swcrc +0 -40
  125. package/lib/graphql/.vscode/launch.json +0 -35
  126. package/lib/graphql/.vscode/settings.json +0 -6
  127. package/lib/graphql/Dockerfile.dev +0 -19
  128. package/lib/graphql/Dockerfile.prod +0 -19
  129. package/lib/graphql/Makefile +0 -46
  130. package/lib/graphql/docker-compose.yml +0 -58
  131. package/lib/graphql/ecosystem.config.js +0 -59
  132. package/lib/graphql/jest.config.js +0 -12
  133. package/lib/graphql/nginx.conf +0 -40
  134. package/lib/graphql/nodemon.json +0 -12
  135. package/lib/graphql/package.json +0 -75
  136. package/lib/graphql/src/app.ts +0 -107
  137. package/lib/graphql/src/config/index.ts +0 -6
  138. package/lib/graphql/src/database/index.ts +0 -26
  139. package/lib/graphql/src/dtos/users.dto.ts +0 -27
  140. package/lib/graphql/src/entities/users.entity.ts +0 -26
  141. package/lib/graphql/src/exceptions/HttpException.ts +0 -10
  142. package/lib/graphql/src/http/auth.http +0 -49
  143. package/lib/graphql/src/http/users.http +0 -78
  144. package/lib/graphql/src/interfaces/auth.interface.ts +0 -14
  145. package/lib/graphql/src/interfaces/users.interface.ts +0 -5
  146. package/lib/graphql/src/middlewares/auth.middleware.ts +0 -42
  147. package/lib/graphql/src/middlewares/error.middleware.ts +0 -15
  148. package/lib/graphql/src/repositories/auth.repository.ts +0 -53
  149. package/lib/graphql/src/repositories/users.repository.ts +0 -51
  150. package/lib/graphql/src/resolvers/auth.resolver.ts +0 -32
  151. package/lib/graphql/src/resolvers/users.resolver.ts +0 -47
  152. package/lib/graphql/src/server.ts +0 -10
  153. package/lib/graphql/src/test/auth.test.ts +0 -10
  154. package/lib/graphql/src/test/users.test.ts +0 -11
  155. package/lib/graphql/src/typedefs/users.type.ts +0 -13
  156. package/lib/graphql/src/utils/logger.ts +0 -77
  157. package/lib/graphql/src/utils/validateEnv.ts +0 -8
  158. package/lib/graphql/tsconfig.json +0 -40
  159. package/lib/knex/.dockerignore +0 -18
  160. package/lib/knex/.editorconfig +0 -9
  161. package/lib/knex/.env.development.local +0 -20
  162. package/lib/knex/.env.production.local +0 -20
  163. package/lib/knex/.env.test.local +0 -20
  164. package/lib/knex/.eslintignore +0 -1
  165. package/lib/knex/.eslintrc +0 -18
  166. package/lib/knex/.huskyrc +0 -5
  167. package/lib/knex/.lintstagedrc.json +0 -5
  168. package/lib/knex/.prettierrc +0 -8
  169. package/lib/knex/.swcrc +0 -40
  170. package/lib/knex/.vscode/launch.json +0 -35
  171. package/lib/knex/.vscode/settings.json +0 -6
  172. package/lib/knex/Dockerfile.dev +0 -19
  173. package/lib/knex/Dockerfile.prod +0 -19
  174. package/lib/knex/Makefile +0 -46
  175. package/lib/knex/docker-compose.yml +0 -55
  176. package/lib/knex/ecosystem.config.js +0 -57
  177. package/lib/knex/jest.config.js +0 -12
  178. package/lib/knex/knexfile.ts +0 -23
  179. package/lib/knex/nginx.conf +0 -40
  180. package/lib/knex/nodemon.json +0 -12
  181. package/lib/knex/package.json +0 -85
  182. package/lib/knex/src/app.ts +0 -87
  183. package/lib/knex/src/config/index.ts +0 -6
  184. package/lib/knex/src/controllers/auth.controller.ts +0 -44
  185. package/lib/knex/src/controllers/users.controller.ts +0 -63
  186. package/lib/knex/src/database/index.ts +0 -24
  187. package/lib/knex/src/database/migrations/.gitkeep +0 -0
  188. package/lib/knex/src/database/migrations/20210713110926_initial.ts +0 -17
  189. package/lib/knex/src/database/seeds/.gitkeep +0 -0
  190. package/lib/knex/src/dtos/users.dto.ts +0 -20
  191. package/lib/knex/src/exceptions/HttpException.ts +0 -10
  192. package/lib/knex/src/http/auth.http +0 -27
  193. package/lib/knex/src/http/users.http +0 -34
  194. package/lib/knex/src/interfaces/routes.interface.ts +0 -6
  195. package/lib/knex/src/interfaces/users.interface.ts +0 -5
  196. package/lib/knex/src/middlewares/auth.middleware.ts +0 -40
  197. package/lib/knex/src/middlewares/error.middleware.ts +0 -15
  198. package/lib/knex/src/middlewares/validation.middleware.ts +0 -27
  199. package/lib/knex/src/models/users.model.ts +0 -13
  200. package/lib/knex/src/routes/auth.route.ts +0 -22
  201. package/lib/knex/src/routes/users.route.ts +0 -23
  202. package/lib/knex/src/server.ts +0 -10
  203. package/lib/knex/src/services/auth.service.ts +0 -60
  204. package/lib/knex/src/services/users.service.ts +0 -55
  205. package/lib/knex/src/test/auth.test.ts +0 -51
  206. package/lib/knex/src/test/users.test.ts +0 -65
  207. package/lib/knex/src/utils/logger.ts +0 -65
  208. package/lib/knex/src/utils/validateEnv.ts +0 -8
  209. package/lib/knex/swagger.yaml +0 -123
  210. package/lib/knex/tsconfig.json +0 -40
  211. package/lib/mikro-orm/.dockerignore +0 -18
  212. package/lib/mikro-orm/.editorconfig +0 -9
  213. package/lib/mikro-orm/.env.development.local +0 -18
  214. package/lib/mikro-orm/.env.production.local +0 -18
  215. package/lib/mikro-orm/.env.test.local +0 -18
  216. package/lib/mikro-orm/.eslintignore +0 -1
  217. package/lib/mikro-orm/.eslintrc +0 -18
  218. package/lib/mikro-orm/.huskyrc +0 -5
  219. package/lib/mikro-orm/.lintstagedrc.json +0 -5
  220. package/lib/mikro-orm/.prettierrc +0 -8
  221. package/lib/mikro-orm/.swcrc +0 -41
  222. package/lib/mikro-orm/.vscode/launch.json +0 -35
  223. package/lib/mikro-orm/.vscode/settings.json +0 -6
  224. package/lib/mikro-orm/Dockerfile.dev +0 -19
  225. package/lib/mikro-orm/Dockerfile.prod +0 -19
  226. package/lib/mikro-orm/Makefile +0 -46
  227. package/lib/mikro-orm/docker-compose.yml +0 -55
  228. package/lib/mikro-orm/ecosystem.config.js +0 -57
  229. package/lib/mikro-orm/jest.config.js +0 -12
  230. package/lib/mikro-orm/nginx.conf +0 -40
  231. package/lib/mikro-orm/nodemon.json +0 -12
  232. package/lib/mikro-orm/package.json +0 -79
  233. package/lib/mikro-orm/src/app.ts +0 -97
  234. package/lib/mikro-orm/src/config/index.ts +0 -6
  235. package/lib/mikro-orm/src/controllers/auth.controller.ts +0 -44
  236. package/lib/mikro-orm/src/controllers/users.controller.ts +0 -63
  237. package/lib/mikro-orm/src/database/index.ts +0 -19
  238. package/lib/mikro-orm/src/dtos/users.dto.ts +0 -20
  239. package/lib/mikro-orm/src/entities/base.entity.ts +0 -16
  240. package/lib/mikro-orm/src/entities/users.entity.ts +0 -17
  241. package/lib/mikro-orm/src/exceptions/HttpException.ts +0 -10
  242. package/lib/mikro-orm/src/http/auth.http +0 -32
  243. package/lib/mikro-orm/src/http/users.http +0 -34
  244. package/lib/mikro-orm/src/interfaces/auth.interface.ts +0 -15
  245. package/lib/mikro-orm/src/interfaces/routes.interface.ts +0 -6
  246. package/lib/mikro-orm/src/interfaces/users.interface.ts +0 -5
  247. package/lib/mikro-orm/src/middlewares/auth.middleware.ts +0 -39
  248. package/lib/mikro-orm/src/middlewares/error.middleware.ts +0 -15
  249. package/lib/mikro-orm/src/middlewares/validation.middleware.ts +0 -27
  250. package/lib/mikro-orm/src/routes/auth.route.ts +0 -22
  251. package/lib/mikro-orm/src/routes/users.route.ts +0 -23
  252. package/lib/mikro-orm/src/server.ts +0 -10
  253. package/lib/mikro-orm/src/services/auth.service.ts +0 -53
  254. package/lib/mikro-orm/src/services/users.service.ts +0 -60
  255. package/lib/mikro-orm/src/test/auth.test.ts +0 -65
  256. package/lib/mikro-orm/src/test/users.test.ts +0 -69
  257. package/lib/mikro-orm/src/utils/logger.ts +0 -65
  258. package/lib/mikro-orm/src/utils/validateEnv.ts +0 -8
  259. package/lib/mikro-orm/swagger.yaml +0 -122
  260. package/lib/mikro-orm/tsconfig.json +0 -41
  261. package/lib/mongoose/.dockerignore +0 -18
  262. package/lib/mongoose/.editorconfig +0 -9
  263. package/lib/mongoose/.env.development.local +0 -18
  264. package/lib/mongoose/.env.production.local +0 -18
  265. package/lib/mongoose/.env.test.local +0 -18
  266. package/lib/mongoose/.eslintignore +0 -1
  267. package/lib/mongoose/.eslintrc +0 -18
  268. package/lib/mongoose/.huskyrc +0 -5
  269. package/lib/mongoose/.lintstagedrc.json +0 -5
  270. package/lib/mongoose/.prettierrc +0 -8
  271. package/lib/mongoose/.swcrc +0 -40
  272. package/lib/mongoose/.vscode/launch.json +0 -35
  273. package/lib/mongoose/.vscode/settings.json +0 -6
  274. package/lib/mongoose/Dockerfile.dev +0 -19
  275. package/lib/mongoose/Dockerfile.prod +0 -19
  276. package/lib/mongoose/Makefile +0 -46
  277. package/lib/mongoose/docker-compose.yml +0 -55
  278. package/lib/mongoose/ecosystem.config.js +0 -57
  279. package/lib/mongoose/jest.config.js +0 -12
  280. package/lib/mongoose/nginx.conf +0 -40
  281. package/lib/mongoose/nodemon.json +0 -12
  282. package/lib/mongoose/package.json +0 -78
  283. package/lib/mongoose/src/app.ts +0 -87
  284. package/lib/mongoose/src/config/index.ts +0 -6
  285. package/lib/mongoose/src/controllers/auth.controller.ts +0 -44
  286. package/lib/mongoose/src/controllers/users.controller.ts +0 -63
  287. package/lib/mongoose/src/database/index.ts +0 -18
  288. package/lib/mongoose/src/dtos/users.dto.ts +0 -20
  289. package/lib/mongoose/src/exceptions/HttpException.ts +0 -10
  290. package/lib/mongoose/src/http/auth.http +0 -27
  291. package/lib/mongoose/src/http/users.http +0 -34
  292. package/lib/mongoose/src/interfaces/auth.interface.ts +0 -15
  293. package/lib/mongoose/src/interfaces/routes.interface.ts +0 -6
  294. package/lib/mongoose/src/interfaces/users.interface.ts +0 -5
  295. package/lib/mongoose/src/middlewares/auth.middleware.ts +0 -39
  296. package/lib/mongoose/src/middlewares/error.middleware.ts +0 -15
  297. package/lib/mongoose/src/middlewares/validation.middleware.ts +0 -27
  298. package/lib/mongoose/src/models/users.model.ts +0 -16
  299. package/lib/mongoose/src/routes/auth.route.ts +0 -22
  300. package/lib/mongoose/src/routes/users.route.ts +0 -23
  301. package/lib/mongoose/src/server.ts +0 -10
  302. package/lib/mongoose/src/services/auth.service.ts +0 -52
  303. package/lib/mongoose/src/services/users.service.ts +0 -54
  304. package/lib/mongoose/src/test/auth.test.ts +0 -83
  305. package/lib/mongoose/src/test/index.test.ts +0 -18
  306. package/lib/mongoose/src/test/users.test.ts +0 -133
  307. package/lib/mongoose/src/utils/logger.ts +0 -65
  308. package/lib/mongoose/src/utils/validateEnv.ts +0 -8
  309. package/lib/mongoose/swagger.yaml +0 -120
  310. package/lib/mongoose/tsconfig.json +0 -40
  311. package/lib/node-postgres/.dockerignore +0 -18
  312. package/lib/node-postgres/.editorconfig +0 -9
  313. package/lib/node-postgres/.env.development.local +0 -20
  314. package/lib/node-postgres/.env.production.local +0 -20
  315. package/lib/node-postgres/.env.test.local +0 -20
  316. package/lib/node-postgres/.eslintignore +0 -1
  317. package/lib/node-postgres/.eslintrc +0 -18
  318. package/lib/node-postgres/.huskyrc +0 -5
  319. package/lib/node-postgres/.lintstagedrc.json +0 -5
  320. package/lib/node-postgres/.prettierrc +0 -8
  321. package/lib/node-postgres/.swcrc +0 -38
  322. package/lib/node-postgres/.vscode/launch.json +0 -35
  323. package/lib/node-postgres/.vscode/settings.json +0 -6
  324. package/lib/node-postgres/Dockerfile.dev +0 -17
  325. package/lib/node-postgres/Dockerfile.prod +0 -17
  326. package/lib/node-postgres/Makefile +0 -46
  327. package/lib/node-postgres/docker-compose.yml +0 -61
  328. package/lib/node-postgres/ecosystem.config.js +0 -57
  329. package/lib/node-postgres/jest.config.js +0 -12
  330. package/lib/node-postgres/nginx.conf +0 -40
  331. package/lib/node-postgres/nodemon.json +0 -12
  332. package/lib/node-postgres/package.json +0 -78
  333. package/lib/node-postgres/src/app.ts +0 -81
  334. package/lib/node-postgres/src/config/index.ts +0 -6
  335. package/lib/node-postgres/src/controllers/auth.controller.ts +0 -44
  336. package/lib/node-postgres/src/controllers/users.controller.ts +0 -63
  337. package/lib/node-postgres/src/database/index.ts +0 -10
  338. package/lib/node-postgres/src/database/init.sql +0 -13
  339. package/lib/node-postgres/src/dtos/users.dto.ts +0 -20
  340. package/lib/node-postgres/src/exceptions/httpException.ts +0 -10
  341. package/lib/node-postgres/src/http/auth.http +0 -27
  342. package/lib/node-postgres/src/http/users.http +0 -34
  343. package/lib/node-postgres/src/interfaces/auth.interface.ts +0 -15
  344. package/lib/node-postgres/src/interfaces/routes.interface.ts +0 -6
  345. package/lib/node-postgres/src/interfaces/users.interface.ts +0 -5
  346. package/lib/node-postgres/src/middlewares/auth.middleware.ts +0 -46
  347. package/lib/node-postgres/src/middlewares/error.middleware.ts +0 -15
  348. package/lib/node-postgres/src/middlewares/validation.middleware.ts +0 -27
  349. package/lib/node-postgres/src/routes/auth.route.ts +0 -21
  350. package/lib/node-postgres/src/routes/users.route.ts +0 -23
  351. package/lib/node-postgres/src/server.ts +0 -10
  352. package/lib/node-postgres/src/services/auth.service.ts +0 -103
  353. package/lib/node-postgres/src/services/users.service.ts +0 -133
  354. package/lib/node-postgres/src/test/auth.test.ts +0 -57
  355. package/lib/node-postgres/src/test/users.test.ts +0 -72
  356. package/lib/node-postgres/src/utils/logger.ts +0 -65
  357. package/lib/node-postgres/src/utils/validateEnv.ts +0 -8
  358. package/lib/node-postgres/swagger.yaml +0 -123
  359. package/lib/node-postgres/tsconfig.json +0 -39
  360. package/lib/prisma/.dockerignore +0 -18
  361. package/lib/prisma/.editorconfig +0 -9
  362. package/lib/prisma/.env.development.local +0 -16
  363. package/lib/prisma/.env.production.local +0 -16
  364. package/lib/prisma/.env.test.local +0 -16
  365. package/lib/prisma/.eslintignore +0 -1
  366. package/lib/prisma/.eslintrc +0 -18
  367. package/lib/prisma/.huskyrc +0 -5
  368. package/lib/prisma/.lintstagedrc.json +0 -5
  369. package/lib/prisma/.prettierrc +0 -8
  370. package/lib/prisma/.vscode/launch.json +0 -35
  371. package/lib/prisma/.vscode/settings.json +0 -6
  372. package/lib/prisma/Dockerfile.dev +0 -19
  373. package/lib/prisma/Dockerfile.prod +0 -19
  374. package/lib/prisma/Makefile +0 -46
  375. package/lib/prisma/docker-compose.yml +0 -51
  376. package/lib/prisma/ecosystem.config.js +0 -57
  377. package/lib/prisma/jest.config.js +0 -12
  378. package/lib/prisma/nginx.conf +0 -40
  379. package/lib/prisma/nodemon.json +0 -12
  380. package/lib/prisma/package.json +0 -84
  381. package/lib/prisma/src/app.ts +0 -81
  382. package/lib/prisma/src/config/index.ts +0 -5
  383. package/lib/prisma/src/controllers/auth.controller.ts +0 -44
  384. package/lib/prisma/src/controllers/users.controller.ts +0 -63
  385. package/lib/prisma/src/dtos/users.dto.ts +0 -20
  386. package/lib/prisma/src/exceptions/HttpException.ts +0 -10
  387. package/lib/prisma/src/http/auth.http +0 -27
  388. package/lib/prisma/src/http/users.http +0 -34
  389. package/lib/prisma/src/interfaces/auth.interface.ts +0 -15
  390. package/lib/prisma/src/interfaces/routes.interface.ts +0 -6
  391. package/lib/prisma/src/interfaces/users.interface.ts +0 -5
  392. package/lib/prisma/src/middlewares/auth.middleware.ts +0 -39
  393. package/lib/prisma/src/middlewares/error.middleware.ts +0 -15
  394. package/lib/prisma/src/middlewares/validation.middleware.ts +0 -27
  395. package/lib/prisma/src/prisma/migrations/20210314081925_initial/migration.sql +0 -9
  396. package/lib/prisma/src/prisma/migrations/migration_lock.toml +0 -3
  397. package/lib/prisma/src/prisma/schema.prisma +0 -17
  398. package/lib/prisma/src/routes/auth.route.ts +0 -22
  399. package/lib/prisma/src/routes/users.route.ts +0 -23
  400. package/lib/prisma/src/server.ts +0 -10
  401. package/lib/prisma/src/services/auth.service.ts +0 -56
  402. package/lib/prisma/src/services/users.service.ts +0 -49
  403. package/lib/prisma/src/test/auth.test.ts +0 -81
  404. package/lib/prisma/src/test/index.test.ts +0 -18
  405. package/lib/prisma/src/test/users.test.ts +0 -134
  406. package/lib/prisma/src/utils/logger.ts +0 -65
  407. package/lib/prisma/src/utils/validateEnv.ts +0 -8
  408. package/lib/prisma/swagger.yaml +0 -123
  409. package/lib/prisma/tsconfig.json +0 -38
  410. package/lib/routing-controllers/.dockerignore +0 -18
  411. package/lib/routing-controllers/.editorconfig +0 -9
  412. package/lib/routing-controllers/.env.development.local +0 -13
  413. package/lib/routing-controllers/.env.production.local +0 -13
  414. package/lib/routing-controllers/.env.test.local +0 -13
  415. package/lib/routing-controllers/.eslintignore +0 -1
  416. package/lib/routing-controllers/.eslintrc +0 -18
  417. package/lib/routing-controllers/.huskyrc +0 -5
  418. package/lib/routing-controllers/.lintstagedrc.json +0 -5
  419. package/lib/routing-controllers/.prettierrc +0 -8
  420. package/lib/routing-controllers/.swcrc +0 -38
  421. package/lib/routing-controllers/.vscode/launch.json +0 -35
  422. package/lib/routing-controllers/.vscode/settings.json +0 -6
  423. package/lib/routing-controllers/Dockerfile.dev +0 -19
  424. package/lib/routing-controllers/Dockerfile.prod +0 -19
  425. package/lib/routing-controllers/Makefile +0 -42
  426. package/lib/routing-controllers/docker-compose.yml +0 -35
  427. package/lib/routing-controllers/ecosystem.config.js +0 -57
  428. package/lib/routing-controllers/jest.config.js +0 -12
  429. package/lib/routing-controllers/nginx.conf +0 -40
  430. package/lib/routing-controllers/nodemon.json +0 -12
  431. package/lib/routing-controllers/package.json +0 -77
  432. package/lib/routing-controllers/src/app.ts +0 -101
  433. package/lib/routing-controllers/src/config/index.ts +0 -5
  434. package/lib/routing-controllers/src/controllers/auth.controller.ts +0 -41
  435. package/lib/routing-controllers/src/controllers/users.controller.ts +0 -51
  436. package/lib/routing-controllers/src/dtos/users.dto.ts +0 -20
  437. package/lib/routing-controllers/src/exceptions/HttpException.ts +0 -12
  438. package/lib/routing-controllers/src/http/auth.http +0 -27
  439. package/lib/routing-controllers/src/http/users.http +0 -34
  440. package/lib/routing-controllers/src/interfaces/auth.interface.ts +0 -15
  441. package/lib/routing-controllers/src/interfaces/users.interface.ts +0 -5
  442. package/lib/routing-controllers/src/middlewares/auth.middleware.ts +0 -38
  443. package/lib/routing-controllers/src/middlewares/error.middleware.ts +0 -15
  444. package/lib/routing-controllers/src/middlewares/validation.middleware.ts +0 -27
  445. package/lib/routing-controllers/src/models/users.model.ts +0 -9
  446. package/lib/routing-controllers/src/server.ts +0 -9
  447. package/lib/routing-controllers/src/services/auth.service.ts +0 -53
  448. package/lib/routing-controllers/src/services/users.service.ts +0 -52
  449. package/lib/routing-controllers/src/test/auth.test.ts +0 -49
  450. package/lib/routing-controllers/src/test/users.test.ts +0 -65
  451. package/lib/routing-controllers/src/utils/logger.ts +0 -65
  452. package/lib/routing-controllers/src/utils/validateEnv.ts +0 -8
  453. package/lib/routing-controllers/tsconfig.json +0 -38
  454. package/lib/sequelize/.dockerignore +0 -18
  455. package/lib/sequelize/.editorconfig +0 -9
  456. package/lib/sequelize/.env.development.local +0 -20
  457. package/lib/sequelize/.env.production.local +0 -20
  458. package/lib/sequelize/.env.test.local +0 -20
  459. package/lib/sequelize/.eslintignore +0 -1
  460. package/lib/sequelize/.eslintrc +0 -18
  461. package/lib/sequelize/.huskyrc +0 -5
  462. package/lib/sequelize/.lintstagedrc.json +0 -5
  463. package/lib/sequelize/.prettierrc +0 -8
  464. package/lib/sequelize/.sequelizerc +0 -8
  465. package/lib/sequelize/.swcrc +0 -40
  466. package/lib/sequelize/.vscode/launch.json +0 -35
  467. package/lib/sequelize/.vscode/settings.json +0 -6
  468. package/lib/sequelize/Dockerfile.dev +0 -23
  469. package/lib/sequelize/Dockerfile.prod +0 -23
  470. package/lib/sequelize/Makefile +0 -46
  471. package/lib/sequelize/docker-compose.yml +0 -55
  472. package/lib/sequelize/docker-entrypoint.sh +0 -5
  473. package/lib/sequelize/ecosystem.config.js +0 -57
  474. package/lib/sequelize/jest.config.js +0 -12
  475. package/lib/sequelize/nginx.conf +0 -40
  476. package/lib/sequelize/nodemon.json +0 -12
  477. package/lib/sequelize/package.json +0 -82
  478. package/lib/sequelize/src/app.ts +0 -87
  479. package/lib/sequelize/src/config/index.ts +0 -6
  480. package/lib/sequelize/src/config/sequelize-cli.js +0 -15
  481. package/lib/sequelize/src/controllers/auth.controller.ts +0 -45
  482. package/lib/sequelize/src/controllers/users.controller.ts +0 -64
  483. package/lib/sequelize/src/database/index.ts +0 -34
  484. package/lib/sequelize/src/database/migrations/.gitkeep +0 -0
  485. package/lib/sequelize/src/database/seeders/.gitkeep +0 -0
  486. package/lib/sequelize/src/dtos/users.dto.ts +0 -20
  487. package/lib/sequelize/src/exceptions/HttpException.ts +0 -10
  488. package/lib/sequelize/src/http/auth.http +0 -27
  489. package/lib/sequelize/src/http/users.http +0 -34
  490. package/lib/sequelize/src/interfaces/auth.interface.ts +0 -15
  491. package/lib/sequelize/src/interfaces/routes.interface.ts +0 -6
  492. package/lib/sequelize/src/interfaces/users.interface.ts +0 -5
  493. package/lib/sequelize/src/middlewares/auth.middleware.ts +0 -38
  494. package/lib/sequelize/src/middlewares/error.middleware.ts +0 -15
  495. package/lib/sequelize/src/middlewares/validation.middleware.ts +0 -27
  496. package/lib/sequelize/src/models/users.model.ts +0 -39
  497. package/lib/sequelize/src/routes/auth.route.ts +0 -21
  498. package/lib/sequelize/src/routes/users.route.ts +0 -23
  499. package/lib/sequelize/src/server.ts +0 -10
  500. package/lib/sequelize/src/services/auth.service.ts +0 -52
  501. package/lib/sequelize/src/services/users.service.ts +0 -50
  502. package/lib/sequelize/src/test/auth.test.ts +0 -71
  503. package/lib/sequelize/src/test/users.test.ts +0 -131
  504. package/lib/sequelize/src/utils/logger.ts +0 -65
  505. package/lib/sequelize/src/utils/validateEnv.ts +0 -8
  506. package/lib/sequelize/swagger.yaml +0 -123
  507. package/lib/sequelize/tsconfig.json +0 -40
  508. package/lib/starter.js +0 -262
  509. package/lib/typegoose/.dockerignore +0 -18
  510. package/lib/typegoose/.editorconfig +0 -9
  511. package/lib/typegoose/.env.development.local +0 -18
  512. package/lib/typegoose/.env.production.local +0 -18
  513. package/lib/typegoose/.env.test.local +0 -18
  514. package/lib/typegoose/.eslintignore +0 -1
  515. package/lib/typegoose/.eslintrc +0 -18
  516. package/lib/typegoose/.huskyrc +0 -5
  517. package/lib/typegoose/.lintstagedrc.json +0 -5
  518. package/lib/typegoose/.prettierrc +0 -8
  519. package/lib/typegoose/.swcrc +0 -40
  520. package/lib/typegoose/.vscode/launch.json +0 -35
  521. package/lib/typegoose/.vscode/settings.json +0 -6
  522. package/lib/typegoose/Dockerfile.dev +0 -19
  523. package/lib/typegoose/Dockerfile.prod +0 -19
  524. package/lib/typegoose/Makefile +0 -46
  525. package/lib/typegoose/docker-compose.yml +0 -55
  526. package/lib/typegoose/ecosystem.config.js +0 -57
  527. package/lib/typegoose/jest.config.js +0 -12
  528. package/lib/typegoose/nginx.conf +0 -40
  529. package/lib/typegoose/nodemon.json +0 -12
  530. package/lib/typegoose/package.json +0 -79
  531. package/lib/typegoose/src/app.ts +0 -90
  532. package/lib/typegoose/src/config/index.ts +0 -6
  533. package/lib/typegoose/src/controllers/auth.controller.ts +0 -44
  534. package/lib/typegoose/src/controllers/users.controller.ts +0 -63
  535. package/lib/typegoose/src/database/index.ts +0 -18
  536. package/lib/typegoose/src/dtos/users.dto.ts +0 -20
  537. package/lib/typegoose/src/exceptions/HttpException.ts +0 -10
  538. package/lib/typegoose/src/http/auth.http +0 -27
  539. package/lib/typegoose/src/http/users.http +0 -34
  540. package/lib/typegoose/src/interfaces/auth.interface.ts +0 -15
  541. package/lib/typegoose/src/interfaces/routes.interface.ts +0 -6
  542. package/lib/typegoose/src/interfaces/users.interface.ts +0 -5
  543. package/lib/typegoose/src/middlewares/auth.middleware.ts +0 -38
  544. package/lib/typegoose/src/middlewares/error.middleware.ts +0 -15
  545. package/lib/typegoose/src/middlewares/validation.middleware.ts +0 -27
  546. package/lib/typegoose/src/models/users.model.ts +0 -16
  547. package/lib/typegoose/src/routes/auth.route.ts +0 -21
  548. package/lib/typegoose/src/routes/users.route.ts +0 -23
  549. package/lib/typegoose/src/server.ts +0 -10
  550. package/lib/typegoose/src/services/auth.service.ts +0 -52
  551. package/lib/typegoose/src/services/users.service.ts +0 -55
  552. package/lib/typegoose/src/test/auth.test.ts +0 -83
  553. package/lib/typegoose/src/test/users.test.ts +0 -133
  554. package/lib/typegoose/src/utils/logger.ts +0 -65
  555. package/lib/typegoose/src/utils/validateEnv.ts +0 -8
  556. package/lib/typegoose/swagger.yaml +0 -120
  557. package/lib/typegoose/tsconfig.json +0 -40
  558. package/lib/typeorm/.dockerignore +0 -18
  559. package/lib/typeorm/.editorconfig +0 -9
  560. package/lib/typeorm/.env.development.local +0 -20
  561. package/lib/typeorm/.env.production.local +0 -20
  562. package/lib/typeorm/.env.test.local +0 -20
  563. package/lib/typeorm/.eslintignore +0 -1
  564. package/lib/typeorm/.eslintrc +0 -18
  565. package/lib/typeorm/.huskyrc +0 -5
  566. package/lib/typeorm/.lintstagedrc.json +0 -5
  567. package/lib/typeorm/.prettierrc +0 -8
  568. package/lib/typeorm/.swcrc +0 -40
  569. package/lib/typeorm/.vscode/launch.json +0 -35
  570. package/lib/typeorm/.vscode/settings.json +0 -6
  571. package/lib/typeorm/Dockerfile.dev +0 -19
  572. package/lib/typeorm/Dockerfile.prod +0 -19
  573. package/lib/typeorm/Makefile +0 -46
  574. package/lib/typeorm/docker-compose.yml +0 -57
  575. package/lib/typeorm/ecosystem.config.js +0 -57
  576. package/lib/typeorm/jest.config.js +0 -12
  577. package/lib/typeorm/nginx.conf +0 -40
  578. package/lib/typeorm/nodemon.json +0 -12
  579. package/lib/typeorm/package.json +0 -78
  580. package/lib/typeorm/src/app.ts +0 -87
  581. package/lib/typeorm/src/config/index.ts +0 -6
  582. package/lib/typeorm/src/controllers/auth.controller.ts +0 -44
  583. package/lib/typeorm/src/controllers/users.controller.ts +0 -63
  584. package/lib/typeorm/src/database/index.ts +0 -26
  585. package/lib/typeorm/src/database/migrations/.gitkeep +0 -0
  586. package/lib/typeorm/src/dtos/users.dto.ts +0 -20
  587. package/lib/typeorm/src/entities/users.entity.ts +0 -26
  588. package/lib/typeorm/src/exceptions/HttpException.ts +0 -10
  589. package/lib/typeorm/src/http/auth.http +0 -27
  590. package/lib/typeorm/src/http/users.http +0 -34
  591. package/lib/typeorm/src/interfaces/auth.interface.ts +0 -15
  592. package/lib/typeorm/src/interfaces/routes.interface.ts +0 -6
  593. package/lib/typeorm/src/interfaces/users.interface.ts +0 -5
  594. package/lib/typeorm/src/middlewares/auth.middleware.ts +0 -38
  595. package/lib/typeorm/src/middlewares/error.middleware.ts +0 -15
  596. package/lib/typeorm/src/middlewares/validation.middleware.ts +0 -27
  597. package/lib/typeorm/src/routes/auth.route.ts +0 -21
  598. package/lib/typeorm/src/routes/users.route.ts +0 -23
  599. package/lib/typeorm/src/server.ts +0 -10
  600. package/lib/typeorm/src/services/auth.service.ts +0 -54
  601. package/lib/typeorm/src/services/users.service.ts +0 -51
  602. package/lib/typeorm/src/test/auth.test.ts +0 -75
  603. package/lib/typeorm/src/test/users.test.ts +0 -136
  604. package/lib/typeorm/src/utils/logger.ts +0 -65
  605. package/lib/typeorm/src/utils/validateEnv.ts +0 -8
  606. package/lib/typeorm/swagger.yaml +0 -123
  607. /package/{lib → templates}/default/src/interfaces/routes.interface.ts +0 -0
package/bin/starter.js ADDED
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*****************************************************************
4
+ * TYPESCRIPT-EXPRESS-STARTER - Quick and Easy TypeScript Express Starter
5
+ * (c) 2020-present AGUMON (https://github.com/ljlm0402/typescript-express-starter)
6
+ *
7
+ * MIT License
8
+ *
9
+ * Made with ❤️ by AGUMON 🦖
10
+ *****************************************************************/
11
+
12
+ import { select, text, isCancel, intro, outro, cancel, note, confirm } from '@clack/prompts';
13
+ import chalk from 'chalk';
14
+ import editJsonFile from 'edit-json-file';
15
+ import { execa } from 'execa';
16
+ import fs from 'fs-extra';
17
+ import ora from 'ora';
18
+ import path from 'path';
19
+
20
+ // Config and constants
21
+ import { CONFIG, getEnvironmentConfig } from './config.js';
22
+ import { PACKAGE_MANAGER, TEMPLATES_VALUES, DEVTOOLS_VALUES } from './common.js';
23
+
24
+ // Database configuration
25
+ import { TEMPLATE_DB, generateDockerCompose } from './db-map.js';
26
+
27
+ // Error handling
28
+ import { CLIError, NetworkError, FileSystemError, printError } from './errors.js';
29
+
30
+ // Validation utilities
31
+ import {
32
+ validateProjectName,
33
+ validateProjectPath,
34
+ sanitizeInput,
35
+ validateNodeVersion,
36
+ } from './validators.js';
37
+
38
+ // Performance optimizations
39
+ import { versionCache, PackageBatch } from './performance.js';
40
+
41
+ // AST utilities
42
+ import { injectSwaggerIntoApp } from './ast-utils.js';
43
+
44
+ // ========== [공통 함수들] ==========
45
+
46
+ // 최신 CLI 버전 체크 & 선택적 설치
47
+ async function checkForUpdate() {
48
+ try {
49
+ const pkgPath = path.resolve(process.cwd(), 'package.json');
50
+ const localPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
51
+ const pkgName = localPkg.name || 'typescript-express-stater';
52
+ const localVersion = localPkg.version || '0.0.0';
53
+
54
+ const latest = await versionCache.getLatestVersion(pkgName);
55
+ if (latest > localVersion) {
56
+ console.log(
57
+ chalk.yellow(`🔔 New version available: ${latest} (You are on ${localVersion})`),
58
+ );
59
+ const shouldUpdate = await confirm({
60
+ message: `Do you want to update ${pkgName} to version ${latest}?`,
61
+ initial: true,
62
+ });
63
+ if (shouldUpdate) {
64
+ console.log(chalk.gray(` Updating to latest version...`));
65
+ try {
66
+ await execa('npm', ['install', '-g', `${pkgName}@${latest}`], { stdio: 'inherit' });
67
+ console.log(chalk.green(` ✓ Updated ${pkgName} to ${latest}`));
68
+ } catch (err) {
69
+ printError(new NetworkError(`Failed to update ${pkgName}`, 'update', err.message));
70
+ }
71
+ } else {
72
+ console.log(chalk.gray('Skipped updating.'));
73
+ }
74
+ }
75
+ } catch (err) {
76
+ printError(new NetworkError('Failed to check latest version', 'version-check', err.message));
77
+ }
78
+ }
79
+
80
+ // 패키지매니저 글로벌 설치여부
81
+ async function checkPkgManagerInstalled(pm) {
82
+ try {
83
+ await execa(pm, ['--version']);
84
+ return true;
85
+ } catch {
86
+ return false;
87
+ }
88
+ }
89
+
90
+ // 도구 간 의존성 자동 해결
91
+ function resolveDependencies(selected) {
92
+ const all = new Set(selected);
93
+ let changed = true;
94
+ while (changed) {
95
+ changed = false;
96
+ for (const tool of DEVTOOLS_VALUES) {
97
+ if (all.has(tool.value) && tool.requires) {
98
+ for (const req of tool.requires) {
99
+ if (!all.has(req)) {
100
+ all.add(req);
101
+ changed = true;
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ return Array.from(all);
108
+ }
109
+
110
+ // 파일 복사
111
+ async function copyDevtoolFiles(devtool, destDir) {
112
+ for (const file of devtool.files) {
113
+ const src = path.join(CONFIG.paths.devtools, devtool.value, file);
114
+ const dst = path.join(destDir, file);
115
+ if (await fs.pathExists(src)) {
116
+ await fs.copy(src, dst, { overwrite: true });
117
+ console.log(chalk.gray(` ⎯ ${file} copied.`));
118
+ }
119
+ }
120
+ }
121
+
122
+ // 패키지 설치 (성능 최적화된 배치 처리 사용)
123
+ async function installPackages(pkgs, pkgManager, dev = true, destDir = process.cwd()) {
124
+ if (!pkgs || pkgs.length === 0) return;
125
+
126
+ const batch = new PackageBatch();
127
+ batch.addMany(pkgs);
128
+ const resolved = await batch.resolve();
129
+
130
+ const installCmd =
131
+ pkgManager === 'npm'
132
+ ? ['install', dev ? '--save-dev' : '', ...resolved].filter(Boolean)
133
+ : pkgManager === 'yarn'
134
+ ? ['add', dev ? '--dev' : '', ...resolved].filter(Boolean)
135
+ : ['add', dev ? '-D' : '', ...resolved].filter(Boolean);
136
+
137
+ await execa(pkgManager, installCmd, { cwd: destDir, stdio: 'inherit' });
138
+ }
139
+
140
+ // package.json 수정 (스크립트 추가 등)
141
+ async function updatePackageJson(scripts, destDir) {
142
+ const pkgPath = path.join(destDir, 'package.json');
143
+ const file = editJsonFile(pkgPath, { autosave: true });
144
+ Object.entries(scripts).forEach(([k, v]) => file.set(`scripts.${k}`, v));
145
+ if (!file.get('scripts.prepare') && fs.existsSync(path.join(destDir, '.huskyrc'))) {
146
+ file.set('scripts.prepare', 'husky install');
147
+ }
148
+ file.save();
149
+ }
150
+
151
+ // docker-compose 생성
152
+ async function generateCompose(template, destDir) {
153
+ try {
154
+ const composeYml = generateDockerCompose(template);
155
+ const filePath = path.join(destDir, 'docker-compose.yml');
156
+ await fs.writeFile(filePath, composeYml, 'utf8');
157
+
158
+ const dbType = TEMPLATE_DB[template];
159
+ console.log(chalk.gray(` ⎯ docker-compose.yml generated with ${dbType || 'no database'}`));
160
+ return dbType;
161
+ } catch (error) {
162
+ console.log(chalk.yellow(`[docker-compose] Warning: ${error.message}`));
163
+ return null;
164
+ }
165
+ }
166
+
167
+ // Git init & 첫 커밋
168
+ async function gitInitAndFirstCommit(destDir) {
169
+ const doGit = await confirm({ message: 'Initialize git and make first commit?', initial: true });
170
+ if (!doGit) return;
171
+ try {
172
+ await execa('git', ['init'], { cwd: destDir });
173
+ await execa('git', ['add', '.'], { cwd: destDir });
174
+ await execa('git', ['commit', '-m', 'init'], { cwd: destDir });
175
+ console.log(chalk.green(' ✓ git initialized and first commit made!'));
176
+ } catch (e) {
177
+ printError(
178
+ new CLIError('git init/commit failed', 'git', 'Check git is installed and accessible.'),
179
+ );
180
+ }
181
+ }
182
+
183
+ // ========== [메인 CLI 실행 흐름] ==========
184
+ async function main() {
185
+ // 1. Node 버전 체크
186
+ validateNodeVersion(CONFIG.minNodeVersion);
187
+
188
+ // 2. CLI 최신버전 안내
189
+ await checkForUpdate();
190
+
191
+ const config = getEnvironmentConfig();
192
+ intro(config.banner.gradient);
193
+
194
+ // 3. 패키지 매니저 선택 + 글로벌 설치 확인
195
+ let pkgManager;
196
+ while (true) {
197
+ pkgManager = await select({
198
+ message: 'Which package manager do you want to use?',
199
+ options: PACKAGE_MANAGER,
200
+ initialValue: 'npm',
201
+ });
202
+ if (isCancel(pkgManager)) return cancel('❌ Aborted.');
203
+ if (await checkPkgManagerInstalled(pkgManager)) break;
204
+ printError(`${pkgManager} is not installed globally! Please install it first.`);
205
+ }
206
+ note(`Using: ${pkgManager}`);
207
+
208
+ // 4. 템플릿 선택
209
+ const templateDirs = (await fs.readdir(CONFIG.paths.templates)).filter((f) =>
210
+ fs.statSync(path.join(CONFIG.paths.templates, f)).isDirectory(),
211
+ );
212
+ if (templateDirs.length === 0)
213
+ return printError(new CLIError('No templates found!', 'template-selection'));
214
+
215
+ const options = TEMPLATES_VALUES.filter((t) => t.active && templateDirs.includes(t.value)).map(
216
+ (t) => ({
217
+ label: t.name, // UI에 표시될 이름
218
+ value: t.value, // 선택 값
219
+ hint: t.desc, // 오른쪽에 표시될 설명
220
+ }),
221
+ );
222
+
223
+ const template = await select({
224
+ message: 'Choose a template:',
225
+ options: options,
226
+ initialValue: 'default',
227
+ });
228
+ if (isCancel(template)) return cancel('❌ Aborted.');
229
+
230
+ // 5. 프로젝트명 입력 (중복체크/덮어쓰기)
231
+ let projectName, destDir;
232
+ while (true) {
233
+ const rawProjectName = await text({
234
+ message: 'Enter your project name:',
235
+ initial: CONFIG.defaultProjectName,
236
+ validate: (val) => {
237
+ try {
238
+ validateProjectName(val);
239
+ return undefined;
240
+ } catch (error) {
241
+ return error.message;
242
+ }
243
+ },
244
+ });
245
+ if (isCancel(rawProjectName)) return cancel('❌ Aborted.');
246
+
247
+ projectName = sanitizeInput(rawProjectName);
248
+ destDir = validateProjectPath(path.resolve(process.cwd(), projectName));
249
+
250
+ if (await fs.pathExists(destDir)) {
251
+ const overwrite = await confirm({
252
+ message: `Directory "${projectName}" already exists. Overwrite?`,
253
+ });
254
+ if (overwrite) break;
255
+ } else break;
256
+ }
257
+
258
+ // 6. 개발 도구 옵션 선택 (category 기준으로 그룹화)
259
+ const groupedDevtools = DEVTOOLS_VALUES.reduce((acc, tool) => {
260
+ const cat = tool.category || 'Others';
261
+ if (!acc[cat]) acc[cat] = [];
262
+ acc[cat].push(tool);
263
+ return acc;
264
+ }, {});
265
+
266
+ // 6-1. 개발 도구 옵션 선택 (category별 하나씩만 선택하는 방식)
267
+ let devtoolValues = [];
268
+ for (const [category, tools] of Object.entries(groupedDevtools)) {
269
+ const picked = await select({
270
+ message: `Select a tool for "${category}":`,
271
+ options: [
272
+ { label: 'None', value: null },
273
+ ...tools.map(({ name, value, desc }) => ({
274
+ label: `${name} (${desc})`,
275
+ value,
276
+ })),
277
+ ],
278
+ initialValue: null,
279
+ });
280
+ if (isCancel(picked)) return cancel('❌ Aborted.');
281
+ if (picked) devtoolValues.push(picked);
282
+ }
283
+ devtoolValues = resolveDependencies(devtoolValues);
284
+
285
+ // === [진행] ===
286
+
287
+ // [1] 템플릿 복사
288
+ const spinner = ora('Copying template...').start();
289
+ try {
290
+ await fs.copy(path.join(CONFIG.paths.templates, template), destDir, { overwrite: true });
291
+ spinner.succeed('Template copied!');
292
+ } catch (e) {
293
+ spinner.fail('Template copy failed!');
294
+ printError(new FileSystemError(e.message, destDir, 'Check templates folder and permissions.'));
295
+ return process.exit(1);
296
+ }
297
+
298
+ // [1-1] Testing 도구를 선택한 경우에만 /src/test 예제 복사
299
+ const testDevtool = devtoolValues
300
+ .map((val) => DEVTOOLS_VALUES.find((d) => d.value === val))
301
+ .find((tool) => tool && tool.category === 'Testing');
302
+
303
+ if (testDevtool) {
304
+ const devtoolTestDir = path.join(CONFIG.paths.devtools, testDevtool.value, 'src', 'test');
305
+ const projectTestDir = path.join(destDir, 'src', 'test');
306
+ if (await fs.pathExists(devtoolTestDir)) {
307
+ await fs.copy(devtoolTestDir, projectTestDir, { overwrite: true });
308
+ console.log(chalk.gray(` ⎯ test files for ${testDevtool.name} copied.`));
309
+ }
310
+ }
311
+
312
+ // [2] 개발 도구 파일/패키지/스크립트/코드패치
313
+ for (const val of devtoolValues) {
314
+ const tool = DEVTOOLS_VALUES.find((d) => d.value === val);
315
+ if (!tool) continue;
316
+
317
+ spinner.start(`Setting up ${tool.name}...`);
318
+ await copyDevtoolFiles(tool, destDir);
319
+
320
+ // [2-1] 개발 도구 - 패키지 설치
321
+ if (tool.pkgs?.length > 0) await installPackages(tool.pkgs, pkgManager, false, destDir);
322
+ if (tool.devPkgs?.length > 0) await installPackages(tool.devPkgs, pkgManager, true, destDir);
323
+
324
+ // [2-2] 개발 도구 - 스크립트 추가 등
325
+ if (Object.keys(tool.scripts).length) await updatePackageJson(tool.scripts, destDir);
326
+
327
+ // [2-3] 개발 도구 - Docker 선택 한 경우, docker-compose.yml 생성
328
+ if (tool.value === 'docker') await generateCompose(template, destDir);
329
+
330
+ // [2-4] 개발 도구 - Swagger 선택 시에만 app.ts AST 패치
331
+ if (tool.value === 'swagger') {
332
+ await injectSwaggerIntoApp(destDir);
333
+ }
334
+
335
+ spinner.succeed(`${tool.name} setup done.`);
336
+ }
337
+
338
+ // [3] 템플릿 기본 패키지 설치
339
+ spinner.start(`Installing base dependencies with ${pkgManager}...`);
340
+ await execa(pkgManager, ['install'], { cwd: destDir, stdio: 'inherit' });
341
+ spinner.succeed('📦 Base dependencies installed!');
342
+
343
+ // [4] git 첫 커밋 옵션
344
+ await gitInitAndFirstCommit(destDir);
345
+
346
+ outro(chalk.greenBright('\n🎉 Project setup complete!\n'));
347
+ console.log(chalk.cyan(` $ cd ${projectName}`));
348
+ console.log(chalk.cyan(` $ ${pkgManager} run dev\n`));
349
+ console.log(chalk.gray('✨ Happy hacking!\n'));
350
+ }
351
+
352
+ main().catch((err) => {
353
+ if (err instanceof CLIError) {
354
+ printError(err);
355
+ } else {
356
+ printError(new CLIError('Unexpected error', null, err.message));
357
+ }
358
+ process.exit(err.code || 1);
359
+ });
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Validation utilities for user inputs and security
3
+ */
4
+
5
+ import path from 'path';
6
+ import { CONFIG } from './config.js';
7
+ import { ValidationError } from './errors.js';
8
+
9
+ /**
10
+ * Validate project name
11
+ */
12
+ export function validateProjectName(name) {
13
+ if (!name || typeof name !== 'string') {
14
+ throw new ValidationError('Project name is required', 'projectName');
15
+ }
16
+
17
+ if (name.length > CONFIG.maxProjectNameLength) {
18
+ throw new ValidationError(
19
+ `Project name must be less than ${CONFIG.maxProjectNameLength} characters`,
20
+ 'projectName',
21
+ 'Use a shorter, descriptive name',
22
+ );
23
+ }
24
+
25
+ if (!CONFIG.validation.projectName.test(name)) {
26
+ throw new ValidationError(
27
+ 'Project name can only contain letters, numbers, hyphens, and underscores',
28
+ 'projectName',
29
+ 'Use alphanumeric characters with hyphens or underscores',
30
+ );
31
+ }
32
+
33
+ // Check for reserved names
34
+ const reservedNames = ['node_modules', 'package.json', 'src', 'dist', 'build'];
35
+ if (reservedNames.includes(name.toLowerCase())) {
36
+ throw new ValidationError(
37
+ `"${name}" is a reserved name and cannot be used`,
38
+ 'projectName',
39
+ 'Choose a different project name',
40
+ );
41
+ }
42
+
43
+ return name;
44
+ }
45
+
46
+ /**
47
+ * Validate and resolve project path
48
+ */
49
+ export function validateProjectPath(projectPath) {
50
+ if (!projectPath || typeof projectPath !== 'string') {
51
+ throw new ValidationError('Project path is required', 'projectPath');
52
+ }
53
+
54
+ const resolved = path.resolve(projectPath);
55
+ const cwd = process.cwd();
56
+
57
+ // Prevent path traversal attacks
58
+ if (!resolved.startsWith(cwd)) {
59
+ throw new ValidationError(
60
+ 'Project path must be within current directory',
61
+ 'projectPath',
62
+ 'Use a relative path or absolute path within current directory',
63
+ );
64
+ }
65
+
66
+ // Check for dangerous paths (시스템 루트 디렉토리만 제한)
67
+ const dangerousPaths = ['/etc', '/usr', '/var', '/tmp'];
68
+ if (dangerousPaths.some((dangerous) => resolved.startsWith(dangerous))) {
69
+ throw new ValidationError(
70
+ 'Cannot create project in system directories',
71
+ 'projectPath',
72
+ 'Choose a safe location within your workspace',
73
+ );
74
+ }
75
+
76
+ return resolved;
77
+ }
78
+
79
+ /**
80
+ * Check if package specifier is explicit (URL, file, etc.)
81
+ */
82
+ export function isExplicitSpecifier(spec) {
83
+ const explicitPrefixes = ['http://', 'https://', 'git+', 'file:', 'link:', 'workspace:', 'npm:'];
84
+
85
+ return explicitPrefixes.some((prefix) => spec.startsWith(prefix));
86
+ }
87
+
88
+ /**
89
+ * Split package name and version from specifier
90
+ */
91
+ export function splitNameAndVersion(spec) {
92
+ if (isExplicitSpecifier(spec)) {
93
+ return { name: spec, version: null };
94
+ }
95
+
96
+ if (spec.startsWith('@')) {
97
+ // Scoped package: @scope/package@version
98
+ const idx = spec.indexOf('@', 1);
99
+ if (idx === -1) {
100
+ return { name: spec, version: null };
101
+ }
102
+ return {
103
+ name: spec.slice(0, idx),
104
+ version: spec.slice(idx + 1),
105
+ };
106
+ } else {
107
+ // Regular package: package@version
108
+ const idx = spec.indexOf('@');
109
+ if (idx === -1) {
110
+ return { name: spec, version: null };
111
+ }
112
+ return {
113
+ name: spec.slice(0, idx),
114
+ version: spec.slice(idx + 1),
115
+ };
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Sanitize user input
121
+ */
122
+ export function sanitizeInput(input) {
123
+ if (typeof input !== 'string') {
124
+ return input;
125
+ }
126
+
127
+ // Remove potentially dangerous characters
128
+ return input.replace(/[<>:"|?*]/g, '').trim();
129
+ }
130
+
131
+ /**
132
+ * Validate Node.js version
133
+ */
134
+ export function validateNodeVersion(required = CONFIG.minNodeVersion) {
135
+ const current = parseInt(process.versions.node.split('.')[0], 10);
136
+
137
+ if (current < required) {
138
+ throw new ValidationError(
139
+ `Node.js ${required}+ required. You have ${process.versions.node}`,
140
+ 'nodeVersion',
141
+ `Please upgrade your Node.js to version ${required} or higher`,
142
+ );
143
+ }
144
+
145
+ return current;
146
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/1.0.0/schema.json",
3
+ "files": {
4
+ "ignore": [
5
+ "node_modules/**",
6
+ "dist/**",
7
+ "build/**"
8
+ ]
9
+ },
10
+ "formatter": {
11
+ "enabled": false,
12
+ "indentStyle": "space",
13
+ "indentWidth": 2,
14
+ "lineWidth": 150,
15
+ "quoteStyle": "single",
16
+ "trailingComma": "all",
17
+ "semiColon": true,
18
+ "arrowParentheses": "avoid"
19
+ },
20
+ "linter": {
21
+ "enabled": false,
22
+ "rules": {
23
+ "recommended": true,
24
+ "style/noExplicitAny": "off",
25
+ "style/noNonNullAssertion": "off",
26
+ "suspicious/noExplicitAny": "off",
27
+ "style/noVar": "off",
28
+ "complexity/useArrowFunctions": "off"
29
+ }
30
+ },
31
+ "organizeImports": {
32
+ "enabled": false
33
+ }
34
+ }
@@ -0,0 +1,29 @@
1
+ # node_modules and build outputs
2
+ node_modules/
3
+ dist/
4
+ build/
5
+ coverage/
6
+ .tmp/
7
+ .temp/
8
+
9
+ # 환경설정 및 로그
10
+ .env
11
+ .env.*
12
+ *.log
13
+
14
+ # TypeScript compiled output
15
+ *.js
16
+ *.d.ts
17
+ *.map
18
+
19
+ # OS, IDE/Editor 관련
20
+ .DS_Store
21
+ .vscode/
22
+ .idea/
23
+ *.swp
24
+
25
+ # 기타 무시할 파일/폴더
26
+ npm-debug.log*
27
+ yarn-debug.log*
28
+ yarn-error.log*
29
+ .pnpm-debug.log*
@@ -0,0 +1,27 @@
1
+ # 빌드 불필요/민감 파일 차단
2
+ node_modules/
3
+ dist/
4
+ .vscode/
5
+ logs/
6
+ coverage/
7
+
8
+ # 환경설정/시크릿/포매터
9
+ .env
10
+ .env.*
11
+ .eslintrc*
12
+ .eslintignore
13
+ .editorconfig
14
+ .prettierrc*
15
+ .huskyrc
16
+ .lintstagedrc*
17
+ jest.config.js
18
+
19
+ # 도커 파일 자체
20
+ Dockerfile
21
+ docker-compose.yml
22
+
23
+ # 시스템
24
+ .DS_Store
25
+ Thumbs.db
26
+ npm-debug.log*
27
+ yarn-error.log*
@@ -0,0 +1,20 @@
1
+ # 베이스 이미지
2
+ FROM node:20-alpine
3
+
4
+ # 작업 디렉토리 생성
5
+ WORKDIR /app
6
+
7
+ # 패키지 설치(캐시 활용)
8
+ COPY package.json pnpm-lock.yaml* yarn.lock* package-lock.json* ./
9
+ RUN if [ -f yarn.lock ]; then yarn install; \
10
+ elif [ -f pnpm-lock.yaml ]; then corepack enable && pnpm install; \
11
+ else npm install; fi
12
+
13
+ # 전체 코드 복사 (단, node_modules는 제외됨)
14
+ COPY . .
15
+
16
+ # 개발용 포트 (예: 3000)
17
+ EXPOSE 3000
18
+
19
+ # 개발용 명령어: nodemon, ts-node-dev 등
20
+ CMD [ "npm", "run", "dev"]
@@ -0,0 +1,35 @@
1
+ # 1. Build Stage
2
+ FROM node:20-alpine AS builder
3
+
4
+ WORKDIR /app
5
+
6
+ COPY package.json pnpm-lock.yaml* yarn.lock* package-lock.json* ./
7
+ RUN if [ -f yarn.lock ]; then yarn install --production=false; \
8
+ elif [ -f pnpm-lock.yaml ]; then corepack enable && pnpm install --prod=false; \
9
+ else npm install --production=false; fi
10
+
11
+ COPY . .
12
+
13
+ # TypeScript 빌드
14
+ RUN npx tsc
15
+
16
+ # 2. Run Stage (더 가벼운 이미지 사용 가능)
17
+ FROM node:20-alpine
18
+
19
+ WORKDIR /app
20
+
21
+ # 의존성(production only)
22
+ COPY package.json pnpm-lock.yaml* yarn.lock* package-lock.json* ./
23
+ RUN if [ -f yarn.lock ]; then yarn install --production=true --frozen-lockfile; \
24
+ elif [ -f pnpm-lock.yaml ]; then corepack enable && pnpm install --prod --frozen-lockfile; \
25
+ else npm install --production --frozen-lockfile; fi
26
+
27
+ # 빌드된 코드만 복사 (node_modules, dist)
28
+ COPY --from=builder /app/dist ./dist
29
+
30
+ # 환경설정 등 추가 복사 (필요시)
31
+ # COPY .env ./
32
+
33
+ EXPOSE 3000
34
+
35
+ CMD [ "npm", "start" ]
@@ -40,3 +40,6 @@ clean: ## Clean the images
40
40
 
41
41
  remove: ## Remove the volumes
42
42
  docker volume rm -f ${APP_NAME}
43
+
44
+ logs: ## Show container logs
45
+ docker logs -f ${APP_NAME}