Différences avec le projet d’origine
Cette comparaison porte sur les packages npm publiés @rdlabo/capacitor-docgen@0.4.1 et @capacitor/docgen@0.3.1. Le fork est basé sur le projet Ionic, mais rdlabo le publie et le maintient séparément.
Résumé de compatibilité
| Élément | Projet d’origine 0.3.1 | Fork rdlabo 0.4.1 |
|---|---|---|
| Package | @capacitor/docgen |
@rdlabo/capacitor-docgen |
| Exécutable | docgen |
docgen |
| Options CLI | --api (-a), --output-readme (-r), --output-json (-j), --project (-p), --silent (-s) |
Identique |
| Espaces réservés README | <docgen-index>, <docgen-api> |
Identique |
| Exports principaux | generate, parse, utilitaires de sortie, run, types publics |
Identique |
| Métadonnées d’héritage des interfaces | Non exposées | DocsInterface.extends: string[] |
| Méthodes et propriétés héritées | Non développées | Ajoutées depuis les objets d’interfaces de base résolus |
| Héritage de l’API principale | Uniquement les membres d’API déclarés directement | Les membres des objets de base résolus sont ajoutés à l’API |
| Interface de base via un alias de type | Non résolue pour l’héritage | Les complexTypes de l’alias servent à trouver les interfaces de base |
Les archives tarball publiées contiennent des modules compilés identiques octet pour octet pour l’analyse de la CLI, la génération, le traitement du Markdown, le formatage des sorties et la création du programme TypeScript. Les changements d’implémentation qui affectent le comportement se limitent à dist/parse.js ; la modification des déclarations publiques se trouve dans dist/types.d.ts. Les métadonnées du package et le contenu du README diffèrent également.
Ajouts du parseur
Pour chaque interface de premier niveau, le fork stocke le texte de ses expressions d’héritage TypeScript dans DocsInterface.extends. Lorsque docgen collecte cette interface, il :
- conserve un nom de base qui correspond directement à une interface analysée ;
- résout un alias de type correspondant vers les
complexTypesqu’il référence ; - trouve les interfaces de base ainsi obtenues ; puis
- ajoute à l’interface dérivée les méthodes et propriétés présentes à cet instant dans les objets de ces interfaces de base.
Depuis la v0.4.1, cette même collecte s’applique à l’interface de l’API principale : une API de plugin peut donc hériter des méthodes d’une interface de plugin de base. Dans la v0.4.0, cet aplatissement ne concernait que les interfaces auxiliaires.
Résultat observable
Pour une interface d’options dérivée, le projet d’origine ne produit que les membres déclarés directement dans cette interface. Le fork produit ces membres, puis ceux présents à cet instant dans l’objet de son interface de base résolue. Le JSON brut et le tableau Markdown généré contiennent donc les membres hérités, et le résultat programmatique inclut le tableau extends.
La collecte modifie directement les objets d’interfaces analysées partagés. Si un autre membre d’API provoque d’abord la collecte et le développement d’une interface de base, cet objet de base contient déjà des membres copiés de ses ancêtres lorsqu’une interface dérivée l’utilise ultérieurement. Ces membres indirects sont alors transmis à l’interface dérivée. Le résultat peut donc dépendre de l’ordre de collecte des membres, même si le code ne parcourt pas récursivement toute la chaîne d’héritage en une seule opération.
Les options CLI existantes, le remplacement des espaces réservés, la génération des titres, l’écriture JSON et les fonctions exportées conservent par ailleurs le comportement du projet d’origine.
Limites actuelles
Cette amélioration est volontairement une petite extension du parseur, et non un aplatissement complet des types TypeScript :
- Elle n’aplatit pas récursivement toute une chaîne d’héritage à plusieurs niveaux en une seule opération de collecte. Toutefois, comme les objets sont modifiés directement, une base développée plus tôt peut transmettre les membres déjà copiés de ses ancêtres à une interface dérivée collectée plus tard ; sans cette collecte préalable, la même interface dérivée ne reçoit que les membres directs d’origine de la base.
- Un membre enfant qui redéfinit un membre de base n’est pas rapproché de celui-ci par son nom. Les deux entrées peuvent apparaître, car la déduplication utilise l’identité des objets.
- La correspondance d’héritage repose sur les noms des interfaces de premier niveau analysées. Cette amélioration ne normalise ni les expressions qualifiées ni la fusion de déclarations.
- Le package conserve la dépendance au parseur TypeScript
~4.2.4et la déclaration de moteur Node.js>=18du projet d’origine 0.3.1. - Les deux packages fournissent le même exécutable
docgen: utilisez l’un ou l’autre, sans les installer simultanément comme dépendances directes.
Ces limites, y compris les deux ordres de collecte, sont couvertes par des tests de contrat dans ce dépôt de documentation. La comparaison évoluera donc si une future version du fork modifie ce comportement.
Historique des versions
- Le fork v0.3.x a introduit le package publié séparément
@rdlabo/capacitor-docgenet une première prise en charge de l’héritage. - Le fork v0.4.0 a remplacé la détection de l’héritage par l’analyse des clauses d’héritage TypeScript, ajouté
DocsInterface.extends, résolu les alias d’interfaces et développé les méthodes et propriétés héritées. - Le fork v0.4.1 a également appliqué le développement des membres hérités à l’interface de l’API principale.
Consultez les sources épinglées du fork v0.4.1 et du projet d’origine v0.3.1 pour évaluer les versions ultérieures.