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.
- package/README.kr.md +136 -287
- package/README.md +134 -274
- package/bin/ast-utils.js +226 -0
- package/bin/common.js +312 -0
- package/bin/config.js +80 -0
- package/bin/db-map.js +169 -0
- package/bin/errors.js +129 -0
- package/bin/performance.js +203 -0
- package/bin/starter.js +359 -0
- package/bin/validators.js +146 -0
- package/devtools/biome/.biome.json +34 -0
- package/devtools/biome/.biomeignore +29 -0
- package/devtools/docker/.dockerignore +27 -0
- package/devtools/docker/Dockerfile.dev +20 -0
- package/devtools/docker/Dockerfile.prod +35 -0
- package/{lib/default → devtools/docker}/Makefile +3 -0
- package/devtools/docker/nginx.conf +67 -0
- package/devtools/eslint/eslint.config.cjs +23 -0
- package/devtools/husky/.husky/commit-msg +4 -0
- package/devtools/husky/.husky/pre-commit +4 -0
- package/devtools/husky/.husky/pre-push +4 -0
- package/devtools/jest/jest.config.cjs +2 -0
- package/devtools/jest/jest.config.ts +25 -0
- package/devtools/jest/src/test/e2e/auth.e2e.spec.ts +40 -0
- package/devtools/jest/src/test/e2e/users.e2e.spec.ts +63 -0
- package/devtools/jest/src/test/setup.ts +31 -0
- package/devtools/jest/src/test/unit/entities/user.entity.spec.ts +279 -0
- package/devtools/jest/src/test/unit/services/auth.service.spec.ts +75 -0
- package/devtools/jest/src/test/unit/services/users.service.spec.ts +109 -0
- package/devtools/oxlint/.oxlintrc.json +57 -0
- package/devtools/pm2/ecosystem.config.js +59 -0
- package/devtools/swagger/swagger.yaml +124 -0
- package/{lib/prisma → devtools/swc}/.swcrc +2 -1
- package/devtools/tsup/tsup.config.ts +15 -0
- package/devtools/vitest/src/test/e2e/auth.e2e.spec.ts +41 -0
- package/devtools/vitest/src/test/e2e/users.e2e.spec.ts +64 -0
- package/devtools/vitest/src/test/setup.ts +31 -0
- package/devtools/vitest/src/test/unit/services/auth.service.spec.ts +70 -0
- package/devtools/vitest/src/test/unit/services/users.service.spec.ts +90 -0
- package/devtools/vitest/vitest.config.ts +22 -0
- package/package.json +24 -11
- package/templates/default/nodemon.json +7 -0
- package/templates/default/package.json +48 -0
- package/templates/default/src/app.ts +118 -0
- package/templates/default/src/config/env.ts +78 -0
- package/templates/default/src/controllers/auth.controller.ts +40 -0
- package/templates/default/src/controllers/users.controller.ts +46 -0
- package/templates/default/src/dtos/users.dto.ts +42 -0
- package/templates/default/src/entities/user.entity.ts +190 -0
- package/templates/default/src/exceptions/httpException.ts +14 -0
- package/{lib/knex → templates/default}/src/interfaces/auth.interface.ts +3 -3
- package/templates/default/src/interfaces/users.interface.ts +9 -0
- package/templates/default/src/middlewares/auth.middleware.ts +49 -0
- package/templates/default/src/middlewares/error.middleware.ts +89 -0
- package/templates/default/src/middlewares/notFound.middleware.ts +6 -0
- package/templates/default/src/middlewares/validation.middleware.ts +15 -0
- package/templates/default/src/repositories/users.repository.ts +55 -0
- package/templates/default/src/routes/auth.route.ts +31 -0
- package/templates/default/src/routes/users.route.ts +32 -0
- package/templates/default/src/server.ts +35 -0
- package/templates/default/src/services/auth.service.ts +67 -0
- package/templates/default/src/services/users.service.ts +48 -0
- package/templates/default/src/utils/asyncHandler.ts +8 -0
- package/templates/default/src/utils/logger.ts +113 -0
- package/{lib/typeorm → templates/default}/tsconfig.json +23 -22
- package/CONTRIBUTORS.md +0 -69
- package/bin/cli.js +0 -18
- package/lib/default/.dockerignore +0 -18
- package/lib/default/.editorconfig +0 -9
- package/lib/default/.env.development.local +0 -13
- package/lib/default/.env.production.local +0 -13
- package/lib/default/.env.test.local +0 -13
- package/lib/default/.eslintignore +0 -1
- package/lib/default/.eslintrc +0 -18
- package/lib/default/.huskyrc +0 -5
- package/lib/default/.lintstagedrc.json +0 -5
- package/lib/default/.prettierrc +0 -8
- package/lib/default/.swcrc +0 -39
- package/lib/default/.vscode/launch.json +0 -35
- package/lib/default/.vscode/settings.json +0 -6
- package/lib/default/Dockerfile.dev +0 -18
- package/lib/default/Dockerfile.prod +0 -18
- package/lib/default/docker-compose.yml +0 -35
- package/lib/default/ecosystem.config.js +0 -57
- package/lib/default/jest.config.js +0 -12
- package/lib/default/nginx.conf +0 -40
- package/lib/default/nodemon.json +0 -12
- package/lib/default/package.json +0 -76
- package/lib/default/src/app.ts +0 -81
- package/lib/default/src/config/index.ts +0 -5
- package/lib/default/src/controllers/auth.controller.ts +0 -44
- package/lib/default/src/controllers/users.controller.ts +0 -63
- package/lib/default/src/dtos/users.dto.ts +0 -20
- package/lib/default/src/exceptions/HttpException.ts +0 -10
- package/lib/default/src/http/auth.http +0 -27
- package/lib/default/src/http/users.http +0 -34
- package/lib/default/src/interfaces/auth.interface.ts +0 -15
- package/lib/default/src/interfaces/users.interface.ts +0 -5
- package/lib/default/src/middlewares/auth.middleware.ts +0 -38
- package/lib/default/src/middlewares/error.middleware.ts +0 -15
- package/lib/default/src/middlewares/validation.middleware.ts +0 -27
- package/lib/default/src/models/users.model.ts +0 -9
- package/lib/default/src/routes/auth.route.ts +0 -21
- package/lib/default/src/routes/users.route.ts +0 -23
- package/lib/default/src/server.ts +0 -10
- package/lib/default/src/services/auth.service.ts +0 -52
- package/lib/default/src/services/users.service.ts +0 -51
- package/lib/default/src/test/auth.test.ts +0 -52
- package/lib/default/src/test/users.test.ts +0 -62
- package/lib/default/src/utils/logger.ts +0 -65
- package/lib/default/src/utils/validateEnv.ts +0 -8
- package/lib/default/swagger.yaml +0 -123
- package/lib/default/tsconfig.json +0 -39
- package/lib/graphql/.dockerignore +0 -18
- package/lib/graphql/.editorconfig +0 -9
- package/lib/graphql/.env.development.local +0 -20
- package/lib/graphql/.env.production.local +0 -20
- package/lib/graphql/.env.test.local +0 -20
- package/lib/graphql/.eslintignore +0 -1
- package/lib/graphql/.eslintrc +0 -18
- package/lib/graphql/.huskyrc +0 -5
- package/lib/graphql/.lintstagedrc.json +0 -5
- package/lib/graphql/.prettierrc +0 -8
- package/lib/graphql/.swcrc +0 -40
- package/lib/graphql/.vscode/launch.json +0 -35
- package/lib/graphql/.vscode/settings.json +0 -6
- package/lib/graphql/Dockerfile.dev +0 -19
- package/lib/graphql/Dockerfile.prod +0 -19
- package/lib/graphql/Makefile +0 -46
- package/lib/graphql/docker-compose.yml +0 -58
- package/lib/graphql/ecosystem.config.js +0 -59
- package/lib/graphql/jest.config.js +0 -12
- package/lib/graphql/nginx.conf +0 -40
- package/lib/graphql/nodemon.json +0 -12
- package/lib/graphql/package.json +0 -75
- package/lib/graphql/src/app.ts +0 -107
- package/lib/graphql/src/config/index.ts +0 -6
- package/lib/graphql/src/database/index.ts +0 -26
- package/lib/graphql/src/dtos/users.dto.ts +0 -27
- package/lib/graphql/src/entities/users.entity.ts +0 -26
- package/lib/graphql/src/exceptions/HttpException.ts +0 -10
- package/lib/graphql/src/http/auth.http +0 -49
- package/lib/graphql/src/http/users.http +0 -78
- package/lib/graphql/src/interfaces/auth.interface.ts +0 -14
- package/lib/graphql/src/interfaces/users.interface.ts +0 -5
- package/lib/graphql/src/middlewares/auth.middleware.ts +0 -42
- package/lib/graphql/src/middlewares/error.middleware.ts +0 -15
- package/lib/graphql/src/repositories/auth.repository.ts +0 -53
- package/lib/graphql/src/repositories/users.repository.ts +0 -51
- package/lib/graphql/src/resolvers/auth.resolver.ts +0 -32
- package/lib/graphql/src/resolvers/users.resolver.ts +0 -47
- package/lib/graphql/src/server.ts +0 -10
- package/lib/graphql/src/test/auth.test.ts +0 -10
- package/lib/graphql/src/test/users.test.ts +0 -11
- package/lib/graphql/src/typedefs/users.type.ts +0 -13
- package/lib/graphql/src/utils/logger.ts +0 -77
- package/lib/graphql/src/utils/validateEnv.ts +0 -8
- package/lib/graphql/tsconfig.json +0 -40
- package/lib/knex/.dockerignore +0 -18
- package/lib/knex/.editorconfig +0 -9
- package/lib/knex/.env.development.local +0 -20
- package/lib/knex/.env.production.local +0 -20
- package/lib/knex/.env.test.local +0 -20
- package/lib/knex/.eslintignore +0 -1
- package/lib/knex/.eslintrc +0 -18
- package/lib/knex/.huskyrc +0 -5
- package/lib/knex/.lintstagedrc.json +0 -5
- package/lib/knex/.prettierrc +0 -8
- package/lib/knex/.swcrc +0 -40
- package/lib/knex/.vscode/launch.json +0 -35
- package/lib/knex/.vscode/settings.json +0 -6
- package/lib/knex/Dockerfile.dev +0 -19
- package/lib/knex/Dockerfile.prod +0 -19
- package/lib/knex/Makefile +0 -46
- package/lib/knex/docker-compose.yml +0 -55
- package/lib/knex/ecosystem.config.js +0 -57
- package/lib/knex/jest.config.js +0 -12
- package/lib/knex/knexfile.ts +0 -23
- package/lib/knex/nginx.conf +0 -40
- package/lib/knex/nodemon.json +0 -12
- package/lib/knex/package.json +0 -85
- package/lib/knex/src/app.ts +0 -87
- package/lib/knex/src/config/index.ts +0 -6
- package/lib/knex/src/controllers/auth.controller.ts +0 -44
- package/lib/knex/src/controllers/users.controller.ts +0 -63
- package/lib/knex/src/database/index.ts +0 -24
- package/lib/knex/src/database/migrations/.gitkeep +0 -0
- package/lib/knex/src/database/migrations/20210713110926_initial.ts +0 -17
- package/lib/knex/src/database/seeds/.gitkeep +0 -0
- package/lib/knex/src/dtos/users.dto.ts +0 -20
- package/lib/knex/src/exceptions/HttpException.ts +0 -10
- package/lib/knex/src/http/auth.http +0 -27
- package/lib/knex/src/http/users.http +0 -34
- package/lib/knex/src/interfaces/routes.interface.ts +0 -6
- package/lib/knex/src/interfaces/users.interface.ts +0 -5
- package/lib/knex/src/middlewares/auth.middleware.ts +0 -40
- package/lib/knex/src/middlewares/error.middleware.ts +0 -15
- package/lib/knex/src/middlewares/validation.middleware.ts +0 -27
- package/lib/knex/src/models/users.model.ts +0 -13
- package/lib/knex/src/routes/auth.route.ts +0 -22
- package/lib/knex/src/routes/users.route.ts +0 -23
- package/lib/knex/src/server.ts +0 -10
- package/lib/knex/src/services/auth.service.ts +0 -60
- package/lib/knex/src/services/users.service.ts +0 -55
- package/lib/knex/src/test/auth.test.ts +0 -51
- package/lib/knex/src/test/users.test.ts +0 -65
- package/lib/knex/src/utils/logger.ts +0 -65
- package/lib/knex/src/utils/validateEnv.ts +0 -8
- package/lib/knex/swagger.yaml +0 -123
- package/lib/knex/tsconfig.json +0 -40
- package/lib/mikro-orm/.dockerignore +0 -18
- package/lib/mikro-orm/.editorconfig +0 -9
- package/lib/mikro-orm/.env.development.local +0 -18
- package/lib/mikro-orm/.env.production.local +0 -18
- package/lib/mikro-orm/.env.test.local +0 -18
- package/lib/mikro-orm/.eslintignore +0 -1
- package/lib/mikro-orm/.eslintrc +0 -18
- package/lib/mikro-orm/.huskyrc +0 -5
- package/lib/mikro-orm/.lintstagedrc.json +0 -5
- package/lib/mikro-orm/.prettierrc +0 -8
- package/lib/mikro-orm/.swcrc +0 -41
- package/lib/mikro-orm/.vscode/launch.json +0 -35
- package/lib/mikro-orm/.vscode/settings.json +0 -6
- package/lib/mikro-orm/Dockerfile.dev +0 -19
- package/lib/mikro-orm/Dockerfile.prod +0 -19
- package/lib/mikro-orm/Makefile +0 -46
- package/lib/mikro-orm/docker-compose.yml +0 -55
- package/lib/mikro-orm/ecosystem.config.js +0 -57
- package/lib/mikro-orm/jest.config.js +0 -12
- package/lib/mikro-orm/nginx.conf +0 -40
- package/lib/mikro-orm/nodemon.json +0 -12
- package/lib/mikro-orm/package.json +0 -79
- package/lib/mikro-orm/src/app.ts +0 -97
- package/lib/mikro-orm/src/config/index.ts +0 -6
- package/lib/mikro-orm/src/controllers/auth.controller.ts +0 -44
- package/lib/mikro-orm/src/controllers/users.controller.ts +0 -63
- package/lib/mikro-orm/src/database/index.ts +0 -19
- package/lib/mikro-orm/src/dtos/users.dto.ts +0 -20
- package/lib/mikro-orm/src/entities/base.entity.ts +0 -16
- package/lib/mikro-orm/src/entities/users.entity.ts +0 -17
- package/lib/mikro-orm/src/exceptions/HttpException.ts +0 -10
- package/lib/mikro-orm/src/http/auth.http +0 -32
- package/lib/mikro-orm/src/http/users.http +0 -34
- package/lib/mikro-orm/src/interfaces/auth.interface.ts +0 -15
- package/lib/mikro-orm/src/interfaces/routes.interface.ts +0 -6
- package/lib/mikro-orm/src/interfaces/users.interface.ts +0 -5
- package/lib/mikro-orm/src/middlewares/auth.middleware.ts +0 -39
- package/lib/mikro-orm/src/middlewares/error.middleware.ts +0 -15
- package/lib/mikro-orm/src/middlewares/validation.middleware.ts +0 -27
- package/lib/mikro-orm/src/routes/auth.route.ts +0 -22
- package/lib/mikro-orm/src/routes/users.route.ts +0 -23
- package/lib/mikro-orm/src/server.ts +0 -10
- package/lib/mikro-orm/src/services/auth.service.ts +0 -53
- package/lib/mikro-orm/src/services/users.service.ts +0 -60
- package/lib/mikro-orm/src/test/auth.test.ts +0 -65
- package/lib/mikro-orm/src/test/users.test.ts +0 -69
- package/lib/mikro-orm/src/utils/logger.ts +0 -65
- package/lib/mikro-orm/src/utils/validateEnv.ts +0 -8
- package/lib/mikro-orm/swagger.yaml +0 -122
- package/lib/mikro-orm/tsconfig.json +0 -41
- package/lib/mongoose/.dockerignore +0 -18
- package/lib/mongoose/.editorconfig +0 -9
- package/lib/mongoose/.env.development.local +0 -18
- package/lib/mongoose/.env.production.local +0 -18
- package/lib/mongoose/.env.test.local +0 -18
- package/lib/mongoose/.eslintignore +0 -1
- package/lib/mongoose/.eslintrc +0 -18
- package/lib/mongoose/.huskyrc +0 -5
- package/lib/mongoose/.lintstagedrc.json +0 -5
- package/lib/mongoose/.prettierrc +0 -8
- package/lib/mongoose/.swcrc +0 -40
- package/lib/mongoose/.vscode/launch.json +0 -35
- package/lib/mongoose/.vscode/settings.json +0 -6
- package/lib/mongoose/Dockerfile.dev +0 -19
- package/lib/mongoose/Dockerfile.prod +0 -19
- package/lib/mongoose/Makefile +0 -46
- package/lib/mongoose/docker-compose.yml +0 -55
- package/lib/mongoose/ecosystem.config.js +0 -57
- package/lib/mongoose/jest.config.js +0 -12
- package/lib/mongoose/nginx.conf +0 -40
- package/lib/mongoose/nodemon.json +0 -12
- package/lib/mongoose/package.json +0 -78
- package/lib/mongoose/src/app.ts +0 -87
- package/lib/mongoose/src/config/index.ts +0 -6
- package/lib/mongoose/src/controllers/auth.controller.ts +0 -44
- package/lib/mongoose/src/controllers/users.controller.ts +0 -63
- package/lib/mongoose/src/database/index.ts +0 -18
- package/lib/mongoose/src/dtos/users.dto.ts +0 -20
- package/lib/mongoose/src/exceptions/HttpException.ts +0 -10
- package/lib/mongoose/src/http/auth.http +0 -27
- package/lib/mongoose/src/http/users.http +0 -34
- package/lib/mongoose/src/interfaces/auth.interface.ts +0 -15
- package/lib/mongoose/src/interfaces/routes.interface.ts +0 -6
- package/lib/mongoose/src/interfaces/users.interface.ts +0 -5
- package/lib/mongoose/src/middlewares/auth.middleware.ts +0 -39
- package/lib/mongoose/src/middlewares/error.middleware.ts +0 -15
- package/lib/mongoose/src/middlewares/validation.middleware.ts +0 -27
- package/lib/mongoose/src/models/users.model.ts +0 -16
- package/lib/mongoose/src/routes/auth.route.ts +0 -22
- package/lib/mongoose/src/routes/users.route.ts +0 -23
- package/lib/mongoose/src/server.ts +0 -10
- package/lib/mongoose/src/services/auth.service.ts +0 -52
- package/lib/mongoose/src/services/users.service.ts +0 -54
- package/lib/mongoose/src/test/auth.test.ts +0 -83
- package/lib/mongoose/src/test/index.test.ts +0 -18
- package/lib/mongoose/src/test/users.test.ts +0 -133
- package/lib/mongoose/src/utils/logger.ts +0 -65
- package/lib/mongoose/src/utils/validateEnv.ts +0 -8
- package/lib/mongoose/swagger.yaml +0 -120
- package/lib/mongoose/tsconfig.json +0 -40
- package/lib/node-postgres/.dockerignore +0 -18
- package/lib/node-postgres/.editorconfig +0 -9
- package/lib/node-postgres/.env.development.local +0 -20
- package/lib/node-postgres/.env.production.local +0 -20
- package/lib/node-postgres/.env.test.local +0 -20
- package/lib/node-postgres/.eslintignore +0 -1
- package/lib/node-postgres/.eslintrc +0 -18
- package/lib/node-postgres/.huskyrc +0 -5
- package/lib/node-postgres/.lintstagedrc.json +0 -5
- package/lib/node-postgres/.prettierrc +0 -8
- package/lib/node-postgres/.swcrc +0 -38
- package/lib/node-postgres/.vscode/launch.json +0 -35
- package/lib/node-postgres/.vscode/settings.json +0 -6
- package/lib/node-postgres/Dockerfile.dev +0 -17
- package/lib/node-postgres/Dockerfile.prod +0 -17
- package/lib/node-postgres/Makefile +0 -46
- package/lib/node-postgres/docker-compose.yml +0 -61
- package/lib/node-postgres/ecosystem.config.js +0 -57
- package/lib/node-postgres/jest.config.js +0 -12
- package/lib/node-postgres/nginx.conf +0 -40
- package/lib/node-postgres/nodemon.json +0 -12
- package/lib/node-postgres/package.json +0 -78
- package/lib/node-postgres/src/app.ts +0 -81
- package/lib/node-postgres/src/config/index.ts +0 -6
- package/lib/node-postgres/src/controllers/auth.controller.ts +0 -44
- package/lib/node-postgres/src/controllers/users.controller.ts +0 -63
- package/lib/node-postgres/src/database/index.ts +0 -10
- package/lib/node-postgres/src/database/init.sql +0 -13
- package/lib/node-postgres/src/dtos/users.dto.ts +0 -20
- package/lib/node-postgres/src/exceptions/httpException.ts +0 -10
- package/lib/node-postgres/src/http/auth.http +0 -27
- package/lib/node-postgres/src/http/users.http +0 -34
- package/lib/node-postgres/src/interfaces/auth.interface.ts +0 -15
- package/lib/node-postgres/src/interfaces/routes.interface.ts +0 -6
- package/lib/node-postgres/src/interfaces/users.interface.ts +0 -5
- package/lib/node-postgres/src/middlewares/auth.middleware.ts +0 -46
- package/lib/node-postgres/src/middlewares/error.middleware.ts +0 -15
- package/lib/node-postgres/src/middlewares/validation.middleware.ts +0 -27
- package/lib/node-postgres/src/routes/auth.route.ts +0 -21
- package/lib/node-postgres/src/routes/users.route.ts +0 -23
- package/lib/node-postgres/src/server.ts +0 -10
- package/lib/node-postgres/src/services/auth.service.ts +0 -103
- package/lib/node-postgres/src/services/users.service.ts +0 -133
- package/lib/node-postgres/src/test/auth.test.ts +0 -57
- package/lib/node-postgres/src/test/users.test.ts +0 -72
- package/lib/node-postgres/src/utils/logger.ts +0 -65
- package/lib/node-postgres/src/utils/validateEnv.ts +0 -8
- package/lib/node-postgres/swagger.yaml +0 -123
- package/lib/node-postgres/tsconfig.json +0 -39
- package/lib/prisma/.dockerignore +0 -18
- package/lib/prisma/.editorconfig +0 -9
- package/lib/prisma/.env.development.local +0 -16
- package/lib/prisma/.env.production.local +0 -16
- package/lib/prisma/.env.test.local +0 -16
- package/lib/prisma/.eslintignore +0 -1
- package/lib/prisma/.eslintrc +0 -18
- package/lib/prisma/.huskyrc +0 -5
- package/lib/prisma/.lintstagedrc.json +0 -5
- package/lib/prisma/.prettierrc +0 -8
- package/lib/prisma/.vscode/launch.json +0 -35
- package/lib/prisma/.vscode/settings.json +0 -6
- package/lib/prisma/Dockerfile.dev +0 -19
- package/lib/prisma/Dockerfile.prod +0 -19
- package/lib/prisma/Makefile +0 -46
- package/lib/prisma/docker-compose.yml +0 -51
- package/lib/prisma/ecosystem.config.js +0 -57
- package/lib/prisma/jest.config.js +0 -12
- package/lib/prisma/nginx.conf +0 -40
- package/lib/prisma/nodemon.json +0 -12
- package/lib/prisma/package.json +0 -84
- package/lib/prisma/src/app.ts +0 -81
- package/lib/prisma/src/config/index.ts +0 -5
- package/lib/prisma/src/controllers/auth.controller.ts +0 -44
- package/lib/prisma/src/controllers/users.controller.ts +0 -63
- package/lib/prisma/src/dtos/users.dto.ts +0 -20
- package/lib/prisma/src/exceptions/HttpException.ts +0 -10
- package/lib/prisma/src/http/auth.http +0 -27
- package/lib/prisma/src/http/users.http +0 -34
- package/lib/prisma/src/interfaces/auth.interface.ts +0 -15
- package/lib/prisma/src/interfaces/routes.interface.ts +0 -6
- package/lib/prisma/src/interfaces/users.interface.ts +0 -5
- package/lib/prisma/src/middlewares/auth.middleware.ts +0 -39
- package/lib/prisma/src/middlewares/error.middleware.ts +0 -15
- package/lib/prisma/src/middlewares/validation.middleware.ts +0 -27
- package/lib/prisma/src/prisma/migrations/20210314081925_initial/migration.sql +0 -9
- package/lib/prisma/src/prisma/migrations/migration_lock.toml +0 -3
- package/lib/prisma/src/prisma/schema.prisma +0 -17
- package/lib/prisma/src/routes/auth.route.ts +0 -22
- package/lib/prisma/src/routes/users.route.ts +0 -23
- package/lib/prisma/src/server.ts +0 -10
- package/lib/prisma/src/services/auth.service.ts +0 -56
- package/lib/prisma/src/services/users.service.ts +0 -49
- package/lib/prisma/src/test/auth.test.ts +0 -81
- package/lib/prisma/src/test/index.test.ts +0 -18
- package/lib/prisma/src/test/users.test.ts +0 -134
- package/lib/prisma/src/utils/logger.ts +0 -65
- package/lib/prisma/src/utils/validateEnv.ts +0 -8
- package/lib/prisma/swagger.yaml +0 -123
- package/lib/prisma/tsconfig.json +0 -38
- package/lib/routing-controllers/.dockerignore +0 -18
- package/lib/routing-controllers/.editorconfig +0 -9
- package/lib/routing-controllers/.env.development.local +0 -13
- package/lib/routing-controllers/.env.production.local +0 -13
- package/lib/routing-controllers/.env.test.local +0 -13
- package/lib/routing-controllers/.eslintignore +0 -1
- package/lib/routing-controllers/.eslintrc +0 -18
- package/lib/routing-controllers/.huskyrc +0 -5
- package/lib/routing-controllers/.lintstagedrc.json +0 -5
- package/lib/routing-controllers/.prettierrc +0 -8
- package/lib/routing-controllers/.swcrc +0 -38
- package/lib/routing-controllers/.vscode/launch.json +0 -35
- package/lib/routing-controllers/.vscode/settings.json +0 -6
- package/lib/routing-controllers/Dockerfile.dev +0 -19
- package/lib/routing-controllers/Dockerfile.prod +0 -19
- package/lib/routing-controllers/Makefile +0 -42
- package/lib/routing-controllers/docker-compose.yml +0 -35
- package/lib/routing-controllers/ecosystem.config.js +0 -57
- package/lib/routing-controllers/jest.config.js +0 -12
- package/lib/routing-controllers/nginx.conf +0 -40
- package/lib/routing-controllers/nodemon.json +0 -12
- package/lib/routing-controllers/package.json +0 -77
- package/lib/routing-controllers/src/app.ts +0 -101
- package/lib/routing-controllers/src/config/index.ts +0 -5
- package/lib/routing-controllers/src/controllers/auth.controller.ts +0 -41
- package/lib/routing-controllers/src/controllers/users.controller.ts +0 -51
- package/lib/routing-controllers/src/dtos/users.dto.ts +0 -20
- package/lib/routing-controllers/src/exceptions/HttpException.ts +0 -12
- package/lib/routing-controllers/src/http/auth.http +0 -27
- package/lib/routing-controllers/src/http/users.http +0 -34
- package/lib/routing-controllers/src/interfaces/auth.interface.ts +0 -15
- package/lib/routing-controllers/src/interfaces/users.interface.ts +0 -5
- package/lib/routing-controllers/src/middlewares/auth.middleware.ts +0 -38
- package/lib/routing-controllers/src/middlewares/error.middleware.ts +0 -15
- package/lib/routing-controllers/src/middlewares/validation.middleware.ts +0 -27
- package/lib/routing-controllers/src/models/users.model.ts +0 -9
- package/lib/routing-controllers/src/server.ts +0 -9
- package/lib/routing-controllers/src/services/auth.service.ts +0 -53
- package/lib/routing-controllers/src/services/users.service.ts +0 -52
- package/lib/routing-controllers/src/test/auth.test.ts +0 -49
- package/lib/routing-controllers/src/test/users.test.ts +0 -65
- package/lib/routing-controllers/src/utils/logger.ts +0 -65
- package/lib/routing-controllers/src/utils/validateEnv.ts +0 -8
- package/lib/routing-controllers/tsconfig.json +0 -38
- package/lib/sequelize/.dockerignore +0 -18
- package/lib/sequelize/.editorconfig +0 -9
- package/lib/sequelize/.env.development.local +0 -20
- package/lib/sequelize/.env.production.local +0 -20
- package/lib/sequelize/.env.test.local +0 -20
- package/lib/sequelize/.eslintignore +0 -1
- package/lib/sequelize/.eslintrc +0 -18
- package/lib/sequelize/.huskyrc +0 -5
- package/lib/sequelize/.lintstagedrc.json +0 -5
- package/lib/sequelize/.prettierrc +0 -8
- package/lib/sequelize/.sequelizerc +0 -8
- package/lib/sequelize/.swcrc +0 -40
- package/lib/sequelize/.vscode/launch.json +0 -35
- package/lib/sequelize/.vscode/settings.json +0 -6
- package/lib/sequelize/Dockerfile.dev +0 -23
- package/lib/sequelize/Dockerfile.prod +0 -23
- package/lib/sequelize/Makefile +0 -46
- package/lib/sequelize/docker-compose.yml +0 -55
- package/lib/sequelize/docker-entrypoint.sh +0 -5
- package/lib/sequelize/ecosystem.config.js +0 -57
- package/lib/sequelize/jest.config.js +0 -12
- package/lib/sequelize/nginx.conf +0 -40
- package/lib/sequelize/nodemon.json +0 -12
- package/lib/sequelize/package.json +0 -82
- package/lib/sequelize/src/app.ts +0 -87
- package/lib/sequelize/src/config/index.ts +0 -6
- package/lib/sequelize/src/config/sequelize-cli.js +0 -15
- package/lib/sequelize/src/controllers/auth.controller.ts +0 -45
- package/lib/sequelize/src/controllers/users.controller.ts +0 -64
- package/lib/sequelize/src/database/index.ts +0 -34
- package/lib/sequelize/src/database/migrations/.gitkeep +0 -0
- package/lib/sequelize/src/database/seeders/.gitkeep +0 -0
- package/lib/sequelize/src/dtos/users.dto.ts +0 -20
- package/lib/sequelize/src/exceptions/HttpException.ts +0 -10
- package/lib/sequelize/src/http/auth.http +0 -27
- package/lib/sequelize/src/http/users.http +0 -34
- package/lib/sequelize/src/interfaces/auth.interface.ts +0 -15
- package/lib/sequelize/src/interfaces/routes.interface.ts +0 -6
- package/lib/sequelize/src/interfaces/users.interface.ts +0 -5
- package/lib/sequelize/src/middlewares/auth.middleware.ts +0 -38
- package/lib/sequelize/src/middlewares/error.middleware.ts +0 -15
- package/lib/sequelize/src/middlewares/validation.middleware.ts +0 -27
- package/lib/sequelize/src/models/users.model.ts +0 -39
- package/lib/sequelize/src/routes/auth.route.ts +0 -21
- package/lib/sequelize/src/routes/users.route.ts +0 -23
- package/lib/sequelize/src/server.ts +0 -10
- package/lib/sequelize/src/services/auth.service.ts +0 -52
- package/lib/sequelize/src/services/users.service.ts +0 -50
- package/lib/sequelize/src/test/auth.test.ts +0 -71
- package/lib/sequelize/src/test/users.test.ts +0 -131
- package/lib/sequelize/src/utils/logger.ts +0 -65
- package/lib/sequelize/src/utils/validateEnv.ts +0 -8
- package/lib/sequelize/swagger.yaml +0 -123
- package/lib/sequelize/tsconfig.json +0 -40
- package/lib/starter.js +0 -262
- package/lib/typegoose/.dockerignore +0 -18
- package/lib/typegoose/.editorconfig +0 -9
- package/lib/typegoose/.env.development.local +0 -18
- package/lib/typegoose/.env.production.local +0 -18
- package/lib/typegoose/.env.test.local +0 -18
- package/lib/typegoose/.eslintignore +0 -1
- package/lib/typegoose/.eslintrc +0 -18
- package/lib/typegoose/.huskyrc +0 -5
- package/lib/typegoose/.lintstagedrc.json +0 -5
- package/lib/typegoose/.prettierrc +0 -8
- package/lib/typegoose/.swcrc +0 -40
- package/lib/typegoose/.vscode/launch.json +0 -35
- package/lib/typegoose/.vscode/settings.json +0 -6
- package/lib/typegoose/Dockerfile.dev +0 -19
- package/lib/typegoose/Dockerfile.prod +0 -19
- package/lib/typegoose/Makefile +0 -46
- package/lib/typegoose/docker-compose.yml +0 -55
- package/lib/typegoose/ecosystem.config.js +0 -57
- package/lib/typegoose/jest.config.js +0 -12
- package/lib/typegoose/nginx.conf +0 -40
- package/lib/typegoose/nodemon.json +0 -12
- package/lib/typegoose/package.json +0 -79
- package/lib/typegoose/src/app.ts +0 -90
- package/lib/typegoose/src/config/index.ts +0 -6
- package/lib/typegoose/src/controllers/auth.controller.ts +0 -44
- package/lib/typegoose/src/controllers/users.controller.ts +0 -63
- package/lib/typegoose/src/database/index.ts +0 -18
- package/lib/typegoose/src/dtos/users.dto.ts +0 -20
- package/lib/typegoose/src/exceptions/HttpException.ts +0 -10
- package/lib/typegoose/src/http/auth.http +0 -27
- package/lib/typegoose/src/http/users.http +0 -34
- package/lib/typegoose/src/interfaces/auth.interface.ts +0 -15
- package/lib/typegoose/src/interfaces/routes.interface.ts +0 -6
- package/lib/typegoose/src/interfaces/users.interface.ts +0 -5
- package/lib/typegoose/src/middlewares/auth.middleware.ts +0 -38
- package/lib/typegoose/src/middlewares/error.middleware.ts +0 -15
- package/lib/typegoose/src/middlewares/validation.middleware.ts +0 -27
- package/lib/typegoose/src/models/users.model.ts +0 -16
- package/lib/typegoose/src/routes/auth.route.ts +0 -21
- package/lib/typegoose/src/routes/users.route.ts +0 -23
- package/lib/typegoose/src/server.ts +0 -10
- package/lib/typegoose/src/services/auth.service.ts +0 -52
- package/lib/typegoose/src/services/users.service.ts +0 -55
- package/lib/typegoose/src/test/auth.test.ts +0 -83
- package/lib/typegoose/src/test/users.test.ts +0 -133
- package/lib/typegoose/src/utils/logger.ts +0 -65
- package/lib/typegoose/src/utils/validateEnv.ts +0 -8
- package/lib/typegoose/swagger.yaml +0 -120
- package/lib/typegoose/tsconfig.json +0 -40
- package/lib/typeorm/.dockerignore +0 -18
- package/lib/typeorm/.editorconfig +0 -9
- package/lib/typeorm/.env.development.local +0 -20
- package/lib/typeorm/.env.production.local +0 -20
- package/lib/typeorm/.env.test.local +0 -20
- package/lib/typeorm/.eslintignore +0 -1
- package/lib/typeorm/.eslintrc +0 -18
- package/lib/typeorm/.huskyrc +0 -5
- package/lib/typeorm/.lintstagedrc.json +0 -5
- package/lib/typeorm/.prettierrc +0 -8
- package/lib/typeorm/.swcrc +0 -40
- package/lib/typeorm/.vscode/launch.json +0 -35
- package/lib/typeorm/.vscode/settings.json +0 -6
- package/lib/typeorm/Dockerfile.dev +0 -19
- package/lib/typeorm/Dockerfile.prod +0 -19
- package/lib/typeorm/Makefile +0 -46
- package/lib/typeorm/docker-compose.yml +0 -57
- package/lib/typeorm/ecosystem.config.js +0 -57
- package/lib/typeorm/jest.config.js +0 -12
- package/lib/typeorm/nginx.conf +0 -40
- package/lib/typeorm/nodemon.json +0 -12
- package/lib/typeorm/package.json +0 -78
- package/lib/typeorm/src/app.ts +0 -87
- package/lib/typeorm/src/config/index.ts +0 -6
- package/lib/typeorm/src/controllers/auth.controller.ts +0 -44
- package/lib/typeorm/src/controllers/users.controller.ts +0 -63
- package/lib/typeorm/src/database/index.ts +0 -26
- package/lib/typeorm/src/database/migrations/.gitkeep +0 -0
- package/lib/typeorm/src/dtos/users.dto.ts +0 -20
- package/lib/typeorm/src/entities/users.entity.ts +0 -26
- package/lib/typeorm/src/exceptions/HttpException.ts +0 -10
- package/lib/typeorm/src/http/auth.http +0 -27
- package/lib/typeorm/src/http/users.http +0 -34
- package/lib/typeorm/src/interfaces/auth.interface.ts +0 -15
- package/lib/typeorm/src/interfaces/routes.interface.ts +0 -6
- package/lib/typeorm/src/interfaces/users.interface.ts +0 -5
- package/lib/typeorm/src/middlewares/auth.middleware.ts +0 -38
- package/lib/typeorm/src/middlewares/error.middleware.ts +0 -15
- package/lib/typeorm/src/middlewares/validation.middleware.ts +0 -27
- package/lib/typeorm/src/routes/auth.route.ts +0 -21
- package/lib/typeorm/src/routes/users.route.ts +0 -23
- package/lib/typeorm/src/server.ts +0 -10
- package/lib/typeorm/src/services/auth.service.ts +0 -54
- package/lib/typeorm/src/services/users.service.ts +0 -51
- package/lib/typeorm/src/test/auth.test.ts +0 -75
- package/lib/typeorm/src/test/users.test.ts +0 -136
- package/lib/typeorm/src/utils/logger.ts +0 -65
- package/lib/typeorm/src/utils/validateEnv.ts +0 -8
- package/lib/typeorm/swagger.yaml +0 -123
- /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" ]
|