Fix inline fragments without a space before "on"#84
Open
dpep wants to merge 1 commit into
Open
Conversation
`...on Type` (no space) is valid GraphQL for an inline fragment, but Client#parse's fragment-spread regex matched it as a spread referencing a Ruby constant named `On`, since it only excluded whitespace between the dots and the name, not the specific "on" keyword. Adds a negative lookahead: GraphQL forbids naming a fragment "on" (FragmentName : Name but not "on"), so "...on" followed by a word boundary is always an inline fragment, never ambiguous with a constant reference.
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.
What
Client#parse's fragment-spread regex (/\.\.\.([a-zA-Z0-9_]+(::[a-zA-Z0-9_]+)*)/) matches...on Type(no space) as a spread referencing a Ruby constant namedOn, since it only requires the identifier to immediately follow the three dots — it doesn't distinguish that from an inline fragment written without a space beforeon.Both
...on Type { ... }and... on Type { ... }are valid, equivalent GraphQL — whitespace between...andonis optional per the spec. But only the spaced form parses correctly today; the unspaced form raises:Why this is safe to fix with a lookahead
The GraphQL spec explicitly forbids naming a fragment
on:So
...onimmediately followed by a word boundary can never be a legitimate fragment-spread reference — it's unambiguously an inline fragment. This PR adds a negative lookahead ((?!on\b)) to the regex to skip exactly that case, leaving every other fragment name (including ones that start withon, likeonFragment, or literally namedOnwith a capital O) unaffected.Testing
Added
test_client_parse_inline_fragment_without_space_before_on, which fails againstmasterwith theValidationErrorabove and passes with this fix. Ran the fulltest/test_client.rbsuite locally — 17 runs, 0 failures, 0 errors (3 pre-existing skips, unrelated).