UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 16.5 kB
{"version":3,"file":"resolveSchemaCoordinate.js","sourceRoot":"","sources":["../../src/utilities/resolveSchemaCoordinate.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Schema Coordinates */\n\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type {\n ArgumentCoordinateNode,\n DirectiveArgumentCoordinateNode,\n DirectiveCoordinateNode,\n MemberCoordinateNode,\n SchemaCoordinateNode,\n TypeCoordinateNode,\n} from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\nimport { parseSchemaCoordinate } from '../language/parser.ts';\nimport type { Source } from '../language/source.ts';\n\nimport type {\n GraphQLArgument,\n GraphQLEnumType,\n GraphQLEnumValue,\n GraphQLField,\n GraphQLInputField,\n GraphQLInputObjectType,\n GraphQLInterfaceType,\n GraphQLNamedType,\n GraphQLObjectType,\n} from '../type/definition.ts';\nimport {\n isEnumType,\n isInputObjectType,\n isInterfaceType,\n isObjectType,\n} from '../type/definition.ts';\nimport type { GraphQLDirective } from '../type/directives.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\n\n/**\n * A resolved schema element may be one of the following kinds:\n *\n * @internal\n */\nexport interface ResolvedNamedType {\n readonly kind: 'NamedType';\n readonly type: GraphQLNamedType;\n}\n\n/** @internal */\nexport interface ResolvedField {\n readonly kind: 'Field';\n readonly type: GraphQLObjectType | GraphQLInterfaceType;\n readonly field: GraphQLField<unknown, unknown>;\n}\n\n/** @internal */\nexport interface ResolvedInputField {\n readonly kind: 'InputField';\n readonly type: GraphQLInputObjectType;\n readonly inputField: GraphQLInputField;\n}\n\n/** @internal */\nexport interface ResolvedEnumValue {\n readonly kind: 'EnumValue';\n readonly type: GraphQLEnumType;\n readonly enumValue: GraphQLEnumValue;\n}\n\n/** @internal */\nexport interface ResolvedFieldArgument {\n readonly kind: 'FieldArgument';\n readonly type: GraphQLObjectType | GraphQLInterfaceType;\n readonly field: GraphQLField<unknown, unknown>;\n readonly fieldArgument: GraphQLArgument;\n}\n\n/** @internal */\nexport interface ResolvedDirective {\n readonly kind: 'Directive';\n readonly directive: GraphQLDirective;\n}\n\n/** @internal */\nexport interface ResolvedDirectiveArgument {\n readonly kind: 'DirectiveArgument';\n readonly directive: GraphQLDirective;\n readonly directiveArgument: GraphQLArgument;\n}\n\n/** A schema element resolved from a schema coordinate. */\nexport type ResolvedSchemaElement =\n | ResolvedNamedType\n | ResolvedField\n | ResolvedInputField\n | ResolvedEnumValue\n | ResolvedFieldArgument\n | ResolvedDirective\n | ResolvedDirectiveArgument;\n\n/**\n * A schema coordinate is resolved in the context of a GraphQL schema to\n * uniquely identify a schema element. It returns undefined if the schema\n * coordinate does not resolve to a schema element, meta-field, or introspection\n * schema element. It will throw if the containing schema element (if\n * applicable) does not exist.\n *\n * https://spec.graphql.org/draft/#sec-Schema-Coordinates.Semantics\n * @param schema - GraphQL schema to use.\n * @param schemaCoordinate - The schema coordinate to resolve.\n * @returns The schema element identified by the coordinate, or undefined if none exists.\n * @example\n * ```ts\n * import { buildSchema, resolveSchemaCoordinate } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * directive @tag(name: String!) on FIELD_DEFINITION\n *\n * input ReviewInput {\n * stars: Int!\n * }\n *\n * enum Episode {\n * NEW_HOPE\n * }\n *\n * type Query {\n * reviews(input: ReviewInput): [String] @tag(name: \"reviews\")\n * }\n * `);\n *\n * resolveSchemaCoordinate(schema, 'Query').kind; // => 'NamedType'\n * resolveSchemaCoordinate(schema, 'Query.reviews').kind; // => 'Field'\n * resolveSchemaCoordinate(schema, 'Query.reviews(input:)').kind; // => 'FieldArgument'\n * resolveSchemaCoordinate(schema, 'ReviewInput.stars').kind; // => 'InputField'\n * resolveSchemaCoordinate(schema, 'Episode.NEW_HOPE').kind; // => 'EnumValue'\n * resolveSchemaCoordinate(schema, '@tag').kind; // => 'Directive'\n * resolveSchemaCoordinate(schema, '@tag(name:)').kind; // => 'DirectiveArgument'\n * resolveSchemaCoordinate(schema, 'Query.missing'); // => undefined\n * ```\n */\nexport function resolveSchemaCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: string | Source,\n): ResolvedSchemaElement | undefined {\n return resolveASTSchemaCoordinate(\n schema,\n parseSchemaCoordinate(schemaCoordinate),\n );\n}\n\n/**\n * TypeCoordinate : Name\n *\n * @internal\n */\nfunction resolveTypeCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: TypeCoordinateNode,\n): ResolvedNamedType | undefined {\n // 1. Let {typeName} be the value of {Name}.\n const typeName = schemaCoordinate.name.value;\n const type = schema.getType(typeName);\n\n // 2. Return the type in the {schema} named {typeName} if it exists.\n if (type == null) {\n return;\n }\n\n return { kind: 'NamedType', type };\n}\n\n/**\n * MemberCoordinate : Name . Name\n *\n * @internal\n */\nfunction resolveMemberCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: MemberCoordinateNode,\n): ResolvedField | ResolvedInputField | ResolvedEnumValue | undefined {\n // 1. Let {typeName} be the value of the first {Name}.\n // 2. Let {type} be the type in the {schema} named {typeName}.\n const typeName = schemaCoordinate.name.value;\n const type = schema.getType(typeName);\n\n // 3. Assert: {type} must exist, and must be an Enum, Input Object, Object or Interface type.\n if (!type) {\n throw new Error(\n `Expected ${inspect(typeName)} to be defined as a type in the schema.`,\n );\n }\n if (\n !isEnumType(type) &&\n !isInputObjectType(type) &&\n !isObjectType(type) &&\n !isInterfaceType(type)\n ) {\n throw new Error(\n `Expected ${inspect(typeName)} to be an Enum, Input Object, Object or Interface type.`,\n );\n }\n\n // 4. If {type} is an Enum type:\n if (isEnumType(type)) {\n // 1. Let {enumValueName} be the value of the second {Name}.\n const enumValueName = schemaCoordinate.memberName.value;\n const enumValue = type.getValue(enumValueName);\n\n // 2. Return the enum value of {type} named {enumValueName} if it exists.\n if (enumValue == null) {\n return;\n }\n\n return { kind: 'EnumValue', type, enumValue };\n }\n\n // 5. Otherwise, if {type} is an Input Object type:\n if (isInputObjectType(type)) {\n // 1. Let {inputFieldName} be the value of the second {Name}.\n const inputFieldName = schemaCoordinate.memberName.value;\n const inputField = type.getFields()[inputFieldName];\n\n // 2. Return the input field of {type} named {inputFieldName} if it exists.\n if (inputField == null) {\n return;\n }\n\n return { kind: 'InputField', type, inputField };\n }\n\n // 6. Otherwise:\n // 1. Let {fieldName} be the value of the second {Name}.\n const fieldName = schemaCoordinate.memberName.value;\n const field = schema.getField(type, fieldName);\n\n // 2. Return the field of {type} named {fieldName} if it exists.\n if (field == null) {\n return;\n }\n\n return { kind: 'Field', type, field };\n}\n\n/**\n * ArgumentCoordinate : Name . Name ( Name : )\n *\n * @internal\n */\nfunction resolveArgumentCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: ArgumentCoordinateNode,\n): ResolvedFieldArgument | undefined {\n // 1. Let {typeName} be the value of the first {Name}.\n // 2. Let {type} be the type in the {schema} named {typeName}.\n const typeName = schemaCoordinate.name.value;\n const type = schema.getType(typeName);\n\n // 3. Assert: {type} must exist, and be an Object or Interface type.\n if (type == null) {\n throw new Error(\n `Expected ${inspect(typeName)} to be defined as a type in the schema.`,\n );\n }\n if (!isObjectType(type) && !isInterfaceType(type)) {\n throw new Error(\n `Expected ${inspect(typeName)} to be an object type or interface type.`,\n );\n }\n\n // 4. Let {fieldName} be the value of the second {Name}.\n // 5. Let {field} be the field of {type} named {fieldName}.\n const fieldName = schemaCoordinate.fieldName.value;\n const field = schema.getField(type, fieldName);\n\n // 7. Assert: {field} must exist.\n if (field == null) {\n throw new Error(\n `Expected ${inspect(fieldName)} to exist as a field of type ${inspect(typeName)} in the schema.`,\n );\n }\n\n // 7. Let {fieldArgumentName} be the value of the third {Name}.\n const fieldArgumentName = schemaCoordinate.argumentName.value;\n const fieldArgument = field.args.find(\n (arg) => arg.name === fieldArgumentName,\n );\n\n // 8. Return the argument of {field} named {fieldArgumentName} if it exists.\n if (fieldArgument == null) {\n return;\n }\n\n return { kind: 'FieldArgument', type, field, fieldArgument };\n}\n\n/**\n * DirectiveCoordinate : @ Name\n *\n * @internal\n */\nfunction resolveDirectiveCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: DirectiveCoordinateNode,\n): ResolvedDirective | undefined {\n // 1. Let {directiveName} be the value of {Name}.\n const directiveName = schemaCoordinate.name.value;\n const directive = schema.getDirective(directiveName);\n\n // 2. Return the directive in the {schema} named {directiveName} if it exists.\n if (!directive) {\n return;\n }\n\n return { kind: 'Directive', directive };\n}\n\n/**\n * DirectiveArgumentCoordinate : @ Name ( Name : )\n *\n * @internal\n */\nfunction resolveDirectiveArgumentCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: DirectiveArgumentCoordinateNode,\n): ResolvedDirectiveArgument | undefined {\n // 1. Let {directiveName} be the value of the first {Name}.\n // 2. Let {directive} be the directive in the {schema} named {directiveName}.\n const directiveName = schemaCoordinate.name.value;\n const directive = schema.getDirective(directiveName);\n\n // 3. Assert {directive} must exist.\n if (!directive) {\n throw new Error(\n `Expected ${inspect(directiveName)} to be defined as a directive in the schema.`,\n );\n }\n\n // 4. Let {directiveArgumentName} be the value of the second {Name}.\n const {\n argumentName: { value: directiveArgumentName },\n } = schemaCoordinate;\n const directiveArgument = directive.args.find(\n (arg) => arg.name === directiveArgumentName,\n );\n\n // 5. Return the argument of {directive} named {directiveArgumentName} if it exists.\n if (!directiveArgument) {\n return;\n }\n\n return { kind: 'DirectiveArgument', directive, directiveArgument };\n}\n\n/**\n * Resolves schema coordinate from a parsed SchemaCoordinate node.\n * @param schema - GraphQL schema to use.\n * @param schemaCoordinate - The schema coordinate to resolve.\n * @returns The schema element identified by the parsed coordinate, or undefined if none exists.\n * @example\n * ```ts\n * import { parseSchemaCoordinate } from 'graphql/language';\n * import { buildSchema, resolveASTSchemaCoordinate } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * greeting(name: String): String\n * }\n * `);\n * const coordinate = parseSchemaCoordinate('Query.greeting(name:)');\n * const resolved = resolveASTSchemaCoordinate(schema, coordinate);\n *\n * resolved.kind; // => 'FieldArgument'\n * resolved.field.name; // => 'greeting'\n * resolved.fieldArgument.name; // => 'name'\n * ```\n */\nexport function resolveASTSchemaCoordinate(\n schema: GraphQLSchema,\n schemaCoordinate: SchemaCoordinateNode,\n): ResolvedSchemaElement | undefined {\n switch (schemaCoordinate.kind) {\n case Kind.TYPE_COORDINATE:\n return resolveTypeCoordinate(schema, schemaCoordinate);\n case Kind.MEMBER_COORDINATE:\n return resolveMemberCoordinate(schema, schemaCoordinate);\n case Kind.ARGUMENT_COORDINATE:\n return resolveArgumentCoordinate(schema, schemaCoordinate);\n case Kind.DIRECTIVE_COORDINATE:\n return resolveDirectiveCoordinate(schema, schemaCoordinate);\n case Kind.DIRECTIVE_ARGUMENT_COORDINATE:\n return resolveDirectiveArgumentCoordinate(schema, schemaCoordinate);\n }\n}\n"]}