173 lines
5.5 KiB
JavaScript
173 lines
5.5 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.
|
|
*
|
|
* strict-local
|
|
* @format
|
|
*/
|
|
'use strict';
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
|
|
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
|
|
var CodeMarker = require("./CodeMarker");
|
|
|
|
var Profiler = require("./GraphQLCompilerProfiler");
|
|
|
|
var crypto = require("crypto");
|
|
|
|
var dedupeJSONStringify = require("./dedupeJSONStringify");
|
|
|
|
var deepMergeAssignments = require("./deepMergeAssignments");
|
|
|
|
var invariant = require("fbjs/lib/invariant");
|
|
|
|
var nullthrows = require("nullthrows");
|
|
|
|
var _require = require("relay-runtime"),
|
|
RelayConcreteNode = _require.RelayConcreteNode;
|
|
|
|
function printRequireModuleDependency(moduleName) {
|
|
return "require('".concat(moduleName, "')");
|
|
}
|
|
|
|
function getConcreteType(node) {
|
|
switch (node.kind) {
|
|
case RelayConcreteNode.FRAGMENT:
|
|
return 'ReaderFragment';
|
|
|
|
case RelayConcreteNode.REQUEST:
|
|
return 'ConcreteRequest';
|
|
|
|
case RelayConcreteNode.SPLIT_OPERATION:
|
|
return 'NormalizationSplitOperation';
|
|
|
|
default:
|
|
node;
|
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Unexpected GeneratedNode kind: `%s`.', node.kind) : invariant(false) : void 0;
|
|
}
|
|
}
|
|
|
|
function writeRelayGeneratedFile(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) {
|
|
return _writeRelayGeneratedFile.apply(this, arguments);
|
|
}
|
|
|
|
function _writeRelayGeneratedFile() {
|
|
_writeRelayGeneratedFile = _asyncToGenerator(function* (codegenDir, _generatedNode, formatModule, typeText, _persistQuery, platform, sourceHash, extension) {
|
|
var printModuleDependency = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : printRequireModuleDependency;
|
|
var generatedNode = _generatedNode; // Copy to const so Flow can refine.
|
|
|
|
var persistQuery = _persistQuery;
|
|
var moduleName = (generatedNode.kind === 'Request' ? generatedNode.params.name : generatedNode.name) + '.graphql';
|
|
var platformName = platform != null && platform.length > 0 ? moduleName + '.' + platform : moduleName;
|
|
var filename = platformName + '.' + extension;
|
|
var typeName = getConcreteType(generatedNode);
|
|
var devOnlyProperties = {};
|
|
var docText;
|
|
|
|
if (generatedNode.kind === RelayConcreteNode.REQUEST) {
|
|
docText = generatedNode.params.text;
|
|
}
|
|
|
|
var hash = null;
|
|
|
|
if (generatedNode.kind === RelayConcreteNode.REQUEST) {
|
|
var oldHash = Profiler.run('RelayFileWriter:compareHash', function () {
|
|
var oldContent = codegenDir.read(filename); // Hash the concrete node including the query text.
|
|
|
|
var hasher = crypto.createHash('md5');
|
|
hasher.update('cache-breaker-9');
|
|
hasher.update(JSON.stringify(generatedNode));
|
|
hasher.update(sourceHash);
|
|
|
|
if (typeText) {
|
|
hasher.update(typeText);
|
|
}
|
|
|
|
if (persistQuery) {
|
|
hasher.update('persisted');
|
|
}
|
|
|
|
hash = hasher.digest('hex');
|
|
return extractHash(oldContent);
|
|
});
|
|
|
|
if (hash === oldHash) {
|
|
codegenDir.markUnchanged(filename);
|
|
return null;
|
|
}
|
|
|
|
if (codegenDir.onlyValidate) {
|
|
codegenDir.markUpdated(filename);
|
|
return null;
|
|
}
|
|
|
|
if (persistQuery) {
|
|
switch (generatedNode.kind) {
|
|
case RelayConcreteNode.REQUEST:
|
|
var _generatedNode$params = generatedNode.params,
|
|
_id = _generatedNode$params.id,
|
|
_text = _generatedNode$params.text,
|
|
restParams = (0, _objectWithoutPropertiesLoose2["default"])(_generatedNode$params, ["id", "text"]);
|
|
!(_text != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'writeRelayGeneratedFile: Expected `text` in order to persist query') : invariant(false) : void 0;
|
|
devOnlyProperties.params = {
|
|
text: _text
|
|
};
|
|
generatedNode = (0, _objectSpread2["default"])({}, generatedNode, {
|
|
params: (0, _objectSpread2["default"])({
|
|
id: yield persistQuery(_text, sourceHash),
|
|
text: null
|
|
}, restParams)
|
|
});
|
|
break;
|
|
|
|
case RelayConcreteNode.FRAGMENT:
|
|
// Do not persist fragments.
|
|
break;
|
|
|
|
default:
|
|
generatedNode.kind;
|
|
}
|
|
}
|
|
}
|
|
|
|
var devOnlyAssignments = deepMergeAssignments('(node/*: any*/)', devOnlyProperties);
|
|
var moduleText = formatModule({
|
|
moduleName: moduleName,
|
|
documentType: typeName,
|
|
kind: generatedNode.kind,
|
|
docText: docText,
|
|
typeText: typeText,
|
|
hash: hash ? "@relayHash ".concat(hash) : null,
|
|
concreteText: CodeMarker.postProcess(dedupeJSONStringify(generatedNode), printModuleDependency),
|
|
devOnlyAssignments: devOnlyAssignments,
|
|
sourceHash: sourceHash
|
|
});
|
|
codegenDir.writeFile(filename, moduleText);
|
|
return generatedNode;
|
|
});
|
|
return _writeRelayGeneratedFile.apply(this, arguments);
|
|
}
|
|
|
|
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];
|
|
}
|
|
|
|
module.exports = writeRelayGeneratedFile; |