graphql 17.0.0-rc.0 → 17.0.0
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/README.md +3 -5
- package/diagnostics.d.mts +67 -38
- package/diagnostics.d.ts +67 -38
- package/diagnostics.js.map +1 -1
- package/diagnostics.mjs.map +1 -1
- package/error/locatedError.d.mts +1 -3
- package/error/locatedError.d.ts +1 -3
- package/error/locatedError.js.map +1 -1
- package/error/locatedError.mjs.map +1 -1
- package/execution/Executor.d.mts +2 -2
- package/execution/Executor.d.ts +2 -2
- package/execution/Executor.js.map +1 -1
- package/execution/Executor.mjs.map +1 -1
- package/execution/execute.d.mts +65 -44
- package/execution/execute.d.ts +65 -44
- package/execution/execute.js +11 -2
- package/execution/execute.js.map +1 -1
- package/execution/execute.mjs +11 -2
- package/execution/execute.mjs.map +1 -1
- package/execution/values.d.mts +17 -17
- package/execution/values.d.ts +17 -17
- package/execution/values.js.map +1 -1
- package/execution/values.mjs.map +1 -1
- package/language/parser.d.mts +20 -30
- package/language/parser.d.ts +20 -30
- package/language/parser.js +3 -9
- package/language/parser.js.map +1 -1
- package/language/parser.mjs +3 -9
- package/language/parser.mjs.map +1 -1
- package/language/predicates.d.mts +5 -1
- package/language/predicates.d.ts +5 -1
- package/language/predicates.js.map +1 -1
- package/language/predicates.mjs.map +1 -1
- package/language/source.d.mts +4 -5
- package/language/source.d.ts +4 -5
- package/language/source.js.map +1 -1
- package/language/source.mjs.map +1 -1
- package/language/visitor.d.mts +10 -2
- package/language/visitor.d.ts +10 -2
- package/language/visitor.js.map +1 -1
- package/language/visitor.mjs.map +1 -1
- package/package.json +2 -2
- package/type/definition.d.mts +96 -64
- package/type/definition.d.ts +96 -64
- package/type/definition.js.map +1 -1
- package/type/definition.mjs.map +1 -1
- package/type/directives.d.mts +3 -3
- package/type/directives.d.ts +3 -3
- package/type/directives.js.map +1 -1
- package/type/directives.mjs.map +1 -1
- package/type/schema.d.mts +4 -8
- package/type/schema.d.ts +4 -8
- package/type/schema.js.map +1 -1
- package/type/schema.mjs.map +1 -1
- package/type/validate.js +101 -30
- package/type/validate.js.map +1 -1
- package/type/validate.mjs +101 -30
- package/type/validate.mjs.map +1 -1
- package/utilities/TypeInfo.d.mts +1 -1
- package/utilities/TypeInfo.d.ts +1 -1
- package/utilities/TypeInfo.js.map +1 -1
- package/utilities/TypeInfo.mjs.map +1 -1
- package/utilities/buildASTSchema.d.mts +0 -1
- package/utilities/buildASTSchema.d.ts +0 -1
- package/utilities/buildASTSchema.js +0 -1
- package/utilities/buildASTSchema.js.map +1 -1
- package/utilities/buildASTSchema.mjs +0 -1
- package/utilities/buildASTSchema.mjs.map +1 -1
- package/utilities/buildClientSchema.d.mts +5 -1
- package/utilities/buildClientSchema.d.ts +5 -1
- package/utilities/buildClientSchema.js.map +1 -1
- package/utilities/buildClientSchema.mjs.map +1 -1
- package/utilities/coerceInputValue.d.mts +7 -6
- package/utilities/coerceInputValue.d.ts +7 -6
- package/utilities/coerceInputValue.js.map +1 -1
- package/utilities/coerceInputValue.mjs.map +1 -1
- package/utilities/concatAST.d.mts +4 -1
- package/utilities/concatAST.d.ts +4 -1
- package/utilities/concatAST.js.map +1 -1
- package/utilities/concatAST.mjs.map +1 -1
- package/utilities/extendSchema.d.mts +3 -3
- package/utilities/extendSchema.d.ts +3 -3
- package/utilities/extendSchema.js +5 -1
- package/utilities/extendSchema.js.map +1 -1
- package/utilities/extendSchema.mjs +5 -1
- package/utilities/extendSchema.mjs.map +1 -1
- package/utilities/introspectionFromSchema.d.mts +6 -2
- package/utilities/introspectionFromSchema.d.ts +6 -2
- package/utilities/introspectionFromSchema.js.map +1 -1
- package/utilities/introspectionFromSchema.mjs.map +1 -1
- package/utilities/lexicographicSortSchema.d.mts +5 -1
- package/utilities/lexicographicSortSchema.d.ts +5 -1
- package/utilities/lexicographicSortSchema.js.map +1 -1
- package/utilities/lexicographicSortSchema.mjs.map +1 -1
- package/utilities/printSchema.d.mts +5 -1
- package/utilities/printSchema.d.ts +5 -1
- package/utilities/printSchema.js.map +1 -1
- package/utilities/printSchema.mjs.map +1 -1
- package/utilities/replaceVariables.d.mts +4 -8
- package/utilities/replaceVariables.d.ts +4 -8
- package/utilities/replaceVariables.js.map +1 -1
- package/utilities/replaceVariables.mjs.map +1 -1
- package/utilities/stripIgnoredCharacters.d.mts +2 -2
- package/utilities/stripIgnoredCharacters.d.ts +2 -2
- package/utilities/stripIgnoredCharacters.js.map +1 -1
- package/utilities/stripIgnoredCharacters.mjs.map +1 -1
- package/utilities/typeComparators.d.mts +1 -5
- package/utilities/typeComparators.d.ts +1 -5
- package/utilities/typeComparators.js.map +1 -1
- package/utilities/typeComparators.mjs.map +1 -1
- package/utilities/validateInputValue.d.mts +10 -8
- package/utilities/validateInputValue.d.ts +10 -8
- package/utilities/validateInputValue.js.map +1 -1
- package/utilities/validateInputValue.mjs.map +1 -1
- package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.mts +4 -1
- package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.ts +4 -1
- package/validation/rules/DeferStreamDirectiveOnRootFieldRule.js.map +1 -1
- package/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs.map +1 -1
- package/validation/rules/ExecutableDefinitionsRule.d.mts +6 -2
- package/validation/rules/ExecutableDefinitionsRule.d.ts +6 -2
- package/validation/rules/ExecutableDefinitionsRule.js.map +1 -1
- package/validation/rules/ExecutableDefinitionsRule.mjs.map +1 -1
- package/validation/rules/FieldsOnCorrectTypeRule.d.mts +3 -1
- package/validation/rules/FieldsOnCorrectTypeRule.d.ts +3 -1
- package/validation/rules/FieldsOnCorrectTypeRule.js.map +1 -1
- package/validation/rules/FieldsOnCorrectTypeRule.mjs.map +1 -1
- package/validation/rules/FragmentsOnCompositeTypesRule.d.mts +6 -2
- package/validation/rules/FragmentsOnCompositeTypesRule.d.ts +6 -2
- package/validation/rules/FragmentsOnCompositeTypesRule.js.map +1 -1
- package/validation/rules/FragmentsOnCompositeTypesRule.mjs.map +1 -1
- package/validation/rules/KnownArgumentNamesRule.d.mts +3 -1
- package/validation/rules/KnownArgumentNamesRule.d.ts +3 -1
- package/validation/rules/KnownArgumentNamesRule.js.map +1 -1
- package/validation/rules/KnownArgumentNamesRule.mjs.map +1 -1
- package/validation/rules/KnownDirectivesRule.js +2 -1
- package/validation/rules/KnownDirectivesRule.js.map +1 -1
- package/validation/rules/KnownDirectivesRule.mjs +2 -1
- package/validation/rules/KnownDirectivesRule.mjs.map +1 -1
- package/validation/rules/KnownFragmentNamesRule.d.mts +3 -1
- package/validation/rules/KnownFragmentNamesRule.d.ts +3 -1
- package/validation/rules/KnownFragmentNamesRule.js.map +1 -1
- package/validation/rules/KnownFragmentNamesRule.mjs.map +1 -1
- package/validation/rules/LoneAnonymousOperationRule.d.mts +6 -2
- package/validation/rules/LoneAnonymousOperationRule.d.ts +6 -2
- package/validation/rules/LoneAnonymousOperationRule.js.map +1 -1
- package/validation/rules/LoneAnonymousOperationRule.mjs.map +1 -1
- package/validation/rules/MaxIntrospectionDepthRule.d.mts +6 -2
- package/validation/rules/MaxIntrospectionDepthRule.d.ts +6 -2
- package/validation/rules/MaxIntrospectionDepthRule.js.map +1 -1
- package/validation/rules/MaxIntrospectionDepthRule.mjs.map +1 -1
- package/validation/rules/NoUndefinedVariablesRule.d.mts +3 -1
- package/validation/rules/NoUndefinedVariablesRule.d.ts +3 -1
- package/validation/rules/NoUndefinedVariablesRule.js.map +1 -1
- package/validation/rules/NoUndefinedVariablesRule.mjs.map +1 -1
- package/validation/rules/NoUnusedFragmentsRule.d.mts +3 -1
- package/validation/rules/NoUnusedFragmentsRule.d.ts +3 -1
- package/validation/rules/NoUnusedFragmentsRule.js.map +1 -1
- package/validation/rules/NoUnusedFragmentsRule.mjs.map +1 -1
- package/validation/rules/NoUnusedVariablesRule.d.mts +3 -1
- package/validation/rules/NoUnusedVariablesRule.d.ts +3 -1
- package/validation/rules/NoUnusedVariablesRule.js.map +1 -1
- package/validation/rules/NoUnusedVariablesRule.mjs.map +1 -1
- package/validation/rules/OverlappingFieldsCanBeMergedRule.d.mts +6 -2
- package/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts +6 -2
- package/validation/rules/OverlappingFieldsCanBeMergedRule.js.map +1 -1
- package/validation/rules/OverlappingFieldsCanBeMergedRule.mjs.map +1 -1
- package/validation/rules/PossibleFragmentSpreadsRule.d.mts +6 -2
- package/validation/rules/PossibleFragmentSpreadsRule.d.ts +6 -2
- package/validation/rules/PossibleFragmentSpreadsRule.js.map +1 -1
- package/validation/rules/PossibleFragmentSpreadsRule.mjs.map +1 -1
- package/validation/rules/ProvidedRequiredArgumentsRule.d.mts +6 -2
- package/validation/rules/ProvidedRequiredArgumentsRule.d.ts +6 -2
- package/validation/rules/ProvidedRequiredArgumentsRule.js.map +1 -1
- package/validation/rules/ProvidedRequiredArgumentsRule.mjs.map +1 -1
- package/validation/rules/SingleFieldSubscriptionsRule.d.mts +6 -2
- package/validation/rules/SingleFieldSubscriptionsRule.d.ts +6 -2
- package/validation/rules/SingleFieldSubscriptionsRule.js.map +1 -1
- package/validation/rules/SingleFieldSubscriptionsRule.mjs.map +1 -1
- package/validation/rules/UniqueArgumentNamesRule.d.mts +3 -1
- package/validation/rules/UniqueArgumentNamesRule.d.ts +3 -1
- package/validation/rules/UniqueArgumentNamesRule.js.map +1 -1
- package/validation/rules/UniqueArgumentNamesRule.mjs.map +1 -1
- package/validation/rules/UniqueDirectivesPerLocationRule.d.mts +6 -2
- package/validation/rules/UniqueDirectivesPerLocationRule.d.ts +6 -2
- package/validation/rules/UniqueDirectivesPerLocationRule.js.map +1 -1
- package/validation/rules/UniqueDirectivesPerLocationRule.mjs.map +1 -1
- package/validation/rules/UniqueFragmentNamesRule.d.mts +3 -1
- package/validation/rules/UniqueFragmentNamesRule.d.ts +3 -1
- package/validation/rules/UniqueFragmentNamesRule.js.map +1 -1
- package/validation/rules/UniqueFragmentNamesRule.mjs.map +1 -1
- package/validation/rules/UniqueInputFieldNamesRule.d.mts +6 -2
- package/validation/rules/UniqueInputFieldNamesRule.d.ts +6 -2
- package/validation/rules/UniqueInputFieldNamesRule.js.map +1 -1
- package/validation/rules/UniqueInputFieldNamesRule.mjs.map +1 -1
- package/validation/rules/UniqueOperationNamesRule.d.mts +3 -1
- package/validation/rules/UniqueOperationNamesRule.d.ts +3 -1
- package/validation/rules/UniqueOperationNamesRule.js.map +1 -1
- package/validation/rules/UniqueOperationNamesRule.mjs.map +1 -1
- package/validation/rules/UniqueVariableNamesRule.d.mts +3 -1
- package/validation/rules/UniqueVariableNamesRule.d.ts +3 -1
- package/validation/rules/UniqueVariableNamesRule.js.map +1 -1
- package/validation/rules/UniqueVariableNamesRule.mjs.map +1 -1
- package/validation/rules/ValuesOfCorrectTypeRule.d.mts +3 -1
- package/validation/rules/ValuesOfCorrectTypeRule.d.ts +3 -1
- package/validation/rules/ValuesOfCorrectTypeRule.js.map +1 -1
- package/validation/rules/ValuesOfCorrectTypeRule.mjs.map +1 -1
- package/validation/rules/VariablesAreInputTypesRule.d.mts +6 -2
- package/validation/rules/VariablesAreInputTypesRule.d.ts +6 -2
- package/validation/rules/VariablesAreInputTypesRule.js.map +1 -1
- package/validation/rules/VariablesAreInputTypesRule.mjs.map +1 -1
- package/validation/rules/VariablesInAllowedPositionRule.d.mts +6 -2
- package/validation/rules/VariablesInAllowedPositionRule.d.ts +6 -2
- package/validation/rules/VariablesInAllowedPositionRule.js.map +1 -1
- package/validation/rules/VariablesInAllowedPositionRule.mjs.map +1 -1
- package/validation/rules/custom/NoDeprecatedCustomRule.d.mts +3 -1
- package/validation/rules/custom/NoDeprecatedCustomRule.d.ts +3 -1
- package/validation/rules/custom/NoDeprecatedCustomRule.js.map +1 -1
- package/validation/rules/custom/NoDeprecatedCustomRule.mjs.map +1 -1
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.mts +6 -2
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts +6 -2
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.js.map +1 -1
- package/validation/rules/custom/NoSchemaIntrospectionCustomRule.mjs.map +1 -1
- package/validation/validate.d.mts +3 -6
- package/validation/validate.d.ts +3 -6
- package/validation/validate.js.map +1 -1
- package/validation/validate.mjs.map +1 -1
- package/version.js +2 -2
- package/version.js.map +1 -1
- package/version.mjs +2 -2
- package/version.mjs.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateInputValue.js","sourceRoot":"","sources":["../../src/utilities/validateInputValue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,kCAAiC;AACtD,OAAO,EAAE,OAAO,EAAE,+BAA8B;AAChD,OAAO,EAAE,gBAAgB,EAAE,wCAAuC;AAClE,OAAO,EAAE,YAAY,EAAE,oCAAmC;AAC1D,OAAO,EAAE,MAAM,EAAE,8BAA6B;AAG9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA2B;AAC1D,OAAO,EAAE,cAAc,EAAE,sCAAqC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,wCAAuC;AACpE,OAAO,EAAE,YAAY,EAAE,kCAAiC;AAGxD,OAAO,EAAE,IAAI,EAAE,8BAA6B;AAC5C,OAAO,EAAE,KAAK,EAAE,gCAA+B;AAG/C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,oBAAoB,GACrB,+BAA8B;AAK/B,OAAO,EAAE,gBAAgB,EAAE,+BAA8B;AA4DzD,MAAM,UAAU,kBAAkB,CAChC,UAAmB,EACnB,IAAsB,EACtB,OAA4E,EAC5E,eAAgC;IAEhC,OAAO,sBAAsB,CAC3B,UAAU,EACV,IAAI,EACJ,OAAO,EACP,eAAe,EACf,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAmB,EACnB,IAAsB,EACtB,OAA4E,EAC5E,eAA+B,EAC/B,IAAsB;IAEtB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,kBAAkB,CAChB,OAAO,EACP,sCAAsC,IAAI,mBAAmB,EAC7D,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,kBAAkB,CAChB,OAAO,EACP,oCAAoC,IAAI,mBAAmB,EAC3D,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,sBAAsB,CAC3B,UAAU,EACV,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YAElC,sBAAsB,CACpB,UAAU,EACV,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,sBAAsB,CACpB,SAAS,EACT,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,6BAA6B,OAAO,CACjE,UAAU,CACX,GAAG,EACJ,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,gCAC7B,KAAK,CAAC,IACR,aAAa,OAAO,CAAC,UAAU,CAAC,GAAG,EACnC,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CACpB,UAAU,EACV,KAAK,CAAC,IAAI,EACV,OAAO,EACP,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,eAAe;oBAChC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClE,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,mCAAmC,SAAS,IACzE,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,SACxC,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAC3B,IAAI,CACL,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,kBAAkB,CAChB,OAAO,EACP,+BAA+B,CAAC,IAAI,CAAC,EACrC,IAAI,CACL,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,kBAAkB,CAChB,OAAO,EACP,+BAA+B,CAAC,IAAI,CAAC,EACrC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAChC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC;QACX,IAAI,WAAoB,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,IAC7B,WAAW,IAAI,IAAI;gBACjB,CAAC,CAAC,4BAA4B,qBAAqB,CAAC,WAAW,CAAC,UAAU;gBAC1E,CAAC,CAAC,SACN,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAC3B,IAAI,EACJ,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA4E,EAC5E,OAAe,EACf,IAAsB,EACtB,aAA4B;IAE5B,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3E,CAAC;AA8ED,MAAM,UAAU,oBAAoB,CAClC,SAAoB,EACpB,IAAsB,EACtB,OAA4E,EAC5E,SAAiC,EACjC,sBAAsD,EACtD,eAAgC;IAEhC,MAAM,OAAO,GAAsB;QACjC,MAAM,EAAE,CAAC,SAAS,IAAI,CAAC,sBAAsB;QAC7C,OAAO;QACP,SAAS;QACT,sBAAsB;KACvB,CAAC;IACF,OAAO,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,IAAI,EACJ,eAAe,EACf,SAAS,CACV,CAAC;AACJ,CAAC;AASD,SAAS,wBAAwB,CAC/B,OAA0B,EAC1B,SAAoB,EACpB,IAAsB,EACtB,eAA+B,EAC/B,IAAsB;IAEtB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAGnB,OAAO;QACT,CAAC;QACD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,oBAAoB,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,SAAS,CAAC,IAAI,CAAC,KAAK,uBAAuB,IAAI,+BAA+B,EACrG,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1B,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,SAAS,CAAC,IAAI,CAAC,KAAK,gCAAgC,IAAI,mBAAmB,EAClG,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,OAAO;IACT,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,oCAAoC,IAAI,mBAAmB,EAC3D,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,eAAe,EACf,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAEjC,wBAAwB,CACtB,OAAO,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,eAAe,EACf,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACxC,wBAAwB,CACtB,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,6BAA6B,KAAK,CAC/D,SAAS,CACV,GAAG,EACJ,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,gCAC7B,KAAK,CAAC,IACR,aAAa,KAAK,CAAC,SAAS,CAAC,GAAG,EAChC,SAAS,EACT,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC;gBACvC,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC7D,MAAM,oBAAoB,GAAG,uBAAuB,CAClD,OAAO,EACP,cAAc,CACf,CAAC;oBACF,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC/C,MAAM,KAAK,GAAG,oBAAoB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;oBAC1D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;4BACxB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,YAAY,wBAAwB,KAAK,CAAC,IAAI,kCAAkC,IAAI,+BAA+B,EAC1I,SAAS,EACT,IAAI,CACL,CAAC;wBACJ,CAAC;6BAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;4BAC1B,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,YAAY,wBAAwB,KAAK,CAAC,IAAI,kCAAkC,IAAI,mBAAmB,EAC9H,SAAS,EACT,IAAI,CACL,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/D,SAAS;oBACX,CAAC;gBACH,CAAC;gBAED,wBAAwB,CACtB,OAAO,EACP,cAAc,EACd,KAAK,CAAC,IAAI,EACV,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,WAAW,GAAmC,EAAE,CAAC;QAEvD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,eAAe;oBAChC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClE,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,mCAAmC,SAAS,IACzE,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,SACxC,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EACxB,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;YACtD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,+BAA+B,CAAC,IAAI,CAAC,EACrC,SAAS,EACT,IAAI,CACL,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5C,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,+BAA+B,CAAC,IAAI,CAAC,EACrC,SAAS,EACT,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CACpC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC;QACX,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,kBAAkB;gBAC9B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CACrB,gBAAgB,CACd,SAAS,EACT,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,sBAAsB,CAC/B,EACD,eAAe,CAChB;gBACH,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,IAC7B,WAAW,IAAI,IAAI;gBACjB,CAAC,CAAC,4BAA4B,qBAAqB,CAAC,WAAW,CAAC,UAAU;gBAC1E,CAAC,CAAC,SACN,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EACxB,SAAS,EACT,IAAI,EACJ,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA0B,EAC1B,SAAuB;IAEvB,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1C,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtD,OAAO,sBAAsB,EAAE,OAAO,CAAC,YAAY,CAAC;QAClD,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAA4E,EAC5E,OAAe,EACf,SAAkB,EAClB,IAAsB,EACtB,aAA4B;IAE5B,OAAO,CACL,IAAI,YAAY,CAAC,OAAO,EAAE;QACxB,KAAK,EAAE,SAAS;QAChB,aAAa;KACd,CAAC,EACF,WAAW,CAAC,IAAI,CAAC,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAoB;IACjD,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,+BAA+B,CAAC,IAAsB;IAC7D,OAAO,mCAAmC,IAAI,wFAAwF,CAAC;AACzI,CAAC","sourcesContent":["/** @category Values */\n\nimport { didYouMean } from '../jsutils/didYouMean.ts';\nimport { inspect } from '../jsutils/inspect.ts';\nimport { isIterableObject } from '../jsutils/isIterableObject.ts';\nimport { isObjectLike } from '../jsutils/isObjectLike.ts';\nimport { keyMap } from '../jsutils/keyMap.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\nimport type { Path } from '../jsutils/Path.ts';\nimport { addPath, pathToArray } from '../jsutils/Path.ts';\nimport { suggestionList } from '../jsutils/suggestionList.ts';\n\nimport { ensureGraphQLError } from '../error/ensureGraphQLError.ts';\nimport { GraphQLError } from '../error/GraphQLError.ts';\n\nimport type { ASTNode, ValueNode, VariableNode } from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\nimport { print } from '../language/printer.ts';\n\nimport type { GraphQLInputType } from '../type/definition.ts';\nimport {\n assertLeafType,\n isInputObjectType,\n isListType,\n isNonNullType,\n isRequiredInputField,\n} from '../type/definition.ts';\n\nimport type { FragmentVariableValues } from '../execution/collectFields.ts';\nimport type { VariableValues } from '../execution/values.ts';\n\nimport { replaceVariables } from './replaceVariables.ts';\n\n/**\n * Validate that the provided input value is allowed for this type, collecting\n * all errors via a callback function.\n * @param inputValue - JavaScript value to validate.\n * @param type - GraphQL input type to validate the value against.\n * @param onError - Callback invoked for each validation error and path.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns Nothing.\n * @example\n * ```ts\n * // Collect validation errors with their input paths.\n * import {\n * GraphQLInputObjectType,\n * GraphQLInt,\n * GraphQLNonNull,\n * } from 'graphql/type';\n * import { validateInputValue } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * stars: { type: new GraphQLNonNull(GraphQLInt) },\n * },\n * });\n * const errors = [];\n *\n * validateInputValue({ stars: 'bad' }, ReviewInput, (error, path) => {\n * errors.push({ message: error.message, path });\n * });\n *\n * errors; // => [ { message: 'Expected value of type \"Int\", found: \"bad\".', path: ['stars'] } ]\n * ```\n * @example\n * ```ts\n * // This variant hides suggestion text for unknown input fields.\n * import { GraphQLInputObjectType, GraphQLString } from 'graphql/type';\n * import { validateInputValue } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * comment: { type: GraphQLString },\n * },\n * });\n * const errors = [];\n *\n * validateInputValue(\n * { rating: 'extra field' },\n * ReviewInput,\n * (error) => {\n * errors.push(error.message);\n * },\n * true,\n * );\n *\n * errors; // => ['Expected value of type \"ReviewInput\" not to include unknown field \"rating\", found: { rating: \"extra field\" }.']\n * ```\n */\nexport function validateInputValue(\n inputValue: unknown,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n hideSuggestions?: Maybe<boolean>,\n): void {\n return validateInputValueImpl(\n inputValue,\n type,\n onError,\n hideSuggestions,\n undefined,\n );\n}\n\nfunction validateInputValueImpl(\n inputValue: unknown,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n hideSuggestions: Maybe<boolean>,\n path: Path | undefined,\n): void {\n if (isNonNullType(type)) {\n if (inputValue === undefined) {\n reportInvalidValue(\n onError,\n `Expected a value of non-null type \"${type}\" to be provided.`,\n path,\n );\n return;\n }\n if (inputValue === null) {\n reportInvalidValue(\n onError,\n `Expected value of non-null type \"${type}\" not to be null.`,\n path,\n );\n return;\n }\n return validateInputValueImpl(\n inputValue,\n type.ofType,\n onError,\n hideSuggestions,\n path,\n );\n }\n\n if (inputValue == null) {\n return;\n }\n\n if (isListType(type)) {\n if (!isIterableObject(inputValue)) {\n // Lists accept a non-list value as a list of one.\n validateInputValueImpl(\n inputValue,\n type.ofType,\n onError,\n hideSuggestions,\n path,\n );\n } else {\n let index = 0;\n for (const itemValue of inputValue) {\n validateInputValueImpl(\n itemValue,\n type.ofType,\n onError,\n hideSuggestions,\n addPath(path, index++, undefined),\n );\n }\n }\n } else if (isInputObjectType(type)) {\n if (!isObjectLike(inputValue) || Array.isArray(inputValue)) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" to be an object, found: ${inspect(\n inputValue,\n )}.`,\n path,\n );\n return;\n }\n\n const fieldDefs = type.getFields();\n\n for (const field of Object.values(fieldDefs)) {\n const fieldValue = inputValue[field.name];\n if (fieldValue === undefined) {\n if (isRequiredInputField(field)) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" to include required field \"${\n field.name\n }\", found: ${inspect(inputValue)}.`,\n path,\n );\n }\n } else {\n validateInputValueImpl(\n fieldValue,\n field.type,\n onError,\n hideSuggestions,\n addPath(path, field.name, type.name),\n );\n }\n }\n\n const fields: Array<string> = [];\n // Ensure every provided field is defined.\n for (const fieldName of Object.keys(inputValue)) {\n if (inputValue[fieldName] === undefined) {\n continue;\n }\n if (!Object.hasOwn(fieldDefs, fieldName)) {\n const suggestion = hideSuggestions\n ? ''\n : didYouMean(suggestionList(fieldName, Object.keys(fieldDefs)));\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" not to include unknown field \"${fieldName}\"${\n suggestion ? `.${suggestion} Found` : ', found'\n }: ${inspect(inputValue)}.`,\n path,\n );\n continue;\n }\n fields.push(fieldName);\n }\n\n if (type.isOneOf) {\n if (fields.length !== 1) {\n reportInvalidValue(\n onError,\n getOneOfInputObjectErrorMessage(type),\n path,\n );\n }\n\n const field = fields[0];\n const value = inputValue[field];\n if (value === null) {\n reportInvalidValue(\n onError,\n getOneOfInputObjectErrorMessage(type),\n addPath(path, field, type.name),\n );\n }\n }\n } else {\n assertLeafType(type);\n\n let result;\n let caughtError: unknown;\n\n try {\n result = type.coerceInputValue(inputValue, hideSuggestions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n onError(error, pathToArray(path));\n return;\n }\n caughtError = error;\n }\n\n if (result === undefined) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\"${\n caughtError != null\n ? `, but encountered error \"${getCaughtErrorMessage(caughtError)}\"; found`\n : ', found'\n }: ${inspect(inputValue)}.`,\n path,\n ensureGraphQLError(caughtError),\n );\n }\n }\n}\n\nfunction reportInvalidValue(\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n message: string,\n path: Path | undefined,\n originalError?: GraphQLError,\n): void {\n onError(new GraphQLError(message, { originalError }), pathToArray(path));\n}\n\n/**\n * Validate that the provided input literal is allowed for this type, collecting\n * all errors via a callback function.\n *\n * If variable values are not provided, the literal is validated statically\n * (not assuming that those variables are missing runtime values).\n * @param valueNode - GraphQL value AST node to validate.\n * @param type - GraphQL input type to validate the literal against.\n * @param onError - Callback invoked for each validation error and path.\n * @param variables - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns Nothing.\n * @example\n * ```ts\n * // Validate literal input values and collect literal paths.\n * import { parseValue } from 'graphql/language';\n * import {\n * GraphQLInputObjectType,\n * GraphQLInt,\n * GraphQLNonNull,\n * } from 'graphql/type';\n * import { validateInputLiteral } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * stars: { type: new GraphQLNonNull(GraphQLInt) },\n * },\n * });\n * const errors = [];\n *\n * validateInputLiteral(parseValue('{ stars: \"bad\" }'), ReviewInput, (error, path) => {\n * errors.push({ message: error.message, path });\n * });\n *\n * errors; // => [ { message: 'Expected value of type \"Int\", found: \"bad\".', path: ['stars'] } ]\n * ```\n * @example\n * ```ts\n * // This variant resolves variable references using VariableValues from getVariableValues().\n * import assert from 'node:assert';\n * import { parse, parseValue } from 'graphql/language';\n * import { GraphQLInt } from 'graphql/type';\n * import { getVariableValues } from 'graphql/execution';\n * import { buildSchema, validateInputLiteral } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * review(stars: Int): String\n * }\n * `);\n * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }');\n * const operation = document.definitions[0];\n * const result = getVariableValues(\n * schema,\n * operation.variableDefinitions,\n * { stars: '4' },\n * );\n *\n * assert('variableValues' in result);\n *\n * const errors = [];\n * validateInputLiteral(\n * parseValue('$stars'),\n * GraphQLInt,\n * (error) => errors.push(error.message),\n * result.variableValues,\n * undefined,\n * true,\n * );\n *\n * errors; // => []\n * ```\n */\n// eslint-disable-next-line max-params\nexport function validateInputLiteral(\n valueNode: ValueNode,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n variables?: Maybe<VariableValues>,\n fragmentVariableValues?: Maybe<FragmentVariableValues>,\n hideSuggestions?: Maybe<boolean>,\n): void {\n const context: ValidationContext = {\n static: !variables && !fragmentVariableValues,\n onError,\n variables,\n fragmentVariableValues,\n };\n return validateInputLiteralImpl(\n context,\n valueNode,\n type,\n hideSuggestions,\n undefined,\n );\n}\n\ninterface ValidationContext {\n static: boolean;\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void;\n variables?: Maybe<VariableValues>;\n fragmentVariableValues?: Maybe<FragmentVariableValues>;\n}\n\nfunction validateInputLiteralImpl(\n context: ValidationContext,\n valueNode: ValueNode,\n type: GraphQLInputType,\n hideSuggestions: Maybe<boolean>,\n path: Path | undefined,\n): void {\n if (valueNode.kind === Kind.VARIABLE) {\n if (context.static) {\n // If no variable values are provided, this is being validated statically,\n // and cannot yet produce any validation errors for variables.\n return;\n }\n const scopedVariableValues = getScopedVariableValues(context, valueNode);\n const value = scopedVariableValues?.coerced[valueNode.name.value];\n if (isNonNullType(type)) {\n if (value === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${valueNode.name.value}\" provided to type \"${type}\" to provide a runtime value.`,\n valueNode,\n path,\n );\n } else if (value === null) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${valueNode.name.value}\" provided to non-null type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n }\n }\n // Note: This does no further checking that this variable is correct.\n // This assumes this variable usage has already been validated.\n return;\n }\n\n if (isNonNullType(type)) {\n if (valueNode.kind === Kind.NULL) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of non-null type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n return;\n }\n return validateInputLiteralImpl(\n context,\n valueNode,\n type.ofType,\n hideSuggestions,\n path,\n );\n }\n\n if (valueNode.kind === Kind.NULL) {\n return;\n }\n\n if (isListType(type)) {\n if (valueNode.kind !== Kind.LIST) {\n // Lists accept a non-list value as a list of one.\n validateInputLiteralImpl(\n context,\n valueNode,\n type.ofType,\n hideSuggestions,\n path,\n );\n } else {\n let index = 0;\n for (const itemNode of valueNode.values) {\n validateInputLiteralImpl(\n context,\n itemNode,\n type.ofType,\n hideSuggestions,\n addPath(path, index++, undefined),\n );\n }\n }\n } else if (isInputObjectType(type)) {\n if (valueNode.kind !== Kind.OBJECT) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" to be an object, found: ${print(\n valueNode,\n )}.`,\n valueNode,\n path,\n );\n return;\n }\n\n const fieldDefs = type.getFields();\n const fieldNodes = keyMap(valueNode.fields, (field) => field.name.value);\n\n for (const field of Object.values(fieldDefs)) {\n const fieldNode = fieldNodes[field.name];\n if (fieldNode === undefined) {\n if (isRequiredInputField(field)) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" to include required field \"${\n field.name\n }\", found: ${print(valueNode)}.`,\n valueNode,\n path,\n );\n }\n } else {\n const fieldValueNode = fieldNode.value;\n if (fieldValueNode.kind === Kind.VARIABLE && !context.static) {\n const scopedVariableValues = getScopedVariableValues(\n context,\n fieldValueNode,\n );\n const variableName = fieldValueNode.name.value;\n const value = scopedVariableValues?.coerced[variableName];\n if (type.isOneOf) {\n if (value === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${variableName}\" provided to field \"${field.name}\" for OneOf Input Object type \"${type}\" to provide a runtime value.`,\n valueNode,\n path,\n );\n } else if (value === null) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${variableName}\" provided to field \"${field.name}\" for OneOf Input Object type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n }\n } else if (value === undefined && !isRequiredInputField(field)) {\n continue;\n }\n }\n\n validateInputLiteralImpl(\n context,\n fieldValueNode,\n field.type,\n hideSuggestions,\n addPath(path, field.name, type.name),\n );\n }\n }\n\n const fields = valueNode.fields;\n const knownFields: Array<(typeof fields)[number]> = [];\n // Ensure every provided field is defined.\n for (const fieldNode of fields) {\n const fieldName = fieldNode.name.value;\n if (!Object.hasOwn(fieldDefs, fieldName)) {\n const suggestion = hideSuggestions\n ? ''\n : didYouMean(suggestionList(fieldName, Object.keys(fieldDefs)));\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" not to include unknown field \"${fieldName}\"${\n suggestion ? `.${suggestion} Found` : ', found'\n }: ${print(valueNode)}.`,\n fieldNode,\n path,\n );\n } else {\n knownFields.push(fieldNode);\n }\n }\n\n if (type.isOneOf) {\n const isNotExactlyOneField = knownFields.length !== 1;\n if (isNotExactlyOneField) {\n reportInvalidLiteral(\n context.onError,\n getOneOfInputObjectErrorMessage(type),\n valueNode,\n path,\n );\n return;\n }\n\n const fieldValueNode = knownFields[0].value;\n if (fieldValueNode.kind === Kind.NULL) {\n const fieldName = knownFields[0].name.value;\n reportInvalidLiteral(\n context.onError,\n getOneOfInputObjectErrorMessage(type),\n valueNode,\n addPath(path, fieldName, undefined),\n );\n }\n }\n } else {\n assertLeafType(type);\n\n let result;\n let caughtError: unknown;\n try {\n result = type.coerceInputLiteral\n ? type.coerceInputLiteral(\n replaceVariables(\n valueNode,\n context.variables,\n context.fragmentVariableValues,\n ),\n hideSuggestions,\n )\n : type.parseLiteral(valueNode, undefined, hideSuggestions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n context.onError(error, pathToArray(path));\n return;\n }\n caughtError = error;\n }\n\n if (result === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\"${\n caughtError != null\n ? `, but encountered error \"${getCaughtErrorMessage(caughtError)}\"; found`\n : ', found'\n }: ${print(valueNode)}.`,\n valueNode,\n path,\n ensureGraphQLError(caughtError),\n );\n }\n }\n}\n\nfunction getScopedVariableValues(\n context: ValidationContext,\n valueNode: VariableNode,\n): Maybe<VariableValues> {\n const variableName = valueNode.name.value;\n const { fragmentVariableValues, variables } = context;\n return fragmentVariableValues?.sources[variableName]\n ? fragmentVariableValues\n : variables;\n}\n\nfunction reportInvalidLiteral(\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n message: string,\n valueNode: ASTNode,\n path: Path | undefined,\n originalError?: GraphQLError,\n): void {\n onError(\n new GraphQLError(message, {\n nodes: valueNode,\n originalError,\n }),\n pathToArray(path),\n );\n}\n\nfunction getCaughtErrorMessage(caughtError: unknown): string {\n if (isObjectLike(caughtError)) {\n const message = caughtError.message;\n if (typeof message === 'string' && message !== '') {\n return message;\n }\n }\n\n return String(caughtError);\n}\n\nfunction getOneOfInputObjectErrorMessage(type: GraphQLInputType): string {\n return `Within OneOf Input Object type \"${type}\", exactly one field must be specified, and the value for that field must be non-null.`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validateInputValue.js","sourceRoot":"","sources":["../../src/utilities/validateInputValue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,kCAAiC;AACtD,OAAO,EAAE,OAAO,EAAE,+BAA8B;AAChD,OAAO,EAAE,gBAAgB,EAAE,wCAAuC;AAClE,OAAO,EAAE,YAAY,EAAE,oCAAmC;AAC1D,OAAO,EAAE,MAAM,EAAE,8BAA6B;AAG9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA2B;AAC1D,OAAO,EAAE,cAAc,EAAE,sCAAqC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,wCAAuC;AACpE,OAAO,EAAE,YAAY,EAAE,kCAAiC;AAGxD,OAAO,EAAE,IAAI,EAAE,8BAA6B;AAC5C,OAAO,EAAE,KAAK,EAAE,gCAA+B;AAG/C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,oBAAoB,GACrB,+BAA8B;AAK/B,OAAO,EAAE,gBAAgB,EAAE,+BAA8B;AA4DzD,MAAM,UAAU,kBAAkB,CAChC,UAAmB,EACnB,IAAsB,EACtB,OAA4E,EAC5E,eAAgC;IAEhC,OAAO,sBAAsB,CAC3B,UAAU,EACV,IAAI,EACJ,OAAO,EACP,eAAe,EACf,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAmB,EACnB,IAAsB,EACtB,OAA4E,EAC5E,eAA+B,EAC/B,IAAsB;IAEtB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,kBAAkB,CAChB,OAAO,EACP,sCAAsC,IAAI,mBAAmB,EAC7D,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,kBAAkB,CAChB,OAAO,EACP,oCAAoC,IAAI,mBAAmB,EAC3D,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,sBAAsB,CAC3B,UAAU,EACV,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YAElC,sBAAsB,CACpB,UAAU,EACV,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,sBAAsB,CACpB,SAAS,EACT,IAAI,CAAC,MAAM,EACX,OAAO,EACP,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,6BAA6B,OAAO,CACjE,UAAU,CACX,GAAG,EACJ,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,gCAC7B,KAAK,CAAC,IACR,aAAa,OAAO,CAAC,UAAU,CAAC,GAAG,EACnC,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CACpB,UAAU,EACV,KAAK,CAAC,IAAI,EACV,OAAO,EACP,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,eAAe;oBAChC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClE,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,mCAAmC,SAAS,IACzE,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,SACxC,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAC3B,IAAI,CACL,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,kBAAkB,CAChB,OAAO,EACP,+BAA+B,CAAC,IAAI,CAAC,EACrC,IAAI,CACL,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,kBAAkB,CAChB,OAAO,EACP,+BAA+B,CAAC,IAAI,CAAC,EACrC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAChC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC;QACX,IAAI,WAAoB,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,kBAAkB,CAChB,OAAO,EACP,2BAA2B,IAAI,IAC7B,WAAW,IAAI,IAAI;gBACjB,CAAC,CAAC,4BAA4B,qBAAqB,CAAC,WAAW,CAAC,UAAU;gBAC1E,CAAC,CAAC,SACN,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,EAC3B,IAAI,EACJ,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA4E,EAC5E,OAAe,EACf,IAAsB,EACtB,aAA4B;IAE5B,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3E,CAAC;AAgFD,MAAM,UAAU,oBAAoB,CAClC,SAAoB,EACpB,IAAsB,EACtB,OAA4E,EAC5E,SAAiC,EACjC,sBAAsD,EACtD,eAAgC;IAEhC,MAAM,OAAO,GAAsB;QACjC,MAAM,EAAE,CAAC,SAAS,IAAI,CAAC,sBAAsB;QAC7C,OAAO;QACP,SAAS;QACT,sBAAsB;KACvB,CAAC;IACF,OAAO,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,IAAI,EACJ,eAAe,EACf,SAAS,CACV,CAAC;AACJ,CAAC;AASD,SAAS,wBAAwB,CAC/B,OAA0B,EAC1B,SAAoB,EACpB,IAAsB,EACtB,eAA+B,EAC/B,IAAsB;IAEtB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAGnB,OAAO;QACT,CAAC;QACD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,oBAAoB,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,SAAS,CAAC,IAAI,CAAC,KAAK,uBAAuB,IAAI,+BAA+B,EACrG,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1B,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,SAAS,CAAC,IAAI,CAAC,KAAK,gCAAgC,IAAI,mBAAmB,EAClG,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC;QAGD,OAAO;IACT,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,oCAAoC,IAAI,mBAAmB,EAC3D,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,wBAAwB,CAC7B,OAAO,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,eAAe,EACf,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAEjC,wBAAwB,CACtB,OAAO,EACP,SAAS,EACT,IAAI,CAAC,MAAM,EACX,eAAe,EACf,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACxC,wBAAwB,CACtB,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,6BAA6B,KAAK,CAC/D,SAAS,CACV,GAAG,EACJ,SAAS,EACT,IAAI,CACL,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,gCAC7B,KAAK,CAAC,IACR,aAAa,KAAK,CAAC,SAAS,CAAC,GAAG,EAChC,SAAS,EACT,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC;gBACvC,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC7D,MAAM,oBAAoB,GAAG,uBAAuB,CAClD,OAAO,EACP,cAAc,CACf,CAAC;oBACF,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC/C,MAAM,KAAK,GAAG,oBAAoB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;oBAC1D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;4BACxB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,YAAY,wBAAwB,KAAK,CAAC,IAAI,kCAAkC,IAAI,+BAA+B,EAC1I,SAAS,EACT,IAAI,CACL,CAAC;wBACJ,CAAC;6BAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;4BAC1B,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,uBAAuB,YAAY,wBAAwB,KAAK,CAAC,IAAI,kCAAkC,IAAI,mBAAmB,EAC9H,SAAS,EACT,IAAI,CACL,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/D,SAAS;oBACX,CAAC;gBACH,CAAC;gBAED,wBAAwB,CACtB,OAAO,EACP,cAAc,EACd,KAAK,CAAC,IAAI,EACV,eAAe,EACf,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,WAAW,GAAmC,EAAE,CAAC;QAEvD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzC,MAAM,UAAU,GAAG,eAAe;oBAChC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClE,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,mCAAmC,SAAS,IACzE,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,SACxC,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EACxB,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,oBAAoB,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;YACtD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,+BAA+B,CAAC,IAAI,CAAC,EACrC,SAAS,EACT,IAAI,CACL,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,IAAI,cAAc,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5C,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,+BAA+B,CAAC,IAAI,CAAC,EACrC,SAAS,EACT,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CACpC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,MAAM,CAAC;QACX,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,kBAAkB;gBAC9B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CACrB,gBAAgB,CACd,SAAS,EACT,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,sBAAsB,CAC/B,EACD,eAAe,CAChB;gBACH,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,oBAAoB,CAClB,OAAO,CAAC,OAAO,EACf,2BAA2B,IAAI,IAC7B,WAAW,IAAI,IAAI;gBACjB,CAAC,CAAC,4BAA4B,qBAAqB,CAAC,WAAW,CAAC,UAAU;gBAC1E,CAAC,CAAC,SACN,KAAK,KAAK,CAAC,SAAS,CAAC,GAAG,EACxB,SAAS,EACT,IAAI,EACJ,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA0B,EAC1B,SAAuB;IAEvB,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1C,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtD,OAAO,sBAAsB,EAAE,OAAO,CAAC,YAAY,CAAC;QAClD,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAA4E,EAC5E,OAAe,EACf,SAAkB,EAClB,IAAsB,EACtB,aAA4B;IAE5B,OAAO,CACL,IAAI,YAAY,CAAC,OAAO,EAAE;QACxB,KAAK,EAAE,SAAS;QAChB,aAAa;KACd,CAAC,EACF,WAAW,CAAC,IAAI,CAAC,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAoB;IACjD,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,+BAA+B,CAAC,IAAsB;IAC7D,OAAO,mCAAmC,IAAI,wFAAwF,CAAC;AACzI,CAAC","sourcesContent":["/** @category Values */\n\nimport { didYouMean } from '../jsutils/didYouMean.ts';\nimport { inspect } from '../jsutils/inspect.ts';\nimport { isIterableObject } from '../jsutils/isIterableObject.ts';\nimport { isObjectLike } from '../jsutils/isObjectLike.ts';\nimport { keyMap } from '../jsutils/keyMap.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\nimport type { Path } from '../jsutils/Path.ts';\nimport { addPath, pathToArray } from '../jsutils/Path.ts';\nimport { suggestionList } from '../jsutils/suggestionList.ts';\n\nimport { ensureGraphQLError } from '../error/ensureGraphQLError.ts';\nimport { GraphQLError } from '../error/GraphQLError.ts';\n\nimport type { ASTNode, ValueNode, VariableNode } from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\nimport { print } from '../language/printer.ts';\n\nimport type { GraphQLInputType } from '../type/definition.ts';\nimport {\n assertLeafType,\n isInputObjectType,\n isListType,\n isNonNullType,\n isRequiredInputField,\n} from '../type/definition.ts';\n\nimport type { FragmentVariableValues } from '../execution/collectFields.ts';\nimport type { VariableValues } from '../execution/values.ts';\n\nimport { replaceVariables } from './replaceVariables.ts';\n\n/**\n * Validate that the provided input value is allowed for this type, collecting\n * all errors via a callback function.\n * @param inputValue - JavaScript value to validate.\n * @param type - GraphQL input type to validate the value against.\n * @param onError - Callback invoked for each validation error and path.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns Nothing.\n * @example\n * ```ts\n * // Collect validation errors with their input paths.\n * import {\n * GraphQLInputObjectType,\n * GraphQLInt,\n * GraphQLNonNull,\n * } from 'graphql/type';\n * import { validateInputValue } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * stars: { type: new GraphQLNonNull(GraphQLInt) },\n * },\n * });\n * const errors = [];\n *\n * validateInputValue({ stars: 'bad' }, ReviewInput, (error, path) => {\n * errors.push({ message: error.message, path });\n * });\n *\n * errors; // => [ { message: 'Expected value of type \"Int\", found: \"bad\".', path: ['stars'] } ]\n * ```\n * @example\n * ```ts\n * // This variant hides suggestion text for unknown input fields.\n * import { GraphQLInputObjectType, GraphQLString } from 'graphql/type';\n * import { validateInputValue } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * comment: { type: GraphQLString },\n * },\n * });\n * const errors = [];\n *\n * validateInputValue(\n * { rating: 'extra field' },\n * ReviewInput,\n * (error) => {\n * errors.push(error.message);\n * },\n * true,\n * );\n *\n * errors; // => ['Expected value of type \"ReviewInput\" not to include unknown field \"rating\", found: { rating: \"extra field\" }.']\n * ```\n */\nexport function validateInputValue(\n inputValue: unknown,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n hideSuggestions?: Maybe<boolean>,\n): void {\n return validateInputValueImpl(\n inputValue,\n type,\n onError,\n hideSuggestions,\n undefined,\n );\n}\n\nfunction validateInputValueImpl(\n inputValue: unknown,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n hideSuggestions: Maybe<boolean>,\n path: Path | undefined,\n): void {\n if (isNonNullType(type)) {\n if (inputValue === undefined) {\n reportInvalidValue(\n onError,\n `Expected a value of non-null type \"${type}\" to be provided.`,\n path,\n );\n return;\n }\n if (inputValue === null) {\n reportInvalidValue(\n onError,\n `Expected value of non-null type \"${type}\" not to be null.`,\n path,\n );\n return;\n }\n return validateInputValueImpl(\n inputValue,\n type.ofType,\n onError,\n hideSuggestions,\n path,\n );\n }\n\n if (inputValue == null) {\n return;\n }\n\n if (isListType(type)) {\n if (!isIterableObject(inputValue)) {\n // Lists accept a non-list value as a list of one.\n validateInputValueImpl(\n inputValue,\n type.ofType,\n onError,\n hideSuggestions,\n path,\n );\n } else {\n let index = 0;\n for (const itemValue of inputValue) {\n validateInputValueImpl(\n itemValue,\n type.ofType,\n onError,\n hideSuggestions,\n addPath(path, index++, undefined),\n );\n }\n }\n } else if (isInputObjectType(type)) {\n if (!isObjectLike(inputValue) || Array.isArray(inputValue)) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" to be an object, found: ${inspect(\n inputValue,\n )}.`,\n path,\n );\n return;\n }\n\n const fieldDefs = type.getFields();\n\n for (const field of Object.values(fieldDefs)) {\n const fieldValue = inputValue[field.name];\n if (fieldValue === undefined) {\n if (isRequiredInputField(field)) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" to include required field \"${\n field.name\n }\", found: ${inspect(inputValue)}.`,\n path,\n );\n }\n } else {\n validateInputValueImpl(\n fieldValue,\n field.type,\n onError,\n hideSuggestions,\n addPath(path, field.name, type.name),\n );\n }\n }\n\n const fields: Array<string> = [];\n // Ensure every provided field is defined.\n for (const fieldName of Object.keys(inputValue)) {\n if (inputValue[fieldName] === undefined) {\n continue;\n }\n if (!Object.hasOwn(fieldDefs, fieldName)) {\n const suggestion = hideSuggestions\n ? ''\n : didYouMean(suggestionList(fieldName, Object.keys(fieldDefs)));\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\" not to include unknown field \"${fieldName}\"${\n suggestion ? `.${suggestion} Found` : ', found'\n }: ${inspect(inputValue)}.`,\n path,\n );\n continue;\n }\n fields.push(fieldName);\n }\n\n if (type.isOneOf) {\n if (fields.length !== 1) {\n reportInvalidValue(\n onError,\n getOneOfInputObjectErrorMessage(type),\n path,\n );\n }\n\n const field = fields[0];\n const value = inputValue[field];\n if (value === null) {\n reportInvalidValue(\n onError,\n getOneOfInputObjectErrorMessage(type),\n addPath(path, field, type.name),\n );\n }\n }\n } else {\n assertLeafType(type);\n\n let result;\n let caughtError: unknown;\n\n try {\n result = type.coerceInputValue(inputValue, hideSuggestions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n onError(error, pathToArray(path));\n return;\n }\n caughtError = error;\n }\n\n if (result === undefined) {\n reportInvalidValue(\n onError,\n `Expected value of type \"${type}\"${\n caughtError != null\n ? `, but encountered error \"${getCaughtErrorMessage(caughtError)}\"; found`\n : ', found'\n }: ${inspect(inputValue)}.`,\n path,\n ensureGraphQLError(caughtError),\n );\n }\n }\n}\n\nfunction reportInvalidValue(\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n message: string,\n path: Path | undefined,\n originalError?: GraphQLError,\n): void {\n onError(new GraphQLError(message, { originalError }), pathToArray(path));\n}\n\n/**\n * Validate that the provided input literal is allowed for this type, collecting\n * all errors via a callback function.\n *\n * If variable values are not provided, the literal is validated statically\n * (not assuming that those variables are missing runtime values).\n * @param valueNode - GraphQL value AST node to validate.\n * @param type - GraphQL input type to validate the literal against.\n * @param onError - Callback invoked for each validation error and path.\n * @param variables - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns Nothing.\n * @example\n * ```ts\n * // Validate literal input values and collect literal paths.\n * import { parseValue } from 'graphql/language';\n * import {\n * GraphQLInputObjectType,\n * GraphQLInt,\n * GraphQLNonNull,\n * } from 'graphql/type';\n * import { validateInputLiteral } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n * name: 'ReviewInput',\n * fields: {\n * stars: { type: new GraphQLNonNull(GraphQLInt) },\n * },\n * });\n * const errors = [];\n *\n * validateInputLiteral(\n * parseValue('{ stars: \"bad\" }'),\n * ReviewInput,\n * (error, path) => {\n * errors.push({ message: error.message, path });\n * },\n * );\n *\n * errors; // => [ { message: 'Expected value of type \"Int\", found: \"bad\".', path: ['stars'] } ]\n * ```\n * @example\n * ```ts\n * // This variant resolves variable references using VariableValues from getVariableValues().\n * import assert from 'node:assert';\n * import { parse, parseValue } from 'graphql/language';\n * import { GraphQLInt } from 'graphql/type';\n * import { getVariableValues } from 'graphql/execution';\n * import { buildSchema, validateInputLiteral } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * review(stars: Int): String\n * }\n * `);\n * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }');\n * const operation = document.definitions[0];\n * const result = getVariableValues(schema, operation.variableDefinitions, {\n * stars: '4',\n * });\n *\n * assert('variableValues' in result);\n *\n * const errors = [];\n * validateInputLiteral(\n * parseValue('$stars'),\n * GraphQLInt,\n * (error) => errors.push(error.message),\n * result.variableValues,\n * undefined,\n * true,\n * );\n *\n * errors; // => []\n * ```\n */\n// eslint-disable-next-line max-params\nexport function validateInputLiteral(\n valueNode: ValueNode,\n type: GraphQLInputType,\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n variables?: Maybe<VariableValues>,\n fragmentVariableValues?: Maybe<FragmentVariableValues>,\n hideSuggestions?: Maybe<boolean>,\n): void {\n const context: ValidationContext = {\n static: !variables && !fragmentVariableValues,\n onError,\n variables,\n fragmentVariableValues,\n };\n return validateInputLiteralImpl(\n context,\n valueNode,\n type,\n hideSuggestions,\n undefined,\n );\n}\n\ninterface ValidationContext {\n static: boolean;\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void;\n variables?: Maybe<VariableValues>;\n fragmentVariableValues?: Maybe<FragmentVariableValues>;\n}\n\nfunction validateInputLiteralImpl(\n context: ValidationContext,\n valueNode: ValueNode,\n type: GraphQLInputType,\n hideSuggestions: Maybe<boolean>,\n path: Path | undefined,\n): void {\n if (valueNode.kind === Kind.VARIABLE) {\n if (context.static) {\n // If no variable values are provided, this is being validated statically,\n // and cannot yet produce any validation errors for variables.\n return;\n }\n const scopedVariableValues = getScopedVariableValues(context, valueNode);\n const value = scopedVariableValues?.coerced[valueNode.name.value];\n if (isNonNullType(type)) {\n if (value === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${valueNode.name.value}\" provided to type \"${type}\" to provide a runtime value.`,\n valueNode,\n path,\n );\n } else if (value === null) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${valueNode.name.value}\" provided to non-null type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n }\n }\n // Note: This does no further checking that this variable is correct.\n // This assumes this variable usage has already been validated.\n return;\n }\n\n if (isNonNullType(type)) {\n if (valueNode.kind === Kind.NULL) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of non-null type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n return;\n }\n return validateInputLiteralImpl(\n context,\n valueNode,\n type.ofType,\n hideSuggestions,\n path,\n );\n }\n\n if (valueNode.kind === Kind.NULL) {\n return;\n }\n\n if (isListType(type)) {\n if (valueNode.kind !== Kind.LIST) {\n // Lists accept a non-list value as a list of one.\n validateInputLiteralImpl(\n context,\n valueNode,\n type.ofType,\n hideSuggestions,\n path,\n );\n } else {\n let index = 0;\n for (const itemNode of valueNode.values) {\n validateInputLiteralImpl(\n context,\n itemNode,\n type.ofType,\n hideSuggestions,\n addPath(path, index++, undefined),\n );\n }\n }\n } else if (isInputObjectType(type)) {\n if (valueNode.kind !== Kind.OBJECT) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" to be an object, found: ${print(\n valueNode,\n )}.`,\n valueNode,\n path,\n );\n return;\n }\n\n const fieldDefs = type.getFields();\n const fieldNodes = keyMap(valueNode.fields, (field) => field.name.value);\n\n for (const field of Object.values(fieldDefs)) {\n const fieldNode = fieldNodes[field.name];\n if (fieldNode === undefined) {\n if (isRequiredInputField(field)) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" to include required field \"${\n field.name\n }\", found: ${print(valueNode)}.`,\n valueNode,\n path,\n );\n }\n } else {\n const fieldValueNode = fieldNode.value;\n if (fieldValueNode.kind === Kind.VARIABLE && !context.static) {\n const scopedVariableValues = getScopedVariableValues(\n context,\n fieldValueNode,\n );\n const variableName = fieldValueNode.name.value;\n const value = scopedVariableValues?.coerced[variableName];\n if (type.isOneOf) {\n if (value === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${variableName}\" provided to field \"${field.name}\" for OneOf Input Object type \"${type}\" to provide a runtime value.`,\n valueNode,\n path,\n );\n } else if (value === null) {\n reportInvalidLiteral(\n context.onError,\n `Expected variable \"$${variableName}\" provided to field \"${field.name}\" for OneOf Input Object type \"${type}\" not to be null.`,\n valueNode,\n path,\n );\n }\n } else if (value === undefined && !isRequiredInputField(field)) {\n continue;\n }\n }\n\n validateInputLiteralImpl(\n context,\n fieldValueNode,\n field.type,\n hideSuggestions,\n addPath(path, field.name, type.name),\n );\n }\n }\n\n const fields = valueNode.fields;\n const knownFields: Array<(typeof fields)[number]> = [];\n // Ensure every provided field is defined.\n for (const fieldNode of fields) {\n const fieldName = fieldNode.name.value;\n if (!Object.hasOwn(fieldDefs, fieldName)) {\n const suggestion = hideSuggestions\n ? ''\n : didYouMean(suggestionList(fieldName, Object.keys(fieldDefs)));\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\" not to include unknown field \"${fieldName}\"${\n suggestion ? `.${suggestion} Found` : ', found'\n }: ${print(valueNode)}.`,\n fieldNode,\n path,\n );\n } else {\n knownFields.push(fieldNode);\n }\n }\n\n if (type.isOneOf) {\n const isNotExactlyOneField = knownFields.length !== 1;\n if (isNotExactlyOneField) {\n reportInvalidLiteral(\n context.onError,\n getOneOfInputObjectErrorMessage(type),\n valueNode,\n path,\n );\n return;\n }\n\n const fieldValueNode = knownFields[0].value;\n if (fieldValueNode.kind === Kind.NULL) {\n const fieldName = knownFields[0].name.value;\n reportInvalidLiteral(\n context.onError,\n getOneOfInputObjectErrorMessage(type),\n valueNode,\n addPath(path, fieldName, undefined),\n );\n }\n }\n } else {\n assertLeafType(type);\n\n let result;\n let caughtError: unknown;\n try {\n result = type.coerceInputLiteral\n ? type.coerceInputLiteral(\n replaceVariables(\n valueNode,\n context.variables,\n context.fragmentVariableValues,\n ),\n hideSuggestions,\n )\n : type.parseLiteral(valueNode, undefined, hideSuggestions);\n } catch (error) {\n if (error instanceof GraphQLError) {\n context.onError(error, pathToArray(path));\n return;\n }\n caughtError = error;\n }\n\n if (result === undefined) {\n reportInvalidLiteral(\n context.onError,\n `Expected value of type \"${type}\"${\n caughtError != null\n ? `, but encountered error \"${getCaughtErrorMessage(caughtError)}\"; found`\n : ', found'\n }: ${print(valueNode)}.`,\n valueNode,\n path,\n ensureGraphQLError(caughtError),\n );\n }\n }\n}\n\nfunction getScopedVariableValues(\n context: ValidationContext,\n valueNode: VariableNode,\n): Maybe<VariableValues> {\n const variableName = valueNode.name.value;\n const { fragmentVariableValues, variables } = context;\n return fragmentVariableValues?.sources[variableName]\n ? fragmentVariableValues\n : variables;\n}\n\nfunction reportInvalidLiteral(\n onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n message: string,\n valueNode: ASTNode,\n path: Path | undefined,\n originalError?: GraphQLError,\n): void {\n onError(\n new GraphQLError(message, {\n nodes: valueNode,\n originalError,\n }),\n pathToArray(path),\n );\n}\n\nfunction getCaughtErrorMessage(caughtError: unknown): string {\n if (isObjectLike(caughtError)) {\n const message = caughtError.message;\n if (typeof message === 'string' && message !== '') {\n return message;\n }\n }\n\n return String(caughtError);\n}\n\nfunction getOneOfInputObjectErrorMessage(type: GraphQLInputType): string {\n return `Within OneOf Input Object type \"${type}\", exactly one field must be specified, and the value for that field must be non-null.`;\n}\n"]}
|
|
@@ -11,7 +11,10 @@ import type { ValidationContext } from "../ValidationContext.mjs";
|
|
|
11
11
|
* ```ts
|
|
12
12
|
* import { parse } from 'graphql/language';
|
|
13
13
|
* import { buildSchema } from 'graphql/utilities';
|
|
14
|
-
* import {
|
|
14
|
+
* import {
|
|
15
|
+
* validate,
|
|
16
|
+
* DeferStreamDirectiveOnRootFieldRule,
|
|
17
|
+
* } from 'graphql/validation';
|
|
15
18
|
*
|
|
16
19
|
* const schema = buildSchema(`
|
|
17
20
|
* type Query {
|
|
@@ -11,7 +11,10 @@ import type { ValidationContext } from "../ValidationContext.js";
|
|
|
11
11
|
* ```ts
|
|
12
12
|
* import { parse } from 'graphql/language';
|
|
13
13
|
* import { buildSchema } from 'graphql/utilities';
|
|
14
|
-
* import {
|
|
14
|
+
* import {
|
|
15
|
+
* validate,
|
|
16
|
+
* DeferStreamDirectiveOnRootFieldRule,
|
|
17
|
+
* } from 'graphql/validation';
|
|
15
18
|
*
|
|
16
19
|
* const schema = buildSchema(`
|
|
17
20
|
* type Query {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeferStreamDirectiveOnRootFieldRule.js","sourceRoot":"","sources":["../../../src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"DeferStreamDirectiveOnRootFieldRule.js","sourceRoot":"","sources":["../../../src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type {\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n OperationDefinitionNode,\n OperationTypeNode,\n SelectionSetNode,\n} from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { GraphQLObjectType } from '../../type/definition.ts';\nimport {\n GraphQLDeferDirective,\n GraphQLStreamDirective,\n} from '../../type/directives.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Defer and stream directives are used on valid root field\n *\n * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types.\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 { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import {\n * validate,\n * DeferStreamDirectiveOnRootFieldRule,\n * } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * message: String\n * }\n *\n * type Mutation {\n * updateMessage: String\n * }\n * `);\n * const invalidDocument = parse(`\n * mutation { ... @defer { updateMessage } }\n * `);\n * const validDocument = parse(`\n * { ... @defer { message } }\n * `);\n *\n * validate(schema, invalidDocument, [DeferStreamDirectiveOnRootFieldRule]).length; // => 1\n * validate(schema, validDocument, [DeferStreamDirectiveOnRootFieldRule]); // => []\n * ```\n */\nexport function DeferStreamDirectiveOnRootFieldRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n OperationDefinition(node: OperationDefinitionNode) {\n const document = context.getDocument();\n const fragments = new Map<string, FragmentDefinitionNode>();\n\n for (const definition of document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition);\n }\n }\n if (node.operation !== 'subscription' && node.operation !== 'mutation') {\n return;\n }\n const schema = context.getSchema();\n const rootType = schema.getRootType(node.operation);\n if (rootType) {\n forbidDeferStream({\n context,\n operationType: node.operation,\n rootType,\n fragments,\n selectionSet: node.selectionSet,\n visitedFragments: new Set(),\n });\n }\n },\n };\n}\n\nfunction forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet,\n visitedFragments,\n}: {\n context: ValidationContext;\n operationType: OperationTypeNode;\n rootType: GraphQLObjectType;\n fragments: Map<string, FragmentDefinitionNode>;\n selectionSet: SelectionSetNode;\n visitedFragments: Set<string>;\n}) {\n for (const selection of selectionSet.selections) {\n if (selection.kind === 'Field') {\n const stream = selection.directives?.find(\n (d) => d.name.value === GraphQLStreamDirective.name,\n );\n if (stream) {\n context.reportError(\n new GraphQLError(\n `Stream directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: stream },\n ),\n );\n }\n } else if (selection.kind === 'FragmentSpread') {\n const fragmentName = selection.name.value;\n if (visitedFragments.has(fragmentName)) {\n continue;\n }\n const fragment = fragments.get(fragmentName);\n if (fragment) {\n const defer = getDeferDirective(selection);\n if (defer !== undefined) {\n context.reportError(\n new GraphQLError(\n `Defer directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: defer },\n ),\n );\n }\n forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet: fragment.selectionSet,\n visitedFragments,\n });\n }\n visitedFragments.add(fragmentName);\n } else if (selection.kind === 'InlineFragment') {\n const defer = getDeferDirective(selection);\n if (defer !== undefined) {\n context.reportError(\n new GraphQLError(\n `Defer directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: defer },\n ),\n );\n }\n forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet: selection.selectionSet,\n visitedFragments,\n });\n }\n }\n}\n\nfunction getDeferDirective(fragment: FragmentSpreadNode | InlineFragmentNode) {\n return fragment.directives?.find(\n (d) => d.name.value === GraphQLDeferDirective.name,\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeferStreamDirectiveOnRootFieldRule.js","sourceRoot":"","sources":["../../../src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAU3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAI/C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,kCAAiC;
|
|
1
|
+
{"version":3,"file":"DeferStreamDirectiveOnRootFieldRule.js","sourceRoot":"","sources":["../../../src/validation/rules/DeferStreamDirectiveOnRootFieldRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAU3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAI/C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,kCAAiC;AAuClC,MAAM,UAAU,mCAAmC,CACjD,OAA0B;IAE1B,OAAO;QACL,mBAAmB,CAAC,IAA6B;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;YAE5D,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACjD,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,CAAC;oBAChB,OAAO;oBACP,aAAa,EAAE,IAAI,CAAC,SAAS;oBAC7B,QAAQ;oBACR,SAAS;oBACT,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,gBAAgB,EAAE,IAAI,GAAG,EAAE;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,gBAAgB,GAQjB;IACC,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,sBAAsB,CAAC,IAAI,CACpD,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,2CAA2C,aAAa,UAAU,QAAQ,IAAI,EAC9E,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1C,IAAI,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,0CAA0C,aAAa,UAAU,QAAQ,IAAI,EAC7E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CACF,CAAC;gBACJ,CAAC;gBACD,iBAAiB,CAAC;oBAChB,OAAO;oBACP,aAAa;oBACb,QAAQ;oBACR,SAAS;oBACT,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,gBAAgB;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,0CAA0C,aAAa,UAAU,QAAQ,IAAI,EAC7E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CACF,CAAC;YACJ,CAAC;YACD,iBAAiB,CAAC;gBAChB,OAAO;gBACP,aAAa;gBACb,QAAQ;gBACR,SAAS;gBACT,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAiD;IAC1E,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,qBAAqB,CAAC,IAAI,CACnD,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type {\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n OperationDefinitionNode,\n OperationTypeNode,\n SelectionSetNode,\n} from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { GraphQLObjectType } from '../../type/definition.ts';\nimport {\n GraphQLDeferDirective,\n GraphQLStreamDirective,\n} from '../../type/directives.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Defer and stream directives are used on valid root field\n *\n * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types.\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 { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import {\n * validate,\n * DeferStreamDirectiveOnRootFieldRule,\n * } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * message: String\n * }\n *\n * type Mutation {\n * updateMessage: String\n * }\n * `);\n * const invalidDocument = parse(`\n * mutation { ... @defer { updateMessage } }\n * `);\n * const validDocument = parse(`\n * { ... @defer { message } }\n * `);\n *\n * validate(schema, invalidDocument, [DeferStreamDirectiveOnRootFieldRule]).length; // => 1\n * validate(schema, validDocument, [DeferStreamDirectiveOnRootFieldRule]); // => []\n * ```\n */\nexport function DeferStreamDirectiveOnRootFieldRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n OperationDefinition(node: OperationDefinitionNode) {\n const document = context.getDocument();\n const fragments = new Map<string, FragmentDefinitionNode>();\n\n for (const definition of document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition);\n }\n }\n if (node.operation !== 'subscription' && node.operation !== 'mutation') {\n return;\n }\n const schema = context.getSchema();\n const rootType = schema.getRootType(node.operation);\n if (rootType) {\n forbidDeferStream({\n context,\n operationType: node.operation,\n rootType,\n fragments,\n selectionSet: node.selectionSet,\n visitedFragments: new Set(),\n });\n }\n },\n };\n}\n\nfunction forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet,\n visitedFragments,\n}: {\n context: ValidationContext;\n operationType: OperationTypeNode;\n rootType: GraphQLObjectType;\n fragments: Map<string, FragmentDefinitionNode>;\n selectionSet: SelectionSetNode;\n visitedFragments: Set<string>;\n}) {\n for (const selection of selectionSet.selections) {\n if (selection.kind === 'Field') {\n const stream = selection.directives?.find(\n (d) => d.name.value === GraphQLStreamDirective.name,\n );\n if (stream) {\n context.reportError(\n new GraphQLError(\n `Stream directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: stream },\n ),\n );\n }\n } else if (selection.kind === 'FragmentSpread') {\n const fragmentName = selection.name.value;\n if (visitedFragments.has(fragmentName)) {\n continue;\n }\n const fragment = fragments.get(fragmentName);\n if (fragment) {\n const defer = getDeferDirective(selection);\n if (defer !== undefined) {\n context.reportError(\n new GraphQLError(\n `Defer directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: defer },\n ),\n );\n }\n forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet: fragment.selectionSet,\n visitedFragments,\n });\n }\n visitedFragments.add(fragmentName);\n } else if (selection.kind === 'InlineFragment') {\n const defer = getDeferDirective(selection);\n if (defer !== undefined) {\n context.reportError(\n new GraphQLError(\n `Defer directive cannot be used on root ${operationType} type \"${rootType}\".`,\n { nodes: defer },\n ),\n );\n }\n forbidDeferStream({\n context,\n operationType,\n rootType,\n fragments,\n selectionSet: selection.selectionSet,\n visitedFragments,\n });\n }\n }\n}\n\nfunction getDeferDirective(fragment: FragmentSpreadNode | InlineFragmentNode) {\n return fragment.directives?.find(\n (d) => d.name.value === GraphQLDeferDirective.name,\n );\n}\n"]}
|
|
@@ -24,14 +24,18 @@ import type { ASTValidationContext } from "../ValidationContext.mjs";
|
|
|
24
24
|
* const invalidDocument = parse(`
|
|
25
25
|
* type Extra { field: String }
|
|
26
26
|
* `);
|
|
27
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
27
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* ExecutableDefinitionsRule,
|
|
29
|
+
* ]);
|
|
28
30
|
*
|
|
29
31
|
* invalidErrors.length; // => 1
|
|
30
32
|
*
|
|
31
33
|
* const validDocument = parse(`
|
|
32
34
|
* { name }
|
|
33
35
|
* `);
|
|
34
|
-
* const validErrors = validate(schema, validDocument, [
|
|
36
|
+
* const validErrors = validate(schema, validDocument, [
|
|
37
|
+
* ExecutableDefinitionsRule,
|
|
38
|
+
* ]);
|
|
35
39
|
*
|
|
36
40
|
* validErrors; // => []
|
|
37
41
|
* ```
|
|
@@ -24,14 +24,18 @@ import type { ASTValidationContext } from "../ValidationContext.js";
|
|
|
24
24
|
* const invalidDocument = parse(`
|
|
25
25
|
* type Extra { field: String }
|
|
26
26
|
* `);
|
|
27
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
27
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* ExecutableDefinitionsRule,
|
|
29
|
+
* ]);
|
|
28
30
|
*
|
|
29
31
|
* invalidErrors.length; // => 1
|
|
30
32
|
*
|
|
31
33
|
* const validDocument = parse(`
|
|
32
34
|
* { name }
|
|
33
35
|
* `);
|
|
34
|
-
* const validErrors = validate(schema, validDocument, [
|
|
36
|
+
* const validErrors = validate(schema, validDocument, [
|
|
37
|
+
* ExecutableDefinitionsRule,
|
|
38
|
+
* ]);
|
|
35
39
|
*
|
|
36
40
|
* validErrors; // => []
|
|
37
41
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutableDefinitionsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/ExecutableDefinitionsRule.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ExecutableDefinitionsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/ExecutableDefinitionsRule.ts"],"names":[],"mappings":";;AAiDA,8DAsBC;AArED,iEAA2D;AAE3D,sDAA+C;AAC/C,gEAA0E;AA4C1E,SAAgB,yBAAyB,CACvC,OAA6B;IAE7B,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAA,0CAA0B,EAAC,UAAU,CAAC,EAAE,CAAC;oBAC5C,MAAM,OAAO,GACX,UAAU,CAAC,IAAI,KAAK,eAAI,CAAC,iBAAiB;wBAC1C,UAAU,CAAC,IAAI,KAAK,eAAI,CAAC,gBAAgB;wBACvC,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;oBACxC,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CAAC,OAAO,OAAO,gCAAgC,EAAE;wBAC/D,KAAK,EAAE,UAAU;qBAClB,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport { isExecutableDefinitionNode } from '../../language/predicates.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Executable definitions\n *\n * A GraphQL document is only valid for execution if all definitions are either\n * operation or fragment definitions.\n *\n * See https://spec.graphql.org/draft/#sec-Executable-Definitions\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 { ExecutableDefinitionsRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * type Extra { field: String }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * ExecutableDefinitionsRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * ExecutableDefinitionsRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function ExecutableDefinitionsRule(\n context: ASTValidationContext,\n): ASTVisitor {\n return {\n Document(node) {\n for (const definition of node.definitions) {\n if (!isExecutableDefinitionNode(definition)) {\n const defName =\n definition.kind === Kind.SCHEMA_DEFINITION ||\n definition.kind === Kind.SCHEMA_EXTENSION\n ? 'schema'\n : '\"' + definition.name.value + '\"';\n context.reportError(\n new GraphQLError(`The ${defName} definition is not executable.`, {\n nodes: definition,\n }),\n );\n }\n }\n return false;\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecutableDefinitionsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/ExecutableDefinitionsRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,sCAAqC;
|
|
1
|
+
{"version":3,"file":"ExecutableDefinitionsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/ExecutableDefinitionsRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,sCAAqC;AA4C1E,MAAM,UAAU,yBAAyB,CACvC,OAA6B;IAE7B,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5C,MAAM,OAAO,GACX,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB;wBAC1C,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB;wBACvC,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;oBACxC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,OAAO,OAAO,gCAAgC,EAAE;wBAC/D,KAAK,EAAE,UAAU;qBAClB,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport { isExecutableDefinitionNode } from '../../language/predicates.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Executable definitions\n *\n * A GraphQL document is only valid for execution if all definitions are either\n * operation or fragment definitions.\n *\n * See https://spec.graphql.org/draft/#sec-Executable-Definitions\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 { ExecutableDefinitionsRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * type Extra { field: String }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * ExecutableDefinitionsRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * ExecutableDefinitionsRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function ExecutableDefinitionsRule(\n context: ASTValidationContext,\n): ASTVisitor {\n return {\n Document(node) {\n for (const definition of node.definitions) {\n if (!isExecutableDefinitionNode(definition)) {\n const defName =\n definition.kind === Kind.SCHEMA_DEFINITION ||\n definition.kind === Kind.SCHEMA_EXTENSION\n ? 'schema'\n : '\"' + definition.name.value + '\"';\n context.reportError(\n new GraphQLError(`The ${defName} definition is not executable.`, {\n nodes: definition,\n }),\n );\n }\n }\n return false;\n },\n };\n}\n"]}
|
|
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.mjs";
|
|
|
24
24
|
* const invalidDocument = parse(`
|
|
25
25
|
* { missing }
|
|
26
26
|
* `);
|
|
27
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
27
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* FieldsOnCorrectTypeRule,
|
|
29
|
+
* ]);
|
|
28
30
|
*
|
|
29
31
|
* invalidErrors.length; // => 1
|
|
30
32
|
*
|
|
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.js";
|
|
|
24
24
|
* const invalidDocument = parse(`
|
|
25
25
|
* { missing }
|
|
26
26
|
* `);
|
|
27
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
27
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* FieldsOnCorrectTypeRule,
|
|
29
|
+
* ]);
|
|
28
30
|
*
|
|
29
31
|
* invalidErrors.length; // => 1
|
|
30
32
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsOnCorrectTypeRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FieldsOnCorrectTypeRule.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"FieldsOnCorrectTypeRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FieldsOnCorrectTypeRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { didYouMean } from '../../jsutils/didYouMean.ts';\nimport { naturalCompare } from '../../jsutils/naturalCompare.ts';\nimport { suggestionList } from '../../jsutils/suggestionList.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { FieldNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type {\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLOutputType,\n} from '../../type/definition.ts';\nimport {\n isAbstractType,\n isInterfaceType,\n isObjectType,\n} from '../../type/definition.ts';\nimport type { GraphQLSchema } from '../../type/schema.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Fields on correct type\n *\n * A GraphQL document is only valid if all fields selected are defined by the\n * parent type, or are an allowed meta field such as __typename.\n *\n * See https://spec.graphql.org/draft/#sec-Field-Selections\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 { FieldsOnCorrectTypeRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * FieldsOnCorrectTypeRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [FieldsOnCorrectTypeRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function FieldsOnCorrectTypeRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n Field(node: FieldNode) {\n const type = context.getParentType();\n if (type) {\n const fieldDef = context.getFieldDef();\n if (!fieldDef) {\n // This field doesn't exist, lets look for suggestions.\n const schema = context.getSchema();\n const fieldName = node.name.value;\n\n // First determine if there are any suggested types to condition on.\n let suggestion = didYouMean(\n 'to use an inline fragment on',\n context.hideSuggestions\n ? []\n : getSuggestedTypeNames(schema, type, fieldName),\n );\n\n // If there are no suggested types, then perhaps this was a typo?\n if (suggestion === '') {\n suggestion = didYouMean(\n context.hideSuggestions\n ? []\n : getSuggestedFieldNames(type, fieldName),\n );\n }\n\n // Report an error, including helpful suggestions.\n context.reportError(\n new GraphQLError(\n `Cannot query field \"${fieldName}\" on type \"${type}\".` +\n suggestion,\n { nodes: node },\n ),\n );\n }\n }\n },\n };\n}\n\n/**\n * Go through all of the implementations of type, as well as the interfaces that\n * they implement. If any of those types include the provided field, suggest them,\n * sorted by how often the type is referenced.\n *\n * @internal\n */\nfunction getSuggestedTypeNames(\n schema: GraphQLSchema,\n type: GraphQLOutputType,\n fieldName: string,\n): Array<string> {\n if (!isAbstractType(type)) {\n // Must be an Object type, which does not have possible fields.\n return [];\n }\n\n const suggestedTypes = new Set<GraphQLObjectType | GraphQLInterfaceType>();\n const usageCount = Object.create(null);\n for (const possibleType of schema.getPossibleTypes(type)) {\n if (possibleType.getFields()[fieldName] == null) {\n continue;\n }\n\n // This object type defines this field.\n suggestedTypes.add(possibleType);\n usageCount[possibleType.name] = 1;\n\n for (const possibleInterface of possibleType.getInterfaces()) {\n if (possibleInterface.getFields()[fieldName] == null) {\n continue;\n }\n\n // This interface type defines this field.\n suggestedTypes.add(possibleInterface);\n usageCount[possibleInterface.name] =\n (usageCount[possibleInterface.name] ?? 0) + 1;\n }\n }\n\n return [...suggestedTypes]\n .sort((typeA, typeB) => {\n // Suggest both interface and object types based on how common they are.\n const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];\n if (usageCountDiff !== 0) {\n return usageCountDiff;\n }\n\n // Suggest super types first followed by subtypes\n if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {\n return -1;\n }\n if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {\n return 1;\n }\n\n return naturalCompare(typeA.name, typeB.name);\n })\n .map((x) => x.name);\n}\n\n/**\n * For the field name provided, determine if there are any similar field names\n * that may be the result of a typo.\n *\n * @internal\n */\nfunction getSuggestedFieldNames(\n type: GraphQLOutputType,\n fieldName: string,\n): Array<string> {\n if (isObjectType(type) || isInterfaceType(type)) {\n const possibleFieldNames = Object.keys(type.getFields());\n return suggestionList(fieldName, possibleFieldNames);\n }\n // Otherwise, must be a Union type, which does not define fields.\n return [];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldsOnCorrectTypeRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FieldsOnCorrectTypeRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,qCAAoC;AACzD,OAAO,EAAE,cAAc,EAAE,yCAAwC;AACjE,OAAO,EAAE,cAAc,EAAE,yCAAwC;AAEjE,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAU3D,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,GACb,kCAAiC;
|
|
1
|
+
{"version":3,"file":"FieldsOnCorrectTypeRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FieldsOnCorrectTypeRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { didYouMean } from '../../jsutils/didYouMean.ts';\nimport { naturalCompare } from '../../jsutils/naturalCompare.ts';\nimport { suggestionList } from '../../jsutils/suggestionList.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { FieldNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type {\n GraphQLInterfaceType,\n GraphQLObjectType,\n GraphQLOutputType,\n} from '../../type/definition.ts';\nimport {\n isAbstractType,\n isInterfaceType,\n isObjectType,\n} from '../../type/definition.ts';\nimport type { GraphQLSchema } from '../../type/schema.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Fields on correct type\n *\n * A GraphQL document is only valid if all fields selected are defined by the\n * parent type, or are an allowed meta field such as __typename.\n *\n * See https://spec.graphql.org/draft/#sec-Field-Selections\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 { FieldsOnCorrectTypeRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * FieldsOnCorrectTypeRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [FieldsOnCorrectTypeRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function FieldsOnCorrectTypeRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n Field(node: FieldNode) {\n const type = context.getParentType();\n if (type) {\n const fieldDef = context.getFieldDef();\n if (!fieldDef) {\n // This field doesn't exist, lets look for suggestions.\n const schema = context.getSchema();\n const fieldName = node.name.value;\n\n // First determine if there are any suggested types to condition on.\n let suggestion = didYouMean(\n 'to use an inline fragment on',\n context.hideSuggestions\n ? []\n : getSuggestedTypeNames(schema, type, fieldName),\n );\n\n // If there are no suggested types, then perhaps this was a typo?\n if (suggestion === '') {\n suggestion = didYouMean(\n context.hideSuggestions\n ? []\n : getSuggestedFieldNames(type, fieldName),\n );\n }\n\n // Report an error, including helpful suggestions.\n context.reportError(\n new GraphQLError(\n `Cannot query field \"${fieldName}\" on type \"${type}\".` +\n suggestion,\n { nodes: node },\n ),\n );\n }\n }\n },\n };\n}\n\n/**\n * Go through all of the implementations of type, as well as the interfaces that\n * they implement. If any of those types include the provided field, suggest them,\n * sorted by how often the type is referenced.\n *\n * @internal\n */\nfunction getSuggestedTypeNames(\n schema: GraphQLSchema,\n type: GraphQLOutputType,\n fieldName: string,\n): Array<string> {\n if (!isAbstractType(type)) {\n // Must be an Object type, which does not have possible fields.\n return [];\n }\n\n const suggestedTypes = new Set<GraphQLObjectType | GraphQLInterfaceType>();\n const usageCount = Object.create(null);\n for (const possibleType of schema.getPossibleTypes(type)) {\n if (possibleType.getFields()[fieldName] == null) {\n continue;\n }\n\n // This object type defines this field.\n suggestedTypes.add(possibleType);\n usageCount[possibleType.name] = 1;\n\n for (const possibleInterface of possibleType.getInterfaces()) {\n if (possibleInterface.getFields()[fieldName] == null) {\n continue;\n }\n\n // This interface type defines this field.\n suggestedTypes.add(possibleInterface);\n usageCount[possibleInterface.name] =\n (usageCount[possibleInterface.name] ?? 0) + 1;\n }\n }\n\n return [...suggestedTypes]\n .sort((typeA, typeB) => {\n // Suggest both interface and object types based on how common they are.\n const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];\n if (usageCountDiff !== 0) {\n return usageCountDiff;\n }\n\n // Suggest super types first followed by subtypes\n if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {\n return -1;\n }\n if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {\n return 1;\n }\n\n return naturalCompare(typeA.name, typeB.name);\n })\n .map((x) => x.name);\n}\n\n/**\n * For the field name provided, determine if there are any similar field names\n * that may be the result of a typo.\n *\n * @internal\n */\nfunction getSuggestedFieldNames(\n type: GraphQLOutputType,\n fieldName: string,\n): Array<string> {\n if (isObjectType(type) || isInterfaceType(type)) {\n const possibleFieldNames = Object.keys(type.getFields());\n return suggestionList(fieldName, possibleFieldNames);\n }\n // Otherwise, must be a Union type, which does not define fields.\n return [];\n}\n"]}
|
|
@@ -25,14 +25,18 @@ import type { ValidationContext } from "../ValidationContext.mjs";
|
|
|
25
25
|
* const invalidDocument = parse(`
|
|
26
26
|
* fragment Bad on String { length }
|
|
27
27
|
* `);
|
|
28
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
29
|
+
* FragmentsOnCompositeTypesRule,
|
|
30
|
+
* ]);
|
|
29
31
|
*
|
|
30
32
|
* invalidErrors.length; // => 1
|
|
31
33
|
*
|
|
32
34
|
* const validDocument = parse(`
|
|
33
35
|
* fragment Good on Query { name }
|
|
34
36
|
* `);
|
|
35
|
-
* const validErrors = validate(schema, validDocument, [
|
|
37
|
+
* const validErrors = validate(schema, validDocument, [
|
|
38
|
+
* FragmentsOnCompositeTypesRule,
|
|
39
|
+
* ]);
|
|
36
40
|
*
|
|
37
41
|
* validErrors; // => []
|
|
38
42
|
* ```
|
|
@@ -25,14 +25,18 @@ import type { ValidationContext } from "../ValidationContext.js";
|
|
|
25
25
|
* const invalidDocument = parse(`
|
|
26
26
|
* fragment Bad on String { length }
|
|
27
27
|
* `);
|
|
28
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
29
|
+
* FragmentsOnCompositeTypesRule,
|
|
30
|
+
* ]);
|
|
29
31
|
*
|
|
30
32
|
* invalidErrors.length; // => 1
|
|
31
33
|
*
|
|
32
34
|
* const validDocument = parse(`
|
|
33
35
|
* fragment Good on Query { name }
|
|
34
36
|
* `);
|
|
35
|
-
* const validErrors = validate(schema, validDocument, [
|
|
37
|
+
* const validErrors = validate(schema, validDocument, [
|
|
38
|
+
* FragmentsOnCompositeTypesRule,
|
|
39
|
+
* ]);
|
|
36
40
|
*
|
|
37
41
|
* validErrors; // => []
|
|
38
42
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FragmentsOnCompositeTypesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FragmentsOnCompositeTypesRule.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"FragmentsOnCompositeTypesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FragmentsOnCompositeTypesRule.ts"],"names":[],"mappings":";;AAqDA,sEAgCC;AAnFD,iEAA2D;AAE3D,0DAAkD;AAGlD,4DAA2D;AAE3D,mEAA6D;AA4C7D,SAAgB,6BAA6B,CAC3C,OAA0B;IAE1B,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,IAAA,4BAAW,EAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC7D,IAAI,IAAI,IAAI,CAAC,IAAA,+BAAe,EAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,OAAO,GAAG,IAAA,kBAAK,EAAC,aAAa,CAAC,CAAC;oBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CACd,oDAAoD,OAAO,IAAI,EAC/D,EAAE,KAAK,EAAE,aAAa,EAAE,CACzB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,kBAAkB,CAAC,IAAI;YACrB,MAAM,IAAI,GAAG,IAAA,4BAAW,EAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAClE,IAAI,IAAI,IAAI,CAAC,IAAA,+BAAe,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAA,kBAAK,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1C,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CACd,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,6CAA6C,OAAO,IAAI,EACpF,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAC9B,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { print } from '../../language/printer.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { isCompositeType } from '../../type/definition.ts';\n\nimport { typeFromAST } from '../../utilities/typeFromAST.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Fragments on composite type\n *\n * Fragments use a type condition to determine if they apply, since fragments\n * can only be spread into a composite type (object, interface, or union), the\n * type condition must also be a composite type.\n *\n * See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types\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 { FragmentsOnCompositeTypesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * fragment Bad on String { length }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * FragmentsOnCompositeTypesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment Good on Query { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * FragmentsOnCompositeTypesRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function FragmentsOnCompositeTypesRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n InlineFragment(node) {\n const typeCondition = node.typeCondition;\n if (typeCondition) {\n const type = typeFromAST(context.getSchema(), typeCondition);\n if (type && !isCompositeType(type)) {\n const typeStr = print(typeCondition);\n context.reportError(\n new GraphQLError(\n `Fragment cannot condition on non composite type \"${typeStr}\".`,\n { nodes: typeCondition },\n ),\n );\n }\n }\n },\n FragmentDefinition(node) {\n const type = typeFromAST(context.getSchema(), node.typeCondition);\n if (type && !isCompositeType(type)) {\n const typeStr = print(node.typeCondition);\n context.reportError(\n new GraphQLError(\n `Fragment \"${node.name.value}\" cannot condition on non composite type \"${typeStr}\".`,\n { nodes: node.typeCondition },\n ),\n );\n }\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FragmentsOnCompositeTypesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FragmentsOnCompositeTypesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,KAAK,EAAE,mCAAkC;AAGlD,OAAO,EAAE,eAAe,EAAE,kCAAiC;AAE3D,OAAO,EAAE,WAAW,EAAE,wCAAuC;
|
|
1
|
+
{"version":3,"file":"FragmentsOnCompositeTypesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/FragmentsOnCompositeTypesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,KAAK,EAAE,mCAAkC;AAGlD,OAAO,EAAE,eAAe,EAAE,kCAAiC;AAE3D,OAAO,EAAE,WAAW,EAAE,wCAAuC;AA4C7D,MAAM,UAAU,6BAA6B,CAC3C,OAA0B;IAE1B,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC7D,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;oBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,oDAAoD,OAAO,IAAI,EAC/D,EAAE,KAAK,EAAE,aAAa,EAAE,CACzB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,kBAAkB,CAAC,IAAI;YACrB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAClE,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1C,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,6CAA6C,OAAO,IAAI,EACpF,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAC9B,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { print } from '../../language/printer.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { isCompositeType } from '../../type/definition.ts';\n\nimport { typeFromAST } from '../../utilities/typeFromAST.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * Fragments on composite type\n *\n * Fragments use a type condition to determine if they apply, since fragments\n * can only be spread into a composite type (object, interface, or union), the\n * type condition must also be a composite type.\n *\n * See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types\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 { FragmentsOnCompositeTypesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * fragment Bad on String { length }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * FragmentsOnCompositeTypesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment Good on Query { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * FragmentsOnCompositeTypesRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function FragmentsOnCompositeTypesRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n InlineFragment(node) {\n const typeCondition = node.typeCondition;\n if (typeCondition) {\n const type = typeFromAST(context.getSchema(), typeCondition);\n if (type && !isCompositeType(type)) {\n const typeStr = print(typeCondition);\n context.reportError(\n new GraphQLError(\n `Fragment cannot condition on non composite type \"${typeStr}\".`,\n { nodes: typeCondition },\n ),\n );\n }\n }\n },\n FragmentDefinition(node) {\n const type = typeFromAST(context.getSchema(), node.typeCondition);\n if (type && !isCompositeType(type)) {\n const typeStr = print(node.typeCondition);\n context.reportError(\n new GraphQLError(\n `Fragment \"${node.name.value}\" cannot condition on non composite type \"${typeStr}\".`,\n { nodes: node.typeCondition },\n ),\n );\n }\n },\n };\n}\n"]}
|
|
@@ -25,7 +25,9 @@ import type { SDLValidationContext, ValidationContext } from "../ValidationConte
|
|
|
25
25
|
* const invalidDocument = parse(`
|
|
26
26
|
* { field(unknown: "1") }
|
|
27
27
|
* `);
|
|
28
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
29
|
+
* KnownArgumentNamesRule,
|
|
30
|
+
* ]);
|
|
29
31
|
*
|
|
30
32
|
* invalidErrors.length; // => 1
|
|
31
33
|
*
|
|
@@ -25,7 +25,9 @@ import type { SDLValidationContext, ValidationContext } from "../ValidationConte
|
|
|
25
25
|
* const invalidDocument = parse(`
|
|
26
26
|
* { field(unknown: "1") }
|
|
27
27
|
* `);
|
|
28
|
-
* const invalidErrors = validate(schema, invalidDocument, [
|
|
28
|
+
* const invalidErrors = validate(schema, invalidDocument, [
|
|
29
|
+
* KnownArgumentNamesRule,
|
|
30
|
+
* ]);
|
|
29
31
|
*
|
|
30
32
|
* invalidErrors.length; // => 1
|
|
31
33
|
*
|