npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@lybioit/component-interface-pattern

v1.0.1

Published

Padrão de Interface de Componente - Abstrações para desenvolvimento de componentes reutilizáveis. Projeto da disciplina BRADEPO do IFSP-BRA.

Readme

Component Interface Pattern

npm version License: MIT

Padrão de Interface de Componente - Abstrações para desenvolvimento de componentes reutilizáveis. Projeto da disciplina BRADEPO (Desenvolvimento de Componentes) do curso de Tecnologia em Análise e Desenvolvimento de Sistemas do IFSP-BRA.

📋 Sobre o Projeto

Este pacote implementa o Padrão de Interface de Componente seguindo a metodologia Beyond para desenvolvimento de software orientado a componentes. É parte do projeto bimestral da disciplina BRADEPO, onde cada aluno desenvolve componentes individuais que posteriormente serão acoplados em um projeto final.

🎯 Objetivos

  • Implementar o Padrão de Interface de Componente como modelo de projeto
  • Aplicar os Princípios SOLID na implementação dos elementos internos
  • Criar componentes reutilizáveis com TypeScript
  • Publicar componentes em repositório npm para uso em outros projetos

🚀 Instalação

npm install @lybioit/component-interface-pattern

📦 Estrutura do Pacote

src/
├── provided/           # Interfaces Fornecidas
│   ├── ComponentInterface.ts    # Interface principal do componente
│   └── InterfacePort.ts         # Porto de interface
└── required/           # Interfaces Requeridas
    ├── PortOutbox.ts            # Caixa de saída base
    ├── StandardPortOutbox.ts    # Caixa de saída padrão
    ├── BroadcastPortOutbox.ts   # Caixa de saída broadcast
    └── NonComponentPortOutbox.ts # Caixa de saída não-componente

🔧 Como Usar

1. Importando as Abstrações

import { 
  ComponentInterface, 
  InterfacePort, 
  PortOutbox,
  StandardPortOutbox,
  BroadcastPortOutbox,
  NonComponentPortOutbox 
} from '@lybioit/component-interface-pattern';

2. Criando um Componente

import { ComponentInterface, InterfacePort } from '@lybioit/component-interface-pattern';

// Implementando um porto específico
class MyInterfacePort extends InterfacePort {
  public initialize(): void {
    this.id = 'my-port';
    // Configuração específica do porto
  }
}

// Implementando um componente
class MyComponent extends ComponentInterface {
  private myPort: MyInterfacePort;

  constructor() {
    super();
    this.myPort = new MyInterfacePort();
    this.ports.push(this.myPort);
  }

  public initialize(): void {
    this.id = 'my-component';
    this.myPort.initialize();
  }
}

3. Conectando Componentes

// Criando componentes
const componentA = new MyComponent();
const componentB = new MyComponent();

// Inicializando
componentA.initialize();
componentB.initialize();

// Conectando através de portos
componentA.connectToPort(componentB.getPort('my-port'), 'my-port');

4. Usando Diferentes Tipos de Outbox

import { StandardPortOutbox, BroadcastPortOutbox } from '@lybioit/component-interface-pattern';

// Outbox padrão - conecta a um único componente
const standardOutbox = new StandardPortOutbox();

// Outbox broadcast - conecta a múltiplos componentes
const broadcastOutbox = new BroadcastPortOutbox();

🏗️ Arquitetura

Padrão de Interface de Componente

O pacote implementa o padrão que consiste em:

  1. ComponentInterface: Classe abstrata que representa a interface principal do componente
  2. InterfacePort: Classe abstrata para portos de interface que gerenciam conexões
  3. PortOutbox: Classe abstrata para caixas de saída que invocam operações externas

Princípios SOLID Aplicados

  • S - Single Responsibility: Cada classe tem uma responsabilidade específica
  • O - Open/Closed: Classes abertas para extensão, fechadas para modificação
  • L - Liskov Substitution: Subclasses podem substituir suas classes base
  • I - Interface Segregation: Interfaces específicas para cada tipo de funcionalidade
  • D - Dependency Inversion: Dependências de abstrações, não de implementações

📚 Exemplos de Uso

Exemplo 1: Sistema de Notificações

import { ComponentInterface, InterfacePort } from '@lybioit/component-interface-pattern';

class NotificationPort extends InterfacePort {
  public initialize(): void {
    this.id = 'notification-port';
  }

  public sendNotification(message: string): void {
    console.log(`Notificação: ${message}`);
  }
}

class NotificationComponent extends ComponentInterface {
  private notificationPort: NotificationPort;

  constructor() {
    super();
    this.notificationPort = new NotificationPort();
    this.ports.push(this.notificationPort);
  }

  public initialize(): void {
    this.id = 'notification-component';
    this.notificationPort.initialize();
  }

  public notify(message: string): void {
    const port = this.getPort('notification-port') as NotificationPort;
    if (port) {
      port.sendNotification(message);
    }
  }
}

Exemplo 2: Sistema de Logging

import { ComponentInterface, InterfacePort } from '@lybioit/component-interface-pattern';

class LoggingPort extends InterfacePort {
  public initialize(): void {
    this.id = 'logging-port';
  }

  public log(level: string, message: string): void {
    console.log(`[${level}] ${message}`);
  }
}

class LoggingComponent extends ComponentInterface {
  private loggingPort: LoggingPort;

  constructor() {
    super();
    this.loggingPort = new LoggingPort();
    this.ports.push(this.loggingPort);
  }

  public initialize(): void {
    this.id = 'logging-component';
    this.loggingPort.initialize();
  }

  public logInfo(message: string): void {
    const port = this.getPort('logging-port') as LoggingPort;
    if (port) {
      port.log('INFO', message);
    }
  }
}

🧪 Testando

Para testar o pacote em seu projeto:

// Teste básico de importação
import { ComponentInterface } from '@lybioit/component-interface-pattern';

// Verificar se a classe está disponível
console.log(typeof ComponentInterface); // 'function'

📖 Documentação da API

ComponentInterface

Classe abstrata base para todos os componentes.

Métodos Principais:

  • initialize(): void - Inicializa o componente
  • getId(): string - Retorna o ID do componente
  • getPort(id: string): InterfacePort | undefined - Recupera um porto específico
  • connectToPort(externalPort: InterfacePort, portId: string): void - Conecta a um porto externo
  • disconnectPort(portId: string): void - Desconecta um porto

InterfacePort

Classe abstrata para portos de interface.

Métodos Principais:

  • initialize(): void - Inicializa o porto
  • getId(): string - Retorna o ID do porto
  • connect(externalPort: InterfacePort): void - Conecta a um porto externo
  • disconnect(): void - Desconecta o porto

PortOutbox

Classe abstrata para caixas de saída.

Métodos:

  • disconnect(): void - Desconecta a caixa de saída

🔄 Versionamento

Este projeto segue Semantic Versioning. Para versões disponíveis, veja as tags neste repositório.

📝 Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.

👨‍🎓 Autor

Lybio Moraes Junior

🏫 Instituição

IFSP - Instituto Federal de São Paulo

  • Campus: Bragança Paulista
  • Curso: Tecnologia em Análise e Desenvolvimento de Sistemas
  • Disciplina: BRADEPO - Desenvolvimento de Componentes
  • Semestre: 2025/1

🤝 Contribuindo

Este é um projeto acadêmico desenvolvido como parte da disciplina BRADEPO. Contribuições são bem-vindas através de issues e pull requests.

📞 Suporte

Para dúvidas ou problemas, abra uma issue no GitHub.


Desenvolvido com ❤️ para a disciplina BRADEPO do IFSP-BRA