Skip to content

Desarrollo de Plugins ​

Los plugins de mineproj extienden el pipeline de compilación con hooks y componentes.

Contrato del Plugin ​

Un plugin es un objeto con:

PropiedadTipoRequeridoDescripción
namestring✅Nombre único del plugin
hooksRecord<string, Function>OpcionalManejadores de hooks del ciclo de vida
viteVitePlugin[]OpcionalPlugins de Vite a inyectar
componentsRecord<string, Component>OpcionalComponentes a registrar
optionsSchemaZodSchemaOpcionalEsquema para opciones del plugin
setupFunctionOpcionalHook de instalación

Ejemplo ​

ts
import { definePlugin } from '@mineproj/core';

export default definePlugin({
  name: 'mineproj-plugin-hello',
  hooks: {
    'build:done': () => {
      console.log('¡Compilación completada!');
    },
  },
});

Hooks del Ciclo de Vida ​

HookTipoFirmaCuándo se Llama
config:resolvedwaterfall(config, ctx) => configDespués de cargar la configuración
data:loadedseq(_, ctx) => voidDespués de cargar el conjunto de datos
data:validatedseq(_, ctx) => voidDespués de la validación de datos
routes:collectwaterfall(routes, ctx) => routesDespués de recopilar las rutas
api:endpointswaterfall(endpoints, ctx) => endpointsAntes de la emisión de la API
render:beforewaterfall(html, ctx) => htmlAntes de renderizar cada página
emitseq(_, ctx) => voidDespués de escribir todos los archivos
build:doneseq(_, ctx) => voidDespués de completar la compilación

Plugin con Opciones ​

ts
import { z } from 'zod';
import { definePlugin } from '@mineproj/core';

export default definePlugin({
  name: '@mineproj/plugin-analytics',
  optionsSchema: z.object({
    provider: z.enum(['umami', 'plausible', 'ga']),
    id: z.string(),
  }),
  hooks: {
    'render:before': (html, ctx) => {
      // Inyectar fragmento de analytics antes de </head>
      return html.replace('</head>', `${snippet}\n</head>`);
    },
  },
});

Usar un Plugin ​

ts
// mineproj.config.ts
import { defineSeoPlugin } from '@mineproj/plugin-seo';

export default defineConfig({
  plugins: [
    defineSeoPlugin({ siteUrl: 'https://example.com', siteTitle: 'Mi Sitio' }),
  ],
});

Pruebas de Contrato ​

ts
import { runPluginContract } from '@mineproj/test-utils';
const result = runPluginContract(myPlugin);
console.log(result.errors); // [] si es válido

Publicación ​

  1. Nombra tu paquete mineproj-plugin-* o @mineproj/plugin-*
  2. Añade "keywords": ["mineproj-plugin"] a package.json
  3. Ejecuta runPluginContract para validar
  4. Publica en npm

Released under the Apache-2.0 License.