refactor: Improve type inference performance of hot-path that computes fragment spreads #159
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.
Summary
This aggressively optimises
getFragmentsOfDocuments
(previously namedgetFragmentsOfDocumentsRec
).In a typical codebase that uses fragment composition properly, there's only so many documents that are in any given hot-path of TypeScript's type checker on evaluation. While we're constrained by wanting to output the resulting
TadaDocumentNode
and its result shape — i.e. not wanting TypeScript to evaluate documents lazily on type hint output — thegetFragmentsOfDocumentsRec
was having a larger impact on performance than expected.When applied, this PR refactors how fragments are recognised and how we convert the array of fragments, passed to
graphql()
, to a dictionary object.Set of changes
FragmentShape
and renamemakeDefinitionDecoration
toDefinitionDecoration
DocumentDecoration
FragmentShape
to API functions to pre-constrain their typesgetFragmentsOfDocuments
to be a non-recursive type