Skip to content

Commit fac4425

Browse files
Lógica de importação de bibliotecas de Delégua sem dependência com Node.js.
1 parent 5740794 commit fac4425

1 file changed

Lines changed: 76 additions & 1 deletion

File tree

  • fontes/mecanismo-importacao-bibliotecas

fontes/mecanismo-importacao-bibliotecas/index.ts

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,67 @@ function carregarBibliotecaInterfaceGrafica(): DeleguaModulo {
4242
return modulo;
4343
}
4444

45+
/**
46+
* Formato de definição de função usado pelos pacotes `@designliquido/delegua-*`
47+
* em seus arquivos `delegua-modulo`, consumido por ferramentas de documentação/completude
48+
* e, aqui, para gerar componentes chamáveis em tempo de execução.
49+
*/
50+
interface DefinicaoFuncaoBiblioteca {
51+
funcao: (...argumentos: any[]) => any;
52+
argumentos: unknown[];
53+
}
54+
55+
/**
56+
* Converte um objeto de definições no formato `DeleguaModuloXxx` (exportado pelos
57+
* pacotes de biblioteca padrão) em um `DeleguaModulo` executável, derivando a aridade
58+
* de cada função a partir do tamanho de `argumentos`.
59+
*/
60+
function converterDefinicoesParaDeleguaModulo(
61+
nomeModulo: string,
62+
definicoes: Record<string, DefinicaoFuncaoBiblioteca>
63+
): DeleguaModulo {
64+
const modulo = new DeleguaModulo(nomeModulo);
65+
modulo.componentes = {};
66+
for (const [nomeComponente, definicao] of Object.entries(definicoes)) {
67+
modulo.componentes[nomeComponente] = new FuncaoPadrao(definicao.argumentos.length, definicao.funcao);
68+
}
69+
return modulo;
70+
}
71+
72+
/**
73+
* Bibliotecas padrão sem dependências diretas de Node.js (sem `fs`/`path`/rede),
74+
* portanto seguras para carregar diretamente tanto na extensão desktop quanto na web.
75+
* Cada pacote expõe suas definições de função em um submódulo `delegua-modulo`,
76+
* no formato consumido por `converterDefinicaoParaDeleguaModulo`.
77+
*/
78+
function carregarBibliotecaTempo(): DeleguaModulo {
79+
const { DeleguaModuloTempo } = require('@designliquido/delegua-tempo/delegua-modulo') as typeof import('@designliquido/delegua-tempo/delegua-modulo');
80+
return converterDefinicoesParaDeleguaModulo('tempo', DeleguaModuloTempo);
81+
}
82+
83+
function carregarBibliotecaCsv(): DeleguaModulo {
84+
const { DeleguaModuloCsv } = require('@designliquido/delegua-csv/delegua-modulo') as typeof import('@designliquido/delegua-csv/delegua-modulo');
85+
return converterDefinicoesParaDeleguaModulo('csv', DeleguaModuloCsv);
86+
}
87+
88+
function carregarBibliotecaCriptografia(): DeleguaModulo {
89+
const { DeleguaModuloCriptografia } = require('@designliquido/delegua-criptografia/delegua-modulo') as typeof import('@designliquido/delegua-criptografia/delegua-modulo');
90+
return converterDefinicoesParaDeleguaModulo('criptografia', DeleguaModuloCriptografia);
91+
}
92+
93+
/**
94+
* Bibliotecas padrão já com suporte a carregamento nesta extensão, indexadas pelo
95+
* nome do pacote npm (o mesmo valor retornado por `verificarModulosDelegua`).
96+
* Bibliotecas ausentes deste mapa (ex.: `arquivos`, `json`, `imagens`) dependem de
97+
* acesso a sistema de arquivos e ainda não têm uma implementação compatível com a
98+
* API do VSCode/regra de não usar `fs`/`path` diretamente.
99+
*/
100+
const CARREGADORES_BIBLIOTECAS_SEM_DEPENDENCIA_NODE: { [pacoteNpm: string]: () => DeleguaModulo } = {
101+
'@designliquido/delegua-tempo': carregarBibliotecaTempo,
102+
'@designliquido/delegua-csv': carregarBibliotecaCsv,
103+
'@designliquido/delegua-criptografia': carregarBibliotecaCriptografia,
104+
};
105+
45106
/**
46107
* Mapeamento de nomes de módulos Delégua para seus pacotes npm correspondentes.
47108
* Esta é uma versão simplificada para a extensão VSCode, limitada aos pacotes Delégua.
@@ -89,10 +150,24 @@ export function verificarModulosDelegua(nomeModulo: string): string | false {
89150
* @throws Error indicando que bibliotecas externas não são suportadas na versão web
90151
*/
91152
export function carregarBibliotecaDelegua(nome: string): DeleguaModulo {
92-
if (nome.toLowerCase() === 'interfacegrafica') {
153+
const nomeNormalizado = nome.toLowerCase();
154+
155+
if (nomeNormalizado === 'interfacegrafica') {
93156
return carregarBibliotecaInterfaceGrafica();
94157
}
95158

159+
// `nome` chega em dois formatos diferentes dependendo do chamador: o nome curto
160+
// digitado pelo usuário (ex.: 'tempo', durante execução) ou o nome do pacote npm
161+
// já resolvido por `verificarModulosDelegua` (ex.: '@designliquido/delegua-tempo',
162+
// durante análise semântica). Tentamos resolver o nome curto; se não for um, ele
163+
// já deve ser o nome do pacote.
164+
const nomePacote = verificarModulosDelegua(nomeNormalizado) || nomeNormalizado;
165+
166+
const carregador = CARREGADORES_BIBLIOTECAS_SEM_DEPENDENCIA_NODE[nomePacote];
167+
if (carregador) {
168+
return carregador();
169+
}
170+
96171
throw new Error(
97172
`Importação de bibliotecas externas ('${nome}') não é suportada na extensão VSCode para Web. ` +
98173
`Apenas arquivos .delegua podem ser importados no momento.`

0 commit comments

Comments
 (0)