express-genix 1.1.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -259
  3. package/index.js +229 -113
  4. package/lib/cleanup.js +41 -129
  5. package/lib/features.js +239 -0
  6. package/lib/generator.js +286 -204
  7. package/lib/utils.js +43 -91
  8. package/package.json +81 -63
  9. package/templates/cicd/github-actions.yml.ejs +70 -0
  10. package/templates/config/database.mongo.js.ejs +29 -33
  11. package/templates/config/database.postgres.js.ejs +41 -40
  12. package/templates/config/database.prisma.js.ejs +26 -0
  13. package/templates/config/redis.js.ejs +28 -0
  14. package/templates/config/schema.prisma.ejs +20 -0
  15. package/templates/config/swagger.js.ejs +30 -0
  16. package/templates/config/websocket.js.ejs +62 -0
  17. package/templates/controllers/authController.js.ejs +152 -129
  18. package/templates/controllers/exampleController.js.ejs +92 -152
  19. package/templates/controllers/userController.js.ejs +52 -60
  20. package/templates/core/Dockerfile.ejs +41 -31
  21. package/templates/core/README.md.ejs +191 -179
  22. package/templates/core/app.js.ejs +114 -64
  23. package/templates/core/docker-compose.yml.ejs +59 -47
  24. package/templates/core/dockerignore.ejs +7 -0
  25. package/templates/core/env.ejs +25 -19
  26. package/templates/core/env.example.ejs +26 -0
  27. package/templates/core/eslintrc.json.ejs +50 -20
  28. package/templates/core/gitignore.ejs +51 -51
  29. package/templates/core/healthcheck.js.ejs +24 -24
  30. package/templates/core/jest.config.js.ejs +19 -22
  31. package/templates/core/package.json.ejs +70 -33
  32. package/templates/core/prettierrc.json.ejs +11 -11
  33. package/templates/core/server.js.ejs +64 -48
  34. package/templates/core/tsconfig.json.ejs +19 -0
  35. package/templates/middleware/auth.js.ejs +80 -66
  36. package/templates/middleware/cache.js.ejs +67 -0
  37. package/templates/middleware/errorHandler.js.ejs +50 -46
  38. package/templates/middleware/requestId.js.ejs +9 -0
  39. package/templates/middleware/validation.js.ejs +109 -47
  40. package/templates/migrations/create-users.js.ejs +50 -0
  41. package/templates/migrations/seed-users.js.ejs +34 -0
  42. package/templates/migrations/sequelizerc.ejs +8 -0
  43. package/templates/models/User.mongo.js.ejs +29 -29
  44. package/templates/models/User.postgres.js.ejs +40 -40
  45. package/templates/models/index.mongo.js.ejs +7 -7
  46. package/templates/models/index.postgres.js.ejs +11 -11
  47. package/templates/routes/authRoutes.js.ejs +222 -13
  48. package/templates/routes/exampleRoutes.js.ejs +100 -12
  49. package/templates/routes/index.js.ejs +34 -24
  50. package/templates/routes/userRoutes.js.ejs +78 -15
  51. package/templates/services/authService.js.ejs +111 -35
  52. package/templates/services/exampleService.js.ejs +112 -112
  53. package/templates/services/userService.mongodb.js.ejs +33 -33
  54. package/templates/services/userService.postgres.js.ejs +30 -30
  55. package/templates/services/userService.prisma.js.ejs +36 -0
  56. package/templates/tests/auth.test.js.ejs +83 -66
  57. package/templates/tests/example.test.js.ejs +109 -112
  58. package/templates/tests/setup.js.ejs +11 -11
  59. package/templates/tests/users.test.js.ejs +42 -42
  60. package/templates/utils/envValidator.js.ejs +23 -0
  61. package/templates/utils/errors.js.ejs +12 -12
  62. package/templates/utils/logger.js.ejs +37 -28
  63. package/templates/utils/response.js.ejs +28 -0
  64. package/templates/utils/validators.js.ejs +34 -34
  65. package/templates/config/swagger.json.ejs +0 -194
  66. package/templates/core/index.js.ejs +0 -24
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Joshua Maeba Nyamasege
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 CHANGED
@@ -1,259 +1,204 @@
1
- # Express-Genix CLI
2
-
3
- express-genix is a production-grade CLI tool that generates Express.js applications with a robust, scalable foundation. It scaffolds projects with JWT authentication (including refresh tokens), MongoDB (with Mongoose) or PostgreSQL (with Sequelize), rate-limiting, security middleware (Helmet, CORS), custom logging, Swagger API documentation, Jest testing, ESLint (Airbnb style), Prettier formatting, and Docker support with database services.
4
-
5
- **NEW**: Now includes a "No Database" option for APIs that don't require database persistence - perfect for microservices, proxy servers, or computational APIs.
6
-
7
- ## Features
8
-
9
- - Generates Express apps with a clean structure (src/server.js, src/app.js, src/routes, etc.)
10
- - **Three database options**: MongoDB (Mongoose), PostgreSQL (Sequelize), or No Database
11
- - Includes JWT-based authentication with register, login, refresh tokens, and logout (database modes)
12
- - Provides security (Helmet, CORS, rate-limiting), logging (Morgan, custom logger), and Swagger UI
13
- - Sets up Jest/Supertest for testing, ESLint for code quality, and Prettier for formatting
14
- - **Automatic post-generation cleanup** - runs `eslint --fix` and Prettier formatting
15
- - **Zero linting errors out of the box** - generated code is production-ready immediately
16
- - Docker configuration with database services for easy deployment
17
- - User-friendly CLI with input validation and detailed output
18
-
19
- ## Installation
20
-
21
- Install express-genix globally from npm to use it anywhere:
22
-
23
- ```bash
24
- npm install -g express-genix
25
- ```
26
-
27
- Alternatively, use it directly with npx without installation:
28
-
29
- ```bash
30
- npx express-genix init
31
- ```
32
-
33
- ## Usage
34
-
35
- Run the CLI to generate a new Express project:
36
-
37
- ```bash
38
- express-genix init
39
- ```
40
-
41
- Or with npx:
42
-
43
- ```bash
44
- npx express-genix init
45
- ```
46
-
47
- ### Prompts
48
-
49
- - **Project name**: Enter a name (letters, numbers, hyphens, underscores; default: my-express-app)
50
- - **Database**: Choose from:
51
- - **MongoDB (with Mongoose)** - Full authentication system with JWT
52
- - **PostgreSQL (with Sequelize)** - Full authentication system with JWT
53
- - **No Database (API without database)** - Example CRUD API with in-memory storage
54
-
55
- The CLI creates a project directory, generates files, installs dependencies, and **automatically formats and lints the code**.
56
-
57
- Navigate to the generated project (e.g., `cd my-express-app`) and run:
58
-
59
- ```bash
60
- npm run dev
61
- ```
62
-
63
- Visit `http://localhost:3000/api-docs` for Swagger documentation or `http://localhost:3000/health` for health checks.
64
-
65
- ### Generated Project Features
66
-
67
- **All Projects Include:**
68
- - Rate limiting, security middleware, logging
69
- - Swagger API documentation with OpenAPI 3.0
70
- - Jest testing with coverage
71
- - ESLint (Airbnb) + Prettier formatting
72
- - Docker support with clustering
73
- - Health checks and structured logging
74
-
75
- **Database Projects Include:**
76
- - **Authentication**: `/api/auth/register`, `/api/auth/login`, `/api/auth/refresh`, `/api/auth/logout`
77
- - **User Management**: `/api/users/profile` (GET, PUT, DELETE)
78
- - **Features**: JWT with refresh tokens, password hashing (bcrypt)
79
-
80
- **No-Database Projects Include:**
81
- - **Example API**: `/api/examples` (GET, POST, PUT, DELETE) with in-memory storage
82
- - **Perfect for**: Microservices, proxy servers, computational APIs
83
-
84
- ### CLI Options
85
-
86
- ```bash
87
- express-genix init --skip-cleanup # Skip automatic formatting (for debugging)
88
- ```
89
-
90
- ## Project Structure
91
-
92
- ### CLI Structure
93
- ```
94
- express-genix/
95
- ├── index.js # Main CLI entry point
96
- ├── package.json # CLI package configuration
97
- ├── README.md # This documentation
98
- ├── lib/
99
- │ ├── cleanup.js # Post-generation cleanup functions
100
- │ ├── generator.js # File generation logic
101
- │ └── utils.js # Utility functions
102
- └── templates/
103
- ├── core/ # Core files (app.js, server.js, etc.)
104
- ├── config/ # Configuration files
105
- ├── controllers/ # Route handlers
106
- ├── middleware/ # Custom middleware
107
- ├── models/ # Database models
108
- ├── routes/ # API routes
109
- ├── services/ # Business logic
110
- ├── utils/ # Utilities
111
- └── tests/ # Test files
112
- ```
113
-
114
- ### Generated Express App Structure
115
- ```
116
- ├── src/
117
- ├── config/ # Database and Swagger configurations
118
- ├── controllers/ # Request handlers and business logic
119
- ├── middleware/ # Custom middleware (auth, validation, errors)
120
- ├── models/ # Database models (if using database)
121
- │ ├── routes/ # API route definitions
122
- │ ├── services/ # Business logic layer
123
- │ ├── utils/ # Utility functions and helpers
124
- │ ├── app.js # Express app setup with middleware
125
- │ └── server.js # Server entry point with clustering
126
- ├── tests/ # Jest tests for endpoints
127
- ├── .env # Environment variables
128
- ├── .eslintrc.json # ESLint configuration
129
- ├── .prettierrc # Prettier configuration
130
- ├── Dockerfile # Docker configuration
131
- ├── docker-compose.yml # Docker services (app + database)
132
- └── package.json # Dependencies and scripts
133
- ```
134
-
135
- ## Available Scripts (Generated Project)
136
-
137
- - `npm run dev` - Start development server with nodemon
138
- - `npm start` - Start production server with clustering
139
- - `npm test` - Run Jest tests with coverage
140
- - `npm run lint` - Run ESLint checks
141
- - `npm run lint:fix` - Fix ESLint issues automatically
142
- - `npm run format` - Format code with Prettier
143
- - `npm run format:check` - Check code formatting
144
-
145
- ## Contributing
146
-
147
- To contribute to express-genix:
148
-
149
- 1. **Fork and Clone**:
150
- ```bash
151
- git clone <your-fork-url>
152
- cd express-genix
153
- ```
154
-
155
- 2. **Install Dependencies**:
156
- ```bash
157
- npm install
158
- ```
159
-
160
- 3. **Make Changes**:
161
- - Update templates in `templates/` directory
162
- - Modify generation logic in `lib/generator.js`
163
- - Follow Airbnb JavaScript style
164
- - Test changes locally: `node index.js init`
165
- - Verify generated projects have zero linting errors
166
-
167
- 4. **Submit a Pull Request**:
168
- - Push changes and submit a PR with a clear description
169
- - Include test results showing the generated project works correctly
170
-
171
- ## Version History
172
-
173
- - **v1.1.0**: Added "No Database" option and template-based architecture with EJS
174
- - **v1.0.1**: Added automatic post-generation cleanup with Prettier and ESLint auto-fix
175
- - **v1.0.0**: Initial release with Express boilerplate generation
176
-
177
- ## Publishing to npm
178
-
179
- To publish express-genix to npm, follow these steps from the CLI's root directory:
180
-
181
- ### 1. Prepare the Project
182
-
183
- Ensure all template files are in place in the `templates/` directory structure.
184
-
185
- Verify `package.json` is configured correctly:
186
-
187
- ```json
188
- {
189
- "name": "express-genix",
190
- "version": "1.1.0",
191
- "description": "Production-grade CLI to generate Express apps with JWT, DB, rate-limiting, automatic formatting, and more",
192
- "main": "index.js",
193
- "bin": {
194
- "express-genix": "./index.js"
195
- },
196
- "dependencies": {
197
- "commander": "^12.1.0",
198
- "inquirer": "^10.2.0",
199
- "ejs": "^3.1.9"
200
- }
201
- }
202
- ```
203
-
204
- ### 2. Test Locally
205
-
206
- Run the CLI to ensure it generates working, properly formatted projects for all three database options:
207
-
208
- ```bash
209
- node index.js init
210
- ```
211
-
212
- Test each option:
213
- - MongoDB with authentication
214
- - PostgreSQL with authentication
215
- - No database with example API
216
-
217
- ### 3. Publish
218
-
219
- Login to npm and publish:
220
-
221
- ```bash
222
- npm login
223
- npm publish --access public
224
- ```
225
-
226
- ### 4. Verify
227
-
228
- Test the published package:
229
-
230
- ```bash
231
- npx express-genix init
232
- # Should generate a project with zero linting errors
233
- ```
234
-
235
- ## Troubleshooting
236
-
237
- ### Publishing Issues
238
-
239
- - **Name Conflict**: If `express-genix` is taken, use a scoped name like `@yourname/express-genix`
240
- - **Authentication Error**: Verify with `npm whoami`, re-login if needed
241
- - **Permission Issues**: Move project to a directory with full write access
242
-
243
- ### Generated Project Issues
244
-
245
- - **Dependency Errors**: Run `npm cache clean --force && npm install`
246
- - **Database Connection**: Ensure MongoDB/PostgreSQL is running and connection strings are correct
247
- - **Linting Issues**: Run `npm run lint:fix && npm run format` to resolve formatting
248
-
249
- ## License
250
-
251
- MIT License
252
-
253
- Copyright (c) 2025 Joshua Maeba Nyamasege
254
-
255
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
256
-
257
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
258
-
259
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ # Express-Genix
2
+
3
+ A production-grade CLI tool that generates Express.js applications with best-in-class defaults. Scaffold a complete REST API in seconds with TypeScript, authentication, Prisma/Mongoose/Sequelize, Docker, CI/CD, and more.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/express-genix.svg)](https://www.npmjs.com/package/express-genix)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)
8
+
9
+ ## Features
10
+
11
+ **Languages & ORMs**
12
+ - JavaScript or TypeScript
13
+ - MongoDB (Mongoose), PostgreSQL (Sequelize), PostgreSQL (Prisma), or no database
14
+ - Sequelize CLI migrations for PostgreSQL, Prisma migrations ready out of the box
15
+
16
+ **Security & Auth**
17
+ - JWT access + refresh tokens with token blacklist logout
18
+ - Optional Redis-backed blacklist for production multi-instance deployments
19
+ - bcrypt password hashing, input sanitization (`validator`)
20
+ - Helmet, CORS, environment validation on startup
21
+ - Auto-generated cryptographically secure JWT secrets
22
+
23
+ **API & Documentation**
24
+ - Swagger UI + swagger-jsdoc annotation-based docs
25
+ - Consistent `{ success, data, meta }` response envelope
26
+ - Paginated list endpoints
27
+ - Request ID / correlation tracking
28
+
29
+ **Developer Experience**
30
+ - Interactive prompts — pick language, database, features via checkbox
31
+ - Winston or Pino logger (you choose)
32
+ - ESLint (Airbnb) + Prettier pre-configured
33
+ - Jest + Supertest with coverage
34
+ - Rate limiting with configurable window/max
35
+
36
+ **Production Ready**
37
+ - Docker & Docker Compose (multi-stage, non-root user)
38
+ - GitHub Actions CI/CD (matrix testing, DB services)
39
+ - Node.js clustering with graceful shutdown
40
+ - Rollback on generation failure
41
+ - Git init + initial commit
42
+
43
+ **Post-Init**
44
+ - `express-genix add <feature>` — bolt on auth, websocket, docker, cicd, or prisma to an existing project
45
+
46
+ ## Quick Start
47
+
48
+ ### Install globally
49
+
50
+ ```bash
51
+ npm install -g express-genix
52
+ ```
53
+
54
+ Or use with npx:
55
+
56
+ ```bash
57
+ npx express-genix init
58
+ ```
59
+
60
+ ### Create a project
61
+
62
+ ```bash
63
+ express-genix init
64
+ ```
65
+
66
+ You'll be prompted for:
67
+
68
+ 1. **Project name**
69
+ 2. **Language** JavaScript or TypeScript
70
+ 3. **Database** MongoDB, PostgreSQL (Sequelize), PostgreSQL (Prisma), or None
71
+ 4. **Features** Auth, Rate Limiting, Swagger, Redis Token Blacklist, Docker, CI/CD, WebSocket, Request ID
72
+ 5. **Logger** Winston or Pino
73
+
74
+ The CLI generates your project, installs dependencies, formats code, and creates an initial git commit.
75
+
76
+ ### Run it
77
+
78
+ ```bash
79
+ cd my-express-app
80
+ npm run dev
81
+ ```
82
+
83
+ - **API**: http://localhost:3000/api
84
+ - **Swagger Docs**: http://localhost:3000/api-docs
85
+ - **Health Check**: http://localhost:3000/health
86
+
87
+ ## Add features to an existing project
88
+
89
+ ```bash
90
+ cd my-express-app
91
+ express-genix add docker # Adds Dockerfile, docker-compose.yml, .dockerignore
92
+ express-genix add cicd # Adds GitHub Actions CI workflow
93
+ express-genix add auth # Adds JWT auth, controllers, routes, middleware
94
+ express-genix add websocket # Adds Socket.io setup
95
+ express-genix add prisma # Adds Prisma schema, client config, migrations
96
+ ```
97
+
98
+ ## Generated Project Structure
99
+
100
+ ```
101
+ my-express-app/
102
+ ├── src/
103
+ ├── config/ # Database, Swagger, WebSocket configuration
104
+ ├── controllers/ # Route handlers
105
+ ├── middleware/ # Auth, validation, error handling, request ID
106
+ ├── models/ # Database models (Mongoose/Sequelize)
107
+ ├── routes/ # API route definitions with Swagger annotations
108
+ ├── services/ # Business logic layer
109
+ ├── utils/ # Logger, errors, response helpers, validators
110
+ ├── app.js|ts # Express app setup
111
+ └── server.js|ts # Server + clustering + WebSocket
112
+ ├── tests/ # Jest + Supertest suites
113
+ ├── prisma/ # Prisma schema (if selected)
114
+ ├── migrations/ # Sequelize migrations (if PostgreSQL + Sequelize)
115
+ ├── seeders/ # Sequelize seeders (if PostgreSQL + Sequelize)
116
+ ├── .github/workflows/ # CI/CD pipeline (if selected)
117
+ ├── .env # Auto-generated environment config
118
+ ├── .env.example # Template for team sharing
119
+ ├── Dockerfile # Multi-stage Docker build (if selected)
120
+ ├── docker-compose.yml # Full stack compose (if selected)
121
+ └── package.json
122
+ ```
123
+
124
+ ## API Endpoints (with database + auth)
125
+
126
+ ### Authentication
127
+ | Method | Endpoint | Description |
128
+ |--------|----------|-------------|
129
+ | POST | `/api/auth/register` | Register a new user |
130
+ | POST | `/api/auth/login` | Login (returns access + refresh tokens) |
131
+ | POST | `/api/auth/refresh` | Refresh access token |
132
+ | POST | `/api/auth/logout` | Logout (blacklists token) |
133
+
134
+ ### Users (protected)
135
+ | Method | Endpoint | Description |
136
+ |--------|----------|-------------|
137
+ | GET | `/api/users/profile` | Get current user |
138
+ | PUT | `/api/users/profile` | Update profile |
139
+ | DELETE | `/api/users/profile` | Delete account |
140
+
141
+ ### Health
142
+ | Method | Endpoint | Description |
143
+ |--------|----------|-------------|
144
+ | GET | `/health` | Health check with uptime + DB status |
145
+
146
+ ## Available Scripts
147
+
148
+ ```bash
149
+ npm run dev # Development server with auto-reload
150
+ npm start # Production server with clustering
151
+ npm test # Run tests with coverage
152
+ npm run lint # Check ESLint
153
+ npm run lint:fix # Auto-fix ESLint issues
154
+ npm run format # Format with Prettier
155
+ npm run format:check # Verify formatting
156
+ npm run build # Compile TypeScript (TS projects only)
157
+ npm run db:migrate # Run Sequelize migrations (PostgreSQL)
158
+ npm run db:migrate:undo # Undo last migration
159
+ npm run prisma:migrate # Run Prisma migrations
160
+ npm run prisma:studio # Open Prisma Studio
161
+ ```
162
+
163
+ ## CLI Options
164
+
165
+ ```bash
166
+ express-genix init --skip-install # Skip npm install (useful for CI)
167
+ express-genix init --skip-cleanup # Skip auto-formatting (for debugging)
168
+ express-genix add <feature> # Add feature to existing project
169
+ ```
170
+
171
+ ## Environment Variables
172
+
173
+ Generated `.env` includes auto-generated JWT secrets:
174
+
175
+ | Variable | Description | Default |
176
+ |----------|-------------|---------|
177
+ | `NODE_ENV` | Environment | `development` |
178
+ | `PORT` | Server port | `3000` |
179
+ | `CORS_ORIGIN` | Allowed origins | `*` |
180
+ | `JWT_SECRET` | Access token secret (auto-generated) | — |
181
+ | `JWT_REFRESH_SECRET` | Refresh token secret (auto-generated) | — |
182
+ | `MONGO_URI` / `DATABASE_URL` | Database connection string | — |
183
+ | `REDIS_URL` | Redis URL (when Redis blacklist enabled) | `redis://localhost:6379` |
184
+ | `RATE_LIMIT_WINDOW_MS` | Rate limit window (ms) | `900000` |
185
+ | `RATE_LIMIT_MAX` | Max requests per window | `100` |
186
+ | `LOG_LEVEL` | Logging level | `info` |
187
+
188
+ ## Docker
189
+
190
+ ```bash
191
+ docker-compose up --build
192
+ ```
193
+
194
+ ## Contributing
195
+
196
+ Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details.
197
+
198
+ ## License
199
+
200
+ MIT © [Joshua Maeba Nyamasege](LICENSE)
201
+
202
+ ## Changelog
203
+
204
+ See [CHANGELOG.md](CHANGELOG.md) for version history.