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
@@ -0,0 +1,464 @@
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 RelayDeferrableFragmentTransform
8
+ *
9
+ * @format
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ var _extends3 = _interopRequireDefault(require('babel-runtime/helpers/extends'));
15
+
16
+ var _toConsumableArray3 = _interopRequireDefault(require('babel-runtime/helpers/toConsumableArray'));
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
19
+
20
+ var _require = require('graphql'),
21
+ doTypesOverlap = _require.doTypesOverlap,
22
+ getNamedType = _require.getNamedType,
23
+ isInputType = _require.isInputType,
24
+ GraphQLInterfaceType = _require.GraphQLInterfaceType,
25
+ GraphQLList = _require.GraphQLList,
26
+ GraphQLInputType = _require.GraphQLInputType;
27
+
28
+ var _require2 = require('./GraphQLCompilerPublic'),
29
+ IRTransformer = _require2.IRTransformer,
30
+ IRVisitor = _require2.IRVisitor;
31
+
32
+ var DEFERRABLE_ARGUMENT_NAME = 'deferrableID';
33
+
34
+ /**
35
+ * Deferrable fragment spreads are transformed into a series of individual
36
+ * dependent operation requests, expected to be executed as part of a batch
37
+ * operation.
38
+ *
39
+ * To achieve this transform, two steps are performed:
40
+ *
41
+ * 1) `transformOperations` is responsible for identifying which fragments
42
+ * are deferrable and creating new root operations for them, as well as
43
+ * creating the "dependent request" associations between them.
44
+ *
45
+ * 2) `transformSpreads` is responsible for replacing deferrable fragment
46
+ * spreads with an `id` field. This step should only apply to the "query"
47
+ * compiler phase, so that the request sent to the GraphQL server does not
48
+ * contain the deferrable fragment and in its place has the information
49
+ * necessary to later fulfill that fragment.
50
+ *
51
+ */
52
+ function transformOperations(context) {
53
+ // First, in an initial pass over all definitions, collect the path to each
54
+ // fragment spread from within a fragment or operation, as well as the set of
55
+ var spreadUsesWithin = new Map();
56
+ var deferrableFragments = new Set();
57
+ context.forEachDocument(function (document) {
58
+ var pathParts = [];
59
+ var spreadUses = [];
60
+ spreadUsesWithin.set(document, spreadUses);
61
+ IRVisitor.visit(document, {
62
+ LinkedField: {
63
+ enter: function enter(field) {
64
+ var pathPart = field.alias || field.name;
65
+ var fieldType = field.type;
66
+ while (fieldType.ofType) {
67
+ if (fieldType instanceof GraphQLList) {
68
+ pathPart += '[*]';
69
+ }
70
+ fieldType = fieldType.ofType;
71
+ }
72
+ pathParts.push(pathPart);
73
+ },
74
+ leave: function leave() {
75
+ pathParts.pop();
76
+ }
77
+ },
78
+ FragmentSpread: function FragmentSpread(spread) {
79
+ spreadUses.push({ spread: spread, path: pathParts.join('.') });
80
+ if (isDeferrable(spread)) {
81
+ deferrableFragments.add(context.getFragment(spread.name));
82
+ }
83
+ }
84
+ });
85
+ });
86
+
87
+ // If no fragments have been deferrable, then no transformation is necessary.
88
+ if (deferrableFragments.size === 0) {
89
+ return context;
90
+ }
91
+
92
+ // Next, transform any existing root operations to include references to
93
+ // their dependent requests.
94
+ var transformedContext = IRTransformer.transform(context, {
95
+ Root: function Root(root) {
96
+ var dependentRequests = createDependentRequests(context, spreadUsesWithin, root);
97
+ // If this operation contains deferrable spreads, then it will have
98
+ // additional dependent requests.
99
+ return dependentRequests.length === 0 ? root : (0, _extends3['default'])({}, root, {
100
+ dependentRequests: [].concat((0, _toConsumableArray3['default'])(root.dependentRequests), dependentRequests)
101
+ });
102
+ }
103
+ });
104
+
105
+ // Finally, add new operations representing each deferrable fragment.
106
+ var deferrableOperations = Array.from(deferrableFragments).map(function (fragment) {
107
+ // Create the deferrable operation.
108
+ var deferrableOperation = createDeferrableOperation(context, fragment);
109
+
110
+ // Include the deferrable operation along with the necessary
111
+ // additional variable definitions and dependent requests.
112
+ var argumentDefinitions = createArgumentDefinitions(context, spreadUsesWithin,
113
+ // variablesWithin,
114
+ fragment);
115
+ var dependentRequests = createDependentRequests(context, spreadUsesWithin, fragment);
116
+ var completeDeferrableOperation = (0, _extends3['default'])({}, deferrableOperation, {
117
+ argumentDefinitions: [].concat((0, _toConsumableArray3['default'])(deferrableOperation.argumentDefinitions), argumentDefinitions),
118
+ dependentRequests: [].concat((0, _toConsumableArray3['default'])(deferrableOperation.dependentRequests), dependentRequests)
119
+ });
120
+ return completeDeferrableOperation;
121
+ });
122
+
123
+ return transformedContext.addAll(deferrableOperations);
124
+ }
125
+
126
+ /**
127
+ * The second step of the Deferrable transform, replacing deferrable spreads
128
+ * with deferrable refetch references which correspond to the dependent requests
129
+ */
130
+ function transformSpreads(context) {
131
+ // Next, transform the definitions:
132
+ // - Replacing deferrable spreads with refetch references.
133
+ // - Adding dependent requests to operations.
134
+ return IRTransformer.transform(context, {
135
+ FragmentSpread: function FragmentSpread(spread) {
136
+ if (!isDeferrable(spread)) {
137
+ return spread;
138
+ }
139
+ // If this spread is deferrable, replace it with a refetch reference.
140
+ // The deferrable reference is definitionally not a FragmentSpread,
141
+ // though the transformer expects functions to return the same type.
142
+ return createDeferrableReference(context, spread);
143
+ }
144
+ });
145
+ }
146
+
147
+ // True if the FragmentSpread is marked as deferrable.
148
+ function isDeferrable(spread) {
149
+ return Boolean(spread.metadata && spread.metadata.deferrable);
150
+ }
151
+
152
+ // Given a fragment, return the variable definitions necessary for all
153
+ // variables used across deeply within.
154
+ function createArgumentDefinitions(context, spreadUsesWithin, fragment) {
155
+ // Collect all recursively included definitions from the root.
156
+ var includedFragments = new Set([fragment]);
157
+ var nodesToVisit = [fragment];
158
+ while (nodesToVisit.length !== 0) {
159
+ var spreadUses = require('fbjs/lib/nullthrows')(spreadUsesWithin.get(nodesToVisit.pop()));
160
+ for (var i = 0; i < spreadUses.length; i++) {
161
+ var includedFragment = context.getFragment(spreadUses[i].spread.name);
162
+ if (!includedFragments.has(includedFragment)) {
163
+ includedFragments.add(includedFragment);
164
+ nodesToVisit.push(includedFragment);
165
+ }
166
+ }
167
+ }
168
+
169
+ // Then get all variables used in all included fragments to determine
170
+ // additional variable definitions, ensuring one definition per variable.
171
+ var variableDefinitions = new Map();
172
+ var _iteratorNormalCompletion = true;
173
+ var _didIteratorError = false;
174
+ var _iteratorError = undefined;
175
+
176
+ try {
177
+ for (var _iterator = includedFragments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
178
+ var _includedFragment = _step.value;
179
+ var _iteratorNormalCompletion2 = true;
180
+ var _didIteratorError2 = false;
181
+ var _iteratorError2 = undefined;
182
+
183
+ try {
184
+ for (var _iterator2 = _includedFragment.argumentDefinitions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
185
+ var argumentDefinition = _step2.value;
186
+
187
+ if (!variableDefinitions.has(argumentDefinition.name)) {
188
+ variableDefinitions.set(argumentDefinition.name, {
189
+ kind: 'LocalArgumentDefinition',
190
+ metadata: argumentDefinition.metadata,
191
+ name: argumentDefinition.name,
192
+ type: argumentDefinition.type,
193
+ defaultValue: argumentDefinition.kind === 'LocalArgumentDefinition' ? argumentDefinition.defaultValue : undefined
194
+ });
195
+ }
196
+ }
197
+ } catch (err) {
198
+ _didIteratorError2 = true;
199
+ _iteratorError2 = err;
200
+ } finally {
201
+ try {
202
+ if (!_iteratorNormalCompletion2 && _iterator2['return']) {
203
+ _iterator2['return']();
204
+ }
205
+ } finally {
206
+ if (_didIteratorError2) {
207
+ throw _iteratorError2;
208
+ }
209
+ }
210
+ }
211
+ }
212
+ } catch (err) {
213
+ _didIteratorError = true;
214
+ _iteratorError = err;
215
+ } finally {
216
+ try {
217
+ if (!_iteratorNormalCompletion && _iterator['return']) {
218
+ _iterator['return']();
219
+ }
220
+ } finally {
221
+ if (_didIteratorError) {
222
+ throw _iteratorError;
223
+ }
224
+ }
225
+ }
226
+
227
+ return Array.from(variableDefinitions.values());
228
+ }
229
+
230
+ // Given a fragment or node, return the set of dependent requests to fulfill.
231
+ // Defines the relationship between deferrable reference selections (above) and
232
+ // the deferrable operations dependent on them (below).
233
+ function createDependentRequests(context, spreadUsesWithin, from) {
234
+ var spreadUses = getDeferrableSpreadUses(context, spreadUsesWithin, from);
235
+ return spreadUses.map(function (_ref) {
236
+ var spread = _ref.spread,
237
+ path = _ref.path;
238
+ return {
239
+ operationName: spread.name + '_Deferrable',
240
+ metadata: {
241
+ deferrable: true,
242
+ fragmentName: spread.name,
243
+ rootFieldVariable: DEFERRABLE_ARGUMENT_NAME
244
+ },
245
+ argumentDependencies: [{
246
+ kind: 'ArgumentDependency',
247
+ argumentName: DEFERRABLE_ARGUMENT_NAME,
248
+ fromName: from.name,
249
+ fromPath: path + '.' + deferrableAlias(spread.name),
250
+ ifList: 'each',
251
+ ifNull: 'skip'
252
+ }]
253
+ };
254
+ });
255
+ }
256
+
257
+ // A utility function which collects the paths to deferrable spreads from
258
+ // a given starting Root or Fragment definition. Used above to determine the
259
+ // dependent requests from an operation.
260
+ var memoizedDeferrableSpreadUses = new WeakMap();
261
+ function getDeferrableSpreadUses(context, spreadUsesWithin, node) {
262
+ var deferrableSpreadUses = memoizedDeferrableSpreadUses.get(node);
263
+ if (!deferrableSpreadUses) {
264
+ deferrableSpreadUses = [];
265
+ var _iteratorNormalCompletion3 = true;
266
+ var _didIteratorError3 = false;
267
+ var _iteratorError3 = undefined;
268
+
269
+ try {
270
+ for (var _iterator3 = require('fbjs/lib/nullthrows')(spreadUsesWithin.get(node))[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
271
+ var spreadUse = _step3.value;
272
+
273
+ if (isDeferrable(spreadUse.spread)) {
274
+ deferrableSpreadUses.push(spreadUse);
275
+ } else {
276
+ var nestedSpreadUses = getDeferrableSpreadUses(context, spreadUsesWithin, context.getFragment(spreadUse.spread.name));
277
+ var _iteratorNormalCompletion4 = true;
278
+ var _didIteratorError4 = false;
279
+ var _iteratorError4 = undefined;
280
+
281
+ try {
282
+ for (var _iterator4 = nestedSpreadUses[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
283
+ var nestedSpreadUse = _step4.value;
284
+
285
+ deferrableSpreadUses.push({
286
+ spread: nestedSpreadUse.spread,
287
+ path: spreadUse.path + '.' + nestedSpreadUse.path
288
+ });
289
+ }
290
+ } catch (err) {
291
+ _didIteratorError4 = true;
292
+ _iteratorError4 = err;
293
+ } finally {
294
+ try {
295
+ if (!_iteratorNormalCompletion4 && _iterator4['return']) {
296
+ _iterator4['return']();
297
+ }
298
+ } finally {
299
+ if (_didIteratorError4) {
300
+ throw _iteratorError4;
301
+ }
302
+ }
303
+ }
304
+ }
305
+ }
306
+ } catch (err) {
307
+ _didIteratorError3 = true;
308
+ _iteratorError3 = err;
309
+ } finally {
310
+ try {
311
+ if (!_iteratorNormalCompletion3 && _iterator3['return']) {
312
+ _iterator3['return']();
313
+ }
314
+ } finally {
315
+ if (_didIteratorError3) {
316
+ throw _iteratorError3;
317
+ }
318
+ }
319
+ }
320
+
321
+ memoizedDeferrableSpreadUses.set(node, deferrableSpreadUses);
322
+ }
323
+ return deferrableSpreadUses;
324
+ }
325
+
326
+ // Utility function for creating a deferrable reference selection from a
327
+ // deferrable fragment spread. This selection will be depended upon by another
328
+ // operation in a batch request to fulfill the deferrable fragment.
329
+ function createDeferrableReference(context, spread) {
330
+ var schema = context.clientSchema;
331
+ var nodeType = getNodeType(schema);
332
+ var idType = getIdType(schema);
333
+ var fragmentType = context.getFragment(spread.name).type;
334
+ require('fbjs/lib/invariant')(doTypesOverlap(schema, fragmentType, nodeType), 'RelayDeferrableFragmentsTransform: Cannot defer %s since objects of ' + 'type %s can never also be of type Node.', spread.name, fragmentType);
335
+ require('fbjs/lib/invariant')(spread.args.length === 0, 'RelayDeferrableFragmentsTransform: Cannot defer %s with arguments.', spread.name);
336
+ // The deferrable fragment spread is replaced with two nested inline
337
+ // fragments. The outer of which ensures the type condition of the original
338
+ // fragment applies, while the inner specfically conditions on Node, so
339
+ // id may be safely queried. This is a conservative application known to
340
+ // always be safe, however the "FlattenTransform" may remove these if they
341
+ // are unnecessary.
342
+ //
343
+ // The metadata and directives of the deferrable fragment spread are
344
+ // transferred to the deferrable id field.
345
+ return {
346
+ kind: 'InlineFragment',
347
+ metadata: null,
348
+ typeCondition: fragmentType,
349
+ directives: [],
350
+ selections: [{
351
+ kind: 'InlineFragment',
352
+ metadata: null,
353
+ typeCondition: nodeType,
354
+ directives: [],
355
+ selections: [deferrableFragmentSpread(spread, idType)]
356
+ }]
357
+ };
358
+ }
359
+
360
+ // Utility function for creating an operation from a deferrable fragment.
361
+ function createDeferrableOperation(context, fragment) {
362
+ var schema = context.clientSchema;
363
+ var queryType = schema.getQueryType();
364
+ require('fbjs/lib/invariant')(queryType, 'RelayDeferrableFragmentTransform: "Query" must be a defined type');
365
+ var nodeField = queryType.getFields().node;
366
+ require('fbjs/lib/invariant')(nodeField, 'RelayDeferrableFragmentTransform: "Query" must define the field "node"');
367
+ var idArg = nodeField.args.find(function (arg) {
368
+ return arg.name === 'id';
369
+ });
370
+ require('fbjs/lib/invariant')(idArg && isInputType(idArg.type), 'RelayDeferrableFragmentTransform: "node" field must define the argument "id"');
371
+ var idType = idArg.type;
372
+ return {
373
+ kind: 'Root',
374
+ operation: 'query',
375
+ metadata: { deferred: true },
376
+ name: fragment.name + '_Deferrable',
377
+ dependentRequests: [],
378
+ argumentDefinitions: [{
379
+ kind: 'LocalArgumentDefinition',
380
+ metadata: null,
381
+ name: DEFERRABLE_ARGUMENT_NAME,
382
+ defaultValue: null,
383
+ type: idType
384
+ }],
385
+ directives: [],
386
+ selections: [{
387
+ kind: 'LinkedField',
388
+ name: 'node',
389
+ alias: null,
390
+ args: [{
391
+ kind: 'Argument',
392
+ name: 'id',
393
+ metadata: null,
394
+ value: {
395
+ kind: 'Variable',
396
+ variableName: DEFERRABLE_ARGUMENT_NAME,
397
+ metadata: null,
398
+ type: idType
399
+ },
400
+ type: idType
401
+ }],
402
+ directives: [],
403
+ metadata: null,
404
+ handles: null,
405
+ selections: [{
406
+ kind: 'FragmentSpread',
407
+ args: [],
408
+ name: fragment.name,
409
+ metadata: null,
410
+ directives: []
411
+ }],
412
+ type: nodeField.type
413
+ }],
414
+ type: queryType
415
+ };
416
+ }
417
+
418
+ function deferrableAlias(name) {
419
+ return name + '_' + DEFERRABLE_ARGUMENT_NAME;
420
+ }
421
+
422
+ function deferrableFragmentSpread(spread, idType) {
423
+ return {
424
+ kind: 'DeferrableFragmentSpread',
425
+ name: spread.name,
426
+ directives: [],
427
+ fragmentArgs: spread.args,
428
+ args: [{
429
+ kind: 'Argument',
430
+ name: DEFERRABLE_ARGUMENT_NAME,
431
+ metadata: null,
432
+ value: {
433
+ kind: 'Variable',
434
+ variableName: DEFERRABLE_ARGUMENT_NAME,
435
+ metadata: null,
436
+ type: idType
437
+ },
438
+ type: idType
439
+ }],
440
+ rootFieldVariable: DEFERRABLE_ARGUMENT_NAME,
441
+ storageKey: 'id',
442
+ alias: deferrableAlias(spread.name)
443
+ };
444
+ }
445
+
446
+ function getNodeType(schema) {
447
+ var nodeType = schema.getType('Node');
448
+ require('fbjs/lib/invariant')(nodeType instanceof GraphQLInterfaceType, 'RelayDeferrableFragmentTransform: Schema must define the interface "Node".');
449
+ return nodeType;
450
+ }
451
+
452
+ function getIdType(schema) {
453
+ var nodeType = getNodeType(schema);
454
+ var idField = nodeType.getFields().id;
455
+ require('fbjs/lib/invariant')(idField, 'RelayDeferrableFragmentTransform: "Node" must define the field "id"');
456
+ var idType = getNamedType(idField.type);
457
+ require('fbjs/lib/invariant')(isInputType(idType), 'RelayDeferrableFragmentTransform: "Node" must define the scalar field "id"');
458
+ return idType;
459
+ }
460
+
461
+ module.exports = {
462
+ transformOperations: transformOperations,
463
+ transformSpreads: transformSpreads
464
+ };
package/lib/RelayError.js CHANGED
@@ -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 RelayError
10
8
  *
@@ -43,9 +41,7 @@ var RelayError = {
43
41
  * @private
44
42
  */
45
43
  function createError(type, name, format, args) {
46
- /*eslint-disable fb-www/sprintf-like-args */
47
44
  var error = new Error(require('fbjs/lib/sprintf').apply(undefined, [format].concat((0, _toConsumableArray3['default'])(args))));
48
- /*eslint-enable fb-www/sprintf-like-args */
49
45
  error.name = name;
50
46
  error.type = type;
51
47
  error.framesToPop = 2;
@@ -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 RelayFieldHandleTransform
10
8
  *
@@ -13,25 +11,29 @@
13
11
 
14
12
  'use strict';
15
13
 
14
+ // TODO T21875029 ../../relay-runtime/util/getRelayHandleKey
15
+
16
16
  var _extends3 = _interopRequireDefault(require('babel-runtime/helpers/extends'));
17
17
 
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
19
19
 
20
- function transform(context, schema) {
21
- return require('./RelayIRTransformer').transform(context, {
20
+ var _require = require('./GraphQLCompilerPublic'),
21
+ CompilerContext = _require.CompilerContext,
22
+ IRTransformer = _require.IRTransformer;
23
+
24
+ function relayFieldHandleTransform(context) {
25
+ return IRTransformer.transform(context, {
22
26
  LinkedField: visitField,
23
27
  ScalarField: visitField
24
- }, function () {
25
- return true;
26
28
  });
27
29
  }
28
30
 
29
31
  /**
30
32
  * @internal
31
33
  */
32
- function visitField(field, state) {
34
+ function visitField(field) {
33
35
  if (field.kind === 'LinkedField') {
34
- field = this.traverse(field, state);
36
+ field = this.traverse(field);
35
37
  }
36
38
  var handles = field.handles;
37
39
  if (!handles || !handles.length) {
@@ -55,4 +57,6 @@ function visitField(field, state) {
55
57
  });
56
58
  }
57
59
 
58
- module.exports = { transform: transform };
60
+ module.exports = {
61
+ transform: relayFieldHandleTransform
62
+ };