1

Pitch: 📦 Criei um Bundler utilizando tecnologias nativas do Bun!

Por favor, se puder apoie meu trabalho no Patreon.
Participe do Servidor no Discord. É novo, mas é especial.
Siga meu trabalho no YouTube, Instagram, Twitch ou até mesmo a página no GitHub, isso me ajuda a prosseguir com a criação de novos conteúdos e projetos.

Apresentação

Olá, tudo bem?
Sou Eduardo Baginski Costa um Engenheiro de Software em formação. Utilizo bastante linguagens de programação como Rust, C++ e C, além de algumas que ainda estou desenvolvendo certa proeficiência como o TypeScript e Go.

Estou começando a criar bibliotecas e projetos públicos para meu portifólio público, com esperança de conseguir trabalhos ou arranger um emprego fixo. Grande maioria e para solucionar meus próprios problemas mas, que via de regra, ainda assim servem muito bem a utilização ampla e pública.

Recentemente, graças a Deus, consegui meu primeiro projeto para desenvolver uma plataforma e dar suporte a mesma, com um contrato generoso de que se extende por cinco anos. Estou muito feliz por isso, após mais de quatro anos correndo atrás de algo e só me frustando pela quantidade massiva de recusas. Cheguei a entrar em depressão, iniciei um tratamento, mas isso a um cerot tempo, atualmente me encontro melhor. Fiquei feliz com essa comunidade, criei e publiquei meu primeiro repositório publico, um servidor DNS escrito em Rust como uma forma de estudo. Publiquei de forma despretenciosa e, superando minhas expectativas, tiveram pessoas bacanas que me apoiaram, gostaram do projeto, deixaram suas estrelas e me sgeuiram no YouTube, mesmo sem nada publicado. E agradeço muito por isso, tanto que esse primeiro pacote vai gerar o primeiro vídeo do meu canal, junto a um outro post aqui.

Se quiser ver esse projeto do servidor DNS, acesse ele aqui ou, se preferir, uma versão experimental melhorada para sistemas POSIX, sendo seu sucessor furutamente, acessando aqui.

Infelizmente, a minha cidade e região não é extamente um lugar muito promissor em nossa área, sendo muito escasso a mão de obra como programador. Me mudar, a princípio, também não possuo condições para tal, ainda mais que as únicas vagas promissoras são muito longe daqui.

O que me mantém é a convicção de que o negócio que estou desenvolvendo vai vingar, o que cheguei a testar para negócios aqui e muitos se interessaram, e isso me anima. A questão mesmo é mais apaciência para desenvolver, a ansiedade e uma depressão que, mesmo encerrado o tratamento bate forte as vezes, e o trabalho que considero desanimador, ainda mais para minhas competências, tendo em vista que pessoas que mal sabem contar aqui na cidade possuem cargos importantes por puro e simples nepotismo.

É meio que uma questão de sobrevivência esse negócio dar certo, tanto que o pouco que consegui guardar estou segurando para aguentar a pancada ao hospedar o site e os serviços necessaŕios como o Mongo, S3, entre outros. Posso segurar as pontas alguns meses. Mas baseado nele, tenho necessidades que as bibliotecas NPM atuais não suprem corretamente e, por necessidade, acabei iniciando o desenvolvimento.

Também, como não posso dar o luxo de gastar muito, algumas ferramentas são baseadas em projetos e serviços Open Source ou gratuítos. Um deles será o Brasil API que me servirá de grande ajuda e, sim Filipe Deschamps, não vou integrar todos os CEPs existentes, forá que a SDK terá sistema de cacheamento e LRU. O bom, para vocês cara comunidade de devs, é que as SDKs serão públicas na minha página do GitHub.

E uma das bibliotecas principais acabou, por casusa de uma frustração, gerando a biblioteca que vocês irão acompanhar aqui.

Parte 2 - A Frustração

Como mencionei, necessito desenvolver um grande par de bibliotecas para suprir minhas necessidades e, geralmente como utilizo o BunJS para o desenvolvimento, geralmente acabava utilizando o pacote bunup que é escrito para o Bun. Acabei frustrado pois em bibliotecas muito grandes o mesmo apresentava grandes limitações, principalmente na geração dos bundles que possuem muitas referências, resultando assim em todas as builds erros de vínculo e de inferência de tipos, isso não importando o quão bem eu configurasse.

Essa grande raiva que passei, junto ao fato de não poder perder a mão com grandes bibliotecas e, também, de querer um porto seguro para as demais no futuro, acabei decidindo por criar meu próprio bundler construído sobre as tecnologias nativas do BunJS.

Parte 3 - A Ideia

A ideia é simples no papel: um bundler sobre as tecnologias do Bun que gere builds previsíveis, estáveis e confiáveis. Isso tomou forma ainda em uma lib que ainda esta privada e em desenvolvimento para variáveis de ambiente, onde removi completamente o bunup e programei, por mais simples que fosse, um bundler utilizando o Bun.build. Era configurado através de um arquivo JSON que definia algumas propriedades e os pontos de entrada da biblioteca para fazer o bundle dos arquivos, a geração de declarações de tipo do TypeScript e, também, gerar automaticamente as configurações do exports no package.json.

Esse código me serviu bem, ainda melhor que uma biblioteca como o bunup, então decidi abrir mão de um pouco tempo que possui e desenvolvi melhor essa tecnologia.

Parte 3 - A Biblioteca

Depois de algumas experimentações, acabei criando o @baginskicosta/bunpack, com o nome originado da junção de "Bun" + "Package"*.

O @baginskicosta/bunpack é um bundler simples, mas moderno, que permite o desnevolvimento de bibliotecas escritas em TypeScript e JavaScript com configurações mínimas, tão simples quanto o bunup. Plenejei para que ele gerasse exportações para o padrão ESM e CJS, permitindo até definir o runtime alvo. O que acabou facilitando e muito a minha vida.

A configuração é feita através do arquivo bunpack.json na raíz da pasta do projeto, seguindo as especificações do Bunpack Schema.

Parte 4 - Como Utilizar

A utilização da biblioteca é simples, basta adicionar ela como dependência em um novo projeto ou em um existente (este deve utilizar o BunJS como runtime):

bun add -D @baginskicosta/bunpack

Agora, com base no modelo do bunpack.json abaixo, basta alterar as configurações conforme a necessidade. Se estiver ou deseja desenvolver uma biblioteca que seja runtime agnostic, basta alterar apenas as enmtries conforme os pontos de entrada da sua biblioteca:

{
  "$schema": "https://raw.githubusercontent.com/baginskicosta/bunpack/main/schema.json",
  "outdir": "dist",
  "rootdir": "source",
  "target": "node",
  "minify": true,
  "sourcemap": "none",
  "splitting": false,
  "packages": "bundle",
  "clean": true,
  "formats": {
    "esm": {
      "enabled": true,
      "directory": "esm",
      "extension": ".js"
    },
    "cjs": {
      "enabled": true,
      "directory": "cjs",
      "extension": ".cjs"
    }
  },
  "entries": [
    {
      "name": "core",
      "entrypoint": "index.ts",
      "default": true
    }
  ],
  "declarations": {
    "enabled": true,
    "directory": "types",
    "tsconfig": "./tsconfig.build.json"
  }
}

O arquivo tsconfig.build.json é um simples arquivo de configuração do TypeScript que deve ser derivado do tsconfig.json original do seu projeto onde estão definidos os paths:

{
  "extends": "./tsconfig.json",
  "include": ["source/**/*.ts"],
  "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
}

Observação: esta configuração leva em conta que o código da biblioteca está localida dentro de source e, também, que a pasta de destino desejada para os arquivos gerados é dist.

Com tudo configurado, basta mandar o bundler ser excutado. É recomendado a definição do mesmo em um script de build no package.json:

bun bunpack

Para informações mais detalhadas, por favor, leia a documentação no repositório do GitHub ou na página do NPM. Não entrarei em detalhes muito aprofundados nesta publicação em função do limite de caracteres.

Parte 5 - Informações Adicionais

Esta biblioteca ainda está em desenvolvimento, atualmente em sua versão 0.2.1 até momento desta publicação, podendo apresentar bugs ou falhas, mas espero a sua compreensão. Ficarei muito feliz para as pessoas que desejarem contruibuir com o desenvolvimento do projeto. Todas as informações necessárias para contribuir, bem como as boas práticas, estão detalhadas no repositório.

Por estar começando, possui muitos planos para o futuro de recursos e funcionalidades, principalmente a implementação de um bundle para as declarações do TypeScript sem o uso de bibliotecas externas, mas isso vai se resolvendo com o tempo, ainda tendo chão para a release 1.0.0.

Agradecimentos

Obrigado por acompanhar essa publicação. Estou deprimido e desanimado mas programar é o que me faz senti vivo, meu propósito, mesmo que nem mesmo minha mãe apoie isso. Mas é legal poder compartilhar meus conhecimentos com outras pessoas, mesmo que através de publicações como esta ao invés de vídeos, mas é uma sensação legal.

Acredito que deixando meu conhecimento na web, através desses códigos, alguém em algum lugar do mundo possa fazer um bom proveito. Mesmo que isso não se concretize, prefiro acreditar nessa mentira que me permito em continuar viva.

Bem, como apoio não tenho, dedico este trabalho e mim mesmo e, no máximo, ao meu Pai, o úncio que mesmo relutante ainda acredita um pouco que seja em mim.

Apoie Meu Trabalho Se Puder

Tempo para mim é uma grande raridade, e creio que essas bibliotecas vão demorar um pouco a sair devido a minha vida e bem... problemas mencionados. Acredito que o que fasso é bom e o correto para a minha vida então, mesmo que pouco, esse tempo vale apena.

Por favor, me apoie no Patreon se puder, isso realmente me ajuda muito mesmo a tornar projetos em realidade, além de saber que meu trabalho e conhecimentos são valorizados.

Se não puder, por favor, me siga nas redes sociais, isso também me ajuda bastante. Quanto masi pessoas seguirem meu trabalho, talvez eu consiga fechar mais projetos ou quem sabe conseguir um emprego. Desde já, agradeço a todos:

Seja Um Apoiador no Patreon.

Um Extra Para Essa Comunidade

Obrigado por me receberem, vocês foram os únicos em toda a minha vida.
Estou um pouco relutante, mas estou juntando forças para trazer um vídeo legal a medida do possível para vocês apresentando essa biblioteca e, de quebra a como desenvolver uma biblioteca simples em TypeScript usando o BunJS.

Para acompanhar e saber quando ele vai sair, por favor siga meu canal no YouTube.

Carregando publicação patrocinada...