Repository navigation
feat(analyzer): infer nullable output schema for optional properties - #27
Merged
atinseau merged 1 commit intoMar 18, 2026
Merged
Conversation
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.
Changements apportés
processMustachedanssrc/analyzer.ts: les expressions pointant vers une propriété non présente dansrequiredvoient leur schéma de sortie enveloppé avecnull(e.g.{ type: "string" }→{ type: ["string", "null"] }).withNullType(schema): utilitaire interne qui ajoutenullau type d'un schéma JSON Schema 7 (gèrestring,string[], et les schémas complexes viaoneOf).isPathFullyRequired(schema, segments): vérifie que chaque segment d'un chemin de propriété est déclaré dansrequired.identifierSchemas) : l'optionnalité est évaluée dans le schémaitemsdu tableau, pas sur le tableau lui-même.index.ts: exemple de playground mis à jour pour illustrer le casdefault accountDepartmentId accountIdavec une propriété optionnelle.test-optional.tsettest-trace.ts: fichiers de débogage temporaires utilisés pour valider le comportement (non exportés).Tests
tests/analyzer.spec.ts: ~53 tests mis à jour pour refléter le nouveau comportement nullable des propriétés optionnelles (types de retour, dot-notation,#with,#if,$ref,.length,[0], etc.).tests/engine.spec.ts: mise à jour des assertions d'outputSchemapour les tableaux et objets contenant des propriétés optionnelles.tests/default-helpers.spec.ts: ajout d'un bloc de testsdefault helper — nullable output schema resolutionvérifiant qu'un{{ default optionalProp requiredProp }}produit un schéma non-nullable.tests/sub-expression.spec.ts: mise à jour de 2 tests ({{account}},{{tags}}dans des blocs#if) pour refléter le type nullable des propriétés optionnelles.tests/array-bounds.spec.ts: ajout du casoneOfpour les tableaux imbriqués dont les éléments ont des types distincts (requis vs optionnel).tests/aggregated-identifiers.spec.ts,tests/migration-interop.spec.ts,tests/template-identifiers.spec.ts,tests/schema-type-coercion.spec.ts: ajout de champsrequiredmanquants dans les schémas de test pour conserver le comportement attendu avec la nouvelle inférence.Remarques
$roottoken est explicitement exclu de la logique de nullabilité (il représente le contexte entier, jamais optionnel).PathExpression— les littéraux et sous-expressions ne sont pas affectés.defaultbénéficie directement de cette amélioration :{{ default optionalProp requiredFallback }}garantit un schéma de sortie non-nullable car le helper court-circuite la nullabilité.🚀