Skip to content

Commit f898798

Browse files
committed
Update buildScalar.js
1 parent 06611a7 commit f898798

File tree

2 files changed

+48
-26
lines changed

2 files changed

+48
-26
lines changed
+24-13
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
import { GraphQLScalarType } from 'graphql/type';
1+
/* @flow */
2+
3+
import { type GraphQLScalarTypeConfig, GraphQLScalarType } from 'graphql/type';
24
import { parse } from 'graphql/language';
35
import buildScalar from '../buildScalar';
46

57
describe('buildScalar()', () => {
6-
const generateScalarAST = ({ description, name = 'Scalar' } = {}) => parse(`
8+
const generateScalarNode = ({
9+
description,
10+
name = 'Scalar',
11+
}: { description: string, name?: string } = {}): Object => parse(`
712
# ${description === undefined ? '' : description}
813
scalar ${name}
914
`).definitions[0];
@@ -13,30 +18,36 @@ describe('buildScalar()', () => {
1318
serialize,
1419
parseValue,
1520
parseLiteral,
16-
} = {}) => new GraphQLScalarType({ name, description, serialize, parseValue, parseLiteral });
21+
}: $Shape<GraphQLScalarTypeConfig<*, *>> = {}) => new GraphQLScalarType({
22+
name,
23+
description,
24+
serialize,
25+
parseValue,
26+
parseLiteral,
27+
});
1728

18-
it('should throw with without `serialize` in config', () => {
19-
expect(() => buildScalar(generateScalarAST())).toThrow();
29+
test('throws with without `serialize` in config', () => {
30+
expect(() => buildScalar(generateScalarNode(), ({}: Object))).toThrow();
2031
});
2132

22-
it('should work with `serialize` in config', () => {
33+
test('builds with `serialize` in config', () => {
2334
const config = { serialize() {} };
24-
expect(buildScalar(generateScalarAST(), config)).toEqual(generateScalarType(config));
35+
expect(buildScalar(generateScalarNode(), config)).toEqual(generateScalarType(config));
2536
});
2637

27-
it('should work with `serialize` in config and description in AST', () => {
38+
test('builds with `serialize` in config and description in AST', () => {
2839
const config = { description: 'A description', serialize() {} };
29-
expect(buildScalar(generateScalarAST(config), config)).toEqual(generateScalarType(config));
40+
expect(buildScalar(generateScalarNode(config), config)).toEqual(generateScalarType(config));
3041
});
3142

32-
it('should work with `serialize`, `parseValue`, and `parseLiteral` in config', () => {
43+
test('builds with `serialize`, `parseValue`, and `parseLiteral` in config', () => {
3344
const config = { serialize() {}, parseValue() {}, parseLiteral() {} };
34-
expect(buildScalar(generateScalarAST(), config)).toEqual(generateScalarType(config));
45+
expect(buildScalar(generateScalarNode(), config)).toEqual(generateScalarType(config));
3546
});
3647

37-
it('should work with GraphQL scalar type', () => {
48+
test('builds with GraphQLScalarType', () => {
3849
const config = { serialize() {} };
39-
expect(buildScalar(generateScalarAST(), generateScalarType(config)))
50+
expect(buildScalar(generateScalarNode(), generateScalarType(config)))
4051
.toEqual(generateScalarType(config));
4152
});
4253
});

src/build/buildScalar.js

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
1+
/* @flow */
2+
3+
import type { ValueNode, ScalarTypeDefinitionNode } from 'graphql/language';
14
import { GraphQLScalarType } from 'graphql/type';
2-
import { getDescription } from 'graphql/utilities/buildASTSchema';
3-
4-
export default function buildScalar(scalarAST, config = {}) {
5-
const {
6-
serialize,
7-
parseValue,
8-
parseLiteral,
9-
// eslint-disable-next-line no-underscore-dangle
10-
} = config instanceof GraphQLScalarType ? config._scalarConfig : config;
11-
const scalarTypeConfig = { name: scalarAST.name.value, serialize, parseValue, parseLiteral };
12-
const description = getDescription(scalarAST);
13-
if (description) scalarTypeConfig.description = description;
14-
return new GraphQLScalarType(scalarTypeConfig);
5+
import getDescription from './getDescription';
6+
7+
type PartialConfig<TInternal, TExternal> = {
8+
name?: string,
9+
description?: string,
10+
serialize: (value: mixed) => ?TExternal,
11+
parseValue?: (value: mixed) => ?TInternal,
12+
parseLiteral?: (valueNode: ValueNode) => ?TInternal,
13+
}
14+
15+
type Config = PartialConfig<*, *> | GraphQLScalarType;
16+
17+
export default function buildScalar(node: ScalarTypeDefinitionNode, config: Config) {
18+
// eslint-disable-next-line no-underscore-dangle
19+
const scalarTypeConfig = config instanceof GraphQLScalarType ? config._scalarConfig : config;
20+
21+
return new GraphQLScalarType({
22+
...scalarTypeConfig,
23+
name: node.name.value,
24+
description: getDescription(node),
25+
});
1526
}

0 commit comments

Comments
 (0)