Skip to content

feat(analyzer): infer nullable output schema for optional properties - #27

Merged
atinseau merged 1 commit into
masterfrom
feature/infer-nullable-output-for-optional-props
Mar 18, 2026
Merged

atinseau merged 1 commit into
masterfrom
feature/infer-nullable-output-for-optional-props

Conversation

@atinseau

Copy link
Copy Markdown
Owner

Changements apportés

  • Modification de processMustache dans src/analyzer.ts : les expressions pointant vers une propriété non présente dans required voient leur schéma de sortie enveloppé avec null (e.g. { type: "string" } → { type: ["string", "null"] }).
  • Ajout de withNullType(schema) : utilitaire interne qui ajoute null au type d'un schéma JSON Schema 7 (gère string, string[], et les schémas complexes via oneOf).
  • Ajout de isPathFullyRequired(schema, segments) : vérifie que chaque segment d'un chemin de propriété est déclaré dans required.
  • Modification de la logique pour les identifiants agrégés (identifierSchemas) : l'optionnalité est évaluée dans le schéma items du tableau, pas sur le tableau lui-même.
  • Mise à jour de index.ts : exemple de playground mis à jour pour illustrer le cas default accountDepartmentId accountId avec une propriété optionnelle.
  • Ajout de test-optional.ts et test-trace.ts : fichiers de débogage temporaires utilisés pour valider le comportement (non exportés).

Tests

  • Modification de 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.).
  • Modification de tests/engine.spec.ts : mise à jour des assertions d'outputSchema pour les tableaux et objets contenant des propriétés optionnelles.
  • Modification de tests/default-helpers.spec.ts : ajout d'un bloc de tests default helper — nullable output schema resolution vérifiant qu'un {{ default optionalProp requiredProp }} produit un schéma non-nullable.
  • Modification de 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.
  • Modification de tests/array-bounds.spec.ts : ajout du cas oneOf pour les tableaux imbriqués dont les éléments ont des types distincts (requis vs optionnel).
  • Modification de tests/aggregated-identifiers.spec.ts, tests/migration-interop.spec.ts, tests/template-identifiers.spec.ts, tests/schema-type-coercion.spec.ts : ajout de champs required manquants dans les schémas de test pour conserver le comportement attendu avec la nouvelle inférence.

Remarques

  • Le $root token est explicitement exclu de la logique de nullabilité (il représente le contexte entier, jamais optionnel).
  • L'heuristique s'applique uniquement aux PathExpression — les littéraux et sous-expressions ne sont pas affectés.
  • Le helper default bé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é.

🚀

@atinseau
atinseau merged commit 47f9745 into master Mar 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant