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

@purecore/configify

v0.3.0

Published

> **Configify** - Uma biblioteca ultra-leve e independente para gerenciamento de configurações em Node.js/JavaScript

Downloads

209

Readme

Configify - Uma biblioteca ultra-leve e independente para gerenciamento de configurações em Node.js/JavaScript

npm version License: MIT Zero Dependencies

🎯 O Que É O Configify?

O Configify é uma biblioteca JavaScript/Node.js que resolve um problema crítico no ecossistema: gerenciar configurações de aplicações sem adicionar dependências externas pesadas.

Ele oferece uma solução completa para:

  • ✅ Carregar variáveis de ambiente (.env)
  • ✅ Parsear arquivos YAML
  • ✅ Estruturas de configuração aninhadas
  • ✅ Tipagem automática de valores
  • Tudo sem uma única dependência externa!

🚨 Problemas Que O Configify Resolve

1. O Pesadelo Das Dependências Externas

Situação Atual:

// ❌ Com dependências externas
const dotenv = require('dotenv');
const yaml = require('js-yaml');

dotenv.config(); // + ~200KB
const config = yaml.load(fs.readFileSync('config.yaml', 'utf8')); // + ~500KB

// Bundle final: +700KB só para configuração básica!

Com Configify:

// ✅ Zero dependências
const { loadEnv, loadYaml } = require('./Configify');

loadEnv(); // Carrega .env automaticamente
const config = loadYaml('config.yaml'); // Parseia YAML

// Bundle final: 0KB adicional!

2. Variáveis De Ambiente Sempre Como String

Problema Clássico:

// ❌ Sempre string, perde tipagem
require('dotenv').config();

console.log(process.env.PORT);        // "3000" (string)
console.log(process.env.DEBUG);       // "true" (string)
console.log(process.env.TIMEOUT);     // "5000" (string)

// Sempre preciso converter manualmente...
const port = parseInt(process.env.PORT);
const debug = process.env.DEBUG === 'true';

Solução Configify:

// ✅ Tipagem automática inteligente
const { loadEnv } = require('./Configify');
loadEnv('.env');

// Valores já vêm com tipos corretos!
// process.env.PORT já é number
// process.env.DEBUG já é boolean
// process.env.TIMEOUT já é number

3. YAML Parsing Pesado e Complexo

Situação Atual:

// ❌ Dependência pesada obrigatória
const yaml = require('js-yaml'); // ~500KB

const config = yaml.load(`
database:
  host: localhost
  port: 5432
  credentials:
    username: admin
    password: secret
`);

// Funciona, mas... vale a pena 500KB para isso?

Com Configify:

// ✅ Parser YAML nativo e leve
const { loadYaml } = require('./Configify');

const config = loadYaml('config.yaml');
// Mesmo resultado, sem dependências!

4. Configurações Aninhadas Difíceis de Gerenciar

Problema:

// ❌ Estruturas complexas ficam bagunçadas
const config = {
  database: {
    host: process.env.DB_HOST,
    port: parseInt(process.env.DB_PORT),
    credentials: {
      username: process.env.DB_USER,
      password: process.env.DB_PASS
    }
  },
  api: {
    timeout: parseInt(process.env.API_TIMEOUT),
    retries: parseInt(process.env.API_RETRIES)
  }
};

// Fácil perder alguma conversão de tipo!

Solução Configify:

# config.yaml
database:
  host: localhost
  port: 5432
  credentials:
    username: admin
    password: secret

api:
  timeout: 5000
  retries: 3
  features:
    - auth
    - cache
    - logging
// ✅ Estrutura limpa e tipada
const { loadYaml } = require('./Configify');
const config = loadYaml('config.yaml');

console.log(config.database.port);     // 5432 (number)
console.log(config.api.timeout);       // 5000 (number)
console.log(config.api.features);      // ['auth', 'cache', 'logging'] (array)

5. Bundle Size Explode Com Múltiplas Bibliotecas

Cenário Real:

// package.json típico
{
  "dependencies": {
    "dotenv": "^16.0.0",        // 200KB
    "js-yaml": "^4.1.0",        // 500KB
    "config": "^3.3.0",         // 150KB
    "convict": "^6.2.0",        // 300KB
    "nconf": "^0.12.0"          // 200KB
  }
}

Total: ~1.35MB só para configuração!

Com Configify:

// ✅ Zero dependências
{
  "dependencies": {}
}

Total: 0KB adicional!


🛠️ Como Funciona

O Configify é construído com três funções principais:

loadEnv(filePath?)

Carrega variáveis de ambiente de arquivo .env para process.env

parseYaml(yamlString)

Converte string YAML para objeto JavaScript (parser próprio, sem dependências)

loadYaml(filePath)

Lê arquivo YAML e retorna objeto JavaScript


📦 Instalação

Como é uma biblioteca independente, simplesmente copie o arquivo Configify.js para seu projeto:

# Copie o arquivo para seu projeto
cp Configify.js ./lib/Configify.js

Ou instale via npm (quando disponível):

npm install configify

🚀 Uso Básico

1. Carregamento de Variáveis de Ambiente

const { loadEnv } = require('./Configify');

// Carrega .env do diretório atual
loadEnv();

// Carrega .env de caminho específico
loadEnv('./config/.env.production');

Arquivo .env:

PORT=3000
DEBUG=true
TIMEOUT=5000
API_KEY="sk-123456789"
DATABASE_URL="postgresql://user:pass@localhost/db"

2. Parsing de YAML

const { loadYaml, parseYaml } = require('./Configify');

// De arquivo
const config = loadYaml('config.yaml');

// De string
const yamlString = `
app:
  name: MyApp
  version: 1.0.0
  features:
    - auth
    - api
    - dashboard
`;

const config = parseYaml(yamlString);

3. Exemplo Completo de Configuração

Estrutura de projeto:

my-app/
├── config/
│   ├── app.yaml
│   └── database.yaml
├── .env
└── index.js

config/app.yaml:

app:
  name: "My Awesome App"
  version: 1.0.0
  port: 3000
  debug: true

api:
  timeout: 5000
  retries: 3
  cors:
    enabled: true
    origins:
      - "http://localhost:3000"
      - "https://myapp.com"

features:
  - authentication
  - authorization
  - logging
  - caching

config/database.yaml:

database:
  host: "localhost"
  port: 5432
  name: "myapp_db"
  credentials:
    username: "admin"
    password: "secret123"
  pool:
    min: 2
    max: 10
    idle: 30000

index.js:

const { loadEnv, loadYaml } = require('./Configify');

// 1. Carrega variáveis de ambiente
loadEnv();

// 2. Carrega configurações YAML
const appConfig = loadYaml('./config/app.yaml');
const dbConfig = loadYaml('./config/database.yaml');

// 3. Merge das configurações (opcional)
const config = {
  ...appConfig,
  database: dbConfig.database
};

// 4. Usa as configurações
console.log(`Starting ${config.app.name} v${config.app.version}`);
console.log(`Port: ${config.app.port}`);
console.log(`Database: ${config.database.host}:${config.database.port}`);

// Tudo tipado corretamente!
console.log(typeof config.app.port);     // "number"
console.log(typeof config.app.debug);    // "boolean"
console.log(Array.isArray(config.features)); // true

🎨 Funcionalidades Avançadas

Tipagem Automática Inteligente

O Configify converte automaticamente valores para seus tipos corretos:

# config.yaml
settings:
  port: 3000          # → number
  debug: true         # → boolean
  timeout: 5000       # → number
  name: "MyApp"       # → string (aspas preservam)
  version: 1.0        # → number
  nullValue: null     # → null
  empty: ""           # → string vazia

Suporte a Estruturas Complexas

# Suporte completo a:
nested:
  objects:
    with:
      deep: nesting

lists:
  - item1
  - item2
  - item3

mixed:
  - string: value
  - number: 42
  - boolean: true

Variáveis de Ambiente com Fallback

// .env
PORT=3000
NODE_ENV=development

// Código
const { loadEnv } = require('./Configify');
loadEnv();

// process.env.PORT = 3000 (number)
// process.env.NODE_ENV = "development" (string)

// Valores do sistema sobrescrevem .env se já existirem
process.env.NODE_ENV = "production"; // Mantém "production"

🏗️ Arquitetura

Por Que Sem Dependências?

O Configify foi projetado com filosofia "batteries included":

  1. Parser YAML Próprio: Implementação customizada que cobre 95% dos casos de uso comuns
  2. Regex Simples: Processamento de .env com expressões regulares eficientes
  3. Tipagem Nativa: Conversão automática usando Number(), Boolean(), etc.
  4. File System Nativo: Usa apenas fs e path do Node.js

Limitações Conscientes

O parser YAML do Configify não suporta:

  • Tags customizadas (!!binary, !!timestamp)
  • Referências (&anchor, *alias)
  • Funções (!!js/function)
  • Documentos múltiplos (---)

Mas cobre 100% dos casos de configuração comuns!


📊 Comparação com Alternativas

| Funcionalidade | Configify | dotenv + js-yaml | config | convict | |----------------|-----------|------------------|--------|---------| | Dependências | 0 | 2 | 1 | 1 | | Bundle Size | ~3KB | ~700KB | ~150KB | ~300KB | | YAML Support | ✅ | ✅ | ❌ | ❌ | | Auto-typing | ✅ | ❌ | ✅ | ✅ | | Nested Configs | ✅ | ✅ | ✅ | ✅ | | Env Loading | ✅ | ✅ | ❌ | ❌ | | List Support | ✅ | ✅ | ✅ | ✅ | | Zero Config | ✅ | ❌ | ❌ | ❌ |


🔍 Casos de Uso

Microserviços

// Pequenos serviços onde bundle size importa
const { loadEnv, loadYaml } = require('./Configify');

loadEnv();
const config = loadYaml('./config/service.yaml');

// Configuração completa sem dependências!

Serverless Functions

// AWS Lambda, Vercel Functions, etc.
const { loadEnv } = require('./Configify');

loadEnv();
// Cold start mais rápido, menos dependências para resolver

CLI Tools

// Ferramentas de linha de comando
const { loadYaml } = require('./Configify');

const config = loadYaml('./.toolrc.yaml');
// Configuração declarativa sem bloat

Projetos Pequenos/Médios

// Quando não quer instalar 5 bibliotecas para configuração básica
const { loadEnv, loadYaml } = require('./Configify');

// Tudo que precisa em um arquivo leve

🧪 Testes e Qualidade

# Rodar testes
npm test

# Verificar cobertura
npm run coverage

# Lint
npm run lint

📝 API Completa

loadEnv(filePath?: string): void

Carrega variáveis de ambiente de arquivo .env.

Parâmetros:

  • filePath (opcional): Caminho do arquivo .env (padrão: '.env')

Comportamento:

  • Não sobrescreve variáveis já existentes em process.env
  • Suporta aspas simples e duplas
  • Ignora comentários (#) e linhas vazias

parseYaml(yamlString: string): object

Converte string YAML para objeto JavaScript.

Parâmetros:

  • yamlString: String contendo YAML válido

Retorno:

  • Objeto JavaScript com estrutura aninhada
  • Tipagem automática (boolean, number, string, null)

loadYaml(filePath: string): object | null

Lê arquivo YAML e retorna objeto JavaScript.

Parâmetros:

  • filePath: Caminho do arquivo YAML

Retorno:

  • Objeto JavaScript ou null se arquivo não existir

🤝 Contribuição

Contribuições são bem-vindas! Siga estes passos:

  1. Fork o projeto
  2. Crie uma branch (git checkout -b feature/AmazingFeature)
  3. Commit suas mudanças (git commit -m ':sparkles: Add some AmazingFeature')
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abra um Pull Request

📄 Licença

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


🙏 Agradecimentos

  • Inspirado pela simplicidade do UNIX philosophy
  • Construído para resolver problemas reais de desenvolvimento
  • Feito com ❤️ para a comunidade JavaScript

🔗 Links


📋 Changelog

Veja todas as mudanças e atualizações em: CHANGELOG.md


Configify - Porque configuração deveria ser simples, não complexa! 🚀