base on Express + TypeScript starter template # ๐Ÿš€ Express TypeScript Boilerplate 2025 [![CI](https://github.com/edwinhern/express-typescript/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/edwinhern/express-typescript-2024/actions/workflows/ci.yml) ```code Hey There! ๐Ÿ™Œ ๐Ÿคพ that โญ๏ธ button if you like this boilerplate. ``` ## ๐ŸŒŸ Introduction Welcome to Express TypeScript Boilerplate 2025 โ€“ a simple and ready-to-use starting point for building backend web services with Express.js and TypeScript. ## ๐Ÿ’ก Why We Made This This starter kit helps you: - โœจ Start new projects faster - ๐Ÿ“Š Write clean, consistent code - โšก Build things quickly - ๐Ÿ›ก๏ธ Follow best practices for security and testing ## ๐Ÿš€ What's Included - ๐Ÿ“ Well-organized folders: Files grouped by feature so you can find things easily - ๐Ÿ’จ Fast development: Quick code running with `tsx` and error checking with `tsc` - ๐ŸŒ Latest Node.js: Uses the newest stable Node.js version from `.tool-versions` - ๐Ÿ”ง Safe settings: Environment settings checked with Zod to prevent errors - ๐Ÿ”— Short import paths: Clean code with easy imports using path shortcuts - ๐Ÿ”„ Auto-updates: Keeps dependencies up-to-date with Renovate - ๐Ÿ”’ Better security: Built-in protection with Helmet and CORS settings - ๐Ÿ“Š Easy tracking: Built-in logging with `pino-http` - ๐Ÿงช Ready-to-test: Testing tools with Vitest and Supertest already set up - โœ… Clean code: Consistent coding style with `Biomejs` - ๐Ÿ“ƒ Standard responses: Unified API responses using `ServiceResponse` - ๐Ÿณ Easy deployment: Ready for Docker containers - ๐Ÿ“ Input checking: Request validation using Zod - ๐Ÿงฉ API browser: Interactive API docs with Swagger UI ## ๐Ÿ› ๏ธ Getting Started ### Video Demo For a visual guide, watch the [video demo](https://github.com/user-attachments/assets/b1698dac-d582-45a0-8d61-31131732b74e) to see the setup and running of the project. ### Step-by-Step Guide #### Step 1: ๐Ÿš€ Initial Setup - Clone the repository: `git clone https://github.com/edwinhern/express-typescript.git` - Navigate: `cd express-typescript` - Install dependencies: `pnpm install` #### Step 2: โš™๏ธ Environment Configuration - Create `.env`: Copy `.env.template` to `.env` - Update `.env`: Fill in necessary environment variables #### Step 3: ๐Ÿƒโ€โ™‚๏ธ Running the Project - Development Mode: `pnpm start:dev` - Building: `pnpm build` - Production Mode: Set `NODE_ENV="production"` in `.env` then `pnpm build && pnpm start:prod` ## ๐Ÿค Feedback and Contributions We'd love to hear your feedback and suggestions for further improvements. Feel free to contribute and join us in making backend development cleaner and faster! ๐ŸŽ‰ Happy coding! ## ๐Ÿ“ Folder Structure ```code โ”œโ”€โ”€ biome.json โ”œโ”€โ”€ Dockerfile โ”œโ”€โ”€ LICENSE โ”œโ”€โ”€ package.json โ”œโ”€โ”€ pnpm-lock.yaml โ”œโ”€โ”€ README.md โ”œโ”€โ”€ src โ”‚ โ”œโ”€โ”€ api โ”‚ โ”‚ โ”œโ”€โ”€ healthCheck โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ __tests__ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ healthCheckRouter.test.ts โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ healthCheckRouter.ts โ”‚ โ”‚ โ””โ”€โ”€ user โ”‚ โ”‚ โ”œโ”€โ”€ __tests__ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ userRouter.test.ts โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ userService.test.ts โ”‚ โ”‚ โ”œโ”€โ”€ userController.ts โ”‚ โ”‚ โ”œโ”€โ”€ userModel.ts โ”‚ โ”‚ โ”œโ”€โ”€ userRepository.ts โ”‚ โ”‚ โ”œโ”€โ”€ userRouter.ts โ”‚ โ”‚ โ””โ”€โ”€ userService.ts โ”‚ โ”œโ”€โ”€ api-docs โ”‚ โ”‚ โ”œโ”€โ”€ __tests__ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ openAPIRouter.test.ts โ”‚ โ”‚ โ”œโ”€โ”€ openAPIDocumentGenerator.ts โ”‚ โ”‚ โ”œโ”€โ”€ openAPIResponseBuilders.ts โ”‚ โ”‚ โ””โ”€โ”€ openAPIRouter.ts โ”‚ โ”œโ”€โ”€ common โ”‚ โ”‚ โ”œโ”€โ”€ __tests__ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ errorHandler.test.ts โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ requestLogger.test.ts โ”‚ โ”‚ โ”œโ”€โ”€ middleware โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ errorHandler.ts โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ rateLimiter.ts โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ requestLogger.ts โ”‚ โ”‚ โ”œโ”€โ”€ models โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ serviceResponse.ts โ”‚ โ”‚ โ””โ”€โ”€ utils โ”‚ โ”‚ โ”œโ”€โ”€ commonValidation.ts โ”‚ โ”‚ โ”œโ”€โ”€ envConfig.ts โ”‚ โ”‚ โ””โ”€โ”€ httpHandlers.ts โ”‚ โ”œโ”€โ”€ index.ts โ”‚ โ””โ”€โ”€ server.ts โ”œโ”€โ”€ tsconfig.json โ””โ”€โ”€ vite.config.mts ``` ", Assign "at most 3 tags" to the expected json: {"id":"11974","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"