Skip to content

Développement de Plugin ​

Les plugins mineproj étendent le pipeline de construction avec des hooks et des composants.

Contrat du Plugin ​

Un plugin est un objet avec :

PropriétéTypeRequisDescription
namestring✅Nom unique du plugin
hooksRecord<string, Function>OptionnelGestionnaires de hooks de cycle de vie
viteVitePlugin[]OptionnelPlugins Vite à injecter
componentsRecord<string, Component>OptionnelComposants à enregistrer
optionsSchemaZodSchemaOptionnelSchéma pour les options du plugin
setupFunctionOptionnelHook d'installation

Exemple ​

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

export default definePlugin({
  name: 'mineproj-plugin-hello',
  hooks: {
    'build:done': () => {
      console.log('Construction terminée !');
    },
  },
});

Hooks de Cycle de Vie ​

HookTypeSignatureAppelé Quand
config:resolvedwaterfall(config, ctx) => configAprès le chargement de la config
data:loadedseq(_, ctx) => voidAprès le chargement des données
data:validatedseq(_, ctx) => voidAprès la validation des données
routes:collectwaterfall(routes, ctx) => routesAprès la collecte des routes
api:endpointswaterfall(endpoints, ctx) => endpointsAvant l'émission de l'API
render:beforewaterfall(html, ctx) => htmlAvant le rendu de chaque page
emitseq(_, ctx) => voidAprès l'écriture de tous les fichiers
build:doneseq(_, ctx) => voidAprès la fin de la construction

Plugin avec Options ​

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) => {
      // Injecter un extrait analytique avant </head>
      return html.replace('</head>', `${extrait}\n</head>`);
    },
  },
});

Utiliser un Plugin ​

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

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

Test de Contrat ​

ts
import { runPluginContract } from '@mineproj/test-utils';
const result = runPluginContract(monPlugin);
console.log(result.errors); // [] si valide

Publication ​

  1. Nommez votre package mineproj-plugin-* ou @mineproj/plugin-*
  2. Ajoutez "keywords": ["mineproj-plugin"] dans package.json
  3. Exécutez runPluginContract pour valider
  4. Publiez sur npm

Released under the Apache-2.0 License.