diff --git a/index-gerar.ts b/index-gerar.ts index 12affa3..e9ded57 100644 --- a/index-gerar.ts +++ b/index-gerar.ts @@ -1,18 +1,26 @@ -import prompts from 'prompts'; import * as sistemaArquivos from 'fs'; import * as caminho from 'path'; +import prompts from 'prompts'; + +import { Lexador } from '@designliquido/delegua/fontes/lexador'; +import { AvaliadorSintatico } from '@designliquido/delegua/fontes/avaliador-sintatico'; +import { Importador } from '@designliquido/delegua-node/fontes/importador'; +import { Classe } from '@designliquido/delegua/fontes/declaracoes'; +import { pluralizar } from '@designliquido/flexoes'; + const pontoDeEntradaGerar = async (argumentos: string[]) => { // argumentos[0] normalmente é o nome do executável, seja Node, Bun, etc. // argumentos[1] é o nome do arquivo deste ponto de entrada. // argumentos[2] é o nome do modelo correspondente. Se vir vazio, perguntar o nome. let nomeModelo = argumentos[2]; + const diretorioModelos = caminho.join(process.cwd(), 'modelos'); if (nomeModelo === undefined || nomeModelo.length <= 0) { const opcoesModelos = []; - sistemaArquivos.readdirSync(caminho.join(process.cwd(), "modelos")).forEach(arquivo => { + sistemaArquivos.readdirSync(diretorioModelos).forEach((arquivo) => { if (arquivo.endsWith('.delegua')) { const prefixoArquivo = arquivo.split('.')[0]; - opcoesModelos.push({title: prefixoArquivo, value: prefixoArquivo}); + opcoesModelos.push({ title: prefixoArquivo, value: prefixoArquivo }); } }); @@ -25,6 +33,36 @@ const pontoDeEntradaGerar = async (argumentos: string[]) => { nomeModelo = respostaNomeModelo.nomeModelo; } + + const lexador = new Lexador(false); + const avaliadorSintatico = new AvaliadorSintatico(false); + const importador = new Importador(lexador, avaliadorSintatico, {}, {}, false); + + const resultadoImportacao = importador.importar(caminho.join(diretorioModelos, nomeModelo + '.delegua')); + const declaracoes = resultadoImportacao.retornoAvaliadorSintatico.declaracoes; + + // Aqui apenas aceitamos declarações de classes. Pode ser mais de uma. + for (const declaracao of declaracoes.filter((d) => d instanceof Classe)) { + const declaracaoClasse = declaracao; + + const diretorioControladores = caminho.join(process.cwd(), 'controladores'); + + if (!sistemaArquivos.existsSync(diretorioControladores)) { + sistemaArquivos.mkdirSync(diretorioControladores); + } + + // Controlador: cria-se um arquivo `.delegua` com quatro rotas: rotaGet, rotaPost, rotaPut, rotaDelete. + const nomeControladorPlural = pluralizar(declaracaoClasse.simbolo.lexema).toLocaleLowerCase('pt'); + + const conteudoControlador = `liquido.rotaGet(funcao(requisicao, resposta) {\n resposta.lmht({ "titulo": "Liquido" })\n})`; + const caminhoControlador = caminho.join(diretorioControladores, nomeControladorPlural + '.delegua'); + sistemaArquivos.writeFileSync( + caminhoControlador, + conteudoControlador + ); + + console.info(`Controlador ${caminhoControlador} criado com sucesso!`); + } }; pontoDeEntradaGerar(process.argv); diff --git a/package.json b/package.json index 5fa72a0..ad3874b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ }, "dependencies": { "@designliquido/delegua-node": "^0.29.1", + "@designliquido/flexoes": "^0.0.0", "@designliquido/foles": "^0.6.1", "@designliquido/lincones-sqlite": "^0.0.2", "@designliquido/lmht-js": "^0.4.4", diff --git a/yarn.lock b/yarn.lock index 9ab1b2a..2c65953 100644 --- a/yarn.lock +++ b/yarn.lock @@ -325,6 +325,11 @@ esprima "^4.0.1" lodash.clonedeep "^4.5.0" +"@designliquido/flexoes@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@designliquido/flexoes/-/flexoes-0.0.0.tgz#7f9b9cb60804db898023c45325de5dcfbb1fd98c" + integrity sha512-G0KGAj/GyFO3SPVvnAHlPl9PdEHuqPO0jm9VDCtZOlnV9wYKAj1NKlWvS4RDdOeLLhNH8cOBMccjIxWjwGFQuw== + "@designliquido/foles@^0.6.1": version "0.6.1" resolved "https://registry.yarnpkg.com/@designliquido/foles/-/foles-0.6.1.tgz#70751fb63f0b1e53ab03a286ca97f4cc002ac765"