UNPKG

4.96 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * strict-local
8 * @format
9 */
10'use strict';
11
12var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
13
14var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
15
16function printRequireModuleDependency(moduleName) {
17 return "require('".concat(moduleName, "')");
18}
19
20function getConcreteType(node) {
21 switch (node.kind) {
22 case require("relay-runtime").RelayConcreteNode.FRAGMENT:
23 return 'ReaderFragment';
24
25 case require("relay-runtime").RelayConcreteNode.REQUEST:
26 return 'ConcreteRequest';
27
28 case require("relay-runtime").RelayConcreteNode.SPLIT_OPERATION:
29 return 'NormalizationSplitOperation';
30
31 default:
32 node;
33 !false ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'Unexpected GeneratedNode kind: `%s`.', node.kind) : require("fbjs/lib/invariant")(false) : void 0;
34 }
35}
36
37function writeRelayGeneratedFile(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) {
38 return _writeRelayGeneratedFile.apply(this, arguments);
39}
40
41function _writeRelayGeneratedFile() {
42 _writeRelayGeneratedFile = _asyncToGenerator(function* (codegenDir, _generatedNode, formatModule, typeText, _persistQuery, platform, sourceHash, extension) {
43 var printModuleDependency = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : printRequireModuleDependency;
44 var generatedNode = _generatedNode; // Copy to const so Flow can refine.
45
46 var persistQuery = _persistQuery;
47 var moduleName = (generatedNode.kind === 'Request' ? generatedNode.params.name : generatedNode.name) + '.graphql';
48 var platformName = platform != null && platform.length > 0 ? moduleName + '.' + platform : moduleName;
49 var filename = platformName + '.' + extension;
50 var typeName = getConcreteType(generatedNode);
51 var devOnlyProperties = {};
52 var docText;
53
54 if (generatedNode.kind === require("relay-runtime").RelayConcreteNode.REQUEST) {
55 docText = generatedNode.params.text;
56 }
57
58 var hash = null;
59
60 if (generatedNode.kind === require("relay-runtime").RelayConcreteNode.REQUEST) {
61 var oldHash = require("./GraphQLCompilerProfiler").run('RelayFileWriter:compareHash', function () {
62 var oldContent = codegenDir.read(filename); // Hash the concrete node including the query text.
63
64 var hasher = require("crypto").createHash('md5');
65
66 hasher.update('cache-breaker-9');
67 hasher.update(JSON.stringify(generatedNode));
68 hasher.update(sourceHash);
69
70 if (typeText) {
71 hasher.update(typeText);
72 }
73
74 if (persistQuery) {
75 hasher.update('persisted');
76 }
77
78 hash = hasher.digest('hex');
79 return extractHash(oldContent);
80 });
81
82 if (hash === oldHash) {
83 codegenDir.markUnchanged(filename);
84 return null;
85 }
86
87 if (codegenDir.onlyValidate) {
88 codegenDir.markUpdated(filename);
89 return null;
90 }
91
92 if (persistQuery) {
93 switch (generatedNode.kind) {
94 case require("relay-runtime").RelayConcreteNode.REQUEST:
95 var _text = require("nullthrows")(generatedNode.params.text);
96
97 devOnlyProperties.params = {
98 text: _text
99 };
100 generatedNode = (0, _objectSpread2["default"])({}, generatedNode, {
101 params: (0, _objectSpread2["default"])({}, generatedNode.params, {
102 text: null,
103 id: yield persistQuery(_text, sourceHash)
104 })
105 });
106 break;
107
108 case require("relay-runtime").RelayConcreteNode.FRAGMENT:
109 // Do not persist fragments.
110 break;
111
112 default:
113 generatedNode.kind;
114 }
115 }
116 }
117
118 var devOnlyAssignments = require("./deepMergeAssignments")('(node/*: any*/)', devOnlyProperties);
119
120 var moduleText = formatModule({
121 moduleName: moduleName,
122 documentType: typeName,
123 kind: generatedNode.kind,
124 docText: docText,
125 typeText: typeText,
126 hash: hash ? "@relayHash ".concat(hash) : null,
127 concreteText: require("./CodeMarker").postProcess(require("./dedupeJSONStringify")(generatedNode), printModuleDependency),
128 devOnlyAssignments: devOnlyAssignments,
129 sourceHash: sourceHash
130 });
131 codegenDir.writeFile(filename, moduleText);
132 return generatedNode;
133 });
134 return _writeRelayGeneratedFile.apply(this, arguments);
135}
136
137function extractHash(text) {
138 if (text == null || text.length === 0) {
139 return null;
140 }
141
142 if (/<<<<<|>>>>>/.test(text)) {
143 // looks like a merge conflict
144 return null;
145 }
146
147 var match = text.match(/@relayHash (\w{32})\b/m);
148 return match && match[1];
149}
150
151module.exports = writeRelayGeneratedFile;
\No newline at end of file