@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 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
- 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
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
- Создаёт Express + TypeScript проект:
72
+ Creates:
41
73
 
42
74
  ```
43
75
  package.json
@@ -56,7 +88,7 @@ src/
56
88
  api/
57
89
  ```
58
90
 
59
- Включено: dotenv, body-parser, logger, formatResponse, IP whitelist (через `ALLOWED_IPS`), health-check `/health`, глобальный error handler.
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
- Создаёт `.bogorc.json`:
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 module analytics -m getStats -m getReport
88
- 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
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
- И дописывает import + `app.use` в `src/index.ts` (если файл найден).
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
- - Middleware `validate` по пути `src/middlewares/validate`
116
- - `res.success` / `res.error` через middleware ответа
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 -- init
123
- 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
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
+ [![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,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 code scaffolding")
41
- .argument("<type>", "resource type (module)")
42
- .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")
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((type, name, options) => {
50
+ .action((target, name, options) => {
46
51
  try {
47
- if (type !== "module") {
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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,sDAAqD;AACrD,sDAAqD;AACrD,gEAAyF;AACzF,4DAA0E;AAE1E,yCAA6C;AAE7C,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,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACxC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC;KAC3C,MAAM,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;IACrC,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,CAAC;QAC5D,CAAC;QACD,IAAA,yBAAY,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,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,sCAAsC,CAAC;KACnD,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;KACpD,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;KACjD,MAAM,CAAC,uBAAuB,EAAE,mEAAmE,EAAE,OAAO,EAAE,EAAE,CAAC;KACjH,MAAM,CAAC,mBAAmB,EAAE,wEAAwE,EAAE,OAAO,EAAE,EAAE,CAAC;KAClH,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,KAAK,CAAC;KACxD,MAAM,CACL,CACE,MAAc,EACd,IAAwB,EACxB,OAAiE,EACjE,EAAE;IACF,IAAI,CAAC;QACH,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QAEF,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAC1F,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvC,IAAA,yBAAY,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,IAAA,oBAAY,EAAC,MAAM,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,QAAQ,CAAC,CAAC;YAC3E,CAAC;YACD,IAAA,iCAAe,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,sFAAsF,CAAC,CAAC;QACtI,CAAC;QAED,IAAA,mCAAiB,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5D,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,CACF,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,oCAAoC,CAAC;KACjD,QAAQ,CAAC,UAAU,EAAE,8DAA8D,CAAC;KACpF,QAAQ,CAAC,QAAQ,EAAE,yCAAyC,CAAC;KAC7D,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,KAAK,CAAC;KACxD,MAAM,CAAC,CAAC,MAAc,EAAE,IAAwB,EAAE,OAA+B,EAAE,EAAE;IACpF,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;QAEvD,IAAI,IAAA,oBAAY,EAAC,MAAM,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,QAAQ,CAAC,CAAC;YAC3E,CAAC;YACD,IAAA,6BAAa,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,mDAAmD,CAAC,CAAC;QACnG,CAAC;QAED,IAAA,+BAAe,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,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,SAAS,UAAU,CAAC,MAAgB;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,CAAC,CAAC,qDAAqD,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -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
@@ -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,EAAc,MAAM,eAAe,CAAC;AAiBlE,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,CA6BvG"}
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 parseMethodSpec(raw) {
12
- const [name, route] = raw.split(":");
13
- if (!name || !/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {
14
- throw new Error(`Invalid method name: "${raw}". Use camelCase, e.g. getList or getList:/custom-path`);
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 names = (0, naming_1.resolveModuleNames)(moduleName);
33
- const methods = options.methods.length > 0 ? options.methods.map(parseMethodSpec) : [{ name: "execute" }];
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, { names, methods });
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
- if (options.skipIndex) {
45
- console.log(`\nSkipped index patch (--skip-index)`);
46
- return;
47
- }
48
- const patched = (0, patch_index_1.patchIndexFile)(indexPath, names, config.routePrefix);
49
- if (patched) {
50
- console.log(`\nUpdated ${indexPath}`);
51
- }
52
- else {
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":";;AAmBA,0BAUC;AAED,8CA6BC;AA5DD,2BAA+C;AAC/C,+BAA4B;AAE5B,gDAAuD;AACvD,4CAAsE;AACtE,4CAAwE;AACxE,sDAAyE;AAEzE,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,wDAAwD,CAAC,CAAC;IACxG,CAAC;IACD,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAA,0BAAiB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAC1D,CAAC;AACJ,CAAC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAE7C,IAAI,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAA,gCAAuB,GAAE,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAW,EAAE,UAAkB,EAAE,OAA8B;IAC/F,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,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1G,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,yBAAgB,EAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,4BAAc,EAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACrE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,+BAAiB,EAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
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;AAGtD,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;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAyBxF"}
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"}
@@ -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
- function writeModuleFiles(targetDir, ctx) {
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 files = [
97
- [`${ctx.names.kebab}.controller.ts`, renderController(ctx)],
98
- [`${ctx.names.kebab}.service.ts`, renderService(ctx)],
99
- [`${ctx.names.kebab}.dto.ts`, renderDto(ctx)],
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
- return written;
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":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/templates/module.ts"],"names":[],"mappings":";;AAKA,4CAwBC;AAED,sCAsBC;AAED,8BASC;AAED,0CAaC;AAED,oCAsBC;AAUD,sCAcC;AAED,4CAGC;AApID,2BAA0D;AAC1D,+BAA4B;AAE5B,4CAAoD;AAEpD,SAAgB,gBAAgB,CAAC,GAA0B;IACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO;SACxB,GAAG,CACF,MAAM,CAAC,EAAE,CAAC;UACN,MAAM,CAAC,IAAI;;6BAEQ,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,IAAI;;;;;IAK3D,CACC;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;SACA,KAAK,CAAC,MAAM,mBAAmB,KAAK,CAAC,KAAK;;QAE3C,KAAK,CAAC,MAAM,eAAe,WAAW;;;qBAGzB,KAAK,CAAC,MAAM;CAChC,CAAC;AACF,CAAC;AAED,SAAgB,aAAa,CAAC,GAA0B;IACtD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,YAAY,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,KAAK,UAAU;QAC5F,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,WAAW,GAAG,OAAO;SACxB,GAAG,CACF,MAAM,CAAC,EAAE,CAAC;UACN,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,IAAI;uBACnB,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,IAAI;IACrD,CACC;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,OAAO;QACX,KAAK,CAAC,MAAM,YAAY,WAAW;;;qBAGtB,KAAK,CAAC,MAAM;CAChC,CAAC;AACF,CAAC;AAED,SAAgB,SAAS,CAAC,GAA0B;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAC5B,MAAM,CAAC,EAAE,CAAC,oBAAoB,MAAM,CAAC,IAAI;;;CAG5C,CACE,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,eAAe,CAAC,GAA0B;IACxD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAC7B,MAAM,CAAC,EAAE,CAAC,gBAAgB,MAAM,CAAC,IAAI;;;;;CAKxC,CACE,CAAC;IAEF,OAAO;;EAEP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,YAAY,CAAC,GAA0B;IACrD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,MAAM,CAAC,EAAE;QACZ,MAAM,SAAS,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,OAAO,gBAAgB,SAAS,eAAe,MAAM,CAAC,IAAI,kDAAkD,MAAM,CAAC,IAAI,cAAc,CAAC;IACxI,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;SAEA,KAAK,CAAC,MAAM,sBAAsB,KAAK,CAAC,KAAK;WAC3C,gBAAgB,cAAc,KAAK,CAAC,KAAK;;;qBAG/B,KAAK,CAAC,MAAM;;EAE/B,MAAM;;;CAGP,CAAC;AACF,CAAC;AAED,MAAM,cAAc,GAA+D;IACjF,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,aAAa;IACtB,GAAG,EAAE,SAAS;IACd,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,SAAgB,aAAa,CAAC,SAAiB,EAAE,IAAgB,EAAE,GAA0B;IAC3F,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAA,kBAAa,EAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAiB,EAAE,GAA0B;IAC5E,MAAM,KAAK,GAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ModulePart } from "../interfaces";
2
+ export declare const MODULE_PARTS: ModulePart[];
3
+ export declare function isModulePart(value: string): value is ModulePart;
4
+ //# sourceMappingURL=parts.d.ts.map
@@ -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":"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"}
1
+ {"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/utils/patch-index.ts"],"names":[],"mappings":";;AAIA,wCAiDC;AAED,8CAKC;AAED,4CAiBC;AA/ED,2BAA6D;AAI7D,SAAgB,cAAc,CAAC,SAAiB,EAAE,KAAkB,EAAE,WAAmB;IACvF,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC,MAAM,sBAAsB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,WAAW,CAAC;IACrG,MAAM,OAAO,GAAG,YAAY,WAAW,IAAI,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC;IAEnF,IAAI,OAAO,GAAG,IAAA,iBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC5D,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;QAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,eAAe,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;YACjD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,GAAG,UAAU,KAAK,OAAO,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,GAAG,UAAU,KAAK,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACtE,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,IAAI,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAA,kBAAa,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAkB,EAAE,WAAmB;IACvE,OAAO;;SAEA,KAAK,CAAC,MAAM,sBAAsB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;WAC1D,WAAW,IAAI,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC;AAClE,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAiB,EAAE,KAAkB,EAAE,WAAmB;IACzF,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC,MAAM,sBAAsB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,WAAW,CAAC;IACrG,MAAM,OAAO,GAAG,YAAY,WAAW,IAAI,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,UAAU,CAAC;IAEnF,MAAM,KAAK,GAAG,IAAA,iBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC;IAE/E,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAA,kBAAa,EAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -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
  },