liquido
Version:
Conjunto de ferramentas para desenvolvimento de aplicações para a internet 100% em português
270 lines • 15.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const figlet_1 = require("figlet");
const flexoes_1 = require("@designliquido/flexoes");
const chalk_1 = require("chalk");
const yargs_1 = __importDefault(require("yargs"));
const prompts_1 = __importDefault(require("prompts"));
const child_process_1 = require("child_process");
const process_1 = require("process");
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const liquido_1 = require("./liquido");
const interface_linha_comando_1 = require("./interface-linha-comando");
const gerador_visoes_1 = require("./interface-linha-comando/gerar/gerador-visoes");
const gerador_rotas_1 = require("./interface-linha-comando/gerar/gerador-rotas");
const gerador_inicializacao_lincones_1 = require("./interface-linha-comando/gerar/gerador-inicializacao-lincones");
/**
* Classe que representa o ponto de entrada da aplicação Liquido.
*/
class LiquidoPontoEntrada {
constructor() {
this.logo = (0, figlet_1.textSync)('Liquido', { horizontalLayout: 'full' });
}
mostrarLogo() {
if (process.env.LIQUIDO_OBSERVANDO === '1') {
return;
}
console.log((0, chalk_1.blue)(this.logo + '\n'));
}
async comandoDocumentar() {
// await encontrarControladores();
await (0, interface_linha_comando_1.documentar)();
}
async comandoGerar(args) {
var _a, _b, _c, _d, _e;
let nomeModelo = args.modelo;
if (nomeModelo === undefined || nomeModelo.length <= 0) {
const opcoesModelos = (0, interface_linha_comando_1.obterTodosModelos)();
const respostaNomeModelo = await (0, prompts_1.default)({
type: 'select',
name: 'nomeModelo',
message: 'Qual o nome do modelo?',
choices: opcoesModelos
});
nomeModelo = respostaNomeModelo.nomeModelo;
}
const declaracoes = await (0, interface_linha_comando_1.importarModelos)(nomeModelo);
(0, interface_linha_comando_1.criarDiretorioAplicacao)('rotas');
const motor = (0, interface_linha_comando_1.lerMotorConfigurado)();
const geradorVisoes = new gerador_visoes_1.GeradorVisoes();
const geradorRotas = new gerador_rotas_1.GeradorRotas(motor);
let geradorInicializacao = null;
let caminhoArquivoInicializacao = null;
if (motor === 'lincones') {
const liquido = new liquido_1.Liquido(process.cwd());
await liquido.importarArquivoConfiguracao();
const arquivoInicializacao = (_e = (_d = (_c = (_b = (_a = liquido.centroConfiguracoes) === null || _a === void 0 ? void 0 : _a.liquido) === null || _b === void 0 ? void 0 : _b.dados) === null || _c === void 0 ? void 0 : _c.lincones) === null || _d === void 0 ? void 0 : _d.arquivoInicializacao) !== null && _e !== void 0 ? _e : 'inicializacao.lincones';
caminhoArquivoInicializacao = path_1.default.join(process.cwd(), arquivoInicializacao);
geradorInicializacao = new gerador_inicializacao_lincones_1.GeradorInicializacaoLincones();
}
for (const declaracao of declaracoes) {
const declaracaoModelo = declaracao;
const nomeBaseModelo = declaracaoModelo.simbolo.lexema.toLocaleLowerCase('pt');
const nomeModeloPlural = (0, flexoes_1.pluralizar)(nomeBaseModelo).toLocaleLowerCase('pt');
const caminhosRotas = geradorRotas.criarNovasRotas(declaracaoModelo);
for (const caminhoRota of caminhosRotas) {
console.info((0, chalk_1.blue)(`Rota ${caminhoRota}`));
}
(0, interface_linha_comando_1.criarDiretorioSeNaoExiste)('visoes', nomeModeloPlural);
const visaoSelecionarTudo = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'selecionarTudo');
console.info((0, chalk_1.blue)(`Visão ${visaoSelecionarTudo}`));
const visaoSelecionarUm = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'selecionarUm');
console.info((0, chalk_1.blue)(`Visão ${visaoSelecionarUm}`));
const visaoAdicionar = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'adicionar');
console.info((0, chalk_1.blue)(`Visão ${visaoAdicionar}`));
const visaoEditar = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'editar');
console.info((0, chalk_1.blue)(`Visão ${visaoEditar}`));
const visaoExcluir = geradorVisoes.criarNovaVisao(nomeModeloPlural, declaracaoModelo, 'excluir');
console.info((0, chalk_1.blue)(`Visão ${visaoExcluir}`));
if (geradorInicializacao && caminhoArquivoInicializacao) {
geradorInicializacao.acrescentarCriarTabela(declaracaoModelo, caminhoArquivoInicializacao);
console.info((0, chalk_1.blue)(`Inicialização ${caminhoArquivoInicializacao}`));
}
}
}
async comandoNovo(args) {
let nomeProjeto = args.nome;
if (nomeProjeto === undefined || nomeProjeto.length <= 0) {
const respostaNomeProjeto = await (0, prompts_1.default)({
type: 'text',
name: 'nomeProjeto',
message: 'Qual o nome do seu projeto?'
});
nomeProjeto = respostaNomeProjeto.nomeProjeto;
}
if (nomeProjeto.length > 0) {
const diretorioAlvo = nomeProjeto;
if (nomeProjeto === '.' || nomeProjeto === './') {
nomeProjeto = path_1.default.basename((0, process_1.cwd)());
}
console.log((0, chalk_1.green)(`Iremos criar um novo projeto em Liquido chamado "${nomeProjeto}"`));
const resposta = await (0, prompts_1.default)({
type: 'confirm',
message: 'Confirma?',
name: 'confirmado',
initial: true,
onRender() {
this.yesMsg = 'Sim';
this.noMsg = 'não';
this.yesOption = '(S/n)';
}
});
if (resposta.confirmado) {
const diretorioCompleto = (0, interface_linha_comando_1.criarDiretorioAplicacao)(diretorioAlvo);
const perguntaTipoProjeto = await (0, prompts_1.default)({
type: 'select',
name: 'tipoProjeto',
message: 'Selecione o tipo de projeto',
choices: [
{ title: 'MVC', description: 'Modelo-Visão-Controlador', value: 'mvc' },
{ title: 'API REST', description: 'Interface de dados usando o modelo REST', value: 'api-rest' }
],
initial: 1
});
const perguntaLinguagemDeBackEnd = await (0, prompts_1.default)({
type: 'select',
name: 'linguagemBackEnd',
message: 'Selecione a linguagem de programação',
choices: [
{
title: 'Delégua',
value: 'delegua'
},
{
title: 'Pituguês',
value: 'pitugues'
}
],
initial: 1
});
const perguntaInicializarRepositorioGit = await (0, prompts_1.default)({
type: 'confirm',
message: 'Deseja inicializar um repositório Git?',
name: 'confirmado',
initial: true,
onRender() {
this.yesMsg = 'Sim';
this.noMsg = 'não';
this.yesOption = '(S/n)';
}
});
const inicializarRepositorioGit = perguntaInicializarRepositorioGit.confirmado;
const perguntaQualGerenciadorDePacotesQuerUsar = await (0, prompts_1.default)({
type: 'select',
name: 'gerenciadorDePacotes',
message: 'Selecione o gerenciador de pacotes que você deseja utilizar',
choices: [
{ title: 'NPM', value: 'npm' },
{ title: 'Yarn', value: 'yarn' },
{ title: 'Bun', value: 'bun' }
],
initial: 1
});
const gerenciadorDePacotes = perguntaQualGerenciadorDePacotesQuerUsar.gerenciadorDePacotes;
const linguagemSelecionada = perguntaLinguagemDeBackEnd.linguagemBackEnd;
await (0, interface_linha_comando_1.detectarGerenciadorDePacotes)(gerenciadorDePacotes, diretorioCompleto);
await (0, interface_linha_comando_1.copiarArquivosDeExemploParaNovoProjeto)(nomeProjeto, perguntaTipoProjeto.tipoProjeto, linguagemSelecionada, diretorioCompleto);
await (0, interface_linha_comando_1.gerarRepositorioGit)(inicializarRepositorioGit, diretorioCompleto);
console.info((0, chalk_1.yellow)(`Seu projeto foi criado com sucesso! ${diretorioCompleto}`));
}
}
}
async comandoBancoIniciar(args) {
var _a, _b, _c, _d, _e, _f;
const liquido = new liquido_1.Liquido(process.cwd());
await liquido.importarArquivoConfiguracao();
const dados = (_b = (_a = liquido.centroConfiguracoes) === null || _a === void 0 ? void 0 : _a.liquido) === null || _b === void 0 ? void 0 : _b.dados;
const motor = (_c = dados === null || dados === void 0 ? void 0 : dados.motor) !== null && _c !== void 0 ? _c : 'lincones';
const tecnologia = (_d = dados === null || dados === void 0 ? void 0 : dados.lincones) === null || _d === void 0 ? void 0 : _d.tecnologia;
const caminhoBanco = (_e = dados === null || dados === void 0 ? void 0 : dados.lincones) === null || _e === void 0 ? void 0 : _e.caminho;
if (!tecnologia || !caminhoBanco) {
console.error((0, chalk_1.red)('Configuração de banco de dados não encontrada em configuracao.delprops.'));
console.error((0, chalk_1.red)('Adicione liquido.dados.lincones.tecnologia e liquido.dados.lincones.caminho'));
process.exit(1);
return;
}
try {
if (motor === 'delegua-entidades') {
await (0, interface_linha_comando_1.inicializarBancoDeleguaEntidades)(tecnologia, caminhoBanco, args.apenasEstrutura, args.apenasDados);
}
else {
await (0, interface_linha_comando_1.inicializarBancoLincones)(tecnologia, caminhoBanco, args.arquivo, args.apenasEstrutura, args.apenasDados);
}
}
catch (erro) {
console.error((0, chalk_1.red)(`Erro na inicialização do banco: ${(_f = erro === null || erro === void 0 ? void 0 : erro.message) !== null && _f !== void 0 ? _f : erro}`));
process.exit(1);
}
}
resolverCaminhosObservados() {
return ['rotas', 'visoes', 'estilos']
.map((diretorio) => path_1.default.join(process.cwd(), diretorio))
.filter((diretorio) => fs_1.default.existsSync(diretorio));
}
iniciarServidorComObservacao() {
const caminhosObservados = this.resolverCaminhosObservados();
if (caminhosObservados.length === 0) {
console.warn((0, chalk_1.yellow)('Nenhum diretório de rotas, visões ou estilos encontrado para observar.'));
}
const argumentos = [
'--watch',
...caminhosObservados.map((diretorio) => `--watch-path=${diretorio}`),
process_1.argv[1],
...process_1.argv.slice(2)
];
console.info((0, chalk_1.blue)('Observando mudanças em rotas, visões e estilos...'));
const processo = (0, child_process_1.spawn)(process_1.execPath, argumentos, {
stdio: 'inherit',
env: Object.assign(Object.assign({}, process_1.env), { LIQUIDO_OBSERVANDO: '1' })
});
processo.on('exit', (codigo) => {
process.exit(codigo !== null && codigo !== void 0 ? codigo : 0);
});
}
comandoServidor() {
if (process_1.env.LIQUIDO_OBSERVANDO !== '1') {
this.iniciarServidorComObservacao();
return;
}
const liquido = new liquido_1.Liquido(process.cwd());
liquido.iniciar();
}
opcoes() {
return yargs_1.default
.scriptName('liquido')
.version(false)
.option('versao', { type: 'boolean', description: 'Exibe a versão do Líquido.' })
.middleware((argv) => {
if (argv.versao) {
const pkgPath = fs_1.default.existsSync(path_1.default.join(__dirname, 'package.json'))
? path_1.default.join(__dirname, 'package.json')
: path_1.default.join(__dirname, '..', 'package.json');
console.log(require(pkgPath).version);
process.exit(0);
}
})
.usage('Uso: $0 <comando> [opções]')
.help('ajuda')
.alias('ajuda', '?')
.command(['*', 'servidor'], 'Serve o diretório local como uma aplicação para a internet.', {}, this.comandoServidor.bind(this))
.command('documentar', 'Lê o projeto e gera uma documentação OpenAPI correspondente', {}, this.comandoDocumentar)
.command('novo [nome]', 'Inicia uma nova aplicação pré-configurada para funcionar com Liquido.', { nome: { type: 'string', default: '' } }, this.comandoNovo)
.command('gerar [modelo]', 'Gera controlador e visão correspondentes ao nome do modelo passado por parâmetro. O modelo deve ter um arquivo .delegua correspondente no diretório "modelos".', { modelo: { type: 'string', default: '' } }, this.comandoGerar)
.command('banco iniciar', 'Inicializa a estrutura e dados do banco de dados a partir de um script LinConEs ou de migrações e sementes do delegua-entidades.', {
arquivo: { type: 'string', default: 'inicializacao.lincones', describe: 'Arquivo de script LinConEs a executar (padrão: inicializacao.lincones)' },
'apenas-estrutura': { type: 'boolean', default: false, describe: 'Executa apenas enunciados DDL (estrutura)' },
'apenas-dados': { type: 'boolean', default: false, describe: 'Executa apenas enunciados DML (dados)' }
}, this.comandoBancoIniciar.bind(this))
.argv;
}
async iniciar() {
this.mostrarLogo();
this.opcoes();
}
}
(async () => new LiquidoPontoEntrada().iniciar())();
//# sourceMappingURL=index.js.map