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 RelayFileWriter
10
8
  *
@@ -23,58 +21,66 @@ var _toConsumableArray3 = _interopRequireDefault(require('babel-runtime/helpers/
23
21
 
24
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
25
23
 
26
- var _require = require('./GraphQLSchemaUtils'),
27
- isOperationDefinitionAST = _require.isOperationDefinitionAST;
24
+ var _require = require('./GraphQLCompilerPublic'),
25
+ ASTConvert = _require.ASTConvert,
26
+ CodegenDirectory = _require.CodegenDirectory,
27
+ CompilerContext = _require.CompilerContext,
28
+ Profiler = _require.Profiler,
29
+ SchemaUtils = _require.SchemaUtils;
28
30
 
29
- var _require2 = require('./RelayCodeGenerator'),
30
- generate = _require2.generate;
31
+ var _require2 = require('immutable'),
32
+ ImmutableMap = _require2.Map;
31
33
 
32
- var _require3 = require('immutable'),
33
- ImmutableMap = _require3.Map;
34
-
35
- /* eslint-disable no-console-disallow */
34
+ var isExecutableDefinitionAST = SchemaUtils.isExecutableDefinitionAST;
36
35
 
37
36
  var RelayFileWriter = function () {
38
- function RelayFileWriter(options) {
37
+ function RelayFileWriter(_ref) {
38
+ var config = _ref.config,
39
+ onlyValidate = _ref.onlyValidate,
40
+ baseDocuments = _ref.baseDocuments,
41
+ documents = _ref.documents,
42
+ schema = _ref.schema,
43
+ reporter = _ref.reporter,
44
+ sourceControl = _ref.sourceControl;
39
45
  (0, _classCallCheck3['default'])(this, RelayFileWriter);
40
- var config = options.config,
41
- onlyValidate = options.onlyValidate,
42
- baseDocuments = options.baseDocuments,
43
- documents = options.documents,
44
- schema = options.schema;
45
46
 
46
47
  this._baseDocuments = baseDocuments || ImmutableMap();
47
48
  this._baseSchema = schema;
48
49
  this._config = config;
49
50
  this._documents = documents;
50
51
  this._onlyValidate = onlyValidate;
52
+ this._reporter = reporter;
53
+ this._sourceControl = sourceControl;
51
54
 
52
55
  validateConfig(this._config);
53
56
  }
54
57
 
55
- RelayFileWriter.prototype.writeAll = (() => {
56
- var _ref = (0, _asyncToGenerator3.default)(function* () {
57
- var _this = this;
58
-
59
- var tStart = Date.now();
58
+ RelayFileWriter.prototype.writeAll = function writeAll() {
59
+ var _this = this;
60
60
 
61
+ return Profiler.asyncContext('RelayFileWriter.writeAll', (0, _asyncToGenerator3.default)(function* () {
61
62
  // Can't convert to IR unless the schema already has Relay-local extensions
62
- var transformedSchema = require('./ASTConvert').transformASTSchema(this._baseSchema, this._config.schemaExtensions);
63
- var extendedSchema = require('./ASTConvert').extendASTSchema(transformedSchema, this._baseDocuments.merge(this._documents).valueSeq().toArray());
63
+ var transformedSchema = ASTConvert.transformASTSchema(_this._baseSchema, _this._config.schemaExtensions);
64
+ var extendedSchema = ASTConvert.extendASTSchema(transformedSchema, _this._baseDocuments.merge(_this._documents).valueSeq().toArray());
64
65
 
65
66
  // Build a context from all the documents
66
67
  var baseDefinitionNames = new Set();
67
- this._baseDocuments.forEach(function (doc) {
68
+ _this._baseDocuments.forEach(function (doc) {
68
69
  doc.definitions.forEach(function (def) {
69
- if (isOperationDefinitionAST(def) && def.name) {
70
+ if (isExecutableDefinitionAST(def) && def.name) {
70
71
  baseDefinitionNames.add(def.name.value);
71
72
  }
72
73
  });
73
74
  });
74
- var definitionDirectories = new Map();
75
+ var definitionsMeta = new Map();
76
+ var getDefinitionMeta = function getDefinitionMeta(definitionName) {
77
+ var definitionMeta = definitionsMeta.get(definitionName);
78
+ require('fbjs/lib/invariant')(definitionMeta, 'RelayFileWriter: Could not determine source for definition: `%s`.', definitionName);
79
+ return definitionMeta;
80
+ };
75
81
  var allOutputDirectories = new Map();
76
82
  var addCodegenDir = function addCodegenDir(dirPath) {
77
- var codegenDir = new (require('./CodegenDirectory'))(dirPath, {
83
+ var codegenDir = new CodegenDirectory(dirPath, {
78
84
  onlyValidate: _this._onlyValidate
79
85
  });
80
86
  allOutputDirectories.set(dirPath, codegenDir);
@@ -82,33 +88,38 @@ var RelayFileWriter = function () {
82
88
  };
83
89
 
84
90
  var configOutputDirectory = void 0;
85
- if (this._config.outputDir) {
86
- configOutputDirectory = addCodegenDir(this._config.outputDir);
87
- } else {
88
- this._documents.forEach(function (doc, filePath) {
89
- doc.definitions.forEach(function (def) {
90
- if (isOperationDefinitionAST(def) && def.name) {
91
- definitionDirectories.set(def.name.value, require('path').join(_this._config.baseDir, require('path').dirname(filePath)));
92
- }
93
- });
94
- });
91
+ if (_this._config.outputDir) {
92
+ configOutputDirectory = addCodegenDir(_this._config.outputDir);
95
93
  }
96
94
 
97
- var definitions = require('./ASTConvert').convertASTDocumentsWithBase(extendedSchema, this._baseDocuments.valueSeq().toArray(), this._documents.valueSeq().toArray(),
95
+ _this._documents.forEach(function (doc, filePath) {
96
+ doc.definitions.forEach(function (def) {
97
+ if (def.name) {
98
+ definitionsMeta.set(def.name.value, {
99
+ dir: require('path').join(_this._config.baseDir, require('path').dirname(filePath)),
100
+ ast: def
101
+ });
102
+ }
103
+ });
104
+ });
105
+
98
106
  // Verify using local and global rules, can run global verifications here
99
107
  // because all files are processed together
100
- [].concat((0, _toConsumableArray3['default'])(require('./RelayValidator').LOCAL_RULES), (0, _toConsumableArray3['default'])(require('./RelayValidator').GLOBAL_RULES)));
108
+ var validationRules = [].concat((0, _toConsumableArray3['default'])(require('./RelayValidator').LOCAL_RULES), (0, _toConsumableArray3['default'])(require('./RelayValidator').GLOBAL_RULES));
109
+ var customizedValidationRules = _this._config.validationRules;
110
+ if (customizedValidationRules) {
111
+ validationRules = [].concat((0, _toConsumableArray3['default'])(validationRules), (0, _toConsumableArray3['default'])(customizedValidationRules.LOCAL_RULES || []), (0, _toConsumableArray3['default'])(customizedValidationRules.GLOBAL_RULES || []));
112
+ }
101
113
 
102
- var compilerContext = new (require('./RelayCompilerContext'))(extendedSchema);
103
- var compiler = new (require('./RelayCompiler'))(this._baseSchema, compilerContext, this._config.compilerTransforms, generate);
114
+ var definitions = ASTConvert.convertASTDocumentsWithBase(extendedSchema, _this._baseDocuments.valueSeq().toArray(), _this._documents.valueSeq().toArray(), validationRules, require('./RelayParser').transform.bind(require('./RelayParser')));
115
+
116
+ var compilerContext = new CompilerContext(_this._baseSchema, extendedSchema).addAll(definitions);
104
117
 
105
118
  var getGeneratedDirectory = function getGeneratedDirectory(definitionName) {
106
119
  if (configOutputDirectory) {
107
120
  return configOutputDirectory;
108
121
  }
109
- var definitionDir = definitionDirectories.get(definitionName);
110
- require('fbjs/lib/invariant')(definitionDir, 'RelayFileWriter: Could not determine source directory for definition: %s', definitionName);
111
- var generatedPath = require('path').join(definitionDir, '__generated__');
122
+ var generatedPath = require('path').join(getDefinitionMeta(definitionName).dir, '__generated__');
112
123
  var cachedDir = allOutputDirectories.get(generatedPath);
113
124
  if (!cachedDir) {
114
125
  cachedDir = addCodegenDir(generatedPath);
@@ -116,63 +127,86 @@ var RelayFileWriter = function () {
116
127
  return cachedDir;
117
128
  };
118
129
 
119
- compiler.addDefinitions(definitions);
130
+ var transformedFlowContext = compilerContext.applyTransforms(require('./RelayFlowGenerator').flowTransforms, _this._reporter);
131
+ var transformedQueryContext = compilerContext.applyTransforms([].concat((0, _toConsumableArray3['default'])(_this._config.compilerTransforms.commonTransforms), (0, _toConsumableArray3['default'])(_this._config.compilerTransforms.queryTransforms)), _this._reporter);
132
+ var artifacts = require('./compileRelayArtifacts')(compilerContext, _this._config.compilerTransforms, _this._reporter);
133
+
134
+ var existingFragmentNames = new Set(definitions.map(function (definition) {
135
+ return definition.name;
136
+ }));
120
137
 
121
- var transformedFlowContext = require('./RelayFlowGenerator').flowTransforms.reduce(function (ctx, transform) {
122
- return transform(ctx, extendedSchema);
123
- }, compiler.context());
124
- var transformedQueryContext = compiler.transformedQueryContext();
125
- var compiledDocumentMap = compiler.compile();
138
+ // TODO(T22651734): improve this to correctly account for fragments that
139
+ // have generated flow types.
140
+ baseDefinitionNames.forEach(function (baseDefinitionName) {
141
+ existingFragmentNames['delete'](baseDefinitionName);
142
+ });
126
143
 
127
- var tCompiled = Date.now();
144
+ var formatModule = Profiler.instrument(_this._config.formatModule, 'RelayFileWriter:formatModule');
145
+
146
+ var persistQuery = _this._config.persistQuery ? Profiler.instrumentWait(_this._config.persistQuery, 'RelayFileWriter:persistQuery') : null;
128
147
 
129
- var tGenerated = void 0;
130
148
  try {
131
- yield Promise.all(transformedFlowContext.documents().map((() => {
132
- var _ref2 = (0, _asyncToGenerator3.default)(function* (node) {
149
+ yield Promise.all(artifacts.map((() => {
150
+ var _ref3 = (0, _asyncToGenerator3.default)(function* (node) {
133
151
  if (baseDefinitionNames.has(node.name)) {
134
152
  // don't add definitions that were part of base context
135
153
  return;
136
154
  }
137
- if (_this._config.fragmentsWithLegacyFlowTypes && _this._config.fragmentsWithLegacyFlowTypes.has(node.name)) {
138
- var legacyFlowTypes = require('./printFlowTypes')(node);
139
- if (legacyFlowTypes) {
140
- require('./writeLegacyFlowFile')(getGeneratedDirectory(node.name), node.name, legacyFlowTypes, _this._config.platform);
141
- }
155
+ if (node.metadata && node.metadata.deferred) {
156
+ // don't write deferred operations, the batch request is
157
+ // responsible for them
158
+ return;
142
159
  }
160
+ var relayRuntimeModule = _this._config.relayRuntimeModule || 'relay-runtime';
161
+
162
+ var flowNode = transformedFlowContext.get(node.name);
163
+ require('fbjs/lib/invariant')(flowNode, 'RelayFileWriter: did not compile flow types for: %s', node.name);
143
164
 
144
- var flowTypes = require('./RelayFlowGenerator').generate(node, _this._config.customScalars, _this._config.inputFieldWhiteListForFlow);
165
+ var flowTypes = require('./RelayFlowGenerator').generate(flowNode, {
166
+ customScalars: _this._config.customScalars,
167
+ enumsHasteModule: _this._config.enumsHasteModule,
168
+ existingFragmentNames: existingFragmentNames,
169
+ inputFieldWhiteList: _this._config.inputFieldWhiteListForFlow,
170
+ relayRuntimeModule: relayRuntimeModule,
171
+ useHaste: _this._config.useHaste
172
+ });
145
173
 
146
- var compiledNode = compiledDocumentMap.get(node.name);
147
- require('fbjs/lib/invariant')(compiledNode, 'RelayCompiler: did not compile definition: %s', node.name);
148
- yield require('./writeRelayGeneratedFile')(getGeneratedDirectory(compiledNode.name), getGeneratedNode(compiledNode), _this._config.formatModule, flowTypes, _this._config.persistQuery, _this._config.platform, _this._config.relayRuntimeModule || 'relay-runtime');
174
+ var sourceHash = Profiler.run('hashGraphQL', function () {
175
+ return md5(require('graphql').print(getDefinitionMeta(node.name).ast));
176
+ });
177
+
178
+ yield require('./writeRelayGeneratedFile')(getGeneratedDirectory(node.name), node, formatModule, flowTypes, persistQuery, _this._config.platform, relayRuntimeModule, sourceHash);
149
179
  });
150
180
 
151
181
  return function (_x) {
152
- return _ref2.apply(this, arguments);
182
+ return _ref3.apply(this, arguments);
153
183
  };
154
184
  })()));
155
- tGenerated = Date.now();
156
-
157
- if (this._config.generateExtraFiles) {
158
- var configDirectory = this._config.outputDir;
159
- this._config.generateExtraFiles(function (dir) {
160
- var outputDirectory = dir || configDirectory;
161
- require('fbjs/lib/invariant')(outputDirectory, 'RelayFileWriter: cannot generate extra files without specifying ' + 'an outputDir in the config or passing it in.');
162
- var outputDir = allOutputDirectories.get(outputDirectory);
163
- if (!outputDir) {
164
- outputDir = addCodegenDir(outputDirectory);
165
- }
166
- return outputDir;
167
- }, transformedQueryContext, getGeneratedDirectory);
185
+
186
+ var _generateExtraFiles = _this._config.generateExtraFiles;
187
+ if (_generateExtraFiles) {
188
+ Profiler.run('RelayFileWriter:generateExtraFiles', function () {
189
+ var configDirectory = _this._config.outputDir;
190
+ _generateExtraFiles(function (dir) {
191
+ var outputDirectory = dir || configDirectory;
192
+ require('fbjs/lib/invariant')(outputDirectory, 'RelayFileWriter: cannot generate extra files without specifying ' + 'an outputDir in the config or passing it in.');
193
+ var outputDir = allOutputDirectories.get(outputDirectory);
194
+ if (!outputDir) {
195
+ outputDir = addCodegenDir(outputDirectory);
196
+ }
197
+ return outputDir;
198
+ }, transformedQueryContext, getGeneratedDirectory);
199
+ });
168
200
  }
169
201
 
170
202
  // clean output directories
171
203
  allOutputDirectories.forEach(function (dir) {
172
204
  dir.deleteExtraFiles();
173
205
  });
206
+ if (_this._sourceControl && !_this._onlyValidate) {
207
+ yield CodegenDirectory.sourceControlAddRemove(_this._sourceControl, Array.from(allOutputDirectories.values()));
208
+ }
174
209
  } catch (error) {
175
- tGenerated = Date.now();
176
210
  var details = void 0;
177
211
  try {
178
212
  details = JSON.parse(error.message);
@@ -180,31 +214,18 @@ var RelayFileWriter = function () {
180
214
  if (details && details.name === 'GraphQL2Exception' && details.message) {
181
215
  throw new Error('GraphQL error writing modules:\n' + details.message);
182
216
  }
183
- throw new Error('Error writing modules:\n' + error.toString());
217
+ throw new Error('Error writing modules:\n' + String(error.stack || error));
184
218
  }
185
219
 
186
- var tExtra = Date.now();
187
- console.log('Writer time: %s [%s compiling, %s generating, %s extra]', toSeconds(tStart, tExtra), toSeconds(tStart, tCompiled), toSeconds(tCompiled, tGenerated), toSeconds(tGenerated, tExtra));
188
220
  return allOutputDirectories;
189
- });
190
-
191
- function writeAll() {
192
- return _ref.apply(this, arguments);
193
- }
194
-
195
- return writeAll;
196
- })();
221
+ }));
222
+ };
197
223
 
198
224
  return RelayFileWriter;
199
225
  }();
200
226
 
201
- function getGeneratedNode(compiledNode) {
202
- require('fbjs/lib/invariant')(typeof compiledNode === 'object' && compiledNode !== null && (compiledNode.kind === 'Fragment' || compiledNode.kind === 'Batch'), 'getGeneratedNode: Expected a GeneratedNode, got `%s`.', JSON.stringify(compiledNode));
203
- return compiledNode;
204
- }
205
-
206
- function toSeconds(t0, t1) {
207
- return ((t1 - t0) / 1000).toFixed(2) + 's';
227
+ function md5(x) {
228
+ return require('crypto').createHash('md5').update(x, 'utf8').digest('hex');
208
229
  }
209
230
 
210
231
  function validateConfig(config) {
@@ -0,0 +1,113 @@
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 RelayFlowBabelFactories
8
+ *
9
+ * @format
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ /**
15
+ * type NAME = any;
16
+ */
17
+ function anyTypeAlias(name) {
18
+ return require('babel-types').typeAlias(require('babel-types').identifier(name), null, require('babel-types').anyTypeAnnotation());
19
+ }
20
+
21
+ /**
22
+ * {|
23
+ * PROPS
24
+ * |}
25
+ */
26
+ function exactObjectTypeAnnotation(props) {
27
+ var typeAnnotation = require('babel-types').objectTypeAnnotation(props);
28
+ typeAnnotation.exact = true;
29
+ return typeAnnotation;
30
+ }
31
+
32
+ /**
33
+ * export type NAME = TYPE
34
+ */
35
+ function exportType(name, type) {
36
+ return require('babel-types').exportNamedDeclaration(require('babel-types').typeAlias(require('babel-types').identifier(name), null, type), [], null);
37
+ }
38
+
39
+ /**
40
+ * import type {NAMES[0], NAMES[1], ...} from 'MODULE';
41
+ */
42
+ function importTypes(names, module) {
43
+ var importDeclaration = require('babel-types').importDeclaration(names.map(function (name) {
44
+ return require('babel-types').importSpecifier(require('babel-types').identifier(name), require('babel-types').identifier(name));
45
+ }), require('babel-types').stringLiteral(module));
46
+ importDeclaration.importKind = 'type';
47
+ return importDeclaration;
48
+ }
49
+
50
+ /**
51
+ * Create an intersection type if needed.
52
+ *
53
+ * TYPES[0] & TYPES[1] & ...
54
+ */
55
+ function intersectionTypeAnnotation(types) {
56
+ require('fbjs/lib/invariant')(types.length > 0, 'RelayFlowBabelFactories: cannot create an intersection of 0 types');
57
+ return types.length === 1 ? types[0] : require('babel-types').intersectionTypeAnnotation(types);
58
+ }
59
+
60
+ function lineComments() {
61
+ for (var _len = arguments.length, lines = Array(_len), _key = 0; _key < _len; _key++) {
62
+ lines[_key] = arguments[_key];
63
+ }
64
+
65
+ return lines.map(function (line) {
66
+ return { type: 'CommentLine', value: ' ' + line };
67
+ });
68
+ }
69
+
70
+ /**
71
+ * $ReadOnlyArray<TYPE>
72
+ */
73
+ function readOnlyArrayOfType(thing) {
74
+ return require('babel-types').genericTypeAnnotation(require('babel-types').identifier('$ReadOnlyArray'), require('babel-types').typeParameterInstantiation([thing]));
75
+ }
76
+
77
+ /**
78
+ * +KEY: VALUE
79
+ */
80
+ function readOnlyObjectTypeProperty(key, value) {
81
+ var prop = require('babel-types').objectTypeProperty(require('babel-types').identifier(key), value);
82
+ prop.variance = 'plus';
83
+ return prop;
84
+ }
85
+
86
+ function stringLiteralTypeAnnotation(value) {
87
+ var annotation = require('babel-types').stringLiteralTypeAnnotation();
88
+ annotation.value = value;
89
+ return annotation;
90
+ }
91
+
92
+ /**
93
+ * Create a union type if needed.
94
+ *
95
+ * TYPES[0] | TYPES[1] | ...
96
+ */
97
+ function unionTypeAnnotation(types) {
98
+ require('fbjs/lib/invariant')(types.length > 0, 'RelayFlowBabelFactories: cannot create a union of 0 types');
99
+ return types.length === 1 ? types[0] : require('babel-types').unionTypeAnnotation(types);
100
+ }
101
+
102
+ module.exports = {
103
+ anyTypeAlias: anyTypeAlias,
104
+ exactObjectTypeAnnotation: exactObjectTypeAnnotation,
105
+ exportType: exportType,
106
+ importTypes: importTypes,
107
+ intersectionTypeAnnotation: intersectionTypeAnnotation,
108
+ lineComments: lineComments,
109
+ readOnlyArrayOfType: readOnlyArrayOfType,
110
+ readOnlyObjectTypeProperty: readOnlyObjectTypeProperty,
111
+ stringLiteralTypeAnnotation: stringLiteralTypeAnnotation,
112
+ unionTypeAnnotation: unionTypeAnnotation
113
+ };