@bogomolcompany/bogo 0.1.0 → 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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -28
  3. package/README.ru.md +223 -0
  4. package/dist/cli.js +87 -9
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/add-method.d.ts +3 -0
  7. package/dist/commands/add-method.d.ts.map +1 -0
  8. package/dist/commands/add-method.js +48 -0
  9. package/dist/commands/add-method.js.map +1 -0
  10. package/dist/commands/create-app.d.ts +2 -0
  11. package/dist/commands/create-app.d.ts.map +1 -0
  12. package/dist/commands/create-app.js +19 -0
  13. package/dist/commands/create-app.js.map +1 -0
  14. package/dist/commands/generate-module.d.ts +2 -1
  15. package/dist/commands/generate-module.d.ts.map +1 -1
  16. package/dist/commands/generate-module.js +35 -25
  17. package/dist/commands/generate-module.js.map +1 -1
  18. package/dist/commands/remove-module.d.ts +4 -0
  19. package/dist/commands/remove-module.d.ts.map +1 -0
  20. package/dist/commands/remove-module.js +48 -0
  21. package/dist/commands/remove-module.js.map +1 -0
  22. package/dist/templates/module.d.ts +2 -1
  23. package/dist/templates/module.d.ts.map +1 -1
  24. package/dist/templates/module.js +19 -17
  25. package/dist/templates/module.js.map +1 -1
  26. package/dist/templates/project.d.ts +2 -0
  27. package/dist/templates/project.d.ts.map +1 -0
  28. package/dist/templates/project.js +205 -0
  29. package/dist/templates/project.js.map +1 -0
  30. package/dist/utils/parts.d.ts +4 -0
  31. package/dist/utils/parts.d.ts.map +1 -0
  32. package/dist/utils/parts.js +9 -0
  33. package/dist/utils/parts.js.map +1 -0
  34. package/dist/utils/patch-index.d.ts +1 -0
  35. package/dist/utils/patch-index.d.ts.map +1 -1
  36. package/dist/utils/patch-index.js +15 -0
  37. package/dist/utils/patch-index.js.map +1 -1
  38. package/dist/utils/patch-method.d.ts +21 -0
  39. package/dist/utils/patch-method.d.ts.map +1 -0
  40. package/dist/utils/patch-method.js +99 -0
  41. package/dist/utils/patch-method.js.map +1 -0
  42. 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,36 +1,109 @@
1
1
  # @bogomolcompany/bogo
2
2
 
3
- CLI-генератор модулей Express API: controller, service, dto, routes, validator.
3
+ [![npm version](https://img.shields.io/npm/v/@bogomolcompany/bogo.svg)](https://www.npmjs.com/package/@bogomolcompany/bogo)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@bogomolcompany/bogo.svg)](https://www.npmjs.com/package/@bogomolcompany/bogo)
5
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/bogomolcomp/bogo/blob/main/LICENSE)
4
6
 
5
- Отдельный npm-пакет, не привязан к конкретному проекту. Настраивается через `.bogorc.json` в целевом репозитории.
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 <repo-url> bogo-cli
20
- cd bogo-cli
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
59
+
60
+ ```bash
61
+ mkdir my-api && cd my-api
62
+ bogo create app
63
+ ```
64
+
65
+ Or into a subdirectory:
66
+
67
+ ```bash
68
+ bogo create app my-api
69
+ cd my-api
70
+ ```
71
+
72
+ Creates:
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
+ Includes: dotenv, body-parser, logger, formatResponse, IP whitelist (`ALLOWED_IPS`), `/health`, global error handler.
92
+
93
+ ```bash
94
+ cp .env.example .env
95
+ npm install
96
+ npm run dev
97
+ ```
98
+
99
+ ## Init in an existing project
27
100
 
28
101
  ```bash
29
102
  cd /path/to/your-express-app
30
103
  bogo init
31
104
  ```
32
105
 
33
- Создаёт `.bogorc.json`:
106
+ Creates `.bogorc.json`:
34
107
 
35
108
  ```json
36
109
  {
@@ -40,14 +113,14 @@ bogo init
40
113
  }
41
114
  ```
42
115
 
43
- ## Генерация модуля
116
+ ## Generate a module
44
117
 
45
118
  ```bash
46
- bogo g module analytics -m getStats -m getReport
47
- bogo g module orders -m createOrder:/create -m getOrder:/:id
119
+ bogo g analytics -m getStats -m getReport
120
+ bogo g orders -m createOrder:/create -m getOrder:/:id
48
121
  ```
49
122
 
50
- Создаёт:
123
+ Creates:
51
124
 
52
125
  ```
53
126
  src/api/analytics/
@@ -58,32 +131,93 @@ src/api/analytics/
58
131
  analytics.routes.ts
59
132
  ```
60
133
 
61
- И дописывает import + `app.use` в `src/index.ts` (если файл найден).
134
+ Automatically appends import and `app.use` to `src/index.ts` when the file exists.
62
135
 
63
- ## Опции
136
+ ## Generate a single file
64
137
 
65
- | Флаг | Описание |
66
- |------|----------|
67
- | `-m, --method` | Метод контроллера. Повторяемый. Формат: `getList` или `getList:/custom-path` |
68
- | `--skip-index` | Не править index-файл |
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
156
+
157
+ ```bash
158
+ bogo g method users -m getList
159
+ bogo g method users -m createUser -m updateUser:/:id
160
+ ```
161
+
162
+ Adds the method to all existing module files: controller, service, dto, validator, routes.
163
+
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.
69
181
 
70
- ## Требования к целевому проекту
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
71
191
 
72
192
  - Express + TypeScript
73
- - Zod для валидации
74
- - Middleware `validate` по пути `src/middlewares/validate`
75
- - `res.success` / `res.error` через middleware ответа
193
+ - Zod for validation
194
+ - `validate` middleware at `src/middlewares/validate`
195
+ - `res.success` / `res.error` via response middleware
76
196
 
77
- ## Разработка пакета
197
+ `bogo create app` scaffolds all of the above.
198
+
199
+ ## Development
78
200
 
79
201
  ```bash
80
202
  npm run build
81
- npm run dev -- init
82
- npm run dev -- g module test -m getList
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
83
207
  ```
84
208
 
85
- ## Публикация
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
86
216
 
87
217
  ```bash
88
- npm publish
218
+ npm publish --otp=YOUR_CODE
89
219
  ```
220
+
221
+ ## License
222
+
223
+ MIT
package/README.ru.md ADDED
@@ -0,0 +1,223 @@
1
+ # @bogomolcompany/bogo
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@bogomolcompany/bogo.svg)](https://www.npmjs.com/package/@bogomolcompany/bogo)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@bogomolcompany/bogo.svg)](https://www.npmjs.com/package/@bogomolcompany/bogo)
5
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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,7 +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");
6
+ const create_app_1 = require("./commands/create-app");
5
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");
6
10
  const program = new commander_1.Command();
7
11
  program.name("bogo").description("CLI generator for Express API modules").version("0.1.0");
8
12
  program
@@ -17,23 +21,87 @@ program
17
21
  process.exit(1);
18
22
  }
19
23
  });
24
+ program
25
+ .command("create")
26
+ .description("Create a new project")
27
+ .argument("<type>", "project type (app)")
28
+ .argument("[path]", "target directory", ".")
29
+ .action((type, path) => {
30
+ try {
31
+ if (type !== "app") {
32
+ throw new Error(`Unknown type "${type}". Available: app`);
33
+ }
34
+ (0, create_app_1.runCreateApp)(process.cwd(), path);
35
+ }
36
+ catch (error) {
37
+ console.error(error instanceof Error ? error.message : error);
38
+ process.exit(1);
39
+ }
40
+ });
20
41
  program
21
42
  .command("generate")
22
43
  .alias("g")
23
- .description("Generate code scaffolding")
24
- .argument("<type>", "resource type (module)")
25
- .argument("<name>", "resource name, e.g. users or user-profile")
44
+ .description("Generate API module, part, or method")
45
+ .argument("<target>", "module name, part, or method")
46
+ .argument("[name]", "module name for part/method")
26
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, [])
27
49
  .option("--skip-index", "do not patch index file", false)
28
- .action((type, name, options) => {
50
+ .action((target, name, options) => {
29
51
  try {
30
- if (type !== "module") {
31
- throw new Error(`Unknown type "${type}". Available: module`);
32
- }
33
- (0, generate_module_1.runGenerateModule)(process.cwd(), name, {
52
+ const generateOptions = {
34
53
  methods: options.method,
35
54
  skipIndex: options.skipIndex,
36
- });
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);
37
105
  }
38
106
  catch (error) {
39
107
  console.error(error instanceof Error ? error.message : error);
@@ -43,5 +111,15 @@ program
43
111
  function collect(value, previous) {
44
112
  return previous.concat([value]);
45
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
+ }
46
124
  program.parse();
47
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,gEAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAE3F,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,GAAG,EAAE;IACX,IAAI,CAAC;QACH,IAAA,yBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,QAAQ,CAAC,QAAQ,EAAE,2CAA2C,CAAC;KAC/D,MAAM,CAAC,uBAAuB,EAAE,mEAAmE,EAAE,OAAO,EAAE,EAAE,CAAC;KACjH,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,KAAK,CAAC;KACxD,MAAM,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,OAAiD,EAAE,EAAE;IACxF,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,CAAC;QAC/D,CAAC;QACD,IAAA,mCAAiB,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE;YACrC,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { AddMethodOptions } from "../interfaces";
2
+ export declare function runAddMethod(cwd: string, moduleName: string, options: AddMethodOptions): void;
3
+ //# sourceMappingURL=add-method.d.ts.map
@@ -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