Skip to content

Commit af878f3

Browse files
authored
Disallow "true", "false", and "null" as enum values (#3223)
1 parent 5f86d69 commit af878f3

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

src/language/__tests__/parser-test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,26 @@ describe('Parser', () => {
120120
});
121121
});
122122

123+
it('does not allow "true", "false", or "null" as enum value', () => {
124+
expectSyntaxError('enum Test { VALID, true }').to.deep.equal({
125+
message:
126+
'Syntax Error: Name "true" is reserved and cannot be used for an enum value.',
127+
locations: [{ line: 1, column: 20 }],
128+
});
129+
130+
expectSyntaxError('enum Test { VALID, false }').to.deep.equal({
131+
message:
132+
'Syntax Error: Name "false" is reserved and cannot be used for an enum value.',
133+
locations: [{ line: 1, column: 20 }],
134+
});
135+
136+
expectSyntaxError('enum Test { VALID, null }').to.deep.equal({
137+
message:
138+
'Syntax Error: Name "null" is reserved and cannot be used for an enum value.',
139+
locations: [{ line: 1, column: 20 }],
140+
});
141+
});
142+
123143
it('parses multi-byte characters', () => {
124144
// Note: \u0A0A could be naively interpreted as two line-feed chars.
125145
const ast = parse(`

src/language/parser.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,13 +1036,11 @@ export class Parser {
10361036

10371037
/**
10381038
* EnumValueDefinition : Description? EnumValue Directives[Const]?
1039-
*
1040-
* EnumValue : Name
10411039
*/
10421040
parseEnumValueDefinition(): EnumValueDefinitionNode {
10431041
const start = this._lexer.token;
10441042
const description = this.parseDescription();
1045-
const name = this.parseName();
1043+
const name = this.parseEnumValueName();
10461044
const directives = this.parseConstDirectives();
10471045
return this.node<EnumValueDefinitionNode>(start, {
10481046
kind: Kind.ENUM_VALUE_DEFINITION,
@@ -1052,6 +1050,26 @@ export class Parser {
10521050
});
10531051
}
10541052

1053+
/**
1054+
* EnumValue : Name but not `true`, `false` or `null`
1055+
*/
1056+
parseEnumValueName(): NameNode {
1057+
if (
1058+
this._lexer.token.value === 'true' ||
1059+
this._lexer.token.value === 'false' ||
1060+
this._lexer.token.value === 'null'
1061+
) {
1062+
throw syntaxError(
1063+
this._lexer.source,
1064+
this._lexer.token.start,
1065+
`${getTokenDesc(
1066+
this._lexer.token,
1067+
)} is reserved and cannot be used for an enum value.`,
1068+
);
1069+
}
1070+
return this.parseName();
1071+
}
1072+
10551073
/**
10561074
* InputObjectTypeDefinition :
10571075
* - Description? input Name Directives[Const]? InputFieldsDefinition?

0 commit comments

Comments
 (0)