@khanacademy/graphql-flow 1.2.0 → 2.0.0

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.
Files changed (78) hide show
  1. package/.babelrc +1 -1
  2. package/.eslintrc.js +0 -1
  3. package/.github/workflows/changeset-release.yml +1 -1
  4. package/CHANGELOG.md +10 -0
  5. package/dist/cli/config.js +2 -4
  6. package/dist/cli/run.js +1 -2
  7. package/dist/enums.js +8 -9
  8. package/dist/generateResponseType.js +33 -41
  9. package/dist/generateTypeFiles.js +9 -23
  10. package/dist/generateVariablesType.js +15 -31
  11. package/dist/index.js +8 -15
  12. package/dist/parser/parse.js +6 -7
  13. package/dist/parser/resolve.js +1 -2
  14. package/dist/parser/utils.js +1 -2
  15. package/dist/schemaFromIntrospectionData.js +1 -2
  16. package/dist/types.js +1 -2
  17. package/dist/utils.js +43 -3
  18. package/package.json +8 -7
  19. package/{dist/__test__/generateTypeFileContents.test.js → src/__test__/generateTypeFileContents.test.ts} +38 -41
  20. package/{dist/__test__/graphql-flow.test.js → src/__test__/graphql-flow.test.ts} +232 -235
  21. package/src/__test__/{processPragmas.test.js → processPragmas.test.ts} +0 -1
  22. package/{dist/cli/__test__/config.test.js → src/cli/__test__/config.test.ts} +5 -6
  23. package/{dist/cli/config.js.flow → src/cli/config.ts} +6 -11
  24. package/src/cli/{run.js → run.ts} +5 -4
  25. package/src/{enums.js → enums.ts} +20 -22
  26. package/src/{generateResponseType.js → generateResponseType.ts} +167 -182
  27. package/src/{generateTypeFiles.js → generateTypeFiles.ts} +20 -30
  28. package/src/{generateVariablesType.js → generateVariablesType.ts} +34 -44
  29. package/{dist/index.js.flow → src/index.ts} +32 -24
  30. package/{dist/parser/__test__/parse.test.js → src/parser/__test__/parse.test.ts} +12 -11
  31. package/src/parser/{parse.js → parse.ts} +65 -47
  32. package/{dist/parser/resolve.js.flow → src/parser/resolve.ts} +15 -11
  33. package/{dist/parser/utils.js.flow → src/parser/utils.ts} +0 -1
  34. package/{dist/schemaFromIntrospectionData.js.flow → src/schemaFromIntrospectionData.ts} +1 -4
  35. package/src/types.ts +97 -0
  36. package/src/utils.ts +73 -0
  37. package/tools/{find-files-with-gql.js → find-files-with-gql.ts} +2 -3
  38. package/tsconfig.json +110 -0
  39. package/types/flow-to-ts.d.ts +1 -0
  40. package/dist/__test__/example-schema.graphql +0 -67
  41. package/dist/__test__/processPragmas.test.js +0 -76
  42. package/dist/cli/config.js.map +0 -1
  43. package/dist/cli/run.js.flow +0 -236
  44. package/dist/cli/run.js.map +0 -1
  45. package/dist/enums.js.flow +0 -98
  46. package/dist/enums.js.map +0 -1
  47. package/dist/generateResponseType.js.flow +0 -583
  48. package/dist/generateResponseType.js.map +0 -1
  49. package/dist/generateTypeFiles.js.flow +0 -191
  50. package/dist/generateTypeFiles.js.map +0 -1
  51. package/dist/generateVariablesType.js.flow +0 -156
  52. package/dist/generateVariablesType.js.map +0 -1
  53. package/dist/index.js.map +0 -1
  54. package/dist/parser/parse.js.flow +0 -417
  55. package/dist/parser/parse.js.map +0 -1
  56. package/dist/parser/resolve.js.map +0 -1
  57. package/dist/parser/utils.js.map +0 -1
  58. package/dist/schemaFromIntrospectionData.js.map +0 -1
  59. package/dist/types.js.flow +0 -88
  60. package/dist/types.js.map +0 -1
  61. package/dist/utils.js.flow +0 -50
  62. package/dist/utils.js.map +0 -1
  63. package/flow-typed/npm/@babel/types_vx.x.x.js +0 -5331
  64. package/flow-typed/npm/jest_v23.x.x.js +0 -1155
  65. package/flow-typed/overrides.js +0 -435
  66. package/src/__test__/generateTypeFileContents.test.js +0 -157
  67. package/src/__test__/graphql-flow.test.js +0 -639
  68. package/src/cli/__test__/config.test.js +0 -120
  69. package/src/cli/config.js +0 -84
  70. package/src/cli/schema.json +0 -97
  71. package/src/index.js +0 -160
  72. package/src/parser/__test__/parse.test.js +0 -249
  73. package/src/parser/resolve.js +0 -119
  74. package/src/parser/utils.js +0 -25
  75. package/src/schemaFromIntrospectionData.js +0 -68
  76. package/src/types.js +0 -88
  77. package/src/utils.js +0 -50
  78. /package/{dist/cli/schema.json → schema.json} +0 -0
@@ -1,583 +0,0 @@
1
- // @flow
2
- /* eslint-disable no-console */
3
- import generate from '@babel/generator'; // eslint-disable-line flowtype-errors/uncovered
4
- import * as babelTypes from '@babel/types';
5
- import {type BabelNodeFlowType} from '@babel/types';
6
- import type {
7
- FieldNode,
8
- IntrospectionOutputTypeRef,
9
- OperationDefinitionNode,
10
- FragmentDefinitionNode,
11
- } from 'graphql';
12
- import type {Context, Schema, Selections} from './types';
13
- import {
14
- liftLeadingPropertyComments,
15
- maybeAddDescriptionComment,
16
- transferLeadingComments,
17
- } from './utils';
18
- import {enumTypeToFlow, scalarTypeToFlow} from './enums';
19
- import type {
20
- IntrospectionField,
21
- IntrospectionInterfaceType,
22
- IntrospectionObjectType,
23
- IntrospectionUnionType,
24
- } from 'graphql/utilities/introspectionQuery';
25
- import {
26
- BabelNodeObjectTypeProperty,
27
- BabelNodeObjectTypeSpreadProperty,
28
- } from '@babel/types';
29
-
30
- export const generateResponseType = (
31
- schema: Schema,
32
- query: OperationDefinitionNode,
33
- ctx: Context,
34
- ): string => {
35
- const ast = querySelectionToObjectType(
36
- ctx,
37
- query.selectionSet.selections,
38
- query.operation === 'mutation'
39
- ? schema.typesByName.Mutation
40
- : schema.typesByName.Query,
41
- query.operation === 'mutation' ? 'mutation' : 'query',
42
- );
43
- // eslint-disable-next-line flowtype-errors/uncovered
44
- return generate(ast).code;
45
- };
46
-
47
- const sortedObjectTypeAnnotation = (
48
- ctx: Context,
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 = ctx.path.join('_');
71
- const isTopLevelType = ctx.path.length <= 1;
72
- if (ctx.allObjectTypes != null && !isTopLevelType) {
73
- ctx.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
- ctx: Context,
84
- ): string => {
85
- const onType = fragment.typeCondition.name.value;
86
- let ast;
87
-
88
- if (schema.typesByName[onType]) {
89
- ast = sortedObjectTypeAnnotation(
90
- ctx,
91
- objectPropertiesToFlow(
92
- ctx,
93
- schema.typesByName[onType],
94
- onType,
95
- fragment.selectionSet.selections,
96
- ),
97
- );
98
- } else if (schema.interfacesByName[onType]) {
99
- ast = unionOrInterfaceToFlow(
100
- ctx,
101
- ctx.schema.interfacesByName[onType],
102
- fragment.selectionSet.selections,
103
- );
104
- } else if (schema.unionsByName[onType]) {
105
- ast = unionOrInterfaceToFlow(
106
- ctx,
107
- ctx.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
-
118
- const _typeToFlow = (
119
- ctx: Context,
120
- type,
121
- selection,
122
- ): babelTypes.BabelNodeFlowType => {
123
- if (type.kind === 'SCALAR') {
124
- return scalarTypeToFlow(ctx, type.name);
125
- }
126
- if (type.kind === 'LIST') {
127
- return babelTypes.genericTypeAnnotation(
128
- ctx.readOnlyArray
129
- ? babelTypes.identifier('$ReadOnlyArray')
130
- : babelTypes.identifier('Array'),
131
- babelTypes.typeParameterInstantiation([
132
- typeToFlow(ctx, type.ofType, selection),
133
- ]),
134
- );
135
- }
136
- if (type.kind === 'UNION') {
137
- const union = ctx.schema.unionsByName[type.name];
138
- if (!selection.selectionSet) {
139
- console.log('no selection set', selection);
140
- return babelTypes.anyTypeAnnotation();
141
- }
142
- return unionOrInterfaceToFlow(
143
- ctx,
144
- union,
145
- selection.selectionSet.selections,
146
- );
147
- }
148
-
149
- if (type.kind === 'INTERFACE') {
150
- if (!selection.selectionSet) {
151
- console.log('no selection set', selection);
152
- return babelTypes.anyTypeAnnotation();
153
- }
154
- return unionOrInterfaceToFlow(
155
- ctx,
156
- ctx.schema.interfacesByName[type.name],
157
- selection.selectionSet.selections,
158
- );
159
- }
160
- if (type.kind === 'ENUM') {
161
- return enumTypeToFlow(ctx, type.name);
162
- }
163
- if (type.kind !== 'OBJECT') {
164
- console.log('not object', type);
165
- return babelTypes.anyTypeAnnotation();
166
- }
167
-
168
- const tname = type.name;
169
- if (!ctx.schema.typesByName[tname]) {
170
- console.log('unknown referenced type', tname);
171
- return babelTypes.anyTypeAnnotation();
172
- }
173
- const childType = ctx.schema.typesByName[tname];
174
- if (!selection.selectionSet) {
175
- console.log('no selection set', selection);
176
- return babelTypes.anyTypeAnnotation();
177
- }
178
- return maybeAddDescriptionComment(
179
- childType.description,
180
- querySelectionToObjectType(
181
- ctx,
182
- selection.selectionSet.selections,
183
- childType,
184
- tname,
185
- ),
186
- );
187
- };
188
-
189
- export const typeToFlow = (
190
- ctx: Context,
191
- type: IntrospectionOutputTypeRef,
192
- selection: FieldNode,
193
- ): babelTypes.BabelNodeFlowType => {
194
- // throw new Error('npoe');
195
- if (type.kind === 'NON_NULL') {
196
- return _typeToFlow(ctx, type.ofType, selection);
197
- }
198
- // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null
199
- if (!ctx.strictNullability) {
200
- return _typeToFlow(ctx, type, selection);
201
- }
202
- const inner = _typeToFlow(ctx, type, selection);
203
- const result = babelTypes.nullableTypeAnnotation(inner);
204
- return transferLeadingComments(inner, result);
205
- };
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
-
235
- const querySelectionToObjectType = (
236
- ctx: Context,
237
- selections,
238
- type,
239
- typeName: string,
240
- ): BabelNodeFlowType => {
241
- return sortedObjectTypeAnnotation(
242
- ctx,
243
- ensureOnlyOneTypenameProperty(
244
- objectPropertiesToFlow(ctx, type, typeName, selections),
245
- ),
246
- );
247
- };
248
-
249
- export const objectPropertiesToFlow = (
250
- ctx: Context,
251
- type: IntrospectionObjectType & {
252
- fieldsByName: {[name: string]: IntrospectionField},
253
- },
254
- typeName: string,
255
- selections: Selections,
256
- ): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {
257
- return [].concat(
258
- ...selections.map((selection) => {
259
- switch (selection.kind) {
260
- case 'InlineFragment': {
261
- const newTypeName =
262
- selection.typeCondition?.name.value ?? typeName;
263
- if (newTypeName !== typeName) {
264
- return [];
265
- }
266
- return objectPropertiesToFlow(
267
- ctx,
268
- ctx.schema.typesByName[newTypeName],
269
- newTypeName,
270
- selection.selectionSet.selections,
271
- );
272
- }
273
- case 'FragmentSpread':
274
- if (!ctx.fragments[selection.name.value]) {
275
- ctx.errors.push(
276
- `No fragment named '${selection.name.value}'. Did you forget to include it in the template literal?`,
277
- );
278
- return [
279
- babelTypes.objectTypeProperty(
280
- babelTypes.identifier(selection.name.value),
281
- babelTypes.genericTypeAnnotation(
282
- babelTypes.identifier(`UNKNOWN_FRAGMENT`),
283
- ),
284
- ),
285
- ];
286
- }
287
-
288
- return objectPropertiesToFlow(
289
- ctx,
290
- type,
291
- typeName,
292
- ctx.fragments[selection.name.value].selectionSet
293
- .selections,
294
- );
295
-
296
- case 'Field':
297
- const name = selection.name.value;
298
- const alias: string = selection.alias
299
- ? selection.alias.value
300
- : name;
301
- if (name === '__typename') {
302
- return [
303
- babelTypes.objectTypeProperty(
304
- babelTypes.identifier(alias),
305
- babelTypes.stringLiteralTypeAnnotation(
306
- typeName,
307
- ),
308
- ),
309
- ];
310
- }
311
- if (!type.fieldsByName[name]) {
312
- ctx.errors.push(
313
- `Unknown field '${name}' for type '${typeName}'`,
314
- );
315
- return babelTypes.objectTypeProperty(
316
- babelTypes.identifier(alias),
317
- babelTypes.genericTypeAnnotation(
318
- babelTypes.identifier(
319
- `UNKNOWN_FIELD["${name}"]`,
320
- ),
321
- ),
322
- );
323
- }
324
- const typeField = type.fieldsByName[name];
325
-
326
- return [
327
- maybeAddDescriptionComment(
328
- typeField.description,
329
- liftLeadingPropertyComments(
330
- babelTypes.objectTypeProperty(
331
- babelTypes.identifier(alias),
332
- typeToFlow(
333
- {
334
- ...ctx,
335
- path: ctx.path.concat([alias]),
336
- },
337
- typeField.type,
338
- selection,
339
- ),
340
- ),
341
- ),
342
- ),
343
- ];
344
-
345
- default:
346
- ctx.errors.push(
347
- // eslint-disable-next-line flowtype-errors/uncovered
348
- `Unsupported selection kind '${selection.kind}'`,
349
- );
350
- return [];
351
- }
352
- }),
353
- );
354
- };
355
-
356
- export const unionOrInterfaceToFlow = (
357
- ctx: Context,
358
- type:
359
- | IntrospectionUnionType
360
- | (IntrospectionInterfaceType & {
361
- fieldsByName: {[key: string]: IntrospectionField},
362
- }),
363
- selections: Selections,
364
- ): BabelNodeFlowType => {
365
- const allFields = selections.every(
366
- (selection) => selection.kind === 'Field',
367
- );
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
- ...ctx,
381
- path: allFields ? ctx.path : ctx.path.concat([possible.name]),
382
- };
383
- return {
384
- typeName: possible.name,
385
- attributes: ensureOnlyOneTypenameProperty(
386
- selections
387
- .map((selection) =>
388
- unionOrInterfaceSelection(
389
- configWithUpdatedPath,
390
- type,
391
- possible,
392
- selection,
393
- ),
394
- )
395
- .flat(),
396
- ),
397
- };
398
- });
399
- // If they're all fields, the only selection that could be different is __typename
400
- if (allFields) {
401
- const sharedAttributes = selectedAttributes[0].attributes.slice();
402
- const typeNameIndex = selectedAttributes[0].attributes.findIndex(
403
- (x) =>
404
- x.type === 'ObjectTypeProperty' &&
405
- x.key.type === 'Identifier' &&
406
- x.key.name === '__typename',
407
- );
408
- if (typeNameIndex !== -1) {
409
- sharedAttributes[typeNameIndex] = babelTypes.objectTypeProperty(
410
- babelTypes.identifier('__typename'),
411
- babelTypes.unionTypeAnnotation(
412
- selectedAttributes.map(
413
- (attrs) =>
414
- // eslint-disable-next-line flowtype-errors/uncovered
415
- ((attrs.attributes[
416
- typeNameIndex
417
- ]: any): BabelNodeObjectTypeProperty).value,
418
- ),
419
- ),
420
- );
421
- }
422
- return sortedObjectTypeAnnotation(ctx, sharedAttributes);
423
- }
424
- if (selectedAttributes.length === 1) {
425
- return sortedObjectTypeAnnotation(
426
- ctx,
427
- selectedAttributes[0].attributes,
428
- );
429
- }
430
- /**
431
- * When generating the objects for the sub-options of a union, the path needs
432
- * to include the name of the object type.
433
- * ```
434
- * query getFriend {
435
- * friend {
436
- * ... on Human { id }
437
- * ... on Droid { arms }
438
- * }
439
- * }
440
- * ```
441
- * produces
442
- * ```
443
- * type getFriend = {friend: getFriend_friend_Human | getFriend_friend_Droid }
444
- * type getFriend_friend_Human = {id: string}
445
- * type getFriend_friend_Droid = {arms: number}
446
- * ```
447
- * Note that this is different from when an attribute has a plain object type.
448
- * ```
449
- * query getHuman {
450
- * me: human(id: "me") { id }
451
- * }
452
- * ```
453
- * produces
454
- * ```
455
- * type getHuman = {me: getHuman_me}
456
- * type getHuman_me = {id: string}
457
- * ```
458
- * instead of e.g. `getHuman_me_Human`.
459
- */
460
- const result = babelTypes.unionTypeAnnotation(
461
- selectedAttributes.map(({typeName, attributes}) =>
462
- sortedObjectTypeAnnotation(
463
- {...ctx, path: ctx.path.concat([typeName])},
464
- attributes,
465
- ),
466
- ),
467
- );
468
- const name = ctx.path.join('_');
469
- if (ctx.allObjectTypes && ctx.path.length > 1) {
470
- ctx.allObjectTypes[name] = result;
471
- return babelTypes.genericTypeAnnotation(babelTypes.identifier(name));
472
- }
473
- return result;
474
- };
475
- const unionOrInterfaceSelection = (
476
- config,
477
- type,
478
- possible,
479
- selection,
480
- ): Array<BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty> => {
481
- if (selection.kind === 'Field' && selection.name.value === '__typename') {
482
- const alias = selection.alias
483
- ? selection.alias.value
484
- : selection.name.value;
485
- return [
486
- babelTypes.objectTypeProperty(
487
- babelTypes.identifier(alias),
488
- babelTypes.stringLiteralTypeAnnotation(possible.name),
489
- ),
490
- ];
491
- }
492
- if (selection.kind === 'Field' && type.kind !== 'UNION') {
493
- // this is an interface
494
- const name = selection.name.value;
495
- const alias = selection.alias ? selection.alias.value : name;
496
- if (!type.fieldsByName[name]) {
497
- config.errors.push(
498
- 'Unknown field: ' +
499
- name +
500
- ' on type ' +
501
- type.name +
502
- ' for possible ' +
503
- possible.name,
504
- );
505
- return [
506
- babelTypes.objectTypeProperty(
507
- babelTypes.identifier(alias),
508
- babelTypes.genericTypeAnnotation(
509
- babelTypes.identifier(`UNKNOWN_FIELD`),
510
- ),
511
- ),
512
- ];
513
- }
514
- const typeField = type.fieldsByName[name];
515
- return [
516
- liftLeadingPropertyComments(
517
- babelTypes.objectTypeProperty(
518
- babelTypes.identifier(alias),
519
- typeToFlow(
520
- {...config, path: config.path.concat([name])},
521
- typeField.type,
522
- selection,
523
- ),
524
- ),
525
- ),
526
- ];
527
- }
528
- if (selection.kind === 'FragmentSpread') {
529
- const fragment = config.fragments[selection.name.value];
530
- if (!fragment) {
531
- throw new Error(`Unknown fragment ${selection.name.value}`);
532
- }
533
- const typeName = fragment.typeCondition.name.value;
534
- if (
535
- (config.schema.interfacesByName[typeName] &&
536
- config.schema.interfacesByName[typeName].possibleTypesByName[
537
- possible.name
538
- ]) ||
539
- typeName === possible.name
540
- ) {
541
- return [].concat(
542
- ...fragment.selectionSet.selections.map((selection) =>
543
- unionOrInterfaceSelection(
544
- config,
545
- config.schema.typesByName[possible.name],
546
- possible,
547
- selection,
548
- ),
549
- ),
550
- );
551
- } else {
552
- return [];
553
- }
554
- }
555
- if (selection.kind !== 'InlineFragment') {
556
- config.errors.push(
557
- `union selectors must be inline fragment: found ${selection.kind}`,
558
- );
559
- if (type.kind === 'UNION') {
560
- config.errors
561
- .push(`You're trying to select a field from the union ${type.name},
562
- but the only field you're allowed to select is "__typename".
563
- Try using an inline fragment "... on SomeType {}".`);
564
- }
565
- return [];
566
- }
567
- if (selection.typeCondition) {
568
- const typeName = selection.typeCondition.name.value;
569
- const indirectMatch =
570
- config.schema.interfacesByName[typeName]?.possibleTypesByName[
571
- possible.name
572
- ];
573
- if (typeName !== possible.name && !indirectMatch) {
574
- return [];
575
- }
576
- }
577
- return objectPropertiesToFlow(
578
- config,
579
- config.schema.typesByName[possible.name],
580
- possible.name,
581
- selection.selectionSet.selections,
582
- );
583
- };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/generateResponseType.js"],"names":["generateResponseType","schema","query","ctx","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","config","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 {Context, 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 ctx: Context,\n): string => {\n const ast = querySelectionToObjectType(\n ctx,\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 ctx: Context,\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 = ctx.path.join('_');\n const isTopLevelType = ctx.path.length <= 1;\n if (ctx.allObjectTypes != null && !isTopLevelType) {\n ctx.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 ctx: Context,\n): string => {\n const onType = fragment.typeCondition.name.value;\n let ast;\n\n if (schema.typesByName[onType]) {\n ast = sortedObjectTypeAnnotation(\n ctx,\n objectPropertiesToFlow(\n ctx,\n schema.typesByName[onType],\n onType,\n fragment.selectionSet.selections,\n ),\n );\n } else if (schema.interfacesByName[onType]) {\n ast = unionOrInterfaceToFlow(\n ctx,\n ctx.schema.interfacesByName[onType],\n fragment.selectionSet.selections,\n );\n } else if (schema.unionsByName[onType]) {\n ast = unionOrInterfaceToFlow(\n ctx,\n ctx.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 ctx: Context,\n type,\n selection,\n): babelTypes.BabelNodeFlowType => {\n if (type.kind === 'SCALAR') {\n return scalarTypeToFlow(ctx, type.name);\n }\n if (type.kind === 'LIST') {\n return babelTypes.genericTypeAnnotation(\n ctx.readOnlyArray\n ? babelTypes.identifier('$ReadOnlyArray')\n : babelTypes.identifier('Array'),\n babelTypes.typeParameterInstantiation([\n typeToFlow(ctx, type.ofType, selection),\n ]),\n );\n }\n if (type.kind === 'UNION') {\n const union = ctx.schema.unionsByName[type.name];\n if (!selection.selectionSet) {\n console.log('no selection set', selection);\n return babelTypes.anyTypeAnnotation();\n }\n return unionOrInterfaceToFlow(\n ctx,\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 ctx,\n ctx.schema.interfacesByName[type.name],\n selection.selectionSet.selections,\n );\n }\n if (type.kind === 'ENUM') {\n return enumTypeToFlow(ctx, 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 (!ctx.schema.typesByName[tname]) {\n console.log('unknown referenced type', tname);\n return babelTypes.anyTypeAnnotation();\n }\n const childType = ctx.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 ctx,\n selection.selectionSet.selections,\n childType,\n tname,\n ),\n );\n};\n\nexport const typeToFlow = (\n ctx: Context,\n type: IntrospectionOutputTypeRef,\n selection: FieldNode,\n): babelTypes.BabelNodeFlowType => {\n // throw new Error('npoe');\n if (type.kind === 'NON_NULL') {\n return _typeToFlow(ctx, type.ofType, selection);\n }\n // If we don'babelTypes care about strict nullability checking, then pretend everything is non-null\n if (!ctx.strictNullability) {\n return _typeToFlow(ctx, type, selection);\n }\n const inner = _typeToFlow(ctx, 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 ctx: Context,\n selections,\n type,\n typeName: string,\n): BabelNodeFlowType => {\n return sortedObjectTypeAnnotation(\n ctx,\n ensureOnlyOneTypenameProperty(\n objectPropertiesToFlow(ctx, type, typeName, selections),\n ),\n );\n};\n\nexport const objectPropertiesToFlow = (\n ctx: Context,\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 ctx,\n ctx.schema.typesByName[newTypeName],\n newTypeName,\n selection.selectionSet.selections,\n );\n }\n case 'FragmentSpread':\n if (!ctx.fragments[selection.name.value]) {\n ctx.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 ctx,\n type,\n typeName,\n ctx.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 ctx.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 ...ctx,\n path: ctx.path.concat([alias]),\n },\n typeField.type,\n selection,\n ),\n ),\n ),\n ),\n ];\n\n default:\n ctx.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 ctx: Context,\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 ...ctx,\n path: allFields ? ctx.path : ctx.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(ctx, sharedAttributes);\n }\n if (selectedAttributes.length === 1) {\n return sortedObjectTypeAnnotation(\n ctx,\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 {...ctx, path: ctx.path.concat([typeName])},\n attributes,\n ),\n ),\n );\n const name = ctx.path.join('_');\n if (ctx.allObjectTypes && ctx.path.length > 1) {\n ctx.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"}