Skip to content

Commit 5caf176

Browse files
authored
Merge pull request #812 from APIs-guru/enumNames
Forbid 'true', 'false' and 'null' as names for Enum value
2 parents 4abde6e + 916c47e commit 5caf176

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

src/type/__tests__/validation-test.js

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,43 @@ describe('Type System: Enum types must be well defined', () => {
11881188
);
11891189
});
11901190

1191+
it('rejects an Enum type with incorrectly named values', () => {
1192+
function enumValue(name) {
1193+
return new GraphQLEnumType({
1194+
name: 'SomeEnum',
1195+
values: {
1196+
[name]: {}
1197+
}
1198+
});
1199+
}
1200+
1201+
expect(() => enumValue('#value')
1202+
).to.throw('Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "#value" does not.');
1203+
1204+
expect(() => enumValue('true')
1205+
).to.throw('Name "true" is can not be used for Enum value.');
1206+
1207+
expect(() => enumValue('false')
1208+
).to.throw('Name "false" is can not be used for Enum value.');
1209+
1210+
expect(() => enumValue('null')
1211+
).to.throw('Name "null" is can not be used for Enum value.');
1212+
});
1213+
1214+
it('does not allow isDeprecated without deprecationReason on enum', () => {
1215+
expect(() =>
1216+
new GraphQLEnumType({
1217+
name: 'SomeEnum',
1218+
values: {
1219+
value: { isDeprecated: true }
1220+
}
1221+
})
1222+
).to.throw(
1223+
'SomeEnum.value should provide "deprecationReason" instead ' +
1224+
'of "isDeprecated".'
1225+
);
1226+
});
1227+
11911228
});
11921229

11931230

@@ -2065,18 +2102,4 @@ describe('Objects must adhere to Interface they implement', () => {
20652102
);
20662103
});
20672104

2068-
it('does not allow isDeprecated without deprecationReason on enum', () => {
2069-
expect(() =>
2070-
new GraphQLEnumType({
2071-
name: 'SomeEnum',
2072-
values: {
2073-
value: { isDeprecated: true }
2074-
}
2075-
})
2076-
).to.throw(
2077-
'SomeEnum.value should provide "deprecationReason" instead ' +
2078-
'of "isDeprecated".'
2079-
);
2080-
});
2081-
20822105
});

src/type/definition.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,11 @@ function defineEnumValues(
942942
);
943943
return valueNames.map(valueName => {
944944
assertValidName(valueName);
945+
invariant(
946+
[ 'true', 'false', 'null' ].indexOf(valueName) === -1,
947+
`Name "${valueName}" is can not be used for Enum value.`
948+
);
949+
945950
const value = valueMap[valueName];
946951
invariant(
947952
isPlainObj(value),

0 commit comments

Comments
 (0)