Skip to content

Commit 3610786

Browse files
Speedup sorting & building/extending schema (#3939)
1 parent fae5da5 commit 3610786

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed

src/utilities/extendSchema.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { AccumulatorMap } from '../jsutils/AccumulatorMap.js';
22
import { inspect } from '../jsutils/inspect.js';
33
import { invariant } from '../jsutils/invariant.js';
4-
import { keyMap } from '../jsutils/keyMap.js';
54
import { mapValue } from '../jsutils/mapValue.js';
65
import type { Maybe } from '../jsutils/Maybe.js';
76

@@ -217,14 +216,13 @@ export function extendSchemaImpl(
217216
return schemaConfig;
218217
}
219218

220-
const typeMap = Object.create(null);
221-
for (const existingType of schemaConfig.types) {
222-
typeMap[existingType.name] = extendNamedType(existingType);
223-
}
219+
const typeMap = new Map<string, GraphQLNamedType>(
220+
schemaConfig.types.map((type) => [type.name, extendNamedType(type)]),
221+
);
224222

225223
for (const typeNode of typeDefs) {
226224
const name = typeNode.name.value;
227-
typeMap[name] = stdTypeMap[name] ?? buildType(typeNode);
225+
typeMap.set(name, stdTypeMap.get(name) ?? buildType(typeNode));
228226
}
229227

230228
const operationTypes = {
@@ -242,7 +240,7 @@ export function extendSchemaImpl(
242240
return {
243241
description: schemaDef?.description?.value ?? schemaConfig.description,
244242
...operationTypes,
245-
types: Object.values(typeMap),
243+
types: Array.from(typeMap.values()),
246244
directives: [
247245
...schemaConfig.directives.map(replaceDirective),
248246
...directiveDefs.map(buildDirective),
@@ -273,7 +271,7 @@ export function extendSchemaImpl(
273271
// Note: While this could make early assertions to get the correctly
274272
// typed values, that would throw immediately while type system
275273
// validation with validateSchema() will produce more actionable results.
276-
return typeMap[type.name];
274+
return typeMap.get(type.name) as T;
277275
}
278276

279277
function replaceDirective(directive: GraphQLDirective): GraphQLDirective {
@@ -462,7 +460,7 @@ export function extendSchemaImpl(
462460

463461
function getNamedType(node: NamedTypeNode): GraphQLNamedType {
464462
const name = node.name.value;
465-
const type = stdTypeMap[name] ?? typeMap[name];
463+
const type = stdTypeMap.get(name) ?? typeMap.get(name);
466464

467465
if (type === undefined) {
468466
throw new Error(`Unknown type: "${name}".`);
@@ -704,9 +702,11 @@ export function extendSchemaImpl(
704702
}
705703
}
706704

707-
const stdTypeMap = keyMap(
708-
[...specifiedScalarTypes, ...introspectionTypes],
709-
(type) => type.name,
705+
const stdTypeMap = new Map(
706+
[...specifiedScalarTypes, ...introspectionTypes].map((type) => [
707+
type.name,
708+
type,
709+
]),
710710
);
711711

712712
/**

src/utilities/lexicographicSortSchema.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { inspect } from '../jsutils/inspect.js';
22
import { invariant } from '../jsutils/invariant.js';
3-
import { keyValMap } from '../jsutils/keyValMap.js';
43
import type { Maybe } from '../jsutils/Maybe.js';
54
import { naturalCompare } from '../jsutils/naturalCompare.js';
65
import type { ObjMap } from '../jsutils/ObjMap.js';
@@ -40,15 +39,16 @@ import { GraphQLSchema } from '../type/schema.js';
4039
*/
4140
export function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema {
4241
const schemaConfig = schema.toConfig();
43-
const typeMap = keyValMap(
44-
sortByName(schemaConfig.types),
45-
(type) => type.name,
46-
sortNamedType,
42+
const typeMap = new Map<string, GraphQLNamedType>(
43+
sortByName(schemaConfig.types).map((type) => [
44+
type.name,
45+
sortNamedType(type),
46+
]),
4747
);
4848

4949
return new GraphQLSchema({
5050
...schemaConfig,
51-
types: Object.values(typeMap),
51+
types: Array.from(typeMap.values()),
5252
directives: sortByName(schemaConfig.directives).map(sortDirective),
5353
query: replaceMaybeType(schemaConfig.query),
5454
mutation: replaceMaybeType(schemaConfig.mutation),
@@ -68,7 +68,7 @@ export function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema {
6868
}
6969

7070
function replaceNamedType<T extends GraphQLNamedType>(type: T): T {
71-
return typeMap[type.name] as T;
71+
return typeMap.get(type.name) as T;
7272
}
7373

7474
function replaceMaybeType<T extends GraphQLNamedType>(

0 commit comments

Comments
 (0)