@khanacademy/graphql-flow 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +1 -1
- package/CHANGELOG.md +23 -0
- package/Readme.md +15 -0
- package/dist/cli/config.js +4 -4
- package/dist/cli/config.js.flow +3 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/run.js +18 -14
- package/dist/cli/run.js.flow +18 -14
- package/dist/cli/run.js.map +1 -1
- package/dist/generateResponseType.js +152 -53
- package/dist/generateResponseType.js.flow +223 -65
- package/dist/generateResponseType.js.map +1 -1
- package/dist/generateTypeFiles.js +80 -39
- package/dist/generateTypeFiles.js.flow +75 -35
- package/dist/generateTypeFiles.js.map +1 -1
- package/dist/index.js +48 -6
- package/dist/index.js.flow +54 -4
- package/dist/index.js.map +1 -1
- package/dist/parser/parse.js +27 -17
- package/dist/parser/parse.js.map +1 -1
- package/dist/types.js.flow +6 -0
- package/package.json +1 -1
- package/src/__test__/example-schema.graphql +1 -1
- package/src/__test__/generateTypeFileContents.test.js +61 -0
- package/src/__test__/graphql-flow.test.js +243 -32
- package/src/cli/config.js +3 -0
- package/src/cli/run.js +18 -14
- package/src/generateResponseType.js +223 -65
- package/src/generateTypeFiles.js +75 -35
- package/src/index.js +54 -4
- package/src/types.js +6 -0
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
FieldNode,
|
|
8
8
|
IntrospectionOutputTypeRef,
|
|
9
9
|
OperationDefinitionNode,
|
|
10
|
+
FragmentDefinitionNode,
|
|
10
11
|
} from 'graphql';
|
|
11
12
|
import type {Config, Schema, Selections} from './types';
|
|
12
13
|
import {
|
|
@@ -21,7 +22,7 @@ import type {
|
|
|
21
22
|
IntrospectionObjectType,
|
|
22
23
|
IntrospectionUnionType,
|
|
23
24
|
} from 'graphql/utilities/introspectionQuery';
|
|
24
|
-
import
|
|
25
|
+
import {
|
|
25
26
|
BabelNodeObjectTypeProperty,
|
|
26
27
|
BabelNodeObjectTypeSpreadProperty,
|
|
27
28
|
} from '@babel/types';
|
|
@@ -43,6 +44,77 @@ export const generateResponseType = (
|
|
|
43
44
|
return generate(ast).code;
|
|
44
45
|
};
|
|
45
46
|
|
|
47
|
+
const sortedObjectTypeAnnotation = (
|
|
48
|
+
config: Config,
|
|
49
|
+
properties: Array<
|
|
50
|
+
BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,
|
|
51
|
+
>,
|
|
52
|
+
) => {
|
|
53
|
+
const obj = babelTypes.objectTypeAnnotation(
|
|
54
|
+
properties.sort((a, b) => {
|
|
55
|
+
if (
|
|
56
|
+
a.type === 'ObjectTypeProperty' &&
|
|
57
|
+
b.type === 'ObjectTypeProperty'
|
|
58
|
+
) {
|
|
59
|
+
const aName = a.key.type === 'Identifier' ? a.key.name : '';
|
|
60
|
+
const bName = b.key.type === 'Identifier' ? b.key.name : '';
|
|
61
|
+
return aName < bName ? -1 : 1;
|
|
62
|
+
}
|
|
63
|
+
return 0;
|
|
64
|
+
}),
|
|
65
|
+
undefined /* indexers */,
|
|
66
|
+
undefined /* callProperties */,
|
|
67
|
+
undefined /* internalSlots */,
|
|
68
|
+
true /* exact */,
|
|
69
|
+
);
|
|
70
|
+
const name = config.path.join('_');
|
|
71
|
+
const isTopLevelType = config.path.length <= 1;
|
|
72
|
+
if (config.allObjectTypes != null && !isTopLevelType) {
|
|
73
|
+
config.allObjectTypes[name] = obj;
|
|
74
|
+
return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));
|
|
75
|
+
} else {
|
|
76
|
+
return obj;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const generateFragmentType = (
|
|
81
|
+
schema: Schema,
|
|
82
|
+
fragment: FragmentDefinitionNode,
|
|
83
|
+
config: Config,
|
|
84
|
+
): string => {
|
|
85
|
+
const onType = fragment.typeCondition.name.value;
|
|
86
|
+
let ast;
|
|
87
|
+
|
|
88
|
+
if (schema.typesByName[onType]) {
|
|
89
|
+
ast = sortedObjectTypeAnnotation(
|
|
90
|
+
config,
|
|
91
|
+
objectPropertiesToFlow(
|
|
92
|
+
config,
|
|
93
|
+
schema.typesByName[onType],
|
|
94
|
+
onType,
|
|
95
|
+
fragment.selectionSet.selections,
|
|
96
|
+
),
|
|
97
|
+
);
|
|
98
|
+
} else if (schema.interfacesByName[onType]) {
|
|
99
|
+
ast = unionOrInterfaceToFlow(
|
|
100
|
+
config,
|
|
101
|
+
config.schema.interfacesByName[onType],
|
|
102
|
+
fragment.selectionSet.selections,
|
|
103
|
+
);
|
|
104
|
+
} else if (schema.unionsByName[onType]) {
|
|
105
|
+
ast = unionOrInterfaceToFlow(
|
|
106
|
+
config,
|
|
107
|
+
config.schema.unionsByName[onType],
|
|
108
|
+
fragment.selectionSet.selections,
|
|
109
|
+
);
|
|
110
|
+
} else {
|
|
111
|
+
throw new Error(`Unknown ${onType}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
115
|
+
return generate(ast).code;
|
|
116
|
+
};
|
|
117
|
+
|
|
46
118
|
const _typeToFlow = (
|
|
47
119
|
config: Config,
|
|
48
120
|
type,
|
|
@@ -132,35 +204,45 @@ export const typeToFlow = (
|
|
|
132
204
|
return transferLeadingComments(inner, result);
|
|
133
205
|
};
|
|
134
206
|
|
|
207
|
+
const ensureOnlyOneTypenameProperty = (properties) => {
|
|
208
|
+
let seenTypeName: false | string = false;
|
|
209
|
+
return properties.filter((type) => {
|
|
210
|
+
// The apollo-utilities "addTypeName" utility will add it
|
|
211
|
+
// even if it's already specified :( so we have to filter out
|
|
212
|
+
// the extra one here.
|
|
213
|
+
if (
|
|
214
|
+
type.type === 'ObjectTypeProperty' &&
|
|
215
|
+
type.key.name === '__typename'
|
|
216
|
+
) {
|
|
217
|
+
const name =
|
|
218
|
+
type.value.type === 'StringLiteralTypeAnnotation'
|
|
219
|
+
? type.value.value
|
|
220
|
+
: 'INVALID';
|
|
221
|
+
if (seenTypeName) {
|
|
222
|
+
if (name !== seenTypeName) {
|
|
223
|
+
throw new Error(
|
|
224
|
+
`Got two different type names ${name}, ${seenTypeName}`,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
seenTypeName = name;
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
|
|
135
235
|
const querySelectionToObjectType = (
|
|
136
236
|
config: Config,
|
|
137
237
|
selections,
|
|
138
238
|
type,
|
|
139
239
|
typeName: string,
|
|
140
240
|
): BabelNodeFlowType => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(type
|
|
145
|
-
// The apollo-utilities "addTypeName" utility will add it
|
|
146
|
-
// even if it's already specified :( so we have to filter out
|
|
147
|
-
// the extra one here.
|
|
148
|
-
if (
|
|
149
|
-
type.type === 'ObjectTypeProperty' &&
|
|
150
|
-
type.key.name === '__typename'
|
|
151
|
-
) {
|
|
152
|
-
if (seenTypeName) {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
seenTypeName = true;
|
|
156
|
-
}
|
|
157
|
-
return true;
|
|
158
|
-
},
|
|
241
|
+
return sortedObjectTypeAnnotation(
|
|
242
|
+
config,
|
|
243
|
+
ensureOnlyOneTypenameProperty(
|
|
244
|
+
objectPropertiesToFlow(config, type, typeName, selections),
|
|
159
245
|
),
|
|
160
|
-
undefined /* indexers */,
|
|
161
|
-
undefined /* callProperties */,
|
|
162
|
-
undefined /* internalSlots */,
|
|
163
|
-
true /* exact */,
|
|
164
246
|
);
|
|
165
247
|
};
|
|
166
248
|
|
|
@@ -178,6 +260,9 @@ export const objectPropertiesToFlow = (
|
|
|
178
260
|
case 'InlineFragment': {
|
|
179
261
|
const newTypeName =
|
|
180
262
|
selection.typeCondition?.name.value ?? typeName;
|
|
263
|
+
if (newTypeName !== typeName) {
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
181
266
|
return objectPropertiesToFlow(
|
|
182
267
|
config,
|
|
183
268
|
config.schema.typesByName[newTypeName],
|
|
@@ -245,7 +330,10 @@ export const objectPropertiesToFlow = (
|
|
|
245
330
|
babelTypes.objectTypeProperty(
|
|
246
331
|
babelTypes.identifier(alias),
|
|
247
332
|
typeToFlow(
|
|
248
|
-
|
|
333
|
+
{
|
|
334
|
+
...config,
|
|
335
|
+
path: config.path.concat([alias]),
|
|
336
|
+
},
|
|
249
337
|
typeField.type,
|
|
250
338
|
selection,
|
|
251
339
|
),
|
|
@@ -274,54 +362,117 @@ export const unionOrInterfaceToFlow = (
|
|
|
274
362
|
}),
|
|
275
363
|
selections: Selections,
|
|
276
364
|
): BabelNodeFlowType => {
|
|
277
|
-
const selectedAttributes: Array<
|
|
278
|
-
Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty>,
|
|
279
|
-
> = type.possibleTypes.map((possible) => {
|
|
280
|
-
let seenTypeName = false;
|
|
281
|
-
return selections
|
|
282
|
-
.map((selection) =>
|
|
283
|
-
unionOrInterfaceSelection(config, type, possible, selection),
|
|
284
|
-
)
|
|
285
|
-
.flat()
|
|
286
|
-
.filter((type) => {
|
|
287
|
-
// The apollo-utilities "addTypeName" utility will add it
|
|
288
|
-
// even if it's already specified :( so we have to filter out
|
|
289
|
-
// the extra one here.
|
|
290
|
-
if (
|
|
291
|
-
type.type === 'ObjectTypeProperty' &&
|
|
292
|
-
type.key.name === '__typename'
|
|
293
|
-
) {
|
|
294
|
-
if (seenTypeName) {
|
|
295
|
-
return false;
|
|
296
|
-
}
|
|
297
|
-
seenTypeName = true;
|
|
298
|
-
}
|
|
299
|
-
return true;
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
365
|
const allFields = selections.every(
|
|
303
366
|
(selection) => selection.kind === 'Field',
|
|
304
367
|
);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
368
|
+
const selectedAttributes: Array<{
|
|
369
|
+
attributes: Array<
|
|
370
|
+
BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,
|
|
371
|
+
>,
|
|
372
|
+
typeName: string,
|
|
373
|
+
}> = type.possibleTypes
|
|
374
|
+
.slice()
|
|
375
|
+
.sort((a, b) => {
|
|
376
|
+
return a.name < b.name ? -1 : 1;
|
|
377
|
+
})
|
|
378
|
+
.map((possible) => {
|
|
379
|
+
const configWithUpdatedPath = {
|
|
380
|
+
...config,
|
|
381
|
+
path: allFields
|
|
382
|
+
? config.path
|
|
383
|
+
: config.path.concat([possible.name]),
|
|
384
|
+
};
|
|
385
|
+
return {
|
|
386
|
+
typeName: possible.name,
|
|
387
|
+
attributes: ensureOnlyOneTypenameProperty(
|
|
388
|
+
selections
|
|
389
|
+
.map((selection) =>
|
|
390
|
+
unionOrInterfaceSelection(
|
|
391
|
+
configWithUpdatedPath,
|
|
392
|
+
type,
|
|
393
|
+
possible,
|
|
394
|
+
selection,
|
|
395
|
+
),
|
|
396
|
+
)
|
|
397
|
+
.flat(),
|
|
398
|
+
),
|
|
399
|
+
};
|
|
400
|
+
});
|
|
401
|
+
// If they're all fields, the only selection that could be different is __typename
|
|
402
|
+
if (allFields) {
|
|
403
|
+
const sharedAttributes = selectedAttributes[0].attributes.slice();
|
|
404
|
+
const typeNameIndex = selectedAttributes[0].attributes.findIndex(
|
|
405
|
+
(x) =>
|
|
406
|
+
x.type === 'ObjectTypeProperty' &&
|
|
407
|
+
x.key.type === 'Identifier' &&
|
|
408
|
+
x.key.name === '__typename',
|
|
312
409
|
);
|
|
410
|
+
if (typeNameIndex !== -1) {
|
|
411
|
+
sharedAttributes[typeNameIndex] = babelTypes.objectTypeProperty(
|
|
412
|
+
babelTypes.identifier('__typename'),
|
|
413
|
+
babelTypes.unionTypeAnnotation(
|
|
414
|
+
selectedAttributes.map(
|
|
415
|
+
(attrs) =>
|
|
416
|
+
// eslint-disable-next-line flowtype-errors/uncovered
|
|
417
|
+
((attrs.attributes[
|
|
418
|
+
typeNameIndex
|
|
419
|
+
]: any): BabelNodeObjectTypeProperty).value,
|
|
420
|
+
),
|
|
421
|
+
),
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
return sortedObjectTypeAnnotation(config, sharedAttributes);
|
|
313
425
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
426
|
+
if (selectedAttributes.length === 1) {
|
|
427
|
+
return sortedObjectTypeAnnotation(
|
|
428
|
+
config,
|
|
429
|
+
selectedAttributes[0].attributes,
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* When generating the objects for the sub-options of a union, the path needs
|
|
434
|
+
* to include the name of the object type.
|
|
435
|
+
* ```
|
|
436
|
+
* query getFriend {
|
|
437
|
+
* friend {
|
|
438
|
+
* ... on Human { id }
|
|
439
|
+
* ... on Droid { arms }
|
|
440
|
+
* }
|
|
441
|
+
* }
|
|
442
|
+
* ```
|
|
443
|
+
* produces
|
|
444
|
+
* ```
|
|
445
|
+
* type getFriend = {friend: getFriend_friend_Human | getFriend_friend_Droid }
|
|
446
|
+
* type getFriend_friend_Human = {id: string}
|
|
447
|
+
* type getFriend_friend_Droid = {arms: number}
|
|
448
|
+
* ```
|
|
449
|
+
* Note that this is different from when an attribute has a plain object type.
|
|
450
|
+
* ```
|
|
451
|
+
* query getHuman {
|
|
452
|
+
* me: human(id: "me") { id }
|
|
453
|
+
* }
|
|
454
|
+
* ```
|
|
455
|
+
* produces
|
|
456
|
+
* ```
|
|
457
|
+
* type getHuman = {me: getHuman_me}
|
|
458
|
+
* type getHuman_me = {id: string}
|
|
459
|
+
* ```
|
|
460
|
+
* instead of e.g. `getHuman_me_Human`.
|
|
461
|
+
*/
|
|
462
|
+
const result = babelTypes.unionTypeAnnotation(
|
|
463
|
+
selectedAttributes.map(({typeName, attributes}) =>
|
|
464
|
+
sortedObjectTypeAnnotation(
|
|
465
|
+
{...config, path: config.path.concat([typeName])},
|
|
466
|
+
attributes,
|
|
322
467
|
),
|
|
323
468
|
),
|
|
324
469
|
);
|
|
470
|
+
const name = config.path.join('_');
|
|
471
|
+
if (config.allObjectTypes && config.path.length > 1) {
|
|
472
|
+
config.allObjectTypes[name] = result;
|
|
473
|
+
return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));
|
|
474
|
+
}
|
|
475
|
+
return result;
|
|
325
476
|
};
|
|
326
477
|
const unionOrInterfaceSelection = (
|
|
327
478
|
config,
|
|
@@ -367,13 +518,20 @@ const unionOrInterfaceSelection = (
|
|
|
367
518
|
liftLeadingPropertyComments(
|
|
368
519
|
babelTypes.objectTypeProperty(
|
|
369
520
|
babelTypes.identifier(alias),
|
|
370
|
-
typeToFlow(
|
|
521
|
+
typeToFlow(
|
|
522
|
+
{...config, path: config.path.concat([name])},
|
|
523
|
+
typeField.type,
|
|
524
|
+
selection,
|
|
525
|
+
),
|
|
371
526
|
),
|
|
372
527
|
),
|
|
373
528
|
];
|
|
374
529
|
}
|
|
375
530
|
if (selection.kind === 'FragmentSpread') {
|
|
376
531
|
const fragment = config.fragments[selection.name.value];
|
|
532
|
+
if (!fragment) {
|
|
533
|
+
throw new Error(`Unknown fragment ${selection.name.value}`);
|
|
534
|
+
}
|
|
377
535
|
const typeName = fragment.typeCondition.name.value;
|
|
378
536
|
if (
|
|
379
537
|
(config.schema.interfacesByName[typeName] &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generateResponseType.js"],"names":["generateResponseType","schema","query","config","ast","querySelectionToObjectType","selectionSet","selections","operation","typesByName","Mutation","Query","code","_typeToFlow","type","selection","kind","name","babelTypes","genericTypeAnnotation","readOnlyArray","identifier","typeParameterInstantiation","typeToFlow","ofType","union","unionsByName","console","log","anyTypeAnnotation","unionOrInterfaceToFlow","interfacesByName","tname","childType","description","strictNullability","inner","result","nullableTypeAnnotation","typeName","seenTypeName","objectTypeAnnotation","objectPropertiesToFlow","filter","key","undefined","concat","map","newTypeName","typeCondition","value","fragments","errors","push","objectTypeProperty","alias","stringLiteralTypeAnnotation","fieldsByName","typeField","selectedAttributes","possibleTypes","possible","unionOrInterfaceSelection","flat","allFields","every","length","unionTypeAnnotation","properties","fragment","possibleTypesByName","indirectMatch"],"mappings":"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","sourcesContent":["// @flow\n/* eslint-disable no-console */\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport * as babelTypes from '@babel/types';\nimport {type BabelNodeFlowType} from '@babel/types';\nimport type {\n FieldNode,\n IntrospectionOutputTypeRef,\n OperationDefinitionNode,\n} from 'graphql';\nimport type {Config, Schema, Selections} from './types';\nimport {\n liftLeadingPropertyComments,\n maybeAddDescriptionComment,\n transferLeadingComments,\n} from './utils';\nimport {enumTypeToFlow, scalarTypeToFlow} from './enums';\nimport type {\n IntrospectionField,\n IntrospectionInterfaceType,\n IntrospectionObjectType,\n IntrospectionUnionType,\n} from 'graphql/utilities/introspectionQuery';\nimport type {\n BabelNodeObjectTypeProperty,\n BabelNodeObjectTypeSpreadProperty,\n} from '@babel/types';\n\nexport const generateResponseType = (\n schema: Schema,\n query: OperationDefinitionNode,\n config: Config,\n): string => {\n const ast = querySelectionToObjectType(\n config,\n query.selectionSet.selections,\n query.operation === 'mutation'\n ? schema.typesByName.Mutation\n : schema.typesByName.Query,\n query.operation === 'mutation' ? 'mutation' : 'query',\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst _typeToFlow = (\n config: Config,\n type,\n selection,\n): babelTypes.BabelNodeFlowType => {\n if (type.kind === 'SCALAR') {\n return scalarTypeToFlow(config, type.name);\n }\n if (type.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n config.readOnlyArray\n ? babelTypes.identifier('$ReadOnlyArray')\n : babelTypes.identifier('Array'),\n babelTypes.typeParameterInstantiation([\n typeToFlow(config, type.ofType, selection),\n ]),\n );\n }\n if (type.kind === 'UNION') {\n const union = config.schema.unionsByName[type.name];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n union,\n selection.selectionSet.selections,\n );\n }\n\n if (type.kind === 'INTERFACE') {\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[type.name],\n selection.selectionSet.selections,\n );\n }\n if (type.kind === 'ENUM') {\n return enumTypeToFlow(config, type.name);\n }\n if (type.kind !== 'OBJECT') {\n console.log('not object', type);\n return babelTypes.anyTypeAnnotation();\n }\n\n const tname = type.name;\n if (!config.schema.typesByName[tname]) {\n console.log('unknown referenced type', tname);\n return babelTypes.anyTypeAnnotation();\n }\n const childType = config.schema.typesByName[tname];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return maybeAddDescriptionComment(\n childType.description,\n querySelectionToObjectType(\n config,\n selection.selectionSet.selections,\n childType,\n tname,\n ),\n );\n};\n\nexport const typeToFlow = (\n config: Config,\n type: IntrospectionOutputTypeRef,\n selection: FieldNode,\n): babelTypes.BabelNodeFlowType => {\n // throw new Error('npoe');\n if (type.kind === 'NON_NULL') {\n return _typeToFlow(config, type.ofType, selection);\n }\n // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null\n if (!config.strictNullability) {\n return _typeToFlow(config, type, selection);\n }\n const inner = _typeToFlow(config, type, selection);\n const result = babelTypes.nullableTypeAnnotation(inner);\n return transferLeadingComments(inner, result);\n};\n\nconst querySelectionToObjectType = (\n config: Config,\n selections,\n type,\n typeName: string,\n): BabelNodeFlowType => {\n let seenTypeName = false;\n return babelTypes.objectTypeAnnotation(\n objectPropertiesToFlow(config, type, typeName, selections).filter(\n (type) => {\n // The apollo-utilities \"addTypeName\" utility will add it\n // even if it's already specified :( so we have to filter out\n // the extra one here.\n if (\n type.type === 'ObjectTypeProperty' &&\n type.key.name === '__typename'\n ) {\n if (seenTypeName) {\n return false;\n }\n seenTypeName = true;\n }\n return true;\n },\n ),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n};\n\nexport const objectPropertiesToFlow = (\n config: Config,\n type: IntrospectionObjectType & {\n fieldsByName: {[name: string]: IntrospectionField},\n },\n typeName: string,\n selections: Selections,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n return [].concat(\n ...selections.map((selection) => {\n switch (selection.kind) {\n case 'InlineFragment': {\n const newTypeName =\n selection.typeCondition?.name.value ?? typeName;\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[newTypeName],\n newTypeName,\n selection.selectionSet.selections,\n );\n }\n case 'FragmentSpread':\n if (!config.fragments[selection.name.value]) {\n config.errors.push(\n `No fragment named '${selection.name.value}'. Did you forget to include it in the template literal?`,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(selection.name.value),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FRAGMENT`),\n ),\n ),\n ];\n }\n\n return objectPropertiesToFlow(\n config,\n type,\n typeName,\n config.fragments[selection.name.value].selectionSet\n .selections,\n );\n\n case 'Field':\n const name = selection.name.value;\n const alias: string = selection.alias\n ? selection.alias.value\n : name;\n if (name === '__typename') {\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(\n typeName,\n ),\n ),\n ];\n }\n if (!type.fieldsByName[name]) {\n config.errors.push(\n `Unknown field '${name}' for type '${typeName}'`,\n );\n return babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(\n `UNKNOWN_FIELD[\"${name}\"]`,\n ),\n ),\n );\n }\n const typeField = type.fieldsByName[name];\n\n return [\n maybeAddDescriptionComment(\n typeField.description,\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n config,\n typeField.type,\n selection,\n ),\n ),\n ),\n ),\n ];\n\n default:\n config.errors.push(\n // eslint-disable-next-line flowtype-errors/uncovered\n `Unsupported selection kind '${selection.kind}'`,\n );\n return [];\n }\n }),\n );\n};\n\nexport const unionOrInterfaceToFlow = (\n config: Config,\n type:\n | IntrospectionUnionType\n | (IntrospectionInterfaceType & {\n fieldsByName: {[key: string]: IntrospectionField},\n }),\n selections: Selections,\n): BabelNodeFlowType => {\n const selectedAttributes: Array<\n Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty>,\n > = type.possibleTypes.map((possible) => {\n let seenTypeName = false;\n return selections\n .map((selection) =>\n unionOrInterfaceSelection(config, type, possible, selection),\n )\n .flat()\n .filter((type) => {\n // The apollo-utilities \"addTypeName\" utility will add it\n // even if it's already specified :( so we have to filter out\n // the extra one here.\n if (\n type.type === 'ObjectTypeProperty' &&\n type.key.name === '__typename'\n ) {\n if (seenTypeName) {\n return false;\n }\n seenTypeName = true;\n }\n return true;\n });\n });\n const allFields = selections.every(\n (selection) => selection.kind === 'Field',\n );\n if (selectedAttributes.length === 1 || allFields) {\n return babelTypes.objectTypeAnnotation(\n selectedAttributes[0],\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n }\n return babelTypes.unionTypeAnnotation(\n selectedAttributes.map((properties) =>\n babelTypes.objectTypeAnnotation(\n properties,\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n ),\n ),\n );\n};\nconst unionOrInterfaceSelection = (\n config,\n type,\n possible,\n selection,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n if (selection.kind === 'Field' && selection.name.value === '__typename') {\n const alias = selection.alias\n ? selection.alias.value\n : selection.name.value;\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(possible.name),\n ),\n ];\n }\n if (selection.kind === 'Field' && type.kind !== 'UNION') {\n // this is an interface\n const name = selection.name.value;\n const alias = selection.alias ? selection.alias.value : name;\n if (!type.fieldsByName[name]) {\n config.errors.push(\n 'Unknown field: ' +\n name +\n ' on type ' +\n type.name +\n ' for possible ' +\n possible.name,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FIELD`),\n ),\n ),\n ];\n }\n const typeField = type.fieldsByName[name];\n return [\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(config, typeField.type, selection),\n ),\n ),\n ];\n }\n if (selection.kind === 'FragmentSpread') {\n const fragment = config.fragments[selection.name.value];\n const typeName = fragment.typeCondition.name.value;\n if (\n (config.schema.interfacesByName[typeName] &&\n config.schema.interfacesByName[typeName].possibleTypesByName[\n possible.name\n ]) ||\n typeName === possible.name\n ) {\n return [].concat(\n ...fragment.selectionSet.selections.map((selection) =>\n unionOrInterfaceSelection(\n config,\n config.schema.typesByName[possible.name],\n possible,\n selection,\n ),\n ),\n );\n } else {\n return [];\n }\n }\n if (selection.kind !== 'InlineFragment') {\n config.errors.push(\n `union selectors must be inline fragment: found ${selection.kind}`,\n );\n if (type.kind === 'UNION') {\n config.errors\n .push(`You're trying to select a field from the union ${type.name},\nbut the only field you're allowed to select is \"__typename\".\nTry using an inline fragment \"... on SomeType {}\".`);\n }\n return [];\n }\n if (selection.typeCondition) {\n const typeName = selection.typeCondition.name.value;\n const indirectMatch =\n config.schema.interfacesByName[typeName]?.possibleTypesByName[\n possible.name\n ];\n if (typeName !== possible.name && !indirectMatch) {\n return [];\n }\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[possible.name],\n possible.name,\n selection.selectionSet.selections,\n );\n};\n"],"file":"generateResponseType.js"}
|
|
1
|
+
{"version":3,"sources":["../src/generateResponseType.js"],"names":["generateResponseType","schema","query","config","ast","querySelectionToObjectType","selectionSet","selections","operation","typesByName","Mutation","Query","code","sortedObjectTypeAnnotation","properties","obj","babelTypes","objectTypeAnnotation","sort","a","b","type","aName","key","name","bName","undefined","path","join","isTopLevelType","length","allObjectTypes","genericTypeAnnotation","identifier","generateFragmentType","fragment","onType","typeCondition","value","objectPropertiesToFlow","interfacesByName","unionOrInterfaceToFlow","unionsByName","Error","_typeToFlow","selection","kind","readOnlyArray","typeParameterInstantiation","typeToFlow","ofType","union","console","log","anyTypeAnnotation","tname","childType","description","strictNullability","inner","result","nullableTypeAnnotation","ensureOnlyOneTypenameProperty","seenTypeName","filter","typeName","concat","map","newTypeName","fragments","errors","push","objectTypeProperty","alias","stringLiteralTypeAnnotation","fieldsByName","typeField","allFields","every","selectedAttributes","possibleTypes","slice","possible","configWithUpdatedPath","attributes","unionOrInterfaceSelection","flat","sharedAttributes","typeNameIndex","findIndex","x","unionTypeAnnotation","attrs","possibleTypesByName","indirectMatch"],"mappings":"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","sourcesContent":["// @flow\n/* eslint-disable no-console */\nimport generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered\nimport * as babelTypes from '@babel/types';\nimport {type BabelNodeFlowType} from '@babel/types';\nimport type {\n FieldNode,\n IntrospectionOutputTypeRef,\n OperationDefinitionNode,\n FragmentDefinitionNode,\n} from 'graphql';\nimport type {Config, Schema, Selections} from './types';\nimport {\n liftLeadingPropertyComments,\n maybeAddDescriptionComment,\n transferLeadingComments,\n} from './utils';\nimport {enumTypeToFlow, scalarTypeToFlow} from './enums';\nimport type {\n IntrospectionField,\n IntrospectionInterfaceType,\n IntrospectionObjectType,\n IntrospectionUnionType,\n} from 'graphql/utilities/introspectionQuery';\nimport {\n BabelNodeObjectTypeProperty,\n BabelNodeObjectTypeSpreadProperty,\n} from '@babel/types';\n\nexport const generateResponseType = (\n schema: Schema,\n query: OperationDefinitionNode,\n config: Config,\n): string => {\n const ast = querySelectionToObjectType(\n config,\n query.selectionSet.selections,\n query.operation === 'mutation'\n ? schema.typesByName.Mutation\n : schema.typesByName.Query,\n query.operation === 'mutation' ? 'mutation' : 'query',\n );\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst sortedObjectTypeAnnotation = (\n config: Config,\n properties: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n) => {\n const obj = babelTypes.objectTypeAnnotation(\n properties.sort((a, b) => {\n if (\n a.type === 'ObjectTypeProperty' &&\n b.type === 'ObjectTypeProperty'\n ) {\n const aName = a.key.type === 'Identifier' ? a.key.name : '';\n const bName = b.key.type === 'Identifier' ? b.key.name : '';\n return aName < bName ? -1 : 1;\n }\n return 0;\n }),\n undefined /* indexers */,\n undefined /* callProperties */,\n undefined /* internalSlots */,\n true /* exact */,\n );\n const name = config.path.join('_');\n const isTopLevelType = config.path.length <= 1;\n if (config.allObjectTypes != null && !isTopLevelType) {\n config.allObjectTypes[name] = obj;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n } else {\n return obj;\n }\n};\n\nexport const generateFragmentType = (\n schema: Schema,\n fragment: FragmentDefinitionNode,\n config: Config,\n): string => {\n const onType = fragment.typeCondition.name.value;\n let ast;\n\n if (schema.typesByName[onType]) {\n ast = sortedObjectTypeAnnotation(\n config,\n objectPropertiesToFlow(\n config,\n schema.typesByName[onType],\n onType,\n fragment.selectionSet.selections,\n ),\n );\n } else if (schema.interfacesByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[onType],\n fragment.selectionSet.selections,\n );\n } else if (schema.unionsByName[onType]) {\n ast = unionOrInterfaceToFlow(\n config,\n config.schema.unionsByName[onType],\n fragment.selectionSet.selections,\n );\n } else {\n throw new Error(`Unknown ${onType}`);\n }\n\n // eslint-disable-next-line flowtype-errors/uncovered\n return generate(ast).code;\n};\n\nconst _typeToFlow = (\n config: Config,\n type,\n selection,\n): babelTypes.BabelNodeFlowType => {\n if (type.kind === 'SCALAR') {\n return scalarTypeToFlow(config, type.name);\n }\n if (type.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n config.readOnlyArray\n ? babelTypes.identifier('$ReadOnlyArray')\n : babelTypes.identifier('Array'),\n babelTypes.typeParameterInstantiation([\n typeToFlow(config, type.ofType, selection),\n ]),\n );\n }\n if (type.kind === 'UNION') {\n const union = config.schema.unionsByName[type.name];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n union,\n selection.selectionSet.selections,\n );\n }\n\n if (type.kind === 'INTERFACE') {\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n config,\n config.schema.interfacesByName[type.name],\n selection.selectionSet.selections,\n );\n }\n if (type.kind === 'ENUM') {\n return enumTypeToFlow(config, type.name);\n }\n if (type.kind !== 'OBJECT') {\n console.log('not object', type);\n return babelTypes.anyTypeAnnotation();\n }\n\n const tname = type.name;\n if (!config.schema.typesByName[tname]) {\n console.log('unknown referenced type', tname);\n return babelTypes.anyTypeAnnotation();\n }\n const childType = config.schema.typesByName[tname];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return maybeAddDescriptionComment(\n childType.description,\n querySelectionToObjectType(\n config,\n selection.selectionSet.selections,\n childType,\n tname,\n ),\n );\n};\n\nexport const typeToFlow = (\n config: Config,\n type: IntrospectionOutputTypeRef,\n selection: FieldNode,\n): babelTypes.BabelNodeFlowType => {\n // throw new Error('npoe');\n if (type.kind === 'NON_NULL') {\n return _typeToFlow(config, type.ofType, selection);\n }\n // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null\n if (!config.strictNullability) {\n return _typeToFlow(config, type, selection);\n }\n const inner = _typeToFlow(config, type, selection);\n const result = babelTypes.nullableTypeAnnotation(inner);\n return transferLeadingComments(inner, result);\n};\n\nconst ensureOnlyOneTypenameProperty = (properties) => {\n let seenTypeName: false | string = false;\n return properties.filter((type) => {\n // The apollo-utilities \"addTypeName\" utility will add it\n // even if it's already specified :( so we have to filter out\n // the extra one here.\n if (\n type.type === 'ObjectTypeProperty' &&\n type.key.name === '__typename'\n ) {\n const name =\n type.value.type === 'StringLiteralTypeAnnotation'\n ? type.value.value\n : 'INVALID';\n if (seenTypeName) {\n if (name !== seenTypeName) {\n throw new Error(\n `Got two different type names ${name}, ${seenTypeName}`,\n );\n }\n return false;\n }\n seenTypeName = name;\n }\n return true;\n });\n};\n\nconst querySelectionToObjectType = (\n config: Config,\n selections,\n type,\n typeName: string,\n): BabelNodeFlowType => {\n return sortedObjectTypeAnnotation(\n config,\n ensureOnlyOneTypenameProperty(\n objectPropertiesToFlow(config, type, typeName, selections),\n ),\n );\n};\n\nexport const objectPropertiesToFlow = (\n config: Config,\n type: IntrospectionObjectType & {\n fieldsByName: {[name: string]: IntrospectionField},\n },\n typeName: string,\n selections: Selections,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n return [].concat(\n ...selections.map((selection) => {\n switch (selection.kind) {\n case 'InlineFragment': {\n const newTypeName =\n selection.typeCondition?.name.value ?? typeName;\n if (newTypeName !== typeName) {\n return [];\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[newTypeName],\n newTypeName,\n selection.selectionSet.selections,\n );\n }\n case 'FragmentSpread':\n if (!config.fragments[selection.name.value]) {\n config.errors.push(\n `No fragment named '${selection.name.value}'. Did you forget to include it in the template literal?`,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(selection.name.value),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FRAGMENT`),\n ),\n ),\n ];\n }\n\n return objectPropertiesToFlow(\n config,\n type,\n typeName,\n config.fragments[selection.name.value].selectionSet\n .selections,\n );\n\n case 'Field':\n const name = selection.name.value;\n const alias: string = selection.alias\n ? selection.alias.value\n : name;\n if (name === '__typename') {\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(\n typeName,\n ),\n ),\n ];\n }\n if (!type.fieldsByName[name]) {\n config.errors.push(\n `Unknown field '${name}' for type '${typeName}'`,\n );\n return babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(\n `UNKNOWN_FIELD[\"${name}\"]`,\n ),\n ),\n );\n }\n const typeField = type.fieldsByName[name];\n\n return [\n maybeAddDescriptionComment(\n typeField.description,\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {\n ...config,\n path: config.path.concat([alias]),\n },\n typeField.type,\n selection,\n ),\n ),\n ),\n ),\n ];\n\n default:\n config.errors.push(\n // eslint-disable-next-line flowtype-errors/uncovered\n `Unsupported selection kind '${selection.kind}'`,\n );\n return [];\n }\n }),\n );\n};\n\nexport const unionOrInterfaceToFlow = (\n config: Config,\n type:\n | IntrospectionUnionType\n | (IntrospectionInterfaceType & {\n fieldsByName: {[key: string]: IntrospectionField},\n }),\n selections: Selections,\n): BabelNodeFlowType => {\n const allFields = selections.every(\n (selection) => selection.kind === 'Field',\n );\n const selectedAttributes: Array<{\n attributes: Array<\n BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty,\n >,\n typeName: string,\n }> = type.possibleTypes\n .slice()\n .sort((a, b) => {\n return a.name < b.name ? -1 : 1;\n })\n .map((possible) => {\n const configWithUpdatedPath = {\n ...config,\n path: allFields\n ? config.path\n : config.path.concat([possible.name]),\n };\n return {\n typeName: possible.name,\n attributes: ensureOnlyOneTypenameProperty(\n selections\n .map((selection) =>\n unionOrInterfaceSelection(\n configWithUpdatedPath,\n type,\n possible,\n selection,\n ),\n )\n .flat(),\n ),\n };\n });\n // If they're all fields, the only selection that could be different is __typename\n if (allFields) {\n const sharedAttributes = selectedAttributes[0].attributes.slice();\n const typeNameIndex = selectedAttributes[0].attributes.findIndex(\n (x) =>\n x.type === 'ObjectTypeProperty' &&\n x.key.type === 'Identifier' &&\n x.key.name === '__typename',\n );\n if (typeNameIndex !== -1) {\n sharedAttributes[typeNameIndex] = babelTypes.objectTypeProperty(\n babelTypes.identifier('__typename'),\n babelTypes.unionTypeAnnotation(\n selectedAttributes.map(\n (attrs) =>\n // eslint-disable-next-line flowtype-errors/uncovered\n ((attrs.attributes[\n typeNameIndex\n ]: any): BabelNodeObjectTypeProperty).value,\n ),\n ),\n );\n }\n return sortedObjectTypeAnnotation(config, sharedAttributes);\n }\n if (selectedAttributes.length === 1) {\n return sortedObjectTypeAnnotation(\n config,\n selectedAttributes[0].attributes,\n );\n }\n /**\n * When generating the objects for the sub-options of a union, the path needs\n * to include the name of the object type.\n * ```\n * query getFriend {\n * friend {\n * ... on Human { id }\n * ... on Droid { arms }\n * }\n * }\n * ```\n * produces\n * ```\n * type getFriend = {friend: getFriend_friend_Human | getFriend_friend_Droid }\n * type getFriend_friend_Human = {id: string}\n * type getFriend_friend_Droid = {arms: number}\n * ```\n * Note that this is different from when an attribute has a plain object type.\n * ```\n * query getHuman {\n * me: human(id: \"me\") { id }\n * }\n * ```\n * produces\n * ```\n * type getHuman = {me: getHuman_me}\n * type getHuman_me = {id: string}\n * ```\n * instead of e.g. `getHuman_me_Human`.\n */\n const result = babelTypes.unionTypeAnnotation(\n selectedAttributes.map(({typeName, attributes}) =>\n sortedObjectTypeAnnotation(\n {...config, path: config.path.concat([typeName])},\n attributes,\n ),\n ),\n );\n const name = config.path.join('_');\n if (config.allObjectTypes && config.path.length > 1) {\n config.allObjectTypes[name] = result;\n return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));\n }\n return result;\n};\nconst unionOrInterfaceSelection = (\n config,\n type,\n possible,\n selection,\n): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {\n if (selection.kind === 'Field' && selection.name.value === '__typename') {\n const alias = selection.alias\n ? selection.alias.value\n : selection.name.value;\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.stringLiteralTypeAnnotation(possible.name),\n ),\n ];\n }\n if (selection.kind === 'Field' && type.kind !== 'UNION') {\n // this is an interface\n const name = selection.name.value;\n const alias = selection.alias ? selection.alias.value : name;\n if (!type.fieldsByName[name]) {\n config.errors.push(\n 'Unknown field: ' +\n name +\n ' on type ' +\n type.name +\n ' for possible ' +\n possible.name,\n );\n return [\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n babelTypes.genericTypeAnnotation(\n babelTypes.identifier(`UNKNOWN_FIELD`),\n ),\n ),\n ];\n }\n const typeField = type.fieldsByName[name];\n return [\n liftLeadingPropertyComments(\n babelTypes.objectTypeProperty(\n babelTypes.identifier(alias),\n typeToFlow(\n {...config, path: config.path.concat([name])},\n typeField.type,\n selection,\n ),\n ),\n ),\n ];\n }\n if (selection.kind === 'FragmentSpread') {\n const fragment = config.fragments[selection.name.value];\n if (!fragment) {\n throw new Error(`Unknown fragment ${selection.name.value}`);\n }\n const typeName = fragment.typeCondition.name.value;\n if (\n (config.schema.interfacesByName[typeName] &&\n config.schema.interfacesByName[typeName].possibleTypesByName[\n possible.name\n ]) ||\n typeName === possible.name\n ) {\n return [].concat(\n ...fragment.selectionSet.selections.map((selection) =>\n unionOrInterfaceSelection(\n config,\n config.schema.typesByName[possible.name],\n possible,\n selection,\n ),\n ),\n );\n } else {\n return [];\n }\n }\n if (selection.kind !== 'InlineFragment') {\n config.errors.push(\n `union selectors must be inline fragment: found ${selection.kind}`,\n );\n if (type.kind === 'UNION') {\n config.errors\n .push(`You're trying to select a field from the union ${type.name},\nbut the only field you're allowed to select is \"__typename\".\nTry using an inline fragment \"... on SomeType {}\".`);\n }\n return [];\n }\n if (selection.typeCondition) {\n const typeName = selection.typeCondition.name.value;\n const indirectMatch =\n config.schema.interfacesByName[typeName]?.possibleTypesByName[\n possible.name\n ];\n if (typeName !== possible.name && !indirectMatch) {\n return [];\n }\n }\n return objectPropertiesToFlow(\n config,\n config.schema.typesByName[possible.name],\n possible.name,\n selection.selectionSet.selections,\n );\n};\n"],"file":"generateResponseType.js"}
|