@hed-hog/developer-mode 0.0.270 → 0.0.273

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 (2) hide show
  1. package/README.md +318 -0
  2. package/package.json +4 -4
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.270",
3
+ "version": "0.0.273",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -10,10 +10,10 @@
10
10
  "@nestjs/jwt": "^11",
11
11
  "@nestjs/mapped-types": "*",
12
12
  "@hed-hog/api": "0.0.4",
13
- "@hed-hog/api-prisma": "0.0.5",
13
+ "@hed-hog/api-locale": "0.0.13",
14
+ "@hed-hog/core": "0.0.273",
14
15
  "@hed-hog/api-pagination": "0.0.6",
15
- "@hed-hog/core": "0.0.270",
16
- "@hed-hog/api-locale": "0.0.13"
16
+ "@hed-hog/api-prisma": "0.0.5"
17
17
  },
18
18
  "exports": {
19
19
  ".": {