Skip to content

Desenvolvimento de Plugins ​

Os plugins do mineproj estendem o pipeline de build com hooks e componentes.

Contrato do Plugin ​

Um plugin é um objeto com:

PropriedadeTipoObrigatórioDescrição
namestring✅Nome único do plugin
hooksRecord<string, Function>OpcionalManipuladores de hooks de ciclo de vida
viteVitePlugin[]OpcionalPlugins Vite para injetar
componentsRecord<string, Component>OpcionalComponentes para registrar
optionsSchemaZodSchemaOpcionalEsquema para opções do plugin
setupFunctionOpcionalHook de instalação

Exemplo ​

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

export default definePlugin({
  name: 'mineproj-plugin-hello',
  hooks: {
    'build:done': () => {
      console.log('Build concluída!');
    },
  },
});

Hooks de Ciclo de Vida ​

HookTipoAssinaturaChamado Quando
config:resolvedwaterfall(config, ctx) => configApós a configuração ser carregada
data:loadedseq(_, ctx) => voidApós o carregamento dos dados
data:validatedseq(_, ctx) => voidApós a validação dos dados
routes:collectwaterfall(routes, ctx) => routesApós a coleta de rotas
api:endpointswaterfall(endpoints, ctx) => endpointsAntes da emissão da API
render:beforewaterfall(html, ctx) => htmlAntes da renderização de cada página
emitseq(_, ctx) => voidApós todos os arquivos serem escritos
build:doneseq(_, ctx) => voidApós a conclusão da build

Plugin com Opções ​

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) => {
      // Injetar snippet de analytics antes de </head>
      return html.replace('</head>', `${snippet}\n</head>`);
    },
  },
});

Usando um Plugin ​

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

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

Teste de Contrato ​

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

Publicação ​

  1. Nomeie seu pacote mineproj-plugin-* ou @mineproj/plugin-*
  2. Adicione "keywords": ["mineproj-plugin"] ao package.json
  3. Execute runPluginContract para validar
  4. Publique no npm

Released under the Apache-2.0 License.