Skip to content

Commit 6b64f37

Browse files
authored
fix: validation for skip/include with default values (#193)
fix #190 Corresponding spec text: https://spec.graphql.org/June2018/#sec-All-Variable-Usages-are-Allowed When validation the variable definition for the argument `if` for the directives skip/include, the default values in the variable definition were not considered. This PR fixes the issue by correctly using the default values in the variable definition.
1 parent e3d43de commit 6b64f37

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

src/__tests__/directives.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,4 +1383,54 @@ describe("Execute: handles directives", () => {
13831383
expect(mockResolver).toHaveBeenCalled();
13841384
});
13851385
});
1386+
1387+
describe("default values in include / skip directive's if", () => {
1388+
test("default value true in include", () => {
1389+
const result = executeTestQuery(`
1390+
query myQuery($inc: Boolean = true) {
1391+
a @include(if: $inc)
1392+
}
1393+
`);
1394+
1395+
expect(result).toEqual({
1396+
data: { a: "a" }
1397+
});
1398+
});
1399+
1400+
test("default value false in include", () => {
1401+
const result = executeTestQuery(`
1402+
query myQuery($inc: Boolean = false) {
1403+
a @include(if: $inc)
1404+
}
1405+
`);
1406+
1407+
expect(result).toEqual({
1408+
data: {}
1409+
});
1410+
});
1411+
1412+
test("default value true in skip", () => {
1413+
const result = executeTestQuery(`
1414+
query myQuery($skip: Boolean = true) {
1415+
a @skip(if: $skip)
1416+
}
1417+
`);
1418+
1419+
expect(result).toEqual({
1420+
data: {}
1421+
});
1422+
});
1423+
1424+
test("default value false in skip", () => {
1425+
const result = executeTestQuery(`
1426+
query myQuery($skip: Boolean = false) {
1427+
a @skip(if: $skip)
1428+
}
1429+
`);
1430+
1431+
expect(result).toEqual({
1432+
data: { a: "a" }
1433+
});
1434+
});
1435+
});
13861436
});

src/ast.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -459,11 +459,19 @@ function validateSkipIncludeVariableType(
459459
]);
460460
}
461461

462+
// Part of Spec text: https://spec.graphql.org/June2018/#sec-All-Variable-Usages-are-Allowed
462463
if (
463464
!(
464-
variableDefinition.type.kind === Kind.NON_NULL_TYPE &&
465-
variableDefinition.type.type.kind === Kind.NAMED_TYPE &&
466-
variableDefinition.type.type.name.value === "Boolean"
465+
// The variable defintion is a Non-nullable Boolean type
466+
(
467+
(variableDefinition.type.kind === Kind.NON_NULL_TYPE &&
468+
variableDefinition.type.type.kind === Kind.NAMED_TYPE &&
469+
variableDefinition.type.type.name.value === "Boolean") ||
470+
// or the variable definition is a nullable Boolean type with a default value
471+
(variableDefinition.type.kind === Kind.NAMED_TYPE &&
472+
variableDefinition.type.name.value === "Boolean" &&
473+
variableDefinition.defaultValue != null)
474+
)
467475
)
468476
) {
469477
throw new GraphQLError(

0 commit comments

Comments
 (0)