Aperçu du pipeline
pnpm codegen exécute codegen/src/index.ts ; le pipeline complet est le suivant :
Numéro de version du package.json │ ▼loadTokenFiles() Charge tokens/*.json, validation structurelle Ajv, aplatissement │ Retourne LoadedTokenFile[] (par fichier : namespace / isDark / flat) ▼resolveTokens() Résolution des refs (avec détection de cycles) + fusion du mode sombre │ Retourne { tokenSet, orphanDarkPaths, refMap } ▼loadSpecs() Charge specs/*.json (validation du schéma)loadCases() Charge cases/*.json (validation du schéma) │ ▼Assemble CodegenInput { tokens: tokenSet, specs, cases, version } │ ▼Supprime tout dist/ et le reconstruit │ ▼Exécute les 5 cibles ──► android → ios → harmony → c → docs │ Chaque target.generate(input) retourne GeneratedFile[] ▼Écrit chaque fichier dans dist/<outDir>/<relativePath>Le point d’entrée codegen/src/index.ts
Section intitulée « Le point d’entrée codegen/src/index.ts »Constantes
Section intitulée « Constantes »| Constante | Valeur |
|---|---|
ROOT |
La racine du dépôt (deux niveaux au-dessus d’import.meta.dirname) |
DIST |
<ROOT>/dist |
targets |
[androidTarget, iosTarget, harmonyTarget, cTarget, docsTarget], ordre fixe |
function main(): voidLe seul point d’entrée (index.ts n’exporte aucune entité ; main() est une fonction interne, appelée directement en bas du fichier). Les étapes :
readVersion()lit le numéro de version dupackage.jsonloadTokenFiles()charge les jetonsresolveTokens(files)les résout et l’on récupèretokenSetloadSpecs()/loadCases()chargent les contrats et les cas- Assemblage du
CodegenInput - Si
existsSync(DIST):rmSync(DIST, { recursive: true })— suppression avant reconstruction, pour garantir l’absence de résidu dans les artéfacts - Appel de
generate(input)sur chaque cible, écriture des fichiers selondist/<outDir>/<relativePath>, avec un journal[target] pathpour chaque artéfact - La dernière ligne récapitule le nombre de cibles, le nombre de fichiers et la version
Le commentaire d’en-tête du fichier explicite la ligne rouge 1 : ne générer que des squelettes de jetons, aucune implémentation d’UI.
Les interfaces clés (codegen/src/types.ts)
Section intitulée « Les interfaces clés (codegen/src/types.ts) »Voici les quatre interfaces les plus utilisées dans le pipeline ; la référence complète des 16 types exportés se trouve dans Définitions de types — types.ts.
CodegenTarget
Section intitulée « CodegenTarget »interface CodegenTarget { name: string // Préfixe de journal, par exemple 'android' outDir: string // Le nom du sous-répertoire de dist, par exemple 'android' generate(input: CodegenInput): GeneratedFile[]}Chaque cible de plateforme implémente cette interface. Ajouter une plateforme = ajouter une cible et l’insérer dans le tableau targets.
CodegenInput
Section intitulée « CodegenInput »interface CodegenInput { tokens: TokenSet // Le jeu de jetons clairs résolus + les surcharges sombres specs: ComponentSpec[] // Actuellement non consommé par aucune cible (réservé à la future génération de documentation / tests de composants) cases: ComponentCases[] // Idem version: string // Le numéro de version du package.json, écrit dans le commentaire d'en-tête de chaque artéfact}GeneratedFile
Section intitulée « GeneratedFile »interface GeneratedFile { relativePath: string // Le chemin de sortie relatif à dist/<outDir>/ content: string}TokenSet
Section intitulée « TokenSet »interface TokenSet { tokens: ResolvedToken[] // Les jetons clairs (triés par chemin, ordre lexicographique) byPath: Map<string, ResolvedToken> // Recherche rapide par chemin dark: DarkOverrides // path -> valeur de la surcharge sombre}Nombre d’artéfacts
Section intitulée « Nombre d’artéfacts »| Cible | Nombre de fichiers |
|---|---|
| android | 2 (LhTokens.kt + LhDarkTokens.kt) |
| ios | 2~3 (+ LhShadow.swift, lorsque des jetons d’ombre existent) |
| harmony | 2~3 (+ LhShadow.ets) |
| c | 2 |
| docs | 3 |
Les fichiers d’ombre d’ios / harmony ne sont générés que si des jetons shadow existent ; le nombre total de fichiers dépend donc du contenu des jetons — les artéfacts réels dans dist/ font foi.
Modules associés
Section intitulée « Modules associés »| Module | Responsabilité |
|---|---|
| load.ts | Chargement et validation de structure |
| resolve.ts | Résolution des références et fusion du mode sombre |
| format.ts | Analyse des valeurs neutres et mise en forme par cible |
| tree.ts | D’aplati vers arborescent |
| render.ts | Rendu des modèles |
| types.ts | L’ensemble des définitions de types |
| targets/ | Les cinq cibles de plateforme |
| templates/ | Les 7 modèles handlebars |
Copyright © 2024-2026 FengMo WenXue