express-ts-api-starter 1.0.1

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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +495 -0
  3. package/dist/app.d.ts +4 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +42 -0
  6. package/dist/config/dbConfig.d.ts +3 -0
  7. package/dist/config/dbConfig.d.ts.map +1 -0
  8. package/dist/config/dbConfig.js +21 -0
  9. package/dist/config/emailConfig.d.ts +1 -0
  10. package/dist/config/emailConfig.d.ts.map +1 -0
  11. package/dist/config/emailConfig.js +1 -0
  12. package/dist/config/envConfig.d.ts +8 -0
  13. package/dist/config/envConfig.d.ts.map +1 -0
  14. package/dist/config/envConfig.js +22 -0
  15. package/dist/config/rateLimitConfig.d.ts +2 -0
  16. package/dist/config/rateLimitConfig.d.ts.map +1 -0
  17. package/dist/config/rateLimitConfig.js +9 -0
  18. package/dist/constants/index.d.ts +6 -0
  19. package/dist/constants/index.d.ts.map +1 -0
  20. package/dist/constants/index.js +9 -0
  21. package/dist/interfaces/userInterface.d.ts +11 -0
  22. package/dist/interfaces/userInterface.d.ts.map +1 -0
  23. package/dist/interfaces/userInterface.js +2 -0
  24. package/dist/messages/index.d.ts +25 -0
  25. package/dist/messages/index.d.ts.map +1 -0
  26. package/dist/messages/index.js +30 -0
  27. package/dist/middleware/auth.d.ts +9 -0
  28. package/dist/middleware/auth.d.ts.map +1 -0
  29. package/dist/middleware/auth.js +30 -0
  30. package/dist/middleware/errorMiddleware.d.ts +4 -0
  31. package/dist/middleware/errorMiddleware.d.ts.map +1 -0
  32. package/dist/middleware/errorMiddleware.js +15 -0
  33. package/dist/middleware/logMiddleware.d.ts +4 -0
  34. package/dist/middleware/logMiddleware.d.ts.map +1 -0
  35. package/dist/middleware/logMiddleware.js +29 -0
  36. package/dist/middleware/requestIdMiddleware.d.ts +3 -0
  37. package/dist/middleware/requestIdMiddleware.d.ts.map +1 -0
  38. package/dist/middleware/requestIdMiddleware.js +11 -0
  39. package/dist/middleware/uploadMiddleware.d.ts +3 -0
  40. package/dist/middleware/uploadMiddleware.d.ts.map +1 -0
  41. package/dist/middleware/uploadMiddleware.js +36 -0
  42. package/dist/middleware/validatorMiddleware.d.ts +3 -0
  43. package/dist/middleware/validatorMiddleware.d.ts.map +1 -0
  44. package/dist/middleware/validatorMiddleware.js +13 -0
  45. package/dist/models/UserModel.d.ts +9 -0
  46. package/dist/models/UserModel.d.ts.map +1 -0
  47. package/dist/models/UserModel.js +59 -0
  48. package/dist/modules/users/tests/userController.test.d.ts +2 -0
  49. package/dist/modules/users/tests/userController.test.d.ts.map +1 -0
  50. package/dist/modules/users/userController.d.ts +5 -0
  51. package/dist/modules/users/userController.d.ts.map +1 -0
  52. package/dist/modules/users/userController.js +90 -0
  53. package/dist/modules/users/userMessage.d.ts +11 -0
  54. package/dist/modules/users/userMessage.d.ts.map +1 -0
  55. package/dist/modules/users/userMessage.js +11 -0
  56. package/dist/modules/users/userService.d.ts +16 -0
  57. package/dist/modules/users/userService.d.ts.map +1 -0
  58. package/dist/modules/users/userService.js +67 -0
  59. package/dist/routes/index.d.ts +3 -0
  60. package/dist/routes/index.d.ts.map +1 -0
  61. package/dist/routes/index.js +11 -0
  62. package/dist/routes/usersRoute.d.ts +3 -0
  63. package/dist/routes/usersRoute.d.ts.map +1 -0
  64. package/dist/routes/usersRoute.js +11 -0
  65. package/dist/server.d.ts +2 -0
  66. package/dist/server.d.ts.map +1 -0
  67. package/dist/server.js +45 -0
  68. package/dist/types/index.d.ts +12 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +2 -0
  71. package/dist/types/roleType.d.ts +2 -0
  72. package/dist/types/roleType.d.ts.map +1 -0
  73. package/dist/types/roleType.js +2 -0
  74. package/dist/types/userTypes.d.ts +20 -0
  75. package/dist/types/userTypes.d.ts.map +1 -0
  76. package/dist/types/userTypes.js +2 -0
  77. package/dist/utils/authFunction.d.ts +3 -0
  78. package/dist/utils/authFunction.d.ts.map +1 -0
  79. package/dist/utils/authFunction.js +50 -0
  80. package/dist/utils/responseUtil.d.ts +5 -0
  81. package/dist/utils/responseUtil.d.ts.map +1 -0
  82. package/dist/utils/responseUtil.js +27 -0
  83. package/dist/validators/index.d.ts +2 -0
  84. package/dist/validators/index.d.ts.map +1 -0
  85. package/dist/validators/index.js +17 -0
  86. package/dist/validators/userValidators.d.ts +3 -0
  87. package/dist/validators/userValidators.d.ts.map +1 -0
  88. package/dist/validators/userValidators.js +34 -0
  89. package/package.json +160 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nikhil Plavalappil Kuttan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,495 @@
1
+ # 🏗️ EXPRESS-TS-API-STARTER | Express TypeScript Boilerplate
2
+
3
+ [![npm version](https://badge.fury.io/js/express-ts-api-starter.svg)](https://badge.fury.io/js/express-ts-api-starter)
4
+ [![npm downloads](https://img.shields.io/npm/dm/express-ts-api-starter.svg)](https://www.npmjs.com/package/express-ts-api-starter)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue.svg)](https://www.typescriptlang.org/)
7
+ [![Express.js](https://img.shields.io/badge/Express-5.1-green.svg)](https://expressjs.com/)
8
+ [![Node.js](https://img.shields.io/badge/Node.js-20+-brightgreen.svg)](https://nodejs.org/)
9
+ [![MongoDB](https://img.shields.io/badge/MongoDB-Ready-green.svg)](https://www.mongodb.com/)
10
+
11
+ **The fastest way to build production-grade REST APIs, web servers, and backend services with Node.js, Express.js, and TypeScript.**
12
+
13
+ A modern, enterprise-ready boilerplate featuring MVC architecture, JWT authentication, MongoDB integration, comprehensive security, input validation, testing setup, and developer-friendly tooling. Perfect for Node.js developers building scalable REST APIs, microservices, and web servers.
14
+
15
+ ---
16
+
17
+ ## 📌 What's Included? (Everything for Node.js API Development)
18
+
19
+ This production-ready Express.js + TypeScript boilerplate includes everything Node.js developers need to build scalable REST APIs:
20
+
21
+ | Feature | Details |
22
+ | --------------------- | ----------------------------------------------------- |
23
+ | **Architecture** | MVC pattern with functional service layer |
24
+ | **Type Safety** | 100% TypeScript with strict type checking |
25
+ | **Database** | MongoDB/Mongoose pre-configured and ready to use |
26
+ | **Authentication** | JWT-based auth with bcryptjs password hashing |
27
+ | **Validation** | Built-in input validation using express-validator |
28
+ | **Security** | Helmet, CORS, rate limiting, and request ID tracking |
29
+ | **Middleware Stack** | Error handling, logging, authentication, file uploads |
30
+ | **Testing Framework** | Jest with unit test examples |
31
+ | **Code Quality** | ESLint + Prettier configured for consistency |
32
+ | **API Responses** | Standardized response format across endpoints |
33
+ | **Request Tracking** | Unique request IDs for debugging and logging |
34
+ | **Graceful Shutdown** | Proper signal handling for production deployments |
35
+ | **Modular Structure** | Feature-based folder organization for scalability |
36
+
37
+ ---
38
+
39
+ ## 🎯 Why Developers Choose This Express Boilerplate?
40
+
41
+ ✅ **Zero Configuration** - Ready to code in seconds
42
+ ✅ **Production-Ready** - Enterprise-grade security & performance
43
+ ✅ **Fully Typed** - Complete TypeScript support with perfect type inference
44
+ ✅ **Industry Standards** - Follows Node.js, Express.js best practices
45
+ ✅ **Scalable Architecture** - Grow from startup to enterprise
46
+ ✅ **Well-Tested** - Jest testing suite with examples
47
+ ✅ **Amazing DX** - Hot reload, linting, formatting, debugging tools included
48
+ ✅ **MongoDB Ready** - Mongoose integration pre-configured
49
+ ✅ **Secure by Default** - Authentication, validation, rate limiting built-in
50
+ ✅ **Active Community** - Regular updates and support
51
+
52
+ ---
53
+
54
+ ## 🔍 Perfect For Node.js Developers Building...
55
+
56
+ - **REST APIs** - Full-featured API servers with authentication and validation
57
+ - **Microservices** - Scalable service architecture ready for production
58
+ - **Web Servers** - Fast, secure HTTP servers for web applications
59
+ - **Backend Services** - Complex business logic with clean separation of concerns
60
+ - **Startups** - Quick MVP development with enterprise-grade foundation
61
+ - **Enterprise Apps** - Scalable architecture for large teams
62
+ - **Real-time Backends** - Socket.io integration ready
63
+ - **Data APIs** - MongoDB integration for data management
64
+ - **Learning** - Best practices and patterns for Node.js/Express.js
65
+
66
+ ---
67
+
68
+ ## 🚀 Quick Start - Get Coding in Seconds
69
+
70
+ ### Option 1: Install as npm Package (Recommended)
71
+
72
+ ```bash
73
+ npm install express-ts-api-starter
74
+ ```
75
+
76
+ ### Option 2: Clone & Customize
77
+
78
+ ```bash
79
+ git clone https://github.com/nikhilpktcr/express-ts-api-starter.git my-api
80
+ cd my-api
81
+ npm install
82
+ npm run dev
83
+ ```
84
+
85
+ ---
86
+
87
+ ## 📦 Available Commands
88
+
89
+ ```bash
90
+ # Install dependencies
91
+ npm install
92
+
93
+ # Start development server (hot reload)
94
+ npm run dev
95
+
96
+ # Build for production
97
+ npm run build
98
+
99
+ # Start production server
100
+ npm start
101
+
102
+ # Run test suite
103
+ npm test
104
+
105
+ # Lint and fix code
106
+ npm run lint
107
+ npm run lint:fix
108
+ ```
109
+
110
+ ---
111
+
112
+ ## 📁 Project Structure
113
+
114
+ ```
115
+ src/
116
+ ├── modules/
117
+ │ └── users/
118
+ │ ├── userController.ts # Handles HTTP requests
119
+ │ ├── userService.ts # Singleton service - business logic
120
+ │ ├── userMessage.ts # Constants/messages
121
+ │ └── tests/
122
+ │ └── userController.test.ts
123
+ ├── routes/
124
+ │ ├── index.ts # Main API router
125
+ │ └── usersRoute.ts # /users routes
126
+ ├── middleware/ # Express middleware
127
+ │ ├── auth.ts # Authentication
128
+ │ ├── errorMiddleware.ts # Error handling
129
+ │ ├── logMiddleware.ts # Request logging (Morgan)
130
+ │ ├── validatorMiddleware.ts # Input validation
131
+ │ ├── uploadMiddleware.ts # File uploads (Multer)
132
+ │ └── requestIdMiddleware.ts # Request tracking
133
+ ├── config/ # Configuration files
134
+ │ ├── envConfig.ts # Environment variables
135
+ │ ├── dbConfig.ts # MongoDB/Mongoose connection
136
+ │ ├── emailConfig.ts # Email service config
137
+ │ ├── rateLimitConfig.ts # Rate limiting rules
138
+ │ └── throttleConfig.cjs # Throttle configuration
139
+ ├── models/
140
+ │ └── UserModel.ts # Mongoose User schema
141
+ ├── validators/ # Input validators
142
+ │ └── userValidators.ts # User validation rules
143
+ ├── types/
144
+ │ ├── index.ts # Exported types
145
+ │ ├── userTypes.ts # User type definitions
146
+ │ └── roleType.ts # Role type definitions
147
+ ├── interfaces/
148
+ │ └── userInterface.ts # User interfaces
149
+ ├── utils/ # Utility functions
150
+ │ ├── responseUtil.ts # Standardized API responses
151
+ │ └── authFunction.ts # Authentication helpers
152
+ ├── constants/ # Application constants
153
+ │ └── index.ts
154
+ ├── messages/ # Success/error messages
155
+ │ └── index.ts
156
+ ├── app.ts # Express app initialization
157
+ └── server.ts # Server entry point
158
+ ```
159
+
160
+ ---
161
+
162
+ ## ✨ Features
163
+
164
+ - ✅ **Express + TypeScript** - Full type safety
165
+ - ✅ **MVC Architecture** - Clean separation of concerns
166
+ - ✅ **Functional Service Pattern** - Lightweight, testable business logic
167
+ - ✅ **Modular Routing** - Feature-based structure
168
+ - ✅ **Security** - Helmet, CORS, JWT, bcryptjs
169
+ - ✅ **Database** - MongoDB with Mongoose integration
170
+ - ✅ **Validation** - Express-validator middleware
171
+ - ✅ **Error Handling** - Global error middleware + graceful shutdown
172
+ - ✅ **Logging** - Morgan with request IDs
173
+ - ✅ **File Uploads** - Multer configured
174
+ - ✅ **Rate Limiting** - Express rate-limit ready
175
+ - ✅ **Code Quality** - ESLint + Prettier
176
+ - ✅ **Testing** - Jest configured
177
+ - ✅ **Standardized Responses** - Consistent API responses
178
+
179
+ ---
180
+
181
+ ## 🧠 Architectural Patterns
182
+
183
+ ### Pattern Overview
184
+
185
+ | Pattern/Concept | Implementation |
186
+ | -------------------------- | --------------------------------------------------- |
187
+ | **MVC** | Controllers, Services, Models - clean separation |
188
+ | **Functional Services** | Exported functions for business logic (not classes) |
189
+ | **Modular Design** | Each feature is self-contained and independent |
190
+ | **Separation of Concerns** | `app.ts` initializes app, `server.ts` starts server |
191
+ | **Global Error Handling** | Centralized error middleware |
192
+ | **Request Tracking** | Unique request IDs for debugging |
193
+ | **Graceful Shutdown** | Proper signal handling (SIGTERM, SIGINT) |
194
+
195
+ ### Why Functional Services Instead of Class-Based Singletons?
196
+
197
+ This boilerplate uses **Functional Service Pattern** (exported async functions) instead of traditional Singleton classes. Here's why this approach is optimal:
198
+
199
+ #### ✅ **Benefits for Developers**
200
+
201
+ **1. Simplicity & Readability**
202
+
203
+ ```typescript
204
+ // ✨ Our approach - simple and direct
205
+ export const registerUser = async (data) => { ... }
206
+ export const loginUser = async (data) => { ... }
207
+
208
+ // vs. Class-based singleton (boilerplate heavy)
209
+ class UserService {
210
+ private static instance: UserService;
211
+ static getInstance() { ... }
212
+ async registerUser() { ... }
213
+ }
214
+ ```
215
+
216
+ **2. Easier Testing & Mocking**
217
+
218
+ ```typescript
219
+ // Functional - trivial to mock
220
+ jest.mock("./userService", () => ({
221
+ registerUser: jest.fn(),
222
+ }));
223
+
224
+ // Class singleton - requires getInstance() mocking
225
+ ```
226
+
227
+ **3. Tree-Shaking & Bundle Size**
228
+
229
+ - Only imported functions are included in production builds
230
+ - Class instantiation adds unnecessary overhead
231
+ - Faster startup time
232
+
233
+ **4. No State Management Issues**
234
+
235
+ - Functional services are stateless → no singleton state pollution
236
+ - Each request is isolated and independent
237
+ - No threading/concurrency concerns
238
+
239
+ **5. Better for Async Operations**
240
+
241
+ ```typescript
242
+ // Naturally async
243
+ export const registerUser = async (data) => {
244
+ // Direct async/await
245
+ };
246
+
247
+ // vs. Class requiring async getInstance()
248
+ ```
249
+
250
+ #### 🎯 **Robustness**
251
+
252
+ ✅ **Testable** - Functions are pure and easy to mock
253
+ ✅ **Scalable** - Add new services without complexity
254
+ ✅ **Maintainable** - No hidden state or initialization logic
255
+ ✅ **Production-Ready** - Used by companies like Airbnb, Stripe
256
+ ✅ **TypeScript-Friendly** - Full type inference for functions
257
+
258
+ #### 📊 **Comparison**
259
+
260
+ | Aspect | Functional | Class Singleton |
261
+ | ------------------ | ----------------------- | ----------------- |
262
+ | **Complexity** | Low | Medium-High |
263
+ | **Testing** | Easy | Complex |
264
+ | **Bundle Size** | Smaller | Larger |
265
+ | **Learning Curve** | Minimal | Moderate |
266
+ | **Scalability** | Linear | Logarithmic |
267
+ | **Production Use** | Airbnb, Stripe, Netflix | Legacy enterprise |
268
+
269
+ ---
270
+
271
+ ## 🔧 Tech Stack
272
+
273
+ - **Runtime**: [Node.js](https://nodejs.org/) (v20+)
274
+ - **Framework**: [Express](https://expressjs.com/) v5
275
+ - **Language**: [TypeScript](https://www.typescriptlang.org/) v5
276
+ - **Database**: [MongoDB](https://www.mongodb.com/) with [Mongoose](https://mongoosejs.com/)
277
+ - **Security**: [Helmet](https://helmetjs.github.io/), [CORS](https://github.com/expressjs/cors)
278
+ - **Authentication**: [JWT](https://jwt.io/), [bcryptjs](https://github.com/dcodeIO/bcrypt.js)
279
+ - **Validation**: [express-validator](https://express-validator.github.io/docs/)
280
+ - **Logging**: [Morgan](https://github.com/expressjs/morgan)
281
+ - **File Upload**: [Multer](https://github.com/expressjs/multer)
282
+ - **Testing**: [Jest](https://jestjs.io/)
283
+ - **Linting**: [ESLint](https://eslint.org/) + [Prettier](https://prettier.io/)
284
+
285
+ ---
286
+
287
+ ## 📝 Configuration
288
+
289
+ ### Environment Variables
290
+
291
+ Create a `.env` file in the root by copying from `.env.example`:
292
+
293
+ ```bash
294
+ cp .env.example .env
295
+ ```
296
+
297
+ Then update the values:
298
+
299
+ ```env
300
+ # Server
301
+ NODE_ENV=development
302
+ PORT=5000
303
+ BASIC_API_URL=/api/v1
304
+
305
+ # Database
306
+ DB_CONNECTION=mongodb://localhost:27017/
307
+ DB_NAME=testDB
308
+
309
+ # Authentication
310
+ JWT_SECRET=your-super-secret-jwt-key-change-in-production
311
+
312
+ # Email (Optional)
313
+ SMTP_HOST=smtp.gmail.com
314
+ SMTP_PORT=587
315
+ SMTP_USER=your-email@gmail.com
316
+ SMTP_PASSWORD=your-app-password
317
+ ```
318
+
319
+ **Key Variables:**
320
+
321
+ - `PORT` - Server port (default: 5000)
322
+ - `DB_CONNECTION` - MongoDB connection string
323
+ - `DB_NAME` - Database name
324
+ - `JWT_SECRET` - Secret key for JWT tokens (⚠️ Change in production!)
325
+ - `BASIC_API_URL` - API base path (default: /api/v1)
326
+
327
+ See [`.env.example`](.env.example) for complete list of options.
328
+
329
+ ---
330
+
331
+ ## 🔐 Security Features
332
+
333
+ - **Helmet** - HTTP headers security
334
+ - **CORS** - Cross-Origin Resource Sharing
335
+ - **JWT** - Secure authentication
336
+ - **bcryptjs** - Password hashing
337
+ - **Rate Limiting** - DDoS protection
338
+ - **Input Validation** - Prevent injection attacks
339
+ - **Request ID Tracking** - Audit trail
340
+
341
+ ---
342
+
343
+ ## 🧪 Testing
344
+
345
+ ```bash
346
+ # Run all tests
347
+ npm test
348
+
349
+ # Run tests in watch mode
350
+ npm test -- --watch
351
+
352
+ # Run with coverage
353
+ npm test -- --coverage
354
+ ```
355
+
356
+ ---
357
+
358
+ ## 🔢 API Versioning
359
+
360
+ Supports URL-based API versioning for backward compatibility.
361
+
362
+ ```typescript
363
+ // In app.ts
364
+ app.use("/api/v1", routes); // Change version as needed
365
+ ```
366
+
367
+ **Example Endpoints:**
368
+
369
+ - `POST /api/v1/users` - Create user
370
+ - `GET /api/v1/users` - Get all users
371
+ - `GET /api/v1/users/:id` - Get user by ID
372
+ - `PUT /api/v1/users/:id` - Update user
373
+ - `DELETE /api/v1/users/:id` - Delete user
374
+
375
+ ---
376
+
377
+ ## 📋 Standardized Responses
378
+
379
+ All API responses follow a consistent format:
380
+
381
+ ### Success Response
382
+
383
+ ```json
384
+ {
385
+ "success": true,
386
+ "requestId": "550e8400-e29b-41d4-a716-446655440000",
387
+ "message": "Operation successful",
388
+ "response": { "data": "..." }
389
+ }
390
+ ```
391
+
392
+ ### Error Response
393
+
394
+ ```json
395
+ {
396
+ "success": false,
397
+ "requestId": "550e8400-e29b-41d4-a716-446655440000",
398
+ "error": "Error message"
399
+ }
400
+ ```
401
+
402
+ ---
403
+
404
+ ## 🚦 Graceful Shutdown
405
+
406
+ The server handles graceful shutdown on:
407
+
408
+ - `SIGTERM` (Docker stop)
409
+ - `SIGINT` (Ctrl+C)
410
+
411
+ Existing connections are completed before exit (30-second timeout).
412
+
413
+ ---
414
+
415
+ ---
416
+
417
+ ## 🤝 Contributing
418
+
419
+ Contributions are welcome! Please:
420
+
421
+ 1. Fork the repository
422
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
423
+ 3. Commit changes (`git commit -m 'Add amazing feature'`)
424
+ 4. Push to branch (`git push origin feature/amazing-feature`)
425
+ 5. Open a Pull Request
426
+
427
+ ---
428
+
429
+ ## 📄 License
430
+
431
+ This project is licensed under the **MIT License** - see `LICENSE` file for details.
432
+
433
+ Free for personal and commercial use! ✨
434
+
435
+ ---
436
+
437
+ ## 🎯 Roadmap
438
+
439
+ - [ ] API Documentation (Swagger/OpenAPI)
440
+ - [ ] Health check endpoint
441
+ - [ ] Pagination utility
442
+ - [ ] Redis caching layer
443
+ - [ ] Database migrations
444
+ - [ ] Docker & Docker Compose
445
+ - [ ] CI/CD pipeline examples
446
+ - [ ] More comprehensive test suite
447
+
448
+ ---
449
+
450
+ ## 💬 Questions & Support
451
+
452
+ - **Email**: nikhil.pk.connect@gmail.com
453
+ - **GitHub Issues**: [Report bugs](https://github.com/nikhilpktcr/express-ts-api-starter/issues)
454
+ - **GitHub**: [@nikhilpktcr](https://github.com/nikhilpktcr)
455
+
456
+ ---
457
+
458
+ ## 🌟 Show Your Support
459
+
460
+ If this boilerplate helps your project:
461
+
462
+ - ⭐ **Star the repository** on GitHub
463
+ - 📦 **Use the npm package** in your projects
464
+ - 🐛 **Report issues** you encounter
465
+ - 💡 **Suggest features** and improvements
466
+ - 🔄 **Share** with other developers
467
+
468
+ Your support helps improve this project for everyone!
469
+
470
+ ---
471
+
472
+ ## 📊 Trending Keywords
473
+
474
+ This boilerplate is perfect for developers searching for:
475
+
476
+ - Express TypeScript starter
477
+ - Node.js REST API boilerplate
478
+ - Production-ready backend template
479
+ - MVC Node.js project
480
+ - TypeScript Express API
481
+ - MongoDB Express starter
482
+ - Secure Node.js backend
483
+ - Express authentication template
484
+
485
+ ---
486
+
487
+ ## 🚀 Ready to Build?
488
+
489
+ Start building your next API with this production-ready boilerplate. Clone, customize, and deploy in minutes!
490
+
491
+ ```bash
492
+ npm install express-ts-api-starter
493
+ ```
494
+
495
+ **Happy coding!** 🎉
package/dist/app.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Application } from "express";
2
+ declare const app: Application;
3
+ export default app;
4
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,WAAW,EAAW,MAAM,SAAS,CAAC;AAgBxD,QAAA,MAAM,GAAG,EAAE,WAAuB,CAAC;AAuCnC,eAAe,GAAG,CAAC"}
package/dist/app.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const cors_1 = __importDefault(require("cors"));
8
+ const morgan_1 = __importDefault(require("morgan"));
9
+ const envConfig_1 = require("./config/envConfig");
10
+ const routes_1 = __importDefault(require("./routes"));
11
+ const helmet_1 = __importDefault(require("helmet"));
12
+ // import { limiterConfig } from "./config/rateLimitConfig";
13
+ const dbConfig_1 = __importDefault(require("./config/dbConfig"));
14
+ const errorMiddleware_1 = require("./middleware/errorMiddleware");
15
+ const requestIdMiddleware_1 = require("./middleware/requestIdMiddleware");
16
+ const app = (0, express_1.default)();
17
+ // ===== Middleware =====
18
+ // app.use(limiterConfig);
19
+ app.use((0, helmet_1.default)());
20
+ app.use((0, cors_1.default)());
21
+ app.use(express_1.default.json());
22
+ app.use(express_1.default.urlencoded({ extended: true }));
23
+ (0, dbConfig_1.default)();
24
+ // ===== Request ID Middleware =====
25
+ app.use(requestIdMiddleware_1.requestIdMiddleware);
26
+ // ===== Morgan Logging with Request ID =====
27
+ morgan_1.default.token("id", (req) => {
28
+ const requestId = req.headers["x-request-id"];
29
+ return typeof requestId === "string"
30
+ ? requestId
31
+ : Array.isArray(requestId)
32
+ ? requestId[0]
33
+ : "unknown";
34
+ });
35
+ app.use((0, morgan_1.default)("🧾 requestId=:id 🚀 :method :url 📦 status=:status ⏱️ :response-time ms"));
36
+ // ===== API Routes =====
37
+ app.use(envConfig_1.env.BASIC_API_URL, routes_1.default);
38
+ // ===== Un handled Routes =====
39
+ app.use(errorMiddleware_1.notFoundHandler);
40
+ // ===== Global Error Handler =====
41
+ app.use(errorMiddleware_1.globalErrorHandler);
42
+ exports.default = app;
@@ -0,0 +1,3 @@
1
+ declare const connectDB: () => Promise<void>;
2
+ export default connectDB;
3
+ //# sourceMappingURL=dbConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbConfig.d.ts","sourceRoot":"","sources":["../../src/config/dbConfig.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,SAAS,QAAa,OAAO,CAAC,IAAI,CAUvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mongoose_1 = __importDefault(require("mongoose"));
7
+ const envConfig_1 = require("./envConfig");
8
+ const messages_1 = __importDefault(require("../messages"));
9
+ const connectDB = async () => {
10
+ try {
11
+ await mongoose_1.default.connect(envConfig_1.env.DB_CONNECTION, {
12
+ dbName: envConfig_1.env.DB_NAME,
13
+ });
14
+ console.log(`${envConfig_1.env.DB_NAME} ${messages_1.default.DB_CONNECT_SUCESS}`);
15
+ }
16
+ catch (error) {
17
+ console.error(`${envConfig_1.env.DB_NAME} ${messages_1.default.DB_CONNECT_FAILED}`, error);
18
+ process.exit(1);
19
+ }
20
+ };
21
+ exports.default = connectDB;
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=emailConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailConfig.d.ts","sourceRoot":"","sources":["../../src/config/emailConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,8 @@
1
+ export declare const env: {
2
+ PORT: string;
3
+ BASIC_API_URL: string;
4
+ DB_NAME: string;
5
+ JWT_SECRET: string;
6
+ DB_CONNECTION: string;
7
+ };
8
+ //# sourceMappingURL=envConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envConfig.d.ts","sourceRoot":"","sources":["../../src/config/envConfig.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,GAAG;;;;;;CAMf,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.env = void 0;
7
+ const dotenv_1 = __importDefault(require("dotenv"));
8
+ dotenv_1.default.config();
9
+ function getEnvVar(key, fallback) {
10
+ const value = process.env[key];
11
+ if (!value && fallback === undefined) {
12
+ throw new Error(`Missing required environment variable: ${key}`);
13
+ }
14
+ return value || fallback;
15
+ }
16
+ exports.env = {
17
+ PORT: getEnvVar("PORT", "5000"),
18
+ BASIC_API_URL: getEnvVar("BASIC_API_URL", "/api/v1"),
19
+ DB_NAME: getEnvVar("DB_NAME", "testDB"),
20
+ JWT_SECRET: getEnvVar("JWT_SECRET", "supersecret"),
21
+ DB_CONNECTION: getEnvVar("DB_CONNECTION", "mongodb://localhost:27017/"),
22
+ };
@@ -0,0 +1,2 @@
1
+ export declare const limiterConfig: import("express-rate-limit").RateLimitRequestHandler;
2
+ //# sourceMappingURL=rateLimitConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimitConfig.d.ts","sourceRoot":"","sources":["../../src/config/rateLimitConfig.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,sDAIxB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.limiterConfig = void 0;
4
+ const express_rate_limit_1 = require("express-rate-limit");
5
+ exports.limiterConfig = (0, express_rate_limit_1.rateLimit)({
6
+ windowMs: 15 * 60 * 1000, // 15 minutes
7
+ limit: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes).
8
+ legacyHeaders: false, // Disable the `X-RateLimit-*` headers.
9
+ });
@@ -0,0 +1,6 @@
1
+ export declare enum ERoles {
2
+ ADMIN = "admin",
3
+ MANAGER = "manager",
4
+ STAFF = "staff"
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,oBAAY,MAAM;IAChB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ERoles = void 0;
4
+ var ERoles;
5
+ (function (ERoles) {
6
+ ERoles["ADMIN"] = "admin";
7
+ ERoles["MANAGER"] = "manager";
8
+ ERoles["STAFF"] = "staff";
9
+ })(ERoles || (exports.ERoles = ERoles = {}));