relay-compiler 10.0.1 → 10.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. package/bin/relay-compiler +1347 -604
  2. package/codegen/NormalizationCodeGenerator.js.flow +12 -4
  3. package/codegen/ReaderCodeGenerator.js.flow +38 -3
  4. package/codegen/RelayFileWriter.js.flow +2 -0
  5. package/codegen/writeRelayGeneratedFile.js.flow +1 -1
  6. package/core/ASTCache.js.flow +1 -0
  7. package/core/CompilerContext.js.flow +1 -0
  8. package/core/IR.js.flow +0 -1
  9. package/core/IRPrinter.js.flow +3 -8
  10. package/core/RelayIRTransforms.js.flow +7 -0
  11. package/core/Schema.js.flow +55 -1
  12. package/index.js +1 -1
  13. package/language/javascript/FindGraphQLTags.js.flow +2 -97
  14. package/language/javascript/RelayFlowBabelFactories.js.flow +11 -15
  15. package/language/javascript/RelayFlowGenerator.js.flow +76 -19
  16. package/language/javascript/RelayFlowTypeTransformers.js.flow +4 -4
  17. package/lib/bin/RelayCompilerMain.js +5 -5
  18. package/lib/codegen/CodegenRunner.js +2 -2
  19. package/lib/codegen/NormalizationCodeGenerator.js +20 -8
  20. package/lib/codegen/ReaderCodeGenerator.js +43 -8
  21. package/lib/codegen/RelayFileWriter.js +2 -2
  22. package/lib/codegen/compileRelayArtifacts.js +2 -2
  23. package/lib/codegen/sortObjectByKey.js +2 -2
  24. package/lib/codegen/writeRelayGeneratedFile.js +2 -2
  25. package/lib/core/ASTCache.js +1 -0
  26. package/lib/core/CompilerContext.js +1 -0
  27. package/lib/core/CompilerError.js +2 -2
  28. package/lib/core/IRPrinter.js +3 -4
  29. package/lib/core/RelayGraphQLEnumsGenerator.js +2 -2
  30. package/lib/core/RelayIRTransforms.js +10 -4
  31. package/lib/core/RelayParser.js +4 -4
  32. package/lib/core/Schema.js +48 -7
  33. package/lib/core/getFieldDefinition.js +2 -2
  34. package/lib/core/inferRootArgumentDefinitions.js +4 -4
  35. package/lib/language/javascript/FindGraphQLTags.js +3 -69
  36. package/lib/language/javascript/RelayFlowBabelFactories.js +5 -5
  37. package/lib/language/javascript/RelayFlowGenerator.js +80 -21
  38. package/lib/runner/Artifacts.js +2 -2
  39. package/lib/runner/BufferedFilesystem.js +2 -2
  40. package/lib/runner/GraphQLASTNodeGroup.js +2 -2
  41. package/lib/runner/GraphQLNodeMap.js +2 -2
  42. package/lib/runner/Sources.js +21 -2
  43. package/lib/runner/StrictMap.js +2 -2
  44. package/lib/runner/getChangedNodeNames.js +2 -2
  45. package/lib/transforms/ApplyFragmentArgumentTransform.js +14 -14
  46. package/lib/transforms/ClientExtensionsTransform.js +5 -3
  47. package/lib/transforms/ConnectionTransform.js +8 -9
  48. package/lib/transforms/DeclarativeConnectionMutationTransform.js +113 -55
  49. package/lib/transforms/DeferStreamTransform.js +2 -2
  50. package/lib/transforms/DisallowTypenameOnRoot.js +2 -2
  51. package/lib/transforms/FieldHandleTransform.js +2 -2
  52. package/lib/transforms/FilterCompilerDirectivesTransform.js +29 -0
  53. package/lib/transforms/FlattenTransform.js +13 -12
  54. package/lib/transforms/GenerateIDFieldTransform.js +2 -2
  55. package/lib/transforms/GenerateTypeNameTransform.js +3 -3
  56. package/lib/transforms/InlineDataFragmentTransform.js +2 -2
  57. package/lib/transforms/MaskTransform.js +3 -3
  58. package/lib/transforms/MatchTransform.js +7 -3
  59. package/lib/transforms/ReactFlightComponentTransform.js +162 -0
  60. package/lib/transforms/RefetchableFragmentTransform.js +4 -4
  61. package/lib/transforms/RelayDirectiveTransform.js +2 -2
  62. package/lib/transforms/RequiredFieldTransform.js +380 -0
  63. package/lib/transforms/SkipHandleFieldTransform.js +1 -1
  64. package/lib/transforms/SkipRedundantNodesTransform.js +3 -1
  65. package/lib/transforms/SkipUnreachableNodeTransform.js +1 -1
  66. package/lib/transforms/SkipUnusedVariablesTransform.js +3 -3
  67. package/lib/transforms/TestOperationTransform.js +2 -2
  68. package/lib/transforms/ValidateGlobalVariablesTransform.js +2 -2
  69. package/lib/transforms/ValidateRequiredArgumentsTransform.js +2 -2
  70. package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +2 -2
  71. package/lib/transforms/ValidateUnusedVariablesTransform.js +2 -2
  72. package/lib/transforms/query-generators/FetchableQueryGenerator.js +1 -1
  73. package/lib/transforms/query-generators/NodeQueryGenerator.js +1 -1
  74. package/lib/transforms/query-generators/index.js +2 -2
  75. package/lib/transforms/query-generators/utils.js +2 -2
  76. package/package.json +3 -3
  77. package/relay-compiler.js +4 -4
  78. package/relay-compiler.min.js +4 -4
  79. package/runner/Sources.js.flow +14 -0
  80. package/transforms/ClientExtensionsTransform.js.flow +2 -0
  81. package/transforms/ConnectionTransform.js.flow +0 -1
  82. package/transforms/DeclarativeConnectionMutationTransform.js.flow +137 -48
  83. package/transforms/FieldHandleTransform.js.flow +0 -1
  84. package/transforms/FilterCompilerDirectivesTransform.js.flow +33 -0
  85. package/transforms/FlattenTransform.js.flow +3 -2
  86. package/transforms/MatchTransform.js.flow +6 -0
  87. package/transforms/ReactFlightComponentTransform.js.flow +195 -0
  88. package/transforms/RequiredFieldTransform.js.flow +415 -0
  89. package/transforms/SkipRedundantNodesTransform.js.flow +3 -0
@@ -16,9 +16,9 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
16
16
 
17
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
19
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
20
20
 
21
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
21
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
22
22
 
23
23
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
24
24
 
@@ -35,10 +35,15 @@ var _require2 = require('relay-runtime'),
35
35
  ConnectionInterface = _require2.ConnectionInterface;
36
36
 
37
37
  var DELETE_RECORD = 'deleteRecord';
38
+ var DELETE_EDGE = 'deleteEdge';
38
39
  var APPEND_EDGE = 'appendEdge';
39
40
  var PREPEND_EDGE = 'prependEdge';
40
- var LINKED_FIELD_DIRECTIVES = [APPEND_EDGE, PREPEND_EDGE];
41
- var SCHEMA_EXTENSION = "\n directive @".concat(DELETE_RECORD, " on FIELD\n directive @").concat(APPEND_EDGE, "(\n connections: [String!]!\n ) on FIELD\n directive @").concat(PREPEND_EDGE, "(\n connections: [String!]!\n ) on FIELD\n");
41
+ var APPEND_NODE = 'appendNode';
42
+ var PREPEND_NODE = 'prependNode';
43
+ var EDGE_LINKED_FIELD_DIRECTIVES = [APPEND_EDGE, PREPEND_EDGE];
44
+ var NODE_LINKED_FIELD_DIRECTIVES = [APPEND_NODE, PREPEND_NODE];
45
+ var LINKED_FIELD_DIRECTIVES = [].concat(EDGE_LINKED_FIELD_DIRECTIVES, NODE_LINKED_FIELD_DIRECTIVES);
46
+ var SCHEMA_EXTENSION = "\n directive @".concat(DELETE_RECORD, " on FIELD\n directive @").concat(DELETE_EDGE, "(\n connections: [ID!]!\n ) on FIELD\n directive @").concat(APPEND_EDGE, "(\n connections: [ID!]!\n ) on FIELD\n directive @").concat(PREPEND_EDGE, "(\n connections: [ID!]!\n ) on FIELD\n directive @").concat(APPEND_NODE, "(\n connections: [ID!]!\n edgeTypeName: String!\n ) on FIELD\n directive @").concat(PREPEND_NODE, "(\n connections: [ID!]!\n edgeTypeName: String!\n ) on FIELD\n");
42
47
 
43
48
  function transform(context) {
44
49
  return IRTransformer.transform(context, {
@@ -62,29 +67,42 @@ function visitScalarField(field) {
62
67
  throw createUserError("Invalid use of @".concat(linkedFieldDirective.name, " on scalar field '").concat(field.name, "'"), [linkedFieldDirective.loc]);
63
68
  }
64
69
 
65
- var deleteDirective = field.directives.find(function (directive) {
70
+ var deleteNodeDirective = field.directives.find(function (directive) {
66
71
  return directive.name === DELETE_RECORD;
67
72
  });
73
+ var deleteEdgeDirective = field.directives.find(function (directive) {
74
+ return directive.name === DELETE_EDGE;
75
+ });
76
+
77
+ if (deleteNodeDirective != null && deleteEdgeDirective != null) {
78
+ throw createUserError("Both @deleteNode and @deleteEdge are used on field '".concat(field.name, "'. Only one directive is supported for now."), [deleteNodeDirective.loc, deleteEdgeDirective.loc]);
79
+ }
80
+
81
+ var targetDirective = deleteNodeDirective !== null && deleteNodeDirective !== void 0 ? deleteNodeDirective : deleteEdgeDirective;
68
82
 
69
- if (deleteDirective == null) {
83
+ if (targetDirective == null) {
70
84
  return field;
71
85
  }
72
86
 
73
87
  var schema = this.getContext().getSchema();
74
88
 
75
- if (!schema.isId(field.type)) {
76
- throw createUserError("Invalid use of @".concat(DELETE_RECORD, " on field '").concat(field.name, "'. Expected field type ID, got ").concat(schema.getTypeString(field.type), "."), [deleteDirective.loc]);
89
+ if (!schema.isId(schema.getRawType(field.type))) {
90
+ throw createUserError("Invalid use of @".concat(targetDirective.name, " on field '").concat(field.name, "'. Expected field to return an ID or list of ID values, got ").concat(schema.getTypeString(field.type), "."), [targetDirective.loc]);
77
91
  }
78
92
 
93
+ var connectionsArg = targetDirective.args.find(function (arg) {
94
+ return arg.name === 'connections';
95
+ });
79
96
  var handle = {
80
- name: DELETE_RECORD,
97
+ name: targetDirective.name,
81
98
  key: '',
82
99
  dynamicKey: null,
83
- filters: null
100
+ filters: null,
101
+ handleArgs: connectionsArg ? [connectionsArg] : undefined
84
102
  };
85
- return _objectSpread({}, field, {
103
+ return _objectSpread(_objectSpread({}, field), {}, {
86
104
  directives: field.directives.filter(function (directive) {
87
- return directive !== deleteDirective;
105
+ return directive !== targetDirective;
88
106
  }),
89
107
  handles: field.handles ? [].concat((0, _toConsumableArray2["default"])(field.handles), [handle]) : [handle]
90
108
  });
@@ -101,64 +119,104 @@ function visitLinkedField(field) {
101
119
  }
102
120
 
103
121
  var edgeDirective = transformedField.directives.find(function (directive) {
104
- return LINKED_FIELD_DIRECTIVES.indexOf(directive.name) > -1;
122
+ return EDGE_LINKED_FIELD_DIRECTIVES.indexOf(directive.name) > -1;
123
+ });
124
+ var nodeDirective = transformedField.directives.find(function (directive) {
125
+ return NODE_LINKED_FIELD_DIRECTIVES.indexOf(directive.name) > -1;
105
126
  });
106
127
 
107
- if (edgeDirective == null) {
128
+ if (edgeDirective == null && nodeDirective == null) {
108
129
  return transformedField;
109
130
  }
110
131
 
111
- var connectionsArg = edgeDirective.args.find(function (arg) {
132
+ if (edgeDirective != null && nodeDirective != null) {
133
+ throw createUserError("Invalid use of @".concat(edgeDirective.name, " and @").concat(nodeDirective.name, " on field '").concat(transformedField.name, "' - these directives cannot be used together."), [edgeDirective.loc]);
134
+ }
135
+
136
+ var targetDirective = edgeDirective !== null && edgeDirective !== void 0 ? edgeDirective : nodeDirective;
137
+ var connectionsArg = targetDirective.args.find(function (arg) {
112
138
  return arg.name === 'connections';
113
139
  });
114
140
 
115
141
  if (connectionsArg == null) {
116
- throw createUserError("Expected the 'connections' argument to be defined on @".concat(edgeDirective.name, "."), [edgeDirective.loc]);
142
+ throw createUserError("Expected the 'connections' argument to be defined on @".concat(targetDirective.name, "."), [targetDirective.loc]);
117
143
  }
118
144
 
119
145
  var schema = this.getContext().getSchema();
120
- var fields = schema.getFields(transformedField.type);
121
- var cursorFieldID;
122
- var nodeFieldID;
123
-
124
- var _iterator = _createForOfIteratorHelper(fields),
125
- _step;
126
-
127
- try {
128
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
129
- var fieldID = _step.value;
130
- var fieldName = schema.getFieldName(fieldID);
131
-
132
- if (fieldName === ConnectionInterface.get().CURSOR) {
133
- cursorFieldID = fieldID;
134
- } else if (fieldName === ConnectionInterface.get().NODE) {
135
- nodeFieldID = fieldID;
136
- }
137
- } // Edge
138
-
139
- } catch (err) {
140
- _iterator.e(err);
141
- } finally {
142
- _iterator.f();
143
- }
144
146
 
145
- if (cursorFieldID != null && nodeFieldID != null) {
146
- var handle = {
147
- name: edgeDirective.name,
148
- key: '',
149
- dynamicKey: null,
150
- filters: null,
151
- handleArgs: [connectionsArg]
152
- };
153
- return _objectSpread({}, transformedField, {
154
- directives: transformedField.directives.filter(function (directive) {
155
- return directive !== edgeDirective;
156
- }),
157
- handles: transformedField.handles ? [].concat((0, _toConsumableArray2["default"])(transformedField.handles), [handle]) : [handle]
147
+ if (edgeDirective) {
148
+ var fields = schema.getFields(transformedField.type);
149
+ var cursorFieldID;
150
+ var nodeFieldID;
151
+
152
+ var _iterator = _createForOfIteratorHelper(fields),
153
+ _step;
154
+
155
+ try {
156
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
157
+ var fieldID = _step.value;
158
+ var fieldName = schema.getFieldName(fieldID);
159
+
160
+ if (fieldName === ConnectionInterface.get().CURSOR) {
161
+ cursorFieldID = fieldID;
162
+ } else if (fieldName === ConnectionInterface.get().NODE) {
163
+ nodeFieldID = fieldID;
164
+ }
165
+ } // Edge
166
+
167
+ } catch (err) {
168
+ _iterator.e(err);
169
+ } finally {
170
+ _iterator.f();
171
+ }
172
+
173
+ if (cursorFieldID != null && nodeFieldID != null) {
174
+ var handle = {
175
+ name: edgeDirective.name,
176
+ key: '',
177
+ dynamicKey: null,
178
+ filters: null,
179
+ handleArgs: [connectionsArg]
180
+ };
181
+ return _objectSpread(_objectSpread({}, transformedField), {}, {
182
+ directives: transformedField.directives.filter(function (directive) {
183
+ return directive !== edgeDirective;
184
+ }),
185
+ handles: transformedField.handles ? [].concat((0, _toConsumableArray2["default"])(transformedField.handles), [handle]) : [handle]
186
+ });
187
+ }
188
+
189
+ throw createUserError("Unsupported use of @".concat(edgeDirective.name, " on field '").concat(transformedField.name, "', expected an edge field (a field with 'cursor' and 'node' selection)."), [targetDirective.loc]);
190
+ } else {
191
+ // Node
192
+ var edgeTypeNameArg = nodeDirective.args.find(function (arg) {
193
+ return arg.name === 'edgeTypeName';
158
194
  });
159
- }
160
195
 
161
- throw createUserError("Unsupported use of @".concat(edgeDirective.name, " on field '").concat(transformedField.name, "', expected an edge field (a field with 'cursor' and 'node' selection)."), [edgeDirective.loc]);
196
+ if (!edgeTypeNameArg) {
197
+ throw createUserError("Unsupported use of @".concat(nodeDirective.name, " on field '").concat(transformedField.name, "', 'edgeTypeName' argument must be provided."), [targetDirective.loc]);
198
+ }
199
+
200
+ var rawType = schema.getRawType(transformedField.type);
201
+
202
+ if (schema.canHaveSelections(rawType)) {
203
+ var _handle = {
204
+ name: nodeDirective.name,
205
+ key: '',
206
+ dynamicKey: null,
207
+ filters: null,
208
+ handleArgs: [connectionsArg, edgeTypeNameArg]
209
+ };
210
+ return _objectSpread(_objectSpread({}, transformedField), {}, {
211
+ directives: transformedField.directives.filter(function (directive) {
212
+ return directive !== nodeDirective;
213
+ }),
214
+ handles: transformedField.handles ? [].concat((0, _toConsumableArray2["default"])(transformedField.handles), [_handle]) : [_handle]
215
+ });
216
+ }
217
+
218
+ throw createUserError("Unsupported use of @".concat(nodeDirective.name, " on field '").concat(transformedField.name, "'. Expected an object, union or interface, but got '").concat(schema.getTypeString(transformedField.type), "'."), [nodeDirective.loc]);
219
+ }
162
220
  }
163
221
 
164
222
  module.exports = {
@@ -95,7 +95,7 @@ function visitLinkedField(field, state) {
95
95
  throw createUserError("Invalid use of @stream on non-plural field '".concat(field.name, "'"), [streamDirective.loc]);
96
96
  }
97
97
 
98
- transformedField = _objectSpread({}, transformedField, {
98
+ transformedField = _objectSpread(_objectSpread({}, transformedField), {}, {
99
99
  directives: transformedField.directives.filter(function (directive) {
100
100
  return directive.name !== 'stream';
101
101
  })
@@ -173,7 +173,7 @@ function visitFragmentSpread(spread, state) {
173
173
  return transformedSpread;
174
174
  }
175
175
 
176
- transformedSpread = _objectSpread({}, transformedSpread, {
176
+ transformedSpread = _objectSpread(_objectSpread({}, transformedSpread), {}, {
177
177
  directives: transformedSpread.directives.filter(function (directive) {
178
178
  return directive.name !== 'defer';
179
179
  })
@@ -10,9 +10,9 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
14
 
15
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
16
 
17
17
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
18
 
@@ -58,7 +58,7 @@ function visitField(field) {
58
58
  var filters = handle.filters;
59
59
  var args = filters ? nextField.args.filter(function (arg) {
60
60
  return filters.indexOf(arg.name) !== -1;
61
- }) : []; // T45504512: new connection model
61
+ }) : [];
62
62
 
63
63
  if (handle.dynamicKey != null) {
64
64
  args.push({
@@ -70,7 +70,7 @@ function visitField(field) {
70
70
  });
71
71
  }
72
72
 
73
- return _objectSpread({}, nextField, {
73
+ return _objectSpread(_objectSpread({}, nextField), {}, {
74
74
  args: args,
75
75
  alias: alias,
76
76
  name: name,
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ 'use strict';
11
+
12
+ var IRTransformer = require('../core/IRTransformer');
13
+
14
+ var COMPILE_TIME_DIRECTIVES = new Set(['required']);
15
+ /**
16
+ * A transform that removes any directives that are only interpreted by the Relay compiler.
17
+ */
18
+
19
+ function filterDirectivesTransform(context) {
20
+ return IRTransformer.transform(context, {
21
+ Directive: function Directive(directive) {
22
+ return COMPILE_TIME_DIRECTIVES.has(directive.name) ? null : directive;
23
+ }
24
+ });
25
+ }
26
+
27
+ module.exports = {
28
+ transform: filterDirectivesTransform
29
+ };
@@ -45,9 +45,10 @@ function flattenTransformImpl(context, options) {
45
45
  Condition: visitorFn,
46
46
  Defer: visitorFn,
47
47
  Fragment: visitorFn,
48
- InlineFragment: visitorFn,
49
48
  InlineDataFragmentSpread: visitorFn,
49
+ InlineFragment: visitorFn,
50
50
  LinkedField: visitorFn,
51
+ ModuleImport: visitorFn,
51
52
  Root: visitorFn,
52
53
  SplitOperation: visitorFn
53
54
  }, function () {
@@ -84,7 +85,7 @@ function memoizedFlattenSelection(cache) {
84
85
 
85
86
  var nextSelections = new Map();
86
87
  var hasFlattened = flattenSelectionsInto(context.getSchema(), nextSelections, node, state, type);
87
- var flattenedNode = hasFlattened ? _objectSpread({}, node, {
88
+ var flattenedNode = hasFlattened ? _objectSpread(_objectSpread({}, node), {}, {
88
89
  selections: Array.from(nextSelections.values())
89
90
  }) : node;
90
91
  state.parentType = type;
@@ -124,7 +125,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
124
125
  throw createCompilerError("FlattenTransform: Expected an InlineFragment, got a '".concat(selection.kind, "'"), [selection.loc]);
125
126
  }
126
127
 
127
- flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
128
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({}, flattenedSelection), {}, {
128
129
  selections: mergeSelections(schema, flattenedSelection, selection, state, selection.typeCondition)
129
130
  }));
130
131
  } else if (flattenedSelection.kind === 'Condition') {
@@ -132,7 +133,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
132
133
  throw createCompilerError("FlattenTransform: Expected a Condition, got a '".concat(selection.kind, "'"), [selection.loc]);
133
134
  }
134
135
 
135
- flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
136
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({}, flattenedSelection), {}, {
136
137
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
137
138
  }));
138
139
  } else if (flattenedSelection.kind === 'ClientExtension') {
@@ -140,7 +141,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
140
141
  throw createCompilerError("FlattenTransform: Expected a ClientExtension, got a '".concat(selection.kind, "'"), [selection.loc]);
141
142
  }
142
143
 
143
- flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
144
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({}, flattenedSelection), {}, {
144
145
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
145
146
  }));
146
147
  } else if (flattenedSelection.kind === 'FragmentSpread') {// Ignore duplicate fragment spreads.
@@ -153,7 +154,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
153
154
  throw createUserError('Found conflicting @module selections: use a unique alias on the ' + 'parent fields.', [selection.loc, flattenedSelection.loc]);
154
155
  }
155
156
 
156
- flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
157
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({}, flattenedSelection), {}, {
157
158
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
158
159
  }));
159
160
  } else if (flattenedSelection.kind === 'Defer') {
@@ -161,9 +162,9 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
161
162
  throw createCompilerError("FlattenTransform: Expected a Defer, got a '".concat(selection.kind, "'"), [selection.loc]);
162
163
  }
163
164
 
164
- flattenedSelections.set(nodeIdentifier, _objectSpread({
165
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({
165
166
  kind: 'Defer'
166
- }, flattenedSelection, {
167
+ }, flattenedSelection), {}, {
167
168
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
168
169
  }));
169
170
  } else if (flattenedSelection.kind === 'Stream') {
@@ -171,9 +172,9 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
171
172
  throw createCompilerError("FlattenTransform: Expected a Stream, got a '".concat(selection.kind, "'"), [selection.loc]);
172
173
  }
173
174
 
174
- flattenedSelections.set(nodeIdentifier, _objectSpread({
175
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({
175
176
  kind: 'Stream'
176
- }, flattenedSelection, {
177
+ }, flattenedSelection), {}, {
177
178
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
178
179
  }));
179
180
  } else if (flattenedSelection.kind === 'LinkedField') {
@@ -204,9 +205,9 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
204
205
  assertUniqueArgsForAlias(selection, flattenedSelection);
205
206
 
206
207
  if (selection.handles && selection.handles.length > 0) {
207
- flattenedSelections.set(nodeIdentifier, _objectSpread({
208
+ flattenedSelections.set(nodeIdentifier, _objectSpread(_objectSpread({
208
209
  kind: 'ScalarField'
209
- }, flattenedSelection, {
210
+ }, flattenedSelection), {}, {
210
211
  handles: mergeHandles(selection, flattenedSelection)
211
212
  }));
212
213
  }
@@ -95,7 +95,7 @@ function visitLinkedField(field, state) {
95
95
  var unmodifiedType = schema.assertCompositeType(schema.getRawType(field.type)); // If the field type has an `id` subfield add an `id` selection
96
96
 
97
97
  if (schema.canHaveSelections(unmodifiedType) && schema.hasId(unmodifiedType)) {
98
- return _objectSpread({}, transformedNode, {
98
+ return _objectSpread(_objectSpread({}, transformedNode), {}, {
99
99
  selections: [].concat((0, _toConsumableArray2["default"])(transformedNode.selections), [state.idFieldForType(unmodifiedType)])
100
100
  });
101
101
  } // If the field type is abstract, then generate a `... on Node { id }`
@@ -126,7 +126,7 @@ function visitLinkedField(field, state) {
126
126
  }).forEach(function (concreteType) {
127
127
  selections.push(state.idFragmentForType(concreteType));
128
128
  });
129
- return _objectSpread({}, transformedNode, {
129
+ return _objectSpread(_objectSpread({}, transformedNode), {}, {
130
130
  selections: selections
131
131
  });
132
132
  }
@@ -69,7 +69,7 @@ function visitFragment(fragment, state) {
69
69
 
70
70
  if (!isClientType && schema.isAbstractType(rawType)) {
71
71
  var abstractKey = generateAbstractTypeRefinementKey(schema, rawType);
72
- transformedNode = _objectSpread({}, transformedNode, {
72
+ transformedNode = _objectSpread(_objectSpread({}, transformedNode), {}, {
73
73
  selections: [{
74
74
  kind: 'ScalarField',
75
75
  alias: abstractKey,
@@ -105,7 +105,7 @@ function visitInlineFragment(fragment, state) {
105
105
 
106
106
  if (!isClientType && schema.isAbstractType(rawType)) {
107
107
  var abstractKey = generateAbstractTypeRefinementKey(schema, rawType);
108
- transformedNode = _objectSpread({}, transformedNode, {
108
+ transformedNode = _objectSpread(_objectSpread({}, transformedNode), {}, {
109
109
  selections: [{
110
110
  kind: 'ScalarField',
111
111
  alias: abstractKey,
@@ -139,7 +139,7 @@ function visitLinkedField(field, state) {
139
139
  transformedNode = this.traverse(field, state);
140
140
 
141
141
  if (schema.isAbstractType(schema.getRawType(transformedNode.type)) && !hasUnaliasedSelection(transformedNode, TYPENAME_KEY)) {
142
- transformedNode = _objectSpread({}, transformedNode, {
142
+ transformedNode = _objectSpread(_objectSpread({}, transformedNode), {}, {
143
143
  selections: [state.typenameField].concat((0, _toConsumableArray2["default"])(transformedNode.selections))
144
144
  });
145
145
  }
@@ -49,11 +49,11 @@ function visitFragment(fragment) {
49
49
  return transformedFragment;
50
50
  }
51
51
 
52
- return _objectSpread({}, transformedFragment, {
52
+ return _objectSpread(_objectSpread({}, transformedFragment), {}, {
53
53
  directives: transformedFragment.directives.filter(function (directive) {
54
54
  return directive !== inlineDirective;
55
55
  }),
56
- metadata: _objectSpread({}, transformedFragment.metadata || {}, {
56
+ metadata: _objectSpread(_objectSpread({}, transformedFragment.metadata || {}), {}, {
57
57
  inlineData: true
58
58
  })
59
59
  });
@@ -14,9 +14,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
 
17
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
17
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
18
18
 
19
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
20
20
 
21
21
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
22
22
 
@@ -56,7 +56,7 @@ function visitFragment(fragment, state) {
56
56
  }
57
57
 
58
58
  var joinedArgumentDefinitions = joinArgumentDefinitions(this.getContext().getSchema(), fragment, state.reachableArguments, '@relay(unmask: true)');
59
- return _objectSpread({}, result, {
59
+ return _objectSpread(_objectSpread({}, result), {}, {
60
60
  argumentDefinitions: joinedArgumentDefinitions
61
61
  });
62
62
  }
@@ -64,7 +64,7 @@ function matchTransform(context) {
64
64
  }
65
65
 
66
66
  function visitInlineFragment(node, state) {
67
- return this.traverse(node, _objectSpread({}, state, {
67
+ return this.traverse(node, _objectSpread(_objectSpread({}, state), {}, {
68
68
  parentType: node.typeCondition
69
69
  }));
70
70
  }
@@ -111,7 +111,7 @@ function visitLinkedField(node, state) {
111
111
  }
112
112
 
113
113
  state.path.push(node);
114
- var transformedNode = this.traverse(node, _objectSpread({}, state, {
114
+ var transformedNode = this.traverse(node, _objectSpread(_objectSpread({}, state), {}, {
115
115
  moduleKey: moduleKey,
116
116
  parentType: node.type
117
117
  }));
@@ -135,6 +135,10 @@ function visitLinkedField(node, state) {
135
135
  });
136
136
 
137
137
  if (supportedArgumentDefinition == null) {
138
+ if (moduleKey == null) {
139
+ throw createUserError('@match on a field without the `supported` argument is a no-op, please remove the `@match`.', [node.loc]);
140
+ }
141
+
138
142
  return transformedNode;
139
143
  }
140
144
 
@@ -418,7 +422,7 @@ function visitFragmentSpread(spread, _ref2) {
418
422
  module: moduleName,
419
423
  sourceDocument: documentName,
420
424
  name: spread.name,
421
- selections: [_objectSpread({}, spread, {
425
+ selections: [_objectSpread(_objectSpread({}, spread), {}, {
422
426
  directives: spread.directives.filter(function (directive) {
423
427
  return directive !== moduleDirective;
424
428
  })