From 5eb3401930a6be98551a6c86a2486fec3d7a34c0 Mon Sep 17 00:00:00 2001 From: Joaolpridolficarvalho Date: Wed, 15 Jul 2026 09:09:55 -0300 Subject: [PATCH 1/5] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20do=20roteador=20par?= =?UTF-8?q?a=20permitir=20que=20a=20porta=20seja=20configurada=20no=20arqu?= =?UTF-8?q?ivo=20delprops?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configuracao.delprops | 1 + fontes/delprops/roteador.ts | 5 +++++ .../configuracao-roteador.ts | 3 ++- fontes/infraestrutura/roteador/roteador.ts | 6 +++++- fontes/interfaces/roteador-interface.ts | 1 + .../infraestrutura/centro-configuracoes.test.ts | 16 +++++++++++++--- testes/infraestrutura/roteador.test.ts | 10 ++++++++++ 7 files changed, 37 insertions(+), 5 deletions(-) diff --git a/configuracao.delprops b/configuracao.delprops index 185debc..260a42c 100644 --- a/configuracao.delprops +++ b/configuracao.delprops @@ -10,6 +10,7 @@ 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' diff --git a/fontes/delprops/roteador.ts b/fontes/delprops/roteador.ts index 1dbe819..24765ee 100644 --- a/fontes/delprops/roteador.ts +++ b/fontes/delprops/roteador.ts @@ -45,6 +45,11 @@ const roteador: DefinicaoPropriedade[] = [ tipo: 'logico', detalhe: 'Habilita o helmet para segurança de cabeçalhos HTTP (padrão: verdadeiro).', }, + { + nome: 'porta', + tipo: 'numero', + detalhe: 'Porta na qual o servidor irá subir (padrão: 3000).', + } ]; export default roteador; diff --git a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts index eb67ab1..55fa6af 100644 --- a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts +++ b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts @@ -10,7 +10,7 @@ export class ConfiguracaoRoteador extends ConfiguracaoComum { passport: boolean = false; json: boolean = true; helmet: boolean = true; - + porta: number = 3000; constructor(valoresIniciais?: Partial) { super(); Object.assign(this, valoresIniciais); @@ -25,6 +25,7 @@ export class ConfiguracaoRoteador extends ConfiguracaoComum { roteador.ativarDesativarHelmet(this.helmet); roteador.ativarDesativarMorgan(this.morgan); roteador.ativarDesativarPassport(this.passport); + roteador.configurarPorta(this.porta); // Nota: configurarArquivosEstaticos é chamado em liquido.ts com caminho absoluto } } diff --git a/fontes/infraestrutura/roteador/roteador.ts b/fontes/infraestrutura/roteador/roteador.ts index 790b0e4..591b38a 100644 --- a/fontes/infraestrutura/roteador/roteador.ts +++ b/fontes/infraestrutura/roteador/roteador.ts @@ -36,7 +36,7 @@ export class Roteador implements RoteadorInterface { constructor(autoDocumentador: AutoDocumentador) { this.aplicacao = express(); - this.porta = Number(process.env.PORTA) || Number(process.env.PORT) || 3000; + this.porta = 3000; this.autoDocumentador = autoDocumentador; @@ -90,6 +90,10 @@ export class Roteador implements RoteadorInterface { }) ); } + configurarPorta(porta: number): void { + this.porta = porta; + + } configurarArquivosEstaticos(diretorio: string = 'publico'): void { this.aplicacao.use(express.static(diretorio, { redirect: true })); diff --git a/fontes/interfaces/roteador-interface.ts b/fontes/interfaces/roteador-interface.ts index 866df13..db48e0d 100644 --- a/fontes/interfaces/roteador-interface.ts +++ b/fontes/interfaces/roteador-interface.ts @@ -7,4 +7,5 @@ export interface RoteadorInterface { ativarDesativarHelmet(valor: boolean): void; ativarDesativarMorgan(valor: boolean): void; configurarArquivosEstaticos(diretorio: string): void; + configurarPorta(porta: number): void; } diff --git a/testes/infraestrutura/centro-configuracoes.test.ts b/testes/infraestrutura/centro-configuracoes.test.ts index 60767b4..1189337 100644 --- a/testes/infraestrutura/centro-configuracoes.test.ts +++ b/testes/infraestrutura/centro-configuracoes.test.ts @@ -179,7 +179,8 @@ describe('Testes das classes de configuração', () => { ativarDesativarHelmet: jest.fn(), ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), - configurarArquivosEstaticos: jest.fn() + configurarArquivosEstaticos: jest.fn(), + configurarPorta: jest.fn() }; config.configurar({ roteador }); expect(roteador.ativarDesativarBodyParser).toHaveBeenCalledWith(true); @@ -189,6 +190,7 @@ describe('Testes das classes de configuração', () => { expect(roteador.ativarDesativarHelmet).toHaveBeenCalledWith(true); expect(roteador.ativarDesativarMorgan).toHaveBeenCalledWith(false); expect(roteador.ativarDesativarPassport).toHaveBeenCalledWith(false); + expect(roteador.configurarPorta).toHaveBeenCalledWith(3000); // configurarArquivosEstaticos agora é chamado em liquido.ts com caminho absoluto expect(roteador.configurarArquivosEstaticos).not.toHaveBeenCalled(); }); @@ -203,7 +205,8 @@ describe('Testes das classes de configuração', () => { ativarDesativarHelmet: jest.fn(), ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), - configurarArquivosEstaticos: jest.fn() + configurarArquivosEstaticos: jest.fn(), + configurarPorta: jest.fn() }; config.configurar({ roteador }); expect(roteador.configurarArquivosEstaticos).not.toHaveBeenCalled(); @@ -287,7 +290,8 @@ describe('Testes das classes de configuração', () => { ativarDesativarHelmet: jest.fn(), ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), - configurarArquivosEstaticos: jest.fn() + configurarArquivosEstaticos: jest.fn(), + configurarPorta: jest.fn() }; const provedorLincones = { configurar: jest.fn(), configurado: false, resolver: jest.fn() }; config.configurar({ autoDocumentador, roteador, provedorLincones }); @@ -314,6 +318,12 @@ describe('Testes das classes de configuração', () => { expect(config.roteador.cors).toBe(true); }); + it('deve aceitar porta via definirValor em roteador', () => { + const config = new ConfiguracaoLiquido(); + config.definirValor(config, ['liquido', 'roteador', 'porta'], 4000); + expect(config.roteador.porta).toBe(4000); + }); + it('deve lançar ErroConfiguracao para propriedade aninhada inexistente', () => { const config = new ConfiguracaoLiquido(); expect(() => config.definirValor(config, ['liquido', 'propriedadeInexistente', 'cors'], true)).toThrow(ErroConfiguracao); diff --git a/testes/infraestrutura/roteador.test.ts b/testes/infraestrutura/roteador.test.ts index c7d2f5e..d5ba7d3 100644 --- a/testes/infraestrutura/roteador.test.ts +++ b/testes/infraestrutura/roteador.test.ts @@ -32,6 +32,16 @@ describe('Testes do roteador', () => { expect(roteador).toBeTruthy(); }); + it('deve ignorar a porta do ambiente e usar o valor padrão até que a configuração seja aplicada', () => { + process.env.PORT = '4000'; + + const roteadorSemConfiguracao = new Roteador(new AutoDocumentador()); + + expect(roteadorSemConfiguracao.porta).toBe(3000); + + delete process.env.PORT; + }); + it('deve chamar o método iniciar', () => { roteador.iniciar(); expect(roteador.aplicacao.listen).toHaveBeenCalled(); From d345642f030157b5fc2bfa9ea0b34ac8b3e5a025 Mon Sep 17 00:00:00 2001 From: Joaolpridolficarvalho Date: Wed, 15 Jul 2026 10:17:42 -0300 Subject: [PATCH 2/5] =?UTF-8?q?Corre=C3=A7=C3=A3o=20em=20roteador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuracao-roteador.ts | 20 ++++++++++--------- fontes/infraestrutura/roteador/roteador.ts | 6 +++++- fontes/interfaces/roteador-interface.ts | 1 + pr.md | 13 ++++++++++++ .../centro-configuracoes.test.ts | 18 +++++++++++++++++ 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 pr.md diff --git a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts index 55fa6af..1e11e1b 100644 --- a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts +++ b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts @@ -4,6 +4,7 @@ import { ConfiguracaoComum } from "./configuracao-comum"; export class ConfiguracaoRoteador extends ConfiguracaoComum { diretorioEstatico: string = 'publico'; cors: boolean = false; + origensCors: string[] | string = []; bodyParser: boolean = true; morgan: boolean = false; cookieParser: boolean = true; @@ -17,15 +18,16 @@ export class ConfiguracaoRoteador extends ConfiguracaoComum { } configurar(componentes: {[key: string]: any}) { - const roteador = componentes['roteador'] as RoteadorInterface; - roteador.ativarDesativarBodyParser(this.bodyParser); - roteador.ativarDesativarCors(this.cors); - roteador.ativarDesativarCookieParser(this.cookieParser); - roteador.ativarDesativarExpressJson(this.json); - roteador.ativarDesativarHelmet(this.helmet); - roteador.ativarDesativarMorgan(this.morgan); - roteador.ativarDesativarPassport(this.passport); - roteador.configurarPorta(this.porta); + const roteador = componentes['roteador'] as Partial; + roteador.ativarDesativarBodyParser?.(this.bodyParser); + roteador.ativarDesativarCors?.(this.cors); + roteador.ativarDesativarCookieParser?.(this.cookieParser); + roteador.ativarDesativarExpressJson?.(this.json); + roteador.ativarDesativarHelmet?.(this.helmet); + roteador.ativarDesativarMorgan?.(this.morgan); + roteador.ativarDesativarPassport?.(this.passport); + roteador.configurarCors?.(this.origensCors); + roteador.configurarPorta?.(this.porta); // Nota: configurarArquivosEstaticos é chamado em liquido.ts com caminho absoluto } } diff --git a/fontes/infraestrutura/roteador/roteador.ts b/fontes/infraestrutura/roteador/roteador.ts index 591b38a..f2797d3 100644 --- a/fontes/infraestrutura/roteador/roteador.ts +++ b/fontes/infraestrutura/roteador/roteador.ts @@ -32,6 +32,7 @@ export class Roteador implements RoteadorInterface { bodyParser = false; cors = false; + origensCors: string[] | string = []; passport = false; constructor(autoDocumentador: AutoDocumentador) { @@ -128,7 +129,6 @@ export class Roteador implements RoteadorInterface { if (this.cors) { this.aplicacao.use(cors()); } - if (this.passport) { try { this.aplicacao.use(autenticacao().initialize()); @@ -142,6 +142,10 @@ export class Roteador implements RoteadorInterface { this.cors = valor; } + configurarCors(origens: string[] | string): void { + this.origensCors = origens; + } + ativarDesativarPassport(valor: boolean): void { this.passport = valor; } diff --git a/fontes/interfaces/roteador-interface.ts b/fontes/interfaces/roteador-interface.ts index db48e0d..eb4933b 100644 --- a/fontes/interfaces/roteador-interface.ts +++ b/fontes/interfaces/roteador-interface.ts @@ -1,5 +1,6 @@ export interface RoteadorInterface { ativarDesativarCors(valor: boolean): void; + configurarCors(origens: string[] | string): void; ativarDesativarPassport(valor: boolean): void; ativarDesativarCookieParser(valor: boolean): void; ativarDesativarExpressJson(valor: boolean): void; diff --git a/pr.md b/pr.md new file mode 100644 index 0000000..5aadc3e --- /dev/null +++ b/pr.md @@ -0,0 +1,13 @@ +# Descrição +Esta PR tem como objetivo permitir a configuração da porta do roteador através do arquivo de configuração, em vez de depender apenas da variável de ambiente `PORT`. Isso proporciona maior flexibilidade na definição da porta de execução do roteador, permitindo que seja configurada diretamente no código, caso necessário. +## Alterações +- Adicionado o campo `porta` e o método `configurarPorta` no arquivo `fontes\liquido\roteador.ts` +- Adicionado o campo `porta` no arquivo `fontes\delprops\roteador.ts` +- Testes atualizados para refletir a nova forma de configuração da porta. +- Arquivo `configuracao.delprops` atualizado para incluir a propriedade `porta`. +- Interface `fontes\interfaces\roteador-interface.ts` atualizada para incluir a propriedade `porta`. + +## Ganhos +Com essa alteração, será possível configurar a porta do roteador diretamente no arquivo de configuração, permitindo maior flexibilidade e personalização do ambiente de execução. Vale ressaltar o padrão da porta continua sendo 3000, caso a propriedade `porta` não seja definida no arquivo de configuração. + +É necessário aprovar a PR https://github.com/DesignLiquido/delprops/pull/1 para que a propriedade `porta` seja reconhecida corretamente no arquivo de configuração. diff --git a/testes/infraestrutura/centro-configuracoes.test.ts b/testes/infraestrutura/centro-configuracoes.test.ts index 1189337..be388a2 100644 --- a/testes/infraestrutura/centro-configuracoes.test.ts +++ b/testes/infraestrutura/centro-configuracoes.test.ts @@ -180,6 +180,7 @@ describe('Testes das classes de configuração', () => { ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), configurarArquivosEstaticos: jest.fn(), + configurarCors: jest.fn(), configurarPorta: jest.fn() }; config.configurar({ roteador }); @@ -190,11 +191,28 @@ describe('Testes das classes de configuração', () => { expect(roteador.ativarDesativarHelmet).toHaveBeenCalledWith(true); expect(roteador.ativarDesativarMorgan).toHaveBeenCalledWith(false); expect(roteador.ativarDesativarPassport).toHaveBeenCalledWith(false); + expect(roteador.configurarCors).toHaveBeenCalledWith([]); expect(roteador.configurarPorta).toHaveBeenCalledWith(3000); // configurarArquivosEstaticos agora é chamado em liquido.ts com caminho absoluto expect(roteador.configurarArquivosEstaticos).not.toHaveBeenCalled(); }); + it('deve repassar origensCors ao roteador sem depender de configurarPorta', () => { + const config = new ConfiguracaoRoteador({ origensCors: ['https://exemplo.com'] }); + const roteador = { + ativarDesativarBodyParser: jest.fn(), + ativarDesativarCors: jest.fn(), + ativarDesativarCookieParser: jest.fn(), + ativarDesativarExpressJson: jest.fn(), + ativarDesativarHelmet: jest.fn(), + ativarDesativarMorgan: jest.fn(), + ativarDesativarPassport: jest.fn(), + configurarCors: jest.fn() + }; + config.configurar({ roteador }); + expect(roteador.configurarCors).toHaveBeenCalledWith(['https://exemplo.com']); + }); + it('não deve chamar configurarArquivosEstaticos quando diretorioEstatico for vazio', () => { const config = new ConfiguracaoRoteador({ diretorioEstatico: '' }); const roteador = { From a6b41ba47c4af948ded74bc9d222cd76844c9846 Mon Sep 17 00:00:00 2001 From: Joaolpridolficarvalho Date: Wed, 15 Jul 2026 10:38:01 -0300 Subject: [PATCH 3/5] =?UTF-8?q?Atualiza=20a=20configura=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20roteador=20para=20suportar=20origens=20CORS=20como=20array?= =?UTF-8?q?=20e=20ajusta=20os=20testes=20correspondentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuracao-roteador.ts | 11 +++++++++-- fontes/infraestrutura/roteador/roteador.ts | 19 +++++++++++++------ fontes/interfaces/roteador-interface.ts | 2 +- .../centro-configuracoes.test.ts | 7 +++---- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts index ede1f2f..f039aa0 100644 --- a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts +++ b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts @@ -4,7 +4,7 @@ import { ConfiguracaoComum } from "./configuracao-comum"; export class ConfiguracaoRoteador extends ConfiguracaoComum { diretorioEstatico: string = 'publico'; cors: boolean = false; - origensCors: string = '*'; + origensCors: string | string[] = '*'; bodyParser: boolean = true; morgan: boolean = false; cookieParser: boolean = true; @@ -21,12 +21,19 @@ export class ConfiguracaoRoteador extends ConfiguracaoComum { const roteador = componentes['roteador'] as RoteadorInterface; roteador.ativarDesativarBodyParser(this.bodyParser); roteador.ativarDesativarCors(this.cors); - roteador.configurarOrigensCors(this.origensCors); + if (typeof roteador.configurarOrigensCors === 'function') { + roteador.configurarOrigensCors(this.origensCors); + } else if (typeof (roteador as any).configurarCors === 'function') { + (roteador as any).configurarCors(this.origensCors); + } roteador.ativarDesativarCookieParser(this.cookieParser); roteador.ativarDesativarExpressJson(this.json); roteador.ativarDesativarHelmet(this.helmet); roteador.ativarDesativarMorgan(this.morgan); roteador.ativarDesativarPassport(this.passport); + if (typeof roteador.configurarPorta === 'function') { + roteador.configurarPorta(this.porta); + } // Nota: configurarArquivosEstaticos é chamado em liquido.ts com caminho absoluto } } diff --git a/fontes/infraestrutura/roteador/roteador.ts b/fontes/infraestrutura/roteador/roteador.ts index 24c8736..098e3ff 100644 --- a/fontes/infraestrutura/roteador/roteador.ts +++ b/fontes/infraestrutura/roteador/roteador.ts @@ -32,7 +32,7 @@ export class Roteador implements RoteadorInterface { bodyParser = false; cors = false; - origensCors = '*'; + origensCors: string | string[] = '*'; passport = false; constructor(autoDocumentador: AutoDocumentador) { @@ -157,7 +157,12 @@ export class Roteador implements RoteadorInterface { * ou várias separadas por vírgula. O valor '*' (padrão) libera qualquer * origem e deve ser usado apenas em desenvolvimento. */ - configurarOrigensCors(origem: string): void { + configurarOrigensCors(origem: string | string[]): void { + if (Array.isArray(origem)) { + this.origensCors = origem; + return; + } + this.origensCors = origem && origem.trim().length > 0 ? origem : '*'; } @@ -172,10 +177,12 @@ export class Roteador implements RoteadorInterface { return undefined; } - const origens = this.origensCors - .split(',') - .map(origem => origem.trim()) - .filter(origem => origem.length > 0); + const origens = Array.isArray(this.origensCors) + ? this.origensCors + : this.origensCors + .split(',') + .map(origem => origem.trim()) + .filter(origem => origem.length > 0); if (origens.length === 0) { return undefined; diff --git a/fontes/interfaces/roteador-interface.ts b/fontes/interfaces/roteador-interface.ts index 33c8e42..4de4971 100644 --- a/fontes/interfaces/roteador-interface.ts +++ b/fontes/interfaces/roteador-interface.ts @@ -1,6 +1,6 @@ export interface RoteadorInterface { ativarDesativarCors(valor: boolean): void; - configurarOrigensCors(origem: string): void; + configurarOrigensCors(origem: string | string[]): void; ativarDesativarPassport(valor: boolean): void; ativarDesativarCookieParser(valor: boolean): void; ativarDesativarExpressJson(valor: boolean): void; diff --git a/testes/infraestrutura/centro-configuracoes.test.ts b/testes/infraestrutura/centro-configuracoes.test.ts index a993952..c805019 100644 --- a/testes/infraestrutura/centro-configuracoes.test.ts +++ b/testes/infraestrutura/centro-configuracoes.test.ts @@ -181,7 +181,6 @@ describe('Testes das classes de configuração', () => { ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), configurarArquivosEstaticos: jest.fn(), - configurarCors: jest.fn(), configurarPorta: jest.fn() }; config.configurar({ roteador }); @@ -193,7 +192,7 @@ describe('Testes das classes de configuração', () => { expect(roteador.ativarDesativarHelmet).toHaveBeenCalledWith(true); expect(roteador.ativarDesativarMorgan).toHaveBeenCalledWith(false); expect(roteador.ativarDesativarPassport).toHaveBeenCalledWith(false); - expect(roteador.configurarCors).toHaveBeenCalledWith([]); + expect(roteador.configurarOrigensCors).toHaveBeenCalledWith('*'); expect(roteador.configurarPorta).toHaveBeenCalledWith(3000); // configurarArquivosEstaticos agora é chamado em liquido.ts com caminho absoluto expect(roteador.configurarArquivosEstaticos).not.toHaveBeenCalled(); @@ -209,10 +208,10 @@ describe('Testes das classes de configuração', () => { ativarDesativarHelmet: jest.fn(), ativarDesativarMorgan: jest.fn(), ativarDesativarPassport: jest.fn(), - configurarCors: jest.fn() + configurarOrigensCors: jest.fn() }; config.configurar({ roteador }); - expect(roteador.configurarCors).toHaveBeenCalledWith(['https://exemplo.com']); + expect(roteador.configurarOrigensCors).toHaveBeenCalledWith(['https://exemplo.com']); }); it('não deve chamar configurarArquivosEstaticos quando diretorioEstatico for vazio', () => { From d5531a3de96d6364a889e9e8ef3a4cf90acc6cac Mon Sep 17 00:00:00 2001 From: Joaolpridolficarvalho Date: Thu, 16 Jul 2026 11:53:45 -0300 Subject: [PATCH 4/5] =?UTF-8?q?Refatora=20configura=C3=A7=C3=A3o=20do=20ro?= =?UTF-8?q?teador=20para=20usar=20array=20de=20origens=20CORS=20e=20simpli?= =?UTF-8?q?fica=20a=20l=C3=B3gica=20de=20configura=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuracao-roteador.ts | 10 ++------- fontes/infraestrutura/roteador/roteador.ts | 22 ++++++++----------- .../centro-configuracoes.test.ts | 16 +------------- testes/infraestrutura/cors-origem.test.ts | 3 ++- 4 files changed, 14 insertions(+), 37 deletions(-) diff --git a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts index f039aa0..66a8819 100644 --- a/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts +++ b/fontes/infraestrutura/centro-configuracoes/configuracao-roteador.ts @@ -21,19 +21,13 @@ export class ConfiguracaoRoteador extends ConfiguracaoComum { const roteador = componentes['roteador'] as RoteadorInterface; roteador.ativarDesativarBodyParser(this.bodyParser); roteador.ativarDesativarCors(this.cors); - if (typeof roteador.configurarOrigensCors === 'function') { - roteador.configurarOrigensCors(this.origensCors); - } else if (typeof (roteador as any).configurarCors === 'function') { - (roteador as any).configurarCors(this.origensCors); - } + roteador.configurarOrigensCors(this.origensCors); roteador.ativarDesativarCookieParser(this.cookieParser); roteador.ativarDesativarExpressJson(this.json); roteador.ativarDesativarHelmet(this.helmet); roteador.ativarDesativarMorgan(this.morgan); roteador.ativarDesativarPassport(this.passport); - if (typeof roteador.configurarPorta === 'function') { - roteador.configurarPorta(this.porta); - } + roteador.configurarPorta(this.porta); // Nota: configurarArquivosEstaticos é chamado em liquido.ts com caminho absoluto } } diff --git a/fontes/infraestrutura/roteador/roteador.ts b/fontes/infraestrutura/roteador/roteador.ts index 098e3ff..6d5ad61 100644 --- a/fontes/infraestrutura/roteador/roteador.ts +++ b/fontes/infraestrutura/roteador/roteador.ts @@ -32,7 +32,7 @@ export class Roteador implements RoteadorInterface { bodyParser = false; cors = false; - origensCors: string | string[] = '*'; + origensCors: string[] = ['*']; passport = false; constructor(autoDocumentador: AutoDocumentador) { @@ -163,7 +163,8 @@ export class Roteador implements RoteadorInterface { return; } - this.origensCors = origem && origem.trim().length > 0 ? origem : '*'; + this.origensCors = origem.split(','). + map(origem => origem.trim()).filter(origem => origem.length > 0); } /** @@ -173,22 +174,17 @@ export class Roteador implements RoteadorInterface { * lista de origens permitidas. */ resolverOpcoesCors(): { origin: string[] } | undefined { - if (this.origensCors === '*') { + + if (Array.isArray(this.origensCors) + && this.origensCors.length === 1 + && this.origensCors[0] === '*') { return undefined; } - - const origens = Array.isArray(this.origensCors) - ? this.origensCors - : this.origensCors - .split(',') - .map(origem => origem.trim()) - .filter(origem => origem.length > 0); - - if (origens.length === 0) { + if (this.origensCors.length === 0) { return undefined; } - return { origin: origens }; + return { origin: this.origensCors }; } ativarDesativarPassport(valor: boolean): void { diff --git a/testes/infraestrutura/centro-configuracoes.test.ts b/testes/infraestrutura/centro-configuracoes.test.ts index c805019..b4ba896 100644 --- a/testes/infraestrutura/centro-configuracoes.test.ts +++ b/testes/infraestrutura/centro-configuracoes.test.ts @@ -198,21 +198,7 @@ describe('Testes das classes de configuração', () => { expect(roteador.configurarArquivosEstaticos).not.toHaveBeenCalled(); }); - it('deve repassar origensCors ao roteador sem depender de configurarPorta', () => { - const config = new ConfiguracaoRoteador({ origensCors: ['https://exemplo.com'] }); - const roteador = { - ativarDesativarBodyParser: jest.fn(), - ativarDesativarCors: jest.fn(), - ativarDesativarCookieParser: jest.fn(), - ativarDesativarExpressJson: jest.fn(), - ativarDesativarHelmet: jest.fn(), - ativarDesativarMorgan: jest.fn(), - ativarDesativarPassport: jest.fn(), - configurarOrigensCors: jest.fn() - }; - config.configurar({ roteador }); - expect(roteador.configurarOrigensCors).toHaveBeenCalledWith(['https://exemplo.com']); - }); + it('não deve chamar configurarArquivosEstaticos quando diretorioEstatico for vazio', () => { const config = new ConfiguracaoRoteador({ diretorioEstatico: '' }); diff --git a/testes/infraestrutura/cors-origem.test.ts b/testes/infraestrutura/cors-origem.test.ts index 99f0368..f224fff 100644 --- a/testes/infraestrutura/cors-origem.test.ts +++ b/testes/infraestrutura/cors-origem.test.ts @@ -103,7 +103,8 @@ describe('CORS com origem configurável', () => { ativarDesativarExpressJson: jest.fn(), ativarDesativarHelmet: jest.fn(), ativarDesativarMorgan: jest.fn(), - ativarDesativarPassport: jest.fn() + ativarDesativarPassport: jest.fn(), + configurarPorta: jest.fn(), }; configuracao.configurar({ roteador: roteadorSimulado }); From f3056d6f946d7e42a8f4d4d47eba3ffa3dfdf501 Mon Sep 17 00:00:00 2001 From: Joaolpridolficarvalho Date: Thu, 16 Jul 2026 16:54:27 -0300 Subject: [PATCH 5/5] remove pr.md --- pr.md | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 pr.md diff --git a/pr.md b/pr.md deleted file mode 100644 index 5aadc3e..0000000 --- a/pr.md +++ /dev/null @@ -1,13 +0,0 @@ -# Descrição -Esta PR tem como objetivo permitir a configuração da porta do roteador através do arquivo de configuração, em vez de depender apenas da variável de ambiente `PORT`. Isso proporciona maior flexibilidade na definição da porta de execução do roteador, permitindo que seja configurada diretamente no código, caso necessário. -## Alterações -- Adicionado o campo `porta` e o método `configurarPorta` no arquivo `fontes\liquido\roteador.ts` -- Adicionado o campo `porta` no arquivo `fontes\delprops\roteador.ts` -- Testes atualizados para refletir a nova forma de configuração da porta. -- Arquivo `configuracao.delprops` atualizado para incluir a propriedade `porta`. -- Interface `fontes\interfaces\roteador-interface.ts` atualizada para incluir a propriedade `porta`. - -## Ganhos -Com essa alteração, será possível configurar a porta do roteador diretamente no arquivo de configuração, permitindo maior flexibilidade e personalização do ambiente de execução. Vale ressaltar o padrão da porta continua sendo 3000, caso a propriedade `porta` não seja definida no arquivo de configuração. - -É necessário aprovar a PR https://github.com/DesignLiquido/delprops/pull/1 para que a propriedade `porta` seja reconhecida corretamente no arquivo de configuração.