@ardatan/relay-compiler
Version:
A compiler tool for building GraphQL-driven applications.
208 lines (165 loc) • 7.72 kB
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
*/
// flowlint ambiguous-object-type:error
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var CodeMarker = require('../util/CodeMarker');
var createPrintRequireModuleDependency = require('./createPrintRequireModuleDependency');
var dedupeJSONStringify = require('../util/dedupeJSONStringify');
var invariant = require('invariant');
var md5 = require('../util/md5');
var _require = require('relay-runtime'),
RelayConcreteNode = _require.RelayConcreteNode;
function getConcreteType(node) {
switch (node.kind) {
case RelayConcreteNode.FRAGMENT:
return 'ReaderFragment';
case RelayConcreteNode.REQUEST:
return 'ConcreteRequest';
case RelayConcreteNode.SPLIT_OPERATION:
return 'NormalizationSplitOperation';
case RelayConcreteNode.INLINE_DATA_FRAGMENT:
return 'ReaderInlineDataFragment';
default:
node;
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Unexpected GeneratedNode kind: `%s`.', node.kind) : invariant(false) : void 0;
}
}
function writeRelayGeneratedFile(schema, codegenDir, definition, _generatedNode, formatModule, typeText, _persistQuery, sourceHash, extension) {
var printModuleDependency = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : createPrintRequireModuleDependency();
var shouldRepersist = arguments.length > 10 ? arguments[10] : undefined;
var writeQueryParameters = arguments.length > 11 ? arguments[11] : undefined;
var languagePlugin = arguments.length > 12 ? arguments[12] : undefined;
var generatedNode = _generatedNode; // Copy to const so Flow can refine.
var persistQuery = _persistQuery;
var operationName = generatedNode.kind === 'Request' ? generatedNode.params.name : generatedNode.name;
var moduleName = (languagePlugin === null || languagePlugin === void 0 ? void 0 : languagePlugin.getModuleName) ? languagePlugin.getModuleName(operationName) : operationName + '.graphql';
var filename = moduleName + '.' + extension;
var queryParametersFilename = generatedNode.kind === 'Request' ? "".concat(generatedNode.params.name, "$Parameters.").concat(extension) : null;
var typeName = getConcreteType(generatedNode);
var docText;
if (generatedNode.kind === RelayConcreteNode.REQUEST) {
docText = generatedNode.params.text != null ? generatedNode.params.text : null;
} // Use `Promise.resolve` to work around a Babel 7.8/7.9 issue.
return Promise.resolve().then( /*#__PURE__*/_asyncToGenerator(function* () {
var _generatedNode$metada;
var hash = null;
if (generatedNode.kind === RelayConcreteNode.REQUEST) {
!(docText != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'writeRelayGeneratedFile: Expected `text` for operations to be set.') : invariant(false) : void 0;
var _generatedNode$params = generatedNode.params.metadata,
_ignored = _generatedNode$params.isRefetchableQuery,
_ignored2 = _generatedNode$params.derivedFrom,
nextMetadata = (0, _objectWithoutPropertiesLoose2["default"])(_generatedNode$params, ["isRefetchableQuery", "derivedFrom"]);
var nextRequestParams;
if (persistQuery != null) {
hash = md5(docText);
var id = null;
if (!shouldRepersist) {
// Unless we `shouldRepersist` the query, check if the @relayHash matches
// the operation text of the current text and re-use the persisted
// operation id.
var oldContent = codegenDir.read(filename);
var oldHash = extractHash(oldContent);
var oldRequestID = extractRelayRequestID(oldContent);
if (hash === oldHash && oldRequestID != null) {
id = oldRequestID;
}
}
if (id == null) {
// $FlowFixMe[incompatible-call]
id = yield persistQuery(docText);
}
nextRequestParams = {
id: id,
metadata: nextMetadata,
// $FlowFixMe[prop-missing]
// $FlowFixMe[incompatible-use]
name: generatedNode.params.name,
// $FlowFixMe[prop-missing]
// $FlowFixMe[incompatible-use]
operationKind: generatedNode.params.operationKind,
text: null
};
} else {
nextRequestParams = {
cacheID: md5(docText),
id: null,
metadata: nextMetadata,
// $FlowFixMe[prop-missing]
// $FlowFixMe[incompatible-use]
name: generatedNode.params.name,
// $FlowFixMe[prop-missing]
// $FlowFixMe[incompatible-use]
operationKind: generatedNode.params.operationKind,
text: docText
};
} // $FlowFixMe[incompatible-type]
generatedNode = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, generatedNode), {}, {
// $FlowFixMe[incompatible-type]
params: nextRequestParams
});
} // Strip metadata only used within the compiler
if (generatedNode.kind === RelayConcreteNode.SPLIT_OPERATION && ((_generatedNode$metada = generatedNode.metadata) === null || _generatedNode$metada === void 0 ? void 0 : _generatedNode$metada.derivedFrom) != null) {
var _generatedNode$metada2 = generatedNode.metadata,
_ignored3 = _generatedNode$metada2.derivedFrom,
metadata = (0, _objectWithoutPropertiesLoose2["default"])(_generatedNode$metada2, ["derivedFrom"]); // $FlowFixMe[incompatible-type]
generatedNode = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, generatedNode), {}, {
metadata: metadata
});
}
var moduleText = formatModule({
moduleName: moduleName,
documentType: typeName,
definition: definition,
kind: generatedNode.kind,
docText: docText,
typeText: typeText,
hash: hash != null ? "@relayHash ".concat(hash) : null,
concreteText: CodeMarker.postProcess(dedupeJSONStringify(generatedNode), printModuleDependency),
sourceHash: sourceHash,
// $FlowFixMe[incompatible-call]
node: generatedNode,
schema: schema
});
codegenDir.writeFile(filename, moduleText, shouldRepersist);
if (writeQueryParameters && queryParametersFilename != null && generatedNode.kind === RelayConcreteNode.REQUEST && // $FlowFixMe[incompatible-type]
generatedNode.params.operationKind === 'query') {
writeQueryParameters(codegenDir, queryParametersFilename, moduleName, // $FlowFixMe[incompatible-call]
generatedNode.params);
} // $FlowFixMe[incompatible-call]
return generatedNode;
}));
}
function extractHash(text) {
if (text == null || text.length === 0) {
return null;
}
if (/<<<<<|>>>>>/.test(text)) {
// looks like a merge conflict
return null;
}
var match = text.match(/@relayHash (\w{32})\b/m);
return match && match[1];
}
function extractRelayRequestID(text) {
if (text == null || text.length === 0) {
return null;
}
if (/<<<<<|>>>>>/.test(text)) {
// looks like a merge conflict
return null;
}
var match = text.match(/@relayRequestID (.+)/);
return match ? match[1] : null;
}
module.exports = writeRelayGeneratedFile;