Aller au contenu principal

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​

ChampTypeObligatoireRemarques
formatVersionintegerouiDoit 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.
kindstringouiCustomControl. 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.
logicalNamestringouiPré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.
displayNamestringouiNom lisible affiché dans la palette de champs du concepteur de formulaires.
descriptionstring | nullnonBrève description, 512 caractères au maximum.
versionstringouiVersion 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.
scopestringouiLe scope du conteneur Module Federation, lu dans la configuration de fédération du build.
modulestringouiLe chemin du module exposé (p. ex. ./Control), lu dans la table exposes de la configuration de fédération.
entrystringouiLe 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.
substitutesForstring[]oui pour CustomControlLes 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.
requestedScopesstring[]oui pour CustomAppLes 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, entry sont lus dans le propre mf-manifest.json du build, parce que c’est le bundler qui les décide. @module-federation/vite n’émet ce fichier que s’il est configuré avec manifest: 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, substitutesFor proviennent d’un bloc parsware du package.json du contrôle, parce que le bundler n’a jamais entendu parler d’aucun d’eux. version est la propre version de 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é :

  1. l’archive respecte la taille maximale compressée et est un zip lisible ;
  2. 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) ;
  3. 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 ;
  4. chaque fichier a une extension figurant dans la liste des types servis par la plateforme ;
  5. parsware.json est présent à la racine et est valide selon ce schéma ;
  6. le kind correspond au point de terminaison, et le fichier nommé par entry est bien présent.

Voir aussi​