Skip to content

Commit ec57f06

Browse files
Make 'extensions' non-optional in schema types (#3279)
1 parent 564757f commit ec57f06

File tree

15 files changed

+110
-98
lines changed

15 files changed

+110
-98
lines changed

integrationTests/ts/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ const schema: GraphQLSchema = new GraphQLSchema({
6161

6262
function checkExtensionTypes(_test: SomeExtension | null | undefined) {}
6363

64-
checkExtensionTypes(queryType?.extensions?.someObjectExtension);
64+
checkExtensionTypes(queryType.extensions.someObjectExtension);
6565

66-
const sayHiField = queryType?.getFields()?.sayHi;
67-
checkExtensionTypes(sayHiField?.extensions?.someFieldExtension);
66+
const sayHiField = queryType.getFields().sayHi;
67+
checkExtensionTypes(sayHiField.extensions.someFieldExtension);
6868

69-
checkExtensionTypes(sayHiField?.args?.[0]?.extensions?.someArgumentExtension);
69+
checkExtensionTypes(sayHiField.args[0].extensions.someArgumentExtension);
7070

7171
const result: ExecutionResult = graphqlSync({
7272
schema,

src/jsutils/__tests__/toObjMap-test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ import { toObjMap } from '../toObjMap';
88
const __proto__ = '__proto__';
99

1010
describe('toObjMap', () => {
11+
it('convert undefined to ObjMap', () => {
12+
const result = toObjMap(undefined);
13+
expect(result).to.deep.equal({});
14+
expect(Object.getPrototypeOf(result)).to.equal(null);
15+
});
16+
17+
it('convert null to ObjMap', () => {
18+
const result = toObjMap(null);
19+
expect(result).to.deep.equal({});
20+
expect(Object.getPrototypeOf(result)).to.equal(null);
21+
});
22+
1123
it('convert empty object to ObjMap', () => {
1224
const result = toObjMap({});
1325
expect(result).to.deep.equal({});

src/jsutils/toObjMap.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import type {
2-
ObjMap,
3-
ObjMapLike,
4-
ReadOnlyObjMap,
5-
ReadOnlyObjMapLike,
6-
} from './ObjMap';
1+
import type { Maybe } from './Maybe';
2+
import type { ReadOnlyObjMap, ReadOnlyObjMapLike } from './ObjMap';
3+
4+
export function toObjMap<T>(
5+
obj: Maybe<ReadOnlyObjMapLike<T>>,
6+
): ReadOnlyObjMap<T> {
7+
if (obj == null) {
8+
return Object.create(null);
9+
}
710

8-
export function toObjMap<T>(obj: ObjMapLike<T>): ObjMap<T>;
9-
export function toObjMap<T>(obj: ReadOnlyObjMapLike<T>): ReadOnlyObjMap<T>;
10-
export function toObjMap<T>(obj: ObjMapLike<T> | ReadOnlyObjMapLike<T>) {
1111
if (Object.getPrototypeOf(obj) === null) {
1212
return obj;
1313
}

src/type/__tests__/definition-test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ describe('Type System: Objects', () => {
250250
resolve: undefined,
251251
subscribe: undefined,
252252
deprecationReason: undefined,
253-
extensions: undefined,
253+
extensions: {},
254254
astNode: undefined,
255255
},
256256
});
@@ -280,14 +280,14 @@ describe('Type System: Objects', () => {
280280
type: ScalarType,
281281
defaultValue: undefined,
282282
deprecationReason: undefined,
283-
extensions: undefined,
283+
extensions: {},
284284
astNode: undefined,
285285
},
286286
],
287287
resolve: undefined,
288288
subscribe: undefined,
289289
deprecationReason: undefined,
290-
extensions: undefined,
290+
extensions: {},
291291
astNode: undefined,
292292
},
293293
});
@@ -628,23 +628,23 @@ describe('Type System: Enums', () => {
628628
description: undefined,
629629
value: null,
630630
deprecationReason: undefined,
631-
extensions: undefined,
631+
extensions: {},
632632
astNode: undefined,
633633
},
634634
{
635635
name: 'NAN',
636636
description: undefined,
637637
value: NaN,
638638
deprecationReason: undefined,
639-
extensions: undefined,
639+
extensions: {},
640640
astNode: undefined,
641641
},
642642
{
643643
name: 'NO_CUSTOM_VALUE',
644644
description: undefined,
645645
value: 'NO_CUSTOM_VALUE',
646646
deprecationReason: undefined,
647-
extensions: undefined,
647+
extensions: {},
648648
astNode: undefined,
649649
},
650650
]);
@@ -735,7 +735,7 @@ describe('Type System: Input Objects', () => {
735735
type: ScalarType,
736736
defaultValue: undefined,
737737
deprecationReason: undefined,
738-
extensions: undefined,
738+
extensions: {},
739739
astNode: undefined,
740740
},
741741
});
@@ -754,7 +754,7 @@ describe('Type System: Input Objects', () => {
754754
description: undefined,
755755
type: ScalarType,
756756
defaultValue: undefined,
757-
extensions: undefined,
757+
extensions: {},
758758
deprecationReason: undefined,
759759
astNode: undefined,
760760
},

src/type/__tests__/directive-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ describe('Type System: Directive', () => {
3838
type: GraphQLString,
3939
defaultValue: undefined,
4040
deprecationReason: undefined,
41-
extensions: undefined,
41+
extensions: {},
4242
astNode: undefined,
4343
},
4444
{
@@ -47,7 +47,7 @@ describe('Type System: Directive', () => {
4747
type: GraphQLInt,
4848
defaultValue: undefined,
4949
deprecationReason: undefined,
50-
extensions: undefined,
50+
extensions: {},
5151
astNode: undefined,
5252
},
5353
],

src/type/__tests__/enumType-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,15 +348,15 @@ describe('Type System: Enum Values', () => {
348348
description: undefined,
349349
value: Complex1,
350350
deprecationReason: undefined,
351-
extensions: undefined,
351+
extensions: {},
352352
astNode: undefined,
353353
},
354354
{
355355
name: 'TWO',
356356
description: undefined,
357357
value: Complex2,
358358
deprecationReason: undefined,
359-
extensions: undefined,
359+
extensions: {},
360360
astNode: undefined,
361361
},
362362
]);

src/type/__tests__/extensions-test.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ describe('Type System: Extensions', () => {
2626
describe('GraphQLScalarType', () => {
2727
it('without extensions', () => {
2828
const someScalar = new GraphQLScalarType({ name: 'SomeScalar' });
29-
expect(someScalar.extensions).to.equal(undefined);
29+
expect(someScalar.extensions).to.deep.equal({});
3030

3131
const config = someScalar.toConfig();
32-
expect(config.extensions).to.equal(undefined);
32+
expect(config.extensions).to.deep.equal({});
3333
});
3434

3535
it('with extensions', () => {
@@ -62,19 +62,19 @@ describe('Type System: Extensions', () => {
6262
},
6363
});
6464

65-
expect(someObject.extensions).to.equal(undefined);
65+
expect(someObject.extensions).to.deep.equal({});
6666
const someField = someObject.getFields().someField;
67-
expect(someField.extensions).to.equal(undefined);
67+
expect(someField.extensions).to.deep.equal({});
6868
const someArg = someField.args[0];
69-
expect(someArg.extensions).to.equal(undefined);
69+
expect(someArg.extensions).to.deep.equal({});
7070

7171
const config = someObject.toConfig();
72-
expect(config.extensions).to.equal(undefined);
72+
expect(config.extensions).to.deep.equal({});
7373
const someFieldConfig = config.fields.someField;
74-
expect(someFieldConfig.extensions).to.equal(undefined);
74+
expect(someFieldConfig.extensions).to.deep.equal({});
7575
invariant(someFieldConfig.args);
7676
const someArgConfig = someFieldConfig.args.someArg;
77-
expect(someArgConfig.extensions).to.equal(undefined);
77+
expect(someArgConfig.extensions).to.deep.equal({});
7878
});
7979

8080
it('with extensions', () => {
@@ -131,19 +131,19 @@ describe('Type System: Extensions', () => {
131131
},
132132
});
133133

134-
expect(someInterface.extensions).to.equal(undefined);
134+
expect(someInterface.extensions).to.deep.equal({});
135135
const someField = someInterface.getFields().someField;
136-
expect(someField.extensions).to.equal(undefined);
136+
expect(someField.extensions).to.deep.equal({});
137137
const someArg = someField.args[0];
138-
expect(someArg.extensions).to.equal(undefined);
138+
expect(someArg.extensions).to.deep.equal({});
139139

140140
const config = someInterface.toConfig();
141-
expect(config.extensions).to.equal(undefined);
141+
expect(config.extensions).to.deep.equal({});
142142
const someFieldConfig = config.fields.someField;
143-
expect(someFieldConfig.extensions).to.equal(undefined);
143+
expect(someFieldConfig.extensions).to.deep.equal({});
144144
invariant(someFieldConfig.args);
145145
const someArgConfig = someFieldConfig.args.someArg;
146-
expect(someArgConfig.extensions).to.equal(undefined);
146+
expect(someArgConfig.extensions).to.deep.equal({});
147147
});
148148

149149
it('with extensions', () => {
@@ -193,10 +193,10 @@ describe('Type System: Extensions', () => {
193193
types: [],
194194
});
195195

196-
expect(someUnion.extensions).to.equal(undefined);
196+
expect(someUnion.extensions).to.deep.equal({});
197197

198198
const config = someUnion.toConfig();
199-
expect(config.extensions).to.equal(undefined);
199+
expect(config.extensions).to.deep.equal({});
200200
});
201201

202202
it('with extensions', () => {
@@ -224,14 +224,14 @@ describe('Type System: Extensions', () => {
224224
},
225225
});
226226

227-
expect(someEnum.extensions).to.equal(undefined);
227+
expect(someEnum.extensions).to.deep.equal({});
228228
const someValue = someEnum.getValues()[0];
229-
expect(someValue.extensions).to.equal(undefined);
229+
expect(someValue.extensions).to.deep.equal({});
230230

231231
const config = someEnum.toConfig();
232-
expect(config.extensions).to.equal(undefined);
232+
expect(config.extensions).to.deep.equal({});
233233
const someValueConfig = config.values.SOME_VALUE;
234-
expect(someValueConfig.extensions).to.equal(undefined);
234+
expect(someValueConfig.extensions).to.deep.equal({});
235235
});
236236

237237
it('with extensions', () => {
@@ -270,14 +270,14 @@ describe('Type System: Extensions', () => {
270270
},
271271
});
272272

273-
expect(someInputObject.extensions).to.equal(undefined);
273+
expect(someInputObject.extensions).to.deep.equal({});
274274
const someInputField = someInputObject.getFields().someInputField;
275-
expect(someInputField.extensions).to.equal(undefined);
275+
expect(someInputField.extensions).to.deep.equal({});
276276

277277
const config = someInputObject.toConfig();
278-
expect(config.extensions).to.equal(undefined);
278+
expect(config.extensions).to.deep.equal({});
279279
const someInputFieldConfig = config.fields.someInputField;
280-
expect(someInputFieldConfig.extensions).to.equal(undefined);
280+
expect(someInputFieldConfig.extensions).to.deep.equal({});
281281
});
282282

283283
it('with extensions', () => {
@@ -328,14 +328,14 @@ describe('Type System: Extensions', () => {
328328
locations: [],
329329
});
330330

331-
expect(someDirective.extensions).to.equal(undefined);
331+
expect(someDirective.extensions).to.deep.equal({});
332332
const someArg = someDirective.args[0];
333-
expect(someArg.extensions).to.equal(undefined);
333+
expect(someArg.extensions).to.deep.equal({});
334334

335335
const config = someDirective.toConfig();
336-
expect(config.extensions).to.equal(undefined);
336+
expect(config.extensions).to.deep.equal({});
337337
const someArgConfig = config.args.someArg;
338-
expect(someArgConfig.extensions).to.equal(undefined);
338+
expect(someArgConfig.extensions).to.deep.equal({});
339339
});
340340

341341
it('with extensions', () => {
@@ -371,10 +371,10 @@ describe('Type System: Extensions', () => {
371371
it('without extensions', () => {
372372
const schema = new GraphQLSchema({});
373373

374-
expect(schema.extensions).to.equal(undefined);
374+
expect(schema.extensions).to.deep.equal({});
375375

376376
const config = schema.toConfig();
377-
expect(config.extensions).to.equal(undefined);
377+
expect(config.extensions).to.deep.equal({});
378378
});
379379

380380
it('with extensions', () => {

src/type/__tests__/predicate-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ describe('Type predicates', () => {
573573
description: undefined,
574574
defaultValue: config.defaultValue,
575575
deprecationReason: null,
576-
extensions: undefined,
576+
extensions: Object.create(null),
577577
astNode: undefined,
578578
};
579579
}
@@ -621,7 +621,7 @@ describe('Type predicates', () => {
621621
description: undefined,
622622
defaultValue: config.defaultValue,
623623
deprecationReason: null,
624-
extensions: undefined,
624+
extensions: Object.create(null),
625625
astNode: undefined,
626626
};
627627
}

0 commit comments

Comments
 (0)