UNPKG

1.9 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 _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
14var _toConsumableArray2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/toConsumableArray"));
15
16var TYPENAME_KEY = '__typename';
17var STRING_TYPE = 'String';
18
19/**
20 * A transform that adds `__typename` field on any `LinkedField` of a union or
21 * interface type where there is no unaliased `__typename` selection.
22 */
23function relayGenerateTypeNameTransform(context) {
24 var stringType = require("graphql").assertLeafType(context.serverSchema.getType(STRING_TYPE));
25
26 var typenameField = {
27 kind: 'ScalarField',
28 alias: null,
29 args: [],
30 directives: [],
31 handles: null,
32 loc: {
33 kind: 'Generated'
34 },
35 metadata: null,
36 name: TYPENAME_KEY,
37 type: stringType
38 };
39 var state = {
40 typenameField: typenameField
41 };
42 return require("./GraphQLIRTransformer").transform(context, {
43 LinkedField: visitLinkedOrMatchField,
44 MatchField: visitLinkedOrMatchField
45 }, function () {
46 return state;
47 });
48}
49
50function visitLinkedOrMatchField(field, state) {
51 var transformedNode = this.traverse(field, state);
52
53 if (require("./GraphQLSchemaUtils").isAbstractType(transformedNode.type) && !require("./RelayTransformUtils").hasUnaliasedSelection(transformedNode, TYPENAME_KEY)) {
54 return (0, _objectSpread2["default"])({}, transformedNode, {
55 selections: [state.typenameField].concat((0, _toConsumableArray2["default"])(transformedNode.selections))
56 });
57 }
58
59 return transformedNode;
60}
61
62module.exports = {
63 transform: relayGenerateTypeNameTransform
64};
\No newline at end of file