0no-co / gql.tada

🪄 Magical GraphQL query engine for TypeScript
https://gql-tada.0no.co
MIT License
2.44k stars 34 forks source link

fix(gql.tada): Fix recursive optional fragment types causing exponential complexity #319

Closed kitten closed 3 weeks ago

kitten commented 3 weeks ago

Summary

Patterns that require a T | {} optionality being merged into selections are causing exponential complexity. This is because all fields in a selection are merged using the obj utility. However, T | {} causes 2^n complexity in evaluating and flattening types in TypeScript.

This is because for each A & (B | {}) merge two variants are created, (A & B) | (A & {}). For each subsequent addition (e.g. A & (B | {}) & (C | {})) the complexity doubles ((A & B) | (A & C) | (A & B & C) | A. This can quickly cause a recursion complexity error in TypeScript once we reach the limit of 16 variants.

This fix addresses this by limiting the flattening of fields to just the fields and not optional sub-selections.

This fix however does have a few problems:

As such, post-merge, we're not planning to release this fix as another stable release straightaway and are still looking for improvements.

Set of changes

changeset-bot[bot] commented 3 weeks ago

🦋 Changeset detected

Latest commit: c25848cea63f7729e9e37ae7c082c6dfe2bc30ea

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR