@@ -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 */
91152export 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