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

80 lines
2.2 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 _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var CompilerContext = require("./GraphQLCompilerContext");
var IRTransformer = require("./GraphQLIRTransformer");
var SchemaUtils = require("./GraphQLSchemaUtils");
var _require = require("graphql"),
GraphQLObjectType = _require.GraphQLObjectType;
var _require2 = require("relay-runtime"),
DEFAULT_HANDLE_KEY = _require2.DEFAULT_HANDLE_KEY;
var getRawType = SchemaUtils.getRawType;
var ID = 'id';
var VIEWER_HANDLE = 'viewer';
var VIEWER_TYPE = 'Viewer';
/**
* A transform that adds a "viewer" handle to all fields whose type is `Viewer`.
*/
function relayViewerHandleTransform(context) {
var viewerType = context.serverSchema.getType(VIEWER_TYPE);
if (viewerType == null || !(viewerType instanceof GraphQLObjectType) || viewerType.getFields()[ID] != null) {
return context;
}
return IRTransformer.transform(context, {
LinkedField: visitLinkedOrMatchField,
MatchField: visitLinkedOrMatchField
});
}
function visitLinkedOrMatchField(field) {
var transformedNode = this.traverse(field);
if (getRawType(field.type).name !== VIEWER_TYPE) {
return transformedNode;
}
var handles = transformedNode.handles;
var viewerHandle = {
name: VIEWER_HANDLE,
key: DEFAULT_HANDLE_KEY,
filters: null
};
if (handles && !handles.find(function (handle) {
return handle.name === VIEWER_HANDLE;
})) {
handles = (0, _toConsumableArray2["default"])(handles).concat([viewerHandle]);
} else if (!handles) {
handles = [viewerHandle];
}
return handles !== transformedNode.handles ? (0, _objectSpread2["default"])({}, transformedNode, {
handles: handles
}) : transformedNode;
}
module.exports = {
transform: relayViewerHandleTransform
};