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

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;