Manifeste de package d’artefact
Identifiant du schéma : artifact-package@1
Schéma lisible par machine : artifact-package.schema.json
Nom du fichier dans l’archive : parsware.json, à sa racine
Ce qui transforme un dossier de sortie du bundler en quelque chose que la plateforme peut
accepter. Il est écrit par npm run pack à côté de la sortie de build, puis compressé avec
elle ; la plateforme le lit au téléversement, et une archive assemblée à la main est refusée
selon exactement la même règle qu’une archive générée (le principe du chemin de validation
unique, section 6.7).
Pourquoi il existe
L’enregistrement demandait autrefois six champs à un créateur, dont deux étaient recopiés depuis une configuration de bundler : le scope Module Federation et le module exposé. Une erreur sur l’un ou l’autre produisait un seul symptôme — le contrôle ne se chargeait pas — sans rien pour dire lequel des deux était faux. Le build connaît déjà les deux : il les consigne donc lui-même.
Structure
| Champ | Type | Obligatoire | Remarques |
|---|---|---|---|
formatVersion | integer | oui | Doit valoir exactement 1. Un const plutôt qu’un minimum, afin qu’une archive d’un format futur soit refusée avec un message clair au lieu d’être lue selon les règles actuelles et d’échouer à un endroit moins évident. |
kind | string | oui | CustomControl. Les applications personnalisées rejoindront cette énumération lorsqu’elles adopteront le package — elles utiliseront le même stockage, le même cache et le même point de terminaison de service, et ne différeront que par les champs propres à chaque type de ce manifeste. |
logicalName | string | oui | Préfixé par l’éditeur, en snake-case minuscule (p. ex. par_signature_pad). Vérifié au téléversement par rapport au préfixe de l’éditeur de la solution propriétaire, afin qu’une archive venue d’ailleurs ne puisse pas s’approprier un préfixe. |
displayName | string | oui | Nom lisible affiché dans la palette de champs du concepteur de formulaires. |
description | string | null | non | Brève description, 512 caractères au maximum. |
version | string | oui | Version en trois parties (1.2.3), la version npm propre au contrôle. Enregistrée à des fins de diagnostic et affichée au créateur qui vérifie que ce qui est installé correspond à ce qu’il a construit ; elle ne conditionne rien. |
scope | string | oui | Le scope du conteneur Module Federation, lu dans la configuration de fédération du build. |
module | string | oui | Le chemin du module exposé (p. ex. ./Control), lu dans la table exposes de la configuration de fédération. |
entry | string | oui | Le fichier d’entrée du conteneur dans l’archive (p. ex. remoteEntry.js). Un simple nom de fichier, pas un chemin : il désigne un fichier à la racine de l’archive, qui est aussi le chemin de base depuis lequel la plateforme sert les chunks asynchrones de l’artefact. |
substitutesFor | string[] | oui pour CustomControl | Les familles de types de données de champ auxquelles le contrôle peut être lié. Doit correspondre exactement à l’énumération de custom-control-manifest@1. |
requestedScopes | string[] | oui pour CustomApp | Les portées OAuth dont une application personnalisée déclare avoir besoin, demandées lors de l’émission de son App Context Token (§6.3). Absent pour un contrôle personnalisé, qui n’en déclare aucune — il s’exécute avec les autorisations de la personne qui l’utilise (§28). |
D’où viennent les valeurs
Deux sources, et aucune ne devine la moitié de l’autre :
scope,module,entrysont lus dans le propremf-manifest.jsondu build, parce que c’est le bundler qui les décide.@module-federation/viten’émet ce fichier que s’il est configuré avecmanifest: true, désactivé par défaut — chaque contrôle Parsware l’active donc, et l’outil de packaging refuse de deviner s’il manque.logicalName,displayName,description,substitutesForproviennent d’un blocparswaredupackage.jsondu contrôle, parce que le bundler n’a jamais entendu parler d’aucun d’eux.versionest la propreversionde ce fichier.
Ce qui est volontairement absent
Il n’y a ni portées déclarées ni tables déclarées. Un artefact s’exécute avec les autorisations de la personne qui l’utilise (§24) : une liste de portées sur l’artefact ne pourrait donc que restreindre son utilisateur, jamais l’élargir.
Il n’y a pas d’URL de remote entry. Le package est servi depuis l’origine même de la plateforme, à un chemin calculé à partir de l’environnement et du nom logique — c’est ce qui permet à un contrôle de voyager dans sa solution au lieu d’être récupéré depuis un hôte externe.
Ce que vérifie la plateforme
Au téléversement, avant que quoi que ce soit ne soit stocké :
- l’archive respecte la taille maximale compressée et est un zip lisible ;
- elle ne contient pas plus que le nombre de fichiers configuré, et ne se décompresse pas au-delà du total configuré (vérifié pendant la lecture, puis de nouveau pendant l’extraction — la longueur déclarée dans un en-tête zip n’est qu’une affirmation de l’archive sur elle-même) ;
- chaque chemin d’entrée est relatif et sûr —
.., un chemin absolu et un préfixe de lecteur Windows ou UNC sont rejetés plutôt que nettoyés, car une archive qui nomme un chemin hors de son propre dossier n’est pas de celles qu’on répare en silence ; - chaque fichier a une extension figurant dans la liste des types servis par la plateforme ;
parsware.jsonest présent à la racine et est valide selon ce schéma ;- le
kindcorrespond au point de terminaison, et le fichier nommé parentryest bien présent.
Voir aussi
- Créer un contrôle personnalisé — en écrire un et le packager.
- Enregistrer un contrôle personnalisé — téléverser le package.
- Manifeste de contrôle personnalisé — la forme stockée dans laquelle ce manifeste est intégré.