Skip to content

Commit 5867f34

Browse files
committed
Cleanup and code coverage
1 parent 7121006 commit 5867f34

File tree

6 files changed

+33
-85
lines changed

6 files changed

+33
-85
lines changed

src/execution/__tests__/semantic-nullability-test.ts

-26
Original file line numberDiff line numberDiff line change
@@ -165,32 +165,6 @@ describe('Execute: Handles Semantic Nullability', () => {
165165
});
166166
});
167167

168-
it('SemanticNullable allows null values', async () => {
169-
const data = {
170-
a: () => null,
171-
b: () => null,
172-
c: () => 'Cookie',
173-
};
174-
175-
const document = parse(`
176-
query {
177-
a
178-
}
179-
`);
180-
181-
const result = await execute({
182-
schema: new GraphQLSchema({ query: DataType }),
183-
document,
184-
rootValue: data,
185-
});
186-
187-
expect(result).to.deep.equal({
188-
data: {
189-
a: null,
190-
},
191-
});
192-
});
193-
194168
it('SemanticNullable allows non-null values', async () => {
195169
const data = {
196170
a: () => 'Apple',

src/type/__tests__/introspection-test.ts

+1-11
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ describe('Introspection', () => {
523523
ofType: null,
524524
},
525525
},
526-
defaultValue: 'AUTO',
526+
defaultValue: 'TRADITIONAL',
527527
},
528528
],
529529
type: {
@@ -667,21 +667,11 @@ describe('Introspection', () => {
667667
inputFields: null,
668668
interfaces: null,
669669
enumValues: [
670-
{
671-
name: 'AUTO',
672-
isDeprecated: false,
673-
deprecationReason: null,
674-
},
675670
{
676671
name: 'TRADITIONAL',
677672
isDeprecated: false,
678673
deprecationReason: null,
679674
},
680-
{
681-
name: 'SEMANTIC',
682-
isDeprecated: false,
683-
deprecationReason: null,
684-
},
685675
{
686676
name: 'FULL',
687677
isDeprecated: false,

src/type/directives.ts

+11
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ export const GraphQLSkipDirective: GraphQLDirective = new GraphQLDirective({
165165
},
166166
});
167167

168+
/**
169+
* Used to indicate that the nullability of the document will be parsed as semantic-non-null types.
170+
*/
171+
export const GraphQLSemanticNullabilityDirective: GraphQLDirective =
172+
new GraphQLDirective({
173+
name: 'SemanticNullability',
174+
description:
175+
'Indicates that the nullability of the document will be parsed as semantic-non-null types.',
176+
locations: [DirectiveLocation.SCHEMA],
177+
});
178+
168179
/**
169180
* Constant string used for default reason for a deprecation.
170181
*/

src/type/introspection.ts

+14-33
Original file line numberDiff line numberDiff line change
@@ -206,36 +206,23 @@ export const __DirectiveLocation: GraphQLEnumType = new GraphQLEnumType({
206206
},
207207
});
208208

209-
// TODO: rename enum and options
210209
enum TypeNullability {
211-
AUTO = 'AUTO',
212210
TRADITIONAL = 'TRADITIONAL',
213-
SEMANTIC = 'SEMANTIC',
214211
FULL = 'FULL',
215212
}
216213

217-
// TODO: rename
218214
export const __TypeNullability: GraphQLEnumType = new GraphQLEnumType({
219215
name: '__TypeNullability',
220-
description: 'TODO',
216+
description:
217+
'This represents the type of nullability we want to return as part of the introspection.',
221218
values: {
222-
AUTO: {
223-
value: TypeNullability.AUTO,
224-
description:
225-
'Determines nullability mode based on errorPropagation mode.',
226-
},
227219
TRADITIONAL: {
228220
value: TypeNullability.TRADITIONAL,
229221
description: 'Turn semantic-non-null types into nullable types.',
230222
},
231-
SEMANTIC: {
232-
value: TypeNullability.SEMANTIC,
233-
description: 'Turn non-null types into semantic-non-null types.',
234-
},
235223
FULL: {
236224
value: TypeNullability.FULL,
237-
description:
238-
'Render the true nullability in the schema; be prepared for new types of nullability in future!',
225+
description: 'Allow for returning semantic-non-null types.',
239226
},
240227
},
241228
});
@@ -408,22 +395,11 @@ export const __Field: GraphQLObjectType = new GraphQLObjectType({
408395
args: {
409396
nullability: {
410397
type: new GraphQLNonNull(__TypeNullability),
411-
defaultValue: TypeNullability.AUTO,
398+
defaultValue: TypeNullability.TRADITIONAL,
412399
},
413400
},
414-
resolve: (field, { nullability }, _context, info) => {
415-
if (nullability === TypeNullability.FULL) {
416-
return field.type;
417-
}
418-
419-
const mode =
420-
nullability === TypeNullability.AUTO
421-
? info.errorPropagation
422-
? TypeNullability.TRADITIONAL
423-
: TypeNullability.SEMANTIC
424-
: nullability;
425-
return convertOutputTypeToNullabilityMode(field.type, mode);
426-
},
401+
resolve: (field, { nullability }, _context) =>
402+
convertOutputTypeToNullabilityMode(field.type, nullability),
427403
},
428404
isDeprecated: {
429405
type: new GraphQLNonNull(GraphQLBoolean),
@@ -436,10 +412,9 @@ export const __Field: GraphQLObjectType = new GraphQLObjectType({
436412
} as GraphQLFieldConfigMap<GraphQLField<unknown, unknown>, unknown>),
437413
});
438414

439-
// TODO: move this elsewhere, rename, memoize
440415
function convertOutputTypeToNullabilityMode(
441416
type: GraphQLType,
442-
mode: TypeNullability.TRADITIONAL | TypeNullability.SEMANTIC,
417+
mode: TypeNullability,
443418
): GraphQLType {
444419
if (mode === TypeNullability.TRADITIONAL) {
445420
if (isNonNullType(type)) {
@@ -455,7 +430,12 @@ function convertOutputTypeToNullabilityMode(
455430
}
456431
return type;
457432
}
458-
if (isNonNullType(type) || isSemanticNonNullType(type)) {
433+
434+
if (isNonNullType(type)) {
435+
return new GraphQLNonNull(
436+
convertOutputTypeToNullabilityMode(type.ofType, mode),
437+
);
438+
} else if (isSemanticNonNullType(type)) {
459439
return new GraphQLSemanticNonNull(
460440
convertOutputTypeToNullabilityMode(type.ofType, mode),
461441
);
@@ -464,6 +444,7 @@ function convertOutputTypeToNullabilityMode(
464444
convertOutputTypeToNullabilityMode(type.ofType, mode),
465445
);
466446
}
447+
467448
return type;
468449
}
469450

src/utilities/__tests__/printSchema-test.ts

+5-11
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ describe('Type System Printer', () => {
782782
name: String!
783783
description: String
784784
args(includeDeprecated: Boolean = false): [__InputValue!]!
785-
type(nullability: __TypeNullability! = AUTO): __Type!
785+
type(nullability: __TypeNullability! = TRADITIONAL): __Type!
786786
isDeprecated: Boolean!
787787
deprecationReason: String
788788
}
@@ -803,20 +803,14 @@ describe('Type System Printer', () => {
803803
deprecationReason: String
804804
}
805805
806-
"""TODO"""
806+
"""
807+
This represents the type of nullability we want to return as part of the introspection.
808+
"""
807809
enum __TypeNullability {
808-
"""Determines nullability mode based on errorPropagation mode."""
809-
AUTO
810-
811810
"""Turn semantic-non-null types into nullable types."""
812811
TRADITIONAL
813812
814-
"""Turn non-null types into semantic-non-null types."""
815-
SEMANTIC
816-
817-
"""
818-
Render the true nullability in the schema; be prepared for new types of nullability in future!
819-
"""
813+
"""Allow for returning semantic-non-null types."""
820814
FULL
821815
}
822816

src/utilities/getIntrospectionQuery.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,11 @@ export interface IntrospectionOptions {
4242
/**
4343
* Choose the type of nullability you would like to see.
4444
*
45-
* - AUTO: SEMANTIC if errorPropagation is set to false, otherwise TRADITIONAL
4645
* - TRADITIONAL: all GraphQLSemanticNonNull will be unwrapped
47-
* - SEMANTIC: all GraphQLNonNull will be converted to GraphQLSemanticNonNull
4846
* - FULL: the true nullability will be returned
4947
*
5048
*/
51-
nullability?: 'AUTO' | 'TRADITIONAL' | 'SEMANTIC' | 'FULL';
49+
nullability?: 'TRADITIONAL' | 'FULL';
5250
}
5351

5452
/**
@@ -63,7 +61,7 @@ export function getIntrospectionQuery(options?: IntrospectionOptions): string {
6361
schemaDescription: false,
6462
inputValueDeprecation: false,
6563
oneOf: false,
66-
nullability: null,
64+
nullability: 'TRADITIONAL',
6765
...options,
6866
};
6967

0 commit comments

Comments
 (0)