Skip to content

Commit 64f8084

Browse files
authored
Disallow repeat of non repeatable directives (graph-gophers#525)
* Disallow repeat of non repeatable directives * Remove unnecessary scallar
1 parent 5a1c172 commit 64f8084

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

internal/schema/schema.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ func resolveField(s *types.Schema, f *types.FieldDefinition) error {
289289
}
290290

291291
func resolveDirectives(s *types.Schema, directives types.DirectiveList, loc string) error {
292+
alreadySeenNonRepeatable := make(map[string]struct{})
292293
for _, d := range directives {
293294
dirName := d.Name.Name
294295
dd, ok := s.Directives[dirName]
@@ -315,6 +316,14 @@ func resolveDirectives(s *types.Schema, directives types.DirectiveList, loc stri
315316
d.Arguments = append(d.Arguments, &types.Argument{Name: arg.Name, Value: arg.Default})
316317
}
317318
}
319+
320+
if dd.Repeatable {
321+
continue
322+
}
323+
if _, seen := alreadySeenNonRepeatable[dirName]; seen {
324+
return errors.Errorf(`non repeatable directive %q can not be repeated. Consider adding "repeatable".`, dirName)
325+
}
326+
alreadySeenNonRepeatable[dirName] = struct{}{}
318327
}
319328
return nil
320329
}

internal/schema/schema_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,22 @@ Second line of the description.
920920
return nil
921921
},
922922
},
923+
{
924+
name: "Disallow repeat of a directive if it is not `repeatable`",
925+
sdl: `
926+
directive @nonrepeatabledirective on FIELD_DEFINITION
927+
type Foo {
928+
bar: String @nonrepeatabledirective @nonrepeatabledirective
929+
}
930+
`,
931+
validateError: func(err error) error {
932+
prefix := `graphql: non repeatable directive "nonrepeatabledirective" can not be repeated. Consider adding "repeatable"`
933+
if err == nil || !strings.HasPrefix(err.Error(), prefix) {
934+
return fmt.Errorf("expected error starting with %q, but got %q", prefix, err)
935+
}
936+
return nil
937+
},
938+
},
923939
} {
924940
t.Run(test.name, func(t *testing.T) {
925941
s, err := schema.ParseSchema(test.sdl, test.useStringDescriptions)

0 commit comments

Comments
 (0)