UNPKG

26.1 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 * @emails oncall+relay
8 *
9 * @format
10 */
11// flowlint ambiguous-object-type:error
12'use strict';
13
14var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
16var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
18var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
19
20function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
21
22function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
23
24var invariant = require("fbjs/lib/invariant");
25
26var _require = require('relay-runtime'),
27 TYPENAME_KEY = _require.TYPENAME_KEY,
28 RelayConcreteNode = _require.RelayConcreteNode,
29 getModuleComponentKey = _require.getModuleComponentKey,
30 getModuleOperationKey = _require.getModuleOperationKey;
31
32var CLIENT_EXTENSION = RelayConcreteNode.CLIENT_EXTENSION,
33 CONDITION = RelayConcreteNode.CONDITION,
34 CONNECTION = RelayConcreteNode.CONNECTION,
35 DEFER = RelayConcreteNode.DEFER,
36 INLINE_FRAGMENT = RelayConcreteNode.INLINE_FRAGMENT,
37 LINKED_FIELD = RelayConcreteNode.LINKED_FIELD,
38 LINKED_HANDLE = RelayConcreteNode.LINKED_HANDLE,
39 MODULE_IMPORT = RelayConcreteNode.MODULE_IMPORT,
40 SCALAR_FIELD = RelayConcreteNode.SCALAR_FIELD,
41 SCALAR_HANDLE = RelayConcreteNode.SCALAR_HANDLE,
42 STREAM = RelayConcreteNode.STREAM;
43
44function createIdGenerator() {
45 var id = 0;
46 return function () {
47 return ++id;
48 };
49}
50
51var DEFAULT_MOCK_RESOLVERS = {
52 ID: function ID(context, generateId) {
53 return "<".concat(context.parentType != null && context.parentType !== DEFAULT_MOCK_TYPENAME ? context.parentType + '-' : '', "mock-id-").concat(generateId(), ">");
54 },
55 Boolean: function Boolean() {
56 return false;
57 },
58 Int: function Int() {
59 return 42;
60 },
61 Float: function Float() {
62 return 4.2;
63 }
64};
65var DEFAULT_MOCK_TYPENAME = '__MockObject';
66/**
67 * Basic value resolver
68 */
69
70function valueResolver(generateId, mockResolvers, typeName, context) {
71 var plural = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
72 var defaultValue = arguments.length > 5 ? arguments[5] : undefined;
73
74 var generateValue = function generateValue(possibleDefaultValue) {
75 var mockValue;
76 var mockResolver = typeName != null && mockResolvers != null ? mockResolvers[typeName] : null;
77
78 if (mockResolver != null) {
79 mockValue = mockResolver(context, generateId);
80 }
81
82 if (mockValue === undefined) {
83 var _ref, _context$alias;
84
85 mockValue = possibleDefaultValue !== null && possibleDefaultValue !== void 0 ? possibleDefaultValue : typeName === 'ID' ? DEFAULT_MOCK_RESOLVERS.ID(context, generateId) : "<mock-value-for-field-\"".concat((_ref = (_context$alias = context.alias) !== null && _context$alias !== void 0 ? _context$alias : context.name) !== null && _ref !== void 0 ? _ref : 'undefined', "\">");
86 }
87
88 return mockValue;
89 };
90
91 return plural === true ? generateMockList(Array.isArray(defaultValue) ? defaultValue : Array(1).fill(), generateValue) : generateValue(defaultValue);
92}
93
94function createValueResolver(mockResolvers) {
95 var generateId = createIdGenerator();
96 return function () {
97 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
98 args[_key] = arguments[_key];
99 }
100
101 return valueResolver.apply(void 0, [generateId, mockResolvers].concat(args));
102 };
103}
104
105function generateMockList(placeholderArray, generateListItem) {
106 return placeholderArray.map(function (possibleDefaultValue) {
107 return generateListItem(possibleDefaultValue);
108 });
109}
110
111var RelayMockPayloadGenerator = /*#__PURE__*/function () {
112 function RelayMockPayloadGenerator(options) {
113 var _options$mockResolver, _options$selectionMet;
114
115 this._variables = options.variables;
116 /* $FlowFixMe(>=0.122.0) This comment suppresses an error found when Flow
117 * v0.122.0 was deployed. To see the error, delete this comment and run
118 * Flow. */
119
120 this._mockResolvers = _objectSpread({}, DEFAULT_MOCK_RESOLVERS, {}, (_options$mockResolver = options.mockResolvers) !== null && _options$mockResolver !== void 0 ? _options$mockResolver : {});
121 this._selectionMetadata = (_options$selectionMet = options.selectionMetadata) !== null && _options$selectionMet !== void 0 ? _options$selectionMet : {};
122 this._resolveValue = createValueResolver(this._mockResolvers);
123 }
124
125 var _proto = RelayMockPayloadGenerator.prototype;
126
127 _proto.generate = function generate(selections, operationType) {
128 var defaultValues = this._getDefaultValuesForObject(operationType, null, null, [], // path
129 {});
130
131 return this._traverse({
132 selections: selections,
133 typeName: operationType,
134 isAbstractType: false,
135 name: null,
136 alias: null,
137 args: null
138 }, [], // path
139 null, // prevData
140 defaultValues);
141 };
142
143 _proto._traverse = function _traverse(traversable, path, prevData, defaultValues) {
144 var selections = traversable.selections,
145 typeName = traversable.typeName,
146 isAbstractType = traversable.isAbstractType;
147 return this._traverseSelections(selections, typeName, isAbstractType, path, prevData, defaultValues);
148 }
149 /**
150 * Generate mock values for selection of fields
151 */
152 ;
153
154 _proto._traverseSelections = function _traverseSelections(selections, typeName, isAbstractType, path, prevData, defaultValues) {
155 var _this = this;
156
157 var mockData = prevData !== null && prevData !== void 0 ? prevData : {};
158 selections.forEach(function (selection) {
159 switch (selection.kind) {
160 case SCALAR_FIELD:
161 {
162 mockData = _this._mockScalar(selection, typeName, path, mockData, defaultValues);
163 break;
164 }
165
166 case CONNECTION:
167 {
168 mockData = _this._traverseSelections([selection.edges, selection.pageInfo], typeName, isAbstractType, path, prevData, defaultValues);
169 break;
170 }
171
172 case LINKED_FIELD:
173 {
174 mockData = _this._mockLink(selection, path, mockData, defaultValues);
175 break;
176 }
177
178 case CONDITION:
179 var conditionValue = _this._getVariableValue(selection.condition);
180
181 if (conditionValue === selection.passingValue) {
182 mockData = _this._traverseSelections(selection.selections, typeName, isAbstractType, path, mockData, defaultValues);
183 }
184
185 break;
186
187 case DEFER:
188 case STREAM:
189 {
190 mockData = _this._traverseSelections(selection.selections, typeName, isAbstractType, path, mockData, defaultValues);
191 break;
192 }
193
194 case INLINE_FRAGMENT:
195 {
196 // If it's the first time we're trying to handle fragment spread
197 // on this selection, we will generate data for this type.
198 // Next fragment spread on this selection will be added only if the
199 // types are matching
200 if (mockData != null && (mockData[TYPENAME_KEY] == null || mockData[TYPENAME_KEY] === DEFAULT_MOCK_TYPENAME)) {
201 var _defaultValues$TYPENA;
202
203 mockData[TYPENAME_KEY] = (_defaultValues$TYPENA = defaultValues === null || defaultValues === void 0 ? void 0 : defaultValues[TYPENAME_KEY]) !== null && _defaultValues$TYPENA !== void 0 ? _defaultValues$TYPENA : selection.type;
204 } // Now, we need to make sure that we don't select abstract type
205 // for inline fragments
206
207
208 if (isAbstractType === true && mockData != null && mockData[TYPENAME_KEY] === typeName) {
209 mockData[TYPENAME_KEY] = selection.type;
210 }
211
212 if (mockData != null && mockData[TYPENAME_KEY] === selection.type) {
213 // This will get default values for current selection type
214 var defaults = _this._getDefaultValuesForObject(selection.type, path[path.length - 1], null, path); // Also, if the selection has an abstract type
215 // we may have mock resolvers for it
216
217
218 var defaultsForAbstractType = typeName !== selection.type ? _this._getDefaultValuesForObject(typeName, path[path.length - 1], null, path) : defaults; // Now let's select which defaults we're going to use
219 // for the selections
220
221 var defaultValuesForSelection = defaults; // First, defaults for
222 // concrete type of the selection
223
224 if (defaultValuesForSelection === undefined) {
225 // Second, defaults for abstract type of the selection
226 defaultValuesForSelection = defaultsForAbstractType;
227 } // And last, values from the parent mock resolver
228
229
230 if (defaultValuesForSelection === undefined) {
231 defaultValuesForSelection = defaultValues;
232 } // Now, if the default value for the type is explicit null,
233 // we may skip traversing child selection
234
235
236 if (defaultValuesForSelection === null) {
237 mockData = null;
238 break;
239 }
240
241 mockData = _this._traverseSelections(selection.selections, selection.type, isAbstractType, path, mockData, defaultValuesForSelection);
242
243 if (mockData[TYPENAME_KEY] != null) {
244 mockData[TYPENAME_KEY] = selection.type;
245 } // Make sure we're using id form the default values, an
246 // ID may be referenced in the same selection as InlineFragment
247
248
249 if (mockData.id != null && defaults != null && defaults.id != null) {
250 mockData.id = defaults.id;
251 }
252 }
253
254 break;
255 }
256
257 case MODULE_IMPORT:
258 // Explicit `null` of `defaultValues` handled in the INLINE_FRAGMENT
259 if (defaultValues != null) {
260 var _objectSpread2;
261
262 if (defaultValues.__typename !== typeName) {
263 break;
264 } // In order to mock 3d payloads, we need to receive an object with
265 // the type `NormalizationSplitOperation` from mock resolvers.
266 // In this case, we can traverse into its selection
267 // and generated payloads for it.
268
269
270 var operation = defaultValues.__module_operation; // Basic sanity checks of the provided default value.
271 // It should look like NormalizationSplitOperation
272
273 !(typeof operation === 'object' && operation !== null && operation.kind === 'SplitOperation' && Array.isArray(operation.selections) && typeof operation.name === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayMockPayloadGenerator(): Unexpected default value for ' + 'a field `__module_operation` in the mock resolver for ' + '@module dependency. Provided value is "%s" and we\'re ' + 'expecting an object of a type `NormalizationSplitOperation`. ' + 'Please adjust mock resolver for the type "%s". ' + 'Typically it should require a file "%s$normalization.graphql".', JSON.stringify(operation), typeName, selection.fragmentName) : invariant(false) : void 0;
274 var splitOperation = operation;
275 var documentName = selection.documentName;
276
277 if (mockData == null) {
278 mockData = {};
279 }
280 /* $FlowFixMe(>=0.123.0) This comment suppresses an error
281 * found when Flow v0.123.0 was deployed. To see the error delete
282 * this comment and run Flow. */
283
284
285 mockData = _objectSpread({}, mockData, (_objectSpread2 = {}, (0, _defineProperty2["default"])(_objectSpread2, TYPENAME_KEY, typeName), (0, _defineProperty2["default"])(_objectSpread2, getModuleOperationKey(documentName), operation.name), (0, _defineProperty2["default"])(_objectSpread2, getModuleComponentKey(documentName), defaultValues.__module_component), _objectSpread2), _this._traverseSelections(splitOperation.selections, typeName, false, path, null, null));
286 }
287
288 break;
289
290 case CLIENT_EXTENSION:
291 // We do not expect to receive data for the client extensions
292 // from the server. MockPayloadGenerator should not generate it too.
293 break;
294
295 case SCALAR_HANDLE:
296 case LINKED_HANDLE:
297 break;
298
299 default:
300 selection;
301 !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayMockPayloadGenerator(): Unexpected AST kind `%s`.', selection.kind) : invariant(false) : void 0;
302 }
303 });
304 return mockData;
305 }
306 /**
307 * Generate default enum value
308 * @private
309 */
310 ;
311
312 _proto._getCorrectDefaultEnum = function _getCorrectDefaultEnum(enumValues, value, path, applicationName) {
313 if (value === undefined) {
314 return value;
315 }
316
317 if (value === null) {
318 // null is a valid enum value
319 return value;
320 }
321
322 var valueToValidate = Array.isArray(value) ? value.map(function (v) {
323 return String(v).toUpperCase();
324 }) : [String(value).toUpperCase()];
325 var enumValuesNormalized = enumValues.map(function (s) {
326 return s.toUpperCase();
327 }); // Let's validate the correctness of the provided enum value
328 // We will throw if value provided by mock resolvers is invalid
329
330 var correctValues = valueToValidate.filter(function (v) {
331 return enumValuesNormalized.includes(v);
332 });
333
334 if (correctValues.length !== valueToValidate.length) {
335 !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayMockPayloadGenerator: Invalid value "%s" provided for enum ' + 'field "%s" via MockResolver.' + 'Expected one of the following values: %s.', value, "".concat(path.join('.'), ".").concat(applicationName), enumValues.map(function (v) {
336 return "\"".concat(v, "\"");
337 }).join(', ')) : invariant(false) : void 0;
338 } // But missing case should be acceptable, we will just use
339 // a correct spelling from enumValues
340
341
342 var correctSpellingValues = valueToValidate.map(function (v) {
343 var correctSpellingEnumIndex = enumValuesNormalized.indexOf(String(v).toUpperCase());
344 return enumValues[correctSpellingEnumIndex];
345 });
346 return Array.isArray(value) ? correctSpellingValues : correctSpellingValues[0];
347 }
348 /**
349 * Generate mock value for a scalar field in the selection
350 */
351 ;
352
353 _proto._mockScalar = function _mockScalar(field, typeName, path, mockData, defaultValues) {
354 var _field$alias;
355
356 var data = mockData !== null && mockData !== void 0 ? mockData : {};
357 var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
358
359 if (data.hasOwnProperty(applicationName) && field.name !== TYPENAME_KEY) {
360 return data;
361 }
362
363 var value; // For __typename fields we are going to return typeName
364
365 if (field.name === TYPENAME_KEY) {
366 value = typeName !== null && typeName !== void 0 ? typeName : DEFAULT_MOCK_TYPENAME;
367 }
368
369 var selectionPath = [].concat((0, _toConsumableArray2["default"])(path), [applicationName]);
370
371 var _this$_getScalarField = this._getScalarFieldTypeDetails(field, typeName, selectionPath),
372 type = _this$_getScalarField.type,
373 plural = _this$_getScalarField.plural,
374 enumValues = _this$_getScalarField.enumValues; // We may have an object with default values (generated in _mockLink(...))
375 // let's check if we have a possible default value there for our field
376
377
378 if (defaultValues != null && defaultValues.hasOwnProperty(applicationName)) {
379 value = defaultValues[applicationName];
380
381 if (enumValues != null) {
382 value = this._getCorrectDefaultEnum(enumValues, value, path, applicationName);
383 } // And if it's a plural field, we need to return an array
384
385
386 if (value !== undefined && plural && !Array.isArray(value)) {
387 value = [value];
388 }
389 } // If the value has not been generated yet (__id, __typename fields, or defaults)
390 // then we need to generate mock value for a scalar type
391
392
393 if (value === undefined) {
394 // Get basic type information: type of the field (Int, Float, String, etc..)
395 // And check if it's a plural type
396 var _defaultValue = enumValues != null ? enumValues[0] : undefined;
397
398 value = this._resolveValue( // If we don't have schema let's assume that fields with name (id, __id)
399 // have type ID
400 type, {
401 parentType: typeName,
402 name: field.name,
403 alias: field.alias,
404 path: selectionPath,
405 args: this._getFieldArgs(field)
406 }, plural, _defaultValue);
407 }
408
409 data[applicationName] = value;
410 return data;
411 }
412 /**
413 * Generate mock data for linked fields in the selection
414 */
415 ;
416
417 _proto._mockLink = function _mockLink(field, path, prevData, defaultValues) {
418 var _this2 = this;
419
420 var _field$alias2, _this$_selectionMetad, _field$concreteType;
421
422 var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
423 var data = prevData !== null && prevData !== void 0 ? prevData : {};
424
425 var args = this._getFieldArgs(field); // Let's check if we have a custom mock resolver for the object type
426 // We will pass this data down to selection, so _mockScalar(...) can use
427 // values from `defaults`
428
429
430 var selectionPath = [].concat((0, _toConsumableArray2["default"])(path), [applicationName]);
431 var typeFromSelection = (_this$_selectionMetad = this._selectionMetadata[selectionPath.join('.')]) !== null && _this$_selectionMetad !== void 0 ? _this$_selectionMetad : {
432 type: DEFAULT_MOCK_TYPENAME
433 };
434 var defaults;
435
436 if (defaultValues != null && typeof defaultValues[applicationName] === 'object') {
437 defaults = defaultValues[applicationName];
438 } // In cases when we have explicit `null` in the defaults - let's return
439 // null for full branch
440
441
442 if (defaults === null) {
443 data[applicationName] = null;
444 return data;
445 } // If concrete type is null, let's try to get if from defaults,
446 // and fallback to default object type
447
448
449 var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : defaults != null && typeof defaults[TYPENAME_KEY] === 'string' ? defaults[TYPENAME_KEY] : typeFromSelection.type; // Let's assume, that if the concrete type is null and selected type name is
450 // different from type information form selection, most likely this type
451 // information came from mock resolver __typename value and it was
452 // an intentional selection of the specific type
453
454 var isAbstractType = field.concreteType === null && typeName === typeFromSelection.type;
455
456 var generateDataForField = function generateDataForField(possibleDefaultValue) {
457 var _this$_getDefaultValu, _field$concreteType2;
458
459 var fieldDefaultValue = (_this$_getDefaultValu = _this2._getDefaultValuesForObject((_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : typeFromSelection.type, field.name, field.alias, selectionPath, args)) !== null && _this$_getDefaultValu !== void 0 ? _this$_getDefaultValu : possibleDefaultValue;
460
461 if (fieldDefaultValue === null) {
462 return null;
463 }
464
465 return _this2._traverse({
466 selections: field.selections,
467 typeName: typeName,
468 isAbstractType: isAbstractType,
469 name: field.name,
470 alias: field.alias,
471 args: args
472 }, [].concat((0, _toConsumableArray2["default"])(path), [applicationName]), typeof data[applicationName] === 'object' ?
473 /* $FlowFixMe(>=0.98.0 site=react_native_fb,oss,www,mobile) This
474 * comment suppresses an error found when Flow v0.98 was deployed.
475 * To see the error delete this comment and run Flow. */
476 data[applicationName] : null,
477 /* $FlowFixMe(>=0.98.0 site=react_native_fb,oss,www,mobile) This comment suppresses an
478 * error found when Flow v0.98 was deployed. To see the error delete
479 * this comment and run Flow. */
480 fieldDefaultValue);
481 };
482
483 data[applicationName] = field.kind === 'LinkedField' && field.plural ? generateMockList(Array.isArray(defaults) ? defaults : Array(1).fill(), generateDataForField) : generateDataForField(defaults);
484 return data;
485 }
486 /**
487 * Get the value for a variable by name
488 */
489 ;
490
491 _proto._getVariableValue = function _getVariableValue(name) {
492 !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayMockPayloadGenerator(): Undefined variable `%s`.', name) : invariant(false) : void 0;
493 return this._variables[name];
494 }
495 /**
496 * This method should call mock resolver for a specific type name
497 * and the result of this mock resolver will be passed as a default values for
498 * _mock*(...) methods
499 */
500 ;
501
502 _proto._getDefaultValuesForObject = function _getDefaultValuesForObject(typeName, fieldName, fieldAlias, path, args) {
503 var data;
504
505 if (typeName != null && this._mockResolvers[typeName] != null) {
506 data = this._resolveValue(typeName, {
507 parentType: null,
508 name: fieldName,
509 alias: fieldAlias,
510 args: args,
511 path: path
512 }, false);
513 }
514
515 if (typeof data === 'object') {
516 /* $FlowFixMe(>=0.98.0 site=react_native_fb,oss,www,mobile) This comment suppresses an
517 * error found when Flow v0.98 was deployed. To see the error delete this
518 * comment and run Flow. */
519 return data;
520 }
521 }
522 /**
523 * Get object with variables for field
524 */
525 ;
526
527 _proto._getFieldArgs = function _getFieldArgs(field) {
528 var _this3 = this;
529
530 var args = {};
531
532 if (field.args != null) {
533 field.args.forEach(function (arg) {
534 args[arg.name] = _this3._getArgValue(arg);
535 });
536 }
537
538 return args;
539 };
540
541 _proto._getArgValue = function _getArgValue(arg) {
542 var _this4 = this;
543
544 switch (arg.kind) {
545 case 'Literal':
546 return arg.value;
547
548 case 'Variable':
549 return this._getVariableValue(arg.variableName);
550
551 case 'ObjectValue':
552 {
553 var value = {};
554 arg.fields.forEach(function (field) {
555 value[field.name] = _this4._getArgValue(field);
556 });
557 return value;
558 }
559
560 case 'ListValue':
561 {
562 var _value = [];
563 arg.items.forEach(function (item) {
564 _value.push(item != null ? _this4._getArgValue(item) : null);
565 });
566 return _value;
567 }
568 }
569 }
570 /**
571 * Helper function to get field type information (name of the type, plural)
572 */
573 ;
574
575 _proto._getScalarFieldTypeDetails = function _getScalarFieldTypeDetails(field, typeName, selectionPath) {
576 var _this$_selectionMetad2;
577
578 return (_this$_selectionMetad2 = this._selectionMetadata[selectionPath.join('.')]) !== null && _this$_selectionMetad2 !== void 0 ? _this$_selectionMetad2 : {
579 type: field.name === 'id' ? 'ID' : 'String',
580 plural: false,
581 enumValues: null,
582 nullable: false
583 };
584 };
585
586 return RelayMockPayloadGenerator;
587}();
588/**
589 * Generate mock data for NormalizationOperation selection
590 */
591
592
593function generateData(node, variables, mockResolvers, selectionMetadata) {
594 var mockGenerator = new RelayMockPayloadGenerator({
595 variables: variables,
596 mockResolvers: mockResolvers,
597 selectionMetadata: selectionMetadata
598 });
599 var operationType;
600
601 if (node.name.endsWith('Mutation')) {
602 operationType = 'Mutation';
603 } else if (node.name.endsWith('Subscription')) {
604 operationType = 'Subscription';
605 } else {
606 operationType = 'Query';
607 }
608
609 return mockGenerator.generate(node.selections, operationType);
610}
611/**
612 * Type refinement for selection metadata
613 */
614
615
616function getSelectionMetadataFromOperation(operation) {
617 var _operation$request$no;
618
619 var selectionTypeInfo = (_operation$request$no = operation.request.node.params.metadata) === null || _operation$request$no === void 0 ? void 0 : _operation$request$no.relayTestingSelectionTypeInfo;
620
621 if (selectionTypeInfo != null && !Array.isArray(selectionTypeInfo) && typeof selectionTypeInfo === 'object') {
622 var selectionMetadata = {};
623 Object.keys(selectionTypeInfo).forEach(function (path) {
624 var item = selectionTypeInfo[path];
625
626 if (item != null && !Array.isArray(item) && typeof item === 'object') {
627 if (typeof item.type === 'string' && typeof item.plural === 'boolean' && typeof item.nullable === 'boolean' && (item.enumValues === null || Array.isArray(item.enumValues))) {
628 selectionMetadata[path] = {
629 type: item.type,
630 plural: item.plural,
631 nullable: item.nullable,
632 enumValues: Array.isArray(item.enumValues) ? item.enumValues.map(String) : null
633 };
634 }
635 }
636 });
637 return selectionMetadata;
638 }
639
640 return null;
641}
642
643function generateDataForOperation(operation, mockResolvers) {
644 var data = generateData(operation.request.node.operation, operation.request.variables, mockResolvers !== null && mockResolvers !== void 0 ? mockResolvers : null, getSelectionMetadataFromOperation(operation));
645 return {
646 data: data
647 };
648}
649
650module.exports = {
651 generate: generateDataForOperation
652};
\No newline at end of file