Manifiesto del paquete de artefacto
Id del esquema: artifact-package@1
Esquema legible por máquina: artifact-package.schema.json
Nombre del archivo dentro del archivo comprimido: parsware.json, en su raíz
Es lo que convierte una carpeta de salida del empaquetador en algo que la plataforma puede
aceptar. Lo escribe npm run pack junto a la salida de la compilación y se comprime con ella;
la plataforma lo lee al cargarlo, y un archivo comprimido montado a mano se rechaza exactamente
con la misma regla que uno generado (el principio de una única vía de validación, sección 6.7).
Por qué existe
Antes, el registro pedía a un creador seis campos, dos de los cuales se copiaban de la configuración de un empaquetador: el ámbito de Module Federation y el módulo expuesto. Equivocarse en cualquiera de los dos producía un único síntoma —el control no se cargaba— sin nada que indicara cuál de los dos era incorrecto. La compilación ya conoce ambos, así que los deja por escrito.
Forma
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
formatVersion | integer | sí | Debe ser exactamente 1. Es un const y no un mínimo, de modo que un archivo comprimido de un formato futuro se rechaza con un mensaje claro en lugar de leerse con las reglas actuales y fallar en algún sitio menos evidente. |
kind | string | sí | CustomControl. Las aplicaciones personalizadas se incorporarán a esta enumeración cuando adopten el paquete: usarán el mismo almacén, la misma caché y el mismo endpoint de entrega, y solo se diferenciarán en los campos de este manifiesto propios de cada tipo. |
logicalName | string | sí | Con el prefijo del editor, en snake_case en minúsculas (p. ej., par_signature_pad). Se comprueba al cargarlo frente al prefijo del editor de la solución propietaria, para que un archivo comprimido de otra procedencia no pueda apropiarse de un prefijo. |
displayName | string | sí | Nombre legible que se muestra en la paleta de campos del diseñador de formularios. |
description | string | null | no | Descripción breve, 512 caracteres como máximo. |
version | string | sí | Versión de tres partes (1.2.3), la propia versión npm del control. Se registra con fines de diagnóstico y se muestra al creador que comprueba que lo instalado es lo que compiló; no condiciona nada. |
scope | string | sí | El ámbito del contenedor de Module Federation, leído de la configuración de federación de la compilación. |
module | string | sí | La ruta del módulo expuesto (p. ej., ./Control), leída del mapa exposes de la configuración de federación. |
entry | string | sí | El archivo de entrada del contenedor dentro del archivo comprimido (p. ej., remoteEntry.js). Un nombre de archivo sin más, no una ruta: nombra un archivo en la raíz del archivo comprimido, que también es la ruta base desde la que la plataforma sirve los fragmentos asíncronos del artefacto. |
substitutesFor | string[] | sí, para CustomControl | Las familias de tipos de datos de campo a las que se puede enlazar el control. Debe coincidir exactamente con la enumeración de custom-control-manifest@1. |
requestedScopes | string[] | sí, para CustomApp | Los ámbitos OAuth que una aplicación personalizada declara necesitar, solicitados al emitir su App Context Token (§6.3). Ausente en un control personalizado, que no declara ninguno: se ejecuta con los permisos de la persona que lo usa (§28). |
De dónde salen los valores
Dos fuentes, y ninguna adivina la mitad que corresponde a la otra:
scope,module,entryse leen del propiomf-manifest.jsonde la compilación, porque los decide el empaquetador.@module-federation/vitesolo emite ese archivo cuando se configura conmanifest: true, que está desactivado de forma predeterminada; por eso todos los controles de Parsware lo activan, y el empaquetador se niega a adivinar si falta.logicalName,displayName,description,substitutesForproceden de un bloqueparswaredelpackage.jsondel control, porque el empaquetador no ha oído hablar nunca de ninguno de ellos.versiones el propioversionde ese archivo.
Qué falta a propósito
No hay ámbitos declarados ni entidades declaradas. Un artefacto se ejecuta con los permisos de la persona que lo usa (§24), así que una lista de ámbitos en el artefacto solo podría restringir a su usuario, nunca ampliarlo.
No hay URL de entrada remota. El paquete se sirve desde el propio origen de la plataforma, en una ruta calculada a partir del entorno y del nombre lógico, y eso es lo que permite que un control viaje dentro de su solución en lugar de obtenerse de un host externo.
Qué comprueba la plataforma
Al cargarlo, antes de almacenar nada:
- el archivo comprimido no supera el límite de tamaño comprimido y es un zip legible;
- no contiene más archivos que el número configurado y no se expande por encima del total configurado (se comprueba al leer y de nuevo al extraer: la longitud declarada en la cabecera de un zip es algo que el archivo afirma de sí mismo);
- todas las rutas de entrada son relativas y seguras:
.., una ruta absoluta y un prefijo de unidad de Windows o UNC se rechazan en lugar de sanearse, porque un archivo comprimido que nombra una ruta fuera de su propia carpeta no es algo que deba repararse en silencio; - todos los archivos tienen una extensión de la lista de permitidos para servir de la plataforma;
parsware.jsonestá presente en la raíz y se valida con este esquema;- el
kindcoincide con el endpoint, y el archivo que nombraentryestá realmente presente.
Relacionado
- Crear un control personalizado: cómo escribir y empaquetar uno.
- Registrar un control personalizado: cómo cargar el paquete.
- Manifiesto de control personalizado: la forma almacenada en la que se integra este manifiesto.