Files
30-seconds-of-code/node_modules/@gatsbyjs/relay-compiler/lib/compileRelayArtifacts.js
2019-08-20 15:52:05 +02:00

141 lines
5.4 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
*/
'use strict';
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var Printer = require("./GraphQLIRPrinter");
var Profiler = require("./GraphQLCompilerProfiler");
var RelayCodeGenerator = require("./RelayCodeGenerator");
var filterContextForNode = require("./filterContextForNode");
/**
* Transforms the provided compiler context
*
* compileRelayArtifacts generates artifacts for Relay's runtime as a result of
* applying a series of transforms. Each kind of artifact is dependent on
* transforms being applied in the following order:
*
* - Fragment Readers: commonTransforms, fragmentTransforms
* - Operation Writers: commonTransforms, queryTransforms, codegenTransforms
* - GraphQL Text: commonTransforms, queryTransforms, printTransforms
*
* The order of the transforms applied for each artifact below is important.
* CompilerContext will memoize applying each transform, so while
* `commonTransforms` appears in each artifacts' application, it will not result
* in repeated work as long as the order remains consistent across each context.
*/
function compileRelayArtifacts(context, transforms, reporter) {
return Profiler.run('GraphQLCompiler.compile', function () {
// The fragment is used for reading data from the normalized store.
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
// invalid query.
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
// duplicate fields that must be processed during response normalization.
var codeGenContext = context.applyTransforms((0, _toConsumableArray2["default"])(transforms.commonTransforms).concat((0, _toConsumableArray2["default"])(transforms.queryTransforms), (0, _toConsumableArray2["default"])(transforms.codegenTransforms)), reporter);
var results = []; // Add everything from codeGenContext, these are the operations as well as
// SplitOperations from @match.
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = codeGenContext.documents()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var node = _step.value;
if (node.kind === 'Root') {
var fragNode = fragmentContext.getRoot(node.name);
results.push(RelayCodeGenerator.generate({
kind: 'Request',
fragment: {
kind: 'Fragment',
argumentDefinitions: fragNode.argumentDefinitions,
directives: fragNode.directives,
loc: {
kind: 'Derived',
source: node.loc
},
metadata: null,
name: fragNode.name,
selections: fragNode.selections,
type: fragNode.type
},
id: null,
loc: node.loc,
metadata: node.metadata || {},
name: fragNode.name,
root: node,
text: printOperation(printContext, fragNode.name)
}));
} else {
results.push(RelayCodeGenerator.generate(node));
}
} // Add all the Fragments from the fragmentContext for the reader ASTs.
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = fragmentContext.documents()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _node = _step2.value;
if (_node.kind === 'Fragment') {
results.push(RelayCodeGenerator.generate(_node));
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return results;
});
}
function printOperation(printContext, name) {
var printableRoot = printContext.getRoot(name);
return filterContextForNode(printableRoot, printContext).documents().map(Printer.print).join('\n');
}
module.exports = compileRelayArtifacts;