{"id":28471959,"url":"https://github.com/designliquido/liquido","last_synced_at":"2026-04-10T04:00:41.042Z","repository":{"id":63972550,"uuid":"539165328","full_name":"DesignLiquido/liquido","owner":"DesignLiquido","description":"Conjunto de ferramentas para desenvolvimento de aplicações para a internet 100% em português.","archived":false,"fork":false,"pushed_at":"2025-06-19T16:00:25.000Z","size":1220,"stargazers_count":74,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"principal","last_synced_at":"2025-06-19T16:44:33.662Z","etag":null,"topics":["delegua","desenvolvimento-web","foles","hacktoberfest","lincones","lmht","portuguese"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DesignLiquido.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-20T19:46:21.000Z","updated_at":"2025-06-19T16:00:28.000Z","dependencies_parsed_at":"2023-11-12T02:28:13.655Z","dependency_job_id":"9f631dfd-d257-4753-ac2c-2dee3ea5295b","html_url":"https://github.com/DesignLiquido/liquido","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/DesignLiquido/liquido","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fliquido","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fliquido/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fliquido/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fliquido/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DesignLiquido","download_url":"https://codeload.github.com/DesignLiquido/liquido/tar.gz/refs/heads/principal","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fliquido/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263046068,"owners_count":23405127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["delegua","desenvolvimento-web","foles","hacktoberfest","lincones","lmht","portuguese"],"created_at":"2025-06-07T11:09:30.743Z","updated_at":"2026-04-10T04:00:41.030Z","avatar_url":"https://github.com/DesignLiquido.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Liquido\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./recursos/imagens/icone-liquido.png\" alt=\"delegua\" width=\"auto\" height=\"130px\"\u003e\n\u003c/p\u003e\n\nConjunto de ferramentas para desenvolvimento de aplicações para a internet 100% em português.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/DesignLiquido/liquido/issues\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues/Designliquido/liquido\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/Designliquido/liquido\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/forks/Designliquido/liquido\" /\u003e\n  \u003ca href=\"https://www.npmjs.com/package/liquido\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/liquido\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/Designliquido/liquido\" /\u003e\n\u003c/p\u003e\n\n## Motivação\n\n- [Delégua](https://github.com/DesignLiquido/delegua) é uma linguagem de programação 100% em português;\n- [Pituguês](https://github.com/DesignLiquido/pitugues) é uma linguagem de programação 100% em português com sintaxe baseada em indentação, inspirada em Python;\n- [LMHT](https://github.com/DesignLiquido/LMHT) é uma linguagem de marcação 100% em português, feita para estruturar páginas de internet;\n- [FolEs](https://github.com/DesignLiquido/FolEs) é uma linguagem para folhas de estilo, que estilizam páginas de internet.\n\nLiquido é um ferramentário que combina essas linguagens para ser possível desenvolver para a internet 100% em português.\n\n## Instalação\n\nVocê deve ter o [Node.js](https://nodejs.org/pt-br/download/) instalado.\n\nDepois de instalar no Node.js, execute o seguinte comando no diretório em que seu projeto está:\n\n```sh\nnpm i liquido\n```\n\nSe preferir usar o [Yarn](https://yarnpkg.com/) ao invés do NPM, use:\n\n```sh\nyarn add liquido\n```\n\nIsso deve criar um arquivo `package.json` com algumas informações de dependências. Neste arquivo, adicione o seguinte:\n\n```json\n  \"scripts\": {\n    \"liquido\": \"node ./node_modules/liquido/index.js\"\n  }\n```\n\nE então execute com:\n\n```sh\nyarn liquido\n```\n\n### Uso com Nodemon\n\nSe quiser usar liquido com o [nodemon](https://nodemon.io/) para que a aplicação seja recarregada toda vez que houver alteração nos fontes, primeiro instale o nodemon:\n\n```sh\nnpm install -g nodemon\n```\n\nModifique seu script para o seguinte:\n\n```json\n  \"scripts\": {\n    \"liquido\": \"nodemon ./node_modules/liquido/index.js\"\n  }\n```\n\n## Primeiros passos\n\nVocê 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.\n\nPara gerar um novo projeto, utilize o comando:\n\n```sh\nnpx liquido novo [nome-do-projeto]\n```\n\n`nome-do-projeto` é opcional. Se não for fornecido, a interface deverá perguntar pelo nome do projeto.\n\n### Olá mundo em Delégua\n\nCrie no seu projeto um diretório chamado `rotas`. Depois, crie dentro de `rotas` um arquivo chamado `inicial.delegua`.\n\nDentro de `inicial.delegua`, adicione o seguinte:\n\n```js\nliquido.rotaGet(funcao(requisicao, resposta) {\n  resposta.enviar(\"Olá mundo\").status(200)\n})\n```\n\nExecute liquido usando o seguinte comando:\n\n```sh\nyarn liquido\n```\n\nOu, se preferir o NPM:\n\n```sh\nnpm run liquido\n```\n\nIsso deve iniciar um servidor HTTP na porta 3000. Experimente entrar em http://localhost:3000. A mensagem \"Olá mundo\" deve aparecer.\n\n### Olá mundo em Pituguês\n\nPara usar Pituguês, defina `liquido.linguagem = 'pituguês'` no arquivo de configuração (veja a seção [Configuração](#configuração)). Crie um diretório chamado `rotas` e dentro dele um arquivo chamado `inicial.pitu`.\n\nEm Pituguês, as rotas são registradas por meio de decoradores acima da declaração da função:\n\n```python\n@liquido.rotaGet(\"/\")\nfuncao minha_rota_get(requisicao, resposta):\n    resposta.enviar(\"Olá mundo\").status(200)\n```\n\nExecute liquido normalmente com `yarn liquido` ou `npm run liquido`. A mensagem \"Olá mundo\" deve aparecer ao acessar http://localhost:3000.\n\n## Inspiração\n\nA maior inspiração deste projeto é a [FastAPI](https://fastapi.tiangolo.com/), mas também há influência de:\n\n- [Next.js](https://nextjs.org/)\n- [Nuxt.js](https://nuxtjs.org/)\n- [Ruby on Rails](https://rubyonrails.org/)\n- [Nyan](https://github.com/bucknellu/Nyan)\n- [Express](https://expressjs.com)\n\nAlgumas ideias retiradas desses projetos:\n\n- 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;\n- 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;\n- Foco nos fundamentos: como servidores HTTP funcionam, quais são as premissas de REST, o que está por trás de cada tecnologia;\n- 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.\n\n## Arquitetura\n\nPara uma implementação inicial, foram escolhidas bibliotecas consagradas do Node.js de desenvolvimento para a Internet:\n\n- [Express](https://www.npmjs.com/package/express), um servidor HTTP;\n- [Nodemon](https://nodemon.io/), um observador de sistema de arquivos que recarrega a aplicação quando há mudanças em certos arquivos e/ou diretórios;\n- [Handlebars](https://handlebarsjs.com/), um sistema de _templates_;\n- [Helmet](https://helmetjs.github.io/), 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;\n- [Morgan](https://github.com/expressjs/morgan), um _middleware_ para estenografia de requisições HTTP, enviando mensagens úteis para desenvolvedores em console;\n- [Cors](https://www.npmjs.com/package/cors), um _middleware_ para restringir certas origens de enviar requisições para a aplicação em liquido. É considerado um requisito essencial de segurança;\n- [Passport](https://www.passportjs.org/), um _middleware_ básico de autenticação;\n- [Cookie Parser](https://www.npmjs.com/package/cookie-parser), um _middleware_ para interpretação de _cookies_ que venham em requisições.\n\nLiquido instancia os componentes básicos de Delégua ou Pituguês (conforme a configuração) e os controla, instrumentando instruções escritas nessas linguagens 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 cada linguagem.\n\n### Convenção de Rotas\n\nToda e qualquer rota deve ficar em um diretório `rotas`. O arquivo padrão depende da linguagem configurada:\n\n| Linguagem | Extensão | Arquivo padrão    |\n|-----------|----------|-------------------|\n| Delégua   | `.delegua` | `inicial.delegua` |\n| Pituguês  | `.pitu`    | `inicial.pitu`    |\n\n#### Rotas em Delégua\n\nSe queremos criar uma rota na raiz do site, podemos criar um arquivo `inicial.delegua` com o seguinte:\n\n```js\nliquido.rotaGet(funcao(requisicao, resposta) {\n    resposta.enviar(\"Olá mundo\").status(200)\n})\n```\n\n#### Rotas em Pituguês\n\nEm Pituguês, as rotas são declaradas com decoradores seguidos da definição da função:\n\n```python\n@liquido.rotaGet(\"/\")\nfuncao minha_rota_get(requisicao, resposta):\n    resposta.enviar(\"Olá mundo\").status(200)\n```\n\nA 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.\n\nSe queremos uma rota `http://localhost:3000/teste`, podemos fazer de duas formas:\n\n- Em Delégua: criar um arquivo `teste.delegua` em `/rotas`, ou um diretório `teste` com `inicial.delegua` dentro.\n- Em Pituguês: criar um arquivo `teste.pitu` em `/rotas`, ou um diretório `teste` com `inicial.pitu` dentro.\n\nAssim como para o diretório `rotas`, todo e qualquer diretório dentro de `rotas` também tem como arquivo padrão o `inicial.delegua` (Delégua) ou `inicial.pitu` (Pituguês).\n\nCada 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:\n\n- `liquido.rotaGet()`\n- `liquido.rotaPost()`\n- `liquido.rotaPut()`\n- `liquido.rotaDelete()`\n- `liquido.rotaPatch()`\n- `liquido.rotaCopy()`\n- `liquido.rotaHead()`\n- `liquido.rotaOptions()`\n- `liquido.rotaPurge()`\n- `liquido.rotaLock()`\n- `liquido.rotaUnlock()`\n- `liquido.rotaPropfind()`\n\nAlgumas 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:\n\n- `liquido.rotaLink()`\n- `liquido.rotaUnlink()`\n- `liquido.rotaView()`\n\n### Configuração\n\nLiquido procura por um arquivo chamado `configuracao.delprops` na raiz do seu projeto. Nele ficam as configurações globais da aplicação.\n\nA propriedade `liquido.linguagem` define qual linguagem de back-end será usada. Os valores aceitos são `'delegua'` (padrão) e `'pituguês'`.\n\nUm exemplo de `configuracao.delprops` para um projeto em Delégua:\n\n```js\nliquido.arquetipo = 'rest'\nliquido.linguagem = 'delegua'\nliquido.roteador.cors = verdadeiro\nliquido.roteador.bodyParser = verdadeiro\nliquido.roteador.morgan = verdadeiro\nliquido.roteador.cookieParser = verdadeiro\nliquido.roteador.passport = verdadeiro\nliquido.roteador.json = verdadeiro\nliquido.roteador.helmet = verdadeiro\n```\n\nPara usar Pituguês, basta alterar a propriedade `linguagem`:\n\n```js\nliquido.arquetipo = 'rest'\nliquido.linguagem = 'pituguês'\nliquido.roteador.cors = verdadeiro\nliquido.roteador.bodyParser = verdadeiro\nliquido.roteador.morgan = verdadeiro\nliquido.roteador.cookieParser = verdadeiro\nliquido.roteador.passport = falso\nliquido.roteador.json = verdadeiro\nliquido.roteador.helmet = verdadeiro\n```\n\n### Servindo arquivos estáticos\n\nUma aplicação em Liquido pode servir arquivos estáticos se o roteador tiver uma configuração de diretório correspondente. Por exemplo:\n\n```js\nliquido.roteador.diretorioEstatico = 'publico'\n```\n\nOu seja, havendo um diretório `publico` na sua aplicação, é possível servir arquivos como imagens, CSS, JS e assim por diante. \n\nSe 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. \n\n#### Conversões automáticas para diretório estático\n\nAo 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. \n\n### Padrões de Aplicação\n\nLiquido 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:\n\n- MVC (Modelo, Visão, Controle): padrão em três camadas em que o servidor normalmente devolve HTML;\n- 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.\n\nFuturas versões de Liquido terão:\n\n- GraphQL\n- gRPC\n\n## Filosofia de Tradução para o Inglês\n\nLiquido 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.\n\nO 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.\n\n## Quem já Contribuiu\n\n\u003ca href=\"https://github.com/DesignLiquido/liquido/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=DesignLiquido/liquido\" /\u003e\n\u003c/a\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdesignliquido%2Fliquido","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdesignliquido%2Fliquido","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdesignliquido%2Fliquido/lists"}