UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 4.63 kB
{"version":3,"file":"ValuesOfCorrectTypeRule.js","sourceRoot":"","sources":["../../../src/validation/rules/ValuesOfCorrectTypeRule.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,oBAAoB,EAAE,+CAA8C;AAyC7E,MAAM,UAAU,uBAAuB,CACrC,OAA0B;IAE1B,OAAO;QACL,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAGlB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/D,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QACzD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3E,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QAMzD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QACzD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CACrB,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAQD,SAAS,gBAAgB,CACvB,OAA0B,EAC1B,IAAe,EACf,SAAkC;IAElC,IAAI,SAAS,EAAE,CAAC;QACd,oBAAoB,CAClB,IAAI,EACJ,SAAS,EACT,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,EACD,SAAS,EACT,SAAS,EACT,OAAO,CAAC,eAAe,CACxB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport type { Maybe } from '../../jsutils/Maybe.ts';\n\nimport type { ValueNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { GraphQLInputType } from '../../type/index.ts';\n\nimport { validateInputLiteral } from '../../utilities/validateInputValue.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Value literals of correct type\n *\n * A GraphQL document is only valid if all value literals are of the type\n * expected at their position.\n *\n * See https://spec.graphql.org/draft/#sec-Values-of-Correct-Type\n * @param context - The validation context used while checking the document.\n * @returns A visitor that reports validation errors for this rule.\n * @example\n * ```ts\n * import { buildSchema, parse, validate } from 'graphql';\n * import { ValuesOfCorrectTypeRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * count(limit: Int): Int\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { count(limit: \"many\") }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * ValuesOfCorrectTypeRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { count(limit: 1) }\n * `);\n * const validErrors = validate(schema, validDocument, [ValuesOfCorrectTypeRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function ValuesOfCorrectTypeRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n NullValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n ListValue: (node) =>\n // Note: TypeInfo will traverse into a list's item type, so look to the\n // parent input type to check if it is a list.\n isValidValueNode(context, node, context.getParentInputType()),\n ObjectValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n EnumValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n IntValue: (node) => isValidValueNode(context, node, context.getInputType()),\n FloatValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n // Descriptions are string values that would not validate according\n // to the below logic, but since (per the specification) descriptions must\n // not affect validation, they are ignored entirely when visiting the AST\n // and do not require special handling.\n // See https://spec.graphql.org/draft/#sec-Descriptions\n StringValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n BooleanValue: (node) =>\n isValidValueNode(context, node, context.getInputType()),\n };\n}\n\n/**\n * Any value literal may be a valid representation of a Scalar, depending on\n * that scalar type.\n *\n * @internal\n */\nfunction isValidValueNode(\n context: ValidationContext,\n node: ValueNode,\n inputType: Maybe<GraphQLInputType>,\n): false {\n if (inputType) {\n validateInputLiteral(\n node,\n inputType,\n (error) => {\n context.reportError(error);\n },\n undefined,\n undefined,\n context.hideSuggestions,\n );\n }\n return false;\n}\n"]}