@sundaysf/cli-v2 0.0.4 → 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 (50) hide show
  1. package/README.md +178 -178
  2. package/dist/README.md +178 -178
  3. package/dist/bin/generators/class.js.map +1 -1
  4. package/dist/bin/generators/postman.js.map +1 -1
  5. package/dist/bin/index.js.map +1 -1
  6. package/dist/templates/backend/.env.example +13 -13
  7. package/dist/templates/backend/.prettierignore +2 -2
  8. package/dist/templates/backend/Dockerfile +14 -14
  9. package/dist/templates/backend/README.md +18 -18
  10. package/dist/templates/backend/src/app.ts +34 -34
  11. package/dist/templates/backend/src/common/utils/environment.resolver.ts +3 -3
  12. package/dist/templates/backend/src/common/utils/version.resolver.ts +4 -4
  13. package/dist/templates/backend/src/controllers/health/health.controller.ts +23 -23
  14. package/dist/templates/backend/src/routes/health/health.router.ts +16 -16
  15. package/dist/templates/backend/src/routes/index.ts +57 -57
  16. package/dist/templates/backend/src/server.ts +16 -16
  17. package/dist/templates/backend/src/types.d.ts +10 -10
  18. package/dist/templates/backend-db-sql/.env.example +14 -13
  19. package/dist/templates/backend-db-sql/.prettierignore +2 -2
  20. package/dist/templates/backend-db-sql/Dockerfile +17 -17
  21. package/dist/templates/backend-db-sql/README.md +34 -34
  22. package/dist/templates/backend-db-sql/db/knexfile.ts +33 -33
  23. package/dist/templates/backend-db-sql/db/migrations/001_create_sundays_package_version.ts +12 -12
  24. package/dist/templates/backend-db-sql/db/seeds/001_sundays_package_version_seed.ts +10 -10
  25. package/dist/templates/backend-db-sql/db/src/KnexConnection.ts +74 -74
  26. package/dist/templates/backend-db-sql/db/src/d.types.ts +18 -18
  27. package/dist/templates/backend-db-sql/db/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  28. package/dist/templates/backend-db-sql/db/src/index.ts +9 -9
  29. package/dist/templates/backend-db-sql/db/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  30. package/dist/templates/backend-db-sql/db/tsconfig.json +16 -16
  31. package/dist/templates/backend-db-sql/src/app.ts +34 -34
  32. package/dist/templates/backend-db-sql/src/common/utils/environment.resolver.ts +3 -3
  33. package/dist/templates/backend-db-sql/src/common/utils/version.resolver.ts +4 -4
  34. package/dist/templates/backend-db-sql/src/controllers/health/health.controller.ts +23 -23
  35. package/dist/templates/backend-db-sql/src/routes/health/health.router.ts +16 -16
  36. package/dist/templates/backend-db-sql/src/routes/index.ts +57 -57
  37. package/dist/templates/backend-db-sql/src/server.ts +18 -18
  38. package/dist/templates/backend-db-sql/src/types.d.ts +10 -10
  39. package/dist/templates/db-sql/knexfile.ts +33 -33
  40. package/dist/templates/db-sql/migrations/001_create_sundays_package_version.ts +12 -12
  41. package/dist/templates/db-sql/seeds/001_sundays_package_version_seed.ts +10 -10
  42. package/dist/templates/db-sql/src/KnexConnection.ts +74 -74
  43. package/dist/templates/db-sql/src/d.types.ts +18 -18
  44. package/dist/templates/db-sql/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  45. package/dist/templates/db-sql/src/index.ts +9 -9
  46. package/dist/templates/db-sql/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  47. package/dist/templates/db-sql/tsconfig.json +16 -16
  48. package/dist/templates/module/CLAUDE.md +158 -158
  49. package/dist/templates/module/tsconfig.json +19 -19
  50. package/package.json +1 -1
package/dist/README.md CHANGED
@@ -1,178 +1,178 @@
1
- # 🚀 Sundays Framework - The Backend Architect's Dream
2
-
3
- > *"Why waste weekdays struggling with boilerplate when you can build like it's Sunday?"* - Paul Sundays
4
-
5
- Welcome to **Sundays Framework**, where backend development meets architectural elegance. Created by Paul Sundays, your personal backend architect, this framework transforms the way you build scalable, production-ready applications.
6
-
7
- ## 🌟 Why Sundays Framework?
8
-
9
- In a world of complex setups and endless configurations, Sundays Framework stands as your beacon of simplicity and power. We believe that great architecture shouldn't require a PhD to implement. That's why we've crafted every line of code with love, ensuring you spend less time configuring and more time creating.
10
-
11
- ### ✨ Features That Make Every Day Feel Like Sunday
12
-
13
- - **🏗️ Zero-Config Architecture**: Start building in seconds, not hours
14
- - **🎯 Type-Safe Everything**: TypeScript-first approach for bulletproof code
15
- - **⚡ Lightning Fast Setup**: From zero to API in under 60 seconds
16
- - **🔧 Smart Code Generation**: Controllers, routes, and DAOs created automagically
17
- - **📦 Production-Ready**: Docker, migrations, and best practices out of the box
18
- - **🎨 Clean Code Philosophy**: Because beautiful code is maintainable code
19
-
20
- ## 🎯 Quick Start - Your Sunday Begins Now
21
-
22
- Paul Sundays here! Let me guide you through the smoothest setup experience you've ever had. Choose your adventure:
23
-
24
- ### 🏃‍♂️ Backend API Template
25
- ```bash
26
- npx @sundaysf/cli --init --backend
27
- ```
28
- *Perfect for REST APIs, microservices, and full-stack backends*
29
-
30
- ### 🗄️ Database SQL Module
31
- ```bash
32
- npx @sundaysf/cli --init --db-sql
33
- ```
34
- *Ideal for database layers with Knex.js, migrations, and seeds*
35
-
36
- ### 📦 Basic Module Template
37
- ```bash
38
- npx @sundaysf/cli --init --module
39
- ```
40
- *Great for npm packages and shared libraries*
41
-
42
- > **Pro tip from Paul**: Each template comes pre-configured with everything you need. No more "how do I structure this?" moments!
43
- ## ⚙️ Configuration - Set It and Forget It
44
-
45
- After initialization, you'll find a `.env.example` file. Simply:
46
-
47
- ```bash
48
- cp .env.example .env
49
- ```
50
-
51
- Customize your environment variables, and you're ready to rock! The framework handles the rest with sensible defaults.
52
-
53
- ## 🎨 Magic Controller Generation
54
-
55
- Watch as Paul Sundays works his magic! Need a new feature? Let's create a controller with all CRUD operations in seconds:
56
-
57
- ```bash
58
- npm run create:controller
59
- ```
60
-
61
- ### What You Get:
62
- - ✅ **Full CRUD Operations**: GET, GET by UUID, CREATE, UPDATE, DELETE
63
- - ✅ **Type-Safe Routes**: Automatically generated with proper TypeScript types
64
- - ✅ **Postman Collection**: API documentation generated on the fly
65
- - ✅ **Best Practices**: Error handling, validation, and clean architecture
66
-
67
- > **Paul's Secret**: Each controller follows the same battle-tested patterns I've refined over years of Sunday coding sessions!
68
-
69
- ## 🛠️ Development Commands - Your Sunday Toolkit
70
-
71
- ### 🔥 Development Mode
72
- ```bash
73
- npm run start:dev
74
- ```
75
- *Hot-reloading enabled! Code like the wind, see changes instantly.*
76
-
77
- ### 🏗️ Build for Production
78
- ```bash
79
- npm run build
80
- ```
81
- *TypeScript → JavaScript transformation with optimization magic.*
82
-
83
- ### 🚀 Production Server
84
- ```bash
85
- npm run start
86
- ```
87
- *Battle-tested, production-ready, and blazing fast.*
88
-
89
- ### 🗄️ Database Commands (db-sql template)
90
- ```bash
91
- npm run migrate:create # Create a new migration
92
- npm run migrate:deploy # Run pending migrations
93
- npm run seed:create # Create a new seed file
94
- npm run seed:run # Populate your database
95
- ```
96
-
97
- ### 🎯 Code Quality
98
- ```bash
99
- npm run format # Prettier auto-formatting
100
- npm run lint # ESLint code analysis
101
- npm test # Run your test suite
102
- ```
103
-
104
- ## 🐳 Docker Support - Ship It Like a Pro
105
-
106
- Paul Sundays believes in shipping with confidence. That's why every backend template includes a production-ready Dockerfile!
107
-
108
- ### 📦 Build Your Container
109
- ```bash
110
- docker build -t my-sunday-api .
111
- ```
112
-
113
- ### 🚢 Launch to the Cloud
114
- ```bash
115
- docker run -p 3098:3098 my-sunday-api
116
- ```
117
-
118
- ### 🎯 Docker Compose Ready
119
- ```yaml
120
- version: '3.8'
121
- services:
122
- api:
123
- build: .
124
- ports:
125
- - "3098:3098"
126
- environment:
127
- - NODE_ENV=production
128
- volumes:
129
- - ./logs:/app/logs
130
- ```
131
-
132
- ## 🏗️ Project Structure - Organized Like Sunday Brunch
133
-
134
- ```
135
- your-project/
136
- ├── src/
137
- │ ├── controllers/ # Your business logic lives here
138
- │ ├── routes/ # RESTful route definitions
139
- │ ├── services/ # Reusable service layer
140
- │ ├── middlewares/ # Express middleware magic
141
- │ ├── dao/ # Data Access Objects (db-sql)
142
- │ └── interfaces/ # TypeScript interfaces
143
- ├── migrations/ # Database evolution scripts
144
- ├── seeds/ # Sample data for development
145
- ├── dist/ # Compiled production code
146
- └── postman.json # Auto-generated API docs
147
- ```
148
-
149
- ## 🎓 Philosophy - The Sunday Way
150
-
151
- **"Code on Sundays, Deploy on Mondays"**
152
-
153
- We believe that:
154
- - 🌟 **Simplicity is the ultimate sophistication**
155
- - 🎯 **Convention over configuration saves lives**
156
- - 🚀 **Developer experience is user experience**
157
- - 💪 **Great frameworks empower, not constrain**
158
-
159
- ## 🤝 Join the Sunday Revolution
160
-
161
- Created with ❤️ by Paul Sundays, your backend architect who believes every developer deserves tools that spark joy.
162
-
163
- ### 🌐 Connect with Paul
164
- - 📧 Feedback: Create an issue and let's make Sundays even better!
165
- - 🐛 Found a bug? You've discovered a weekday trying to sneak in!
166
- - 💡 Have an idea? Sunday brainstorming sessions are the best!
167
-
168
- ## 📜 License
169
-
170
- MIT License - Because Sundays are meant to be free!
171
-
172
- ---
173
-
174
- *Remember: When you code with Sundays Framework, every day feels like the weekend. Now go build something amazing!*
175
-
176
- **Happy Sunday Coding! 🎉**
177
-
178
- *- Paul Sundays, Your Backend Architect*
1
+ # 🚀 Sundays Framework - The Backend Architect's Dream
2
+
3
+ > *"Why waste weekdays struggling with boilerplate when you can build like it's Sunday?"* - Paul Sundays
4
+
5
+ Welcome to **Sundays Framework**, where backend development meets architectural elegance. Created by Paul Sundays, your personal backend architect, this framework transforms the way you build scalable, production-ready applications.
6
+
7
+ ## 🌟 Why Sundays Framework?
8
+
9
+ In a world of complex setups and endless configurations, Sundays Framework stands as your beacon of simplicity and power. We believe that great architecture shouldn't require a PhD to implement. That's why we've crafted every line of code with love, ensuring you spend less time configuring and more time creating.
10
+
11
+ ### ✨ Features That Make Every Day Feel Like Sunday
12
+
13
+ - **🏗️ Zero-Config Architecture**: Start building in seconds, not hours
14
+ - **🎯 Type-Safe Everything**: TypeScript-first approach for bulletproof code
15
+ - **⚡ Lightning Fast Setup**: From zero to API in under 60 seconds
16
+ - **🔧 Smart Code Generation**: Controllers, routes, and DAOs created automagically
17
+ - **📦 Production-Ready**: Docker, migrations, and best practices out of the box
18
+ - **🎨 Clean Code Philosophy**: Because beautiful code is maintainable code
19
+
20
+ ## 🎯 Quick Start - Your Sunday Begins Now
21
+
22
+ Paul Sundays here! Let me guide you through the smoothest setup experience you've ever had. Choose your adventure:
23
+
24
+ ### 🏃‍♂️ Backend API Template
25
+ ```bash
26
+ npx @sundaysf/cli --init --backend
27
+ ```
28
+ *Perfect for REST APIs, microservices, and full-stack backends*
29
+
30
+ ### 🗄️ Database SQL Module
31
+ ```bash
32
+ npx @sundaysf/cli --init --db-sql
33
+ ```
34
+ *Ideal for database layers with Knex.js, migrations, and seeds*
35
+
36
+ ### 📦 Basic Module Template
37
+ ```bash
38
+ npx @sundaysf/cli --init --module
39
+ ```
40
+ *Great for npm packages and shared libraries*
41
+
42
+ > **Pro tip from Paul**: Each template comes pre-configured with everything you need. No more "how do I structure this?" moments!
43
+ ## ⚙️ Configuration - Set It and Forget It
44
+
45
+ After initialization, you'll find a `.env.example` file. Simply:
46
+
47
+ ```bash
48
+ cp .env.example .env
49
+ ```
50
+
51
+ Customize your environment variables, and you're ready to rock! The framework handles the rest with sensible defaults.
52
+
53
+ ## 🎨 Magic Controller Generation
54
+
55
+ Watch as Paul Sundays works his magic! Need a new feature? Let's create a controller with all CRUD operations in seconds:
56
+
57
+ ```bash
58
+ npm run create:controller
59
+ ```
60
+
61
+ ### What You Get:
62
+ - ✅ **Full CRUD Operations**: GET, GET by UUID, CREATE, UPDATE, DELETE
63
+ - ✅ **Type-Safe Routes**: Automatically generated with proper TypeScript types
64
+ - ✅ **Postman Collection**: API documentation generated on the fly
65
+ - ✅ **Best Practices**: Error handling, validation, and clean architecture
66
+
67
+ > **Paul's Secret**: Each controller follows the same battle-tested patterns I've refined over years of Sunday coding sessions!
68
+
69
+ ## 🛠️ Development Commands - Your Sunday Toolkit
70
+
71
+ ### 🔥 Development Mode
72
+ ```bash
73
+ npm run start:dev
74
+ ```
75
+ *Hot-reloading enabled! Code like the wind, see changes instantly.*
76
+
77
+ ### 🏗️ Build for Production
78
+ ```bash
79
+ npm run build
80
+ ```
81
+ *TypeScript → JavaScript transformation with optimization magic.*
82
+
83
+ ### 🚀 Production Server
84
+ ```bash
85
+ npm run start
86
+ ```
87
+ *Battle-tested, production-ready, and blazing fast.*
88
+
89
+ ### 🗄️ Database Commands (db-sql template)
90
+ ```bash
91
+ npm run migrate:create # Create a new migration
92
+ npm run migrate:deploy # Run pending migrations
93
+ npm run seed:create # Create a new seed file
94
+ npm run seed:run # Populate your database
95
+ ```
96
+
97
+ ### 🎯 Code Quality
98
+ ```bash
99
+ npm run format # Prettier auto-formatting
100
+ npm run lint # ESLint code analysis
101
+ npm test # Run your test suite
102
+ ```
103
+
104
+ ## 🐳 Docker Support - Ship It Like a Pro
105
+
106
+ Paul Sundays believes in shipping with confidence. That's why every backend template includes a production-ready Dockerfile!
107
+
108
+ ### 📦 Build Your Container
109
+ ```bash
110
+ docker build -t my-sunday-api .
111
+ ```
112
+
113
+ ### 🚢 Launch to the Cloud
114
+ ```bash
115
+ docker run -p 3098:3098 my-sunday-api
116
+ ```
117
+
118
+ ### 🎯 Docker Compose Ready
119
+ ```yaml
120
+ version: '3.8'
121
+ services:
122
+ api:
123
+ build: .
124
+ ports:
125
+ - "3098:3098"
126
+ environment:
127
+ - NODE_ENV=production
128
+ volumes:
129
+ - ./logs:/app/logs
130
+ ```
131
+
132
+ ## 🏗️ Project Structure - Organized Like Sunday Brunch
133
+
134
+ ```
135
+ your-project/
136
+ ├── src/
137
+ │ ├── controllers/ # Your business logic lives here
138
+ │ ├── routes/ # RESTful route definitions
139
+ │ ├── services/ # Reusable service layer
140
+ │ ├── middlewares/ # Express middleware magic
141
+ │ ├── dao/ # Data Access Objects (db-sql)
142
+ │ └── interfaces/ # TypeScript interfaces
143
+ ├── migrations/ # Database evolution scripts
144
+ ├── seeds/ # Sample data for development
145
+ ├── dist/ # Compiled production code
146
+ └── postman.json # Auto-generated API docs
147
+ ```
148
+
149
+ ## 🎓 Philosophy - The Sunday Way
150
+
151
+ **"Code on Sundays, Deploy on Mondays"**
152
+
153
+ We believe that:
154
+ - 🌟 **Simplicity is the ultimate sophistication**
155
+ - 🎯 **Convention over configuration saves lives**
156
+ - 🚀 **Developer experience is user experience**
157
+ - 💪 **Great frameworks empower, not constrain**
158
+
159
+ ## 🤝 Join the Sunday Revolution
160
+
161
+ Created with ❤️ by Paul Sundays, your backend architect who believes every developer deserves tools that spark joy.
162
+
163
+ ### 🌐 Connect with Paul
164
+ - 📧 Feedback: Create an issue and let's make Sundays even better!
165
+ - 🐛 Found a bug? You've discovered a weekday trying to sneak in!
166
+ - 💡 Have an idea? Sunday brainstorming sessions are the best!
167
+
168
+ ## 📜 License
169
+
170
+ MIT License - Because Sundays are meant to be free!
171
+
172
+ ---
173
+
174
+ *Remember: When you code with Sundays Framework, every day feels like the weekend. Now go build something amazing!*
175
+
176
+ **Happy Sunday Coding! 🎉**
177
+
178
+ *- Paul Sundays, Your Backend Architect*
@@ -1 +1 @@
1
- {"version":3,"file":"class.js","names":["generateController","className","generateRouter","controllerClassName","controllerDirectoryName"],"sources":["bin/generators/class.js"],"mappings":"OAAO,MAAMA,mBAAsBC,GACV,wJAIFA,gwEAwEhB,MAAMC,eAAiB,CAACD,EAAWE,EAAqBC,IACtC,iEAEND,+BAAiDC,KAA2BA,0CAExEH,kEAEAG,qBAA2CD,wNAMpBC,iCAAuDA,oEAClDA,oCAA0DA,oEAC1DA,iCAAuDA,sEACrDA,gCAAsDA,gEAC5DA,iCAAuDA,uEAChDA,iCAAuDA","ignoreList":[],"sourcesContent":["export const generateController = (className) => {\r\n const classContent = `\r\n import { Request, Response, NextFunction } from 'express';\r\n import { IBaseController } from '../../types';\r\n\r\n export class ${className} implements IBaseController{\r\n\r\n public async getAll(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n // TODO: implement\r\n res.status(200).json({ success: true, data: [] });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n\r\n public async getByUuid(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n const { uuid } = req.params;\r\n // TODO: implement\r\n res.status(200).json({ success: true, data: null });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n\r\n public async update(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n const { uuid } = req.params;\r\n // TODO: implement\r\n res.status(200).json({ success: true, data: null });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n\r\n public async patch(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n const { uuid } = req.params;\r\n // TODO: implement\r\n res.status(200).json({ success: true, data: null });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n\r\n public async create(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n // TODO: implement\r\n res.status(201).json({ success: true, data: null });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n\r\n public async delete(req: Request, res: Response, next: NextFunction): Promise<void>{\r\n try{\r\n const { uuid } = req.params;\r\n // TODO: implement\r\n res.status(200).json({ success: true, data: null });\r\n }catch(err: unknown){\r\n next(err);\r\n }\r\n }\r\n }\r\n\r\n `\r\n return classContent;\r\n}\r\n\r\n/**\r\n *\r\n * @param {String} className\r\n * @param {String} controllerClassName\r\n * @param {String} controllerDirectoryName\r\n * @returns {String}\r\n */\r\nexport const generateRouter = (className, controllerClassName, controllerDirectoryName) => {\r\n const classContent = `\r\n import { Router } from 'express';\r\n import { ${controllerClassName} } from '../../controllers/${controllerDirectoryName}/${controllerDirectoryName}.controller';\r\n\r\n export class ${className}{\r\n private _router: Router;\r\n private _${controllerDirectoryName}Controller = new ${controllerClassName}();\r\n constructor(){\r\n this._router = Router();\r\n this.initRoutes();\r\n }\r\n private initRoutes(): void {\r\n this._router.get(\"/\", this._${controllerDirectoryName}Controller.getAll.bind(this._${controllerDirectoryName}Controller));\r\n this._router.get(\"/:uuid\", this._${controllerDirectoryName}Controller.getByUuid.bind(this._${controllerDirectoryName}Controller));\r\n this._router.put(\"/:uuid\", this._${controllerDirectoryName}Controller.update.bind(this._${controllerDirectoryName}Controller));\r\n this._router.patch(\"/:uuid\", this._${controllerDirectoryName}Controller.patch.bind(this._${controllerDirectoryName}Controller));\r\n this._router.post(\"/\", this._${controllerDirectoryName}Controller.create.bind(this._${controllerDirectoryName}Controller));\r\n this._router.delete(\"/:uuid\", this._${controllerDirectoryName}Controller.delete.bind(this._${controllerDirectoryName}Controller));\r\n }\r\n public get router(): Router {\r\n return this._router;\r\n }\r\n }\r\n\r\n `\r\n return classContent;\r\n}\r\n"]}
1
+ {"version":3,"file":"class.js","names":["generateController","className","generateRouter","controllerClassName","controllerDirectoryName"],"sources":["bin/generators/class.js"],"mappings":"OAAO,MAAMA,mBAAsBC,GACV,wJAIFA,gwEAwEhB,MAAMC,eAAiB,CAACD,EAAWE,EAAqBC,IACtC,iEAEND,+BAAiDC,KAA2BA,0CAExEH,kEAEAG,qBAA2CD,wNAMpBC,iCAAuDA,oEAClDA,oCAA0DA,oEAC1DA,iCAAuDA,sEACrDA,gCAAsDA,gEAC5DA,iCAAuDA,uEAChDA,iCAAuDA","ignoreList":[],"sourcesContent":["export const generateController = (className) => {\n const classContent = `\n import { Request, Response, NextFunction } from 'express';\n import { IBaseController } from '../../types';\n\n export class ${className} implements IBaseController{\n\n public async getAll(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n // TODO: implement\n res.status(200).json({ success: true, data: [] });\n }catch(err: unknown){\n next(err);\n }\n }\n\n public async getByUuid(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n const { uuid } = req.params;\n // TODO: implement\n res.status(200).json({ success: true, data: null });\n }catch(err: unknown){\n next(err);\n }\n }\n\n public async update(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n const { uuid } = req.params;\n // TODO: implement\n res.status(200).json({ success: true, data: null });\n }catch(err: unknown){\n next(err);\n }\n }\n\n public async patch(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n const { uuid } = req.params;\n // TODO: implement\n res.status(200).json({ success: true, data: null });\n }catch(err: unknown){\n next(err);\n }\n }\n\n public async create(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n // TODO: implement\n res.status(201).json({ success: true, data: null });\n }catch(err: unknown){\n next(err);\n }\n }\n\n public async delete(req: Request, res: Response, next: NextFunction): Promise<void>{\n try{\n const { uuid } = req.params;\n // TODO: implement\n res.status(200).json({ success: true, data: null });\n }catch(err: unknown){\n next(err);\n }\n }\n }\n\n `\n return classContent;\n}\n\n/**\n *\n * @param {String} className\n * @param {String} controllerClassName\n * @param {String} controllerDirectoryName\n * @returns {String}\n */\nexport const generateRouter = (className, controllerClassName, controllerDirectoryName) => {\n const classContent = `\n import { Router } from 'express';\n import { ${controllerClassName} } from '../../controllers/${controllerDirectoryName}/${controllerDirectoryName}.controller';\n\n export class ${className}{\n private _router: Router;\n private _${controllerDirectoryName}Controller = new ${controllerClassName}();\n constructor(){\n this._router = Router();\n this.initRoutes();\n }\n private initRoutes(): void {\n this._router.get(\"/\", this._${controllerDirectoryName}Controller.getAll.bind(this._${controllerDirectoryName}Controller));\n this._router.get(\"/:uuid\", this._${controllerDirectoryName}Controller.getByUuid.bind(this._${controllerDirectoryName}Controller));\n this._router.put(\"/:uuid\", this._${controllerDirectoryName}Controller.update.bind(this._${controllerDirectoryName}Controller));\n this._router.patch(\"/:uuid\", this._${controllerDirectoryName}Controller.patch.bind(this._${controllerDirectoryName}Controller));\n this._router.post(\"/\", this._${controllerDirectoryName}Controller.create.bind(this._${controllerDirectoryName}Controller));\n this._router.delete(\"/:uuid\", this._${controllerDirectoryName}Controller.delete.bind(this._${controllerDirectoryName}Controller));\n }\n public get router(): Router {\n return this._router;\n }\n }\n\n `\n return classContent;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"postman.js","names":["toCamel","uuidv4","generateBasePostman","projectName","baseData","info","_postman_id","name","schema","item","event","listen","script","type","packages","exec","variable","key","value","getItemFormatted","controllerDirectoryName","authBearer","bearer","makeUrl","pathSuffix","variables","raw","pathParts","push","replace","url","host","path","length","uuidVariable","jsonBody","mode","options","language","request","auth","method","header","response","body"],"sources":["bin/generators/postman.js"],"mappings":"OAASA,YAAe,+BACTC,WAAc,cAEtB,MAAMC,oBAAuBC,IAChC,MAAMC,EAAW,CAAC,EAyClB,OAxCAA,EAASC,KAAO,CACZC,YAAaL,SACbM,KAAMJ,EACNK,OAAQ,wEAEZJ,EAASK,KAAO,GAChBL,EAASM,MAAQ,CACb,CACIC,OAAU,aACVC,OAAU,CACNC,KAAQ,kBACRC,SAAY,CAAC,EACbC,KAAQ,CACJ,MAIZ,CACIJ,OAAU,OACVC,OAAU,CACNC,KAAQ,kBACRC,SAAY,CAAC,EACbC,KAAQ,CACJ,OAKhBX,EAASY,SAAW,CAChB,CACIC,IAAO,GAAGjB,QAAQG,gBAClBe,MAAS,0BACTL,KAAQ,UAEZ,CACII,IAAO,GAAGjB,QAAQG,gBAClBe,MAAS,UACTL,KAAQ,WAGTT,CAAQ,SASZ,MAAMe,iBAAmB,CAACC,EAAyBjB,KACtD,MAAMkB,EAAa,CACfR,KAAQ,SACRS,OAAU,CACN,CACIL,IAAO,QACPC,MAAS,KAAKlB,QAAQG,kBACtBU,KAAQ,YAKdU,EAAU,CAACC,EAAa,GAAIC,EAAY,MAC1C,MAAMC,EAAM,KAAK1B,QAAQG,uBAAiCiB,IAA0BI,IAC9EG,EAAY,CAAC,MAAOP,GACtBI,GAAYG,EAAUC,KAAKJ,EAAWK,QAAQ,IAAK,KAEvD,MAAMC,EAAM,CACRJ,MACAK,KAAQ,CAAC,KAAK/B,QAAQG,mBACtB6B,KAAQL,GAGZ,OADIF,EAAUQ,OAAS,IAAGH,EAAId,SAAWS,GAClCK,CAAG,EAGRI,EAAe,CAAC,CAAEjB,IAAO,OAAQC,MAAS,WAC1CiB,EAAW,CACbC,KAAQ,MACRV,IAAO,KACPW,QAAW,CAAEX,IAAO,CAAEY,SAAY,UAGtC,MAAO,CACH/B,KAAQa,EACRX,KAAQ,CACJ,CACIF,KAAQ,UACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVZ,IAAOP,KAEXoB,SAAY,IAEhB,CACIpC,KAAQ,cACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVZ,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,OACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,KAEXoB,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,QACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,QACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,SACVC,OAAU,GACVZ,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,KAGxB","ignoreList":[],"sourcesContent":["import { toCamel } from 'ts-case-convert';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport const generateBasePostman = (projectName) => {\r\n const baseData = {}\r\n baseData.info = {\r\n _postman_id: uuidv4(),\r\n name: projectName,\r\n schema: \"https://schema.getpostman.com/json/collection/v2.1.0/collection.json\"\r\n };\r\n baseData.item = [];\r\n baseData.event = [\r\n {\r\n \"listen\": \"prerequest\",\r\n \"script\": {\r\n \"type\": \"text/javascript\",\r\n \"packages\": {},\r\n \"exec\": [\r\n \"\"\r\n ]\r\n }\r\n },\r\n {\r\n \"listen\": \"test\",\r\n \"script\": {\r\n \"type\": \"text/javascript\",\r\n \"packages\": {},\r\n \"exec\": [\r\n \"\"\r\n ]\r\n }\r\n }\r\n ];\r\n baseData.variable = [\r\n {\r\n \"key\": `${toCamel(projectName)}BackendHost`,\r\n \"value\": \"http://localhost:<PORT>\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"key\": `${toCamel(projectName)}BearerToken`,\r\n \"value\": \"<token>\",\r\n \"type\": \"string\"\r\n }\r\n ];\r\n return baseData;\r\n}\r\n\r\n/**\r\n *\r\n * @param {String} controllerDirectoryName\r\n * @param {String} projectName\r\n * @returns {Object}\r\n */\r\nexport const getItemFormatted = (controllerDirectoryName, projectName) => {\r\n const authBearer = {\r\n \"type\": \"bearer\",\r\n \"bearer\": [\r\n {\r\n \"key\": \"token\",\r\n \"value\": `{{${toCamel(projectName)}BearerToken}}`,\r\n \"type\": \"string\"\r\n }\r\n ]\r\n };\r\n\r\n const makeUrl = (pathSuffix = '', variables = []) => {\r\n const raw = `{{${toCamel(projectName)}BackendHost}}/api/${controllerDirectoryName}${pathSuffix}`;\r\n const pathParts = [\"api\", controllerDirectoryName];\r\n if (pathSuffix) pathParts.push(pathSuffix.replace('/', ''));\r\n\r\n const url = {\r\n raw,\r\n \"host\": [`{{${toCamel(projectName)}BackendHost}}`],\r\n \"path\": pathParts\r\n };\r\n if (variables.length > 0) url.variable = variables;\r\n return url;\r\n };\r\n\r\n const uuidVariable = [{ \"key\": \"uuid\", \"value\": \"<uuid>\" }];\r\n const jsonBody = {\r\n \"mode\": \"raw\",\r\n \"raw\": \"{}\",\r\n \"options\": { \"raw\": { \"language\": \"json\" } }\r\n };\r\n\r\n return {\r\n \"name\": controllerDirectoryName,\r\n \"item\": [\r\n {\r\n \"name\": \"GET ALL\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"GET\",\r\n \"header\": [],\r\n \"url\": makeUrl()\r\n },\r\n \"response\": []\r\n },\r\n {\r\n \"name\": \"GET BY UUID\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"GET\",\r\n \"header\": [],\r\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\r\n },\r\n \"response\": []\r\n },\r\n {\r\n \"name\": \"CREATE\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"POST\",\r\n \"header\": [],\r\n \"body\": jsonBody,\r\n \"url\": makeUrl()\r\n },\r\n \"response\": []\r\n },\r\n {\r\n \"name\": \"UPDATE\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"PUT\",\r\n \"header\": [],\r\n \"body\": jsonBody,\r\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\r\n },\r\n \"response\": []\r\n },\r\n {\r\n \"name\": \"PATCH\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"PATCH\",\r\n \"header\": [],\r\n \"body\": jsonBody,\r\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\r\n },\r\n \"response\": []\r\n },\r\n {\r\n \"name\": \"DELETE\",\r\n \"request\": {\r\n \"auth\": authBearer,\r\n \"method\": \"DELETE\",\r\n \"header\": [],\r\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\r\n },\r\n \"response\": []\r\n }\r\n ]\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"postman.js","names":["toCamel","uuidv4","generateBasePostman","projectName","baseData","info","_postman_id","name","schema","item","event","listen","script","type","packages","exec","variable","key","value","getItemFormatted","controllerDirectoryName","authBearer","bearer","makeUrl","pathSuffix","variables","raw","pathParts","push","replace","url","host","path","length","uuidVariable","jsonBody","mode","options","language","request","auth","method","header","response","body"],"sources":["bin/generators/postman.js"],"mappings":"OAASA,YAAe,+BACTC,WAAc,cAEtB,MAAMC,oBAAuBC,IAChC,MAAMC,EAAW,CAAC,EAyClB,OAxCAA,EAASC,KAAO,CACZC,YAAaL,SACbM,KAAMJ,EACNK,OAAQ,wEAEZJ,EAASK,KAAO,GAChBL,EAASM,MAAQ,CACb,CACIC,OAAU,aACVC,OAAU,CACNC,KAAQ,kBACRC,SAAY,CAAC,EACbC,KAAQ,CACJ,MAIZ,CACIJ,OAAU,OACVC,OAAU,CACNC,KAAQ,kBACRC,SAAY,CAAC,EACbC,KAAQ,CACJ,OAKhBX,EAASY,SAAW,CAChB,CACIC,IAAO,GAAGjB,QAAQG,gBAClBe,MAAS,0BACTL,KAAQ,UAEZ,CACII,IAAO,GAAGjB,QAAQG,gBAClBe,MAAS,UACTL,KAAQ,WAGTT,CAAQ,SASZ,MAAMe,iBAAmB,CAACC,EAAyBjB,KACtD,MAAMkB,EAAa,CACfR,KAAQ,SACRS,OAAU,CACN,CACIL,IAAO,QACPC,MAAS,KAAKlB,QAAQG,kBACtBU,KAAQ,YAKdU,EAAU,CAACC,EAAa,GAAIC,EAAY,MAC1C,MAAMC,EAAM,KAAK1B,QAAQG,uBAAiCiB,IAA0BI,IAC9EG,EAAY,CAAC,MAAOP,GACtBI,GAAYG,EAAUC,KAAKJ,EAAWK,QAAQ,IAAK,KAEvD,MAAMC,EAAM,CACRJ,MACAK,KAAQ,CAAC,KAAK/B,QAAQG,mBACtB6B,KAAQL,GAGZ,OADIF,EAAUQ,OAAS,IAAGH,EAAId,SAAWS,GAClCK,CAAG,EAGRI,EAAe,CAAC,CAAEjB,IAAO,OAAQC,MAAS,WAC1CiB,EAAW,CACbC,KAAQ,MACRV,IAAO,KACPW,QAAW,CAAEX,IAAO,CAAEY,SAAY,UAGtC,MAAO,CACH/B,KAAQa,EACRX,KAAQ,CACJ,CACIF,KAAQ,UACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVZ,IAAOP,KAEXoB,SAAY,IAEhB,CACIpC,KAAQ,cACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVZ,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,OACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,KAEXoB,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,MACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,QACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,QACVC,OAAU,GACVE,KAAQT,EACRL,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,IAEhB,CACIpC,KAAQ,SACRgC,QAAW,CACPC,KAAQnB,EACRoB,OAAU,SACVC,OAAU,GACVZ,IAAOP,EAAQ,SAAUW,IAE7BS,SAAY,KAGxB","ignoreList":[],"sourcesContent":["import { toCamel } from 'ts-case-convert';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const generateBasePostman = (projectName) => {\n const baseData = {}\n baseData.info = {\n _postman_id: uuidv4(),\n name: projectName,\n schema: \"https://schema.getpostman.com/json/collection/v2.1.0/collection.json\"\n };\n baseData.item = [];\n baseData.event = [\n {\n \"listen\": \"prerequest\",\n \"script\": {\n \"type\": \"text/javascript\",\n \"packages\": {},\n \"exec\": [\n \"\"\n ]\n }\n },\n {\n \"listen\": \"test\",\n \"script\": {\n \"type\": \"text/javascript\",\n \"packages\": {},\n \"exec\": [\n \"\"\n ]\n }\n }\n ];\n baseData.variable = [\n {\n \"key\": `${toCamel(projectName)}BackendHost`,\n \"value\": \"http://localhost:<PORT>\",\n \"type\": \"string\"\n },\n {\n \"key\": `${toCamel(projectName)}BearerToken`,\n \"value\": \"<token>\",\n \"type\": \"string\"\n }\n ];\n return baseData;\n}\n\n/**\n *\n * @param {String} controllerDirectoryName\n * @param {String} projectName\n * @returns {Object}\n */\nexport const getItemFormatted = (controllerDirectoryName, projectName) => {\n const authBearer = {\n \"type\": \"bearer\",\n \"bearer\": [\n {\n \"key\": \"token\",\n \"value\": `{{${toCamel(projectName)}BearerToken}}`,\n \"type\": \"string\"\n }\n ]\n };\n\n const makeUrl = (pathSuffix = '', variables = []) => {\n const raw = `{{${toCamel(projectName)}BackendHost}}/api/${controllerDirectoryName}${pathSuffix}`;\n const pathParts = [\"api\", controllerDirectoryName];\n if (pathSuffix) pathParts.push(pathSuffix.replace('/', ''));\n\n const url = {\n raw,\n \"host\": [`{{${toCamel(projectName)}BackendHost}}`],\n \"path\": pathParts\n };\n if (variables.length > 0) url.variable = variables;\n return url;\n };\n\n const uuidVariable = [{ \"key\": \"uuid\", \"value\": \"<uuid>\" }];\n const jsonBody = {\n \"mode\": \"raw\",\n \"raw\": \"{}\",\n \"options\": { \"raw\": { \"language\": \"json\" } }\n };\n\n return {\n \"name\": controllerDirectoryName,\n \"item\": [\n {\n \"name\": \"GET ALL\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"GET\",\n \"header\": [],\n \"url\": makeUrl()\n },\n \"response\": []\n },\n {\n \"name\": \"GET BY UUID\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"GET\",\n \"header\": [],\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\n },\n \"response\": []\n },\n {\n \"name\": \"CREATE\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"POST\",\n \"header\": [],\n \"body\": jsonBody,\n \"url\": makeUrl()\n },\n \"response\": []\n },\n {\n \"name\": \"UPDATE\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"PUT\",\n \"header\": [],\n \"body\": jsonBody,\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\n },\n \"response\": []\n },\n {\n \"name\": \"PATCH\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"PATCH\",\n \"header\": [],\n \"body\": jsonBody,\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\n },\n \"response\": []\n },\n {\n \"name\": \"DELETE\",\n \"request\": {\n \"auth\": authBearer,\n \"method\": \"DELETE\",\n \"header\": [],\n \"url\": makeUrl(\"/:uuid\", uuidVariable)\n },\n \"response\": []\n }\n ]\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Command","inquirer","generateController","generateRouter","fs","path","fileURLToPath","exec","ora","generateBasePostman","getItemFormatted","__dirname","dirname","url","pkg","readJsonSync","join","program","version","option","parse","process","argv","options","opts","runFormatter","cwd","Promise","resolve","reject","formatProcess","stdout","on","data","write","stderr","code","Error","runNpmInstall","destDir","installProcess","initGitRepo","gitProcess","init","backend","module","dbSql","backendDbSql","console","log","prompt","type","name","message","validate","input","then","async","projectName","templateType","srcDir","dirName","packageJson","basename","existsSync","error","exit","toLowerCase","replace","mkdir","recursive","copy","overwrite","errorOnExist","filter","src","dest","err","description","main","scripts","test","format","build","clean","repository","author","license","bugs","homepage","devDependencies","eslint","globals","prettier","rimraf","typescript","dependencies","dotenv","knex","lodash","pg","uuid","start","morgan","cors","express","nodemon","types","writeJson","spaces","postmanBaseData","dbPackageJson","spinnerGit","succeed","spinner","outputMsg","createController","controllerName","nonCapitalized","charAt","slice","capitalized","toUpperCase","controllerClassName","controllerFileName","controllerDirectoryName","routerClassName","routerFileName","routerDirectoryName","controllerDir","routerDir","classControllerContentGenerator","classRouterContentGenerator","controllerPath","routerPath","writeFile","readFile","leanData","JSON","itemToPush","info","item","push","help"],"sources":["bin/index.js"],"mappings":"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","ignoreList":[],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport inquirer from 'inquirer';\r\nimport { generateController, generateRouter } from './generators/class.js';\r\nimport fs from 'fs-extra';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport { exec } from 'child_process';\r\nimport ora from 'ora';\r\nimport { generateBasePostman, getItemFormatted } from './generators/postman.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst pkg = fs.readJsonSync(path.join(__dirname, '../../package.json'));\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .version(pkg.version, '-v, --version')\r\n .option('--init', 'Initialize a new project')\r\n .option('--backend', 'Initialize with backend template')\r\n .option('--module', 'Initialize with module template')\r\n .option('--db-sql', 'Initialize with db-sql template')\r\n .option('--backend-db-sql', 'Initialize with backend + database template')\r\n .option('--create-controller', 'Create a controller and its associated route');\r\n\r\nprogram.parse(process.argv);\r\n\r\nconst options = program.opts();\r\n\r\nif (options.init && (options.backend || options.module || options.dbSql || options.backendDbSql)) {\r\n console.log(\"Hello! I'm Paul Sundays, your backend architect. Let's craft an awesome backend together!\");\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'projectName',\r\n message: 'Name of the project:',\r\n validate: input => input ? true : 'The name of the project can not be empty'\r\n }\r\n ]).then(async ({ projectName }) => {\r\n const templateType = options.backend ? 'backend' : options.backendDbSql ? 'backend-db-sql' : options.module ? 'module' : 'db-sql';\r\n const srcDir = path.join(__dirname, `../templates/${templateType}`);\r\n\r\n let destDir;\r\n let dirName;\r\n if (projectName === '.') {\r\n destDir = path.resolve('.');\r\n dirName = path.basename(destDir);\r\n if (fs.existsSync(path.join(destDir, 'package.json'))) {\r\n console.error('A package.json already exists in the current directory.');\r\n process.exit(1);\r\n }\r\n } else {\r\n dirName = projectName.toLowerCase().replace(/\\s+/g, '-');\r\n destDir = path.resolve(dirName);\r\n if (fs.existsSync(destDir)) {\r\n console.error(`Directory \"${dirName}\" already exists.`);\r\n process.exit(1);\r\n }\r\n await fs.mkdir(destDir, { recursive: true });\r\n }\r\n\r\n try {\r\n await fs.copy(srcDir, destDir, {\r\n overwrite: false,\r\n errorOnExist: true,\r\n filter: (src, dest) => {\r\n return true;\r\n }\r\n });\r\n console.log('Template files copied successfully');\r\n } catch (err) {\r\n console.error('Error copying the files:', err);\r\n process.exit(1);\r\n }\r\n\r\n let packageJson;\r\n if (templateType === 'db-sql') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"0.0.1\",\r\n description: \"Knex Module\",\r\n main: \"dist/index.js\",\r\n scripts: {\r\n test: \"jest\",\r\n format: \"prettier --write .\",\r\n build: \"tsc\",\r\n clean: \"rimraf dist && npm run format && npm run build\",\r\n \"npm:publish\": \"npm run clean && npm publish\",\r\n \"migrate:create\": \"knex migrate:make migration -x ts\",\r\n \"migrate:deploy\": \"knex migrate:latest\",\r\n \"seed:create\": \"knex seed:make seed -x ts\",\r\n \"seed:run\": \"knex seed:run\"\r\n },\r\n repository: {\r\n type: \"git\",\r\n url: \"\"\r\n },\r\n author: \"\",\r\n license: \"MIT\",\r\n bugs: {\r\n url: \"\"\r\n },\r\n homepage: \"\",\r\n devDependencies: {\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"@types/node\": \"^22.13.13\",\r\n eslint: \"^9.23.0\",\r\n globals: \"^16.0.0\",\r\n prettier: \"^3.5.3\",\r\n rimraf: \"^6.0.1\",\r\n \"ts-node\": \"^10.9.2\",\r\n typescript: \"^5.8.2\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n dependencies: {\r\n dotenv: \"^16.4.7\",\r\n knex: \"^3.1.0\",\r\n lodash: \"^4.17.21\",\r\n pg: \"^8.14.1\",\r\n uuid: \"^11.1.0\"\r\n }\r\n };\r\n } else if (templateType === 'backend') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Backend project generated with Sundays Framework`,\r\n main: \"dist/server.js\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"start\": \"node dist/server.js\",\r\n \"build\": \"tsc\",\r\n \"start:dev\": \"nodemon src/server.ts\",\r\n \"format\": \"prettier --write .\",\r\n \"create:controller\": \"sundaysf --create-controller\"\r\n },\r\n dependencies: {\r\n \"morgan\": \"^1.10.0\",\r\n \"cors\": \"^2.8.5\",\r\n \"dotenv\": \"^16.4.7\",\r\n \"express\": \"^4.18.2\"\r\n },\r\n devDependencies: {\r\n \"@types/morgan\": \"^1.9.9\",\r\n \"@types/cors\": \"^2.8.17\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"nodemon\": \"^3.0.2\",\r\n \"prettier\": \"^3.5.3\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"typescript\": \"^5.8.2\",\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"eslint\": \"^9.23.0\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n } else if (templateType === 'backend-db-sql') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Backend project with database module generated with Sundays Framework`,\r\n main: \"dist/server.js\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"start\": \"node dist/server.js\",\r\n \"build\": \"tsc\",\r\n \"start:dev\": \"nodemon src/server.ts\",\r\n \"format\": \"prettier --write .\",\r\n \"create:controller\": \"sundaysf --create-controller\",\r\n \"migrate:create\": \"knex migrate:make migration -x ts --knexfile db/knexfile.ts\",\r\n \"migrate:deploy\": \"knex migrate:latest --knexfile db/knexfile.ts\",\r\n \"seed:create\": \"knex seed:make seed -x ts --knexfile db/knexfile.ts\",\r\n \"seed:run\": \"knex seed:run --knexfile db/knexfile.ts\",\r\n \"db:build\": \"tsc -p db/tsconfig.json\",\r\n \"db:publish\": \"cd db && npm publish\"\r\n },\r\n dependencies: {\r\n \"morgan\": \"^1.10.0\",\r\n \"cors\": \"^2.8.5\",\r\n \"dotenv\": \"^16.4.7\",\r\n \"express\": \"^4.18.2\",\r\n \"knex\": \"^3.1.0\",\r\n \"lodash\": \"^4.17.21\",\r\n \"pg\": \"^8.14.1\",\r\n \"uuid\": \"^11.1.0\"\r\n },\r\n devDependencies: {\r\n \"@types/morgan\": \"^1.9.9\",\r\n \"@types/cors\": \"^2.8.17\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"@types/lodash\": \"^4.17.16\",\r\n \"@types/node\": \"^22.13.13\",\r\n \"nodemon\": \"^3.0.2\",\r\n \"prettier\": \"^3.5.3\",\r\n \"rimraf\": \"^6.0.1\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"typescript\": \"^5.8.2\",\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"eslint\": \"^9.23.0\",\r\n \"globals\": \"^16.0.0\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n } else {\r\n // module\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Module generated with Sundays Framework`,\r\n main: \"dist/index.js\",\r\n types: \"dist/index.d.ts\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"build\": \"tsc\",\r\n \"format\": \"prettier --write .\",\r\n \"clean\": \"rimraf dist && npm run build\"\r\n },\r\n dependencies: {},\r\n devDependencies: {\r\n \"prettier\": \"^3.5.3\",\r\n \"rimraf\": \"^6.0.1\",\r\n \"typescript\": \"^5.8.2\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n }\r\n\r\n await fs.writeJson(path.join(destDir, 'package.json'), packageJson, { spaces: 2 });\r\n\r\n if (templateType === 'backend' || templateType === 'backend-db-sql') {\r\n const postmanBaseData = generateBasePostman(projectName);\r\n await fs.writeJson(path.join(destDir, 'postman.json'), postmanBaseData, { spaces: 2 });\r\n }\r\n\r\n if (templateType === 'backend-db-sql') {\r\n const dbPackageJson = {\r\n name: `${dirName}-db`,\r\n version: \"0.0.1\",\r\n description: \"Database module\",\r\n main: \"dist/index.js\",\r\n types: \"dist/index.d.ts\",\r\n scripts: {\r\n build: \"tsc\",\r\n clean: \"rimraf dist && npm run build\",\r\n format: \"prettier --write .\",\r\n \"npm:publish\": \"npm run clean && npm publish\",\r\n \"migrate:create\": \"knex migrate:make migration -x ts\",\r\n \"migrate:deploy\": \"knex migrate:latest\",\r\n \"seed:create\": \"knex seed:make seed -x ts\",\r\n \"seed:run\": \"knex seed:run\"\r\n },\r\n dependencies: {\r\n dotenv: \"^16.4.7\",\r\n knex: \"^3.1.0\",\r\n lodash: \"^4.17.21\",\r\n pg: \"^8.14.1\",\r\n uuid: \"^11.1.0\"\r\n },\r\n devDependencies: {\r\n typescript: \"^5.8.2\",\r\n \"ts-node\": \"^10.9.2\",\r\n rimraf: \"^6.0.1\",\r\n prettier: \"^3.5.3\",\r\n \"@types/node\": \"^22.13.13\"\r\n }\r\n };\r\n await fs.writeJson(path.join(destDir, 'db/package.json'), dbPackageJson, { spaces: 2 });\r\n }\r\n\r\n const spinnerGit = ora('Git init...').start();\r\n await initGitRepo(destDir);\r\n spinnerGit.succeed('Git initialized');\r\n\r\n const spinner = ora('Installing dependencies...').start();\r\n await runNpmInstall(destDir);\r\n spinner.succeed('Dependencies installed');\r\n\r\n await runFormatter(destDir);\r\n const outputMsg = projectName === '.' ? `Project created successfully in current directory` : `Project '${projectName}' created successfully in ./${dirName}`;\r\n console.log(outputMsg);\r\n });\r\n} else if (options.createController) {\r\n // Verify we're inside a backend project\r\n if (!fs.existsSync('./src/controllers') || !fs.existsSync('./postman.json')) {\r\n console.error('This command must be run inside a Sundays backend project.');\r\n console.error('Expected ./src/controllers/ and ./postman.json to exist.');\r\n process.exit(1);\r\n }\r\n\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'controllerName',\r\n message: 'Controller name:',\r\n validate: input => {\r\n if (!input) return 'The controller name is empty';\r\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\r\n return 'Name must start with a letter and contain only letters and numbers';\r\n }\r\n return true;\r\n }\r\n }\r\n ]).then(async ({ controllerName }) => {\r\n try {\r\n const nonCapitalized = controllerName.charAt(0).toLowerCase() + controllerName.slice(1);\r\n const capitalized = controllerName.charAt(0).toUpperCase() + controllerName.slice(1);\r\n const controllerClassName = `${capitalized}Controller`;\r\n const controllerFileName = `${nonCapitalized}.controller.ts`;\r\n const controllerDirectoryName = `${nonCapitalized}`;\r\n const routerClassName = `${capitalized}Router`;\r\n const routerFileName = `${nonCapitalized}.router.ts`;\r\n const routerDirectoryName = `${nonCapitalized}`;\r\n\r\n const controllerDir = `./src/controllers/${controllerDirectoryName}`;\r\n const routerDir = `./src/routes/${routerDirectoryName}`;\r\n\r\n if (fs.existsSync(controllerDir)) {\r\n console.error(`Controller directory \"${controllerDir}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n const classControllerContentGenerator = generateController(controllerClassName);\r\n const classRouterContentGenerator = generateRouter(routerClassName, controllerClassName, controllerDirectoryName);\r\n const controllerPath = `${controllerDir}/${controllerFileName}`;\r\n const routerPath = `${routerDir}/${routerFileName}`;\r\n\r\n await fs.mkdir(controllerDir, { recursive: true });\r\n await fs.mkdir(routerDir, { recursive: true });\r\n await fs.writeFile(controllerPath, classControllerContentGenerator);\r\n await fs.writeFile(routerPath, classRouterContentGenerator);\r\n\r\n const postmanBaseData = await fs.readFile('./postman.json', 'utf-8');\r\n const leanData = JSON.parse(postmanBaseData);\r\n const itemToPush = getItemFormatted(routerDirectoryName, leanData.info.name);\r\n leanData.item.push(itemToPush);\r\n await fs.writeJson(path.join('.', 'postman.json'), leanData, { spaces: 2 });\r\n\r\n await runFormatter('.');\r\n console.log(`Created ${controllerClassName} in ${controllerDirectoryName}/${controllerFileName} and ${routerClassName} in ${routerDirectoryName}/${routerFileName}`);\r\n } catch (err) {\r\n console.error('Error generating controller:', err.message);\r\n process.exit(1);\r\n }\r\n });\r\n} else {\r\n program.help();\r\n}\r\n\r\n\r\nfunction runFormatter(cwd = '.') {\r\n return new Promise((resolve, reject) => {\r\n const formatProcess = exec('npm run format', { cwd });\r\n\r\n formatProcess.stdout.on('data', data => process.stdout.write(data));\r\n formatProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n formatProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm format exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\n\r\nfunction runNpmInstall(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const installProcess = exec('npm install', { cwd: destDir });\r\n\r\n installProcess.stdout.on('data', data => process.stdout.write(data));\r\n installProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n installProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm install exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction initGitRepo(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const gitProcess = exec('git init', { cwd: destDir });\r\n\r\n gitProcess.stdout.on('data', data => process.stdout.write(data));\r\n gitProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n gitProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`Git init exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"index.js","names":["Command","inquirer","generateController","generateRouter","fs","path","fileURLToPath","exec","ora","generateBasePostman","getItemFormatted","__dirname","dirname","url","pkg","readJsonSync","join","program","version","option","parse","process","argv","options","opts","runFormatter","cwd","Promise","resolve","reject","formatProcess","stdout","on","data","write","stderr","code","Error","runNpmInstall","destDir","installProcess","initGitRepo","gitProcess","init","backend","module","dbSql","backendDbSql","console","log","prompt","type","name","message","validate","input","then","async","projectName","templateType","srcDir","dirName","packageJson","basename","existsSync","error","exit","toLowerCase","replace","mkdir","recursive","copy","overwrite","errorOnExist","filter","src","dest","err","description","main","scripts","test","format","build","clean","repository","author","license","bugs","homepage","devDependencies","eslint","globals","prettier","rimraf","typescript","dependencies","dotenv","knex","lodash","pg","uuid","start","morgan","cors","express","nodemon","types","writeJson","spaces","postmanBaseData","dbPackageJson","spinnerGit","succeed","spinner","outputMsg","createController","controllerName","nonCapitalized","charAt","slice","capitalized","toUpperCase","controllerClassName","controllerFileName","controllerDirectoryName","routerClassName","routerFileName","routerDirectoryName","controllerDir","routerDir","classControllerContentGenerator","classRouterContentGenerator","controllerPath","routerPath","writeFile","readFile","leanData","JSON","itemToPush","info","item","push","help"],"sources":["bin/index.js"],"mappings":"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","ignoreList":[],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { generateController, generateRouter } from './generators/class.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { exec } from 'child_process';\nimport ora from 'ora';\nimport { generateBasePostman, getItemFormatted } from './generators/postman.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst pkg = fs.readJsonSync(path.join(__dirname, '../../package.json'));\n\nconst program = new Command();\n\nprogram\n .version(pkg.version, '-v, --version')\n .option('--init', 'Initialize a new project')\n .option('--backend', 'Initialize with backend template')\n .option('--module', 'Initialize with module template')\n .option('--db-sql', 'Initialize with db-sql template')\n .option('--backend-db-sql', 'Initialize with backend + database template')\n .option('--create-controller', 'Create a controller and its associated route');\n\nprogram.parse(process.argv);\n\nconst options = program.opts();\n\nif (options.init && (options.backend || options.module || options.dbSql || options.backendDbSql)) {\n console.log(\"Hello! I'm Paul Sundays, your backend architect. Let's craft an awesome backend together!\");\n inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'Name of the project:',\n validate: input => input ? true : 'The name of the project can not be empty'\n }\n ]).then(async ({ projectName }) => {\n const templateType = options.backend ? 'backend' : options.backendDbSql ? 'backend-db-sql' : options.module ? 'module' : 'db-sql';\n const srcDir = path.join(__dirname, `../templates/${templateType}`);\n\n let destDir;\n let dirName;\n if (projectName === '.') {\n destDir = path.resolve('.');\n dirName = path.basename(destDir);\n if (fs.existsSync(path.join(destDir, 'package.json'))) {\n console.error('A package.json already exists in the current directory.');\n process.exit(1);\n }\n } else {\n dirName = projectName.toLowerCase().replace(/\\s+/g, '-');\n destDir = path.resolve(dirName);\n if (fs.existsSync(destDir)) {\n console.error(`Directory \"${dirName}\" already exists.`);\n process.exit(1);\n }\n await fs.mkdir(destDir, { recursive: true });\n }\n\n try {\n await fs.copy(srcDir, destDir, {\n overwrite: false,\n errorOnExist: true,\n filter: (src, dest) => {\n return true;\n }\n });\n console.log('Template files copied successfully');\n } catch (err) {\n console.error('Error copying the files:', err);\n process.exit(1);\n }\n\n let packageJson;\n if (templateType === 'db-sql') {\n packageJson = {\n name: dirName,\n version: \"0.0.1\",\n description: \"Knex Module\",\n main: \"dist/index.js\",\n scripts: {\n test: \"jest\",\n format: \"prettier --write .\",\n build: \"tsc\",\n clean: \"rimraf dist && npm run format && npm run build\",\n \"npm:publish\": \"npm run clean && npm publish\",\n \"migrate:create\": \"knex migrate:make migration -x ts\",\n \"migrate:deploy\": \"knex migrate:latest\",\n \"seed:create\": \"knex seed:make seed -x ts\",\n \"seed:run\": \"knex seed:run\"\n },\n repository: {\n type: \"git\",\n url: \"\"\n },\n author: \"\",\n license: \"MIT\",\n bugs: {\n url: \"\"\n },\n homepage: \"\",\n devDependencies: {\n \"@eslint/js\": \"^9.23.0\",\n \"@types/node\": \"^22.13.13\",\n eslint: \"^9.23.0\",\n globals: \"^16.0.0\",\n prettier: \"^3.5.3\",\n rimraf: \"^6.0.1\",\n \"ts-node\": \"^10.9.2\",\n typescript: \"^5.8.2\",\n \"typescript-eslint\": \"^8.28.0\"\n },\n dependencies: {\n dotenv: \"^16.4.7\",\n knex: \"^3.1.0\",\n lodash: \"^4.17.21\",\n pg: \"^8.14.1\",\n uuid: \"^11.1.0\"\n }\n };\n } else if (templateType === 'backend') {\n packageJson = {\n name: dirName,\n version: \"1.0.0\",\n description: `Backend project generated with Sundays Framework`,\n main: \"dist/server.js\",\n scripts: {\n \"test\": \"jest\",\n \"start\": \"node dist/server.js\",\n \"build\": \"tsc\",\n \"start:dev\": \"nodemon src/server.ts\",\n \"format\": \"prettier --write .\",\n \"create:controller\": \"sundaysf --create-controller\"\n },\n dependencies: {\n \"morgan\": \"^1.10.0\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.4.7\",\n \"express\": \"^4.18.2\"\n },\n devDependencies: {\n \"@types/morgan\": \"^1.9.9\",\n \"@types/cors\": \"^2.8.17\",\n \"@types/express\": \"^4.17.21\",\n \"nodemon\": \"^3.0.2\",\n \"prettier\": \"^3.5.3\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.8.2\",\n \"@eslint/js\": \"^9.23.0\",\n \"eslint\": \"^9.23.0\",\n \"typescript-eslint\": \"^8.28.0\"\n },\n author: \"\",\n license: \"MIT\"\n };\n } else if (templateType === 'backend-db-sql') {\n packageJson = {\n name: dirName,\n version: \"1.0.0\",\n description: `Backend project with database module generated with Sundays Framework`,\n main: \"dist/server.js\",\n scripts: {\n \"test\": \"jest\",\n \"start\": \"node dist/server.js\",\n \"build\": \"tsc\",\n \"start:dev\": \"nodemon src/server.ts\",\n \"format\": \"prettier --write .\",\n \"create:controller\": \"sundaysf --create-controller\",\n \"migrate:create\": \"knex migrate:make migration -x ts --knexfile db/knexfile.ts\",\n \"migrate:deploy\": \"knex migrate:latest --knexfile db/knexfile.ts\",\n \"seed:create\": \"knex seed:make seed -x ts --knexfile db/knexfile.ts\",\n \"seed:run\": \"knex seed:run --knexfile db/knexfile.ts\",\n \"db:build\": \"tsc -p db/tsconfig.json\",\n \"db:publish\": \"cd db && npm publish\"\n },\n dependencies: {\n \"morgan\": \"^1.10.0\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.4.7\",\n \"express\": \"^4.18.2\",\n \"knex\": \"^3.1.0\",\n \"lodash\": \"^4.17.21\",\n \"pg\": \"^8.14.1\",\n \"uuid\": \"^11.1.0\"\n },\n devDependencies: {\n \"@types/morgan\": \"^1.9.9\",\n \"@types/cors\": \"^2.8.17\",\n \"@types/express\": \"^4.17.21\",\n \"@types/lodash\": \"^4.17.16\",\n \"@types/node\": \"^22.13.13\",\n \"nodemon\": \"^3.0.2\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"ts-node\": \"^10.9.2\",\n \"typescript\": \"^5.8.2\",\n \"@eslint/js\": \"^9.23.0\",\n \"eslint\": \"^9.23.0\",\n \"globals\": \"^16.0.0\",\n \"typescript-eslint\": \"^8.28.0\"\n },\n author: \"\",\n license: \"MIT\"\n };\n } else {\n // module\n packageJson = {\n name: dirName,\n version: \"1.0.0\",\n description: `Module generated with Sundays Framework`,\n main: \"dist/index.js\",\n types: \"dist/index.d.ts\",\n scripts: {\n \"test\": \"jest\",\n \"build\": \"tsc\",\n \"format\": \"prettier --write .\",\n \"clean\": \"rimraf dist && npm run build\"\n },\n dependencies: {},\n devDependencies: {\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"typescript\": \"^5.8.2\"\n },\n author: \"\",\n license: \"MIT\"\n };\n }\n\n await fs.writeJson(path.join(destDir, 'package.json'), packageJson, { spaces: 2 });\n\n if (templateType === 'backend' || templateType === 'backend-db-sql') {\n const postmanBaseData = generateBasePostman(projectName);\n await fs.writeJson(path.join(destDir, 'postman.json'), postmanBaseData, { spaces: 2 });\n }\n\n if (templateType === 'backend-db-sql') {\n const dbPackageJson = {\n name: `${dirName}-db`,\n version: \"0.0.1\",\n description: \"Database module\",\n main: \"dist/index.js\",\n types: \"dist/index.d.ts\",\n scripts: {\n build: \"tsc\",\n clean: \"rimraf dist && npm run build\",\n format: \"prettier --write .\",\n \"npm:publish\": \"npm run clean && npm publish\",\n \"migrate:create\": \"knex migrate:make migration -x ts\",\n \"migrate:deploy\": \"knex migrate:latest\",\n \"seed:create\": \"knex seed:make seed -x ts\",\n \"seed:run\": \"knex seed:run\"\n },\n dependencies: {\n dotenv: \"^16.4.7\",\n knex: \"^3.1.0\",\n lodash: \"^4.17.21\",\n pg: \"^8.14.1\",\n uuid: \"^11.1.0\"\n },\n devDependencies: {\n typescript: \"^5.8.2\",\n \"ts-node\": \"^10.9.2\",\n rimraf: \"^6.0.1\",\n prettier: \"^3.5.3\",\n \"@types/node\": \"^22.13.13\"\n }\n };\n await fs.writeJson(path.join(destDir, 'db/package.json'), dbPackageJson, { spaces: 2 });\n }\n\n const spinnerGit = ora('Git init...').start();\n await initGitRepo(destDir);\n spinnerGit.succeed('Git initialized');\n\n const spinner = ora('Installing dependencies...').start();\n await runNpmInstall(destDir);\n spinner.succeed('Dependencies installed');\n\n await runFormatter(destDir);\n const outputMsg = projectName === '.' ? `Project created successfully in current directory` : `Project '${projectName}' created successfully in ./${dirName}`;\n console.log(outputMsg);\n });\n} else if (options.createController) {\n // Verify we're inside a backend project\n if (!fs.existsSync('./src/controllers') || !fs.existsSync('./postman.json')) {\n console.error('This command must be run inside a Sundays backend project.');\n console.error('Expected ./src/controllers/ and ./postman.json to exist.');\n process.exit(1);\n }\n\n inquirer.prompt([\n {\n type: 'input',\n name: 'controllerName',\n message: 'Controller name:',\n validate: input => {\n if (!input) return 'The controller name is empty';\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\n return 'Name must start with a letter and contain only letters and numbers';\n }\n return true;\n }\n }\n ]).then(async ({ controllerName }) => {\n try {\n const nonCapitalized = controllerName.charAt(0).toLowerCase() + controllerName.slice(1);\n const capitalized = controllerName.charAt(0).toUpperCase() + controllerName.slice(1);\n const controllerClassName = `${capitalized}Controller`;\n const controllerFileName = `${nonCapitalized}.controller.ts`;\n const controllerDirectoryName = `${nonCapitalized}`;\n const routerClassName = `${capitalized}Router`;\n const routerFileName = `${nonCapitalized}.router.ts`;\n const routerDirectoryName = `${nonCapitalized}`;\n\n const controllerDir = `./src/controllers/${controllerDirectoryName}`;\n const routerDir = `./src/routes/${routerDirectoryName}`;\n\n if (fs.existsSync(controllerDir)) {\n console.error(`Controller directory \"${controllerDir}\" already exists.`);\n process.exit(1);\n }\n\n const classControllerContentGenerator = generateController(controllerClassName);\n const classRouterContentGenerator = generateRouter(routerClassName, controllerClassName, controllerDirectoryName);\n const controllerPath = `${controllerDir}/${controllerFileName}`;\n const routerPath = `${routerDir}/${routerFileName}`;\n\n await fs.mkdir(controllerDir, { recursive: true });\n await fs.mkdir(routerDir, { recursive: true });\n await fs.writeFile(controllerPath, classControllerContentGenerator);\n await fs.writeFile(routerPath, classRouterContentGenerator);\n\n const postmanBaseData = await fs.readFile('./postman.json', 'utf-8');\n const leanData = JSON.parse(postmanBaseData);\n const itemToPush = getItemFormatted(routerDirectoryName, leanData.info.name);\n leanData.item.push(itemToPush);\n await fs.writeJson(path.join('.', 'postman.json'), leanData, { spaces: 2 });\n\n await runFormatter('.');\n console.log(`Created ${controllerClassName} in ${controllerDirectoryName}/${controllerFileName} and ${routerClassName} in ${routerDirectoryName}/${routerFileName}`);\n } catch (err) {\n console.error('Error generating controller:', err.message);\n process.exit(1);\n }\n });\n} else {\n program.help();\n}\n\n\nfunction runFormatter(cwd = '.') {\n return new Promise((resolve, reject) => {\n const formatProcess = exec('npm run format', { cwd });\n\n formatProcess.stdout.on('data', data => process.stdout.write(data));\n formatProcess.stderr.on('data', data => process.stderr.write(data));\n\n formatProcess.on('close', code => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`npm format exited with code ${code}`));\n }\n });\n });\n}\n\n\nfunction runNpmInstall(destDir) {\n return new Promise((resolve, reject) => {\n const installProcess = exec('npm install', { cwd: destDir });\n\n installProcess.stdout.on('data', data => process.stdout.write(data));\n installProcess.stderr.on('data', data => process.stderr.write(data));\n\n installProcess.on('close', code => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`npm install exited with code ${code}`));\n }\n });\n });\n}\n\nfunction initGitRepo(destDir) {\n return new Promise((resolve, reject) => {\n const gitProcess = exec('git init', { cwd: destDir });\n\n gitProcess.stdout.on('data', data => process.stdout.write(data));\n gitProcess.stderr.on('data', data => process.stderr.write(data));\n\n gitProcess.on('close', code => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Git init exited with code ${code}`));\n }\n });\n });\n}\n"]}
@@ -1,13 +1,13 @@
1
- # Server
2
- PORT=3098
3
- ENVIRONMENT=local
4
-
5
- # CORS (comma-separated origins with protocol)
6
- CORS_ALLOWED_ORIGINS=http://localhost:3098
7
-
8
- # Database (uncomment if using db-sql module)
9
- # SQL_HOST=localhost
10
- # SQL_PORT=5432
11
- # SQL_USER=postgres
12
- # SQL_PASSWORD=
13
- # SQL_DB_NAME=mydb
1
+ # Server
2
+ PORT=3098
3
+ ENVIRONMENT=local
4
+
5
+ # CORS (comma-separated origins with protocol)
6
+ CORS_ALLOWED_ORIGINS=http://localhost:3098
7
+
8
+ # Database (uncomment if using db-sql module)
9
+ # SQL_HOST=localhost
10
+ # SQL_PORT=5432
11
+ # SQL_USER=postgres
12
+ # SQL_PASSWORD=
13
+ # SQL_DB_NAME=mydb
@@ -1,3 +1,3 @@
1
- node_modules/
2
- dist/
1
+ node_modules/
2
+ dist/
3
3
  package-lock.json
@@ -1,14 +1,14 @@
1
- FROM node:22-alpine AS builder
2
- WORKDIR /var/api
3
- COPY package*.json ./
4
- RUN npm ci
5
- COPY . .
6
- RUN npm run build
7
-
8
- FROM node:22-alpine
9
- WORKDIR /var/api
10
- COPY package*.json ./
11
- RUN npm ci --omit=dev
12
- COPY --from=builder /var/api/dist ./dist
13
- EXPOSE 3098
14
- CMD ["node", "dist/server.js"]
1
+ FROM node:22-alpine AS builder
2
+ WORKDIR /var/api
3
+ COPY package*.json ./
4
+ RUN npm ci
5
+ COPY . .
6
+ RUN npm run build
7
+
8
+ FROM node:22-alpine
9
+ WORKDIR /var/api
10
+ COPY package*.json ./
11
+ RUN npm ci --omit=dev
12
+ COPY --from=builder /var/api/dist ./dist
13
+ EXPOSE 3098
14
+ CMD ["node", "dist/server.js"]