Giter Site home page Giter Site logo

designliquido / liquido Goto Github PK

View Code? Open in Web Editor NEW
26.0 1.0 2.0 384 KB

Conjunto de ferramentas para desenvolvimento de aplicações para a internet 100% em português.

License: MIT License

TypeScript 99.94% JavaScript 0.04% Batchfile 0.02%
desenvolvimento-web foles lmht portuguese delegua lincones hacktoberfest

liquido's Introduction

Liquido

delegua

Conjunto de ferramentas para desenvolvimento de aplicações para a internet 100% em português.

Motivação

  • Delégua é uma linguagem de programação 100% em português;
  • LMHT é uma linguagem de marcação 100% em português, feita para estruturar páginas de internet;
  • FolEs é uma linguagem para folhas de estilo, que estilizam páginas de internet.

Liquido é um ferramentário que combina as três linguagens para ser possível desenvolver para a internet 100% em português.

Instalação

Você deve ter o Node.js instalado.

Depois de instalar no Node.js, execute o seguinte comando no diretório em que seu projeto está:

npm i liquido

Se preferir usar o Yarn ao invés do NPM, use:

yarn add liquido

Isso deve criar um arquivo package.json com algumas informações de dependências. Neste arquivo, adicione o seguinte:

  "scripts": {
    "liquido": "node ./node_modules/liquido/index.js"
  }

E então execute com:

yarn liquido

Uso com Nodemon

Se quiser usar liquido com o nodemon para que a aplicação seja recarregada toda vez que houver alteração nos fontes, primeiro instale o nodemon:

npm install -g nodemon

Modifique seu script para o seguinte:

  "scripts": {
    "liquido": "nodemon ./node_modules/liquido/index.js"
  }

Primeiros passos

Você pode começar seu primeiro projeto do zero, criando todos os arquivos e diretórios manualmente, ou pode utilizar o modo ILC (Interface por Linha de Comando, ou CLI, em inglês) para gerar uma estrutura básica de arquivos e diretórios.

Para gerar um novo projeto, utilize o comando:

npx liquido novo [nome-do-projeto]

nome-do-projeto é opcional. Se não for fornecido, a interface deverá perguntar pelo nome do projeto.

Olá mundo em liquido

Crie no seu projeto um diretório chamado rotas. Depois, crie dentro de rotas um arquivo chamado inicial.delegua.

Dentro de inicial.delegua, adicione o seguinte:

liquido.rotaGet(funcao(requisicao, resposta) {
  resposta.enviar("Olá mundo").status(200)
})

Execute liquido usando o seguinte comando:

yarn liquido

Ou, se preferir o NPM:

npm run liquido

Isso deve iniciar um servidor HTTP na porta 3000. Experimente entrar em http://localhost:3000. A mensagem "Olá mundo" deve aparecer.

Inspiração

A maior inspiração deste projeto é a FastAPI, mas também há influência de:

Algumas ideias retiradas desses projetos:

  • Rotas montadas por convenção: garante coesão do projeto por design, assim como facilita a validação das lógicas das rotas declaradas. Também garante um crescimento natural do projeto de forma ordenada;
  • Mínimo de código escrito: programação deve ser uma experiência incrível para cada desenvolvedor, e o conjunto de ferramentas deve colaborar com isso. A inicialização deve ser muito simples e muito rápida, mas o processo não pode ser muito mágico: o desenvolvedor deve ser capaz de compreender facilmente como as coisas funcionam;
  • Foco nos fundamentos: como servidores HTTP funcionam, quais são as premissas de REST, o que está por trás de cada tecnologia;
  • Auto-descoberta de componentes: o ferramentário deve ser capaz de descobrir o que está habilitado no projeto olhando alguns arquivos e diretórios, e inicializando tudo isso automaticamente.

Arquitetura

Para uma implementação inicial, foram escolhidas bibliotecas consagradas do Node.js de desenvolvimento para a Internet:

  • Express, um servidor HTTP;
  • Nodemon, um observador de sistema de arquivos que recarrega a aplicação quando há mudanças em certos arquivos e/ou diretórios;
  • Handlebars, um sistema de templates;
  • Helmet, um middleware para Express.js que define várias configurações de cabeçalho de requisições e respostas que, via de regra, deixam a aplicação mais segura;
  • Morgan, um middleware para estenografia de requisições HTTP, enviando mensagens úteis para desenvolvedores em console;
  • Cors, um middleware para restringir certas origens de enviar requisições para a aplicação em liquido. É considerado um requisito essencial de segurança;
  • Passport, um middleware básico de autenticação;
  • Cookie Parser, um middleware para interpretação de cookies que venham em requisições.

Liquido instancia os três componentes básicos de Delégua e os controla, instrumentando instruções escritas em Delégua para JavaScript puro. Isso garante a acessibilidade de se programar em português com o mínimo de impacto no desempenho da aplicação como um todo, além da eliminação da complexidade de se implementar tudo dentro de Delégua.

Convenção de Rotas

Toda e qualquer rota deve ficar em um diretório rotas. O arquivo padrão deve ter o nome inicial.delegua.

Com isso, se queremos criar uma rota na raiz do site, podemos criar um arquivo inicial.delegua com o seguinte:

liquido.rotaGet(funcao(requisicao, resposta) {
    resposta.enviar("Olá mundo").status(200)
})

A instrução acima registra uma rota HTTP GET em "/" (por exemplo, http://localhost:3000/) que responde com um texto "Olá mundo" e o status HTTP 200.

Se queremos uma rota http://localhost:3000/teste, podemos fazer de duas formas:

  • Criar um arquivo teste.delegua em /rotas
  • Criar um diretório teste dentro de rotas com um arquivo inicial.delegua.

Assim como para o diretório rotas, todo e qualquer diretório dentro de rotas também tem como arquivo padrão o inicial.delegua

Cada arquivo só pode ter uma chamada por método HTTP de rota. Por exemplo, um arquivo não pode ter duas chamadas a liquido.rotaGet(). Nada impede um arquivo de ter uma chamada para cada tipo de rota. Os métodos são:

  • liquido.rotaGet()
  • liquido.rotaPost()
  • liquido.rotaPut()
  • liquido.rotaDelete()
  • liquido.rotaPatch()
  • liquido.rotaCopy()
  • liquido.rotaHead()
  • liquido.rotaOptions()
  • liquido.rotaPurge()
  • liquido.rotaLock()
  • liquido.rotaUnlock()
  • liquido.rotaPropfind()

Algumas rotas ainda não são suportadas porque o Express.js 4 não as implementou, mas estão marcadas para implementações futuras (Express.js 5, que ainda é beta). São elas:

  • liquido.rotaLink()
  • liquido.rotaUnlink()
  • liquido.rotaView()

Configuração

Liquido procura por um arquivo chamado configuracao.delegua na raiz do seu projeto. Nele ficam as configurações globais da aplicação.

Um exemplo de configuracao.delegua é o seguinte:

liquido.roteador.cors = verdadeiro
liquido.roteador.bodyParser = verdadeiro
liquido.roteador.morgan = verdadeiro
liquido.roteador.cookieParser = verdadeiro
liquido.roteador.passport = verdadeiro
liquido.roteador.json = verdadeiro
liquido.roteador.helmet = verdadeiro

Servindo arquivos estáticos

Uma aplicação em Liquido pode servir arquivos estáticos se o roteador tiver uma configuração de diretório correspondente. Por exemplo:

liquido.roteador.diretorioEstatico = 'publico'

Ou seja, havendo um diretório publico na sua aplicação, é possível servir arquivos como imagens, CSS, JS e assim por diante.

Se uma imagem com o nome teste.png é colocada dentro do diretório publico, ao iniciar sua aplicação em http://localhost:3000, a imagem pode ser acessada por http://localhost:3000/teste.png.

Conversões automáticas para diretório estático

Ao inicializar, Liquido verifica um diretório estilos. Havendo arquivos FolEs nele (extensão .foles), cada arquivo é automaticamente convertido para CSS e salvo em um diretório dentro do diretório estático definido na configuração chamado css. Ou seja, um arquivo teste.foles é salvo em /publico/css/teste.css e pode ser acessado por http://localhost:3000/css/teste.css.

Padrões de Aplicação

Liquido foi pensado para servir qualquer padrão de projeto para aplicações Web. A primeira versão de Liquido garante a implementação dos seguintes padrões:

  • MVC (Modelo, Visão, Controle): padrão em três camadas em que o servidor normalmente devolve HTML;
  • RESTful API: Padrão em que a aplicação funciona como um serviço não visual, normalmente retornando dados serializáveis como JSON e XML.

Futuras versões de Liquido terão:

  • GraphQL
  • gRPC

Filosofia de Tradução para o Inglês

Liquido permite a qualquer desenvolvedor que saiba português a escrever aplicações Web, e possivelmente criar um ecossistema profissional a partir dele. Procuramos traduzir o máximo possível de informações e conceitos por uma questão de acessibilidade, mas há limites para isso. Por exemplo, não traduzimos os métodos de HTTP porque entendemos que uma tradução disso implicaria em um protocolo novo de transferência.

O que tentamos fazer é instigar os desenvolvedores a aprenderem inglês conforme vão dominando outros conceitos. Um aprendizado direcionado de inglês é muito mais eficiente do que o aprendizado da língua por si só, sem um objetivo no horizonte.

liquido's People

Contributors

italocobains avatar leonelsanchesdasilva avatar samuelrvg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

liquido's Issues

descobreRotas

#2
Há alguns erros nessa PR a ser resolvidos.

  • Fazer o incremento do caminho da pasta pós /rotas caso seja um subpasta.
  • Erro ao tentar tratar uma subpasta dentro de outra subpasta.

Exemplo demonstrativo apresenta erros

o exemplo demonstrativo com o

npm i liquido

apresenta erros como não ter a biblioteca @designliquido/lincones-sqlite e também não tem o arquivo .ambiente

Possíveis correções:

  • Adicionar @designliquido/lincones-sqlite em dependencias ou remover como algo obrigatório ao iniciar uma rota
  • Adicionar o .ambiente ou remover como algo obrigatório ao iniciar o sistema

Fazer mudança do provedor de http

O express tira todo o controle sobre o obj que vem do cliente fazendo com que o usuário tenha que escrever palavras em inglês o que faz fugir do padrão de framework de linguagem brasileira.

Minha ideia primaria era mudar o lib de express para node:http para ter um pouco mais de acessos aos objs porem depois de alguns testes eu vi que vai da na mesma.

Minha próxima ideia é abstrair os objs de body, params e etc para getter e setter direto no response e no request, dessa maneira ainda mantemos a arquitetura que ja existe é resolvemos esse problema ate entt.

requisicao.DefinirItemNoBody('token', 'aksdjfasklfjksdafjaskf')
var token = requisicao.PegarItemDoBody('token')

@leonelsanchesdasilva se quiser complementar com algo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.