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.
- package/LICENSE +16 -26
- package/bin/relay-compiler +7348 -5939
- package/index.js +3 -6
- package/lib/{FileParser.js → ASTCache.js} +17 -14
- package/lib/ASTConvert.js +84 -70
- package/lib/CodegenDirectory.js +122 -28
- package/lib/{RelayCodegenRunner.js → CodegenRunner.js} +110 -186
- package/lib/CodegenTypes.js +12 -0
- package/lib/{RelayCodegenWatcher.js → CodegenWatcher.js} +53 -43
- package/lib/DefaultHandleKey.js +2 -4
- package/lib/DotGraphQLParser.js +27 -0
- package/lib/FilterDirectivesTransform.js +11 -11
- package/lib/FindGraphQLTags.js +33 -52
- package/lib/FlattenTransform.js +197 -0
- package/lib/GraphQLCompilerContext.js +158 -0
- package/lib/GraphQLCompilerProfiler.js +271 -0
- package/lib/GraphQLCompilerPublic.js +27 -22
- package/lib/GraphQLCompilerUserError.js +26 -0
- package/lib/GraphQLConsoleReporter.js +58 -0
- package/lib/GraphQLIR.js +12 -0
- package/lib/{RelayPrinter.js → GraphQLIRPrinter.js} +42 -38
- package/lib/{RelayIRTransformer.js → GraphQLIRTransformer.js} +47 -38
- package/lib/GraphQLIRTransforms.js +6 -15
- package/lib/{RelayIRVisitor.js → GraphQLIRVisitor.js} +7 -6
- package/lib/GraphQLMultiReporter.js +50 -0
- package/lib/GraphQLParser.js +743 -0
- package/lib/GraphQLReporter.js +12 -0
- package/lib/GraphQLSchemaUtils.js +10 -36
- package/lib/GraphQLValidator.js +13 -15
- package/lib/{RelayWatchmanClient.js → GraphQLWatchmanClient.js} +15 -17
- package/lib/InlineFragmentsTransform.js +48 -0
- package/lib/PatchedBabelGenerator.js +58 -0
- package/lib/RelayApplyFragmentArgumentTransform.js +37 -18
- package/lib/RelayCodeGenerator.js +130 -60
- package/lib/RelayCompilerBin.js +80 -35
- package/lib/RelayCompilerCache.js +18 -11
- package/lib/RelayCompilerPublic.js +24 -10
- package/lib/RelayCompilerScope.js +2 -4
- package/lib/RelayConcreteNode.js +31 -14
- package/lib/RelayConnectionConstants.js +2 -4
- package/lib/RelayConnectionTransform.js +34 -38
- package/lib/RelayDefaultHandleKey.js +2 -4
- package/lib/RelayDeferrableFragmentTransform.js +464 -0
- package/lib/RelayError.js +2 -6
- package/lib/RelayFieldHandleTransform.js +15 -11
- package/lib/RelayFileWriter.js +119 -98
- package/lib/RelayFlowBabelFactories.js +113 -0
- package/lib/RelayFlowGenerator.js +180 -200
- package/lib/RelayFlowTypeTransformers.js +109 -0
- package/lib/RelayGenerateIDFieldTransform.js +131 -0
- package/lib/RelayGenerateTypeNameTransform.js +75 -0
- package/lib/RelayGraphQLEnumsGenerator.js +65 -0
- package/lib/RelayIRTransforms.js +19 -23
- package/lib/RelayInternalTypes.js +2 -5
- package/lib/RelayInternals.js +2 -5
- package/lib/RelayJSModuleParser.js +64 -0
- package/lib/RelayMaskTransform.js +129 -0
- package/lib/RelayMetricsRecorder.js +9 -9
- package/lib/RelayMockRenderer.js +3 -8
- package/lib/RelayNetworkDebug.js +4 -7
- package/lib/RelayParser.js +28 -645
- package/lib/RelayProfiler.js +7 -7
- package/lib/RelayQueryCaching.js +2 -5
- package/lib/RelayRelayDirectiveTransform.js +47 -33
- package/lib/RelayRuntimeTypes.js +22 -0
- package/lib/RelayShallowMock.js +4 -7
- package/lib/RelaySkipHandleFieldTransform.js +13 -11
- package/lib/RelayTaskQueue.js +2 -5
- package/lib/RelayTransformUtils.js +20 -0
- package/lib/RelayTypes.js +2 -5
- package/lib/RelayValidator.js +9 -8
- package/lib/RelayViewerHandleTransform.js +22 -18
- package/lib/SkipClientFieldTransform.js +36 -53
- package/lib/SkipRedundantNodesTransform.js +22 -29
- package/lib/SkipUnreachableNodeTransform.js +57 -36
- package/lib/SourceControl.js +61 -0
- package/lib/StripUnusedVariablesTransform.js +86 -41
- package/lib/areEqualOSS.js +2 -4
- package/lib/compileRelayArtifacts.js +72 -0
- package/lib/dedent.js +2 -5
- package/lib/dedupeJSONStringify.js +132 -0
- package/lib/deepFreeze.js +3 -5
- package/lib/deepMergeAssignments.js +68 -0
- package/lib/filterContextForNode.js +5 -7
- package/lib/formatGeneratedModule.js +5 -9
- package/lib/{getIdentifierForRelayArgumentValue.js → getIdentifierForArgumentValue.js} +8 -10
- package/lib/getIdentifierForSelection.js +37 -0
- package/lib/getLiteralArgumentValues.js +26 -0
- package/lib/getModuleName.js +2 -4
- package/lib/getRelayHandleKey.js +2 -4
- package/lib/isCompatibleRelayFragmentType.js +2 -5
- package/lib/isEquivalentType.js +55 -0
- package/lib/isPromise.js +2 -5
- package/lib/isScalarAndEqual.js +3 -5
- package/lib/murmurHash.js +2 -4
- package/lib/nullthrowsOSS.js +7 -5
- package/lib/recycleNodesInto.js +2 -4
- package/lib/relayUnstableBatchedUpdates.js +2 -5
- package/lib/relayUnstableBatchedUpdates.native.js +2 -5
- package/lib/requestsForOperation.js +75 -0
- package/lib/simpleClone.js +2 -4
- package/lib/stableCopy.js +35 -0
- package/lib/testEditDistance.js +2 -5
- package/lib/throwFailedPromise.js +2 -5
- package/lib/writeRelayGeneratedFile.js +84 -50
- package/package.json +16 -15
- package/relay-compiler.js +7208 -5872
- package/relay-compiler.min.js +7200 -5867
- package/ARCHITECTURE.md +0 -94
- package/PATENTS +0 -33
- package/lib/AutoAliasTransform.js +0 -80
- package/lib/GraphQLFileParser.js +0 -27
- package/lib/GraphQLTextParser.js +0 -46
- package/lib/RelayCodegenTypes.js +0 -14
- package/lib/RelayCompiledTypes.js +0 -13
- package/lib/RelayCompiler.js +0 -144
- package/lib/RelayCompilerContext.js +0 -133
- package/lib/RelayCompilerUserError.js +0 -30
- package/lib/RelayConsoleReporter.js +0 -40
- package/lib/RelayFileIRParser.js +0 -66
- package/lib/RelayFlattenTransform.js +0 -278
- package/lib/RelayFlowParser.js +0 -188
- package/lib/RelayGenerateRequisiteFieldsTransform.js +0 -189
- package/lib/RelayIR.js +0 -14
- package/lib/RelayMultiReporter.js +0 -40
- package/lib/RelayReporter.js +0 -14
- package/lib/RelayTestSchema.js +0 -21
- package/lib/formatStorageKey.js +0 -37
- package/lib/getIdentifierForRelaySelection.js +0 -54
- package/lib/getRelayLiteralArgumentValues.js +0 -28
- package/lib/parseGraphQLText.js +0 -33
- package/lib/prettyStringify.js +0 -35
- package/lib/printFlowTypes.js +0 -282
- package/lib/stableJSONStringify.js +0 -45
- package/lib/stableJSONStringifyOSS.js +0 -44
- package/lib/transformInputObjectToIR.js +0 -85
- package/lib/writeLegacyFlowFile.js +0 -24
package/lib/RelayFileWriter.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
|
6
|
-
* LICENSE file in the root directory of this source tree.
|
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('./
|
27
|
-
|
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('
|
30
|
-
|
31
|
+
var _require2 = require('immutable'),
|
32
|
+
ImmutableMap = _require2.Map;
|
31
33
|
|
32
|
-
var
|
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(
|
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
|
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 =
|
63
|
-
var extendedSchema =
|
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
|
-
|
68
|
+
_this._baseDocuments.forEach(function (doc) {
|
68
69
|
doc.definitions.forEach(function (def) {
|
69
|
-
if (
|
70
|
+
if (isExecutableDefinitionAST(def) && def.name) {
|
70
71
|
baseDefinitionNames.add(def.name.value);
|
71
72
|
}
|
72
73
|
});
|
73
74
|
});
|
74
|
-
var
|
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
|
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 (
|
86
|
-
configOutputDirectory = addCodegenDir(
|
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
|
-
|
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
|
103
|
-
|
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
|
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
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
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
|
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(
|
132
|
-
var
|
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 (
|
138
|
-
|
139
|
-
|
140
|
-
|
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(
|
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
|
147
|
-
|
148
|
-
|
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
|
182
|
+
return _ref3.apply(this, arguments);
|
153
183
|
};
|
154
184
|
})()));
|
155
|
-
|
156
|
-
|
157
|
-
if (
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
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.
|
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
|
202
|
-
require('
|
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
|
+
};
|