@bogomolcompany/bogo 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +125 -32
- package/README.ru.md +223 -0
- package/dist/cli.js +70 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-method.d.ts +3 -0
- package/dist/commands/add-method.d.ts.map +1 -0
- package/dist/commands/add-method.js +48 -0
- package/dist/commands/add-method.js.map +1 -0
- package/dist/commands/generate-module.d.ts +2 -1
- package/dist/commands/generate-module.d.ts.map +1 -1
- package/dist/commands/generate-module.js +35 -25
- package/dist/commands/generate-module.js.map +1 -1
- package/dist/commands/remove-module.d.ts +4 -0
- package/dist/commands/remove-module.d.ts.map +1 -0
- package/dist/commands/remove-module.js +48 -0
- package/dist/commands/remove-module.js.map +1 -0
- package/dist/templates/module.d.ts +2 -1
- package/dist/templates/module.d.ts.map +1 -1
- package/dist/templates/module.js +19 -17
- package/dist/templates/module.js.map +1 -1
- package/dist/utils/parts.d.ts +4 -0
- package/dist/utils/parts.d.ts.map +1 -0
- package/dist/utils/parts.js +9 -0
- package/dist/utils/parts.js.map +1 -0
- package/dist/utils/patch-index.d.ts +1 -0
- package/dist/utils/patch-index.d.ts.map +1 -1
- package/dist/utils/patch-index.js +15 -0
- package/dist/utils/patch-index.js.map +1 -1
- package/dist/utils/patch-method.d.ts +21 -0
- package/dist/utils/patch-method.d.ts.map +1 -0
- package/dist/utils/patch-method.js +99 -0
- package/dist/utils/patch-method.js.map +1 -0
- package/package.json +25 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 bogomolcompany
|
|
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,43 +1,75 @@
|
|
|
1
1
|
# @bogomolcompany/bogo
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@bogomolcompany/bogo)
|
|
4
|
+
[](https://www.npmjs.com/package/@bogomolcompany/bogo)
|
|
5
|
+
[](https://github.com/bogomolcomp/bogo/blob/main/LICENSE)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
[Русская версия / Russian version](README.ru.md)
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
**`bogo create app`** — Express + TypeScript project in 10 seconds.
|
|
10
|
+
**`bogo g users`** — controller, service, dto, routes, validator in one command.
|
|
11
|
+
**`bogo r users`** — remove a module and clean up the index file.
|
|
12
|
+
|
|
13
|
+
CLI generator for Express API. Works in any repository — configured via `.bogorc.json`.
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @bogomolcompany/bogo create app
|
|
19
|
+
cp .env.example .env
|
|
20
|
+
npm install
|
|
21
|
+
npm run dev
|
|
22
|
+
|
|
23
|
+
npx bogo g users -m getList -m createUser
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Why bogo
|
|
27
|
+
|
|
28
|
+
| | NestJS CLI | express-generator | **bogo** |
|
|
29
|
+
|---|:---:|:---:|:---:|
|
|
30
|
+
| Express without a framework | — | ✓ | ✓ |
|
|
31
|
+
| TypeScript out of the box | ✓ | — | ✓ |
|
|
32
|
+
| DTO + Zod validator | ✓ | — | ✓ |
|
|
33
|
+
| Starter project (server, logger, middleware) | partial | — | ✓ |
|
|
34
|
+
| Minimal dependencies | — | ✓ | ✓ |
|
|
35
|
+
| Generate into an existing project | ✓ | — | ✓ |
|
|
36
|
+
|
|
37
|
+
bogo is for teams using plain Express + TypeScript who are tired of copying the same file structure every time.
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
8
40
|
|
|
9
41
|
```bash
|
|
10
42
|
npm install -g @bogomolcompany/bogo
|
|
11
|
-
#
|
|
43
|
+
# or locally
|
|
12
44
|
npm install --save-dev @bogomolcompany/bogo
|
|
13
45
|
npx bogo --help
|
|
14
46
|
```
|
|
15
47
|
|
|
16
|
-
|
|
48
|
+
From source:
|
|
17
49
|
|
|
18
50
|
```bash
|
|
19
|
-
git clone
|
|
20
|
-
cd bogo
|
|
51
|
+
git clone https://github.com/bogomolcomp/bogo.git
|
|
52
|
+
cd bogo
|
|
21
53
|
npm install
|
|
22
54
|
npm run build
|
|
23
55
|
npm link
|
|
24
56
|
```
|
|
25
57
|
|
|
26
|
-
##
|
|
58
|
+
## Create a new project
|
|
27
59
|
|
|
28
60
|
```bash
|
|
29
61
|
mkdir my-api && cd my-api
|
|
30
62
|
bogo create app
|
|
31
63
|
```
|
|
32
64
|
|
|
33
|
-
|
|
65
|
+
Or into a subdirectory:
|
|
34
66
|
|
|
35
67
|
```bash
|
|
36
68
|
bogo create app my-api
|
|
37
69
|
cd my-api
|
|
38
70
|
```
|
|
39
71
|
|
|
40
|
-
|
|
72
|
+
Creates:
|
|
41
73
|
|
|
42
74
|
```
|
|
43
75
|
package.json
|
|
@@ -56,7 +88,7 @@ src/
|
|
|
56
88
|
api/
|
|
57
89
|
```
|
|
58
90
|
|
|
59
|
-
|
|
91
|
+
Includes: dotenv, body-parser, logger, formatResponse, IP whitelist (`ALLOWED_IPS`), `/health`, global error handler.
|
|
60
92
|
|
|
61
93
|
```bash
|
|
62
94
|
cp .env.example .env
|
|
@@ -64,14 +96,14 @@ npm install
|
|
|
64
96
|
npm run dev
|
|
65
97
|
```
|
|
66
98
|
|
|
67
|
-
##
|
|
99
|
+
## Init in an existing project
|
|
68
100
|
|
|
69
101
|
```bash
|
|
70
102
|
cd /path/to/your-express-app
|
|
71
103
|
bogo init
|
|
72
104
|
```
|
|
73
105
|
|
|
74
|
-
|
|
106
|
+
Creates `.bogorc.json`:
|
|
75
107
|
|
|
76
108
|
```json
|
|
77
109
|
{
|
|
@@ -81,14 +113,14 @@ bogo init
|
|
|
81
113
|
}
|
|
82
114
|
```
|
|
83
115
|
|
|
84
|
-
##
|
|
116
|
+
## Generate a module
|
|
85
117
|
|
|
86
118
|
```bash
|
|
87
|
-
bogo g
|
|
88
|
-
bogo g
|
|
119
|
+
bogo g analytics -m getStats -m getReport
|
|
120
|
+
bogo g orders -m createOrder:/create -m getOrder:/:id
|
|
89
121
|
```
|
|
90
122
|
|
|
91
|
-
|
|
123
|
+
Creates:
|
|
92
124
|
|
|
93
125
|
```
|
|
94
126
|
src/api/analytics/
|
|
@@ -99,32 +131,93 @@ src/api/analytics/
|
|
|
99
131
|
analytics.routes.ts
|
|
100
132
|
```
|
|
101
133
|
|
|
102
|
-
|
|
134
|
+
Automatically appends import and `app.use` to `src/index.ts` when the file exists.
|
|
135
|
+
|
|
136
|
+
## Generate a single file
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
bogo g controller users -m getList
|
|
140
|
+
bogo g service users -m getList
|
|
141
|
+
bogo g dto users -m getList -m createUser
|
|
142
|
+
bogo g validator users -m getList
|
|
143
|
+
bogo g routes users -m getList:/list
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Parts: `controller`, `service`, `dto`, `validator`, `routes`.
|
|
147
|
+
|
|
148
|
+
The module folder is created if it does not exist. Generating `routes` updates the index file the same way as a full module.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
bogo r controller users
|
|
152
|
+
bogo r routes users
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Add a method to an existing module
|
|
103
156
|
|
|
104
|
-
|
|
157
|
+
```bash
|
|
158
|
+
bogo g method users -m getList
|
|
159
|
+
bogo g method users -m createUser -m updateUser:/:id
|
|
160
|
+
```
|
|
105
161
|
|
|
106
|
-
|
|
107
|
-
|------|----------|
|
|
108
|
-
| `-m, --method` | Метод контроллера. Повторяемый. Формат: `getList` или `getList:/custom-path` |
|
|
109
|
-
| `--skip-index` | Не править index-файл |
|
|
162
|
+
Adds the method to all existing module files: controller, service, dto, validator, routes.
|
|
110
163
|
|
|
111
|
-
|
|
164
|
+
Specific parts only:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
bogo g method users -m getList -p controller
|
|
168
|
+
bogo g method users -m getList -p controller -p service -p dto
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`-m` is required. `-p` is optional — without it, all found files are updated.
|
|
172
|
+
|
|
173
|
+
## Remove a module
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
bogo r analytics
|
|
177
|
+
bogo r orders --skip-index
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Removes the module folder and cleans up import + `app.use` in the index file.
|
|
181
|
+
|
|
182
|
+
## Options
|
|
183
|
+
|
|
184
|
+
| Flag | Description |
|
|
185
|
+
|------|-------------|
|
|
186
|
+
| `-m, --method` | Method name. Repeatable. Format: `getList` or `getList:/custom-path` |
|
|
187
|
+
| `-p, --part` | Target a specific part (for `g method` and `g <part>`) |
|
|
188
|
+
| `--skip-index` | Do not patch the index file (for `g` and `r`) |
|
|
189
|
+
|
|
190
|
+
## Target project requirements
|
|
112
191
|
|
|
113
192
|
- Express + TypeScript
|
|
114
|
-
- Zod
|
|
115
|
-
-
|
|
116
|
-
- `res.success` / `res.error`
|
|
193
|
+
- Zod for validation
|
|
194
|
+
- `validate` middleware at `src/middlewares/validate`
|
|
195
|
+
- `res.success` / `res.error` via response middleware
|
|
117
196
|
|
|
118
|
-
|
|
197
|
+
`bogo create app` scaffolds all of the above.
|
|
198
|
+
|
|
199
|
+
## Development
|
|
119
200
|
|
|
120
201
|
```bash
|
|
121
202
|
npm run build
|
|
122
|
-
npm run dev --
|
|
123
|
-
npm run dev -- g
|
|
203
|
+
npm run dev -- create app ./tmp-app
|
|
204
|
+
npm run dev -- g test -m getList
|
|
205
|
+
npm run dev -- g method test -m createUser
|
|
206
|
+
npm run dev -- r test
|
|
124
207
|
```
|
|
125
208
|
|
|
126
|
-
##
|
|
209
|
+
## Links
|
|
210
|
+
|
|
211
|
+
- npm: https://www.npmjs.com/package/@bogomolcompany/bogo
|
|
212
|
+
- GitHub: https://github.com/bogomolcomp/bogo
|
|
213
|
+
- Issues / feedback: https://github.com/bogomolcomp/bogo/issues
|
|
214
|
+
|
|
215
|
+
## Publish
|
|
127
216
|
|
|
128
217
|
```bash
|
|
129
|
-
npm publish
|
|
218
|
+
npm publish --otp=YOUR_CODE
|
|
130
219
|
```
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
MIT
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# @bogomolcompany/bogo
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@bogomolcompany/bogo)
|
|
4
|
+
[](https://www.npmjs.com/package/@bogomolcompany/bogo)
|
|
5
|
+
[](https://github.com/bogomolcomp/bogo/blob/main/LICENSE)
|
|
6
|
+
|
|
7
|
+
[English version](README.md)
|
|
8
|
+
|
|
9
|
+
**`bogo create app`** — Express + TypeScript проект за 10 секунд.
|
|
10
|
+
**`bogo g users`** — controller, service, dto, routes, validator одной командой.
|
|
11
|
+
**`bogo r users`** — удаляет модуль и убирает роут из index.
|
|
12
|
+
|
|
13
|
+
CLI-генератор для Express API. Не привязан к конкретному репозиторию — настраивается через `.bogorc.json`.
|
|
14
|
+
|
|
15
|
+
## Быстрый старт
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @bogomolcompany/bogo create app
|
|
19
|
+
copy .env.example .env
|
|
20
|
+
npm install
|
|
21
|
+
npm run dev
|
|
22
|
+
|
|
23
|
+
npx bogo g users -m getList -m createUser
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Почему bogo
|
|
27
|
+
|
|
28
|
+
| | NestJS CLI | express-generator | **bogo** |
|
|
29
|
+
|---|:---:|:---:|:---:|
|
|
30
|
+
| Express без своего фреймворка | — | ✓ | ✓ |
|
|
31
|
+
| TypeScript из коробки | ✓ | — | ✓ |
|
|
32
|
+
| DTO + Zod validator | ✓ | — | ✓ |
|
|
33
|
+
| Стартовый проект (server, logger, middleware) | частично | — | ✓ |
|
|
34
|
+
| Минимальные зависимости | — | ✓ | ✓ |
|
|
35
|
+
| Генерация модулей в существующий проект | ✓ | — | ✓ |
|
|
36
|
+
|
|
37
|
+
bogo — для тех, кто пишет на чистом Express + TS и устал каждый раз копировать одну и ту же структуру файлов.
|
|
38
|
+
|
|
39
|
+
## Установка
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install -g @bogomolcompany/bogo
|
|
43
|
+
# или локально
|
|
44
|
+
npm install --save-dev @bogomolcompany/bogo
|
|
45
|
+
npx bogo --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Из исходников:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/bogomolcomp/bogo.git
|
|
52
|
+
cd bogo
|
|
53
|
+
npm install
|
|
54
|
+
npm run build
|
|
55
|
+
npm link
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Создание нового проекта
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
mkdir my-api && cd my-api
|
|
62
|
+
bogo create app
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Или в подпапку:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
bogo create app my-api
|
|
69
|
+
cd my-api
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Создаёт:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
package.json
|
|
76
|
+
tsconfig.json
|
|
77
|
+
.env.example
|
|
78
|
+
.bogorc.json
|
|
79
|
+
src/
|
|
80
|
+
index.ts
|
|
81
|
+
types/express.d.ts
|
|
82
|
+
middlewares/
|
|
83
|
+
logger.ts
|
|
84
|
+
formatResponse.ts
|
|
85
|
+
validate.ts
|
|
86
|
+
utils/
|
|
87
|
+
getAllowedIps.ts
|
|
88
|
+
api/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Включено: dotenv, body-parser, logger, formatResponse, IP whitelist (`ALLOWED_IPS`), `/health`, глобальный error handler.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
copy .env.example .env
|
|
95
|
+
npm install
|
|
96
|
+
npm run dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Инициализация в существующем проекте
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
cd /path/to/your-express-app
|
|
103
|
+
bogo init
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Создаёт `.bogorc.json`:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"apiDir": "src/api",
|
|
111
|
+
"indexFile": "src/index.ts",
|
|
112
|
+
"routePrefix": "/api"
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Генерация модуля
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
bogo g analytics -m getStats -m getReport
|
|
120
|
+
bogo g orders -m createOrder:/create -m getOrder:/:id
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Создаёт:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
src/api/analytics/
|
|
127
|
+
analytics.controller.ts
|
|
128
|
+
analytics.service.ts
|
|
129
|
+
analytics.dto.ts
|
|
130
|
+
analytics.validator.ts
|
|
131
|
+
analytics.routes.ts
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Автоматически дописывает import и `app.use` в `src/index.ts`, если файл найден.
|
|
135
|
+
|
|
136
|
+
## Генерация отдельного файла
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
bogo g controller users -m getList
|
|
140
|
+
bogo g service users -m getList
|
|
141
|
+
bogo g dto users -m getList -m createUser
|
|
142
|
+
bogo g validator users -m getList
|
|
143
|
+
bogo g routes users -m getList:/list
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Части: `controller`, `service`, `dto`, `validator`, `routes`.
|
|
147
|
+
|
|
148
|
+
Папка модуля создаётся автоматически, если её ещё нет. При генерации `routes` index обновляется так же, как при полном модуле.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
bogo r controller users
|
|
152
|
+
bogo r routes users
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Добавление метода в существующий модуль
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
bogo g method users -m getList
|
|
159
|
+
bogo g method users -m createUser -m updateUser:/:id
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Добавляет метод во все существующие файлы модуля: controller, service, dto, validator, routes.
|
|
163
|
+
|
|
164
|
+
Только в конкретные части:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
bogo g method users -m getList -p controller
|
|
168
|
+
bogo g method users -m getList -p controller -p service -p dto
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`-m` обязателен. `-p` — опционально, без него обновляются все найденные файлы.
|
|
172
|
+
|
|
173
|
+
## Удаление модуля
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
bogo r analytics
|
|
177
|
+
bogo r orders --skip-index
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Удаляет папку модуля и убирает import + `app.use` из index.
|
|
181
|
+
|
|
182
|
+
## Опции
|
|
183
|
+
|
|
184
|
+
| Флаг | Описание |
|
|
185
|
+
|------|----------|
|
|
186
|
+
| `-m, --method` | Имя метода. Повторяемый. Формат: `getList` или `getList:/custom-path` |
|
|
187
|
+
| `-p, --part` | Только указанная часть (для `g method` и `g <part>`) |
|
|
188
|
+
| `--skip-index` | Не править index-файл (для `g` и `r`) |
|
|
189
|
+
|
|
190
|
+
## Требования к целевому проекту
|
|
191
|
+
|
|
192
|
+
- Express + TypeScript
|
|
193
|
+
- Zod для валидации
|
|
194
|
+
- Middleware `validate` по пути `src/middlewares/validate`
|
|
195
|
+
- `res.success` / `res.error` через middleware ответа
|
|
196
|
+
|
|
197
|
+
`bogo create app` создаёт всё это автоматически.
|
|
198
|
+
|
|
199
|
+
## Разработка
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
npm run build
|
|
203
|
+
npm run dev -- create app ./tmp-app
|
|
204
|
+
npm run dev -- g test -m getList
|
|
205
|
+
npm run dev -- g method test -m createUser
|
|
206
|
+
npm run dev -- r test
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Ссылки
|
|
210
|
+
|
|
211
|
+
- npm: https://www.npmjs.com/package/@bogomolcompany/bogo
|
|
212
|
+
- GitHub: https://github.com/bogomolcomp/bogo
|
|
213
|
+
- Issues / feedback: https://github.com/bogomolcomp/bogo/issues
|
|
214
|
+
|
|
215
|
+
## Публикация
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
npm publish --otp=YOUR_CODE
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Лицензия
|
|
222
|
+
|
|
223
|
+
MIT
|
package/dist/cli.js
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
|
+
const add_method_1 = require("./commands/add-method");
|
|
5
6
|
const create_app_1 = require("./commands/create-app");
|
|
6
7
|
const generate_module_1 = require("./commands/generate-module");
|
|
8
|
+
const remove_module_1 = require("./commands/remove-module");
|
|
9
|
+
const parts_1 = require("./utils/parts");
|
|
7
10
|
const program = new commander_1.Command();
|
|
8
11
|
program.name("bogo").description("CLI generator for Express API modules").version("0.1.0");
|
|
9
12
|
program
|
|
@@ -36,21 +39,69 @@ program
|
|
|
36
39
|
}
|
|
37
40
|
});
|
|
38
41
|
program
|
|
42
|
+
.command("generate")
|
|
39
43
|
.alias("g")
|
|
40
|
-
.description("Generate
|
|
41
|
-
.argument("<
|
|
42
|
-
.argument("
|
|
44
|
+
.description("Generate API module, part, or method")
|
|
45
|
+
.argument("<target>", "module name, part, or method")
|
|
46
|
+
.argument("[name]", "module name for part/method")
|
|
43
47
|
.option("-m, --method <method>", "method name (repeatable), format: getList or getList:/custom-path", collect, [])
|
|
48
|
+
.option("-p, --part <part>", "target part only (repeatable): controller|service|dto|validator|routes", collect, [])
|
|
44
49
|
.option("--skip-index", "do not patch index file", false)
|
|
45
|
-
.action((
|
|
50
|
+
.action((target, name, options) => {
|
|
46
51
|
try {
|
|
47
|
-
|
|
48
|
-
throw new Error(`Unknown type "${type}". Available: module`);
|
|
49
|
-
}
|
|
50
|
-
(0, generate_module_1.runGenerateModule)(process.cwd(), name, {
|
|
52
|
+
const generateOptions = {
|
|
51
53
|
methods: options.method,
|
|
52
54
|
skipIndex: options.skipIndex,
|
|
53
|
-
}
|
|
55
|
+
};
|
|
56
|
+
if (target === "method") {
|
|
57
|
+
if (!name) {
|
|
58
|
+
throw new Error("Module name required. Example: bogo g method users -m getList");
|
|
59
|
+
}
|
|
60
|
+
if (options.method.length === 0) {
|
|
61
|
+
throw new Error("At least one -m is required. Example: bogo g method users -m getList");
|
|
62
|
+
}
|
|
63
|
+
const parts = parseParts(options.part);
|
|
64
|
+
(0, add_method_1.runAddMethod)(process.cwd(), name, { methods: options.method, parts });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if ((0, parts_1.isModulePart)(target)) {
|
|
68
|
+
if (!name) {
|
|
69
|
+
throw new Error(`Module name required. Example: bogo g ${target} users`);
|
|
70
|
+
}
|
|
71
|
+
(0, generate_module_1.runGeneratePart)(process.cwd(), target, name, generateOptions);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (name) {
|
|
75
|
+
throw new Error(`Unexpected argument "${name}". Use: bogo g <module>, bogo g <part> <module>, or bogo g method <module> -m <name>`);
|
|
76
|
+
}
|
|
77
|
+
(0, generate_module_1.runGenerateModule)(process.cwd(), target, generateOptions);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error(error instanceof Error ? error.message : error);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
program
|
|
85
|
+
.command("remove")
|
|
86
|
+
.alias("r")
|
|
87
|
+
.description("Remove API module or a single part")
|
|
88
|
+
.argument("<target>", "module name or part: controller|service|dto|validator|routes")
|
|
89
|
+
.argument("[name]", "module name when removing a single part")
|
|
90
|
+
.option("--skip-index", "do not patch index file", false)
|
|
91
|
+
.action((target, name, options) => {
|
|
92
|
+
try {
|
|
93
|
+
const removeOptions = { skipIndex: options.skipIndex };
|
|
94
|
+
if ((0, parts_1.isModulePart)(target)) {
|
|
95
|
+
if (!name) {
|
|
96
|
+
throw new Error(`Module name required. Example: bogo r ${target} users`);
|
|
97
|
+
}
|
|
98
|
+
(0, remove_module_1.runRemovePart)(process.cwd(), target, name, removeOptions);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (name) {
|
|
102
|
+
throw new Error(`Unexpected argument "${name}". Use: bogo r <module> or bogo r <part> <module>`);
|
|
103
|
+
}
|
|
104
|
+
(0, remove_module_1.runRemoveModule)(process.cwd(), target, removeOptions);
|
|
54
105
|
}
|
|
55
106
|
catch (error) {
|
|
56
107
|
console.error(error instanceof Error ? error.message : error);
|
|
@@ -60,5 +111,15 @@ program
|
|
|
60
111
|
function collect(value, previous) {
|
|
61
112
|
return previous.concat([value]);
|
|
62
113
|
}
|
|
114
|
+
function parseParts(values) {
|
|
115
|
+
if (values.length === 0) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const invalid = values.filter(value => !(0, parts_1.isModulePart)(value));
|
|
119
|
+
if (invalid.length > 0) {
|
|
120
|
+
throw new Error(`Unknown part "${invalid[0]}". Use: controller, service, dto, validator, routes`);
|
|
121
|
+
}
|
|
122
|
+
return values;
|
|
123
|
+
}
|
|
63
124
|
program.parse();
|
|
64
125
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,sDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-method.d.ts","sourceRoot":"","sources":["../../src/commands/add-method.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAqC,MAAM,eAAe,CAAC;AAwBpF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAoC7F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runAddMethod = runAddMethod;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const config_1 = require("../utils/config");
|
|
7
|
+
const naming_1 = require("../utils/naming");
|
|
8
|
+
const patch_method_1 = require("../utils/patch-method");
|
|
9
|
+
const parts_1 = require("../utils/parts");
|
|
10
|
+
const PATCHERS = {
|
|
11
|
+
controller: patch_method_1.patchControllerMethod,
|
|
12
|
+
service: patch_method_1.patchServiceMethod,
|
|
13
|
+
dto: patch_method_1.patchDtoMethod,
|
|
14
|
+
validator: patch_method_1.patchValidatorMethod,
|
|
15
|
+
routes: patch_method_1.patchRoutesMethod,
|
|
16
|
+
};
|
|
17
|
+
function runAddMethod(cwd, moduleName, options) {
|
|
18
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
19
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
20
|
+
const methods = options.methods.map(patch_method_1.parseMethodSpec);
|
|
21
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, names.kebab);
|
|
22
|
+
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
23
|
+
throw new Error(`Module directory not found: ${targetDir}`);
|
|
24
|
+
}
|
|
25
|
+
const parts = options.parts.length > 0 ? options.parts : parts_1.MODULE_PARTS;
|
|
26
|
+
const ctx = { names, methods: [] };
|
|
27
|
+
const updated = [];
|
|
28
|
+
for (const part of parts) {
|
|
29
|
+
const filePath = (0, path_1.join)(targetDir, `${names.kebab}.${part}.ts`);
|
|
30
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
let content = (0, fs_1.readFileSync)(filePath, "utf-8");
|
|
34
|
+
for (const method of methods) {
|
|
35
|
+
content = PATCHERS[part](content, ctx, method);
|
|
36
|
+
}
|
|
37
|
+
(0, fs_1.writeFileSync)(filePath, content, "utf-8");
|
|
38
|
+
updated.push(filePath);
|
|
39
|
+
}
|
|
40
|
+
if (updated.length === 0) {
|
|
41
|
+
throw new Error(`No module files found to update in ${targetDir}`);
|
|
42
|
+
}
|
|
43
|
+
console.log(`Method(s) added to "${names.kebab}":\n`);
|
|
44
|
+
for (const file of updated) {
|
|
45
|
+
console.log(` ${file}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=add-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-method.js","sourceRoot":"","sources":["../../src/commands/add-method.ts"],"names":[],"mappings":";;AA0BA,oCAoCC;AA9DD,2BAA6D;AAC7D,+BAA4B;AAE5B,4CAA6C;AAC7C,4CAAqD;AACrD,wDAO+B;AAC/B,0CAA8C;AAE9C,MAAM,QAAQ,GAGV;IACF,UAAU,EAAE,oCAAqB;IACjC,OAAO,EAAE,iCAAkB;IAC3B,GAAG,EAAE,6BAAc;IACnB,SAAS,EAAE,mCAAoB;IAC/B,MAAM,EAAE,gCAAiB;CAC1B,CAAC;AAEF,SAAgB,YAAY,CAAC,GAAW,EAAE,UAAkB,EAAE,OAAyB;IACrF,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,8BAAe,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAY,CAAC;IACtE,MAAM,GAAG,GAA0B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,IAAA,kBAAa,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { GenerateModuleOptions } from "../interfaces";
|
|
1
|
+
import { GenerateModuleOptions, ModulePart } from "../interfaces";
|
|
2
2
|
export declare function runInit(cwd: string): void;
|
|
3
3
|
export declare function runGenerateModule(cwd: string, moduleName: string, options: GenerateModuleOptions): void;
|
|
4
|
+
export declare function runGeneratePart(cwd: string, part: ModulePart, moduleName: string, options: GenerateModuleOptions): void;
|
|
4
5
|
//# sourceMappingURL=generate-module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-module.d.ts","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"generate-module.d.ts","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAC;AAqCzF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUzC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAiBvG;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CASN"}
|
|
@@ -2,21 +2,35 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.runInit = runInit;
|
|
4
4
|
exports.runGenerateModule = runGenerateModule;
|
|
5
|
+
exports.runGeneratePart = runGeneratePart;
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
const path_1 = require("path");
|
|
7
8
|
const module_1 = require("../templates/module");
|
|
8
9
|
const config_1 = require("../utils/config");
|
|
9
10
|
const naming_1 = require("../utils/naming");
|
|
11
|
+
const patch_method_1 = require("../utils/patch-method");
|
|
10
12
|
const patch_index_1 = require("../utils/patch-index");
|
|
11
|
-
function
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
function buildContext(moduleName, options) {
|
|
14
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
15
|
+
const methods = options.methods.length > 0 ? options.methods.map(patch_method_1.parseMethodSpec) : [{ name: "execute" }];
|
|
16
|
+
return { names, methods };
|
|
17
|
+
}
|
|
18
|
+
function patchIndexIfNeeded(cwd, ctx, skipIndex, part) {
|
|
19
|
+
if (skipIndex || (part && part !== "routes")) {
|
|
20
|
+
if (skipIndex) {
|
|
21
|
+
console.log(`\nSkipped index patch (--skip-index)`);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
26
|
+
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
27
|
+
const patched = (0, patch_index_1.patchIndexFile)(indexPath, ctx.names, config.routePrefix);
|
|
28
|
+
if (patched) {
|
|
29
|
+
console.log(`\nUpdated ${indexPath}`);
|
|
30
|
+
}
|
|
31
|
+
else if (!part) {
|
|
32
|
+
console.log(`\n${(0, patch_index_1.suggestIndexPatch)(ctx.names, config.routePrefix)}`);
|
|
15
33
|
}
|
|
16
|
-
return {
|
|
17
|
-
name,
|
|
18
|
-
route: route ? (0, naming_1.methodToRoutePath)(name, route) : undefined,
|
|
19
|
-
};
|
|
20
34
|
}
|
|
21
35
|
function runInit(cwd) {
|
|
22
36
|
const configPath = (0, path_1.join)(cwd, ".bogorc.json");
|
|
@@ -29,28 +43,24 @@ function runInit(cwd) {
|
|
|
29
43
|
}
|
|
30
44
|
function runGenerateModule(cwd, moduleName, options) {
|
|
31
45
|
const config = (0, config_1.loadConfig)(cwd);
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const targetDir = (0, path_1.join)(cwd, config.apiDir, names.kebab);
|
|
35
|
-
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
46
|
+
const ctx = buildContext(moduleName, options);
|
|
47
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, ctx.names.kebab);
|
|
36
48
|
if ((0, fs_1.existsSync)(targetDir)) {
|
|
37
49
|
throw new Error(`Module directory already exists: ${targetDir}`);
|
|
38
50
|
}
|
|
39
|
-
const written = (0, module_1.writeModuleFiles)(targetDir,
|
|
40
|
-
console.log(`Module "${names.kebab}" created:\n`);
|
|
51
|
+
const written = (0, module_1.writeModuleFiles)(targetDir, ctx);
|
|
52
|
+
console.log(`Module "${ctx.names.kebab}" created:\n`);
|
|
41
53
|
for (const file of written) {
|
|
42
54
|
console.log(` ${file}`);
|
|
43
55
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
console.log(`\n${(0, patch_index_1.suggestIndexPatch)(names, config.routePrefix)}`);
|
|
54
|
-
}
|
|
56
|
+
patchIndexIfNeeded(cwd, ctx, options.skipIndex);
|
|
57
|
+
}
|
|
58
|
+
function runGeneratePart(cwd, part, moduleName, options) {
|
|
59
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
60
|
+
const ctx = buildContext(moduleName, options);
|
|
61
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, ctx.names.kebab);
|
|
62
|
+
const written = (0, module_1.writePartFile)(targetDir, part, ctx);
|
|
63
|
+
console.log(`${part} for "${ctx.names.kebab}" created:\n ${written}`);
|
|
64
|
+
patchIndexIfNeeded(cwd, ctx, options.skipIndex, part);
|
|
55
65
|
}
|
|
56
66
|
//# sourceMappingURL=generate-module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-module.js","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generate-module.js","sourceRoot":"","sources":["../../src/commands/generate-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ModulePart, RemoveModuleOptions } from "../interfaces";
|
|
2
|
+
export declare function runRemoveModule(cwd: string, moduleName: string, options: RemoveModuleOptions): void;
|
|
3
|
+
export declare function runRemovePart(cwd: string, part: ModulePart, moduleName: string, options: RemoveModuleOptions): void;
|
|
4
|
+
//# sourceMappingURL=remove-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-module.d.ts","sourceRoot":"","sources":["../../src/commands/remove-module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AA8BhE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAanG;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,IAAI,CAaN"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runRemoveModule = runRemoveModule;
|
|
4
|
+
exports.runRemovePart = runRemovePart;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const config_1 = require("../utils/config");
|
|
8
|
+
const naming_1 = require("../utils/naming");
|
|
9
|
+
const patch_index_1 = require("../utils/patch-index");
|
|
10
|
+
function unpatchIndexIfNeeded(cwd, moduleName, skipIndex, part) {
|
|
11
|
+
if (skipIndex) {
|
|
12
|
+
console.log(`\nSkipped index patch (--skip-index)`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (part && part !== "routes") {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
19
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
20
|
+
const indexPath = (0, path_1.join)(cwd, config.indexFile);
|
|
21
|
+
const unpatchd = (0, patch_index_1.unpatchIndexFile)(indexPath, names, config.routePrefix);
|
|
22
|
+
if (unpatchd) {
|
|
23
|
+
console.log(`\nUpdated ${indexPath}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function runRemoveModule(cwd, moduleName, options) {
|
|
27
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
28
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
29
|
+
const targetDir = (0, path_1.join)(cwd, config.apiDir, names.kebab);
|
|
30
|
+
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
31
|
+
throw new Error(`Module directory not found: ${targetDir}`);
|
|
32
|
+
}
|
|
33
|
+
(0, fs_1.rmSync)(targetDir, { recursive: true, force: true });
|
|
34
|
+
console.log(`Module "${names.kebab}" removed:\n ${targetDir}`);
|
|
35
|
+
unpatchIndexIfNeeded(cwd, moduleName, options.skipIndex);
|
|
36
|
+
}
|
|
37
|
+
function runRemovePart(cwd, part, moduleName, options) {
|
|
38
|
+
const config = (0, config_1.loadConfig)(cwd);
|
|
39
|
+
const names = (0, naming_1.resolveModuleNames)(moduleName);
|
|
40
|
+
const filePath = (0, path_1.join)(cwd, config.apiDir, names.kebab, `${names.kebab}.${part}.ts`);
|
|
41
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
42
|
+
throw new Error(`File not found: ${filePath}`);
|
|
43
|
+
}
|
|
44
|
+
(0, fs_1.rmSync)(filePath);
|
|
45
|
+
console.log(`${part} for "${names.kebab}" removed:\n ${filePath}`);
|
|
46
|
+
unpatchIndexIfNeeded(cwd, moduleName, options.skipIndex, part);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=remove-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-module.js","sourceRoot":"","sources":["../../src/commands/remove-module.ts"],"names":[],"mappings":";;AAgCA,0CAaC;AAED,sCAkBC;AAjED,2BAAwC;AACxC,+BAA4B;AAE5B,4CAA6C;AAC7C,4CAAqD;AACrD,sDAAwD;AAExD,SAAS,oBAAoB,CAC3B,GAAW,EACX,UAAkB,EAClB,SAAkB,EAClB,IAAiB;IAEjB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAA,8BAAgB,EAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAExE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW,EAAE,UAAkB,EAAE,OAA4B;IAC3F,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAA,WAAM,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,iBAAiB,SAAS,EAAE,CAAC,CAAC;IAEhE,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,aAAa,CAC3B,GAAW,EACX,IAAgB,EAChB,UAAkB,EAClB,OAA4B;IAE5B,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;IAEpF,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAA,WAAM,EAAC,QAAQ,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,KAAK,CAAC,KAAK,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAEpE,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ModuleTemplateContext } from "../interfaces";
|
|
1
|
+
import { ModulePart, ModuleTemplateContext } from "../interfaces";
|
|
2
2
|
export declare function renderController(ctx: ModuleTemplateContext): string;
|
|
3
3
|
export declare function renderService(ctx: ModuleTemplateContext): string;
|
|
4
4
|
export declare function renderDto(ctx: ModuleTemplateContext): string;
|
|
5
5
|
export declare function renderValidator(ctx: ModuleTemplateContext): string;
|
|
6
6
|
export declare function renderRoutes(ctx: ModuleTemplateContext): string;
|
|
7
|
+
export declare function writePartFile(targetDir: string, part: ModulePart, ctx: ModuleTemplateContext): string;
|
|
7
8
|
export declare function writeModuleFiles(targetDir: string, ctx: ModuleTemplateContext): string[];
|
|
8
9
|
//# sourceMappingURL=module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGlE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAwBnE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAsBhE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAS5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAalE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAsB/D;AAUD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAcrG;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAGxF"}
|
package/dist/templates/module.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.renderService = renderService;
|
|
|
5
5
|
exports.renderDto = renderDto;
|
|
6
6
|
exports.renderValidator = renderValidator;
|
|
7
7
|
exports.renderRoutes = renderRoutes;
|
|
8
|
+
exports.writePartFile = writePartFile;
|
|
8
9
|
exports.writeModuleFiles = writeModuleFiles;
|
|
9
10
|
const fs_1 = require("fs");
|
|
10
11
|
const path_1 = require("path");
|
|
@@ -89,26 +90,27 @@ ${routes}
|
|
|
89
90
|
export default router;
|
|
90
91
|
`;
|
|
91
92
|
}
|
|
92
|
-
|
|
93
|
+
const PART_RENDERERS = {
|
|
94
|
+
controller: renderController,
|
|
95
|
+
service: renderService,
|
|
96
|
+
dto: renderDto,
|
|
97
|
+
validator: renderValidator,
|
|
98
|
+
routes: renderRoutes,
|
|
99
|
+
};
|
|
100
|
+
function writePartFile(targetDir, part, ctx) {
|
|
93
101
|
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
94
102
|
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
95
103
|
}
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
[`${ctx.names.kebab}.validator.ts`, renderValidator(ctx)],
|
|
101
|
-
[`${ctx.names.kebab}.routes.ts`, renderRoutes(ctx)],
|
|
102
|
-
];
|
|
103
|
-
const written = [];
|
|
104
|
-
for (const [fileName, content] of files) {
|
|
105
|
-
const filePath = (0, path_1.join)(targetDir, fileName);
|
|
106
|
-
if ((0, fs_1.existsSync)(filePath)) {
|
|
107
|
-
throw new Error(`File already exists: ${filePath}`);
|
|
108
|
-
}
|
|
109
|
-
(0, fs_1.writeFileSync)(filePath, content, "utf-8");
|
|
110
|
-
written.push(filePath);
|
|
104
|
+
const fileName = `${ctx.names.kebab}.${part}.ts`;
|
|
105
|
+
const filePath = (0, path_1.join)(targetDir, fileName);
|
|
106
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
107
|
+
throw new Error(`File already exists: ${filePath}`);
|
|
111
108
|
}
|
|
112
|
-
|
|
109
|
+
(0, fs_1.writeFileSync)(filePath, PART_RENDERERS[part](ctx), "utf-8");
|
|
110
|
+
return filePath;
|
|
111
|
+
}
|
|
112
|
+
function writeModuleFiles(targetDir, ctx) {
|
|
113
|
+
const parts = ["controller", "service", "dto", "validator", "routes"];
|
|
114
|
+
return parts.map(part => writePartFile(targetDir, part, ctx));
|
|
113
115
|
}
|
|
114
116
|
//# sourceMappingURL=module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":";;AAKA,4CAwBC;AAED,sCAsBC;AAED,8BASC;AAED,0CAaC;AAED,oCAsBC;AAED,
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/utils/parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,eAAO,MAAM,YAAY,EAAE,UAAU,EAA4D,CAAC;AAElG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODULE_PARTS = void 0;
|
|
4
|
+
exports.isModulePart = isModulePart;
|
|
5
|
+
exports.MODULE_PARTS = ["controller", "service", "dto", "validator", "routes"];
|
|
6
|
+
function isModulePart(value) {
|
|
7
|
+
return exports.MODULE_PARTS.includes(value);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/utils/parts.ts"],"names":[],"mappings":";;;AAIA,oCAEC;AAJY,QAAA,YAAY,GAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAElG,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,oBAAY,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ModuleNames } from "../interfaces";
|
|
2
2
|
export declare function patchIndexFile(indexPath: string, names: ModuleNames, routePrefix: string): boolean;
|
|
3
3
|
export declare function suggestIndexPatch(names: ModuleNames, routePrefix: string): string;
|
|
4
|
+
export declare function unpatchIndexFile(indexPath: string, names: ModuleNames, routePrefix: string): boolean;
|
|
4
5
|
//# sourceMappingURL=patch-index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch-index.d.ts","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiDlG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjF"}
|
|
1
|
+
{"version":3,"file":"patch-index.d.ts","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiDlG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiBpG"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.patchIndexFile = patchIndexFile;
|
|
4
4
|
exports.suggestIndexPatch = suggestIndexPatch;
|
|
5
|
+
exports.unpatchIndexFile = unpatchIndexFile;
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
function patchIndexFile(indexPath, names, routePrefix) {
|
|
7
8
|
if (!(0, fs_1.existsSync)(indexPath)) {
|
|
@@ -55,4 +56,18 @@ function suggestIndexPatch(names, routePrefix) {
|
|
|
55
56
|
import ${names.pascal}Routes from "./api/${names.kebab}/${names.kebab}.routes";
|
|
56
57
|
app.use("${routePrefix}/${names.kebab}", ${names.pascal}Routes);`;
|
|
57
58
|
}
|
|
59
|
+
function unpatchIndexFile(indexPath, names, routePrefix) {
|
|
60
|
+
if (!(0, fs_1.existsSync)(indexPath)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const importLine = `import ${names.pascal}Routes from "./api/${names.kebab}/${names.kebab}.routes";`;
|
|
64
|
+
const useLine = `app.use("${routePrefix}/${names.kebab}", ${names.pascal}Routes);`;
|
|
65
|
+
const lines = (0, fs_1.readFileSync)(indexPath, "utf-8").split("\n");
|
|
66
|
+
const filtered = lines.filter(line => line !== importLine && line !== useLine);
|
|
67
|
+
if (filtered.length === lines.length) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
(0, fs_1.writeFileSync)(indexPath, filtered.join("\n"), "utf-8");
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
58
73
|
//# sourceMappingURL=patch-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":";;AAIA,wCAiDC;AAED,8CAKC;
|
|
1
|
+
{"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MethodSpec } from "../interfaces";
|
|
2
|
+
export declare function parseMethodSpec(raw: string): MethodSpec;
|
|
3
|
+
export declare function patchControllerMethod(content: string, ctx: {
|
|
4
|
+
names: {
|
|
5
|
+
pascal: string;
|
|
6
|
+
};
|
|
7
|
+
}, method: MethodSpec): string;
|
|
8
|
+
export declare function patchServiceMethod(content: string, ctx: {
|
|
9
|
+
names: {
|
|
10
|
+
kebab: string;
|
|
11
|
+
pascal: string;
|
|
12
|
+
};
|
|
13
|
+
}, method: MethodSpec): string;
|
|
14
|
+
export declare function patchDtoMethod(content: string, _ctx: unknown, method: MethodSpec): string;
|
|
15
|
+
export declare function patchValidatorMethod(content: string, _ctx: unknown, method: MethodSpec): string;
|
|
16
|
+
export declare function patchRoutesMethod(content: string, ctx: {
|
|
17
|
+
names: {
|
|
18
|
+
kebab: string;
|
|
19
|
+
};
|
|
20
|
+
}, method: MethodSpec): string;
|
|
21
|
+
//# sourceMappingURL=patch-method.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-method.d.ts","sourceRoot":"","sources":["../../src/utils/patch-method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CASvD;AAgBD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAqBrH;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACjD,MAAM,EAAE,UAAU,GACjB,MAAM,CAsBR;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CASzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAY/F;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACjC,MAAM,EAAE,UAAU,GACjB,MAAM,CAoBR"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMethodSpec = parseMethodSpec;
|
|
4
|
+
exports.patchControllerMethod = patchControllerMethod;
|
|
5
|
+
exports.patchServiceMethod = patchServiceMethod;
|
|
6
|
+
exports.patchDtoMethod = patchDtoMethod;
|
|
7
|
+
exports.patchValidatorMethod = patchValidatorMethod;
|
|
8
|
+
exports.patchRoutesMethod = patchRoutesMethod;
|
|
9
|
+
const naming_1 = require("./naming");
|
|
10
|
+
function parseMethodSpec(raw) {
|
|
11
|
+
const [name, route] = raw.split(":");
|
|
12
|
+
if (!name || !/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {
|
|
13
|
+
throw new Error(`Invalid method name: "${raw}". Use camelCase, e.g. getList or getList:/custom-path`);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
name,
|
|
17
|
+
route: route ? (0, naming_1.methodToRoutePath)(name, route) : undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function addImportSymbol(content, importPattern, symbol) {
|
|
21
|
+
const match = content.match(importPattern);
|
|
22
|
+
if (!match) {
|
|
23
|
+
return content;
|
|
24
|
+
}
|
|
25
|
+
const symbols = match[1].split(",").map(value => value.trim()).filter(Boolean);
|
|
26
|
+
if (symbols.includes(symbol)) {
|
|
27
|
+
return content;
|
|
28
|
+
}
|
|
29
|
+
return content.replace(match[0], match[0].replace(match[1], `${match[1]}, ${symbol}`));
|
|
30
|
+
}
|
|
31
|
+
function patchControllerMethod(content, ctx, method) {
|
|
32
|
+
if (new RegExp(`async ${method.name}\\(`).test(content)) {
|
|
33
|
+
throw new Error(`Method "${method.name}" already exists in controller`);
|
|
34
|
+
}
|
|
35
|
+
const snippet = `
|
|
36
|
+
async ${method.name}(req: e.Request, res: e.Response) {
|
|
37
|
+
try {
|
|
38
|
+
const result = await ${ctx.names.pascal}Service.${method.name}(req.body);
|
|
39
|
+
return res.success(result);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
return res.error(error);
|
|
42
|
+
}
|
|
43
|
+
}`;
|
|
44
|
+
const updated = content.replace(/(\n}\n\nexport default new .+Controller\(\);)/, `${snippet}$1`);
|
|
45
|
+
if (updated === content) {
|
|
46
|
+
throw new Error("Could not patch controller file");
|
|
47
|
+
}
|
|
48
|
+
return updated;
|
|
49
|
+
}
|
|
50
|
+
function patchServiceMethod(content, ctx, method) {
|
|
51
|
+
if (new RegExp(`async ${method.name}\\(`).test(content)) {
|
|
52
|
+
throw new Error(`Method "${method.name}" already exists in service`);
|
|
53
|
+
}
|
|
54
|
+
let updated = addImportSymbol(content, new RegExp(`import \\{ (.+) \\} from "\\./${ctx.names.kebab}\\.dto";`), `${method.name}DTO`);
|
|
55
|
+
const snippet = `
|
|
56
|
+
async ${method.name}(body: ${method.name}DTO) {
|
|
57
|
+
throw new Error("${ctx.names.pascal}Service.${method.name} is not implemented");
|
|
58
|
+
}`;
|
|
59
|
+
updated = updated.replace(/(\n}\n\nexport default new .+Service\(\);)/, `${snippet}$1`);
|
|
60
|
+
if (updated === content) {
|
|
61
|
+
throw new Error("Could not patch service file");
|
|
62
|
+
}
|
|
63
|
+
return updated;
|
|
64
|
+
}
|
|
65
|
+
function patchDtoMethod(content, _ctx, method) {
|
|
66
|
+
if (new RegExp(`interface ${method.name}DTO`).test(content)) {
|
|
67
|
+
throw new Error(`Method "${method.name}" already exists in dto`);
|
|
68
|
+
}
|
|
69
|
+
return `${content.trimEnd()}\nexport interface ${method.name}DTO {
|
|
70
|
+
// TODO: define fields
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
function patchValidatorMethod(content, _ctx, method) {
|
|
75
|
+
if (new RegExp(`export const ${method.name} =`).test(content)) {
|
|
76
|
+
throw new Error(`Method "${method.name}" already exists in validator`);
|
|
77
|
+
}
|
|
78
|
+
return `${content.trimEnd()}
|
|
79
|
+
export const ${method.name} = z.object({
|
|
80
|
+
body: z.object({
|
|
81
|
+
// TODO: define validation schema
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
function patchRoutesMethod(content, ctx, method) {
|
|
87
|
+
if (content.includes(`controller.${method.name}(`)) {
|
|
88
|
+
throw new Error(`Method "${method.name}" already exists in routes`);
|
|
89
|
+
}
|
|
90
|
+
let updated = addImportSymbol(content, new RegExp(`import \\{ (.+) \\} from "\\./${ctx.names.kebab}\\.validator";`), method.name);
|
|
91
|
+
const routePath = (0, naming_1.methodToRoutePath)(method.name, method.route);
|
|
92
|
+
const snippet = `router.post("${routePath}", validate(${method.name}), (req: Request, res: Response) => controller.${method.name}(req, res));`;
|
|
93
|
+
updated = updated.replace(/(\n\nexport default router;\n?)$/, `\n${snippet}$1`);
|
|
94
|
+
if (updated === content) {
|
|
95
|
+
throw new Error("Could not patch routes file");
|
|
96
|
+
}
|
|
97
|
+
return updated;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=patch-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-method.js","sourceRoot":"","sources":["../../src/utils/patch-method.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bogomolcompany/bogo",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "CLI to scaffold Express + TypeScript API projects and generate modules (controller, service, dto, routes, validator)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "bogomolcompany",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"express",
|
|
9
|
+
"typescript",
|
|
10
|
+
"cli",
|
|
11
|
+
"scaffold",
|
|
12
|
+
"generator",
|
|
13
|
+
"api",
|
|
14
|
+
"boilerplate",
|
|
15
|
+
"rest-api",
|
|
16
|
+
"express-generator",
|
|
17
|
+
"zod",
|
|
18
|
+
"backend"
|
|
19
|
+
],
|
|
20
|
+
"homepage": "https://github.com/bogomolcomp/bogo#readme",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/bogomolcomp/bogo.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/bogomolcomp/bogo/issues"
|
|
27
|
+
},
|
|
3
28
|
"publishConfig": {
|
|
4
29
|
"access": "public"
|
|
5
30
|
},
|
|
6
|
-
"version": "0.1.1",
|
|
7
|
-
"description": "CLI generator for Express API modules",
|
|
8
|
-
"license": "MIT",
|
|
9
31
|
"bin": {
|
|
10
32
|
"bogo": "./dist/cli.js"
|
|
11
33
|
},
|