graphql-language-service-interface
Version:
Interface to the GraphQL Language Service
686 lines • 32.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTypeInfo = exports.canUseDirective = exports.runOnlineParser = exports.getTokenAtPosition = exports.getFragmentDefinitions = exports.getVariableCompletions = exports.getAutocompleteSuggestions = void 0;
const vscode_languageserver_types_1 = require("vscode-languageserver-types");
const graphql_1 = require("graphql");
const graphql_2 = require("graphql");
const graphql_language_service_parser_1 = require("graphql-language-service-parser");
const autocompleteUtils_1 = require("./autocompleteUtils");
const collectFragmentDefs = (op) => {
const externalFragments = [];
if (op) {
graphql_2.visit(graphql_2.parse(op, {
experimentalFragmentVariables: true,
}), {
FragmentDefinition(def) {
externalFragments.push(def);
},
});
}
return externalFragments;
};
function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fragmentDefs) {
var _a;
const token = contextToken || getTokenAtPosition(queryText, cursor);
const state = token.state.kind === 'Invalid' ? token.state.prevState : token.state;
if (!state) {
return [];
}
const kind = state.kind;
const step = state.step;
const typeInfo = getTypeInfo(schema, token.state);
if (kind === graphql_language_service_parser_1.RuleKinds.DOCUMENT) {
return autocompleteUtils_1.hintList(token, [
{ label: 'query', kind: vscode_languageserver_types_1.CompletionItemKind.Function },
{ label: 'mutation', kind: vscode_languageserver_types_1.CompletionItemKind.Function },
{ label: 'subscription', kind: vscode_languageserver_types_1.CompletionItemKind.Function },
{ label: 'fragment', kind: vscode_languageserver_types_1.CompletionItemKind.Function },
{ label: '{', kind: vscode_languageserver_types_1.CompletionItemKind.Constructor },
]);
}
if (kind === graphql_language_service_parser_1.RuleKinds.IMPLEMENTS ||
(kind === graphql_language_service_parser_1.RuleKinds.NAMED_TYPE &&
((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === graphql_language_service_parser_1.RuleKinds.IMPLEMENTS)) {
return getSuggestionsForImplements(token, state, schema, queryText, typeInfo);
}
if (kind === graphql_language_service_parser_1.RuleKinds.SELECTION_SET ||
kind === graphql_language_service_parser_1.RuleKinds.FIELD ||
kind === graphql_language_service_parser_1.RuleKinds.ALIASED_FIELD) {
return getSuggestionsForFieldNames(token, typeInfo, schema);
}
if (kind === graphql_language_service_parser_1.RuleKinds.ARGUMENTS ||
(kind === graphql_language_service_parser_1.RuleKinds.ARGUMENT && step === 0)) {
const argDefs = typeInfo.argDefs;
if (argDefs) {
return autocompleteUtils_1.hintList(token, argDefs.map(argDef => {
var _a;
return ({
label: argDef.name,
detail: String(argDef.type),
documentation: (_a = argDef.description) !== null && _a !== void 0 ? _a : undefined,
kind: vscode_languageserver_types_1.CompletionItemKind.Variable,
type: argDef.type,
});
}));
}
}
if (kind === graphql_language_service_parser_1.RuleKinds.OBJECT_VALUE ||
(kind === graphql_language_service_parser_1.RuleKinds.OBJECT_FIELD && step === 0)) {
if (typeInfo.objectFieldDefs) {
const objectFields = autocompleteUtils_1.objectValues(typeInfo.objectFieldDefs);
const completionKind = kind === graphql_language_service_parser_1.RuleKinds.OBJECT_VALUE
? vscode_languageserver_types_1.CompletionItemKind.Value
: vscode_languageserver_types_1.CompletionItemKind.Field;
return autocompleteUtils_1.hintList(token, objectFields.map(field => {
var _a;
return ({
label: field.name,
detail: String(field.type),
documentation: (_a = field.description) !== null && _a !== void 0 ? _a : undefined,
kind: completionKind,
type: field.type,
});
}));
}
}
if (kind === graphql_language_service_parser_1.RuleKinds.ENUM_VALUE ||
(kind === graphql_language_service_parser_1.RuleKinds.LIST_VALUE && step === 1) ||
(kind === graphql_language_service_parser_1.RuleKinds.OBJECT_FIELD && step === 2) ||
(kind === graphql_language_service_parser_1.RuleKinds.ARGUMENT && step === 2)) {
return getSuggestionsForInputValues(token, typeInfo, queryText, schema);
}
if (kind === graphql_language_service_parser_1.RuleKinds.VARIABLE && step === 1) {
const namedInputType = graphql_2.getNamedType(typeInfo.inputType);
const variableDefinitions = getVariableCompletions(queryText, schema);
return autocompleteUtils_1.hintList(token, variableDefinitions.filter(v => v.detail === (namedInputType === null || namedInputType === void 0 ? void 0 : namedInputType.name)));
}
if ((kind === graphql_language_service_parser_1.RuleKinds.TYPE_CONDITION && step === 1) ||
(kind === graphql_language_service_parser_1.RuleKinds.NAMED_TYPE &&
state.prevState != null &&
state.prevState.kind === graphql_language_service_parser_1.RuleKinds.TYPE_CONDITION)) {
return getSuggestionsForFragmentTypeConditions(token, typeInfo, schema, kind);
}
if (kind === graphql_language_service_parser_1.RuleKinds.FRAGMENT_SPREAD && step === 1) {
return getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, Array.isArray(fragmentDefs)
? fragmentDefs
: collectFragmentDefs(fragmentDefs));
}
if ((kind === graphql_language_service_parser_1.RuleKinds.VARIABLE_DEFINITION && step === 2) ||
(kind === graphql_language_service_parser_1.RuleKinds.LIST_TYPE && step === 1) ||
(kind === graphql_language_service_parser_1.RuleKinds.NAMED_TYPE &&
state.prevState &&
(state.prevState.kind === graphql_language_service_parser_1.RuleKinds.VARIABLE_DEFINITION ||
state.prevState.kind === graphql_language_service_parser_1.RuleKinds.LIST_TYPE ||
state.prevState.kind === graphql_language_service_parser_1.RuleKinds.NON_NULL_TYPE))) {
return getSuggestionsForVariableDefinition(token, schema, kind);
}
if (kind === graphql_language_service_parser_1.RuleKinds.DIRECTIVE) {
return getSuggestionsForDirective(token, state, schema, kind);
}
return [];
}
exports.getAutocompleteSuggestions = getAutocompleteSuggestions;
function getSuggestionsForFieldNames(token, typeInfo, schema) {
if (typeInfo.parentType) {
const parentType = typeInfo.parentType;
let fields = [];
if ('getFields' in parentType) {
fields = autocompleteUtils_1.objectValues(parentType.getFields());
}
if (graphql_2.isCompositeType(parentType)) {
fields.push(graphql_2.TypeNameMetaFieldDef);
}
if (parentType === schema.getQueryType()) {
fields.push(graphql_2.SchemaMetaFieldDef, graphql_2.TypeMetaFieldDef);
}
return autocompleteUtils_1.hintList(token, fields.map((field, index) => {
var _a;
return ({
sortText: String(index) + field.name,
label: field.name,
detail: String(field.type),
documentation: (_a = field.description) !== null && _a !== void 0 ? _a : undefined,
deprecated: field.isDeprecated,
isDeprecated: field.isDeprecated,
deprecationReason: field.deprecationReason,
kind: vscode_languageserver_types_1.CompletionItemKind.Field,
type: field.type,
});
}));
}
return [];
}
function getSuggestionsForInputValues(token, typeInfo, queryText, schema) {
const namedInputType = graphql_2.getNamedType(typeInfo.inputType);
const queryVariables = getVariableCompletions(queryText, schema, true).filter(v => v.detail === namedInputType.name);
if (namedInputType instanceof graphql_2.GraphQLEnumType) {
const values = namedInputType.getValues();
return autocompleteUtils_1.hintList(token, values
.map((value) => {
var _a;
return ({
label: value.name,
detail: String(namedInputType),
documentation: (_a = value.description) !== null && _a !== void 0 ? _a : undefined,
deprecated: value.isDeprecated,
isDeprecated: value.isDeprecated,
deprecationReason: value.deprecationReason,
kind: vscode_languageserver_types_1.CompletionItemKind.EnumMember,
type: namedInputType,
});
})
.concat(queryVariables));
}
else if (namedInputType === graphql_2.GraphQLBoolean) {
return autocompleteUtils_1.hintList(token, queryVariables.concat([
{
label: 'true',
detail: String(graphql_2.GraphQLBoolean),
documentation: 'Not false.',
kind: vscode_languageserver_types_1.CompletionItemKind.Variable,
type: graphql_2.GraphQLBoolean,
},
{
label: 'false',
detail: String(graphql_2.GraphQLBoolean),
documentation: 'Not true.',
kind: vscode_languageserver_types_1.CompletionItemKind.Variable,
type: graphql_2.GraphQLBoolean,
},
]));
}
return queryVariables;
}
function getSuggestionsForImplements(token, tokenState, schema, documentText, typeInfo) {
if (tokenState.needsSeperator) {
return [];
}
const typeMap = schema.getTypeMap();
const schemaInterfaces = autocompleteUtils_1.objectValues(typeMap).filter(graphql_1.isInterfaceType);
const schemaInterfaceNames = schemaInterfaces.map(({ name }) => name);
const inlineInterfaces = new Set();
runOnlineParser(documentText, (_, state) => {
var _a, _b, _c, _d, _e;
if (state.name) {
if (state.kind === graphql_language_service_parser_1.RuleKinds.INTERFACE_DEF &&
!schemaInterfaceNames.includes(state.name)) {
inlineInterfaces.add(state.name);
}
if (state.kind === graphql_language_service_parser_1.RuleKinds.NAMED_TYPE &&
((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === graphql_language_service_parser_1.RuleKinds.IMPLEMENTS) {
if (typeInfo.interfaceDef) {
const existingType = (_b = typeInfo.interfaceDef) === null || _b === void 0 ? void 0 : _b.getInterfaces().find(({ name }) => name === state.name);
if (existingType) {
return;
}
const type = schema.getType(state.name);
const interfaceConfig = (_c = typeInfo.interfaceDef) === null || _c === void 0 ? void 0 : _c.toConfig();
typeInfo.interfaceDef = new graphql_1.GraphQLInterfaceType(Object.assign(Object.assign({}, interfaceConfig), { interfaces: [
...interfaceConfig.interfaces,
type ||
new graphql_1.GraphQLInterfaceType({ name: state.name, fields: {} }),
] }));
}
else if (typeInfo.objectTypeDef) {
const existingType = (_d = typeInfo.objectTypeDef) === null || _d === void 0 ? void 0 : _d.getInterfaces().find(({ name }) => name === state.name);
if (existingType) {
return;
}
const type = schema.getType(state.name);
const objectTypeConfig = (_e = typeInfo.objectTypeDef) === null || _e === void 0 ? void 0 : _e.toConfig();
typeInfo.objectTypeDef = new graphql_1.GraphQLObjectType(Object.assign(Object.assign({}, objectTypeConfig), { interfaces: [
...objectTypeConfig.interfaces,
type ||
new graphql_1.GraphQLInterfaceType({ name: state.name, fields: {} }),
] }));
}
}
}
});
const currentTypeToExtend = typeInfo.interfaceDef || typeInfo.objectTypeDef;
const siblingInterfaces = (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.getInterfaces()) || [];
const siblingInterfaceNames = siblingInterfaces.map(({ name }) => name);
const possibleInterfaces = schemaInterfaces
.concat([...inlineInterfaces].map(name => ({ name })))
.filter(({ name }) => name !== (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.name) &&
!siblingInterfaceNames.includes(name));
return autocompleteUtils_1.hintList(token, possibleInterfaces.map(type => {
const result = {
label: type.name,
kind: vscode_languageserver_types_1.CompletionItemKind.Interface,
type,
};
if (type === null || type === void 0 ? void 0 : type.description) {
result.documentation = type.description;
}
return result;
}));
}
function getSuggestionsForFragmentTypeConditions(token, typeInfo, schema, _kind) {
let possibleTypes;
if (typeInfo.parentType) {
if (graphql_2.isAbstractType(typeInfo.parentType)) {
const abstractType = graphql_2.assertAbstractType(typeInfo.parentType);
const possibleObjTypes = schema.getPossibleTypes(abstractType);
const possibleIfaceMap = Object.create(null);
possibleObjTypes.forEach(type => {
type.getInterfaces().forEach(iface => {
possibleIfaceMap[iface.name] = iface;
});
});
possibleTypes = possibleObjTypes.concat(autocompleteUtils_1.objectValues(possibleIfaceMap));
}
else {
possibleTypes = [typeInfo.parentType];
}
}
else {
const typeMap = schema.getTypeMap();
possibleTypes = autocompleteUtils_1.objectValues(typeMap).filter(graphql_2.isCompositeType);
}
return autocompleteUtils_1.hintList(token, possibleTypes.map(type => {
const namedType = graphql_2.getNamedType(type);
return {
label: String(type),
documentation: (namedType && namedType.description) || '',
kind: vscode_languageserver_types_1.CompletionItemKind.Field,
};
}));
}
function getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, fragmentDefs) {
if (!queryText) {
return [];
}
const typeMap = schema.getTypeMap();
const defState = autocompleteUtils_1.getDefinitionState(token.state);
const fragments = getFragmentDefinitions(queryText);
if (fragmentDefs && fragmentDefs.length > 0) {
fragments.push(...fragmentDefs);
}
const relevantFrags = fragments.filter(frag => typeMap[frag.typeCondition.name.value] &&
!(defState &&
defState.kind === graphql_language_service_parser_1.RuleKinds.FRAGMENT_DEFINITION &&
defState.name === frag.name.value) &&
graphql_2.isCompositeType(typeInfo.parentType) &&
graphql_2.isCompositeType(typeMap[frag.typeCondition.name.value]) &&
graphql_2.doTypesOverlap(schema, typeInfo.parentType, typeMap[frag.typeCondition.name.value]));
return autocompleteUtils_1.hintList(token, relevantFrags.map(frag => ({
label: frag.name.value,
detail: String(typeMap[frag.typeCondition.name.value]),
documentation: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}`,
kind: vscode_languageserver_types_1.CompletionItemKind.Field,
type: typeMap[frag.typeCondition.name.value],
})));
}
const getParentDefinition = (state, kind) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
if (((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === kind) {
return state.prevState;
}
if (((_c = (_b = state.prevState) === null || _b === void 0 ? void 0 : _b.prevState) === null || _c === void 0 ? void 0 : _c.kind) === kind) {
return state.prevState.prevState;
}
if (((_f = (_e = (_d = state.prevState) === null || _d === void 0 ? void 0 : _d.prevState) === null || _e === void 0 ? void 0 : _e.prevState) === null || _f === void 0 ? void 0 : _f.kind) === kind) {
return state.prevState.prevState.prevState;
}
if (((_k = (_j = (_h = (_g = state.prevState) === null || _g === void 0 ? void 0 : _g.prevState) === null || _h === void 0 ? void 0 : _h.prevState) === null || _j === void 0 ? void 0 : _j.prevState) === null || _k === void 0 ? void 0 : _k.kind) === kind) {
return state.prevState.prevState.prevState.prevState;
}
};
function getVariableCompletions(queryText, schema, forcePrefix = false) {
let variableName;
let variableType;
const definitions = Object.create({});
runOnlineParser(queryText, (_, state) => {
if (state.kind === graphql_language_service_parser_1.RuleKinds.VARIABLE && state.name) {
variableName = state.name;
}
if (state.kind === graphql_language_service_parser_1.RuleKinds.NAMED_TYPE && variableName) {
const parentDefinition = getParentDefinition(state, graphql_language_service_parser_1.RuleKinds.TYPE);
if (parentDefinition === null || parentDefinition === void 0 ? void 0 : parentDefinition.type) {
variableType = schema.getType(parentDefinition === null || parentDefinition === void 0 ? void 0 : parentDefinition.type);
}
}
if (variableName && variableType) {
if (!definitions[variableName]) {
definitions[variableName] = {
detail: variableType.toString(),
label: `$${variableName}`,
type: variableType,
kind: vscode_languageserver_types_1.CompletionItemKind.Variable,
};
if (forcePrefix) {
definitions[variableName].insertText = `$${variableName}`;
}
variableName = null;
variableType = null;
}
}
});
return autocompleteUtils_1.objectValues(definitions);
}
exports.getVariableCompletions = getVariableCompletions;
function getFragmentDefinitions(queryText) {
const fragmentDefs = [];
runOnlineParser(queryText, (_, state) => {
if (state.kind === graphql_language_service_parser_1.RuleKinds.FRAGMENT_DEFINITION &&
state.name &&
state.type) {
fragmentDefs.push({
kind: graphql_language_service_parser_1.RuleKinds.FRAGMENT_DEFINITION,
name: {
kind: 'Name',
value: state.name,
},
selectionSet: {
kind: graphql_language_service_parser_1.RuleKinds.SELECTION_SET,
selections: [],
},
typeCondition: {
kind: graphql_language_service_parser_1.RuleKinds.NAMED_TYPE,
name: {
kind: 'Name',
value: state.type,
},
},
});
}
});
return fragmentDefs;
}
exports.getFragmentDefinitions = getFragmentDefinitions;
function getSuggestionsForVariableDefinition(token, schema, _kind) {
const inputTypeMap = schema.getTypeMap();
const inputTypes = autocompleteUtils_1.objectValues(inputTypeMap).filter(graphql_2.isInputType);
return autocompleteUtils_1.hintList(token, inputTypes.map((type) => ({
label: type.name,
documentation: type.description,
kind: vscode_languageserver_types_1.CompletionItemKind.Variable,
})));
}
function getSuggestionsForDirective(token, state, schema, _kind) {
if (state.prevState && state.prevState.kind) {
const directives = schema
.getDirectives()
.filter(directive => canUseDirective(state.prevState, directive));
return autocompleteUtils_1.hintList(token, directives.map(directive => ({
label: directive.name,
documentation: directive.description || '',
kind: vscode_languageserver_types_1.CompletionItemKind.Function,
})));
}
return [];
}
function getTokenAtPosition(queryText, cursor) {
let styleAtCursor = null;
let stateAtCursor = null;
let stringAtCursor = null;
const token = runOnlineParser(queryText, (stream, state, style, index) => {
if (index === cursor.line) {
if (stream.getCurrentPosition() >= cursor.character) {
styleAtCursor = style;
stateAtCursor = Object.assign({}, state);
stringAtCursor = stream.current();
return 'BREAK';
}
}
});
return {
start: token.start,
end: token.end,
string: stringAtCursor || token.string,
state: stateAtCursor || token.state,
style: styleAtCursor || token.style,
};
}
exports.getTokenAtPosition = getTokenAtPosition;
function runOnlineParser(queryText, callback) {
const lines = queryText.split('\n');
const parser = graphql_language_service_parser_1.onlineParser();
let state = parser.startState();
let style = '';
let stream = new graphql_language_service_parser_1.CharacterStream('');
for (let i = 0; i < lines.length; i++) {
stream = new graphql_language_service_parser_1.CharacterStream(lines[i]);
while (!stream.eol()) {
style = parser.token(stream, state);
const code = callback(stream, state, style, i);
if (code === 'BREAK') {
break;
}
}
callback(stream, state, style, i);
if (!state.kind) {
state = parser.startState();
}
}
return {
start: stream.getStartOfToken(),
end: stream.getCurrentPosition(),
string: stream.current(),
state,
style,
};
}
exports.runOnlineParser = runOnlineParser;
function canUseDirective(state, directive) {
if (!state || !state.kind) {
return false;
}
const kind = state.kind;
const locations = directive.locations;
switch (kind) {
case graphql_language_service_parser_1.RuleKinds.QUERY:
return locations.indexOf('QUERY') !== -1;
case graphql_language_service_parser_1.RuleKinds.MUTATION:
return locations.indexOf('MUTATION') !== -1;
case graphql_language_service_parser_1.RuleKinds.SUBSCRIPTION:
return locations.indexOf('SUBSCRIPTION') !== -1;
case graphql_language_service_parser_1.RuleKinds.FIELD:
case graphql_language_service_parser_1.RuleKinds.ALIASED_FIELD:
return locations.indexOf('FIELD') !== -1;
case graphql_language_service_parser_1.RuleKinds.FRAGMENT_DEFINITION:
return locations.indexOf('FRAGMENT_DEFINITION') !== -1;
case graphql_language_service_parser_1.RuleKinds.FRAGMENT_SPREAD:
return locations.indexOf('FRAGMENT_SPREAD') !== -1;
case graphql_language_service_parser_1.RuleKinds.INLINE_FRAGMENT:
return locations.indexOf('INLINE_FRAGMENT') !== -1;
case graphql_language_service_parser_1.RuleKinds.SCHEMA_DEF:
return locations.indexOf('SCHEMA') !== -1;
case graphql_language_service_parser_1.RuleKinds.SCALAR_DEF:
return locations.indexOf('SCALAR') !== -1;
case graphql_language_service_parser_1.RuleKinds.OBJECT_TYPE_DEF:
return locations.indexOf('OBJECT') !== -1;
case graphql_language_service_parser_1.RuleKinds.FIELD_DEF:
return locations.indexOf('FIELD_DEFINITION') !== -1;
case graphql_language_service_parser_1.RuleKinds.INTERFACE_DEF:
return locations.indexOf('INTERFACE') !== -1;
case graphql_language_service_parser_1.RuleKinds.UNION_DEF:
return locations.indexOf('UNION') !== -1;
case graphql_language_service_parser_1.RuleKinds.ENUM_DEF:
return locations.indexOf('ENUM') !== -1;
case graphql_language_service_parser_1.RuleKinds.ENUM_VALUE:
return locations.indexOf('ENUM_VALUE') !== -1;
case graphql_language_service_parser_1.RuleKinds.INPUT_DEF:
return locations.indexOf('INPUT_OBJECT') !== -1;
case graphql_language_service_parser_1.RuleKinds.INPUT_VALUE_DEF:
const prevStateKind = state.prevState && state.prevState.kind;
switch (prevStateKind) {
case graphql_language_service_parser_1.RuleKinds.ARGUMENTS_DEF:
return locations.indexOf('ARGUMENT_DEFINITION') !== -1;
case graphql_language_service_parser_1.RuleKinds.INPUT_DEF:
return locations.indexOf('INPUT_FIELD_DEFINITION') !== -1;
}
}
return false;
}
exports.canUseDirective = canUseDirective;
function getTypeInfo(schema, tokenState) {
let argDef;
let argDefs;
let directiveDef;
let enumValue;
let fieldDef;
let inputType;
let objectTypeDef;
let objectFieldDefs;
let parentType;
let type;
let interfaceDef;
autocompleteUtils_1.forEachState(tokenState, state => {
switch (state.kind) {
case graphql_language_service_parser_1.RuleKinds.QUERY:
case 'ShortQuery':
type = schema.getQueryType();
break;
case graphql_language_service_parser_1.RuleKinds.MUTATION:
type = schema.getMutationType();
break;
case graphql_language_service_parser_1.RuleKinds.SUBSCRIPTION:
type = schema.getSubscriptionType();
break;
case graphql_language_service_parser_1.RuleKinds.INLINE_FRAGMENT:
case graphql_language_service_parser_1.RuleKinds.FRAGMENT_DEFINITION:
if (state.type) {
type = schema.getType(state.type);
}
break;
case graphql_language_service_parser_1.RuleKinds.FIELD:
case graphql_language_service_parser_1.RuleKinds.ALIASED_FIELD: {
if (!type || !state.name) {
fieldDef = null;
}
else {
fieldDef = parentType
? autocompleteUtils_1.getFieldDef(schema, parentType, state.name)
: null;
type = fieldDef ? fieldDef.type : null;
}
break;
}
case graphql_language_service_parser_1.RuleKinds.SELECTION_SET:
parentType = graphql_2.getNamedType(type);
break;
case graphql_language_service_parser_1.RuleKinds.DIRECTIVE:
directiveDef = state.name ? schema.getDirective(state.name) : null;
break;
case graphql_language_service_parser_1.RuleKinds.INTERFACE_DEF:
if (state.name) {
objectTypeDef = null;
interfaceDef = new graphql_1.GraphQLInterfaceType({
name: state.name,
interfaces: [],
fields: {},
});
}
break;
case graphql_language_service_parser_1.RuleKinds.OBJECT_TYPE_DEF:
if (state.name) {
interfaceDef = null;
objectTypeDef = new graphql_1.GraphQLObjectType({
name: state.name,
interfaces: [],
fields: {},
});
}
break;
case graphql_language_service_parser_1.RuleKinds.ARGUMENTS: {
if (!state.prevState) {
argDefs = null;
}
else {
switch (state.prevState.kind) {
case graphql_language_service_parser_1.RuleKinds.FIELD:
argDefs = fieldDef && fieldDef.args;
break;
case graphql_language_service_parser_1.RuleKinds.DIRECTIVE:
argDefs = directiveDef && directiveDef.args;
break;
case graphql_language_service_parser_1.RuleKinds.ALIASED_FIELD: {
const name = state.prevState && state.prevState.name;
if (!name) {
argDefs = null;
break;
}
const field = parentType
? autocompleteUtils_1.getFieldDef(schema, parentType, name)
: null;
if (!field) {
argDefs = null;
break;
}
argDefs = field.args;
break;
}
default:
argDefs = null;
break;
}
}
break;
}
case graphql_language_service_parser_1.RuleKinds.ARGUMENT:
if (argDefs) {
for (let i = 0; i < argDefs.length; i++) {
if (argDefs[i].name === state.name) {
argDef = argDefs[i];
break;
}
}
}
inputType = argDef && argDef.type;
break;
case graphql_language_service_parser_1.RuleKinds.ENUM_VALUE:
const enumType = graphql_2.getNamedType(inputType);
enumValue =
enumType instanceof graphql_2.GraphQLEnumType
? find(enumType.getValues(), (val) => val.value === state.name)
: null;
break;
case graphql_language_service_parser_1.RuleKinds.LIST_VALUE:
const nullableType = graphql_2.getNullableType(inputType);
inputType =
nullableType instanceof graphql_2.GraphQLList ? nullableType.ofType : null;
break;
case graphql_language_service_parser_1.RuleKinds.OBJECT_VALUE:
const objectType = graphql_2.getNamedType(inputType);
objectFieldDefs =
objectType instanceof graphql_2.GraphQLInputObjectType
? objectType.getFields()
: null;
break;
case graphql_language_service_parser_1.RuleKinds.OBJECT_FIELD:
const objectField = state.name && objectFieldDefs ? objectFieldDefs[state.name] : null;
inputType = objectField && objectField.type;
break;
case graphql_language_service_parser_1.RuleKinds.NAMED_TYPE:
if (state.name) {
type = schema.getType(state.name);
}
break;
}
});
return {
argDef,
argDefs,
directiveDef,
enumValue,
fieldDef,
inputType,
objectFieldDefs,
parentType,
type,
interfaceDef,
objectTypeDef,
};
}
exports.getTypeInfo = getTypeInfo;
function find(array, predicate) {
for (let i = 0; i < array.length; i++) {
if (predicate(array[i])) {
return array[i];
}
}
return null;
}
//# sourceMappingURL=getAutocompleteSuggestions.js.map