Skip to content
This repository has been archived by the owner on Apr 15, 2020. It is now read-only.

Commit

Permalink
fix(toConfig): touch up types
Browse files Browse the repository at this point in the history
toConfig returns an actual configuration, rather than a thunk.
  • Loading branch information
yaacovCR committed Mar 10, 2020
1 parent 12f28ed commit b87344c
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 51 deletions.
18 changes: 14 additions & 4 deletions src/polyfills/toConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
GraphQLObjectType,
GraphQLObjectTypeConfig,
GraphQLFieldConfigMap,
GraphQLInputFieldConfigMap,
GraphQLInterfaceType,
GraphQLInterfaceTypeConfig,
GraphQLUnionType,
Expand Down Expand Up @@ -77,14 +78,21 @@ export function toConfig(
schemaOrTypeOrDirective: GraphQLSchema,
): GraphQLSchemaConfig;
export function toConfig(
schemaOrTypeOrDirective: GraphQLObjectType,
schemaOrTypeOrDirective: GraphQLObjectTypeConfig<any, any> & {
interfaces: Array<GraphQLInterfaceType>;
fields: GraphQLFieldConfigMap<any, any>;
},
): GraphQLObjectTypeConfig<any, any>;
export function toConfig(
schemaOrTypeOrDirective: GraphQLInterfaceType,
): GraphQLInterfaceTypeConfig<any, any>;
): GraphQLInterfaceTypeConfig<any, any> & {
fields: GraphQLFieldConfigMap<any, any>;
};
export function toConfig(
schemaOrTypeOrDirective: GraphQLUnionType,
): GraphQLUnionTypeConfig<any, any>;
): GraphQLUnionTypeConfig<any, any> & {
types: Array<GraphQLObjectType>;
};
export function toConfig(
schemaOrTypeOrDirective: GraphQLEnumType,
): GraphQLEnumTypeConfig;
Expand All @@ -93,7 +101,9 @@ export function toConfig(
): GraphQLScalarTypeConfig<any, any>;
export function toConfig(
schemaOrTypeOrDirective: GraphQLInputObjectType,
): GraphQLInputObjectTypeConfig;
): GraphQLInputObjectTypeConfig & {
fields: GraphQLInputFieldConfigMap;
};
export function toConfig(
schemaOrTypeOrDirective: GraphQLDirective,
): GraphQLDirectiveConfig;
Expand Down
15 changes: 6 additions & 9 deletions src/stitching/mergeSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,13 +348,12 @@ function merge(
fields: candidates.reduce(
(acc, candidate) => ({
...acc,
...toConfig(candidate.type as GraphQLObjectType).fields,
...toConfig(candidate.type).fields,
}),
{},
),
interfaces: candidates.reduce((acc, candidate) => {
const interfaces = toConfig(candidate.type as GraphQLObjectType)
.interfaces;
const interfaces = toConfig(candidate.type).interfaces;
return interfaces != null ? acc.concat(interfaces) : acc;
}, []),
});
Expand All @@ -364,15 +363,14 @@ function merge(
fields: candidates.reduce(
(acc, candidate) => ({
...acc,
...toConfig(candidate.type as GraphQLObjectType).fields,
...toConfig(candidate.type).fields,
}),
{},
),
interfaces:
graphqlVersion() >= 15
? candidates.reduce((acc, candidate) => {
const interfaces = toConfig(candidate.type as GraphQLObjectType)
.interfaces;
const interfaces = toConfig(candidate.type).interfaces;
return interfaces != null ? acc.concat(interfaces) : acc;
}, [])
: undefined,
Expand All @@ -382,8 +380,7 @@ function merge(
return new GraphQLUnionType({
name: typeName,
types: candidates.reduce(
(acc, candidate) =>
acc.concat(toConfig(candidate.type as GraphQLUnionType).types),
(acc, candidate) => acc.concat(toConfig(candidate.type).types),
[],
),
});
Expand All @@ -393,7 +390,7 @@ function merge(
values: candidates.reduce(
(acc, candidate) => ({
...acc,
...toConfig(candidate.type as GraphQLEnumType).values,
...toConfig(candidate.type).values,
}),
{},
),
Expand Down
11 changes: 2 additions & 9 deletions src/test/testMapSchema.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import { expect } from 'chai';
import {
GraphQLFieldConfig,
GraphQLObjectType,
GraphQLSchema,
graphqlSync,
} from 'graphql';
import { GraphQLObjectType, GraphQLSchema, graphqlSync } from 'graphql';

import { makeExecutableSchema, mapSchema } from '../index';
import { MapperKind } from '../utils/map';
Expand Down Expand Up @@ -36,9 +31,7 @@ describe('mapSchema', () => {
const newSchema = mapSchema(schema, {
[MapperKind.QUERY]: type => {
const queryConfig = toConfig(type);
(queryConfig.fields as {
version: GraphQLFieldConfig<any, any>;
}).version.resolve = () => 1;
queryConfig.fields.version.resolve = () => 1;
return new GraphQLObjectType(queryConfig);
},
});
Expand Down
4 changes: 1 addition & 3 deletions src/test/testUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ describe('heal', () => {
});
const originalTypeMap = schema.getTypeMap();

const config = toConfig(
originalTypeMap['WillBeEmptyObject'] as GraphQLObjectType,
);
const config = toConfig(originalTypeMap['WillBeEmptyObject']);
originalTypeMap['WillBeEmptyObject'] = new GraphQLObjectType({
...config,
fields: {},
Expand Down
20 changes: 12 additions & 8 deletions src/utils/clone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import {
GraphQLInputObjectType,
GraphQLInterfaceType,
GraphQLObjectType,
GraphQLObjectTypeConfig,
GraphQLNamedType,
GraphQLScalarType,
GraphQLSchema,
GraphQLUnionType,
GraphQLInterfaceTypeConfig,
isObjectType,
isInterfaceType,
isUnionType,
Expand All @@ -34,25 +34,29 @@ export function cloneType(type: GraphQLNamedType): GraphQLNamedType {
interfaces:
typeof config.interfaces === 'function'
? config.interfaces
: (config.interfaces as ReadonlyArray<GraphQLInterfaceType>).slice(),
: config.interfaces.slice(),
});
} else if (isInterfaceType(type)) {
const config = toConfig((type as unknown) as GraphQLObjectType);
const config = toConfig(type);
const newConfig = {
...config,
interfaces:
graphqlVersion() >= 15
? (config.interfaces as ReadonlyArray<GraphQLInterfaceType>).slice()
? typeof ((config as unknown) as GraphQLObjectTypeConfig<any, any>)
.interfaces === 'function'
? ((config as unknown) as GraphQLObjectTypeConfig<any, any>)
.interfaces
: ((config as unknown) as {
interfaces: Array<GraphQLInterfaceType>;
}).interfaces.slice()
: undefined,
};
return new GraphQLInterfaceType(
(newConfig as unknown) as GraphQLInterfaceTypeConfig<any, any>,
);
return new GraphQLInterfaceType(newConfig);
} else if (isUnionType(type)) {
const config = toConfig(type);
return new GraphQLUnionType({
...config,
types: (config.types as ReadonlyArray<GraphQLObjectType>).slice(),
types: config.types.slice(),
});
} else if (isInputObjectType(type)) {
return new GraphQLInputObjectType(toConfig(type));
Expand Down
4 changes: 2 additions & 2 deletions src/utils/fields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export function appendFields(
): void {
let type = typeMap[typeName];
if (type != null) {
const typeConfig = toConfig(type as GraphQLObjectType);
const typeConfig = toConfig(type);
const originalFields = typeConfig.fields;
const newFields = {};
Object.keys(originalFields).forEach(fieldName => {
Expand Down Expand Up @@ -42,7 +42,7 @@ export function removeFields(
testFn: (fieldName: string, field: GraphQLFieldConfig<any, any>) => boolean,
): GraphQLFieldConfigMap<any, any> {
let type = typeMap[typeName];
const typeConfig = toConfig(type as GraphQLObjectType);
const typeConfig = toConfig(type);
const originalFields = typeConfig.fields;
const newFields = {};
const removedFields = {};
Expand Down
25 changes: 9 additions & 16 deletions src/utils/map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
GraphQLInterfaceType,
GraphQLList,
GraphQLObjectType,
GraphQLObjectTypeConfig,
GraphQLNamedType,
GraphQLNonNull,
GraphQLScalarType,
Expand Down Expand Up @@ -311,25 +310,19 @@ export function rewireTypes(
function rewireNamedType<T extends GraphQLNamedType>(type: T) {
if (isObjectType(type)) {
const objectConfig = toConfig(type);
objectConfig.fields = rewireFields(
objectConfig.fields as GraphQLFieldConfigMap<any, any>,
);
objectConfig.interfaces = rewireNamedTypes(
objectConfig.interfaces as Array<GraphQLInterfaceType>,
);
objectConfig.fields = rewireFields(objectConfig.fields);
objectConfig.interfaces = rewireNamedTypes(objectConfig.interfaces);
return new GraphQLObjectType(objectConfig);
} else if (isInterfaceType(type)) {
const interfaceConfig = toConfig(type);
interfaceConfig.fields = rewireFields(
interfaceConfig.fields as GraphQLFieldConfigMap<any, any>,
);
interfaceConfig.fields = rewireFields(interfaceConfig.fields);
if (graphqlVersion() >= 15) {
((interfaceConfig as unknown) as GraphQLObjectTypeConfig<
any,
any
>).interfaces = rewireNamedTypes(
((interfaceConfig as unknown) as GraphQLObjectTypeConfig<any, any>)
.interfaces as Array<GraphQLInterfaceType>,
((interfaceConfig as unknown) as {
interfaces: Array<GraphQLObjectType>;
}).interfaces = rewireNamedTypes(
((interfaceConfig as unknown) as {
interfaces: Array<GraphQLObjectType>;
}).interfaces,
);
}
return new GraphQLInterfaceType(interfaceConfig);
Expand Down

0 comments on commit b87344c

Please sign in to comment.