@semacode/cli 1.5.30 → 1.5.31
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/dist/comandos.js +33 -0
- package/dist/comandos.js.map +1 -1
- package/dist/dev/index.d.ts +18 -0
- package/dist/dev/index.js +143 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +23 -0
- package/dist/init/index.js +112 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/templates.d.ts +11 -0
- package/dist/init/templates.js +660 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +174 -0
- package/dist/sync/index.js.map +1 -0
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.d.ts +22 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +97 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/index.js +1 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
- package/node_modules/@sema/nucleo/src/diagnosticos/melhorador.ts +130 -0
- package/node_modules/@sema/nucleo/src/index.ts +56 -55
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
// Templates para sema init --template
|
|
2
|
+
// Contrato: cli_init_templates.sema
|
|
3
|
+
const templateCrudSimples = (moduloNome) => `module ${moduloNome} {
|
|
4
|
+
entity Item {
|
|
5
|
+
fields {
|
|
6
|
+
id: Id
|
|
7
|
+
nome: Texto
|
|
8
|
+
descricao: Texto
|
|
9
|
+
ativo: Booleano
|
|
10
|
+
criado_em: Timestamp
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
task criar_item {
|
|
15
|
+
input {
|
|
16
|
+
nome: Texto required
|
|
17
|
+
descricao: Texto optional
|
|
18
|
+
}
|
|
19
|
+
output {
|
|
20
|
+
item: Item
|
|
21
|
+
}
|
|
22
|
+
rules {
|
|
23
|
+
nome deve_ser preenchido
|
|
24
|
+
}
|
|
25
|
+
effects {
|
|
26
|
+
persistencia Item
|
|
27
|
+
auditoria item_criado
|
|
28
|
+
}
|
|
29
|
+
guarantees {
|
|
30
|
+
item existe
|
|
31
|
+
}
|
|
32
|
+
tests {
|
|
33
|
+
caso "cria item basico" {
|
|
34
|
+
given {
|
|
35
|
+
nome: "Novo Item"
|
|
36
|
+
}
|
|
37
|
+
expect {
|
|
38
|
+
sucesso: verdadeiro
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
task listar_itens {
|
|
45
|
+
input {
|
|
46
|
+
ativo: Booleano optional
|
|
47
|
+
pagina: Inteiro optional
|
|
48
|
+
limite: Inteiro optional
|
|
49
|
+
}
|
|
50
|
+
output {
|
|
51
|
+
itens: Lista<Item>
|
|
52
|
+
total: Inteiro
|
|
53
|
+
}
|
|
54
|
+
effects {
|
|
55
|
+
consulta Item
|
|
56
|
+
}
|
|
57
|
+
guarantees {
|
|
58
|
+
itens existe
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
route itens {
|
|
63
|
+
metodo: POST
|
|
64
|
+
caminho: /itens
|
|
65
|
+
task: criar_item
|
|
66
|
+
finalidade: criar_novo_item
|
|
67
|
+
input {
|
|
68
|
+
nome: Texto
|
|
69
|
+
descricao: Texto
|
|
70
|
+
}
|
|
71
|
+
output {
|
|
72
|
+
item: Item
|
|
73
|
+
}
|
|
74
|
+
auth {
|
|
75
|
+
modo: obrigatorio
|
|
76
|
+
}
|
|
77
|
+
authz {
|
|
78
|
+
escopo: ${moduloNome}.criar
|
|
79
|
+
}
|
|
80
|
+
audit {
|
|
81
|
+
evento: ${moduloNome}.item.criado
|
|
82
|
+
ator: auth.usuario
|
|
83
|
+
retencao: "90d"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}`;
|
|
87
|
+
const templateAuthCompleto = (moduloNome) => `module ${moduloNome} {
|
|
88
|
+
entity Usuario {
|
|
89
|
+
fields {
|
|
90
|
+
id: Id
|
|
91
|
+
email: Email
|
|
92
|
+
senha_hash: Texto
|
|
93
|
+
papel: Texto
|
|
94
|
+
ativo: Booleano
|
|
95
|
+
ultimo_login: Timestamp
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
task autenticar_usuario {
|
|
100
|
+
input {
|
|
101
|
+
email: Email required
|
|
102
|
+
senha: Texto required
|
|
103
|
+
}
|
|
104
|
+
output {
|
|
105
|
+
token: Texto
|
|
106
|
+
usuario: Usuario
|
|
107
|
+
expiracao: Timestamp
|
|
108
|
+
}
|
|
109
|
+
rules {
|
|
110
|
+
email deve_ser email_valido
|
|
111
|
+
senha deve_ter tamanho >= 8
|
|
112
|
+
}
|
|
113
|
+
effects {
|
|
114
|
+
consulta Usuario
|
|
115
|
+
auditoria login_tentativa
|
|
116
|
+
}
|
|
117
|
+
forbidden {
|
|
118
|
+
expor_senha_em_log
|
|
119
|
+
retornar_senha_hash
|
|
120
|
+
permitir_credencial_inativa
|
|
121
|
+
}
|
|
122
|
+
guarantees {
|
|
123
|
+
token existe
|
|
124
|
+
expiracao > agora
|
|
125
|
+
}
|
|
126
|
+
error {
|
|
127
|
+
credenciais_invalidas: "Email ou senha incorretos."
|
|
128
|
+
conta_inativa: "Conta desativada. Contate o administrador."
|
|
129
|
+
senha_fraca: "Senha nao atende aos requisitos minimos."
|
|
130
|
+
}
|
|
131
|
+
tests {
|
|
132
|
+
caso "login com sucesso" {
|
|
133
|
+
given {
|
|
134
|
+
email: "user@exemplo.com"
|
|
135
|
+
senha: "senha123"
|
|
136
|
+
}
|
|
137
|
+
expect {
|
|
138
|
+
sucesso: verdadeiro
|
|
139
|
+
token existe
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
task registrar_usuario {
|
|
146
|
+
input {
|
|
147
|
+
email: Email required
|
|
148
|
+
senha: Texto required
|
|
149
|
+
confirmar_senha: Texto required
|
|
150
|
+
}
|
|
151
|
+
output {
|
|
152
|
+
usuario: Usuario
|
|
153
|
+
}
|
|
154
|
+
rules {
|
|
155
|
+
email deve_ser email_valido
|
|
156
|
+
email deve_ser unico em Usuario.email
|
|
157
|
+
senha deve_ter tamanho >= 8
|
|
158
|
+
senha deve_coincidir com confirmar_senha
|
|
159
|
+
}
|
|
160
|
+
effects {
|
|
161
|
+
persistencia Usuario
|
|
162
|
+
evento usuario_registrado
|
|
163
|
+
auditoria cadastro_novo
|
|
164
|
+
}
|
|
165
|
+
forbidden {
|
|
166
|
+
armazenar_senha_texto_plano
|
|
167
|
+
permitir_email_duplicado
|
|
168
|
+
}
|
|
169
|
+
guarantees {
|
|
170
|
+
usuario existe
|
|
171
|
+
usuario.senha_hash nao_eh_texto_plano
|
|
172
|
+
}
|
|
173
|
+
error {
|
|
174
|
+
email_duplicado: "Ja existe conta com este email."
|
|
175
|
+
senha_fraca: "Senha deve ter pelo menos 8 caracteres."
|
|
176
|
+
senhas_diferentes: "As senhas nao coincidem."
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}`;
|
|
180
|
+
const templateApiRest = (moduloNome) => `module ${moduloNome} {
|
|
181
|
+
docs {
|
|
182
|
+
resumo: "API REST completa com CRUD, autenticacao e paginacao."
|
|
183
|
+
versao: "1.0.0"
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
entity Recurso {
|
|
187
|
+
fields {
|
|
188
|
+
id: Id
|
|
189
|
+
titulo: Texto
|
|
190
|
+
conteudo: Texto
|
|
191
|
+
status: Texto
|
|
192
|
+
criado_por: Id
|
|
193
|
+
criado_em: Timestamp
|
|
194
|
+
atualizado_em: Timestamp
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
task criar_recurso {
|
|
199
|
+
input {
|
|
200
|
+
titulo: Texto required
|
|
201
|
+
conteudo: Texto required
|
|
202
|
+
}
|
|
203
|
+
output {
|
|
204
|
+
recurso: Recurso
|
|
205
|
+
}
|
|
206
|
+
rules {
|
|
207
|
+
titulo deve_ser preenchido
|
|
208
|
+
conteudo deve_ser preenchido
|
|
209
|
+
}
|
|
210
|
+
effects {
|
|
211
|
+
persistencia Recurso
|
|
212
|
+
auditoria recurso_criado
|
|
213
|
+
}
|
|
214
|
+
auth {
|
|
215
|
+
modo: obrigatorio
|
|
216
|
+
}
|
|
217
|
+
authz {
|
|
218
|
+
escopo: ${moduloNome}.escrever
|
|
219
|
+
papeis: [admin, editor]
|
|
220
|
+
}
|
|
221
|
+
dados {
|
|
222
|
+
input {
|
|
223
|
+
titulo: publico
|
|
224
|
+
conteudo: interno
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
audit {
|
|
228
|
+
evento: ${moduloNome}.recurso.criado
|
|
229
|
+
ator: auth.usuario
|
|
230
|
+
retencao: "90d"
|
|
231
|
+
}
|
|
232
|
+
guarantees {
|
|
233
|
+
recurso existe
|
|
234
|
+
recurso.criado_por == auth.usuario_id
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
task obter_recurso {
|
|
239
|
+
input {
|
|
240
|
+
id: Id required
|
|
241
|
+
}
|
|
242
|
+
output {
|
|
243
|
+
recurso: Recurso
|
|
244
|
+
}
|
|
245
|
+
rules {
|
|
246
|
+
id deve_ser valido
|
|
247
|
+
}
|
|
248
|
+
effects {
|
|
249
|
+
consulta Recurso
|
|
250
|
+
}
|
|
251
|
+
auth {
|
|
252
|
+
modo: opcional
|
|
253
|
+
}
|
|
254
|
+
authz {
|
|
255
|
+
escopo: ${moduloNome}.ler
|
|
256
|
+
}
|
|
257
|
+
guarantees {
|
|
258
|
+
recurso existe
|
|
259
|
+
}
|
|
260
|
+
error {
|
|
261
|
+
nao_encontrado: "Recurso nao encontrado."
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
task listar_recursos {
|
|
266
|
+
input {
|
|
267
|
+
status: Texto optional
|
|
268
|
+
pagina: Inteiro optional
|
|
269
|
+
limite: Inteiro optional
|
|
270
|
+
ordenar_por: Texto optional
|
|
271
|
+
}
|
|
272
|
+
output {
|
|
273
|
+
recursos: Lista<Recurso>
|
|
274
|
+
total: Inteiro
|
|
275
|
+
pagina: Inteiro
|
|
276
|
+
total_paginas: Inteiro
|
|
277
|
+
}
|
|
278
|
+
rules {
|
|
279
|
+
limite quando preenchido deve_ser <= 100
|
|
280
|
+
pagina quando preenchido deve_ser >= 1
|
|
281
|
+
}
|
|
282
|
+
effects {
|
|
283
|
+
consulta Recurso
|
|
284
|
+
}
|
|
285
|
+
auth {
|
|
286
|
+
modo: anonimo
|
|
287
|
+
}
|
|
288
|
+
guarantees {
|
|
289
|
+
recursos existe
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
task atualizar_recurso {
|
|
294
|
+
input {
|
|
295
|
+
id: Id required
|
|
296
|
+
titulo: Texto optional
|
|
297
|
+
conteudo: Texto optional
|
|
298
|
+
status: Texto optional
|
|
299
|
+
}
|
|
300
|
+
output {
|
|
301
|
+
recurso: Recurso
|
|
302
|
+
}
|
|
303
|
+
rules {
|
|
304
|
+
id deve_ser valido
|
|
305
|
+
pelo_menos_um_campo_preenchido
|
|
306
|
+
}
|
|
307
|
+
effects {
|
|
308
|
+
persistencia Recurso
|
|
309
|
+
auditoria recurso_atualizado
|
|
310
|
+
}
|
|
311
|
+
auth {
|
|
312
|
+
modo: obrigatorio
|
|
313
|
+
}
|
|
314
|
+
authz {
|
|
315
|
+
escopo: ${moduloNome}.escrever
|
|
316
|
+
regra: recurso.criado_por == auth.usuario_id ou auth.papel == admin
|
|
317
|
+
}
|
|
318
|
+
guarantees {
|
|
319
|
+
recurso existe
|
|
320
|
+
atualizado_em atualizado
|
|
321
|
+
}
|
|
322
|
+
error {
|
|
323
|
+
nao_encontrado: "Recurso nao encontrado."
|
|
324
|
+
sem_permissao: "Voce nao tem permissao para editar este recurso."
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
task excluir_recurso {
|
|
329
|
+
input {
|
|
330
|
+
id: Id required
|
|
331
|
+
confirmar: Booleano required
|
|
332
|
+
}
|
|
333
|
+
output {
|
|
334
|
+
excluido: Booleano
|
|
335
|
+
}
|
|
336
|
+
rules {
|
|
337
|
+
id deve_ser valido
|
|
338
|
+
confirmar == verdadeiro
|
|
339
|
+
}
|
|
340
|
+
effects {
|
|
341
|
+
persistencia Recurso criticidade = alta
|
|
342
|
+
auditoria recurso_excluido criticidade = alta
|
|
343
|
+
}
|
|
344
|
+
forbidden {
|
|
345
|
+
excluir_sem_confirmacao
|
|
346
|
+
cascade_delete_sem_backup
|
|
347
|
+
}
|
|
348
|
+
auth {
|
|
349
|
+
modo: obrigatorio
|
|
350
|
+
}
|
|
351
|
+
authz {
|
|
352
|
+
escopo: ${moduloNome}.deletar
|
|
353
|
+
regra: auth.papel == admin ou recurso.criado_por == auth.usuario_id
|
|
354
|
+
}
|
|
355
|
+
guarantees {
|
|
356
|
+
excluido == verdadeiro
|
|
357
|
+
}
|
|
358
|
+
error {
|
|
359
|
+
nao_encontrado: "Recurso nao encontrado."
|
|
360
|
+
sem_confirmacao: "Exclusao requer confirmacao explicita."
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
route recursos_criar {
|
|
365
|
+
metodo: POST
|
|
366
|
+
caminho: /recursos
|
|
367
|
+
task: criar_recurso
|
|
368
|
+
finalidade: criar_recurso_api
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
route recursos_listar {
|
|
372
|
+
metodo: GET
|
|
373
|
+
caminho: /recursos
|
|
374
|
+
task: listar_recursos
|
|
375
|
+
finalidade: listar_recursos_api
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
route recursos_obter {
|
|
379
|
+
metodo: GET
|
|
380
|
+
caminho: /recursos/:id
|
|
381
|
+
task: obter_recurso
|
|
382
|
+
finalidade: obter_recurso_api
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
route recursos_atualizar {
|
|
386
|
+
metodo: PUT
|
|
387
|
+
caminho: /recursos/:id
|
|
388
|
+
task: atualizar_recurso
|
|
389
|
+
finalidade: atualizar_recurso_api
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
route recursos_excluir {
|
|
393
|
+
metodo: DELETE
|
|
394
|
+
caminho: /recursos/:id
|
|
395
|
+
task: excluir_recurso
|
|
396
|
+
finalidade: excluir_recurso_api
|
|
397
|
+
}
|
|
398
|
+
}`;
|
|
399
|
+
const templateWorkflow = (moduloNome) => `module ${moduloNome} {
|
|
400
|
+
docs {
|
|
401
|
+
resumo: "Workflow de automacao com trigger, acoes e condicoes."
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
entity Workflow {
|
|
405
|
+
fields {
|
|
406
|
+
id: Id
|
|
407
|
+
nome: Texto
|
|
408
|
+
ativo: Booleano
|
|
409
|
+
trigger_tipo: Texto
|
|
410
|
+
trigger_config: Texto
|
|
411
|
+
acoes: Lista<Texto>
|
|
412
|
+
criado_em: Timestamp
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
task executar_workflow {
|
|
417
|
+
input {
|
|
418
|
+
workflow_id: Id required
|
|
419
|
+
payload: Texto required
|
|
420
|
+
contexto: Mapa<Texto, Texto> optional
|
|
421
|
+
}
|
|
422
|
+
output {
|
|
423
|
+
execucao_id: Id
|
|
424
|
+
resultado: Texto
|
|
425
|
+
status: Texto
|
|
426
|
+
duracao_ms: Inteiro
|
|
427
|
+
}
|
|
428
|
+
rules {
|
|
429
|
+
workflow_id deve_ser valido
|
|
430
|
+
payload deve_ser json_valido
|
|
431
|
+
}
|
|
432
|
+
effects {
|
|
433
|
+
consulta Workflow
|
|
434
|
+
consulta workflow_runtime
|
|
435
|
+
persistencia execucao_log
|
|
436
|
+
auditoria workflow_executado
|
|
437
|
+
}
|
|
438
|
+
execucao {
|
|
439
|
+
timeout: "30s"
|
|
440
|
+
retry: "ate 3 tentativas"
|
|
441
|
+
idempotencia: verdadeiro
|
|
442
|
+
}
|
|
443
|
+
guarantees {
|
|
444
|
+
execucao_id existe
|
|
445
|
+
status em ["sucesso", "falha", "timeout"]
|
|
446
|
+
}
|
|
447
|
+
error {
|
|
448
|
+
workflow_nao_encontrado: "Workflow nao encontrado."
|
|
449
|
+
workflow_inativo: "Workflow esta desativado."
|
|
450
|
+
execucao_timeout: "Workflow excedeu tempo limite."
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
flow orquestracao_workflow {
|
|
455
|
+
workflow_id: Id
|
|
456
|
+
payload: Texto
|
|
457
|
+
etapa validar usa executar_workflow com workflow_id = workflow_id, payload = payload em_sucesso processar em_erro registrar_falha
|
|
458
|
+
etapa processar usa processar_resultado com execucao_id = validar.execucao_id depende_de validar
|
|
459
|
+
etapa registrar_falha usa log_erro_workflow com workflow_id = workflow_id, erro = validar.error depende_de validar
|
|
460
|
+
}
|
|
461
|
+
}`;
|
|
462
|
+
const templatePedido = (moduloNome) => `module ${moduloNome} {
|
|
463
|
+
entity Pedido {
|
|
464
|
+
fields {
|
|
465
|
+
id: Id
|
|
466
|
+
cliente_id: Id
|
|
467
|
+
itens: Lista<Texto>
|
|
468
|
+
valor_total: Decimal
|
|
469
|
+
status: Texto
|
|
470
|
+
criado_em: Timestamp
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
task criar_pedido {
|
|
475
|
+
input {
|
|
476
|
+
cliente_id: Id required
|
|
477
|
+
itens: Lista<Texto> required
|
|
478
|
+
}
|
|
479
|
+
output {
|
|
480
|
+
pedido: Pedido
|
|
481
|
+
}
|
|
482
|
+
rules {
|
|
483
|
+
cliente_id deve_ser valido
|
|
484
|
+
itens deve_ser nao_vazio
|
|
485
|
+
}
|
|
486
|
+
effects {
|
|
487
|
+
persistencia Pedido
|
|
488
|
+
evento pedido_criado
|
|
489
|
+
}
|
|
490
|
+
guarantees {
|
|
491
|
+
pedido existe
|
|
492
|
+
pedido.status == "pendente"
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}`;
|
|
496
|
+
const templateUsuario = (moduloNome) => `module ${moduloNome} {
|
|
497
|
+
entity Usuario {
|
|
498
|
+
fields {
|
|
499
|
+
id: Id
|
|
500
|
+
nome: Texto
|
|
501
|
+
email: Email
|
|
502
|
+
ativo: Booleano
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
task criar_usuario {
|
|
507
|
+
input {
|
|
508
|
+
nome: Texto required
|
|
509
|
+
email: Email required
|
|
510
|
+
}
|
|
511
|
+
output {
|
|
512
|
+
usuario: Usuario
|
|
513
|
+
}
|
|
514
|
+
rules {
|
|
515
|
+
nome deve_ser preenchido
|
|
516
|
+
email deve_ser email_valido
|
|
517
|
+
email deve_ser unico em Usuario.email
|
|
518
|
+
}
|
|
519
|
+
effects {
|
|
520
|
+
persistencia Usuario
|
|
521
|
+
evento usuario_criado
|
|
522
|
+
auditoria cadastro_usuario
|
|
523
|
+
}
|
|
524
|
+
guarantees {
|
|
525
|
+
usuario existe
|
|
526
|
+
persistencia concluida
|
|
527
|
+
}
|
|
528
|
+
error {
|
|
529
|
+
email_duplicado: "Ja existe usuario com este email."
|
|
530
|
+
entrada_invalida: "Os dados informados nao atendem as regras."
|
|
531
|
+
}
|
|
532
|
+
tests {
|
|
533
|
+
caso "cria usuario valido" {
|
|
534
|
+
given {
|
|
535
|
+
nome: "Ana"
|
|
536
|
+
email: "ana@empresa.com"
|
|
537
|
+
}
|
|
538
|
+
expect {
|
|
539
|
+
sucesso: verdadeiro
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}`;
|
|
545
|
+
const templateUpload = (moduloNome) => `module ${moduloNome} {
|
|
546
|
+
entity Arquivo {
|
|
547
|
+
fields {
|
|
548
|
+
id: Id
|
|
549
|
+
nome_original: Texto
|
|
550
|
+
mime_type: Texto
|
|
551
|
+
tamanho_bytes: Inteiro
|
|
552
|
+
url: Texto
|
|
553
|
+
upload_por: Id
|
|
554
|
+
criado_em: Timestamp
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
task upload_arquivo {
|
|
559
|
+
input {
|
|
560
|
+
arquivo_binario: Texto required
|
|
561
|
+
nome_original: Texto required
|
|
562
|
+
mime_type: Texto required
|
|
563
|
+
}
|
|
564
|
+
output {
|
|
565
|
+
arquivo: Arquivo
|
|
566
|
+
url_acesso: Texto
|
|
567
|
+
}
|
|
568
|
+
rules {
|
|
569
|
+
tamanho_bytes deve_ser <= 10485760 // 10MB
|
|
570
|
+
mime_type em ["image/jpeg", "image/png", "application/pdf", "text/plain"]
|
|
571
|
+
}
|
|
572
|
+
effects {
|
|
573
|
+
persistencia Arquivo
|
|
574
|
+
storage.write arquivo_binario
|
|
575
|
+
auditoria arquivo_uploadado
|
|
576
|
+
}
|
|
577
|
+
forbidden {
|
|
578
|
+
executar_arquivo_uploadado
|
|
579
|
+
armazenar_exe_ou_script
|
|
580
|
+
permitir_upload_anonimo_sem_rate_limit
|
|
581
|
+
}
|
|
582
|
+
guarantees {
|
|
583
|
+
arquivo existe
|
|
584
|
+
url_acesso existe
|
|
585
|
+
}
|
|
586
|
+
error {
|
|
587
|
+
arquivo_muito_grande: "Arquivo excede 10MB."
|
|
588
|
+
tipo_nao_permitido: "Tipo de arquivo nao permitido."
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}`;
|
|
592
|
+
export const templatesDisponiveis = {
|
|
593
|
+
"crud-simples": {
|
|
594
|
+
nome: "crud-simples",
|
|
595
|
+
categoria: "basico",
|
|
596
|
+
descricao: "CRUD simples com entity, tasks basicas e route POST",
|
|
597
|
+
linhasBase: 45,
|
|
598
|
+
camposEditaveis: ["nome_modulo", "nome_entity", "nome_task"],
|
|
599
|
+
conteudo: templateCrudSimples
|
|
600
|
+
},
|
|
601
|
+
"auth-completo": {
|
|
602
|
+
nome: "auth-completo",
|
|
603
|
+
categoria: "seguranca",
|
|
604
|
+
descricao: "Autenticacao completa com login, registro, tokens e senha",
|
|
605
|
+
linhasBase: 60,
|
|
606
|
+
camposEditaveis: ["nome_modulo", "escopos_authz"],
|
|
607
|
+
conteudo: templateAuthCompleto
|
|
608
|
+
},
|
|
609
|
+
"api-rest": {
|
|
610
|
+
nome: "api-rest",
|
|
611
|
+
categoria: "api",
|
|
612
|
+
descricao: "API REST completa com CRUD, paginacao, autenticacao e 5 routes",
|
|
613
|
+
linhasBase: 180,
|
|
614
|
+
camposEditaveis: ["nome_modulo", "nome_entity", "campos_entity"],
|
|
615
|
+
conteudo: templateApiRest
|
|
616
|
+
},
|
|
617
|
+
"workflow": {
|
|
618
|
+
nome: "workflow",
|
|
619
|
+
categoria: "automation",
|
|
620
|
+
descricao: "Workflow de automacao com trigger, execucao e flow",
|
|
621
|
+
linhasBase: 60,
|
|
622
|
+
camposEditaveis: ["nome_modulo", "triggers", "acoes"],
|
|
623
|
+
conteudo: templateWorkflow
|
|
624
|
+
},
|
|
625
|
+
"pedido": {
|
|
626
|
+
nome: "pedido",
|
|
627
|
+
categoria: "ecommerce",
|
|
628
|
+
descricao: "Template simplificado de pedido para ecommerce",
|
|
629
|
+
linhasBase: 30,
|
|
630
|
+
camposEditaveis: ["nome_modulo", "campos_pedido"],
|
|
631
|
+
conteudo: templatePedido
|
|
632
|
+
},
|
|
633
|
+
"usuario": {
|
|
634
|
+
nome: "usuario",
|
|
635
|
+
categoria: "cadastro",
|
|
636
|
+
descricao: "Cadastro de usuario com email unico e validacoes",
|
|
637
|
+
linhasBase: 40,
|
|
638
|
+
camposEditaveis: ["nome_modulo", "campos_usuario"],
|
|
639
|
+
conteudo: templateUsuario
|
|
640
|
+
},
|
|
641
|
+
"upload": {
|
|
642
|
+
nome: "upload",
|
|
643
|
+
categoria: "arquivos",
|
|
644
|
+
descricao: "Upload de arquivos com validacao de tipo e tamanho",
|
|
645
|
+
linhasBase: 50,
|
|
646
|
+
camposEditaveis: ["nome_modulo", "tipos_permitidos", "tamanho_maximo"],
|
|
647
|
+
conteudo: templateUpload
|
|
648
|
+
}
|
|
649
|
+
};
|
|
650
|
+
export function listarTemplates(categoriaFiltro) {
|
|
651
|
+
const templates = Object.values(templatesDisponiveis);
|
|
652
|
+
if (categoriaFiltro) {
|
|
653
|
+
return templates.filter(t => t.categoria === categoriaFiltro);
|
|
654
|
+
}
|
|
655
|
+
return templates;
|
|
656
|
+
}
|
|
657
|
+
export function obterTemplate(nome) {
|
|
658
|
+
return templatesDisponiveis[nome] || null;
|
|
659
|
+
}
|
|
660
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MapeamentoTipo {
|
|
2
|
+
semaTipo: string;
|
|
3
|
+
prismaTipo: string;
|
|
4
|
+
atributosPrisma: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function mapearTiposSemaPrisma(): {
|
|
7
|
+
mapeamentos: MapeamentoTipo[];
|
|
8
|
+
cobertura: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function gerarSchemaPrisma(pastaContratos: string, saidaSchema: string, datasourceProvider?: string): Promise<{
|
|
11
|
+
schemaGerado: string;
|
|
12
|
+
modelsGerados: number;
|
|
13
|
+
enumsGerados: number;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function importarSchemaPrisma(caminhoSchema: string, pastaSaida: string, nomeModulo: string): Promise<{
|
|
16
|
+
contratosGerados: string[];
|
|
17
|
+
entitiesCriadas: number;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function compararDivergencias(pastaContratos: string, caminhoSchema: string): Promise<{
|
|
20
|
+
divergencias: string[];
|
|
21
|
+
total: number;
|
|
22
|
+
breaking: number;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function comandoSyncPrisma(args: string[]): Promise<void>;
|