@hed-hog/developer-mode 0.0.270 → 0.0.274
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/README.md +318 -0
- package/package.json +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# @hed-hog/developer-mode
|
|
2
|
+
|
|
3
|
+
## 1. Visão geral do módulo
|
|
4
|
+
|
|
5
|
+
O módulo `@hed-hog/developer-mode` fornece funcionalidades para monitoramento e execução de scripts em modo desenvolvedor dentro do monorepo HedHog. Ele oferece endpoints para obtenção de informações detalhadas sobre aplicativos, bibliotecas, banco de dados, git e estatísticas do projeto, além de permitir a execução controlada e streaming em tempo real de scripts definidos nos pacotes do monorepo.
|
|
6
|
+
|
|
7
|
+
## 2. Escopo e responsabilidades
|
|
8
|
+
|
|
9
|
+
- Coletar e expor dados do ambiente de desenvolvimento, incluindo:
|
|
10
|
+
- Informações sobre apps e bibliotecas presentes no monorepo.
|
|
11
|
+
- Estado do banco de dados e últimas migrações.
|
|
12
|
+
- Informações do repositório Git, como branch atual, PRs abertos e commits recentes.
|
|
13
|
+
- Estatísticas gerais do projeto, como uso de disco, versão do Node.js e uptime.
|
|
14
|
+
- Permitir a execução segura e monitorada de scripts definidos nos `package.json` de apps e bibliotecas, com streaming dos logs via Server-Sent Events (SSE).
|
|
15
|
+
- Validar permissões para execução de scripts, limitando a scripts permitidos por app ou biblioteca.
|
|
16
|
+
- Integrar com outros módulos do monorepo, como `api-locale`, `api-pagination` e `api-prisma`.
|
|
17
|
+
|
|
18
|
+
## 3. Endpoints
|
|
19
|
+
|
|
20
|
+
### GET `/developer-mode`
|
|
21
|
+
|
|
22
|
+
- **Método:** GET
|
|
23
|
+
- **Autenticação:** Requer autenticação com papel `admin` ou `admin-developer-mode`.
|
|
24
|
+
- **Descrição:** Retorna um objeto com dados completos do modo desenvolvedor, incluindo apps, bibliotecas, banco de dados, git e estatísticas do projeto.
|
|
25
|
+
- **Parâmetros:** Nenhum.
|
|
26
|
+
- **Resposta:**
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"apps": [
|
|
31
|
+
{
|
|
32
|
+
"name": "string",
|
|
33
|
+
"path": "string",
|
|
34
|
+
"framework": "nestjs" | "nextjs" | "angular" | "vue" | "react-native" | "expo",
|
|
35
|
+
"database": "string | undefined",
|
|
36
|
+
"description": "string",
|
|
37
|
+
"port": "number | undefined",
|
|
38
|
+
"status": "running" | "stopped" | "error",
|
|
39
|
+
"scripts": ["string"]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"libraries": [
|
|
43
|
+
{
|
|
44
|
+
"name": "string",
|
|
45
|
+
"version": "string",
|
|
46
|
+
"latestVersion": "string | undefined",
|
|
47
|
+
"installed": true,
|
|
48
|
+
"description": "string",
|
|
49
|
+
"scripts": [
|
|
50
|
+
{
|
|
51
|
+
"name": "string",
|
|
52
|
+
"command": "string"
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"database": {
|
|
58
|
+
"name": "string",
|
|
59
|
+
"host": "string",
|
|
60
|
+
"port": "number",
|
|
61
|
+
"type": "postgresql" | "mysql" | "unknown",
|
|
62
|
+
"user": "string | undefined",
|
|
63
|
+
"database": "string | undefined",
|
|
64
|
+
"tables": "number | undefined",
|
|
65
|
+
"size": "string | undefined",
|
|
66
|
+
"connections": {
|
|
67
|
+
"active": "number",
|
|
68
|
+
"max": "number"
|
|
69
|
+
},
|
|
70
|
+
"lastMigration": {
|
|
71
|
+
"name": "string",
|
|
72
|
+
"date": "string",
|
|
73
|
+
"status": "success" | "failed" | "pending"
|
|
74
|
+
} | undefined,
|
|
75
|
+
"connected": "boolean | undefined"
|
|
76
|
+
},
|
|
77
|
+
"git": {
|
|
78
|
+
"repoName": "string | undefined",
|
|
79
|
+
"currentBranch": "string",
|
|
80
|
+
"totalBranches": "number",
|
|
81
|
+
"openPRs": "number",
|
|
82
|
+
"recentCommits": [
|
|
83
|
+
{
|
|
84
|
+
"hash": "string",
|
|
85
|
+
"message": "string",
|
|
86
|
+
"author": "string",
|
|
87
|
+
"authorAvatar": "string | undefined",
|
|
88
|
+
"date": "string",
|
|
89
|
+
"branch": "string"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
"stats": {
|
|
94
|
+
"nodeVersion": "string",
|
|
95
|
+
"diskUsage": "string",
|
|
96
|
+
"totalApps": "number",
|
|
97
|
+
"totalLibraries": "number",
|
|
98
|
+
"dbConnections": "number",
|
|
99
|
+
"gitBranch": "string",
|
|
100
|
+
"lastCommit": "string",
|
|
101
|
+
"uptime": "string"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- **Erros comuns:**
|
|
107
|
+
- 401 Unauthorized: Usuário não autenticado ou sem permissão.
|
|
108
|
+
- 500 Internal Server Error: Erro interno ao coletar dados.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### POST `/developer-mode/scripts/stream`
|
|
113
|
+
|
|
114
|
+
- **Método:** POST
|
|
115
|
+
- **Autenticação:** Pública (não requer autenticação).
|
|
116
|
+
- **Descrição:** Executa um script permitido para um app ou biblioteca e transmite a saída em tempo real via Server-Sent Events (SSE).
|
|
117
|
+
- **Parâmetros:**
|
|
118
|
+
|
|
119
|
+
- **Body (JSON):**
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"targetType": "app" | "library",
|
|
124
|
+
"targetName": "string",
|
|
125
|
+
"scriptName": "string"
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- `targetType`: Define se o script será executado em um app ou biblioteca.
|
|
130
|
+
- `targetName`: Nome do app ou biblioteca alvo.
|
|
131
|
+
- `scriptName`: Nome do script definido no `package.json` do alvo.
|
|
132
|
+
|
|
133
|
+
- **Resposta:** Fluxo SSE com eventos:
|
|
134
|
+
|
|
135
|
+
- `start`: Indica início da execução do script.
|
|
136
|
+
- `output`: Linhas de saída padrão do script.
|
|
137
|
+
- `error`: Linhas de erro ou mensagens de falha.
|
|
138
|
+
- `end`: Indica término da execução, com sucesso ou falha.
|
|
139
|
+
|
|
140
|
+
- **Erros comuns:**
|
|
141
|
+
- 400 Bad Request: Script ou alvo inválido ou não permitido.
|
|
142
|
+
- 500 Internal Server Error: Erro durante a execução do script.
|
|
143
|
+
|
|
144
|
+
## 4. Regras de autenticação e autorização
|
|
145
|
+
|
|
146
|
+
- O endpoint GET `/developer-mode` é protegido e requer que o usuário possua o papel `admin` ou `admin-developer-mode`.
|
|
147
|
+
- O endpoint POST `/developer-mode/scripts/stream` é público, porém a execução de scripts é restrita a scripts permitidos para cada app ou biblioteca conforme listas internas.
|
|
148
|
+
- Papéis definidos no módulo:
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
- slug: admin-developer-mode
|
|
152
|
+
name:
|
|
153
|
+
en: Developer Mode Administrator
|
|
154
|
+
pt: Administrador do Modo Desenvolvedor
|
|
155
|
+
description:
|
|
156
|
+
en: Administrator with full access to developer mode features.
|
|
157
|
+
pt: Administrador com acesso total às funcionalidades do modo desenvolvedor.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- Rotas protegidas:
|
|
161
|
+
|
|
162
|
+
```yaml
|
|
163
|
+
- url: /developer-mode
|
|
164
|
+
method: GET
|
|
165
|
+
relations:
|
|
166
|
+
role:
|
|
167
|
+
- where:
|
|
168
|
+
slug: admin
|
|
169
|
+
- where:
|
|
170
|
+
slug: admin-developer-mode
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 5. Estruturas de request/response
|
|
174
|
+
|
|
175
|
+
### DTO para execução de script (`RunScriptDTO`)
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
export class RunScriptDTO {
|
|
179
|
+
@IsIn(['app', 'library'])
|
|
180
|
+
targetType: 'app' | 'library';
|
|
181
|
+
|
|
182
|
+
@Matches(/^[a-zA-Z0-9_-]+$/)
|
|
183
|
+
targetName: string;
|
|
184
|
+
|
|
185
|
+
@Matches(/^[a-zA-Z0-9:_-]+$/)
|
|
186
|
+
scriptName: string;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
- `targetType`: Tipo do alvo, deve ser `'app'` ou `'library'`.
|
|
191
|
+
- `targetName`: Nome do app ou biblioteca, apenas caracteres alfanuméricos, underscore e hífen.
|
|
192
|
+
- `scriptName`: Nome do script, permite caracteres alfanuméricos, dois pontos, underscore e hífen.
|
|
193
|
+
|
|
194
|
+
### Resposta do GET `/developer-mode`
|
|
195
|
+
|
|
196
|
+
Conforme descrito na seção 3, contém objetos detalhados para apps, bibliotecas, banco de dados, git e estatísticas.
|
|
197
|
+
|
|
198
|
+
### Eventos SSE do POST `/developer-mode/scripts/stream`
|
|
199
|
+
|
|
200
|
+
Cada evento possui o formato:
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"message": "string",
|
|
205
|
+
"timestamp": "ISO 8601 string"
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Eventos possíveis: `start`, `output`, `error`, `end`.
|
|
210
|
+
|
|
211
|
+
## 6. Erros comuns
|
|
212
|
+
|
|
213
|
+
- **400 Bad Request**
|
|
214
|
+
- Script não permitido para o app ou biblioteca.
|
|
215
|
+
- App ou biblioteca não encontrada.
|
|
216
|
+
- Script não definido no `package.json` do alvo.
|
|
217
|
+
- **401 Unauthorized**
|
|
218
|
+
- Acesso ao endpoint GET `/developer-mode` sem autenticação ou sem papel adequado.
|
|
219
|
+
- **500 Internal Server Error**
|
|
220
|
+
- Falha ao coletar dados do sistema.
|
|
221
|
+
- Erro inesperado na execução do script.
|
|
222
|
+
|
|
223
|
+
## 7. Banco de dados (tabelas YAML)
|
|
224
|
+
|
|
225
|
+
Este módulo não define tabelas de banco de dados próprias. As permissões são gerenciadas via papéis (`role.yaml`) e rotas (`route.yaml`):
|
|
226
|
+
|
|
227
|
+
### role.yaml
|
|
228
|
+
|
|
229
|
+
```yaml
|
|
230
|
+
- slug: admin-developer-mode
|
|
231
|
+
name:
|
|
232
|
+
en: Developer Mode Administrator
|
|
233
|
+
pt: Administrador do Modo Desenvolvedor
|
|
234
|
+
description:
|
|
235
|
+
en: Administrator with full access to developer mode features.
|
|
236
|
+
pt: Administrador com acesso total às funcionalidades do modo desenvolvedor.
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### route.yaml
|
|
240
|
+
|
|
241
|
+
```yaml
|
|
242
|
+
- url: /developer-mode
|
|
243
|
+
method: GET
|
|
244
|
+
relations:
|
|
245
|
+
role:
|
|
246
|
+
- where:
|
|
247
|
+
slug: admin
|
|
248
|
+
- where:
|
|
249
|
+
slug: admin-developer-mode
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 8. Regras de negócio relevantes
|
|
253
|
+
|
|
254
|
+
- Scripts executáveis são restritos a uma lista branca para evitar execução arbitrária:
|
|
255
|
+
- Apps permitidos e seus scripts:
|
|
256
|
+
|
|
257
|
+
| App | Scripts Permitidos |
|
|
258
|
+
|--------|------------------------|
|
|
259
|
+
| admin | dev, build |
|
|
260
|
+
| web | dev, build |
|
|
261
|
+
| api | start:dev, build |
|
|
262
|
+
|
|
263
|
+
- Bibliotecas permitem scripts: `build`, `lint`, `test`, `patch`, `prod`.
|
|
264
|
+
|
|
265
|
+
- A execução de scripts é feita via `pnpm run <script>`, com múltiplos fallbacks para garantir compatibilidade em diferentes ambientes (Windows, Linux, etc).
|
|
266
|
+
- A saída dos scripts é transmitida em tempo real via SSE, com eventos estruturados para facilitar o consumo no frontend.
|
|
267
|
+
- O status dos apps é detectado tentando uma requisição HEAD na porta padrão associada a cada app.
|
|
268
|
+
- Informações do banco de dados são extraídas de arquivos `.env` e `docker-compose.yaml` para identificar conexão e estado.
|
|
269
|
+
- Informações do Git são obtidas via comandos Git, incluindo branch atual, número de branches, PRs abertos e últimos commits.
|
|
270
|
+
|
|
271
|
+
## 9. Guia rápido de uso (exemplos)
|
|
272
|
+
|
|
273
|
+
### Obter dados do modo desenvolvedor
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
curl -H "Authorization: Bearer <token>" https://api.seudominio.com/developer-mode
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Resposta JSON com dados completos do monorepo.
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
### Executar script com streaming SSE
|
|
284
|
+
|
|
285
|
+
Requisição POST para executar script `dev` no app `admin`:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
curl -N -X POST https://api.seudominio.com/developer-mode/scripts/stream \
|
|
289
|
+
-H "Content-Type: application/json" \
|
|
290
|
+
-d '{"targetType":"app","targetName":"admin","scriptName":"dev"}'
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
A resposta será um fluxo SSE com eventos `start`, `output`, `error` e `end`.
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
### Exemplo de evento SSE recebido
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
event: start
|
|
301
|
+
data: {"message":"Starting app script dev (apps/admin)...","timestamp":"2024-06-01T12:00:00.000Z"}
|
|
302
|
+
|
|
303
|
+
event: output
|
|
304
|
+
data: {"message":"[HedHog] Working directory: /path/to/apps/admin","timestamp":"2024-06-01T12:00:01.000Z"}
|
|
305
|
+
|
|
306
|
+
event: output
|
|
307
|
+
data: {"message":"[HedHog] Script target: apps/admin","timestamp":"2024-06-01T12:00:01.500Z"}
|
|
308
|
+
|
|
309
|
+
event: output
|
|
310
|
+
data: {"message":"Compiling...","timestamp":"2024-06-01T12:00:05.000Z"}
|
|
311
|
+
|
|
312
|
+
event: end
|
|
313
|
+
data: {"success":true,"timestamp":"2024-06-01T12:05:00.000Z"}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
Este módulo é essencial para desenvolvedores que desejam monitorar e interagir com o ambiente de desenvolvimento do monorepo HedHog de forma segura e eficiente.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hed-hog/developer-mode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.274",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"dependencies": {
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"@nestjs/jwt": "^11",
|
|
11
11
|
"@nestjs/mapped-types": "*",
|
|
12
12
|
"@hed-hog/api": "0.0.4",
|
|
13
|
-
"@hed-hog/
|
|
13
|
+
"@hed-hog/core": "0.0.274",
|
|
14
14
|
"@hed-hog/api-pagination": "0.0.6",
|
|
15
|
-
"@hed-hog/
|
|
15
|
+
"@hed-hog/api-prisma": "0.0.5",
|
|
16
16
|
"@hed-hog/api-locale": "0.0.13"
|
|
17
17
|
},
|
|
18
18
|
"exports": {
|