80 lines
2.2 KiB
JavaScript
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
|
|
}; |