/** * 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;