Skip to content

Commit

Permalink
feat(rules): Fix conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
ldebruijn committed Oct 14, 2024
2 parents 70bd43e + f0827b6 commit 2f8f28f
Show file tree
Hide file tree
Showing 37 changed files with 1,703 additions and 1,433 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
with:
go-version: ${{ matrix.go }}
- name: golangci-lint
uses: golangci/golangci-lint-action@v6.1.0
uses: golangci/golangci-lint-action@v6.1.1
with:
version: latest
args: '--timeout 5m'
Expand Down
7 changes: 4 additions & 3 deletions ast/document.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ func (d *SchemaDocument) Merge(other *SchemaDocument) {
}

type Schema struct {
Query *Definition
Mutation *Definition
Subscription *Definition
Query *Definition
Mutation *Definition
Subscription *Definition
SchemaDirectives DirectiveList

Types map[string]*Definition
Directives map[string]*DirectiveDefinition
Expand Down
2,321 changes: 1,153 additions & 1,168 deletions validator/imported/package-lock.json

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions validator/imported/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
"fmt": "prettier -w '*.js'"
},
"dependencies": {
"@babel/cli": "^7.24.8",
"@babel/core": "^7.25.2",
"@babel/node": "^7.25.0",
"@babel/plugin-transform-typescript": "^7.25.2",
"@babel/preset-env": "^7.25.4",
"@babel/preset-flow": "^7.24.7",
"@babel/cli": "^7.25.7",
"@babel/core": "^7.25.7",
"@babel/node": "^7.25.7",
"@babel/plugin-transform-typescript": "^7.25.7",
"@babel/preset-env": "^7.25.7",
"@babel/preset-flow": "^7.25.7",
"chai": "^5.1.1",
"iterall": "^1.3.0",
"js-yaml": "^4.0.0"
Expand Down
3 changes: 2 additions & 1 deletion validator/imported_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ import (
"testing"

"github.com/stretchr/testify/require"
"gopkg.in/yaml.v2"

"github.com/vektah/gqlparser/v2"
"github.com/vektah/gqlparser/v2/ast"
"github.com/vektah/gqlparser/v2/gqlerror"
"gopkg.in/yaml.v2"
)

type Spec struct {
Expand Down
46 changes: 32 additions & 14 deletions validator/rules/fields_on_correct_type.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"fmt"
Expand All @@ -11,30 +11,48 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("FieldsOnCorrectType", func(observers *Events, addError AddErrFunc) {
observers.OnField(func(walker *Walker, field *ast.Field) {
if field.ObjectDefinition == nil || field.Definition != nil {
return
}
func ruleFuncFieldsOnCorrectType(observers *Events, addError AddErrFunc, disableSuggestion bool) {
observers.OnField(func(walker *Walker, field *ast.Field) {
if field.ObjectDefinition == nil || field.Definition != nil {
return
}

message := fmt.Sprintf(`Cannot query field "%s" on type "%s".`, field.Name, field.ObjectDefinition.Name)
message := fmt.Sprintf(`Cannot query field "%s" on type "%s".`, field.Name, field.ObjectDefinition.Name)

if !disableSuggestion {
if suggestedTypeNames := getSuggestedTypeNames(walker, field.ObjectDefinition, field.Name); suggestedTypeNames != nil {
message += " Did you mean to use an inline fragment on " + QuotedOrList(suggestedTypeNames...) + "?"
} else if suggestedFieldNames := getSuggestedFieldNames(field.ObjectDefinition, field.Name); suggestedFieldNames != nil {
message += " Did you mean " + QuotedOrList(suggestedFieldNames...) + "?"
}
}

addError(
Message(message), // nolint:govet
At(field.Position),
)
})
addError(
Message("%s", message),
At(field.Position),
)
})
}

// Go through all of the implementations of type, as well as the interfaces
var FieldsOnCorrectTypeRule = Rule{
Name: "FieldsOnCorrectType",
RuleFunc: func(observers *Events, addError AddErrFunc) {
ruleFuncFieldsOnCorrectType(observers, addError, false)
},
}

var FieldsOnCorrectTypeRuleWithoutSuggestions = Rule{
Name: "FieldsOnCorrectTypeWithoutSuggestions",
RuleFunc: func(observers *Events, addError AddErrFunc) {
ruleFuncFieldsOnCorrectType(observers, addError, true)
},
}

func init() {
AddRule(FieldsOnCorrectTypeRule.Name, FieldsOnCorrectTypeRule.RuleFunc)
}

// Go through all the implementations of type, as well as the interfaces
// that they implement. If any of those types include the provided field,
// suggest them, sorted by how often the type is referenced, starting
// with Interfaces.
Expand Down
17 changes: 11 additions & 6 deletions validator/rules/fragments_on_composite_types.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"fmt"
Expand All @@ -9,8 +9,9 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("FragmentsOnCompositeTypes", func(observers *Events, addError AddErrFunc) {
var FragmentsOnCompositeTypesRule = Rule{
Name: "FragmentsOnCompositeTypes",
RuleFunc: func(observers *Events, addError AddErrFunc) {
observers.OnInlineFragment(func(walker *Walker, inlineFragment *ast.InlineFragment) {
fragmentType := walker.Schema.Types[inlineFragment.TypeCondition]
if fragmentType == nil || fragmentType.IsCompositeType() {
Expand All @@ -20,7 +21,7 @@ func init() {
message := fmt.Sprintf(`Fragment cannot condition on non composite type "%s".`, inlineFragment.TypeCondition)

addError(
Message(message), // nolint:govet
Message("%s", message),
At(inlineFragment.Position),
)
})
Expand All @@ -33,9 +34,13 @@ func init() {
message := fmt.Sprintf(`Fragment "%s" cannot condition on non composite type "%s".`, fragment.Name, fragment.TypeCondition)

addError(
Message(message), // nolint:govet
Message("%s", message),
At(fragment.Position),
)
})
})
},
}

func init() {
AddRule(FragmentsOnCompositeTypesRule.Name, FragmentsOnCompositeTypesRule.RuleFunc)
}
75 changes: 52 additions & 23 deletions validator/rules/known_argument_names.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"github.com/vektah/gqlparser/v2/ast"
Expand All @@ -7,42 +7,53 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("KnownArgumentNames", func(observers *Events, addError AddErrFunc) {
// A GraphQL field is only valid if all supplied arguments are defined by that field.
observers.OnField(func(walker *Walker, field *ast.Field) {
if field.Definition == nil || field.ObjectDefinition == nil {
return
func ruleFuncKnownArgumentNames(observers *Events, addError AddErrFunc, disableSuggestion bool) {
// A GraphQL field is only valid if all supplied arguments are defined by that field.
observers.OnField(func(walker *Walker, field *ast.Field) {
if field.Definition == nil || field.ObjectDefinition == nil {
return
}
for _, arg := range field.Arguments {
def := field.Definition.Arguments.ForName(arg.Name)
if def != nil {
continue
}
for _, arg := range field.Arguments {
def := field.Definition.Arguments.ForName(arg.Name)
if def != nil {
continue
}

if disableSuggestion {
addError(
Message(`Unknown argument "%s" on field "%s.%s".`, arg.Name, field.ObjectDefinition.Name, field.Name),
At(field.Position),
)
} else {
var suggestions []string
for _, argDef := range field.Definition.Arguments {
suggestions = append(suggestions, argDef.Name)
}

addError(
Message(`Unknown argument "%s" on field "%s.%s".`, arg.Name, field.ObjectDefinition.Name, field.Name),
SuggestListQuoted("Did you mean", arg.Name, suggestions),
At(field.Position),
)
}
})
}
})

observers.OnDirective(func(walker *Walker, directive *ast.Directive) {
if directive.Definition == nil {
return
observers.OnDirective(func(walker *Walker, directive *ast.Directive) {
if directive.Definition == nil {
return
}
for _, arg := range directive.Arguments {
def := directive.Definition.Arguments.ForName(arg.Name)
if def != nil {
continue
}
for _, arg := range directive.Arguments {
def := directive.Definition.Arguments.ForName(arg.Name)
if def != nil {
continue
}

if disableSuggestion {
addError(
Message(`Unknown argument "%s" on directive "@%s".`, arg.Name, directive.Name),
At(directive.Position),
)
} else {
var suggestions []string
for _, argDef := range directive.Definition.Arguments {
suggestions = append(suggestions, argDef.Name)
Expand All @@ -54,6 +65,24 @@ func init() {
At(directive.Position),
)
}
})
}
})
}

var KnownArgumentNamesRule = Rule{
Name: "KnownArgumentNames",
RuleFunc: func(observers *Events, addError AddErrFunc) {
ruleFuncKnownArgumentNames(observers, addError, false)
},
}

var KnownArgumentNamesRuleWithoutSuggestions = Rule{
Name: "KnownArgumentNamesWithoutSuggestions",
RuleFunc: func(observers *Events, addError AddErrFunc) {
ruleFuncKnownArgumentNames(observers, addError, true)
},
}

func init() {
AddRule(KnownArgumentNamesRule.Name, KnownArgumentNamesRule.RuleFunc)
}
13 changes: 9 additions & 4 deletions validator/rules/known_directives.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"github.com/vektah/gqlparser/v2/ast"
Expand All @@ -7,8 +7,9 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("KnownDirectives", func(observers *Events, addError AddErrFunc) {
var KnownDirectivesRule = Rule{
Name: "KnownDirectives",
RuleFunc: func(observers *Events, addError AddErrFunc) {
type mayNotBeUsedDirective struct {
Name string
Line int
Expand Down Expand Up @@ -45,5 +46,9 @@ func init() {
seen[tmp] = true
}
})
})
},
}

func init() {
AddRule(KnownDirectivesRule.Name, KnownDirectivesRule.RuleFunc)
}
13 changes: 9 additions & 4 deletions validator/rules/known_fragment_names.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"github.com/vektah/gqlparser/v2/ast"
Expand All @@ -7,8 +7,9 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("KnownFragmentNames", func(observers *Events, addError AddErrFunc) {
var KnownFragmentNamesRule = Rule{
Name: "KnownFragmentNames",
RuleFunc: func(observers *Events, addError AddErrFunc) {
observers.OnFragmentSpread(func(walker *Walker, fragmentSpread *ast.FragmentSpread) {
if fragmentSpread.Definition == nil {
addError(
Expand All @@ -17,5 +18,9 @@ func init() {
)
}
})
})
},
}

func init() {
AddRule(KnownFragmentNamesRule.Name, KnownFragmentNamesRule.RuleFunc)
}
13 changes: 9 additions & 4 deletions validator/rules/known_root_type.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package validator
package rules

import (
"fmt"
Expand All @@ -9,8 +9,9 @@ import (
. "github.com/vektah/gqlparser/v2/validator"
)

func init() {
AddRule("KnownRootType", func(observers *Events, addError AddErrFunc) {
var KnownRootTypeRule = Rule{
Name: "KnownRootType",
RuleFunc: func(observers *Events, addError AddErrFunc) {
// A query's root must be a valid type. Surprisingly, this isn't
// checked anywhere else!
observers.OnOperation(func(walker *Walker, operation *ast.OperationDefinition) {
Expand All @@ -33,5 +34,9 @@ func init() {
At(operation.Position))
}
})
})
},
}

func init() {
AddRule(KnownRootTypeRule.Name, KnownRootTypeRule.RuleFunc)
}
Loading

0 comments on commit 2f8f28f

Please sign in to comment.