Unterschiede zum ursprünglichen Projekt
Dieser Vergleich bezieht sich auf die veröffentlichten npm-Pakete @rdlabo/capacitor-docgen@0.4.1 und @capacitor/docgen@0.3.1. Der Fork basiert auf dem Ionic-Projekt, wird aber von rdlabo separat veröffentlicht und gepflegt.
Kompatibilitätsübersicht
| Bereich | Ursprüngliches Projekt 0.3.1 | rdlabo-Fork 0.4.1 |
|---|---|---|
| Paket | @capacitor/docgen |
@rdlabo/capacitor-docgen |
| Ausführbare Datei | docgen |
docgen |
| CLI-Optionen | --api (-a), --output-readme (-r), --output-json (-j), --project (-p), --silent (-s) |
Identisch |
| README-Platzhalter | <docgen-index>, <docgen-api> |
Identisch |
| Zentrale Exports | generate, parse, Ausgabehilfsfunktionen, run, öffentliche Typen |
Identisch |
| Metadaten zur Schnittstellenvererbung | Nicht bereitgestellt | DocsInterface.extends: string[] |
| Geerbte Methoden und Eigenschaften | Nicht aufgelöst | Aus den ermittelten Objekten der Basisschnittstellen angehängt |
| Vererbung der primären API | Nur direkt deklarierte API-Member | Die Member der ermittelten Basisobjekte werden an die API angehängt |
| Basisschnittstelle über einen Typalias | Für die Vererbung nicht aufgelöst | Die complexTypes des Alias werden zur Ermittlung der Basisschnittstellen verwendet |
Die veröffentlichten Tarballs enthalten byteidentische kompilierte Module für CLI-Parsing, Generierung, Markdown-Verarbeitung, Ausgabeformatierung und die Erstellung des TypeScript-Programms. Die verhaltensändernden Implementierungen beschränken sich auf dist/parse.js; die Änderung der öffentlichen Deklarationen befindet sich in dist/types.d.ts. Auch die Paketmetadaten und README-Inhalte unterscheiden sich.
Ergänzungen des Parsers
Für jede Schnittstelle auf oberster Ebene speichert der Fork den Text ihrer TypeScript-Vererbungsausdrücke in DocsInterface.extends. Wenn docgen diese Schnittstelle erfasst, führt es folgende Schritte aus:
- Es behält einen Basisnamen bei, der direkt mit einer eingelesenen Schnittstelle übereinstimmt;
- es löst einen passenden Typalias in die von ihm referenzierten
complexTypesauf; - es ermittelt die daraus resultierenden Basisschnittstellen; und
- es hängt die Methoden und Eigenschaften, die zu diesem Zeitpunkt in diesen Basisschnittstellenobjekten vorhanden sind, an die abgeleitete Schnittstelle an.
Seit v0.4.1 wird dieselbe Erfassung auch für die primäre API-Schnittstelle ausgeführt. Eine Plugin-API kann dadurch Methoden von einer Plugin-Basisschnittstelle erben. In v0.4.0 erfolgte diese Auflösung nur bei unterstützenden Schnittstellen.
Beobachtbare Ausgabe
Für eine abgeleitete Optionsschnittstelle gibt das ursprüngliche Projekt nur die Member aus, die direkt in dieser Schnittstelle deklariert sind. Der Fork gibt diese Member aus, gefolgt von den Membern, die sich zu diesem Zeitpunkt im ermittelten Basisschnittstellenobjekt befinden. Das unverarbeitete JSON und die generierte Markdown-Tabelle enthalten daher geerbte Member, und das programmatische Ergebnis enthält das Array extends.
Die Erfassung verändert die gemeinsamen eingelesenen Schnittstellenobjekte direkt. Veranlasst ein anderes API-Member zuerst die Erfassung und Erweiterung einer Basisschnittstelle, enthält dieses Basisobjekt bereits kopierte Member seiner Vorgänger, wenn eine später erfasste abgeleitete Schnittstelle es verwendet. Diese indirekten Member werden dann an die abgeleitete Schnittstelle weitergegeben. Die Ausgabe kann deshalb von der Reihenfolge der Member-Erfassung abhängen, obwohl der Code nicht in einer einzigen Operation rekursiv die gesamte Vererbungskette durchläuft.
Die bestehenden CLI-Optionen, die Platzhalterersetzung, die Überschriften-Generierung, die JSON-Ausgabe und die exportierten Funktionen behalten ansonsten das Verhalten des ursprünglichen Projekts bei.
Aktuelle Grenzen
Die Erweiterung ist bewusst eine kleine Ergänzung des Parsers und keine vollständige Auflösung aller TypeScript-Typen:
- Sie löst nicht in einer einzigen Erfassungsoperation rekursiv eine vollständige mehrstufige Vererbungskette auf. Da Objekte direkt verändert werden, kann eine zuvor erweiterte Basis jedoch ihre bereits kopierten Vorgänger-Member an eine später erfasste abgeleitete Schnittstelle weitergeben. Ohne diese vorherige Erfassung erhält dieselbe abgeleitete Schnittstelle nur die ursprünglichen direkten Member der Basis.
- Ein Member der abgeleiteten Schnittstelle, das ein Basis-Member überschreibt, wird nicht anhand seines Namens mit diesem abgeglichen. Beide Einträge können erscheinen, da die Deduplizierung die Objektidentität verwendet.
- Die Zuordnung bei der Vererbung erfolgt namensbasiert anhand der eingelesenen Schnittstellen auf oberster Ebene. Qualifizierte Ausdrücke und das Zusammenführen von Deklarationen werden durch die Erweiterung nicht normalisiert.
- Das Paket verwendet weiterhin dieselbe TypeScript-Parserabhängigkeit
~4.2.4und dieselbe Node.js-Engine-Deklaration>=18wie das ursprüngliche Projekt 0.3.1. - Beide Pakete stellen dieselbe ausführbare Datei
docgenbereit. Verwenden Sie daher eines der beiden, statt sie gleichzeitig als direkte Abhängigkeiten zu installieren.
Diese Grenzen, einschließlich beider Erfassungsreihenfolgen, werden in diesem Dokumentationsrepository durch Vertragstests geprüft. Der Vergleich wird sich daher ändern, wenn eine künftige Fork-Version das Verhalten ändert.
Versionshistorie
- Der Fork v0.3.x führte das separat veröffentlichte Paket
@rdlabo/capacitor-docgenund eine erste Unterstützung für Vererbung ein. - Der Fork v0.4.0 stellte die Ermittlung der Vererbung auf TypeScript-Vererbungsklauseln um, ergänzte
DocsInterface.extends, löste Schnittstellenaliase auf und erweiterte die Ausgabe um geerbte Methoden und Eigenschaften. - Der Fork v0.4.1 wandte die Erweiterung um geerbte Member auch auf die primäre API-Schnittstelle an.
Prüfen Sie bei der Bewertung späterer Versionen die festgelegten Quellen des Forks v0.4.1 und des ursprünglichen Projekts v0.3.1.