@designliquido/delprops
v0.5.2
Published
Especificação e biblioteca de schemas para o formato de arquivo .delprops do ecossistema Delégua.
Readme
delprops
Especificação e biblioteca de análise do formato de arquivo .delprops — arquivo de propriedades/configuração do ecossistema Delégua.
Estrutura do projeto
Cada namespace de propriedades é representado como um arquivo .ts dentro de uma pasta com o nome do namespace raiz:
fontes/
├── tipos.ts ← TipoValor
├── interfaces/ ← DefinicaoPropriedade e demais contratos
├── registro.ts ← registrar() / obter() / temRegistro()
├── descobridor.ts ← descobrir() (descoberta automática em node_modules)
├── sistema-arquivos-node.ts ← implementação Node de SistemaArquivosDescoberta
├── analisador.ts ← analisar() (parser do arquivo .delprops)
├── validador.ts ← validar() (validação contra os esquemas)
├── liquido/
│ ├── arquetipo.ts ← propriedades de liquido.arquetipo
│ ├── linguagem.ts ← propriedades de liquido.linguagem
│ ├── aplicacao.ts ← propriedades de liquido.aplicacao.*
│ ├── roteador.ts ← propriedades de liquido.roteador.*
│ ├── dados.ts ← propriedades de liquido.dados.<nome>.*
│ ├── autenticacao.ts ← propriedades de liquido.autenticacao.*
│ ├── estilos.ts ← propriedades de liquido.estilos.*
│ └── index.ts
└── index.tsCada arquivo exporta um array de DefinicaoPropriedade:
import { DefinicaoPropriedade } from '../interfaces';
const roteador: DefinicaoPropriedade[] = [
{ nome: 'cors', tipo: 'logico', detalhe: 'Habilita CORS.', padrao: 'falso' },
// ...
];
export default roteador;O tipo DefinicaoPropriedade é:
// fontes/tipos.ts
export type TipoValor = 'logico' | 'texto' | 'numero';
// fontes/interfaces/definicao-propriedade-interface.ts
export interface DefinicaoPropriedade {
nome: string;
tipo: TipoValor;
detalhe: string;
padrao?: string; // valor padrão, na mesma sintaxe do .delprops
valoresPermitidos?: string[]; // apenas para propriedades enumeradas
}A raiz da biblioteca exporta tudo de forma agrupada por namespace:
import { liquido } from '@designliquido/delprops';
// liquido.arquetipo → DefinicaoPropriedade[]
// liquido.linguagem → DefinicaoPropriedade[]
// liquido.aplicacao → DefinicaoPropriedade[]
// liquido.roteador → DefinicaoPropriedade[]
// liquido.dados → DefinicaoPropriedade[] (fallback genérico)
// liquido.autenticacao → DefinicaoPropriedade[]
// liquido.estilos → DefinicaoPropriedade[]Esquemas contribuídos por pacotes externos
Pacotes do ecossistema Delégua podem contribuir com seus próprios esquemas de propriedades para um namespace. O mecanismo tem duas partes:
1. Declaração no package.json do pacote contribuidor
Adicione uma chave "delprops" ao package.json do pacote:
"delprops": {
"espacoNomes": "liquido.dados",
"esquema": "./delprops/dados"
}espacoNomes: o caminho do espaço de nomes que este pacote estende.esquema: caminho relativo à raiz do pacote para o arquivo de esquema (sem extensão.js/.ts).
2. O arquivo de esquema
Crie o arquivo apontado por esquema. Ele deve exportar default um array de DefinicaoPropriedade:
// meu-pacote/delprops/dados.ts
import { DefinicaoPropriedade } from '@designliquido/delprops';
const dados: DefinicaoPropriedade[] = [
{
nome: 'tecnologia',
tipo: 'texto',
detalhe: 'Tecnologia de banco de dados.',
valoresPermitidos: ['minha-tecnologia'],
},
// ...
];
export default dados;Descoberta automática
Use descobrir() para escanear um diretório node_modules e registrar automaticamente todos os pacotes que declaram "delprops". É necessário fornecer uma implementação de SistemaArquivosDescoberta — a biblioteca já traz sistemaArquivosNode para uso em Node.js:
import path from 'path';
import { descobrir, sistemaArquivosNode } from '@designliquido/delprops';
await descobrir(path.join(__dirname, 'node_modules'), sistemaArquivosNode);Registro manual
Use registrar() quando preferir controle explícito sobre o que é carregado:
import { registrar } from '@designliquido/delprops';
import dadosSqlite from '@designliquido/lincones-sqlite/delprops/dados';
registrar('liquido.dados', '@designliquido/lincones-sqlite', dadosSqlite);Consulta
import { obter, temRegistro } from '@designliquido/delprops';
if (temRegistro('liquido.dados')) {
const propriedades = obter('liquido.dados');
// → DefinicaoPropriedade[] de todos os pacotes registrados para este namespace
}Pacotes que implementam este contrato
| Pacote | Namespace(s) | Contribuição |
|--------|--------------|--------------|
| liquido | liquido.roteador, liquido.autenticacao | Schemas autoritativos do framework |
| @designliquido/lincones-sqlite | liquido.dados | SQLite |
| @designliquido/lincones-postgresql | liquido.dados | PostgreSQL |
| @designliquido/lincones-mysql | liquido.dados | MySQL |
O formato .delprops
O .delprops é o formato padrão de configuração para projetos Delégua, inspirado no formato .properties do Java. Cada linha não vazia e não comentada define uma propriedade no formato:
<namespace>.<subnamespace>[.<subnamespace>...] = <valor>Comentários
Comentários de linha são iniciados com //:
// Isto é um comentário
liquido.roteador.cors = verdadeiroTipos de valor
| Tipo | Exemplos |
|---------|-----------------------------------|
| Lógico | verdadeiro, falso |
| Texto | 'publico', 'sqlite', ':memory:' |
| Número | 3000, 5432 |
Analisando e validando arquivos .delprops
A biblioteca expõe duas funções puras para processar o conteúdo de um arquivo .delprops: analisar() (parser) e validar() (validador contra os esquemas).
analisar()
Recebe o texto do arquivo e retorna as propriedades reconhecidas e eventuais erros de sintaxe (linha sem =, chave ou valor vazios):
import { analisar } from '@designliquido/delprops';
const { propriedades, erros } = analisar(conteudoDoArquivo);
// propriedades: { chave, valor, linha }[]
// erros: { mensagem, linha }[]validar()
Recebe as propriedades já parseadas e um mapa de namespace → DefinicaoPropriedade[] (por exemplo, obtido via obter() ou montado manualmente), e retorna avisos (propriedade desconhecida) e erros (tipo ou valor incompatível):
import { analisar, validar, liquido } from '@designliquido/delprops';
const esquemas = new Map([
['liquido.roteador', liquido.roteador],
['liquido.dados', liquido.dados],
['liquido.autenticacao', liquido.autenticacao],
]);
const { propriedades } = analisar(conteudoDoArquivo);
const { avisos, erros } = validar(propriedades, esquemas);Namespaces fora do mapa esquemas são ignorados pela validação (permitindo uso por outros projetos do ecossistema). Dentro de um namespace conhecido, propriedades ausentes do esquema geram aviso; tipo ou valor incompatível geram erro.
Namespace liquido
O namespace liquido é reservado para a configuração do framework web Líquido.
liquido.arquetipo
| Propriedade | Tipo | Descrição | Valores permitidos |
|-------------|-------|----------------------------------------|----------------------|
| arquetipo | texto | Arquétipo do projeto Líquido. | rest, mvc |
liquido.linguagem
| Propriedade | Tipo | Descrição | Valores permitidos |
|-------------|-------|-----------------------------------------------------|--------------------------|
| linguagem | texto | Linguagem de programação de back-end do projeto. | delégua, pituguês |
liquido.aplicacao
| Propriedade | Tipo | Descrição |
|----------------|-------|-----------------------------------|
| nome | texto | Nome da aplicação. |
| versao | texto | Versão da aplicação. |
| descricao | texto | Descrição da aplicação. |
| licenca.nome | texto | Nome da licença da aplicação. |
| licenca.url | texto | URL da licença da aplicação. |
liquido.roteador
Controla o comportamento do roteador HTTP.
| Propriedade | Tipo | Descrição | Padrão |
|---------------------|---------|--------------------------------------------------------|--------------|
| diretorioEstatico | texto | Caminho do diretório de arquivos estáticos. | 'publico' |
| cors | lógico | Habilita CORS. | falso |
| bodyParser | lógico | Habilita o body-parser. | verdadeiro |
| morgan | lógico | Habilita o log de requisições com morgan. | falso |
| cookieParser | lógico | Habilita o cookie-parser. | verdadeiro |
| passport | lógico | Habilita o passport para autenticação. | falso |
| json | lógico | Habilita o suporte a JSON no body. | verdadeiro |
| helmet | lógico | Habilita o helmet para segurança de cabeçalhos HTTP. | verdadeiro |
| porta | número | Porta na qual o servidor irá subir. | 3000 |
Exemplo:
liquido.roteador.diretorioEstatico = 'publico'
liquido.roteador.cors = verdadeiro
liquido.roteador.bodyParser = verdadeiro
liquido.roteador.morgan = verdadeiro
liquido.roteador.cookieParser = verdadeiro
liquido.roteador.passport = falso
liquido.roteador.json = verdadeiro
liquido.roteador.helmet = verdadeiro
liquido.roteador.porta = 3000liquido.dados.<nome>
Configura uma fonte de dados nomeada. <nome> é um identificador livre escolhido pelo projeto (ex: lincones, principal, cache).
| Propriedade | Tipo | Descrição |
|--------------|---------|-------------------------------------------------------------------------------|
| tecnologia | texto | Tecnologia de banco de dados. Valores permitidos: sqlite, mysql, postgres, mongodb, mssql. |
| caminho | texto | Caminho do arquivo de banco de dados (ex: ':memory:' para SQLite em memória). |
| host | texto | Endereço do servidor de banco de dados. |
| porta | número | Porta do servidor de banco de dados. |
| usuario | texto | Nome de usuário para conexão. |
| senha | texto | Senha para conexão. |
| banco | texto | Nome do banco de dados. |
| autoInicializar | lógico | Inicializa o banco automaticamente ao iniciar o servidor. |
| arquivoInicializacao | texto | Arquivo de inicialização do banco (padrão: 'inicializacao.lincones'). |
Exemplo:
// Banco de dados em memória
liquido.dados.lincones.tecnologia = 'sqlite'
liquido.dados.lincones.caminho = ':memory:'
// Banco de dados PostgreSQL remoto
liquido.dados.principal.tecnologia = 'postgres'
liquido.dados.principal.host = 'localhost'
liquido.dados.principal.porta = 5432
liquido.dados.principal.usuario = 'admin'
liquido.dados.principal.senha = 'segredo'
liquido.dados.principal.banco = 'meu_banco'liquido.autenticacao
Configura o mecanismo de autenticação da aplicação.
| Propriedade | Tipo | Descrição |
|--------------|--------|-----------------------------------------------------------|
| tecnologia | texto | Tecnologia de autenticação. Valores permitidos: jwt. |
Exemplo:
liquido.autenticacao.tecnologia = 'jwt'
liquido.autenticacao.segredo = 'minha-chave-secreta'
liquido.autenticacao.expiracao = '7d'liquido.estilos
Configura a geração de CSS a partir de FolEs.
| Propriedade | Tipo | Descrição | Padrão |
|-------------------|-------|--------------------------------------------------------------------------|--------------------|
| diretorioBase | texto | Caminho do diretório onde o CSS gerado a partir de FolEs é salvo e servido. | 'publico/css' |
Exemplo:
liquido.estilos.diretorioBase = 'publico/css'Exemplo completo
// Metadados do projeto
liquido.arquetipo = 'rest'
liquido.linguagem = 'delégua'
liquido.aplicacao.nome = 'meu-projeto'
liquido.aplicacao.versao = '1.0.0'
// Configuração de arquivos estáticos
liquido.roteador.diretorioEstatico = 'publico'
// Configuração do roteador
liquido.roteador.cors = verdadeiro
liquido.roteador.bodyParser = verdadeiro
liquido.roteador.morgan = verdadeiro
liquido.roteador.cookieParser = verdadeiro
liquido.roteador.passport = falso
liquido.roteador.json = verdadeiro
liquido.roteador.helmet = verdadeiro
liquido.roteador.porta = 3000
// Configuração de bases de dados
liquido.dados.lincones.tecnologia = 'sqlite'
liquido.dados.lincones.caminho = ':memory:'
// Configuração de autenticação
liquido.autenticacao.tecnologia = 'jwt'
// Configuração de estilos
liquido.estilos.diretorioBase = 'publico/css'Nota: Os schemas autoritativos de cada namespace
liquido.*são definidos pelo próprio pacoteliquidoem sua pastadelprops/. Os schemas embutidos neste pacote servem como fallback para quandoliquidonão estiver instalado.
Regras de validação
- Linhas em branco e comentários (
//) são ignorados pelo parser (analisar()). - Toda linha não vazia deve seguir o formato
<chave> = <valor>. Linhas sem=são inválidas. - Chave e valor não podem estar vazios.
- Para propriedades do namespace
liquido, o caminho completo deve ser conhecido — propriedades desconhecidas geram aviso (validar()). - O tipo do valor deve corresponder ao tipo esperado pela propriedade — divergências geram erro.
- Propriedades com valores enumerados (como
tecnologia,arquetipo,linguagem) só aceitam os valores listados na tabela. - Namespaces fora do conjunto conhecido (ex:
liquido) são permitidos sem validação de esquema, para uso por outros projetos do ecossistema.
