Registre npm
Synchronisation du token du registre Fraza entre ~/.npmrc et le .npmrc du projet.
core/registry porte les outils du token du registre npm https://registry.fraza.ca/. Il alimente la commande fraza-key.
Le registre sert deux scopes. @fraza (core, @fraza/start, modules gratuits) se lit sans connexion. @fraza-pro (modules Pro) exige le token. Le token est lié à l'hôte, pas au scope : la même ligne sert aux deux.
Le module est exposé sous @fraza/core/registry, en serveur uniquement : il lit ~/.npmrc et écrit le .npmrc du projet, il ne doit jamais entrer dans un bundle client. Son consommateur principal reste le binaire fraza-key ; la tuile de mise à jour du tableau de bord s'en sert pour lire le token en lecture seule, quand il existe.
Le problème qu'il résout
npm login dépose un token dans ~/.npmrc. Le .npmrc du projet, lui, doit porter les deux scopes et le token directement :
@fraza:registry=https://registry.fraza.ca/
@fraza-pro:registry=https://registry.fraza.ca/
//registry.fraza.ca/:_authToken=<token>La ligne _authToken n'est nécessaire qu'à un projet qui installe des modules Pro.
Ce .npmrc est suivi par git par défaut, ce qui suppose un dépôt privé : voir Secrets et git. Il faut malgré tout un moyen de le reconstruire à partir du token global, après un renouvellement ou sur un serveur de build qui ne le reçoit pas avec le clone.
API
| Fonction | Rôle |
|---|---|
readNpmrcToken({ host? }) | Retourne le token trouvé dans ~/.npmrc, ou null. |
readProjectNpmrcToken({ cwd?, host? }) | Retourne le token trouvé dans le .npmrc du projet, ou null. |
resolveRegistryToken({ cwd?, host? }) | Le .npmrc du projet d'abord, celui de l'utilisateur ensuite. null si aucun. Ne lève jamais. |
writeNpmrcToken(token, { cwd?, host? }) | Écrit ou remplace la ligne _authToken dans le .npmrc du projet, et ajoute les lignes de scope manquantes. |
syncKey({ cwd?, host? }) | Enchaîne les deux. Lève si aucun token n'est trouvé. |
maskToken(token) | Version masquée, pour l'affichage. |
REGISTRY_HOST | Constante : hôte du registre. |
syncKey crée le .npmrc avec les scopes @fraza et @fraza-pro et le token s'il n'existe pas. Sinon il ajoute ou remplace la ligne _authToken, et ajoute celle des deux lignes de scope qui manquerait. Le reste du fichier est préservé.
L'ordre de recherche de resolveRegistryToken compte, et il est l'inverse de celui de syncKey. Sur une machine de développement les deux fichiers existent et portent la même valeur. Dans un conteneur de production ~/.npmrc est généralement absent et HOME peut ne pas être défini : seul le .npmrc du projet est fiable. C'est la fonction à utiliser depuis du code serveur, readNpmrcToken restant réservée à la CLI.
Notes
Le token n'expire pas dans le temps. C'est un token opaque Verdaccio, pas un JWT. Il cesse de fonctionner seulement si le secret du serveur change, si le mot de passe de l'utilisateur est modifié, ou si le compte est révoqué. Un nouveau npm login n'invalide pas l'ancien token.
Aucun code runtime n'a besoin de ce token. Il ne sert qu'à npm install, pour télécharger les @fraza-pro/module-*. @fraza/core et les @fraza/module-* s'installent sans lui. Dans un projet qui a des modules Pro, il doit donc être fourni au serveur avant le build, pas au démarrage de l'application. La tuile de mise à jour l'envoie quand elle le trouve, mais s'en passe.
npm login --registry=https://registry.fraza.ca/
npx fraza-key
npm ci
npm run build