Saltar al contenido

Dependencias, packs y adopts ​

requires ​

json
{ "requires": { "otroPlugin": "1.0.0" } }

Versión mínima de cada plugin necesario.

  • Instalar exige que estén. El Marketplace instala antes lo que falte: descarga el cierre de dependencias del catálogo y las instala en orden.
  • Desinstalar un plugin que otro necesita se rechaza.
  • El cargador arranca cada plugin tras los suyos y omite (con aviso en el log) el que no tenga alguna.
  • Los ciclos entre plugins se rechazan (orderByRequires). Se rompen con eventos o ganchos del host, o fusionando los dos módulos en uno.
  • Si el manifiesto declara dependsOn: ["otro"] y otro es un plugin, otro también debe estar en requires; de lo contrario, sin otro instalado, la API no arranca (validateManifests).

@plugin/<clave> ​

Un plugin puede importar lo que otro plugin exporta con nombre desde su api/index.ts (además del export default), siempre que lo declare en requires.

ts
import { algo } from "@plugin/otro";

El compilador falla si el plugin no está en requires. El valor se lee de globalThis.__HURY_PLUGINS__["otro"], lo que importa el cargador al arrancar.

Packs ​

json
{
  "key": "packClub",
  "title": "Pack Club",
  "version": "1.0.0",
  "apiVersion": 2,
  "pack": true,
  "requires": { "lucky": "1.0.0", "vip": "1.0.0", "ambassadors": "1.0.0" },
  "description": "Ruleta y premios, niveles VIP y programa de embajadores en un solo paquete.",
  "category": "marketing",
  "icon": "star",
  "priceMonthly": 30
}

pack: true exige requires no vacío y prohíbe api/index.mjs. No necesita api/ ni admin/. Instalar el paquete instala antes lo que reúne; los plugins incluidos no se pueden desinstalar mientras el paquete siga instalado. Sale en el Marketplace con «Incluye: …» y su propio precio (se fija por debajo de la suma).

adopts ​

Un módulo que ya existía como integrado deja su historial de migraciones en el plugin. "adopts": "<tabla>": si esa tabla ya existe y el plugin aún no tiene migraciones anotadas, se anotan como aplicadas sin ejecutarlas (el esquema ya está en su estado final). Se usa cuando el historial borra columnas y no se puede repetir. Un módulo nuevo no lo necesita: sus migraciones idempotentes bastan.

Las librerías propias de un módulo que el host también usa se quedan en el host junto con los tipos de sus tablas, y el plugin las importa con @host/lib/….

Contrato con el host: apiVersion 2. Sitio estático: no recoge datos ni usa servicios de terceros.