diff --git a/src/index.js b/src/index.js index 943d101068..2dd2bbb133 100644 --- a/src/index.js +++ b/src/index.js @@ -165,6 +165,9 @@ export type { GraphQLTypeResolver, GraphQLUnionTypeConfig, GraphQLDirectiveConfig, + GraphQLScalarSerializer, + GraphQLScalarValueParser, + GraphQLScalarLiteralParser, } from './type'; // Parse and operate on GraphQL language source files. diff --git a/src/type/definition.js b/src/type/definition.js index b74dcde582..c34c623cf7 100644 --- a/src/type/definition.js +++ b/src/type/definition.js @@ -535,17 +535,20 @@ function resolveThunk<+T>(thunk: Thunk): T { export class GraphQLScalarType { name: string; description: ?string; + serialize: GraphQLScalarSerializer<*>; + parseValue: GraphQLScalarValueParser<*>; + parseLiteral: GraphQLScalarLiteralParser<*>; astNode: ?ScalarTypeDefinitionNode; extensionASTNodes: ?$ReadOnlyArray; - _scalarConfig: GraphQLScalarTypeConfig<*, *>; - constructor(config: GraphQLScalarTypeConfig<*, *>): void { this.name = config.name; this.description = config.description; + this.serialize = config.serialize; + this.parseValue = config.parseValue || (value => value); + this.parseLiteral = config.parseLiteral || valueFromASTUntyped; this.astNode = config.astNode; this.extensionASTNodes = config.extensionASTNodes; - this._scalarConfig = config; invariant(typeof config.name === 'string', 'Must provide name.'); invariant( typeof config.serialize === 'function', @@ -563,26 +566,6 @@ export class GraphQLScalarType { } } - // Serializes an internal value to include in a response. - serialize(value: mixed): mixed { - const serializer = this._scalarConfig.serialize; - return serializer(value); - } - - // Parses an externally provided value to use as an input. - parseValue(value: mixed): mixed { - const parser = this._scalarConfig.parseValue; - return parser ? parser(value) : value; - } - - // Parses an externally provided literal value to use as an input. - parseLiteral(valueNode: ValueNode, variables: ?ObjMap): mixed { - const parser = this._scalarConfig.parseLiteral; - return parser - ? parser(valueNode, variables) - : valueFromASTUntyped(valueNode, variables); - } - toString(): string { return this.name; } @@ -592,17 +575,24 @@ export class GraphQLScalarType { defineToStringTag(GraphQLScalarType); defineToJSON(GraphQLScalarType); +export type GraphQLScalarSerializer = (value: mixed) => ?TExternal; +export type GraphQLScalarValueParser = (value: mixed) => ?TInternal; +export type GraphQLScalarLiteralParser = ( + valueNode: ValueNode, + variables: ?ObjMap, +) => ?TInternal; + export type GraphQLScalarTypeConfig = {| name: string, description?: ?string, + // Serializes an internal value to include in a response. + serialize: GraphQLScalarSerializer, + // Parses an externally provided value to use as an input. + parseValue?: GraphQLScalarValueParser, + // Parses an externally provided literal value to use as an input. + parseLiteral?: GraphQLScalarLiteralParser, astNode?: ?ScalarTypeDefinitionNode, extensionASTNodes?: ?$ReadOnlyArray, - serialize: (value: mixed) => ?TExternal, - parseValue?: (value: mixed) => ?TInternal, - parseLiteral?: ( - valueNode: ValueNode, - variables: ?ObjMap, - ) => ?TInternal, |}; /** diff --git a/src/type/index.js b/src/type/index.js index f7ac4fd8cd..e8ac7437ae 100644 --- a/src/type/index.js +++ b/src/type/index.js @@ -152,6 +152,9 @@ export type { GraphQLScalarTypeConfig, GraphQLTypeResolver, GraphQLUnionTypeConfig, + GraphQLScalarSerializer, + GraphQLScalarValueParser, + GraphQLScalarLiteralParser, } from './definition'; export { validateSchema, assertValidSchema } from './validate'; diff --git a/src/utilities/extendSchema.js b/src/utilities/extendSchema.js index 9f410c70b7..d1f1e89662 100644 --- a/src/utilities/extendSchema.js +++ b/src/utilities/extendSchema.js @@ -439,9 +439,9 @@ export function extendSchema( description: type.description, astNode: type.astNode, extensionASTNodes, - serialize: type._scalarConfig.serialize, - parseValue: type._scalarConfig.parseValue, - parseLiteral: type._scalarConfig.parseLiteral, + serialize: type.serialize, + parseValue: type.parseValue, + parseLiteral: type.parseLiteral, }); }