Apariencia
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"]yotroes un plugin,otrotambién debe estar enrequires; de lo contrario, sinotroinstalado, 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/….