graphql 0.0.1-test.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NotSupportedTSVersion.d.ts +1 -0
- package/README.md +158 -0
- package/error/GraphQLError.d.ts +142 -0
- package/error/GraphQLError.js +267 -0
- package/error/GraphQLError.mjs +253 -0
- package/error/index.d.ts +7 -0
- package/error/index.js +41 -0
- package/error/index.mjs +3 -0
- package/error/locatedError.d.ts +13 -0
- package/error/locatedError.js +40 -0
- package/error/locatedError.mjs +32 -0
- package/error/syntaxError.d.ts +11 -0
- package/error/syntaxError.js +21 -0
- package/error/syntaxError.mjs +11 -0
- package/execution/collectFields.d.ts +45 -0
- package/execution/collectFields.js +229 -0
- package/execution/collectFields.mjs +213 -0
- package/execution/execute.d.ts +185 -0
- package/execution/execute.js +1016 -0
- package/execution/execute.mjs +988 -0
- package/execution/index.d.ts +14 -0
- package/execution/index.js +67 -0
- package/execution/index.mjs +9 -0
- package/execution/mapAsyncIterator.d.ts +9 -0
- package/execution/mapAsyncIterator.js +68 -0
- package/execution/mapAsyncIterator.mjs +61 -0
- package/execution/subscribe.d.ts +68 -0
- package/execution/subscribe.js +261 -0
- package/execution/subscribe.mjs +239 -0
- package/execution/values.d.ts +81 -0
- package/execution/values.js +292 -0
- package/execution/values.mjs +255 -0
- package/graphql.d.ts +67 -0
- package/graphql.js +96 -0
- package/graphql.mjs +122 -0
- package/index.d.ts +411 -0
- package/index.js +1263 -0
- package/index.mjs +254 -0
- package/jsutils/Maybe.d.ts +2 -0
- package/jsutils/Maybe.js +5 -0
- package/jsutils/Maybe.mjs +1 -0
- package/jsutils/ObjMap.d.ts +16 -0
- package/jsutils/ObjMap.js +5 -0
- package/jsutils/ObjMap.mjs +1 -0
- package/jsutils/Path.d.ts +20 -0
- package/jsutils/Path.js +33 -0
- package/jsutils/Path.mjs +25 -0
- package/jsutils/PromiseOrValue.d.ts +1 -0
- package/jsutils/PromiseOrValue.js +5 -0
- package/jsutils/PromiseOrValue.mjs +1 -0
- package/jsutils/devAssert.d.ts +1 -0
- package/jsutils/devAssert.js +14 -0
- package/jsutils/devAssert.mjs +7 -0
- package/jsutils/didYouMean.d.ts +8 -0
- package/jsutils/didYouMean.js +38 -0
- package/jsutils/didYouMean.mjs +32 -0
- package/jsutils/groupBy.d.ts +7 -0
- package/jsutils/groupBy.js +26 -0
- package/jsutils/groupBy.mjs +19 -0
- package/jsutils/identityFunc.d.ts +4 -0
- package/jsutils/identityFunc.js +13 -0
- package/jsutils/identityFunc.mjs +6 -0
- package/jsutils/inspect.d.ts +4 -0
- package/jsutils/inspect.js +121 -0
- package/jsutils/inspect.mjs +115 -0
- package/jsutils/instanceOf.d.ts +16 -0
- package/jsutils/instanceOf.js +60 -0
- package/jsutils/instanceOf.mjs +52 -0
- package/jsutils/invariant.d.ts +4 -0
- package/jsutils/invariant.js +16 -0
- package/jsutils/invariant.mjs +9 -0
- package/jsutils/isAsyncIterable.d.ts +7 -0
- package/jsutils/isAsyncIterable.js +18 -0
- package/jsutils/isAsyncIterable.mjs +11 -0
- package/jsutils/isIterableObject.d.ts +20 -0
- package/jsutils/isIterableObject.js +32 -0
- package/jsutils/isIterableObject.mjs +25 -0
- package/jsutils/isObjectLike.d.ts +7 -0
- package/jsutils/isObjectLike.js +14 -0
- package/jsutils/isObjectLike.mjs +7 -0
- package/jsutils/isPromise.d.ts +5 -0
- package/jsutils/isPromise.js +17 -0
- package/jsutils/isPromise.mjs +10 -0
- package/jsutils/keyMap.d.ts +32 -0
- package/jsutils/keyMap.js +43 -0
- package/jsutils/keyMap.mjs +36 -0
- package/jsutils/keyValMap.d.ts +23 -0
- package/jsutils/keyValMap.js +33 -0
- package/jsutils/keyValMap.mjs +26 -0
- package/jsutils/mapValue.d.ts +9 -0
- package/jsutils/mapValue.js +20 -0
- package/jsutils/mapValue.mjs +13 -0
- package/jsutils/memoize3.d.ts +9 -0
- package/jsutils/memoize3.js +41 -0
- package/jsutils/memoize3.mjs +34 -0
- package/jsutils/naturalCompare.d.ts +8 -0
- package/jsutils/naturalCompare.js +69 -0
- package/jsutils/naturalCompare.mjs +61 -0
- package/jsutils/printPathArray.d.ts +6 -0
- package/jsutils/printPathArray.js +17 -0
- package/jsutils/printPathArray.mjs +10 -0
- package/jsutils/promiseForObject.d.ts +11 -0
- package/jsutils/promiseForObject.js +25 -0
- package/jsutils/promiseForObject.mjs +18 -0
- package/jsutils/promiseReduce.d.ts +13 -0
- package/jsutils/promiseReduce.js +27 -0
- package/jsutils/promiseReduce.mjs +20 -0
- package/jsutils/suggestionList.d.ts +8 -0
- package/jsutils/suggestionList.js +139 -0
- package/jsutils/suggestionList.mjs +130 -0
- package/jsutils/toError.d.ts +4 -0
- package/jsutils/toError.js +25 -0
- package/jsutils/toError.mjs +18 -0
- package/jsutils/toObjMap.d.ts +5 -0
- package/jsutils/toObjMap.js +24 -0
- package/jsutils/toObjMap.mjs +17 -0
- package/language/ast.d.ts +536 -0
- package/language/ast.js +224 -0
- package/language/ast.mjs +206 -0
- package/language/blockString.d.ts +28 -0
- package/language/blockString.js +195 -0
- package/language/blockString.mjs +178 -0
- package/language/characterClasses.d.ts +47 -0
- package/language/characterClasses.js +75 -0
- package/language/characterClasses.mjs +64 -0
- package/language/directiveLocation.d.ts +32 -0
- package/language/directiveLocation.js +40 -0
- package/language/directiveLocation.mjs +31 -0
- package/language/index.d.ts +97 -0
- package/language/index.js +215 -0
- package/language/index.mjs +29 -0
- package/language/kinds.d.ts +65 -0
- package/language/kinds.js +64 -0
- package/language/kinds.mjs +55 -0
- package/language/lexer.d.ts +45 -0
- package/language/lexer.js +1006 -0
- package/language/lexer.mjs +902 -0
- package/language/location.d.ts +16 -0
- package/language/location.js +38 -0
- package/language/location.mjs +30 -0
- package/language/parser.d.ts +554 -0
- package/language/parser.js +1567 -0
- package/language/parser.mjs +1524 -0
- package/language/predicates.d.ts +33 -0
- package/language/predicates.js +109 -0
- package/language/predicates.mjs +81 -0
- package/language/printLocation.d.ts +14 -0
- package/language/printLocation.js +74 -0
- package/language/printLocation.mjs +66 -0
- package/language/printString.d.ts +5 -0
- package/language/printString.js +183 -0
- package/language/printString.mjs +176 -0
- package/language/printer.d.ts +6 -0
- package/language/printer.js +351 -0
- package/language/printer.mjs +339 -0
- package/language/source.d.ts +25 -0
- package/language/source.js +65 -0
- package/language/source.mjs +50 -0
- package/language/tokenKind.d.ts +34 -0
- package/language/tokenKind.js +44 -0
- package/language/tokenKind.mjs +35 -0
- package/language/visitor.d.ts +194 -0
- package/language/visitor.js +377 -0
- package/language/visitor.mjs +361 -0
- package/package.json +40 -0
- package/subscription/index.d.ts +19 -0
- package/subscription/index.js +19 -0
- package/subscription/index.mjs +19 -0
- package/type/assertName.d.ts +10 -0
- package/type/assertName.js +59 -0
- package/type/assertName.mjs +44 -0
- package/type/definition.d.ts +917 -0
- package/type/definition.js +1329 -0
- package/type/definition.mjs +1167 -0
- package/type/directives.d.ts +86 -0
- package/type/directives.js +224 -0
- package/type/directives.mjs +190 -0
- package/type/index.d.ts +150 -0
- package/type/index.js +547 -0
- package/type/index.mjs +103 -0
- package/type/introspection.d.ts +29 -0
- package/type/introspection.js +617 -0
- package/type/introspection.mjs +550 -0
- package/type/scalars.d.ts +19 -0
- package/type/scalars.js +359 -0
- package/type/scalars.mjs +299 -0
- package/type/schema.d.ts +170 -0
- package/type/schema.js +402 -0
- package/type/schema.mjs +381 -0
- package/type/validate.d.ts +17 -0
- package/type/validate.js +672 -0
- package/type/validate.mjs +647 -0
- package/utilities/TypeInfo.d.ts +67 -0
- package/utilities/TypeInfo.js +418 -0
- package/utilities/TypeInfo.mjs +395 -0
- package/utilities/assertValidName.d.ts +13 -0
- package/utilities/assertValidName.js +51 -0
- package/utilities/assertValidName.mjs +40 -0
- package/utilities/astFromValue.d.ts +28 -0
- package/utilities/astFromValue.js +190 -0
- package/utilities/astFromValue.mjs +177 -0
- package/utilities/buildASTSchema.d.ts +35 -0
- package/utilities/buildASTSchema.js +115 -0
- package/utilities/buildASTSchema.mjs +97 -0
- package/utilities/buildClientSchema.d.ts +19 -0
- package/utilities/buildClientSchema.js +386 -0
- package/utilities/buildClientSchema.mjs +363 -0
- package/utilities/coerceInputValue.d.ts +16 -0
- package/utilities/coerceInputValue.js +191 -0
- package/utilities/coerceInputValue.mjs +172 -0
- package/utilities/concatAST.d.ts +9 -0
- package/utilities/concatAST.js +26 -0
- package/utilities/concatAST.mjs +19 -0
- package/utilities/extendSchema.d.ts +40 -0
- package/utilities/extendSchema.js +798 -0
- package/utilities/extendSchema.mjs +789 -0
- package/utilities/findBreakingChanges.d.ts +51 -0
- package/utilities/findBreakingChanges.js +547 -0
- package/utilities/findBreakingChanges.mjs +516 -0
- package/utilities/getIntrospectionQuery.d.ts +182 -0
- package/utilities/getIntrospectionQuery.js +134 -0
- package/utilities/getIntrospectionQuery.mjs +127 -0
- package/utilities/getOperationAST.d.ts +11 -0
- package/utilities/getOperationAST.js +43 -0
- package/utilities/getOperationAST.mjs +36 -0
- package/utilities/getOperationRootType.d.ts +15 -0
- package/utilities/getOperationRootType.js +59 -0
- package/utilities/getOperationRootType.mjs +52 -0
- package/utilities/index.d.ts +61 -0
- package/utilities/index.js +233 -0
- package/utilities/index.mjs +55 -0
- package/utilities/introspectionFromSchema.d.ts +18 -0
- package/utilities/introspectionFromSchema.js +42 -0
- package/utilities/introspectionFromSchema.mjs +30 -0
- package/utilities/lexicographicSortSchema.d.ts +9 -0
- package/utilities/lexicographicSortSchema.js +177 -0
- package/utilities/lexicographicSortSchema.mjs +172 -0
- package/utilities/printSchema.d.ts +5 -0
- package/utilities/printSchema.js +333 -0
- package/utilities/printSchema.mjs +309 -0
- package/utilities/separateOperations.d.ts +11 -0
- package/utilities/separateOperations.js +88 -0
- package/utilities/separateOperations.mjs +80 -0
- package/utilities/sortValueNode.d.ts +9 -0
- package/utilities/sortValueNode.js +47 -0
- package/utilities/sortValueNode.mjs +39 -0
- package/utilities/stripIgnoredCharacters.d.ts +62 -0
- package/utilities/stripIgnoredCharacters.js +121 -0
- package/utilities/stripIgnoredCharacters.mjs +104 -0
- package/utilities/typeComparators.d.ts +32 -0
- package/utilities/typeComparators.js +116 -0
- package/utilities/typeComparators.mjs +106 -0
- package/utilities/typeFromAST.d.ts +32 -0
- package/utilities/typeFromAST.js +27 -0
- package/utilities/typeFromAST.mjs +18 -0
- package/utilities/typedQueryDocumentNode.d.ts +22 -0
- package/utilities/typedQueryDocumentNode.js +5 -0
- package/utilities/typedQueryDocumentNode.mjs +1 -0
- package/utilities/valueFromAST.d.ts +29 -0
- package/utilities/valueFromAST.js +185 -0
- package/utilities/valueFromAST.mjs +172 -0
- package/utilities/valueFromASTUntyped.d.ts +23 -0
- package/utilities/valueFromASTUntyped.js +61 -0
- package/utilities/valueFromASTUntyped.mjs +53 -0
- package/validation/ValidationContext.d.ts +95 -0
- package/validation/ValidationContext.js +232 -0
- package/validation/ValidationContext.mjs +212 -0
- package/validation/index.d.ts +40 -0
- package/validation/index.js +317 -0
- package/validation/index.mjs +68 -0
- package/validation/rules/ExecutableDefinitionsRule.d.ts +13 -0
- package/validation/rules/ExecutableDefinitionsRule.js +44 -0
- package/validation/rules/ExecutableDefinitionsRule.mjs +35 -0
- package/validation/rules/FieldsOnCorrectTypeRule.d.ts +13 -0
- package/validation/rules/FieldsOnCorrectTypeRule.js +143 -0
- package/validation/rules/FieldsOnCorrectTypeRule.mjs +125 -0
- package/validation/rules/FragmentsOnCompositeTypesRule.d.ts +14 -0
- package/validation/rules/FragmentsOnCompositeTypesRule.js +65 -0
- package/validation/rules/FragmentsOnCompositeTypesRule.mjs +49 -0
- package/validation/rules/KnownArgumentNamesRule.d.ts +23 -0
- package/validation/rules/KnownArgumentNamesRule.js +116 -0
- package/validation/rules/KnownArgumentNamesRule.mjs +98 -0
- package/validation/rules/KnownDirectivesRule.d.ts +16 -0
- package/validation/rules/KnownDirectivesRule.js +163 -0
- package/validation/rules/KnownDirectivesRule.mjs +146 -0
- package/validation/rules/KnownFragmentNamesRule.d.ts +13 -0
- package/validation/rules/KnownFragmentNamesRule.js +34 -0
- package/validation/rules/KnownFragmentNamesRule.mjs +24 -0
- package/validation/rules/KnownTypeNamesRule.d.ts +16 -0
- package/validation/rules/KnownTypeNamesRule.js +87 -0
- package/validation/rules/KnownTypeNamesRule.mjs +75 -0
- package/validation/rules/LoneAnonymousOperationRule.d.ts +13 -0
- package/validation/rules/LoneAnonymousOperationRule.js +40 -0
- package/validation/rules/LoneAnonymousOperationRule.mjs +32 -0
- package/validation/rules/LoneSchemaDefinitionRule.d.ts +10 -0
- package/validation/rules/LoneSchemaDefinitionRule.js +63 -0
- package/validation/rules/LoneSchemaDefinitionRule.mjs +53 -0
- package/validation/rules/NoFragmentCyclesRule.d.ts +13 -0
- package/validation/rules/NoFragmentCyclesRule.js +83 -0
- package/validation/rules/NoFragmentCyclesRule.mjs +76 -0
- package/validation/rules/NoUndefinedVariablesRule.d.ts +13 -0
- package/validation/rules/NoUndefinedVariablesRule.js +50 -0
- package/validation/rules/NoUndefinedVariablesRule.mjs +43 -0
- package/validation/rules/NoUnusedFragmentsRule.d.ts +13 -0
- package/validation/rules/NoUnusedFragmentsRule.js +59 -0
- package/validation/rules/NoUnusedFragmentsRule.mjs +52 -0
- package/validation/rules/NoUnusedVariablesRule.d.ts +13 -0
- package/validation/rules/NoUnusedVariablesRule.js +55 -0
- package/validation/rules/NoUnusedVariablesRule.mjs +48 -0
- package/validation/rules/OverlappingFieldsCanBeMergedRule-old.js +805 -0
- package/validation/rules/OverlappingFieldsCanBeMergedRule-old.mjs +788 -0
- package/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts +14 -0
- package/validation/rules/OverlappingFieldsCanBeMergedRule.js +805 -0
- package/validation/rules/OverlappingFieldsCanBeMergedRule.mjs +788 -0
- package/validation/rules/PossibleFragmentSpreadsRule.d.ts +12 -0
- package/validation/rules/PossibleFragmentSpreadsRule.js +91 -0
- package/validation/rules/PossibleFragmentSpreadsRule.mjs +69 -0
- package/validation/rules/PossibleTypeExtensionsRule.d.ts +10 -0
- package/validation/rules/PossibleTypeExtensionsRule.js +167 -0
- package/validation/rules/PossibleTypeExtensionsRule.mjs +147 -0
- package/validation/rules/ProvidedRequiredArgumentsRule.d.ts +20 -0
- package/validation/rules/ProvidedRequiredArgumentsRule.js +158 -0
- package/validation/rules/ProvidedRequiredArgumentsRule.mjs +138 -0
- package/validation/rules/ScalarLeafsRule.d.ts +9 -0
- package/validation/rules/ScalarLeafsRule.js +51 -0
- package/validation/rules/ScalarLeafsRule.mjs +42 -0
- package/validation/rules/SingleFieldSubscriptionsRule.d.ts +13 -0
- package/validation/rules/SingleFieldSubscriptionsRule.js +82 -0
- package/validation/rules/SingleFieldSubscriptionsRule.mjs +73 -0
- package/validation/rules/UniqueArgumentDefinitionNamesRule.d.ts +11 -0
- package/validation/rules/UniqueArgumentDefinitionNamesRule.js +90 -0
- package/validation/rules/UniqueArgumentDefinitionNamesRule.mjs +79 -0
- package/validation/rules/UniqueArgumentNamesRule.d.ts +13 -0
- package/validation/rules/UniqueArgumentNamesRule.js +53 -0
- package/validation/rules/UniqueArgumentNamesRule.mjs +42 -0
- package/validation/rules/UniqueDirectiveNamesRule.d.ts +10 -0
- package/validation/rules/UniqueDirectiveNamesRule.js +50 -0
- package/validation/rules/UniqueDirectiveNamesRule.mjs +43 -0
- package/validation/rules/UniqueDirectivesPerLocationRule.d.ts +16 -0
- package/validation/rules/UniqueDirectivesPerLocationRule.js +93 -0
- package/validation/rules/UniqueDirectivesPerLocationRule.mjs +83 -0
- package/validation/rules/UniqueEnumValueNamesRule.d.ts +10 -0
- package/validation/rules/UniqueEnumValueNamesRule.js +71 -0
- package/validation/rules/UniqueEnumValueNamesRule.mjs +60 -0
- package/validation/rules/UniqueFieldDefinitionNamesRule.d.ts +10 -0
- package/validation/rules/UniqueFieldDefinitionNamesRule.js +83 -0
- package/validation/rules/UniqueFieldDefinitionNamesRule.mjs +75 -0
- package/validation/rules/UniqueFragmentNamesRule.d.ts +12 -0
- package/validation/rules/UniqueFragmentNamesRule.js +39 -0
- package/validation/rules/UniqueFragmentNamesRule.mjs +32 -0
- package/validation/rules/UniqueInputFieldNamesRule.d.ts +13 -0
- package/validation/rules/UniqueInputFieldNamesRule.js +52 -0
- package/validation/rules/UniqueInputFieldNamesRule.mjs +44 -0
- package/validation/rules/UniqueOperationNamesRule.d.ts +12 -0
- package/validation/rules/UniqueOperationNamesRule.js +41 -0
- package/validation/rules/UniqueOperationNamesRule.mjs +34 -0
- package/validation/rules/UniqueOperationTypesRule.d.ts +10 -0
- package/validation/rules/UniqueOperationTypesRule.js +67 -0
- package/validation/rules/UniqueOperationTypesRule.mjs +60 -0
- package/validation/rules/UniqueTypeNamesRule.d.ts +10 -0
- package/validation/rules/UniqueTypeNamesRule.js +53 -0
- package/validation/rules/UniqueTypeNamesRule.mjs +46 -0
- package/validation/rules/UniqueVariableNamesRule.d.ts +10 -0
- package/validation/rules/UniqueVariableNamesRule.js +47 -0
- package/validation/rules/UniqueVariableNamesRule.mjs +39 -0
- package/validation/rules/ValuesOfCorrectTypeRule.d.ts +13 -0
- package/validation/rules/ValuesOfCorrectTypeRule.js +183 -0
- package/validation/rules/ValuesOfCorrectTypeRule.mjs +164 -0
- package/validation/rules/VariablesAreInputTypesRule.d.ts +13 -0
- package/validation/rules/VariablesAreInputTypesRule.js +44 -0
- package/validation/rules/VariablesAreInputTypesRule.mjs +31 -0
- package/validation/rules/VariablesInAllowedPositionRule.d.ts +12 -0
- package/validation/rules/VariablesInAllowedPositionRule.js +114 -0
- package/validation/rules/VariablesInAllowedPositionRule.mjs +95 -0
- package/validation/rules/custom/NoDeprecatedCustomRule.d.ts +15 -0
- package/validation/rules/custom/NoDeprecatedCustomRule.js +121 -0
- package/validation/rules/custom/NoDeprecatedCustomRule.mjs +107 -0
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts +15 -0
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.js +39 -0
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.mjs +30 -0
- package/validation/specifiedRules.d.ts +12 -0
- package/validation/specifiedRules.js +160 -0
- package/validation/specifiedRules.mjs +123 -0
- package/validation/validate.d.ts +61 -0
- package/validation/validate.js +151 -0
- package/validation/validate.mjs +133 -0
- package/version.d.ts +13 -0
- package/version.js +25 -0
- package/version.mjs +17 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { didYouMean } from '../../jsutils/didYouMean.mjs';
|
|
2
|
+
import { naturalCompare } from '../../jsutils/naturalCompare.mjs';
|
|
3
|
+
import { suggestionList } from '../../jsutils/suggestionList.mjs';
|
|
4
|
+
import { GraphQLError } from '../../error/GraphQLError.mjs';
|
|
5
|
+
import {
|
|
6
|
+
isAbstractType,
|
|
7
|
+
isInterfaceType,
|
|
8
|
+
isObjectType,
|
|
9
|
+
} from '../../type/definition.mjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Fields on correct type
|
|
13
|
+
*
|
|
14
|
+
* A GraphQL document is only valid if all fields selected are defined by the
|
|
15
|
+
* parent type, or are an allowed meta field such as __typename.
|
|
16
|
+
*
|
|
17
|
+
* See https://spec.graphql.org/draft/#sec-Field-Selections
|
|
18
|
+
*/
|
|
19
|
+
export function FieldsOnCorrectTypeRule(context) {
|
|
20
|
+
return {
|
|
21
|
+
Field(node) {
|
|
22
|
+
const type = context.getParentType();
|
|
23
|
+
|
|
24
|
+
if (type) {
|
|
25
|
+
const fieldDef = context.getFieldDef();
|
|
26
|
+
|
|
27
|
+
if (!fieldDef) {
|
|
28
|
+
// This field doesn't exist, lets look for suggestions.
|
|
29
|
+
const schema = context.getSchema();
|
|
30
|
+
const fieldName = node.name.value; // First determine if there are any suggested types to condition on.
|
|
31
|
+
|
|
32
|
+
let suggestion = didYouMean(
|
|
33
|
+
'to use an inline fragment on',
|
|
34
|
+
getSuggestedTypeNames(schema, type, fieldName),
|
|
35
|
+
); // If there are no suggested types, then perhaps this was a typo?
|
|
36
|
+
|
|
37
|
+
if (suggestion === '') {
|
|
38
|
+
suggestion = didYouMean(getSuggestedFieldNames(type, fieldName));
|
|
39
|
+
} // Report an error, including helpful suggestions.
|
|
40
|
+
|
|
41
|
+
context.reportError(
|
|
42
|
+
new GraphQLError(
|
|
43
|
+
`Cannot query field "${fieldName}" on type "${type.name}".` +
|
|
44
|
+
suggestion,
|
|
45
|
+
node,
|
|
46
|
+
),
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Go through all of the implementations of type, as well as the interfaces that
|
|
55
|
+
* they implement. If any of those types include the provided field, suggest them,
|
|
56
|
+
* sorted by how often the type is referenced.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
function getSuggestedTypeNames(schema, type, fieldName) {
|
|
60
|
+
if (!isAbstractType(type)) {
|
|
61
|
+
// Must be an Object type, which does not have possible fields.
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const suggestedTypes = new Set();
|
|
66
|
+
const usageCount = Object.create(null);
|
|
67
|
+
|
|
68
|
+
for (const possibleType of schema.getPossibleTypes(type)) {
|
|
69
|
+
if (!possibleType.getFields()[fieldName]) {
|
|
70
|
+
continue;
|
|
71
|
+
} // This object type defines this field.
|
|
72
|
+
|
|
73
|
+
suggestedTypes.add(possibleType);
|
|
74
|
+
usageCount[possibleType.name] = 1;
|
|
75
|
+
|
|
76
|
+
for (const possibleInterface of possibleType.getInterfaces()) {
|
|
77
|
+
var _usageCount$possibleI;
|
|
78
|
+
|
|
79
|
+
if (!possibleInterface.getFields()[fieldName]) {
|
|
80
|
+
continue;
|
|
81
|
+
} // This interface type defines this field.
|
|
82
|
+
|
|
83
|
+
suggestedTypes.add(possibleInterface);
|
|
84
|
+
usageCount[possibleInterface.name] =
|
|
85
|
+
((_usageCount$possibleI = usageCount[possibleInterface.name]) !==
|
|
86
|
+
null && _usageCount$possibleI !== void 0
|
|
87
|
+
? _usageCount$possibleI
|
|
88
|
+
: 0) + 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return [...suggestedTypes]
|
|
93
|
+
.sort((typeA, typeB) => {
|
|
94
|
+
// Suggest both interface and object types based on how common they are.
|
|
95
|
+
const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];
|
|
96
|
+
|
|
97
|
+
if (usageCountDiff !== 0) {
|
|
98
|
+
return usageCountDiff;
|
|
99
|
+
} // Suggest super types first followed by subtypes
|
|
100
|
+
|
|
101
|
+
if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return naturalCompare(typeA.name, typeB.name);
|
|
110
|
+
})
|
|
111
|
+
.map((x) => x.name);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* For the field name provided, determine if there are any similar field names
|
|
115
|
+
* that may be the result of a typo.
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
function getSuggestedFieldNames(type, fieldName) {
|
|
119
|
+
if (isObjectType(type) || isInterfaceType(type)) {
|
|
120
|
+
const possibleFieldNames = Object.keys(type.getFields());
|
|
121
|
+
return suggestionList(fieldName, possibleFieldNames);
|
|
122
|
+
} // Otherwise, must be a Union type, which does not define fields.
|
|
123
|
+
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
2
|
+
import type { ValidationContext } from '../ValidationContext';
|
|
3
|
+
/**
|
|
4
|
+
* Fragments on composite type
|
|
5
|
+
*
|
|
6
|
+
* Fragments use a type condition to determine if they apply, since fragments
|
|
7
|
+
* can only be spread into a composite type (object, interface, or union), the
|
|
8
|
+
* type condition must also be a composite type.
|
|
9
|
+
*
|
|
10
|
+
* See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types
|
|
11
|
+
*/
|
|
12
|
+
export declare function FragmentsOnCompositeTypesRule(
|
|
13
|
+
context: ValidationContext,
|
|
14
|
+
): ASTVisitor;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.FragmentsOnCompositeTypesRule = FragmentsOnCompositeTypesRule;
|
|
7
|
+
|
|
8
|
+
var _GraphQLError = require('../../error/GraphQLError.js');
|
|
9
|
+
|
|
10
|
+
var _printer = require('../../language/printer.js');
|
|
11
|
+
|
|
12
|
+
var _definition = require('../../type/definition.js');
|
|
13
|
+
|
|
14
|
+
var _typeFromAST = require('../../utilities/typeFromAST.js');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Fragments on composite type
|
|
18
|
+
*
|
|
19
|
+
* Fragments use a type condition to determine if they apply, since fragments
|
|
20
|
+
* can only be spread into a composite type (object, interface, or union), the
|
|
21
|
+
* type condition must also be a composite type.
|
|
22
|
+
*
|
|
23
|
+
* See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types
|
|
24
|
+
*/
|
|
25
|
+
function FragmentsOnCompositeTypesRule(context) {
|
|
26
|
+
return {
|
|
27
|
+
InlineFragment(node) {
|
|
28
|
+
const typeCondition = node.typeCondition;
|
|
29
|
+
|
|
30
|
+
if (typeCondition) {
|
|
31
|
+
const type = (0, _typeFromAST.typeFromAST)(
|
|
32
|
+
context.getSchema(),
|
|
33
|
+
typeCondition,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
if (type && !(0, _definition.isCompositeType)(type)) {
|
|
37
|
+
const typeStr = (0, _printer.print)(typeCondition);
|
|
38
|
+
context.reportError(
|
|
39
|
+
new _GraphQLError.GraphQLError(
|
|
40
|
+
`Fragment cannot condition on non composite type "${typeStr}".`,
|
|
41
|
+
typeCondition,
|
|
42
|
+
),
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
FragmentDefinition(node) {
|
|
49
|
+
const type = (0, _typeFromAST.typeFromAST)(
|
|
50
|
+
context.getSchema(),
|
|
51
|
+
node.typeCondition,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
if (type && !(0, _definition.isCompositeType)(type)) {
|
|
55
|
+
const typeStr = (0, _printer.print)(node.typeCondition);
|
|
56
|
+
context.reportError(
|
|
57
|
+
new _GraphQLError.GraphQLError(
|
|
58
|
+
`Fragment "${node.name.value}" cannot condition on non composite type "${typeStr}".`,
|
|
59
|
+
node.typeCondition,
|
|
60
|
+
),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { GraphQLError } from '../../error/GraphQLError.mjs';
|
|
2
|
+
import { print } from '../../language/printer.mjs';
|
|
3
|
+
import { isCompositeType } from '../../type/definition.mjs';
|
|
4
|
+
import { typeFromAST } from '../../utilities/typeFromAST.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Fragments on composite type
|
|
8
|
+
*
|
|
9
|
+
* Fragments use a type condition to determine if they apply, since fragments
|
|
10
|
+
* can only be spread into a composite type (object, interface, or union), the
|
|
11
|
+
* type condition must also be a composite type.
|
|
12
|
+
*
|
|
13
|
+
* See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types
|
|
14
|
+
*/
|
|
15
|
+
export function FragmentsOnCompositeTypesRule(context) {
|
|
16
|
+
return {
|
|
17
|
+
InlineFragment(node) {
|
|
18
|
+
const typeCondition = node.typeCondition;
|
|
19
|
+
|
|
20
|
+
if (typeCondition) {
|
|
21
|
+
const type = typeFromAST(context.getSchema(), typeCondition);
|
|
22
|
+
|
|
23
|
+
if (type && !isCompositeType(type)) {
|
|
24
|
+
const typeStr = print(typeCondition);
|
|
25
|
+
context.reportError(
|
|
26
|
+
new GraphQLError(
|
|
27
|
+
`Fragment cannot condition on non composite type "${typeStr}".`,
|
|
28
|
+
typeCondition,
|
|
29
|
+
),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
FragmentDefinition(node) {
|
|
36
|
+
const type = typeFromAST(context.getSchema(), node.typeCondition);
|
|
37
|
+
|
|
38
|
+
if (type && !isCompositeType(type)) {
|
|
39
|
+
const typeStr = print(node.typeCondition);
|
|
40
|
+
context.reportError(
|
|
41
|
+
new GraphQLError(
|
|
42
|
+
`Fragment "${node.name.value}" cannot condition on non composite type "${typeStr}".`,
|
|
43
|
+
node.typeCondition,
|
|
44
|
+
),
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
2
|
+
import type {
|
|
3
|
+
SDLValidationContext,
|
|
4
|
+
ValidationContext,
|
|
5
|
+
} from '../ValidationContext';
|
|
6
|
+
/**
|
|
7
|
+
* Known argument names
|
|
8
|
+
*
|
|
9
|
+
* A GraphQL field is only valid if all supplied arguments are defined by
|
|
10
|
+
* that field.
|
|
11
|
+
*
|
|
12
|
+
* See https://spec.graphql.org/draft/#sec-Argument-Names
|
|
13
|
+
* See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations
|
|
14
|
+
*/
|
|
15
|
+
export declare function KnownArgumentNamesRule(
|
|
16
|
+
context: ValidationContext,
|
|
17
|
+
): ASTVisitor;
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export declare function KnownArgumentNamesOnDirectivesRule(
|
|
22
|
+
context: ValidationContext | SDLValidationContext,
|
|
23
|
+
): ASTVisitor;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.KnownArgumentNamesOnDirectivesRule = KnownArgumentNamesOnDirectivesRule;
|
|
7
|
+
exports.KnownArgumentNamesRule = KnownArgumentNamesRule;
|
|
8
|
+
|
|
9
|
+
var _didYouMean = require('../../jsutils/didYouMean.js');
|
|
10
|
+
|
|
11
|
+
var _suggestionList = require('../../jsutils/suggestionList.js');
|
|
12
|
+
|
|
13
|
+
var _GraphQLError = require('../../error/GraphQLError.js');
|
|
14
|
+
|
|
15
|
+
var _kinds = require('../../language/kinds.js');
|
|
16
|
+
|
|
17
|
+
var _directives = require('../../type/directives.js');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Known argument names
|
|
21
|
+
*
|
|
22
|
+
* A GraphQL field is only valid if all supplied arguments are defined by
|
|
23
|
+
* that field.
|
|
24
|
+
*
|
|
25
|
+
* See https://spec.graphql.org/draft/#sec-Argument-Names
|
|
26
|
+
* See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations
|
|
27
|
+
*/
|
|
28
|
+
function KnownArgumentNamesRule(context) {
|
|
29
|
+
return {
|
|
30
|
+
// eslint-disable-next-line new-cap
|
|
31
|
+
...KnownArgumentNamesOnDirectivesRule(context),
|
|
32
|
+
|
|
33
|
+
Argument(argNode) {
|
|
34
|
+
const argDef = context.getArgument();
|
|
35
|
+
const fieldDef = context.getFieldDef();
|
|
36
|
+
const parentType = context.getParentType();
|
|
37
|
+
|
|
38
|
+
if (!argDef && fieldDef && parentType) {
|
|
39
|
+
const argName = argNode.name.value;
|
|
40
|
+
const knownArgsNames = fieldDef.args.map((arg) => arg.name);
|
|
41
|
+
const suggestions = (0, _suggestionList.suggestionList)(
|
|
42
|
+
argName,
|
|
43
|
+
knownArgsNames,
|
|
44
|
+
);
|
|
45
|
+
context.reportError(
|
|
46
|
+
new _GraphQLError.GraphQLError(
|
|
47
|
+
`Unknown argument "${argName}" on field "${parentType.name}.${fieldDef.name}".` +
|
|
48
|
+
(0, _didYouMean.didYouMean)(suggestions),
|
|
49
|
+
argNode,
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
function KnownArgumentNamesOnDirectivesRule(context) {
|
|
61
|
+
const directiveArgs = Object.create(null);
|
|
62
|
+
const schema = context.getSchema();
|
|
63
|
+
const definedDirectives = schema
|
|
64
|
+
? schema.getDirectives()
|
|
65
|
+
: _directives.specifiedDirectives;
|
|
66
|
+
|
|
67
|
+
for (const directive of definedDirectives) {
|
|
68
|
+
directiveArgs[directive.name] = directive.args.map((arg) => arg.name);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const astDefinitions = context.getDocument().definitions;
|
|
72
|
+
|
|
73
|
+
for (const def of astDefinitions) {
|
|
74
|
+
if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
|
|
75
|
+
var _def$arguments;
|
|
76
|
+
|
|
77
|
+
// FIXME: https://github.com/graphql/graphql-js/issues/2203
|
|
78
|
+
|
|
79
|
+
/* c8 ignore next */
|
|
80
|
+
const argsNodes =
|
|
81
|
+
(_def$arguments = def.arguments) !== null && _def$arguments !== void 0
|
|
82
|
+
? _def$arguments
|
|
83
|
+
: [];
|
|
84
|
+
directiveArgs[def.name.value] = argsNodes.map((arg) => arg.name.value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
Directive(directiveNode) {
|
|
90
|
+
const directiveName = directiveNode.name.value;
|
|
91
|
+
const knownArgs = directiveArgs[directiveName];
|
|
92
|
+
|
|
93
|
+
if (directiveNode.arguments && knownArgs) {
|
|
94
|
+
for (const argNode of directiveNode.arguments) {
|
|
95
|
+
const argName = argNode.name.value;
|
|
96
|
+
|
|
97
|
+
if (!knownArgs.includes(argName)) {
|
|
98
|
+
const suggestions = (0, _suggestionList.suggestionList)(
|
|
99
|
+
argName,
|
|
100
|
+
knownArgs,
|
|
101
|
+
);
|
|
102
|
+
context.reportError(
|
|
103
|
+
new _GraphQLError.GraphQLError(
|
|
104
|
+
`Unknown argument "${argName}" on directive "@${directiveName}".` +
|
|
105
|
+
(0, _didYouMean.didYouMean)(suggestions),
|
|
106
|
+
argNode,
|
|
107
|
+
),
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return false;
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { didYouMean } from '../../jsutils/didYouMean.mjs';
|
|
2
|
+
import { suggestionList } from '../../jsutils/suggestionList.mjs';
|
|
3
|
+
import { GraphQLError } from '../../error/GraphQLError.mjs';
|
|
4
|
+
import { Kind } from '../../language/kinds.mjs';
|
|
5
|
+
import { specifiedDirectives } from '../../type/directives.mjs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Known argument names
|
|
9
|
+
*
|
|
10
|
+
* A GraphQL field is only valid if all supplied arguments are defined by
|
|
11
|
+
* that field.
|
|
12
|
+
*
|
|
13
|
+
* See https://spec.graphql.org/draft/#sec-Argument-Names
|
|
14
|
+
* See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations
|
|
15
|
+
*/
|
|
16
|
+
export function KnownArgumentNamesRule(context) {
|
|
17
|
+
return {
|
|
18
|
+
// eslint-disable-next-line new-cap
|
|
19
|
+
...KnownArgumentNamesOnDirectivesRule(context),
|
|
20
|
+
|
|
21
|
+
Argument(argNode) {
|
|
22
|
+
const argDef = context.getArgument();
|
|
23
|
+
const fieldDef = context.getFieldDef();
|
|
24
|
+
const parentType = context.getParentType();
|
|
25
|
+
|
|
26
|
+
if (!argDef && fieldDef && parentType) {
|
|
27
|
+
const argName = argNode.name.value;
|
|
28
|
+
const knownArgsNames = fieldDef.args.map((arg) => arg.name);
|
|
29
|
+
const suggestions = suggestionList(argName, knownArgsNames);
|
|
30
|
+
context.reportError(
|
|
31
|
+
new GraphQLError(
|
|
32
|
+
`Unknown argument "${argName}" on field "${parentType.name}.${fieldDef.name}".` +
|
|
33
|
+
didYouMean(suggestions),
|
|
34
|
+
argNode,
|
|
35
|
+
),
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
export function KnownArgumentNamesOnDirectivesRule(context) {
|
|
46
|
+
const directiveArgs = Object.create(null);
|
|
47
|
+
const schema = context.getSchema();
|
|
48
|
+
const definedDirectives = schema
|
|
49
|
+
? schema.getDirectives()
|
|
50
|
+
: specifiedDirectives;
|
|
51
|
+
|
|
52
|
+
for (const directive of definedDirectives) {
|
|
53
|
+
directiveArgs[directive.name] = directive.args.map((arg) => arg.name);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const astDefinitions = context.getDocument().definitions;
|
|
57
|
+
|
|
58
|
+
for (const def of astDefinitions) {
|
|
59
|
+
if (def.kind === Kind.DIRECTIVE_DEFINITION) {
|
|
60
|
+
var _def$arguments;
|
|
61
|
+
|
|
62
|
+
// FIXME: https://github.com/graphql/graphql-js/issues/2203
|
|
63
|
+
|
|
64
|
+
/* c8 ignore next */
|
|
65
|
+
const argsNodes =
|
|
66
|
+
(_def$arguments = def.arguments) !== null && _def$arguments !== void 0
|
|
67
|
+
? _def$arguments
|
|
68
|
+
: [];
|
|
69
|
+
directiveArgs[def.name.value] = argsNodes.map((arg) => arg.name.value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
Directive(directiveNode) {
|
|
75
|
+
const directiveName = directiveNode.name.value;
|
|
76
|
+
const knownArgs = directiveArgs[directiveName];
|
|
77
|
+
|
|
78
|
+
if (directiveNode.arguments && knownArgs) {
|
|
79
|
+
for (const argNode of directiveNode.arguments) {
|
|
80
|
+
const argName = argNode.name.value;
|
|
81
|
+
|
|
82
|
+
if (!knownArgs.includes(argName)) {
|
|
83
|
+
const suggestions = suggestionList(argName, knownArgs);
|
|
84
|
+
context.reportError(
|
|
85
|
+
new GraphQLError(
|
|
86
|
+
`Unknown argument "${argName}" on directive "@${directiveName}".` +
|
|
87
|
+
didYouMean(suggestions),
|
|
88
|
+
argNode,
|
|
89
|
+
),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return false;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
2
|
+
import type {
|
|
3
|
+
SDLValidationContext,
|
|
4
|
+
ValidationContext,
|
|
5
|
+
} from '../ValidationContext';
|
|
6
|
+
/**
|
|
7
|
+
* Known directives
|
|
8
|
+
*
|
|
9
|
+
* A GraphQL document is only valid if all `@directives` are known by the
|
|
10
|
+
* schema and legally positioned.
|
|
11
|
+
*
|
|
12
|
+
* See https://spec.graphql.org/draft/#sec-Directives-Are-Defined
|
|
13
|
+
*/
|
|
14
|
+
export declare function KnownDirectivesRule(
|
|
15
|
+
context: ValidationContext | SDLValidationContext,
|
|
16
|
+
): ASTVisitor;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.KnownDirectivesRule = KnownDirectivesRule;
|
|
7
|
+
|
|
8
|
+
var _inspect = require('../../jsutils/inspect.js');
|
|
9
|
+
|
|
10
|
+
var _invariant = require('../../jsutils/invariant.js');
|
|
11
|
+
|
|
12
|
+
var _GraphQLError = require('../../error/GraphQLError.js');
|
|
13
|
+
|
|
14
|
+
var _ast = require('../../language/ast.js');
|
|
15
|
+
|
|
16
|
+
var _directiveLocation = require('../../language/directiveLocation.js');
|
|
17
|
+
|
|
18
|
+
var _kinds = require('../../language/kinds.js');
|
|
19
|
+
|
|
20
|
+
var _directives = require('../../type/directives.js');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Known directives
|
|
24
|
+
*
|
|
25
|
+
* A GraphQL document is only valid if all `@directives` are known by the
|
|
26
|
+
* schema and legally positioned.
|
|
27
|
+
*
|
|
28
|
+
* See https://spec.graphql.org/draft/#sec-Directives-Are-Defined
|
|
29
|
+
*/
|
|
30
|
+
function KnownDirectivesRule(context) {
|
|
31
|
+
const locationsMap = Object.create(null);
|
|
32
|
+
const schema = context.getSchema();
|
|
33
|
+
const definedDirectives = schema
|
|
34
|
+
? schema.getDirectives()
|
|
35
|
+
: _directives.specifiedDirectives;
|
|
36
|
+
|
|
37
|
+
for (const directive of definedDirectives) {
|
|
38
|
+
locationsMap[directive.name] = directive.locations;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const astDefinitions = context.getDocument().definitions;
|
|
42
|
+
|
|
43
|
+
for (const def of astDefinitions) {
|
|
44
|
+
if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
|
|
45
|
+
locationsMap[def.name.value] = def.locations.map((name) => name.value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
Directive(node, _key, _parent, _path, ancestors) {
|
|
51
|
+
const name = node.name.value;
|
|
52
|
+
const locations = locationsMap[name];
|
|
53
|
+
|
|
54
|
+
if (!locations) {
|
|
55
|
+
context.reportError(
|
|
56
|
+
new _GraphQLError.GraphQLError(`Unknown directive "@${name}".`, node),
|
|
57
|
+
);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const candidateLocation = getDirectiveLocationForASTPath(ancestors);
|
|
62
|
+
|
|
63
|
+
if (candidateLocation && !locations.includes(candidateLocation)) {
|
|
64
|
+
context.reportError(
|
|
65
|
+
new _GraphQLError.GraphQLError(
|
|
66
|
+
`Directive "@${name}" may not be used on ${candidateLocation}.`,
|
|
67
|
+
node,
|
|
68
|
+
),
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function getDirectiveLocationForASTPath(ancestors) {
|
|
76
|
+
const appliedTo = ancestors[ancestors.length - 1];
|
|
77
|
+
'kind' in appliedTo || (0, _invariant.invariant)(false);
|
|
78
|
+
|
|
79
|
+
switch (appliedTo.kind) {
|
|
80
|
+
case _kinds.Kind.OPERATION_DEFINITION:
|
|
81
|
+
return getDirectiveLocationForOperation(appliedTo.operation);
|
|
82
|
+
|
|
83
|
+
case _kinds.Kind.FIELD:
|
|
84
|
+
return _directiveLocation.DirectiveLocation.FIELD;
|
|
85
|
+
|
|
86
|
+
case _kinds.Kind.FRAGMENT_SPREAD:
|
|
87
|
+
return _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD;
|
|
88
|
+
|
|
89
|
+
case _kinds.Kind.INLINE_FRAGMENT:
|
|
90
|
+
return _directiveLocation.DirectiveLocation.INLINE_FRAGMENT;
|
|
91
|
+
|
|
92
|
+
case _kinds.Kind.FRAGMENT_DEFINITION:
|
|
93
|
+
return _directiveLocation.DirectiveLocation.FRAGMENT_DEFINITION;
|
|
94
|
+
|
|
95
|
+
case _kinds.Kind.VARIABLE_DEFINITION:
|
|
96
|
+
return _directiveLocation.DirectiveLocation.VARIABLE_DEFINITION;
|
|
97
|
+
|
|
98
|
+
case _kinds.Kind.SCHEMA_DEFINITION:
|
|
99
|
+
case _kinds.Kind.SCHEMA_EXTENSION:
|
|
100
|
+
return _directiveLocation.DirectiveLocation.SCHEMA;
|
|
101
|
+
|
|
102
|
+
case _kinds.Kind.SCALAR_TYPE_DEFINITION:
|
|
103
|
+
case _kinds.Kind.SCALAR_TYPE_EXTENSION:
|
|
104
|
+
return _directiveLocation.DirectiveLocation.SCALAR;
|
|
105
|
+
|
|
106
|
+
case _kinds.Kind.OBJECT_TYPE_DEFINITION:
|
|
107
|
+
case _kinds.Kind.OBJECT_TYPE_EXTENSION:
|
|
108
|
+
return _directiveLocation.DirectiveLocation.OBJECT;
|
|
109
|
+
|
|
110
|
+
case _kinds.Kind.FIELD_DEFINITION:
|
|
111
|
+
return _directiveLocation.DirectiveLocation.FIELD_DEFINITION;
|
|
112
|
+
|
|
113
|
+
case _kinds.Kind.INTERFACE_TYPE_DEFINITION:
|
|
114
|
+
case _kinds.Kind.INTERFACE_TYPE_EXTENSION:
|
|
115
|
+
return _directiveLocation.DirectiveLocation.INTERFACE;
|
|
116
|
+
|
|
117
|
+
case _kinds.Kind.UNION_TYPE_DEFINITION:
|
|
118
|
+
case _kinds.Kind.UNION_TYPE_EXTENSION:
|
|
119
|
+
return _directiveLocation.DirectiveLocation.UNION;
|
|
120
|
+
|
|
121
|
+
case _kinds.Kind.ENUM_TYPE_DEFINITION:
|
|
122
|
+
case _kinds.Kind.ENUM_TYPE_EXTENSION:
|
|
123
|
+
return _directiveLocation.DirectiveLocation.ENUM;
|
|
124
|
+
|
|
125
|
+
case _kinds.Kind.ENUM_VALUE_DEFINITION:
|
|
126
|
+
return _directiveLocation.DirectiveLocation.ENUM_VALUE;
|
|
127
|
+
|
|
128
|
+
case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION:
|
|
129
|
+
case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION:
|
|
130
|
+
return _directiveLocation.DirectiveLocation.INPUT_OBJECT;
|
|
131
|
+
|
|
132
|
+
case _kinds.Kind.INPUT_VALUE_DEFINITION: {
|
|
133
|
+
const parentNode = ancestors[ancestors.length - 3];
|
|
134
|
+
'kind' in parentNode || (0, _invariant.invariant)(false);
|
|
135
|
+
return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION
|
|
136
|
+
? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION
|
|
137
|
+
: _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION;
|
|
138
|
+
}
|
|
139
|
+
// Not reachable, all possible types have been considered.
|
|
140
|
+
|
|
141
|
+
/* c8 ignore next */
|
|
142
|
+
|
|
143
|
+
default:
|
|
144
|
+
false ||
|
|
145
|
+
(0, _invariant.invariant)(
|
|
146
|
+
false,
|
|
147
|
+
'Unexpected kind: ' + (0, _inspect.inspect)(appliedTo.kind),
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function getDirectiveLocationForOperation(operation) {
|
|
153
|
+
switch (operation) {
|
|
154
|
+
case _ast.OperationTypeNode.QUERY:
|
|
155
|
+
return _directiveLocation.DirectiveLocation.QUERY;
|
|
156
|
+
|
|
157
|
+
case _ast.OperationTypeNode.MUTATION:
|
|
158
|
+
return _directiveLocation.DirectiveLocation.MUTATION;
|
|
159
|
+
|
|
160
|
+
case _ast.OperationTypeNode.SUBSCRIPTION:
|
|
161
|
+
return _directiveLocation.DirectiveLocation.SUBSCRIPTION;
|
|
162
|
+
}
|
|
163
|
+
}
|