1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.astFromValue = astFromValue;
var _isFinite = _interopRequireDefault(require("../polyfills/isFinite.js"));
var _objectValues3 = _interopRequireDefault(require("../polyfills/objectValues.js"));
var _inspect = _interopRequireDefault(require("../jsutils/inspect.js"));
var _invariant = _interopRequireDefault(require("../jsutils/invariant.js"));
var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike.js"));
var _safeArrayFrom = _interopRequireDefault(require("../jsutils/safeArrayFrom.js"));
var _kinds = require("../language/kinds.js");
var _scalars = require("../type/scalars.js");
var _definition = require("../type/definition.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Produces a GraphQL Value AST given a JavaScript object.
* Function will match JavaScript/JSON values to GraphQL AST schema format
* by using suggested GraphQLInputType. For example:
*
* astFromValue("value", GraphQLString)
*
* A GraphQL type must be provided, which will be used to interpret different
* JavaScript values.
*
* | JSON Value | GraphQL Value |
* | ------------- | -------------------- |
* | Object | Input Object |
* | Array | List |
* | Boolean | Boolean |
* | String | String / Enum Value |
* | Number | Int / Float |
* | Mixed | Enum Value |
* | null | NullValue |
*
*/
function astFromValue(value, type) {
if ((0, _definition.isNonNullType)(type)) {
var astValue = astFromValue(value, type.ofType);
if ((astValue === null || astValue === void 0 ? void 0 : astValue.kind) === _kinds.Kind.NULL) {
return null;
}
return astValue;
} // only explicit null, not undefined, NaN
if (value === null) {
return {
kind: _kinds.Kind.NULL
};
} // undefined
if (value === undefined) {
return null;
} // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but
// the value is not an array, convert the value using the list's item type.
if ((0, _definition.isListType)(type)) {
var itemType = type.ofType;
var items = (0, _safeArrayFrom.default)(value);
if (items != null) {
var valuesNodes = [];
for (var _i2 = 0; _i2 < items.length; _i2++) {
var item = items[_i2];
var itemNode = astFromValue(item, itemType);
if (itemNode != null) {
valuesNodes.push(itemNode);
}
}
return {
kind: _kinds.Kind.LIST,
values: valuesNodes
};
}
return astFromValue(value, itemType);
} // Populate the fields of the input object by creating ASTs from each value
// in the JavaScript object according to the fields in the input type.
if ((0, _definition.isInputObjectType)(type)) {
if (!(0, _isObjectLike.default)(value)) {
return null;
}
var fieldNodes = [];
for (var _i4 = 0, _objectValues2 = (0, _objectValues3.default)(type.getFields()); _i4 < _objectValues2.length; _i4++) {
var field = _objectValues2[_i4];
var fieldValue = astFromValue(value[field.name], field.type);
if (fieldValue) {
fieldNodes.push({
kind: _kinds.Kind.OBJECT_FIELD,
name: {
kind: _kinds.Kind.NAME,
value: field.name
},
value: fieldValue
});
}
}
return {
kind: _kinds.Kind.OBJECT,
fields: fieldNodes
};
} // istanbul ignore else (See: 'https://github.com/graphql/graphql-js/issues/2618')
if ((0, _definition.isLeafType)(type)) {
// Since value is an internally represented value, it must be serialized
// to an externally represented value before converting into an AST.
var serialized = type.serialize(value);
if (serialized == null) {
return null;
} // Others serialize based on their corresponding JavaScript scalar types.
if (typeof serialized === 'boolean') {
return {
kind: _kinds.Kind.BOOLEAN,
value: serialized
};
} // JavaScript numbers can be Int or Float values.
if (typeof serialized === 'number' && (0, _isFinite.default)(serialized)) {
var stringNum = String(serialized);
return integerStringRegExp.test(stringNum) ? {
kind: _kinds.Kind.INT,
value: stringNum
} : {
kind: _kinds.Kind.FLOAT,
value: stringNum
};
}
if (typeof serialized === 'string') {
// Enum types use Enum literals.
if ((0, _definition.isEnumType)(type)) {
return {
kind: _kinds.Kind.ENUM,
value: serialized
};
} // ID types can use Int literals.
if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) {
return {
kind: _kinds.Kind.INT,
value: serialized
};
}
return {
kind: _kinds.Kind.STRING,
value: serialized
};
}
throw new TypeError("Cannot convert value to AST: ".concat((0, _inspect.default)(serialized), "."));
} // istanbul ignore next (Not reachable. All possible input types have been considered)
false || (0, _invariant.default)(0, 'Unexpected input type: ' + (0, _inspect.default)(type));
}
/**
* IntValue:
* - NegativeSign? 0
* - NegativeSign? NonZeroDigit ( Digit+ )?
*/
var integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/;
|