Skip to content

Commit

Permalink
Suggested valid type names
Browse files Browse the repository at this point in the history
  • Loading branch information
yuzhi committed Apr 12, 2016
1 parent e25fe3e commit d460b74
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 11 deletions.
52 changes: 46 additions & 6 deletions src/validation/__tests__/KnownTypeNames-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import {
} from '../rules/KnownTypeNames';


function unknownType(typeName, line, column) {
function unknownType(typeName, suggestedTypes, line, column) {
return {
message: unknownTypeMessage(typeName),
message: unknownTypeMessage(typeName, suggestedTypes),
locations: [ { line, column } ],
};
}
Expand Down Expand Up @@ -49,9 +49,39 @@ describe('Validate: Known type names', () => {
name
}
`, [
unknownType('JumbledUpLetters', 2, 23),
unknownType('Badger', 5, 25),
unknownType('Peettt', 8, 29)
unknownType(
'JumbledUpLetters',
[ 'ComplexInput',
'ComplicatedArgs',
'QueryRoot',
'Intelligent',
'HumanOrAlien'
],
2,
23
),
unknownType(
'Badger',
[ 'Dog',
'Boolean',
'Pet',
'Alien',
'Being'
],
5,
25
),
unknownType(
'Peettt',
[ 'Pet',
'Float',
'Being',
'Cat',
'Int'
],
8,
29
)
]);
});

Expand All @@ -73,7 +103,17 @@ describe('Validate: Known type names', () => {
}
}
`, [
unknownType('NotInTheSchema', 12, 23),
unknownType(
'NotInTheSchema',
[ '__Schema',
'Intelligent',
'HumanOrAlien',
'Int',
'Canine'
],
12,
23
),
]);
});

Expand Down
29 changes: 24 additions & 5 deletions src/validation/rules/KnownTypeNames.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,22 @@
import type { ValidationContext } from '../index';
import { GraphQLError } from '../../error';
import type { GraphQLType } from '../../type/definition';
import { suggestionList } from '../../utilities/suggestionList';


export function unknownTypeMessage(type: GraphQLType): string {
return `Unknown type "${type}".`;
export function unknownTypeMessage(
type: GraphQLType,
suggestedTypes: Arrray<string>
): string {
let message = `Unknown type "${type}".`;
const MAX_LENGTH = 5;
if (suggestedTypes.length) {
const suggestions = suggestedTypes
.slice(0, MAX_LENGTH)
.map(t => `"${t}"`)
.join(', ');
message += ` Perhaps you meant one of the following: ${suggestions}.`;
}
return message;
}

/**
Expand All @@ -33,11 +45,18 @@ export function KnownTypeNames(context: ValidationContext): any {
UnionTypeDefinition: () => false,
InputObjectTypeDefinition: () => false,
NamedType(node) {
const schema = context.getSchema();
const typeName = node.name.value;
const type = context.getSchema().getType(typeName);
const type = schema.getType(typeName);
if (!type) {
context.reportError(
new GraphQLError(unknownTypeMessage(typeName), [ node ])
new GraphQLError(
unknownTypeMessage(
typeName,
suggestionList(typeName, Object.keys(schema.getTypeMap()))
),
[ node ]
)
);
}
}
Expand Down

0 comments on commit d460b74

Please sign in to comment.