@ardatan/relay-compiler
Version:
A compiler tool for building GraphQL-driven applications.
77 lines (68 loc) • 2.5 kB
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.
*
*
* @format
*/
// flowlint ambiguous-object-type:error
;
var _require = require('../../core/CompilerError'),
createUserError = _require.createUserError;
var _require2 = require('./utils'),
buildFragmentSpread = _require2.buildFragmentSpread,
buildOperationArgumentDefinitions = _require2.buildOperationArgumentDefinitions;
var VIEWER_TYPE_NAME = 'Viewer';
var VIEWER_FIELD_NAME = 'viewer';
function buildRefetchOperation(schema, fragment, queryName) {
if (schema.getTypeString(fragment.type) !== VIEWER_TYPE_NAME) {
return null;
} // Handle fragments on viewer
var queryType = schema.expectQueryType();
var viewerType = schema.getTypeFromString(VIEWER_TYPE_NAME);
var viewerField = schema.getFieldConfig(schema.expectField(queryType, VIEWER_FIELD_NAME));
var viewerFieldType = schema.getNullableType(viewerField.type);
if (!(viewerType && schema.isObject(viewerType) && schema.isObject(viewerFieldType) && schema.areEqualTypes(viewerFieldType, viewerType) && viewerField.args.length === 0 && schema.areEqualTypes(fragment.type, viewerType))) {
throw createUserError("Invalid use of @refetchable on fragment '".concat(fragment.name, "', check ") + "that your schema defines a 'Viewer' object type and has a " + "'viewer: Viewer' field on the query type.", [fragment.loc]);
}
return {
identifierField: null,
path: [VIEWER_FIELD_NAME],
node: {
argumentDefinitions: buildOperationArgumentDefinitions(fragment.argumentDefinitions),
directives: [],
kind: 'Root',
loc: {
kind: 'Derived',
source: fragment.loc
},
metadata: null,
name: queryName,
operation: 'query',
selections: [{
alias: VIEWER_FIELD_NAME,
args: [],
connection: false,
directives: [],
handles: null,
kind: 'LinkedField',
loc: {
kind: 'Derived',
source: fragment.loc
},
metadata: null,
name: VIEWER_FIELD_NAME,
selections: [buildFragmentSpread(fragment)],
type: schema.assertLinkedFieldType(viewerField.type)
}],
type: queryType
},
transformedFragment: fragment
};
}
module.exports = {
description: 'the Viewer type',
buildRefetchOperation: buildRefetchOperation
};