relay-compiler 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. package/LICENSE +16 -26
  2. package/bin/relay-compiler +7348 -5939
  3. package/index.js +3 -6
  4. package/lib/{FileParser.js → ASTCache.js} +17 -14
  5. package/lib/ASTConvert.js +84 -70
  6. package/lib/CodegenDirectory.js +122 -28
  7. package/lib/{RelayCodegenRunner.js → CodegenRunner.js} +110 -186
  8. package/lib/CodegenTypes.js +12 -0
  9. package/lib/{RelayCodegenWatcher.js → CodegenWatcher.js} +53 -43
  10. package/lib/DefaultHandleKey.js +2 -4
  11. package/lib/DotGraphQLParser.js +27 -0
  12. package/lib/FilterDirectivesTransform.js +11 -11
  13. package/lib/FindGraphQLTags.js +33 -52
  14. package/lib/FlattenTransform.js +197 -0
  15. package/lib/GraphQLCompilerContext.js +158 -0
  16. package/lib/GraphQLCompilerProfiler.js +271 -0
  17. package/lib/GraphQLCompilerPublic.js +27 -22
  18. package/lib/GraphQLCompilerUserError.js +26 -0
  19. package/lib/GraphQLConsoleReporter.js +58 -0
  20. package/lib/GraphQLIR.js +12 -0
  21. package/lib/{RelayPrinter.js → GraphQLIRPrinter.js} +42 -38
  22. package/lib/{RelayIRTransformer.js → GraphQLIRTransformer.js} +47 -38
  23. package/lib/GraphQLIRTransforms.js +6 -15
  24. package/lib/{RelayIRVisitor.js → GraphQLIRVisitor.js} +7 -6
  25. package/lib/GraphQLMultiReporter.js +50 -0
  26. package/lib/GraphQLParser.js +743 -0
  27. package/lib/GraphQLReporter.js +12 -0
  28. package/lib/GraphQLSchemaUtils.js +10 -36
  29. package/lib/GraphQLValidator.js +13 -15
  30. package/lib/{RelayWatchmanClient.js → GraphQLWatchmanClient.js} +15 -17
  31. package/lib/InlineFragmentsTransform.js +48 -0
  32. package/lib/PatchedBabelGenerator.js +58 -0
  33. package/lib/RelayApplyFragmentArgumentTransform.js +37 -18
  34. package/lib/RelayCodeGenerator.js +130 -60
  35. package/lib/RelayCompilerBin.js +80 -35
  36. package/lib/RelayCompilerCache.js +18 -11
  37. package/lib/RelayCompilerPublic.js +24 -10
  38. package/lib/RelayCompilerScope.js +2 -4
  39. package/lib/RelayConcreteNode.js +31 -14
  40. package/lib/RelayConnectionConstants.js +2 -4
  41. package/lib/RelayConnectionTransform.js +34 -38
  42. package/lib/RelayDefaultHandleKey.js +2 -4
  43. package/lib/RelayDeferrableFragmentTransform.js +464 -0
  44. package/lib/RelayError.js +2 -6
  45. package/lib/RelayFieldHandleTransform.js +15 -11
  46. package/lib/RelayFileWriter.js +119 -98
  47. package/lib/RelayFlowBabelFactories.js +113 -0
  48. package/lib/RelayFlowGenerator.js +180 -200
  49. package/lib/RelayFlowTypeTransformers.js +109 -0
  50. package/lib/RelayGenerateIDFieldTransform.js +131 -0
  51. package/lib/RelayGenerateTypeNameTransform.js +75 -0
  52. package/lib/RelayGraphQLEnumsGenerator.js +65 -0
  53. package/lib/RelayIRTransforms.js +19 -23
  54. package/lib/RelayInternalTypes.js +2 -5
  55. package/lib/RelayInternals.js +2 -5
  56. package/lib/RelayJSModuleParser.js +64 -0
  57. package/lib/RelayMaskTransform.js +129 -0
  58. package/lib/RelayMetricsRecorder.js +9 -9
  59. package/lib/RelayMockRenderer.js +3 -8
  60. package/lib/RelayNetworkDebug.js +4 -7
  61. package/lib/RelayParser.js +28 -645
  62. package/lib/RelayProfiler.js +7 -7
  63. package/lib/RelayQueryCaching.js +2 -5
  64. package/lib/RelayRelayDirectiveTransform.js +47 -33
  65. package/lib/RelayRuntimeTypes.js +22 -0
  66. package/lib/RelayShallowMock.js +4 -7
  67. package/lib/RelaySkipHandleFieldTransform.js +13 -11
  68. package/lib/RelayTaskQueue.js +2 -5
  69. package/lib/RelayTransformUtils.js +20 -0
  70. package/lib/RelayTypes.js +2 -5
  71. package/lib/RelayValidator.js +9 -8
  72. package/lib/RelayViewerHandleTransform.js +22 -18
  73. package/lib/SkipClientFieldTransform.js +36 -53
  74. package/lib/SkipRedundantNodesTransform.js +22 -29
  75. package/lib/SkipUnreachableNodeTransform.js +57 -36
  76. package/lib/SourceControl.js +61 -0
  77. package/lib/StripUnusedVariablesTransform.js +86 -41
  78. package/lib/areEqualOSS.js +2 -4
  79. package/lib/compileRelayArtifacts.js +72 -0
  80. package/lib/dedent.js +2 -5
  81. package/lib/dedupeJSONStringify.js +132 -0
  82. package/lib/deepFreeze.js +3 -5
  83. package/lib/deepMergeAssignments.js +68 -0
  84. package/lib/filterContextForNode.js +5 -7
  85. package/lib/formatGeneratedModule.js +5 -9
  86. package/lib/{getIdentifierForRelayArgumentValue.js → getIdentifierForArgumentValue.js} +8 -10
  87. package/lib/getIdentifierForSelection.js +37 -0
  88. package/lib/getLiteralArgumentValues.js +26 -0
  89. package/lib/getModuleName.js +2 -4
  90. package/lib/getRelayHandleKey.js +2 -4
  91. package/lib/isCompatibleRelayFragmentType.js +2 -5
  92. package/lib/isEquivalentType.js +55 -0
  93. package/lib/isPromise.js +2 -5
  94. package/lib/isScalarAndEqual.js +3 -5
  95. package/lib/murmurHash.js +2 -4
  96. package/lib/nullthrowsOSS.js +7 -5
  97. package/lib/recycleNodesInto.js +2 -4
  98. package/lib/relayUnstableBatchedUpdates.js +2 -5
  99. package/lib/relayUnstableBatchedUpdates.native.js +2 -5
  100. package/lib/requestsForOperation.js +75 -0
  101. package/lib/simpleClone.js +2 -4
  102. package/lib/stableCopy.js +35 -0
  103. package/lib/testEditDistance.js +2 -5
  104. package/lib/throwFailedPromise.js +2 -5
  105. package/lib/writeRelayGeneratedFile.js +84 -50
  106. package/package.json +16 -15
  107. package/relay-compiler.js +7208 -5872
  108. package/relay-compiler.min.js +7200 -5867
  109. package/ARCHITECTURE.md +0 -94
  110. package/PATENTS +0 -33
  111. package/lib/AutoAliasTransform.js +0 -80
  112. package/lib/GraphQLFileParser.js +0 -27
  113. package/lib/GraphQLTextParser.js +0 -46
  114. package/lib/RelayCodegenTypes.js +0 -14
  115. package/lib/RelayCompiledTypes.js +0 -13
  116. package/lib/RelayCompiler.js +0 -144
  117. package/lib/RelayCompilerContext.js +0 -133
  118. package/lib/RelayCompilerUserError.js +0 -30
  119. package/lib/RelayConsoleReporter.js +0 -40
  120. package/lib/RelayFileIRParser.js +0 -66
  121. package/lib/RelayFlattenTransform.js +0 -278
  122. package/lib/RelayFlowParser.js +0 -188
  123. package/lib/RelayGenerateRequisiteFieldsTransform.js +0 -189
  124. package/lib/RelayIR.js +0 -14
  125. package/lib/RelayMultiReporter.js +0 -40
  126. package/lib/RelayReporter.js +0 -14
  127. package/lib/RelayTestSchema.js +0 -21
  128. package/lib/formatStorageKey.js +0 -37
  129. package/lib/getIdentifierForRelaySelection.js +0 -54
  130. package/lib/getRelayLiteralArgumentValues.js +0 -28
  131. package/lib/parseGraphQLText.js +0 -33
  132. package/lib/prettyStringify.js +0 -35
  133. package/lib/printFlowTypes.js +0 -282
  134. package/lib/stableJSONStringify.js +0 -45
  135. package/lib/stableJSONStringifyOSS.js +0 -44
  136. package/lib/transformInputObjectToIR.js +0 -85
  137. package/lib/writeLegacyFlowFile.js +0 -24
@@ -1,10 +1,8 @@
1
1
  /**
2
2
  * Copyright (c) 2013-present, Facebook, Inc.
3
- * All rights reserved.
4
3
  *
5
- * This source code is licensed under the BSD-style license found in the
6
- * LICENSE file in the root directory of this source tree. An additional grant
7
- * of patent rights can be found in the PATENTS file in the same directory.
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
8
6
  *
9
7
  * @providesModule RelayFlowGenerator
10
8
  *
@@ -19,40 +17,40 @@ var _toConsumableArray3 = _interopRequireDefault(require('babel-runtime/helpers/
19
17
 
20
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
21
19
 
22
- var babelGenerator = require('babel-generator')['default'];
23
-
24
- var _require = require('graphql'),
25
- GraphQLEnumType = _require.GraphQLEnumType,
26
- GraphQLInputType = _require.GraphQLInputType,
27
- GraphQLInputObjectType = _require.GraphQLInputObjectType,
28
- GraphQLInterfaceType = _require.GraphQLInterfaceType,
29
- GraphQLList = _require.GraphQLList,
30
- GraphQLNonNull = _require.GraphQLNonNull,
31
- GraphQLObjectType = _require.GraphQLObjectType,
32
- GraphQLScalarType = _require.GraphQLScalarType,
33
- GraphQLType = _require.GraphQLType,
34
- GraphQLUnionType = _require.GraphQLUnionType;
35
-
36
- var _require2 = require('./GraphQLSchemaUtils'),
37
- isAbstractType = _require2.isAbstractType;
38
-
39
- var printBabel = function printBabel(ast) {
40
- return babelGenerator(ast).code;
41
- };
42
-
43
- function generate(node, customScalars, inputFieldWhiteList) {
44
- var defaultedCustomScalars = customScalars || {};
45
- var output = [];
46
- if (node.kind === 'Root' && node.operation !== 'query') {
47
- var inputAST = generateInputVariablesType(node, defaultedCustomScalars, inputFieldWhiteList);
48
- output.push(printBabel(inputAST));
49
- }
50
- var responseAST = require('./RelayIRVisitor').visit(node, createVisitor(defaultedCustomScalars));
51
- output.push(printBabel(responseAST));
52
- return output.join('\n\n');
20
+ var _require = require('./RelayFlowBabelFactories'),
21
+ anyTypeAlias = _require.anyTypeAlias,
22
+ exactObjectTypeAnnotation = _require.exactObjectTypeAnnotation,
23
+ exportType = _require.exportType,
24
+ importTypes = _require.importTypes,
25
+ intersectionTypeAnnotation = _require.intersectionTypeAnnotation,
26
+ lineComments = _require.lineComments,
27
+ readOnlyArrayOfType = _require.readOnlyArrayOfType,
28
+ readOnlyObjectTypeProperty = _require.readOnlyObjectTypeProperty,
29
+ stringLiteralTypeAnnotation = _require.stringLiteralTypeAnnotation,
30
+ unionTypeAnnotation = _require.unionTypeAnnotation;
31
+
32
+ var _require2 = require('./RelayFlowTypeTransformers'),
33
+ transformScalarType = _require2.transformScalarType,
34
+ transformInputType = _require2.transformInputType;
35
+
36
+ var _require3 = require('graphql'),
37
+ GraphQLNonNull = _require3.GraphQLNonNull;
38
+
39
+ var _require4 = require('./GraphQLCompilerPublic'),
40
+ FlattenTransform = _require4.FlattenTransform,
41
+ IRVisitor = _require4.IRVisitor,
42
+ Profiler = _require4.Profiler,
43
+ SchemaUtils = _require4.SchemaUtils;
44
+
45
+ var isAbstractType = SchemaUtils.isAbstractType;
46
+
47
+
48
+ function generate(node, options) {
49
+ var ast = IRVisitor.visit(node, createVisitor(options));
50
+ return require('./PatchedBabelGenerator').generate(ast);
53
51
  }
54
52
 
55
- function makeProp(_ref, customScalars, concreteType) {
53
+ function makeProp(_ref, state, concreteType) {
56
54
  var key = _ref.key,
57
55
  schemaName = _ref.schemaName,
58
56
  value = _ref.value,
@@ -61,7 +59,7 @@ function makeProp(_ref, customScalars, concreteType) {
61
59
  nodeSelections = _ref.nodeSelections;
62
60
 
63
61
  if (nodeType) {
64
- value = transformScalarField(nodeType, customScalars, selectionsToBabel([Array.from(nodeSelections.values())], customScalars));
62
+ value = transformScalarType(nodeType, state, selectionsToBabel([Array.from(require('fbjs/lib/nullthrows')(nodeSelections).values())], state));
65
63
  }
66
64
  if (schemaName === '__typename' && concreteType) {
67
65
  value = stringLiteralTypeAnnotation(concreteType);
@@ -83,7 +81,7 @@ var onlySelectsTypename = function onlySelectsTypename(selections) {
83
81
  return selections.every(isTypenameSelection);
84
82
  };
85
83
 
86
- function selectionsToBabel(selections, customScalars) {
84
+ function selectionsToBabel(selections, state, refTypeName) {
87
85
  var baseFields = new Map();
88
86
  var byConcreteType = {};
89
87
 
@@ -105,59 +103,42 @@ function selectionsToBabel(selections, customScalars) {
105
103
  if (Object.keys(byConcreteType).length && onlySelectsTypename(Array.from(baseFields.values())) && (hasTypenameSelection(Array.from(baseFields.values())) || Object.keys(byConcreteType).every(function (type) {
106
104
  return hasTypenameSelection(byConcreteType[type]);
107
105
  }))) {
108
- var _loop = function _loop(concreteType) {
109
- types.push(exactObjectTypeAnnotation([].concat((0, _toConsumableArray3['default'])(Array.from(baseFields.values()).map(function (selection) {
110
- return makeProp(selection, customScalars, concreteType);
111
- })), (0, _toConsumableArray3['default'])(byConcreteType[concreteType].map(function (selection) {
112
- return makeProp(selection, customScalars, concreteType);
113
- })))));
106
+ var _loop = function _loop(_concreteType) {
107
+ types.push(groupRefs([].concat((0, _toConsumableArray3['default'])(Array.from(baseFields.values())), (0, _toConsumableArray3['default'])(byConcreteType[_concreteType]))).map(function (selection) {
108
+ return makeProp(selection, state, _concreteType);
109
+ }));
114
110
  };
115
111
 
116
- for (var concreteType in byConcreteType) {
117
- _loop(concreteType);
112
+ for (var _concreteType in byConcreteType) {
113
+ _loop(_concreteType);
118
114
  }
119
115
  // It might be some other type then the listed concrete types. Ideally, we
120
116
  // would set the type to diff(string, set of listed concrete types), but
121
117
  // this doesn't exist in Flow at the time.
122
118
  var otherProp = readOnlyObjectTypeProperty('__typename', stringLiteralTypeAnnotation('%other'));
123
119
  otherProp.leadingComments = lineComments("This will never be '%other', but we need some", 'value in case none of the concrete values match.');
124
- types.push(exactObjectTypeAnnotation([otherProp]));
120
+ types.push([otherProp]);
125
121
  } else {
126
122
  var selectionMap = selectionsToMap(Array.from(baseFields.values()));
127
- for (var concreteType in byConcreteType) {
128
- selectionMap = mergeSelections(selectionMap, selectionsToMap(byConcreteType[concreteType].map(function (sel) {
123
+ for (var _concreteType2 in byConcreteType) {
124
+ selectionMap = mergeSelections(selectionMap, selectionsToMap(byConcreteType[_concreteType2].map(function (sel) {
129
125
  return (0, _extends3['default'])({}, sel, {
130
126
  conditional: true
131
127
  });
132
128
  })));
133
129
  }
134
- var selectionMapValues = Array.from(selectionMap.values()).map(function (sel) {
135
- return isTypenameSelection(sel) && sel.concreteType ? makeProp((0, _extends3['default'])({}, sel, { conditional: false }), customScalars, sel.concreteType) : makeProp(sel, customScalars);
130
+ var selectionMapValues = groupRefs(Array.from(selectionMap.values())).map(function (sel) {
131
+ return isTypenameSelection(sel) && sel.concreteType ? makeProp((0, _extends3['default'])({}, sel, { conditional: false }), state, sel.concreteType) : makeProp(sel, state);
136
132
  });
137
- types.push(exactObjectTypeAnnotation(selectionMapValues));
138
- }
139
-
140
- if (!types.length) {
141
- return exactObjectTypeAnnotation([]);
142
- }
143
-
144
- return types.length > 1 ? require('babel-types').unionTypeAnnotation(types) : types[0];
145
- }
146
-
147
- function lineComments() {
148
- for (var _len = arguments.length, lines = Array(_len), _key = 0; _key < _len; _key++) {
149
- lines[_key] = arguments[_key];
133
+ types.push(selectionMapValues);
150
134
  }
151
135
 
152
- return lines.map(function (line) {
153
- return { type: 'CommentLine', value: ' ' + line };
154
- });
155
- }
156
-
157
- function stringLiteralTypeAnnotation(value) {
158
- var annotation = require('babel-types').stringLiteralTypeAnnotation();
159
- annotation.value = value;
160
- return annotation;
136
+ return unionTypeAnnotation(types.map(function (props) {
137
+ if (refTypeName) {
138
+ props.push(readOnlyObjectTypeProperty('$refType', require('babel-types').identifier(refTypeName)));
139
+ }
140
+ return exactObjectTypeAnnotation(props);
141
+ }));
161
142
  }
162
143
 
163
144
  function mergeSelection(a, b) {
@@ -167,7 +148,7 @@ function mergeSelection(a, b) {
167
148
  });
168
149
  }
169
150
  return (0, _extends3['default'])({}, a, {
170
- nodeSelections: a.nodeSelections ? mergeSelections(a.nodeSelections, b.nodeSelections) : null,
151
+ nodeSelections: a.nodeSelections ? mergeSelections(a.nodeSelections, require('fbjs/lib/nullthrows')(b.nodeSelections)) : null,
171
152
  conditional: a.conditional && b.conditional
172
153
  });
173
154
  }
@@ -181,10 +162,10 @@ function mergeSelections(a, b) {
181
162
  try {
182
163
  for (var _iterator = a.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
183
164
  var _step$value = _step.value,
184
- key = _step$value[0],
185
- value = _step$value[1];
165
+ _key = _step$value[0],
166
+ _value = _step$value[1];
186
167
 
187
- merged.set(key, value);
168
+ merged.set(_key, _value);
188
169
  }
189
170
  } catch (err) {
190
171
  _didIteratorError = true;
@@ -208,10 +189,10 @@ function mergeSelections(a, b) {
208
189
  try {
209
190
  for (var _iterator2 = b.entries()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
210
191
  var _step2$value = _step2.value,
211
- key = _step2$value[0],
212
- value = _step2$value[1];
192
+ _key2 = _step2$value[0],
193
+ _value2 = _step2$value[1];
213
194
 
214
- merged.set(key, mergeSelection(a.get(key), value));
195
+ merged.set(_key2, mergeSelection(a.get(_key2), _value2));
215
196
  }
216
197
  } catch (err) {
217
198
  _didIteratorError2 = true;
@@ -231,30 +212,29 @@ function mergeSelections(a, b) {
231
212
  return merged;
232
213
  }
233
214
 
234
- function isPlural(_ref2) {
235
- var directives = _ref2.directives;
236
-
237
- var relayDirective = directives.find(function (_ref3) {
238
- var name = _ref3.name;
239
- return name === 'relay';
240
- });
241
-
242
- if (relayDirective) {
243
- return !!relayDirective.args.find(function (_ref4) {
244
- var name = _ref4.name,
245
- value = _ref4.value;
246
- return name === 'plural' && value.value;
247
- });
248
- } else {
249
- return false;
250
- }
215
+ function isPlural(node) {
216
+ return Boolean(node.metadata && node.metadata.plural);
251
217
  }
252
218
 
253
- function createVisitor(customScalars) {
219
+ function createVisitor(options) {
220
+ var state = {
221
+ customScalars: options.customScalars,
222
+ enumsHasteModule: options.enumsHasteModule,
223
+ existingFragmentNames: options.existingFragmentNames,
224
+ generatedFragments: new Set(),
225
+ inputFieldWhiteList: options.inputFieldWhiteList,
226
+ relayRuntimeModule: options.relayRuntimeModule,
227
+ usedEnums: {},
228
+ usedFragments: new Set(),
229
+ useHaste: options.useHaste
230
+ };
231
+
254
232
  return {
255
233
  leave: {
256
234
  Root: function Root(node) {
257
- return require('babel-types').exportNamedDeclaration(require('babel-types').typeAlias(require('babel-types').identifier(node.name + 'Response'), null, selectionsToBabel(node.selections, customScalars)), [], null);
235
+ var inputVariablesType = generateInputVariablesType(node, state);
236
+ var responseType = exportType(node.name + 'Response', selectionsToBabel(node.selections, state));
237
+ return require('babel-types').program([].concat((0, _toConsumableArray3['default'])(getFragmentImports(state)), (0, _toConsumableArray3['default'])(getEnumDefinitions(state)), [inputVariablesType, responseType]));
258
238
  },
259
239
  Fragment: function Fragment(node) {
260
240
  var selections = flattenArray(node.selections);
@@ -269,10 +249,12 @@ function createVisitor(customScalars) {
269
249
  }
270
250
  return [selection];
271
251
  });
272
- var baseType = selectionsToBabel(selections, customScalars);
273
- var type = isPlural(node) ? arrayOfType(baseType) : baseType;
274
-
275
- return require('babel-types').exportNamedDeclaration(require('babel-types').typeAlias(require('babel-types').identifier(node.name), null, type), [], null);
252
+ state.generatedFragments.add(node.name);
253
+ var refTypeName = getRefTypeName(node.name);
254
+ var refType = require('babel-types').expressionStatement(require('babel-types').identifier('declare export opaque type ' + refTypeName + ': FragmentReference'));
255
+ var baseType = selectionsToBabel(selections, state, refTypeName);
256
+ var type = isPlural(node) ? readOnlyArrayOfType(baseType) : baseType;
257
+ return require('babel-types').program([].concat((0, _toConsumableArray3['default'])(getFragmentImports(state)), (0, _toConsumableArray3['default'])(getEnumDefinitions(state)), [importTypes(['FragmentReference'], state.relayRuntimeModule), refType, exportType(node.name, type)]));
276
258
  },
277
259
  InlineFragment: function InlineFragment(node) {
278
260
  var typeCondition = node.typeCondition;
@@ -295,7 +277,7 @@ function createVisitor(customScalars) {
295
277
  return [{
296
278
  key: node.alias || node.name,
297
279
  schemaName: node.name,
298
- value: transformScalarField(node.type, customScalars)
280
+ value: transformScalarType(node.type, state)
299
281
  }];
300
282
  },
301
283
  LinkedField: function LinkedField(node) {
@@ -307,7 +289,11 @@ function createVisitor(customScalars) {
307
289
  }];
308
290
  },
309
291
  FragmentSpread: function FragmentSpread(node) {
310
- return [];
292
+ state.usedFragments.add(node.name);
293
+ return [{
294
+ key: '__fragments_' + node.name,
295
+ ref: node.name
296
+ }];
311
297
  }
312
298
  }
313
299
  };
@@ -330,117 +316,111 @@ function flattenArray(arrayOfArrays) {
330
316
  return result;
331
317
  }
332
318
 
333
- function transformScalarField(type, customScalars, objectProps) {
334
- if (type instanceof GraphQLNonNull) {
335
- return transformNonNullableScalarField(type.ofType, objectProps, customScalars);
336
- } else {
337
- return require('babel-types').nullableTypeAnnotation(transformNonNullableScalarField(type, objectProps, customScalars));
338
- }
339
- }
340
-
341
- function arrayOfType(thing) {
342
- return require('babel-types').genericTypeAnnotation(require('babel-types').identifier('$ReadOnlyArray'), require('babel-types').typeParameterInstantiation([thing]));
343
- }
344
-
345
- function exactObjectTypeAnnotation(props) {
346
- var typeAnnotation = require('babel-types').objectTypeAnnotation(props);
347
- typeAnnotation.exact = true;
348
- return typeAnnotation;
349
- }
350
-
351
- function readOnlyObjectTypeProperty(key, value) {
352
- var prop = require('babel-types').objectTypeProperty(require('babel-types').identifier(key), value);
353
- prop.variance = 'plus';
354
- return prop;
319
+ function generateInputVariablesType(node, state) {
320
+ return exportType(node.name + 'Variables', exactObjectTypeAnnotation(node.argumentDefinitions.map(function (arg) {
321
+ var property = require('babel-types').objectTypeProperty(require('babel-types').identifier(arg.name), transformInputType(arg.type, state));
322
+ if (!(arg.type instanceof GraphQLNonNull)) {
323
+ property.optional = true;
324
+ }
325
+ return property;
326
+ })));
355
327
  }
356
328
 
357
- function transformGraphQLScalarType(type, customScalars) {
358
- switch (customScalars[type.name] || type.name) {
359
- case 'ID':
360
- case 'String':
361
- case 'Url':
362
- return require('babel-types').stringTypeAnnotation();
363
- case 'Float':
364
- case 'Int':
365
- return require('babel-types').numberTypeAnnotation();
366
- case 'Boolean':
367
- return require('babel-types').booleanTypeAnnotation();
368
- default:
369
- return require('babel-types').anyTypeAnnotation();
329
+ function groupRefs(props) {
330
+ var result = [];
331
+ var refs = [];
332
+ props.forEach(function (prop) {
333
+ if (prop.ref) {
334
+ refs.push(prop.ref);
335
+ } else {
336
+ result.push(prop);
337
+ }
338
+ });
339
+ if (refs.length > 0) {
340
+ var _value3 = intersectionTypeAnnotation(refs.map(function (ref) {
341
+ return require('babel-types').identifier(getRefTypeName(ref));
342
+ }));
343
+ result.push({
344
+ key: '$fragmentRefs',
345
+ conditional: false,
346
+ value: _value3
347
+ });
370
348
  }
349
+ return result;
371
350
  }
372
351
 
373
- function transformGraphQLEnumType(type) {
374
- // TODO create a flow type for enums
375
- return require('babel-types').unionTypeAnnotation(type.getValues().map(function (_ref5) {
376
- var value = _ref5.value;
377
- return stringLiteralTypeAnnotation(value);
378
- }));
379
- }
380
-
381
- function transformNonNullableScalarField(type, objectProps, customScalars) {
382
- if (type instanceof GraphQLList) {
383
- return arrayOfType(transformScalarField(type.ofType, customScalars, objectProps));
384
- } else if (type instanceof GraphQLObjectType || type instanceof GraphQLUnionType || type instanceof GraphQLInterfaceType) {
385
- return objectProps;
386
- } else if (type instanceof GraphQLScalarType) {
387
- return transformGraphQLScalarType(type, customScalars);
388
- } else if (type instanceof GraphQLEnumType) {
389
- return transformGraphQLEnumType(type);
390
- } else {
391
- throw new Error('Could not convert from GraphQL type ' + type.toString());
392
- }
393
- }
352
+ function getFragmentImports(state) {
353
+ var imports = [];
354
+ if (state.usedFragments.size > 0) {
355
+ var _usedFragments = Array.from(state.usedFragments).sort();
356
+ var _iteratorNormalCompletion3 = true;
357
+ var _didIteratorError3 = false;
358
+ var _iteratorError3 = undefined;
394
359
 
395
- function transformNonNullableInputType(type, customScalars, inputFieldWhiteList) {
396
- if (type instanceof GraphQLList) {
397
- return arrayOfType(transformInputType(type.ofType, customScalars, inputFieldWhiteList));
398
- } else if (type instanceof GraphQLScalarType) {
399
- return transformGraphQLScalarType(type, customScalars);
400
- } else if (type instanceof GraphQLEnumType) {
401
- return transformGraphQLEnumType(type);
402
- } else if (type instanceof GraphQLInputObjectType) {
403
- var fields = type.getFields();
404
- var props = Object.keys(fields).map(function (key) {
405
- return fields[key];
406
- }).filter(function (field) {
407
- return !inputFieldWhiteList || inputFieldWhiteList.indexOf(field.name) < 0;
408
- }).map(function (field) {
409
- var property = require('babel-types').objectTypeProperty(require('babel-types').identifier(field.name), transformInputType(field.type, customScalars, inputFieldWhiteList));
410
- if (!(field.type instanceof GraphQLNonNull)) {
411
- property.optional = true;
360
+ try {
361
+ for (var _iterator3 = _usedFragments[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
362
+ var usedFragment = _step3.value;
363
+
364
+ var refTypeName = getRefTypeName(usedFragment);
365
+ if (!state.generatedFragments.has(usedFragment)) {
366
+ if (state.useHaste && state.existingFragmentNames.has(usedFragment)) {
367
+ // TODO(T22653277) support non-haste environments when importing
368
+ // fragments
369
+ imports.push(importTypes([refTypeName], usedFragment + '.graphql'));
370
+ } else {
371
+ imports.push(anyTypeAlias(refTypeName));
372
+ }
373
+ }
412
374
  }
413
- return property;
414
- });
415
- return require('babel-types').objectTypeAnnotation(props);
416
- } else {
417
- throw new Error('Could not convert from GraphQL type ' + type.toString());
375
+ } catch (err) {
376
+ _didIteratorError3 = true;
377
+ _iteratorError3 = err;
378
+ } finally {
379
+ try {
380
+ if (!_iteratorNormalCompletion3 && _iterator3['return']) {
381
+ _iterator3['return']();
382
+ }
383
+ } finally {
384
+ if (_didIteratorError3) {
385
+ throw _iteratorError3;
386
+ }
387
+ }
388
+ }
418
389
  }
390
+ return imports;
419
391
  }
420
392
 
421
- function transformInputType(type, customScalars, inputFieldWhiteList) {
422
- if (type instanceof GraphQLNonNull) {
423
- return transformNonNullableInputType(type.ofType, customScalars, inputFieldWhiteList);
424
- } else {
425
- return require('babel-types').nullableTypeAnnotation(transformNonNullableInputType(type, customScalars, inputFieldWhiteList));
393
+ function getEnumDefinitions(_ref2) {
394
+ var enumsHasteModule = _ref2.enumsHasteModule,
395
+ usedEnums = _ref2.usedEnums;
396
+
397
+ var enumNames = Object.keys(usedEnums).sort();
398
+ if (enumNames.length === 0) {
399
+ return [];
400
+ }
401
+ if (enumsHasteModule) {
402
+ return [importTypes(enumNames, enumsHasteModule)];
426
403
  }
404
+ return enumNames.map(function (name) {
405
+ var values = usedEnums[name].getValues().map(function (_ref3) {
406
+ var value = _ref3.value;
407
+ return value;
408
+ });
409
+ values.sort();
410
+ values.push('%future added value');
411
+ return exportType(name, require('babel-types').unionTypeAnnotation(values.map(function (value) {
412
+ return stringLiteralTypeAnnotation(value);
413
+ })));
414
+ });
427
415
  }
428
416
 
429
- function generateInputVariablesType(node, customScalars, inputFieldWhiteList) {
430
- return require('babel-types').exportNamedDeclaration(require('babel-types').typeAlias(require('babel-types').identifier(node.name + 'Variables'), null, exactObjectTypeAnnotation(node.argumentDefinitions.map(function (arg) {
431
- var property = require('babel-types').objectTypeProperty(require('babel-types').identifier(arg.name), transformInputType(arg.type, customScalars, inputFieldWhiteList));
432
- if (!(arg.type instanceof GraphQLNonNull)) {
433
- property.optional = true;
434
- }
435
- return property;
436
- }))), [], null);
417
+ function getRefTypeName(name) {
418
+ return name + '$ref';
437
419
  }
438
420
 
439
- var FLOW_TRANSFORMS = [function (ctx) {
440
- return require('./RelayFlattenTransform').transform(ctx, {});
441
- }];
421
+ var FLOW_TRANSFORMS = [require('./RelayRelayDirectiveTransform').transform, require('./RelayMaskTransform').transform, FlattenTransform.transformWithOptions({})];
442
422
 
443
423
  module.exports = {
444
- generate: generate,
424
+ generate: Profiler.instrument(generate, 'RelayFlowGenerator.generate'),
445
425
  flowTransforms: FLOW_TRANSFORMS
446
426
  };
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Copyright (c) 2013-present, Facebook, Inc.
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
+ * @providesModule RelayFlowTypeTransformers
8
+ *
9
+ * @format
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ var _require = require('./RelayFlowBabelFactories'),
15
+ readOnlyArrayOfType = _require.readOnlyArrayOfType;
16
+
17
+ var _require2 = require('graphql'),
18
+ GraphQLEnumType = _require2.GraphQLEnumType,
19
+ GraphQLInputType = _require2.GraphQLInputType,
20
+ GraphQLInputObjectType = _require2.GraphQLInputObjectType,
21
+ GraphQLInterfaceType = _require2.GraphQLInterfaceType,
22
+ GraphQLList = _require2.GraphQLList,
23
+ GraphQLNonNull = _require2.GraphQLNonNull,
24
+ GraphQLObjectType = _require2.GraphQLObjectType,
25
+ GraphQLScalarType = _require2.GraphQLScalarType,
26
+ GraphQLType = _require2.GraphQLType,
27
+ GraphQLUnionType = _require2.GraphQLUnionType;
28
+
29
+ function transformScalarType(type, state, objectProps) {
30
+ if (type instanceof GraphQLNonNull) {
31
+ return transformNonNullableScalarType(type.ofType, state, objectProps);
32
+ } else {
33
+ return require('babel-types').nullableTypeAnnotation(transformNonNullableScalarType(type, state, objectProps));
34
+ }
35
+ }
36
+
37
+ function transformNonNullableScalarType(type, state, objectProps) {
38
+ if (type instanceof GraphQLList) {
39
+ return readOnlyArrayOfType(transformScalarType(type.ofType, state, objectProps));
40
+ } else if (type instanceof GraphQLObjectType || type instanceof GraphQLUnionType || type instanceof GraphQLInterfaceType) {
41
+ return objectProps;
42
+ } else if (type instanceof GraphQLScalarType) {
43
+ return transformGraphQLScalarType(type, state);
44
+ } else if (type instanceof GraphQLEnumType) {
45
+ return transformGraphQLEnumType(type, state);
46
+ } else {
47
+ throw new Error('Could not convert from GraphQL type ' + type.toString());
48
+ }
49
+ }
50
+
51
+ function transformGraphQLScalarType(type, state) {
52
+ switch (state.customScalars[type.name] || type.name) {
53
+ case 'ID':
54
+ case 'String':
55
+ case 'Url':
56
+ return require('babel-types').stringTypeAnnotation();
57
+ case 'Float':
58
+ case 'Int':
59
+ return require('babel-types').numberTypeAnnotation();
60
+ case 'Boolean':
61
+ return require('babel-types').booleanTypeAnnotation();
62
+ default:
63
+ return require('babel-types').anyTypeAnnotation();
64
+ }
65
+ }
66
+
67
+ function transformGraphQLEnumType(type, state) {
68
+ state.usedEnums[type.name] = type;
69
+ return require('babel-types').genericTypeAnnotation(require('babel-types').identifier(type.name));
70
+ }
71
+
72
+ function transformInputType(type, state) {
73
+ if (type instanceof GraphQLNonNull) {
74
+ return transformNonNullableInputType(type.ofType, state);
75
+ } else {
76
+ return require('babel-types').nullableTypeAnnotation(transformNonNullableInputType(type, state));
77
+ }
78
+ }
79
+
80
+ function transformNonNullableInputType(type, state) {
81
+ if (type instanceof GraphQLList) {
82
+ return readOnlyArrayOfType(transformInputType(type.ofType, state));
83
+ } else if (type instanceof GraphQLScalarType) {
84
+ return transformGraphQLScalarType(type, state);
85
+ } else if (type instanceof GraphQLEnumType) {
86
+ return transformGraphQLEnumType(type, state);
87
+ } else if (type instanceof GraphQLInputObjectType) {
88
+ var fields = type.getFields();
89
+ var props = Object.keys(fields).map(function (key) {
90
+ return fields[key];
91
+ }).filter(function (field) {
92
+ return state.inputFieldWhiteList.indexOf(field.name) < 0;
93
+ }).map(function (field) {
94
+ var property = require('babel-types').objectTypeProperty(require('babel-types').identifier(field.name), transformInputType(field.type, state));
95
+ if (!(field.type instanceof GraphQLNonNull)) {
96
+ property.optional = true;
97
+ }
98
+ return property;
99
+ });
100
+ return require('babel-types').objectTypeAnnotation(props);
101
+ } else {
102
+ throw new Error('Could not convert from GraphQL type ' + type.toString());
103
+ }
104
+ }
105
+
106
+ module.exports = {
107
+ transformInputType: transformInputType,
108
+ transformScalarType: transformScalarType
109
+ };