UNPKG

5.31 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 _toConsumableArray2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/toConsumableArray"));
13
14/**
15 * Transforms the provided compiler context
16 *
17 * compileRelayArtifacts generates artifacts for Relay's runtime as a result of
18 * applying a series of transforms. Each kind of artifact is dependent on
19 * transforms being applied in the following order:
20 *
21 * - Fragment Readers: commonTransforms, fragmentTransforms
22 * - Operation Writers: commonTransforms, queryTransforms, codegenTransforms
23 * - GraphQL Text: commonTransforms, queryTransforms, printTransforms
24 *
25 * The order of the transforms applied for each artifact below is important.
26 * CompilerContext will memoize applying each transform, so while
27 * `commonTransforms` appears in each artifacts' application, it will not result
28 * in repeated work as long as the order remains consistent across each context.
29 */
30function compileRelayArtifacts(context, transforms, reporter) {
31 return require("./GraphQLCompilerProfiler").run('GraphQLCompiler.compile', function () {
32 // The fragment is used for reading data from the normalized store.
33 var fragmentContext = context.applyTransforms((0, _toConsumableArray2["default"])(transforms.commonTransforms).concat((0, _toConsumableArray2["default"])(transforms.fragmentTransforms)), reporter); // The unflattened query is used for printing, since flattening creates an
34 // invalid query.
35
36 var printContext = context.applyTransforms((0, _toConsumableArray2["default"])(transforms.commonTransforms).concat((0, _toConsumableArray2["default"])(transforms.queryTransforms), (0, _toConsumableArray2["default"])(transforms.printTransforms)), reporter); // The flattened query is used for codegen in order to reduce the number of
37 // duplicate fields that must be processed during response normalization.
38
39 var codeGenContext = context.applyTransforms((0, _toConsumableArray2["default"])(transforms.commonTransforms).concat((0, _toConsumableArray2["default"])(transforms.queryTransforms), (0, _toConsumableArray2["default"])(transforms.codegenTransforms)), reporter);
40 var results = []; // Add everything from codeGenContext, these are the operations as well as
41 // SplitOperations from @match.
42
43 var _iteratorNormalCompletion = true;
44 var _didIteratorError = false;
45 var _iteratorError = undefined;
46
47 try {
48 for (var _iterator = codeGenContext.documents()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
49 var node = _step.value;
50
51 if (node.kind === 'Root') {
52 var fragNode = fragmentContext.getRoot(node.name);
53 results.push(require("./RelayCodeGenerator").generate({
54 kind: 'Request',
55 fragment: {
56 kind: 'Fragment',
57 argumentDefinitions: fragNode.argumentDefinitions,
58 directives: fragNode.directives,
59 loc: {
60 kind: 'Derived',
61 source: node.loc
62 },
63 metadata: null,
64 name: fragNode.name,
65 selections: fragNode.selections,
66 type: fragNode.type
67 },
68 id: null,
69 loc: node.loc,
70 metadata: node.metadata || {},
71 name: fragNode.name,
72 root: node,
73 text: printOperation(printContext, fragNode.name)
74 }));
75 } else {
76 results.push(require("./RelayCodeGenerator").generate(node));
77 }
78 } // Add all the Fragments from the fragmentContext for the reader ASTs.
79
80 } catch (err) {
81 _didIteratorError = true;
82 _iteratorError = err;
83 } finally {
84 try {
85 if (!_iteratorNormalCompletion && _iterator["return"] != null) {
86 _iterator["return"]();
87 }
88 } finally {
89 if (_didIteratorError) {
90 throw _iteratorError;
91 }
92 }
93 }
94
95 var _iteratorNormalCompletion2 = true;
96 var _didIteratorError2 = false;
97 var _iteratorError2 = undefined;
98
99 try {
100 for (var _iterator2 = fragmentContext.documents()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
101 var _node = _step2.value;
102
103 if (_node.kind === 'Fragment') {
104 results.push(require("./RelayCodeGenerator").generate(_node));
105 }
106 }
107 } catch (err) {
108 _didIteratorError2 = true;
109 _iteratorError2 = err;
110 } finally {
111 try {
112 if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
113 _iterator2["return"]();
114 }
115 } finally {
116 if (_didIteratorError2) {
117 throw _iteratorError2;
118 }
119 }
120 }
121
122 return results;
123 });
124}
125
126function printOperation(printContext, name) {
127 var printableRoot = printContext.getRoot(name);
128 return require("./filterContextForNode")(printableRoot, printContext).documents().map(require("./GraphQLIRPrinter").print).join('\n');
129}
130
131module.exports = compileRelayArtifacts;
\No newline at end of file