UNPKG

11.4 kBJavaScriptView Raw
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
12var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
13
14var _toConsumableArray2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/toConsumableArray"));
15
16function compileAll(_ref) {
17 var baseDir = _ref.baseDir,
18 baseDocuments = _ref.baseDocuments,
19 baseSchema = _ref.baseSchema,
20 compilerTransforms = _ref.compilerTransforms,
21 documents = _ref.documents,
22 extraValidationRules = _ref.extraValidationRules,
23 reporter = _ref.reporter,
24 schemaExtensions = _ref.schemaExtensions,
25 typeGenerator = _ref.typeGenerator;
26
27 // Can't convert to IR unless the schema already has Relay-local extensions
28 var transformedSchema = require("./ASTConvert").transformASTSchema(baseSchema, schemaExtensions);
29
30 var extendedSchema = require("./ASTConvert").extendASTSchema(transformedSchema, (0, _toConsumableArray2["default"])(baseDocuments).concat((0, _toConsumableArray2["default"])(documents))); // Verify using local and global rules, can run global verifications here
31 // because all files are processed together
32
33
34 var validationRules = (0, _toConsumableArray2["default"])(require("./RelayValidator").LOCAL_RULES).concat((0, _toConsumableArray2["default"])(require("./RelayValidator").GLOBAL_RULES));
35
36 if (extraValidationRules) {
37 validationRules = (0, _toConsumableArray2["default"])(validationRules).concat((0, _toConsumableArray2["default"])(extraValidationRules.LOCAL_RULES || []), (0, _toConsumableArray2["default"])(extraValidationRules.GLOBAL_RULES || []));
38 }
39
40 var definitions = require("./ASTConvert").convertASTDocumentsWithBase(extendedSchema, baseDocuments, documents, validationRules, require("./RelayParser").transform);
41
42 var compilerContext = new (require("./GraphQLCompilerContext"))(baseSchema, extendedSchema).addAll(definitions);
43 var transformedTypeContext = compilerContext.applyTransforms(typeGenerator.transforms, reporter);
44 var transformedQueryContext = compilerContext.applyTransforms((0, _toConsumableArray2["default"])(compilerTransforms.commonTransforms).concat((0, _toConsumableArray2["default"])(compilerTransforms.queryTransforms)), reporter);
45
46 var artifacts = require("./compileRelayArtifacts")(compilerContext, compilerTransforms, reporter);
47
48 return {
49 artifacts: artifacts,
50 definitions: definitions,
51 transformedQueryContext: transformedQueryContext,
52 transformedTypeContext: transformedTypeContext
53 };
54}
55
56function writeAll(_ref2) {
57 var writerConfig = _ref2.config,
58 onlyValidate = _ref2.onlyValidate,
59 baseDocuments = _ref2.baseDocuments,
60 documents = _ref2.documents,
61 baseSchema = _ref2.schema,
62 reporter = _ref2.reporter,
63 sourceControl = _ref2.sourceControl;
64 return require("./GraphQLCompilerProfiler").asyncContext('RelayFileWriter.writeAll',
65 /*#__PURE__*/
66 _asyncToGenerator(function* () {
67 var _compileAll = compileAll({
68 baseDir: writerConfig.baseDir,
69 baseDocuments: baseDocuments.valueSeq().toArray(),
70 baseSchema: baseSchema,
71 compilerTransforms: writerConfig.compilerTransforms,
72 documents: documents.valueSeq().toArray(),
73 extraValidationRules: writerConfig.validationRules,
74 reporter: reporter,
75 schemaExtensions: writerConfig.schemaExtensions,
76 typeGenerator: writerConfig.typeGenerator
77 }),
78 artifactsWithBase = _compileAll.artifacts,
79 definitions = _compileAll.definitions,
80 transformedTypeContext = _compileAll.transformedTypeContext,
81 transformedQueryContext = _compileAll.transformedQueryContext; // Build a context from all the documents
82
83
84 var baseDefinitionNames = new Set();
85 baseDocuments.forEach(function (doc) {
86 doc.definitions.forEach(function (def) {
87 if (require("./GraphQLSchemaUtils").isExecutableDefinitionAST(def) && def.name) {
88 baseDefinitionNames.add(def.name.value);
89 }
90 });
91 }); // remove nodes that are present in the base or that derive from nodes
92 // in the base
93
94 var artifacts = artifactsWithBase.filter(function (node) {
95 var sourceName = require("./GraphQLDerivedFromMetadata").getReaderSourceDefinitionName(node);
96
97 return !baseDefinitionNames.has(sourceName);
98 });
99 var artifactMap = new Map(artifacts.map(function (artifact) {
100 return [artifact.kind === 'Request' ? artifact.params.name : artifact.name, artifact];
101 }));
102 var existingFragmentNames = new Set(definitions.map(function (definition) {
103 return definition.name;
104 }));
105 var definitionsMeta = new Map();
106
107 var getDefinitionMeta = function getDefinitionMeta(definitionName) {
108 var artifact = require("nullthrows")(artifactMap.get(definitionName));
109
110 var sourceName = require("./GraphQLDerivedFromMetadata").getReaderSourceDefinitionName(artifact);
111
112 var definitionMeta = definitionsMeta.get(sourceName);
113 !definitionMeta ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayFileWriter: Could not determine source for definition: `%s`.', definitionName) : require("fbjs/lib/invariant")(false) : void 0;
114 return definitionMeta;
115 };
116
117 documents.forEach(function (doc, filePath) {
118 doc.definitions.forEach(function (def) {
119 if (def.name) {
120 definitionsMeta.set(def.name.value, {
121 dir: require("path").join(writerConfig.baseDir, require("path").dirname(filePath)),
122 ast: def
123 });
124 }
125 });
126 }); // TODO(T22651734): improve this to correctly account for fragments that
127 // have generated flow types.
128
129 baseDefinitionNames.forEach(function (baseDefinitionName) {
130 existingFragmentNames["delete"](baseDefinitionName);
131 });
132 var allOutputDirectories = new Map();
133
134 var addCodegenDir = function addCodegenDir(dirPath) {
135 var codegenDir = new (require("./CodegenDirectory"))(dirPath, {
136 onlyValidate: onlyValidate
137 });
138 allOutputDirectories.set(dirPath, codegenDir);
139 return codegenDir;
140 };
141
142 var _iteratorNormalCompletion = true;
143 var _didIteratorError = false;
144 var _iteratorError = undefined;
145
146 try {
147 for (var _iterator = (writerConfig.generatedDirectories || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
148 var existingDirectory = _step.value;
149 addCodegenDir(existingDirectory);
150 }
151 } catch (err) {
152 _didIteratorError = true;
153 _iteratorError = err;
154 } finally {
155 try {
156 if (!_iteratorNormalCompletion && _iterator["return"] != null) {
157 _iterator["return"]();
158 }
159 } finally {
160 if (_didIteratorError) {
161 throw _iteratorError;
162 }
163 }
164 }
165
166 var configOutputDirectory;
167
168 if (writerConfig.outputDir) {
169 configOutputDirectory = addCodegenDir(writerConfig.outputDir);
170 }
171
172 var getGeneratedDirectory = function getGeneratedDirectory(definitionName) {
173 if (configOutputDirectory) {
174 return configOutputDirectory;
175 }
176
177 var generatedPath = require("path").join(getDefinitionMeta(definitionName).dir, '__generated__');
178
179 var cachedDir = allOutputDirectories.get(generatedPath);
180
181 if (!cachedDir) {
182 cachedDir = addCodegenDir(generatedPath);
183 }
184
185 return cachedDir;
186 };
187
188 var formatModule = require("./GraphQLCompilerProfiler").instrument(writerConfig.formatModule, 'RelayFileWriter:formatModule');
189
190 var persistQuery = writerConfig.persistQuery ? require("./GraphQLCompilerProfiler").instrumentWait(writerConfig.persistQuery, 'RelayFileWriter:persistQuery') : null;
191
192 try {
193 yield Promise.all(artifacts.map(
194 /*#__PURE__*/
195 function () {
196 var _ref3 = _asyncToGenerator(function* (node) {
197 var nodeName = node.kind === 'Request' ? node.params.name : node.name;
198
199 if (baseDefinitionNames.has(nodeName)) {
200 // don't add definitions that were part of base context
201 return;
202 }
203
204 var typeNode = transformedTypeContext.get(nodeName);
205 var typeText = typeNode ? writerConfig.typeGenerator.generate(typeNode, {
206 customScalars: writerConfig.customScalars,
207 enumsHasteModule: writerConfig.enumsHasteModule,
208 existingFragmentNames: existingFragmentNames,
209 optionalInputFields: writerConfig.optionalInputFieldsForFlow,
210 useHaste: writerConfig.useHaste,
211 useSingleArtifactDirectory: !!writerConfig.outputDir,
212 noFutureProofEnums: writerConfig.noFutureProofEnums
213 }) : '';
214
215 var sourceHash = require("./GraphQLCompilerProfiler").run('hashGraphQL', function () {
216 return md5(require("graphql").print(getDefinitionMeta(nodeName).ast));
217 });
218
219 yield require("./writeRelayGeneratedFile")(getGeneratedDirectory(nodeName), node, formatModule, typeText, persistQuery, writerConfig.platform, sourceHash, writerConfig.extension, writerConfig.printModuleDependency);
220 });
221
222 return function (_x) {
223 return _ref3.apply(this, arguments);
224 };
225 }()));
226 var generateExtraFiles = writerConfig.generateExtraFiles;
227
228 if (generateExtraFiles) {
229 require("./GraphQLCompilerProfiler").run('RelayFileWriter:generateExtraFiles', function () {
230 var configDirectory = writerConfig.outputDir;
231 generateExtraFiles(function (dir) {
232 var outputDirectory = dir || configDirectory;
233 !outputDirectory ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayFileWriter: cannot generate extra files without specifying ' + 'an outputDir in the config or passing it in.') : require("fbjs/lib/invariant")(false) : void 0;
234 var outputDir = allOutputDirectories.get(outputDirectory);
235
236 if (!outputDir) {
237 outputDir = addCodegenDir(outputDirectory);
238 }
239
240 return outputDir;
241 }, transformedQueryContext, getGeneratedDirectory);
242 });
243 } // clean output directories
244
245
246 if (writerConfig.experimental_noDeleteExtraFiles !== true) {
247 allOutputDirectories.forEach(function (dir) {
248 dir.deleteExtraFiles(writerConfig.experimental_extraFilesPatternToKeep);
249 });
250 }
251
252 if (sourceControl && !onlyValidate) {
253 yield require("./CodegenDirectory").sourceControlAddRemove(sourceControl, Array.from(allOutputDirectories.values()));
254 }
255 } catch (error) {
256 var details;
257
258 try {
259 details = JSON.parse(error.message);
260 } catch (_) {} // eslint-disable-line lint/no-unused-catch-bindings
261
262
263 if (details && details.name === 'GraphQL2Exception' && details.message) {
264 throw new Error('GraphQL error writing modules:\n' + details.message);
265 }
266
267 throw new Error('Error writing modules:\n' + String(error.stack || error));
268 }
269
270 return allOutputDirectories;
271 }));
272}
273
274function md5(x) {
275 return require("crypto").createHash('md5').update(x, 'utf8').digest('hex');
276}
277
278module.exports = {
279 writeAll: writeAll
280};
\No newline at end of file