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

@connextjs/vite-plugin

v0.0.1

Published

> Plugin oficial de Vite para ConnextJS - Integración perfecta con el ecosistema Vite

Downloads

7

Readme

@connext/vite-plugin

Plugin oficial de Vite para ConnextJS - Integración perfecta con el ecosistema Vite

📦 Instalación

npm install --save-dev @connext/vite-plugin
# o
pnpm add -D @connext/vite-plugin
# o
yarn add --dev @connext/vite-plugin

🚀 Uso Básico

Configuración Mínima

// vite.config.js
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [connext()]
});

Configuración con TypeScript

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [
    connext({
      // Opciones del plugin
      sourcemap: true,
      minify: false
    })
  ]
});

⚙️ Opciones de Configuración

Opciones Básicas

interface ConnextPluginOptions {
  // Compilación
  sourcemap?: boolean;           // Generar sourcemaps (default: true en dev)
  minify?: boolean;              // Minificar código (default: false en dev)
  
  // Archivos
  include?: string | string[];   // Patrones de archivos a incluir
  exclude?: string | string[];   // Patrones de archivos a excluir
  
  // Desarrollo
  hmr?: boolean;                 // Hot Module Replacement (default: true)
  devtools?: boolean;            // Habilitar devtools (default: true en dev)
  
  // Compilador
  compiler?: CompilerOptions;    // Opciones del compilador ConnextJS
  
  // Transformaciones
  transforms?: Transform[];      // Transformaciones personalizadas
}

Configuración Completa

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [
    connext({
      // Configuración de archivos
      include: ['src/**/*.cnx'],
      exclude: ['src/**/*.test.cnx'],
      
      // Configuración de desarrollo
      hmr: true,
      devtools: true,
      sourcemap: true,
      
      // Configuración del compilador
      compiler: {
        target: 'es2018',
        format: 'esm',
        sourcemap: true,
        minify: false
      },
      
      // Transformaciones personalizadas
      transforms: [
        {
          test: /\.cnx$/,
          transform: (code, id) => {
            // Transformación personalizada
            return {
              code: transformedCode,
              map: sourceMap
            };
          }
        }
      ]
    })
  ],
  
  // Configuración adicional de Vite
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
  
  server: {
    port: 3000,
    open: true
  }
});

🔧 Características

🔥 Hot Module Replacement (HMR)

El plugin proporciona HMR completo para archivos .cnx:

// Automático - no requiere configuración
// Los cambios en .cnx se reflejan instantáneamente

// Para HMR personalizado:
if (import.meta.hot) {
  import.meta.hot.accept('./App.cnx', (newModule) => {
    // Lógica personalizada de HMR
  });
}

📍 Source Maps

Soporte completo para source maps:

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      sourcemap: true  // Habilita source maps
    })
  ],
  
  build: {
    sourcemap: true  // También para build de producción
  }
});

🎯 Resolución de Módulos

Resolución automática de archivos .cnx:

// Importaciones automáticas
import App from './App.cnx';           // ✅ Funciona
import Button from './Button';          // ✅ Resuelve a Button.cnx
import Card from '@/components/Card';   // ✅ Con alias configurado

🔄 Transformaciones

Sistema de transformaciones extensible:

// Transformación personalizada
const customTransform = {
  test: /\.cnx$/,
  transform(code: string, id: string) {
    // Procesar código antes de la compilación
    const processedCode = preprocessCode(code);
    
    return {
      code: processedCode,
      map: generateSourceMap(code, processedCode)
    };
  }
};

// Usar en configuración
connext({
  transforms: [customTransform]
});

🎨 Integración con CSS

CSS Modules

// vite.config.ts
export default defineConfig({
  plugins: [connext()],
  
  css: {
    modules: {
      localsConvention: 'camelCase'
    }
  }
});
<!-- App.cnx -->
<template>
  <div class="{styles.container}">
    <h1 class="{styles.title}">Hello World</h1>
  </div>
</template>

<script>
  import styles from './App.module.css';
</script>

<style module>
  .container {
    padding: 2rem;
  }
  
  .title {
    color: blue;
  }
</style>

PostCSS

// vite.config.ts
export default defineConfig({
  plugins: [connext()],
  
  css: {
    postcss: {
      plugins: [
        require('tailwindcss'),
        require('autoprefixer')
      ]
    }
  }
});

Sass/SCSS

// vite.config.ts
export default defineConfig({
  plugins: [connext()],
  
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/variables.scss";`
      }
    }
  }
});

🔌 Integración con Otros Plugins

Con Vue DevTools

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';
import { vueDevtools } from '@vue/devtools';

export default defineConfig({
  plugins: [
    connext({
      devtools: true
    }),
    vueDevtools()
  ]
});

Con ESLint

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';
import eslint from 'vite-plugin-eslint';

export default defineConfig({
  plugins: [
    connext(),
    eslint({
      include: ['src/**/*.cnx', 'src/**/*.ts']
    })
  ]
});

Con PWA

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';
import { VitePWA } from 'vite-plugin-pwa';

export default defineConfig({
  plugins: [
    connext(),
    VitePWA({
      registerType: 'autoUpdate',
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg,cnx}']
      }
    })
  ]
});

🧪 Testing

Con Vitest

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [connext()],
  
  test: {
    environment: 'jsdom',
    setupFiles: ['./tests/setup.ts']
  }
});
// tests/setup.ts
import { expect, afterEach } from 'vitest';
import { cleanup } from '@testing-library/dom';
import matchers from '@testing-library/jest-dom/matchers';

// Extender expect con matchers de testing-library
expect.extend(matchers);

// Limpiar después de cada test
afterEach(() => {
  cleanup();
});

Test de Componentes

// tests/App.test.ts
import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/dom';
import App from '../src/App.cnx';

describe('App Component', () => {
  it('should render correctly', () => {
    render(App);
    expect(screen.getByText('Hello World')).toBeInTheDocument();
  });
});

🚀 Optimización para Producción

Code Splitting

// vite.config.ts
export default defineConfig({
  plugins: [connext()],
  
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['@connext/runtime'],
          components: ['src/components/index.ts']
        }
      }
    }
  }
});

Tree Shaking

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      compiler: {
        treeShaking: true
      }
    })
  ],
  
  build: {
    rollupOptions: {
      treeshake: true
    }
  }
});

Minificación

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      minify: true  // En producción
    })
  ],
  
  build: {
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true
      }
    }
  }
});

🔍 Debugging

Debug Mode

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      debug: process.env.NODE_ENV === 'development'
    })
  ]
});

Logs Detallados

# Habilitar logs del plugin
DEBUG=vite:connext npm run dev

# Logs del compilador
DEBUG=connext:compiler npm run dev

# Todos los logs
DEBUG=* npm run dev

Source Maps en Producción

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      sourcemap: true
    })
  ],
  
  build: {
    sourcemap: 'hidden'  // Source maps sin exponer
  }
});

📊 Performance

Cache de Compilación

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      cache: {
        enabled: true,
        directory: 'node_modules/.cache/connext'
      }
    })
  ]
});

Compilación Paralela

// vite.config.ts
export default defineConfig({
  plugins: [
    connext({
      parallel: true,
      workers: 4  // Número de workers
    })
  ]
});

Lazy Loading

// Componentes lazy
const LazyComponent = () => import('./LazyComponent.cnx');

// Router con lazy loading
const routes = [
  {
    path: '/lazy',
    component: () => import('./pages/LazyPage.cnx')
  }
];

🔧 API Reference

Plugin Options

interface ConnextPluginOptions {
  // Archivos
  include?: string | string[];
  exclude?: string | string[];
  
  // Compilación
  sourcemap?: boolean;
  minify?: boolean;
  target?: string;
  format?: 'esm' | 'cjs' | 'iife';
  
  // Desarrollo
  hmr?: boolean;
  devtools?: boolean;
  debug?: boolean;
  
  // Performance
  cache?: CacheOptions;
  parallel?: boolean;
  workers?: number;
  
  // Transformaciones
  transforms?: Transform[];
  
  // Compilador
  compiler?: CompilerOptions;
}

interface CacheOptions {
  enabled?: boolean;
  directory?: string;
  maxAge?: number;
}

interface Transform {
  test: RegExp;
  transform: (code: string, id: string) => TransformResult;
}

interface TransformResult {
  code: string;
  map?: string | object;
}

Hooks del Plugin

// Plugin personalizado que extiende ConnextJS
function customConnextPlugin() {
  return {
    name: 'custom-connext',
    
    // Hook antes de la compilación
    'connext:before-compile'(code: string, id: string) {
      // Procesar código antes de compilar
      return processCode(code);
    },
    
    // Hook después de la compilación
    'connext:after-compile'(result: CompileResult, id: string) {
      // Procesar resultado de compilación
      return processResult(result);
    },
    
    // Hook de transformación
    'connext:transform'(code: string, id: string) {
      // Transformar código
      return transformCode(code);
    }
  };
}

📚 Ejemplos

Proyecto Básico

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [connext()],
  
  server: {
    port: 3000
  }
});

Proyecto con TypeScript

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [
    connext({
      compiler: {
        typescript: true
      }
    })
  ],
  
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
});

Proyecto con Tailwind

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [connext()],
  
  css: {
    postcss: {
      plugins: [
        require('tailwindcss'),
        require('autoprefixer')
      ]
    }
  }
});

Proyecto Empresarial

// vite.config.ts
import { defineConfig } from 'vite';
import connext from '@connext/vite-plugin';
import { VitePWA } from 'vite-plugin-pwa';
import eslint from 'vite-plugin-eslint';

export default defineConfig({
  plugins: [
    connext({
      sourcemap: true,
      devtools: true,
      cache: {
        enabled: true
      },
      parallel: true
    }),
    eslint(),
    VitePWA({
      registerType: 'autoUpdate'
    })
  ],
  
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['@connext/runtime'],
          ui: ['src/components/ui/index.ts']
        }
      }
    }
  },
  
  server: {
    port: 3000,
    open: true
  }
});

🔗 Integración con Frameworks

Con Nuxt.js

// nuxt.config.ts
export default defineNuxtConfig({
  vite: {
    plugins: [
      connext({
        ssr: true
      })
    ]
  }
});

Con SvelteKit

// vite.config.ts
import { sveltekit } from '@sveltejs/kit/vite';
import connext from '@connext/vite-plugin';

export default defineConfig({
  plugins: [
    sveltekit(),
    connext()
  ]
});

Con Astro

// astro.config.mjs
import { defineConfig } from 'astro/config';
import connext from '@connext/vite-plugin';

export default defineConfig({
  vite: {
    plugins: [connext()]
  }
});

🔗 Enlaces

📄 Licencia

MIT - ver LICENSE para más detalles.