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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@flexitoggle/javascript-sdk

v1.0.0

Published

SDK oficial do FlexiToggle para JavaScript - Gerencie feature flags, A/B testing e configurações dinâmicas

Readme

🚀 FlexiToggle JavaScript SDK

Uma biblioteca JavaScript leve e poderosa para integração com FlexiToggle. Suporta feature flags, A/B testing e analytics em tempo real.

📦 Instalação

Via CDN

<script src="https://cdn.flexitoggle.com/sdk/flexitoggle-sdk.min.js"></script>

Via NPM (quando publicado)

npm install @flexitoggle/javascript-sdk

Download Direto

Baixe o arquivo flexitoggle-sdk.js e inclua em seu projeto.

🚀 Uso Básico

Inicialização

const featureHub = new FlexiToggleSDK({
  apiUrl: 'https://your-flexitoggle-instance.com',
  projectKey: 'your-project-key',
  environment: 'production', // ou 'development', 'staging'
  userId: 'user-123',
  userAttributes: {
    email: '[email protected]',
    plan: 'premium',
    region: 'US'
  }
});

// Aguardar inicialização
featureHub.on('ready', () => {
  console.log('FlexiToggle SDK pronto!');
});

Feature Flags Básicas

// Verificar se uma feature está ativa
if (featureHub.isEnabled('new-checkout')) {
  // Mostrar novo checkout
  showNewCheckout();
}

// Obter valor de uma flag
const buttonColor = featureHub.getString('button-color', 'blue');
const maxItems = featureHub.getNumber('max-items', 10);
const config = featureHub.getJSON('app-config', {});

A/B Testing

// Obter variante de um teste A/B
const variant = featureHub.getVariant('checkout-test', 'control');

switch (variant) {
  case 'control':
    showOriginalCheckout();
    break;
  case 'variant-a':
    showNewCheckout();
    break;
  case 'variant-b':
    showMinimalCheckout();
    break;
}

// Rastrear conversão
featureHub.trackConversion('checkout-test', 'purchase', 99.99);

Analytics

// Rastrear eventos customizados
featureHub.track('button-clicked', {
  buttonId: 'cta-main',
  page: 'homepage'
});

// Rastrear conversões
featureHub.trackConversion('signup-test', 'signup-completed');

⚛️ Integração com React

Provider Setup

import React from 'react';
import { FlexiToggleProvider } from '@flexitoggle/react-sdk';

function App() {
  const config = {
    apiUrl: 'https://your-flexitoggle-instance.com',
    projectKey: 'your-project-key',
    environment: 'production',
    userId: getCurrentUserId(),
    userAttributes: getUserAttributes()
  };

  return (
    <FlexiToggleProvider config={config}>
      <YourApp />
    </FlexiToggleProvider>
  );
}

Usando Hooks

import { useFeatureFlag, useFlexiToggle } from '@flexitoggle/react-sdk';

function MyComponent() {
  // Hook para flag individual
  const showNewFeature = useFeatureFlag('new-feature', false);
  
  // Hook para SDK completo
  const { sdk, isReady } = useFlexiToggle();
  
  // A/B Testing
  const variant = isReady ? sdk.getVariant('button-test') : 'control';

  const handleClick = () => {
    sdk.track('button-clicked', { variant });
  };

  if (!isReady) {
    return <div>Carregando...</div>;
  }

  return (
    <div>
      {showNewFeature && <NewFeatureComponent />}
      
      <button 
        className={variant === 'red' ? 'btn-red' : 'btn-blue'}
        onClick={handleClick}
      >
        {variant === 'large' ? 'COMPRAR AGORA!' : 'Comprar'}
      </button>
    </div>
  );
}

🎯 Targeting Avançado

O SDK automaticamente envia atributos do usuário para o servidor, que usa essas informações para targeting:

// Atualizar atributos do usuário
featureHub.updateUserAttributes({
  plan: 'enterprise',
  region: 'EU',
  betaUser: true
});

// Alterar usuário
featureHub.setUserId('new-user-456');

📊 Eventos e Listeners

Eventos do SDK

// SDK pronto
featureHub.on('ready', () => {
  console.log('SDK inicializado');
});

// Flags atualizadas
featureHub.on('flagsUpdated', (flags) => {
  console.log('Flags atualizadas:', flags);
});

// Erro
featureHub.on('error', (error) => {
  console.error('Erro no SDK:', error);
});

Listeners de Flags

// Escutar mudanças em uma flag específica
featureHub.onFlagChange('new-feature', (newValue, oldValue) => {
  console.log(`Flag changed: ${oldValue} -> ${newValue}`);
  
  if (newValue) {
    enableNewFeature();
  } else {
    disableNewFeature();
  }
});

⚙️ Configuração Avançada

const featureHub = new FlexiToggleSDK({
  // URL da API FlexiToggle
  apiUrl: 'https://your-flexitoggle-instance.com',
  
  // Chave do projeto
  projectKey: 'your-project-key',
  
  // Ambiente (development, staging, production)
  environment: 'production',
  
  // ID do usuário
  userId: 'user-123',
  
  // ID da sessão (gerado automaticamente se não fornecido)
  sessionId: 'session-456',
  
  // Atributos do usuário para targeting
  userAttributes: {
    email: '[email protected]',
    plan: 'premium',
    region: 'US',
    device: 'mobile'
  },
  
  // Habilitar analytics (padrão: true)
  enableAnalytics: true,
  
  // Intervalo de polling em ms (padrão: 30000 = 30s)
  // Use 0 para desabilitar polling
  pollingInterval: 30000
});

🔄 Atualização em Tempo Real

O SDK automaticamente busca atualizações de flags em intervalos regulares:

// Atualizar manualmente
await featureHub.refresh();

// Configurar intervalo personalizado (em milissegundos)
const featureHub = new FlexiToggleSDK({
  // ... outras configurações
  pollingInterval: 10000 // 10 segundos
});

// Desabilitar polling automático
const featureHub = new FlexiToggleSDK({
  // ... outras configurações
  pollingInterval: 0
});

🎮 Exemplos Práticos

E-commerce com A/B Testing

// Configurar SDK
const featureHub = new FlexiToggleSDK({
  apiUrl: 'https://api.mystore.com',
  projectKey: 'ecommerce-app',
  environment: 'production',
  userId: getCurrentUserId(),
  userAttributes: {
    plan: getUserPlan(),
    region: getUserRegion(),
    device: getDeviceType()
  }
});

// Aguardar inicialização
featureHub.on('ready', () => {
  // Teste do botão de checkout
  const checkoutVariant = featureHub.getVariant('checkout-button-test');
  
  switch (checkoutVariant) {
    case 'green':
      setCheckoutButtonColor('#28a745');
      break;
    case 'red':
      setCheckoutButtonColor('#dc3545');
      break;
    case 'orange':
      setCheckoutButtonColor('#fd7e14');
      break;
    default:
      setCheckoutButtonColor('#007bff');
  }
  
  // Feature flag para frete grátis
  if (featureHub.isEnabled('free-shipping-banner')) {
    showFreeShippingBanner();
  }
  
  // Configuração dinâmica
  const config = featureHub.getJSON('app-config', {});
  setMaxCartItems(config.maxCartItems || 10);
  setRecommendationsCount(config.recommendationsCount || 4);
});

// Rastrear eventos importantes
function onAddToCart(product) {
  featureHub.track('add-to-cart', {
    productId: product.id,
    price: product.price,
    category: product.category
  });
}

function onPurchase(order) {
  // Rastrear conversão para todos os testes ativos
  featureHub.trackConversion('checkout-button-test', 'purchase', order.total);
  featureHub.trackConversion('free-shipping-test', 'purchase', order.total);
  
  featureHub.track('purchase-completed', {
    orderId: order.id,
    total: order.total,
    items: order.items.length
  });
}

SaaS com Feature Flags por Plano

const featureHub = new FlexiToggleSDK({
  apiUrl: 'https://api.mysaas.com',
  projectKey: 'saas-platform',
  environment: 'production',
  userId: user.id,
  userAttributes: {
    plan: user.subscription.plan, // 'free', 'pro', 'enterprise'
    company: user.company.id,
    role: user.role,
    signupDate: user.createdAt
  }
});

featureHub.on('ready', () => {
  // Features por plano
  const advancedAnalytics = featureHub.isEnabled('advanced-analytics');
  const apiAccess = featureHub.isEnabled('api-access');
  const customBranding = featureHub.isEnabled('custom-branding');
  
  // Configurar UI baseado nas features
  if (advancedAnalytics) {
    showAdvancedAnalyticsTab();
  }
  
  if (apiAccess) {
    showAPIDocumentation();
  }
  
  if (customBranding) {
    enableCustomBrandingOptions();
  }
  
  // Limites dinâmicos
  const limits = featureHub.getJSON('user-limits', {});
  setProjectLimit(limits.maxProjects || 1);
  setStorageLimit(limits.maxStorage || '100MB');
});

// Atualizar quando o plano mudar
function onPlanUpgrade(newPlan) {
  featureHub.updateUserAttributes({ plan: newPlan });
  featureHub.track('plan-upgraded', { 
    fromPlan: user.subscription.plan,
    toPlan: newPlan 
  });
}

🛠️ Debugging

Logs Detalhados

// Habilitar logs detalhados no console
localStorage.setItem('flexitoggle-debug', 'true');

// Verificar estado atual
console.log('Flags atuais:', featureHub.flags);
console.log('SDK inicializado:', featureHub.isInitialized);

Inspeção de Flags

// Listar todas as flags
featureHub.on('ready', () => {
  console.table(Array.from(featureHub.flags.entries()));
});

// Verificar targeting
console.log('Atributos do usuário:', featureHub.userAttributes);
console.log('User ID:', featureHub.userId);

🔧 Troubleshooting

Problemas Comuns

  1. SDK não inicializa

    featureHub.on('error', (error) => {
      console.error('Erro de inicialização:', error);
      // Verificar URL da API, chave do projeto, conectividade
    });
  2. Flags não atualizando

    // Verificar se polling está ativo
    console.log('Polling interval:', featureHub.pollingInterval);
       
    // Forçar atualização
    featureHub.refresh();
  3. Analytics não funcionando

    // Verificar se analytics está habilitado
    console.log('Analytics habilitado:', featureHub.enableAnalytics);
       
    // Verificar se eventos estão sendo enviados
    featureHub.track('test-event', { debug: true });

📚 API Reference

Métodos Principais

| Método | Descrição | Parâmetros | Retorno | |--------|-----------|------------|---------| | getFlag(key, default) | Obter valor de flag | key: string, default: any | any | | isEnabled(key) | Verificar se flag está ativa | key: string | boolean | | getString(key, default) | Obter string | key: string, default: string | string | | getNumber(key, default) | Obter número | key: string, default: number | number | | getJSON(key, default) | Obter objeto JSON | key: string, default: object | object | | getVariant(key, default) | Obter variante A/B | key: string, default: string | string | | track(event, props) | Rastrear evento | event: string, props: object | void | | trackConversion(test, metric, value) | Rastrear conversão | test: string, metric: string, value: number | void | | updateUserAttributes(attrs) | Atualizar atributos | attrs: object | void | | setUserId(id) | Definir user ID | id: string | void | | refresh() | Atualizar flags | - | Promise | | close() | Fechar SDK | - | void |

Eventos

| Evento | Descrição | Dados | |--------|-----------|-------| | ready | SDK inicializado | - | | flagsUpdated | Flags atualizadas | Map<string, any> | | error | Erro ocorreu | Error | | closed | SDK fechado | - |

📄 Licença

MIT License - veja o arquivo LICENSE para detalhes.

🤝 Contribuindo

Contribuições são bem-vindas! Veja nosso guia de contribuição para mais detalhes.

📞 Suporte

  • 📧 Email: [email protected]
  • 💬 Discord: https://discord.gg/flexitoggle
  • 📚 Documentação: https://docs.flexitoggle.com
  • 🐛 Issues: https://github.com/flexitoggle/flexitoggle/issues