UNPKG

4.29 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * strict-local
8 * @format
9 */
10'use strict';
11
12function getInputObjectTypeIdentifier(type) {
13 return type.name;
14}
15
16function transformScalarType(type, state, objectProps) {
17 if (type instanceof require("graphql").GraphQLNonNull) {
18 return transformNonNullableScalarType(type.ofType, state, objectProps);
19 } else {
20 return require("@babel/types").nullableTypeAnnotation(transformNonNullableScalarType(type, state, objectProps));
21 }
22}
23
24function transformNonNullableScalarType(type, state, objectProps) {
25 if (type instanceof require("graphql").GraphQLList) {
26 return require("./RelayFlowBabelFactories").readOnlyArrayOfType(transformScalarType(type.ofType, state, objectProps));
27 } else if (type instanceof require("graphql").GraphQLObjectType || type instanceof require("graphql").GraphQLUnionType || type instanceof require("graphql").GraphQLInterfaceType) {
28 return objectProps;
29 } else if (type instanceof require("graphql").GraphQLScalarType) {
30 return transformGraphQLScalarType(type, state);
31 } else if (type instanceof require("graphql").GraphQLEnumType) {
32 return transformGraphQLEnumType(type, state);
33 } else {
34 throw new Error("Could not convert from GraphQL type ".concat(type.toString()));
35 }
36}
37
38function transformGraphQLScalarType(type, state) {
39 var customType = state.customScalars[type.name];
40
41 switch (customType || type.name) {
42 case 'ID':
43 case 'String':
44 return require("@babel/types").stringTypeAnnotation();
45
46 case 'Float':
47 case 'Int':
48 return require("@babel/types").numberTypeAnnotation();
49
50 case 'Boolean':
51 return require("@babel/types").booleanTypeAnnotation();
52
53 default:
54 return customType == null ? require("@babel/types").anyTypeAnnotation() : require("@babel/types").genericTypeAnnotation(require("@babel/types").identifier(customType));
55 }
56}
57
58function transformGraphQLEnumType(type, state) {
59 state.usedEnums[type.name] = type;
60 return require("@babel/types").genericTypeAnnotation(require("@babel/types").identifier(type.name));
61}
62
63function transformInputType(type, state) {
64 if (type instanceof require("graphql").GraphQLNonNull) {
65 return transformNonNullableInputType(type.ofType, state);
66 } else {
67 return require("@babel/types").nullableTypeAnnotation(transformNonNullableInputType(type, state));
68 }
69}
70
71function transformNonNullableInputType(type, state) {
72 if (type instanceof require("graphql").GraphQLList) {
73 return require("./RelayFlowBabelFactories").readOnlyArrayOfType(transformInputType(type.ofType, state));
74 } else if (type instanceof require("graphql").GraphQLScalarType) {
75 return transformGraphQLScalarType(type, state);
76 } else if (type instanceof require("graphql").GraphQLEnumType) {
77 return transformGraphQLEnumType(type, state);
78 } else if (type instanceof require("graphql").GraphQLInputObjectType) {
79 var typeIdentifier = getInputObjectTypeIdentifier(type);
80
81 if (state.generatedInputObjectTypes[typeIdentifier]) {
82 return require("@babel/types").genericTypeAnnotation(require("@babel/types").identifier(typeIdentifier));
83 }
84
85 state.generatedInputObjectTypes[typeIdentifier] = 'pending';
86 var fields = type.getFields();
87 var props = Object.keys(fields).map(function (key) {
88 return fields[key];
89 }).map(function (field) {
90 var property = require("@babel/types").objectTypeProperty(require("@babel/types").identifier(field.name), transformInputType(field.type, state));
91
92 if (state.optionalInputFields.indexOf(field.name) >= 0 || !(field.type instanceof require("graphql").GraphQLNonNull)) {
93 property.optional = true;
94 }
95
96 return property;
97 });
98 state.generatedInputObjectTypes[typeIdentifier] = require("./RelayFlowBabelFactories").exactObjectTypeAnnotation(props);
99 return require("@babel/types").genericTypeAnnotation(require("@babel/types").identifier(typeIdentifier));
100 } else {
101 throw new Error("Could not convert from GraphQL type ".concat(type.toString()));
102 }
103}
104
105module.exports = {
106 transformInputType: transformInputType,
107 transformScalarType: transformScalarType
108};
\No newline at end of file