La politique d'installation se met en règle, et neuf paquets montent - #33
Open
Shaenn wants to merge 14 commits into
Open
La politique d'installation se met en règle, et neuf paquets montent#33Shaenn wants to merge 14 commits into
Shaenn wants to merge 14 commits into
Conversation
Sans `packageManager`, rien ne garantissait la version de pnpm au moment de l'installation. Or la quarantaine du workspace en dépend : `strictDepBuilds` et le caractère strict de `minimumReleaseAge` ne valent que sous pnpm 11. Une installation sous une version plus ancienne les aurait ignorés sans un mot. Le champ est posé sans somme de contrôle : `corepack use` l'aurait inscrite, et elle immobilise le fichier à chaque correctif de pnpm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le commentaire disait déjà pourquoi il existe et pourquoi sa portée est restreinte. Il ne disait pas ce qui permettrait de le retirer — sans quoi il traverse les montées de version par inertie, faute de savoir quand le tester à la suppression. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`packageManager` posé, `pnpm/action-setup` voyait deux sources et refusait de démarrer — sans comparer les numéros, qui pourtant s'accordaient. Le workflow laisse `package.json` répondre. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`engines.pnpm` autorisait par écrit la 10, que `packageManager` interdit de fait ; six documents l'annonçaient encore comme prérequis. Les README disent au passage pourquoi c'est 11 : les gardes de `pnpm-workspace.yaml` en sont des fonctions, une majeure antérieure les ignore en silence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le manifeste ne déclarait que des plages : une montée pouvait arriver par un simple `pnpm install`, sans apparaître au diff. Les 38 dépendances sont épinglées à la version réellement installée — donc `@vue/eslint-config-typescript` à 14.9.0 et `vue-eslint-parser` à 10.4.1, et non à la base de leur plage, qui aurait été un retour en arrière. `savePrefix` vide empêche `pnpm add` de réintroduire un `^` un paquet à la fois. `engines` ne nomme plus npm ni yarn : le projet ne s'installe pas autrement. `engineStrict` donne enfin un effet à ce champ, qui restait un vœu. Les overrides tiennent ce que l'épingle ne tient pas — les transitives, et le premier `pnpm up --latest` : typescript sous 7 tant que vue-tsc n'y survit pas, `@types/node` sous 25 tant que `engines.node` reste sur la 24. Le hoisting global est remplacé par les deux motifs dont le build a réellement besoin. Vérifié par un build complet des deux chaînes, application et vitrine. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck, 518 tests et le build de la SPA passent ; aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck, 518 tests et le build de la SPA passent ; aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et 518 tests passent. Le BFF démarre et route : vérifié en le lançant sur un port libre, écoute confirmée sur 127.0.0.1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mineure. Lint, typecheck, 518 tests et le build de la SPA passent ; le seul avertissement au build est celui de taille de chunk, déjà présent avant. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mineure. Lint, typecheck, 518 tests et les deux builds — SPA et vitrine — passent ; aucun avertissement nouveau. La montée déplace un train de transitives que la chaîne d'outils tient en plages : sass et sass-embedded en 1.103.1, vite en 8.2.2, rolldown en 1.2.5, open en 11.0.1. Deux paquets entrent dans l'arbre par `open` — `powershell-utils` et `wsl-utils` —, aucun n'exécute de script d'installation. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et 518 tests passent ; l'outil lance bien deux commandes en parallèle, vérifié hors de `dev:all` pour ne pas emporter les ports d'une instance en cours. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et les 518 tests passent, exécutés par le nouveau binaire. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. C'est lui qui vérifie les types de `src/` pendant le build : le build complet de la SPA passe, sans avertissement nouveau. Lint, typecheck et 518 tests passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La montée casse le build : Quasar type ses packs de langue à deux endroits qui ont cessé de se rejoindre. `lang.d.ts` décrit un pack, `index.d.ts` décrit le paramètre de `Lang.set()`, et les libellés d'accessibilité ajoutés à `q-date` en 2.25 y arrivent dans deux formes incompatibles — `prevRangeYears?: (range: number)` d'un côté, `prevRangeYears: (range?: number)` de l'autre. Sous `exactOptionalPropertyTypes`, actif côté `src/`, l'un cesse d'être assignable à l'autre et `pnpm build` s'arrête sur `apply.ts`. Le défaut est amont : l'objet importé est exactement celui que `Lang.set` attend à l'exécution. Le type du paramètre est donc dérivé de la fonction elle-même plutôt que réécrit à la main — un vrai changement de forme resterait ainsi visible, là où un `as never` aurait tout tu. Vérifié à l'exécution, pas seulement à la compilation : la bascule de langue pose `lang="en-US"` puis `lang="fr"` sur le document, sans une erreur en console — donc le pack est bien chargé et appliqué. Lint, typecheck, 518 tests, build de la SPA et de la vitrine passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deux lots, dans cet ordre : la politique d'installation d'abord, les montées ensuite. L'ordre compte — les montées passent sous la politique que les premiers commits posent, et non l'inverse.
I. La politique d'installation
Épingler pnpm
Le projet ne déclarait pas de
packageManager. Rien ne garantissait donc sous quelle version de pnpm il s'installe — et la quarantaine du workspace en dépend :strictDepBuildset le caractère strict deminimumReleaseAgene valent que sous pnpm 11. Une installation sous pnpm 10 les aurait ignorés en silence.Le champ est posé sans somme de contrôle.
corepack usel'aurait inscrite, et elle immobilise le fichier à chaque correctif de pnpm.L'override de vite
Le relevé le donnait pour non documenté. Il l'était déjà, depuis 466df7c : l'avis de sécurité, la ligne 5 de Vite jamais corrigée, et pourquoi la portée est
vitepress>viteet nonvite. Manquait seulement ce qui permettrait de le retirer — sans quoi un override traverse les montées de version par inertie, faute de savoir quand le tester à la suppression. C'est ce qui est ajouté.Ce que l'épinglage a fait tomber
Poser
packageManagera cassé la CI, et l'a cassée à la première étape :pnpm/action-setupa trouvé deux sources pour la même version —version: 11dans le workflow,pnpm@11.18.0danspackage.json— et refuse de démarrer sur le doublon sans comparer les numéros, qui pourtant s'accordaient. Les deux workflows laissent désormaispackage.jsonrépondre seul.Le socle exigé, remis d'accord
engines.pnpmrestait à">= 10.0.0": la borne autorisait par écrit ce quepackageManagerinterdit de fait. Elle passe à">= 11.18.0 <12"— plancher accordé à la version épinglée, plafond excluant la 12, dont on ne connaît pas encore le sort réservé àminimumReleaseAgeStrict.La contradiction ne vivait pas que dans
package.json— six documents annonçaientpnpm ≥ 10comme prérequis : les deuxINSTALL, les deuxREADME, les deux pages d'accueil du site. Tous alignés.site/guide/n'est pas touché, il est généré.Ce que le manifeste refuse désormais
Les 38 dépendances étaient déclarées en plages : une montée pouvait arriver par un simple
pnpm install, sans jamais apparaître au diff. Elles sont épinglées à la version réellement installée — donc@vue/eslint-config-typescriptà 14.9.0 etvue-eslint-parserà 10.4.1, et non à la base de leur plage, qui aurait été un retour en arrière.savePrefix: ''empêchepnpm addde réintroduire un^un paquet à la fois.enginesne nomme plus npm ni yarn : le projet ne s'installe pas autrement, son lockfile est celui de pnpm.engineStrict: truedonne enfin un effet à ce champ, qui restait un vœu — pnpm avertissait et poursuivait.Deux overrides s'ajoutent, parce qu'une épingle ne tient pas ce qu'un override tient — ni les transitives, ni le premier
pnpm up --latest:typescript: '<7'— TypeScript 7 a retiré l'API programmatique du compilateur, sur laquelle repose vue-tsc. La montée ne casse pas un type ici ou là, elle cassepnpm typechecken entier.'@types/node': '<25'— au-delà de la 24, les types décrivent des API absentes du runtime qu'on exécute : le code compile et échoue à l'exécution.Chacun porte sa raison et sa condition de retrait, comme celui de vite.
Le hoisting
shamefullyHoist: trueéquivaut àpublicHoistPattern: '*': le projet accède à des paquets qu'il n'a jamais déclarés, et une dépendance retirée d'un manifeste continue de fonctionner jusqu'au jour où elle disparaît de l'arbre. Remplacé par les deux motifs dont le build a réellement besoin —@fontsource/*etvite—, puis vérifié par un build complet des deux chaînes, l'application et la vitrine.II. Les montées
Neuf paquets, un commit chacun, lint + typecheck + 518 tests après chacun, et le build là où il porte.
@quasar/extrasdompurifyfastifymermaidquasar@quasar/app-viteconcurrentlyvitestvue-tscAucun avertissement nouveau au build. Le seul qui apparaisse est celui de taille de chunk, déjà présent avant le lot.
Deux d'entre elles ne se sont pas laissé faire seules.
quasar 2.25.1 casse le build, et c'est un défaut amont
Quasar type ses packs de langue à deux endroits qui ont cessé de se rejoindre :
lang.d.tsimport('quasar/lang/fr')prevRangeYears?: (range: number) => stringindex.d.tsLang.set()prevRangeYears: (range?: number) => stringLes libellés d'accessibilité ajoutés à
q-dateen 2.25 y arrivent dans deux formes incompatibles : optionnelle d'un côté, requise de l'autre ; paramètre requis d'un côté, optionnel de l'autre. SousexactOptionalPropertyTypes— actif côtésrc/seulement, ce qui explique quepnpm typecheckn'en dise rien —, l'un cesse d'être assignable à l'autre, etpnpm builds'arrête sursrc/i18n/apply.ts.L'objet importé est pourtant exactement celui que
Lang.setattend à l'exécution. Le type du paramètre est donc dérivé de la fonction elle-même plutôt que réécrit à la main :Le choix compte : un
as neveraurait tout tu, y compris un vrai changement de forme. Ici, si Quasar modifie ce queLang.setaccepte, l'erreur revient.Vérifié à l'exécution, pas seulement à la compilation — un cast se juge sur le comportement. Les packs 2.25.1 portent bien les nouveaux libellés (
fr.date.prevRangeYears(20)rend « Précédent 20 années »), et dans le navigateur, sur la SPA bâtie, la bascule de langue poselang="fr"→lang="en-US"→lang="fr"sur le document, sans une erreur en console. L'attributen-USest la marque queLang.seta repris la main : le pack est chargé et appliqué.@quasar/app-vite 3.7.0 déplace un train de transitives
La chaîne d'outils les tient en plages, et la montée les emporte :
sassetsass-embeddeden 1.103.1,viteen 8.2.2,rolldownen 1.2.5,openen 11.0.1. Deux paquets entrent dans l'arbre paropen—powershell-utilsetwsl-utils. Aucun n'exécute de script d'installation ;strictDepBuildsl'aurait refusé. C'est le seul commit du lot dont le lockfile bouge largement.Ce qui n'est pas monté
@anthropic-ai/claude-agent-sdkreste en 0.3.233, écarté volontairement : sa version est verrouillée au CLI qu'elle embarque, et cela se juge en la faisant émettre, pas en la compilant. C'est le seul écart du relevé encore ouvert.Vérification
CI verte sur le lot complet :
pnpm install --frozen-lockfile, lint, typecheck, tests, build. Le lockfile figé passe donc aussi dans un environnement neuf, ce qui valideengineStrictet les nouveaux overrides ailleurs que sur la machine de développement.En local, s'ajoutent le build de la vitrine, le démarrage du BFF — écoute confirmée sur
127.0.0.1—, et la vérification navigateur ci-dessus.pnpm-workspace.yamln'a vu réapparaître aucune ligne : pas deminimumReleaseAgeExclude, pas deneverBuiltDependencies. La quarantaine tient, aucune dérogation n'a été nécessaire.À trancher
Le
CHANGELOGdéfinit le majeur comme « ce qui casse une installation qui marchait : socle exigé relevé ». Releverengines.pnpmde 10 à 11 entre dans cette définition à la lettre, etengineStricttransforme la borne en refus effectif — ce qui rend la question plus tranchante qu'au premier jet. L'argument contraire : le socle relevé est celui de l'outil qui construit AURA, pas celui qui la fait tourner.À fusionner par merge commit : les correctifs commités un par un doivent rester lisibles.
🤖 Generated with Claude Code