graphql
Version:
A Query Language and Runtime which can target any service.
1 lines • 19 kB
Source Map (JSON)
{"version":3,"file":"collectFields.js","sourceRoot":"","sources":["../../src/execution/collectFields.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccumulatorMap } from '../jsutils/AccumulatorMap.ts';\nimport type { ObjMap, ReadOnlyObjMap } from '../jsutils/ObjMap.ts';\n\nimport type {\n DirectiveNode,\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n SelectionSetNode,\n ValueNode,\n} from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\n\nimport type { GraphQLObjectType } from '../type/definition.ts';\nimport { isAbstractType } from '../type/definition.ts';\nimport {\n GraphQLDeferDirective,\n GraphQLIncludeDirective,\n GraphQLSkipDirective,\n} from '../type/directives.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\n\nimport { typeFromAST } from '../utilities/typeFromAST.ts';\n\nimport type { GraphQLVariableSignature } from './getVariableSignature.ts';\nimport type { VariableValues } from './values.ts';\nimport {\n getArgumentValues,\n getDirectiveValues,\n getFragmentVariableValues,\n} from './values.ts';\n\n/** @internal */\nexport interface DeferUsage {\n label: string | undefined;\n parentDeferUsage: DeferUsage | undefined;\n}\n\n/** @internal */\nexport interface FragmentVariableValues {\n readonly sources: ReadOnlyObjMap<FragmentVariableValueSource>;\n readonly coerced: ReadOnlyObjMap<unknown>;\n}\n\n/** @internal */\nexport interface FragmentVariableValueSource {\n readonly signature: GraphQLVariableSignature;\n readonly value?: ValueNode;\n readonly fragmentVariableValues?: FragmentVariableValues;\n}\n\n/** @internal */\nexport interface FieldDetails {\n node: FieldNode;\n deferUsage?: DeferUsage | undefined;\n fragmentVariableValues?: FragmentVariableValues | undefined;\n}\n\n/** @internal */\nexport type FieldDetailsList = ReadonlyArray<FieldDetails>;\n\n/** @internal */\nexport type GroupedFieldSet = ReadonlyMap<string, FieldDetailsList>;\n\n/** @internal */\nexport interface FragmentDetails {\n definition: FragmentDefinitionNode;\n variableSignatures?: ObjMap<GraphQLVariableSignature> | undefined;\n}\n\ninterface CollectFieldsContext {\n schema: GraphQLSchema;\n fragments: ObjMap<FragmentDetails>;\n variableValues: VariableValues;\n runtimeType: GraphQLObjectType;\n visitedFragmentNames: Map<string, boolean>;\n hideSuggestions: boolean;\n forbiddenDirectiveInstances: Array<DirectiveNode>;\n forbidSkipAndInclude: boolean;\n}\n\n/**\n * Given a selectionSet, collects all of the fields and returns them.\n *\n * CollectFields requires the \"runtime type\" of an object. For a field that\n * returns an Interface or Union type, the \"runtime type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\n// eslint-disable-next-line max-params\nexport function collectFields(\n schema: GraphQLSchema,\n fragments: ObjMap<FragmentDetails>,\n variableValues: VariableValues,\n runtimeType: GraphQLObjectType,\n selectionSet: SelectionSetNode,\n hideSuggestions: boolean,\n forbidSkipAndInclude = false,\n): {\n groupedFieldSet: GroupedFieldSet;\n newDeferUsages: ReadonlyArray<DeferUsage>;\n forbiddenDirectiveInstances: ReadonlyArray<DirectiveNode>;\n} {\n const groupedFieldSet = new AccumulatorMap<string, FieldDetails>();\n const newDeferUsages: Array<DeferUsage> = [];\n const context: CollectFieldsContext = {\n schema,\n fragments,\n variableValues,\n runtimeType,\n visitedFragmentNames: new Map(),\n hideSuggestions,\n forbiddenDirectiveInstances: [],\n forbidSkipAndInclude,\n };\n\n collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsages);\n return {\n groupedFieldSet,\n newDeferUsages,\n forbiddenDirectiveInstances: context.forbiddenDirectiveInstances,\n };\n}\n\n/**\n * Given an array of field nodes, collects all of the subfields of the passed\n * in fields, and returns them at the end.\n *\n * CollectSubFields requires the \"return type\" of an object. For a field that\n * returns an Interface or Union type, the \"return type\" will be the actual\n * object type returned by that field.\n *\n * @internal\n */\n// eslint-disable-next-line max-params\nexport function collectSubfields(\n schema: GraphQLSchema,\n fragments: ObjMap<FragmentDetails>,\n variableValues: VariableValues,\n returnType: GraphQLObjectType,\n fieldDetailsList: FieldDetailsList,\n hideSuggestions: boolean,\n): {\n groupedFieldSet: GroupedFieldSet;\n newDeferUsages: ReadonlyArray<DeferUsage>;\n} {\n const context: CollectFieldsContext = {\n schema,\n fragments,\n variableValues,\n runtimeType: returnType,\n visitedFragmentNames: new Map(),\n hideSuggestions,\n forbiddenDirectiveInstances: [],\n forbidSkipAndInclude: false,\n };\n const subGroupedFieldSet = new AccumulatorMap<string, FieldDetails>();\n const newDeferUsages: Array<DeferUsage> = [];\n\n for (const fieldDetail of fieldDetailsList) {\n const selectionSet = fieldDetail.node.selectionSet;\n if (selectionSet) {\n const { deferUsage, fragmentVariableValues } = fieldDetail;\n collectFieldsImpl(\n context,\n selectionSet,\n subGroupedFieldSet,\n newDeferUsages,\n deferUsage,\n fragmentVariableValues,\n );\n }\n }\n\n return {\n groupedFieldSet: subGroupedFieldSet,\n newDeferUsages,\n };\n}\n\n/** @internal */\n// eslint-disable-next-line max-params\nfunction collectFieldsImpl(\n context: CollectFieldsContext,\n selectionSet: SelectionSetNode,\n groupedFieldSet: AccumulatorMap<string, FieldDetails>,\n newDeferUsages: Array<DeferUsage>,\n deferUsage?: DeferUsage,\n fragmentVariableValues?: FragmentVariableValues,\n): void {\n const {\n schema,\n fragments,\n variableValues,\n runtimeType,\n visitedFragmentNames,\n hideSuggestions,\n } = context;\n\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD: {\n if (\n !shouldIncludeNode(\n context,\n selection,\n variableValues,\n fragmentVariableValues,\n )\n ) {\n continue;\n }\n groupedFieldSet.add(getFieldEntryKey(selection), {\n node: selection,\n deferUsage,\n fragmentVariableValues,\n });\n break;\n }\n case Kind.INLINE_FRAGMENT: {\n if (\n !shouldIncludeNode(\n context,\n selection,\n variableValues,\n fragmentVariableValues,\n ) ||\n !doesFragmentConditionMatch(schema, selection, runtimeType)\n ) {\n continue;\n }\n\n const newDeferUsage = getDeferUsage(\n variableValues,\n fragmentVariableValues,\n selection,\n deferUsage,\n );\n\n if (!newDeferUsage) {\n collectFieldsImpl(\n context,\n selection.selectionSet,\n groupedFieldSet,\n newDeferUsages,\n deferUsage,\n fragmentVariableValues,\n );\n } else {\n newDeferUsages.push(newDeferUsage);\n collectFieldsImpl(\n context,\n selection.selectionSet,\n groupedFieldSet,\n newDeferUsages,\n newDeferUsage,\n fragmentVariableValues,\n );\n }\n\n break;\n }\n case Kind.FRAGMENT_SPREAD: {\n const fragName = selection.name.value;\n\n if (\n !shouldIncludeNode(\n context,\n selection,\n variableValues,\n fragmentVariableValues,\n )\n ) {\n continue;\n }\n\n const fragment = fragments[fragName];\n if (\n fragment == null ||\n !doesFragmentConditionMatch(schema, fragment.definition, runtimeType)\n ) {\n continue;\n }\n\n const newDeferUsage = getDeferUsage(\n variableValues,\n fragmentVariableValues,\n selection,\n deferUsage,\n );\n\n const visitedAsDeferred = visitedFragmentNames.get(fragName);\n\n let maybeNewDeferUsage: DeferUsage | undefined;\n if (!newDeferUsage) {\n // If this spread is not deferred, it may be skipped when already visited\n // as a non-deferred spread. If it was previously visited as a deferred spread,\n // it must be revisited.\n if (visitedAsDeferred === false) {\n continue;\n }\n visitedFragmentNames.set(fragName, false);\n maybeNewDeferUsage = deferUsage;\n } else {\n // If this spread is deferred, it can be skipped if it has already been visited.\n if (visitedAsDeferred !== undefined) {\n continue;\n }\n visitedFragmentNames.set(fragName, true);\n newDeferUsages.push(newDeferUsage);\n maybeNewDeferUsage = newDeferUsage;\n }\n\n const fragmentVariableSignatures = fragment.variableSignatures;\n let newFragmentVariableValues: FragmentVariableValues | undefined;\n if (fragmentVariableSignatures) {\n newFragmentVariableValues = getFragmentVariableValues(\n selection,\n fragmentVariableSignatures,\n variableValues,\n fragmentVariableValues,\n hideSuggestions,\n );\n }\n\n collectFieldsImpl(\n context,\n fragment.definition.selectionSet,\n groupedFieldSet,\n newDeferUsages,\n maybeNewDeferUsage,\n newFragmentVariableValues,\n );\n break;\n }\n }\n }\n}\n\n/**\n * Returns an object containing the `@defer` arguments if a field should be\n * deferred based on the experimental flag, defer directive present and\n * not disabled by the \"if\" argument.\n *\n * @internal\n */\nfunction getDeferUsage(\n variableValues: VariableValues,\n fragmentVariableValues: FragmentVariableValues | undefined,\n node: FragmentSpreadNode | InlineFragmentNode,\n parentDeferUsage: DeferUsage | undefined,\n): DeferUsage | undefined {\n const defer = getDirectiveValues(\n GraphQLDeferDirective,\n node,\n variableValues,\n fragmentVariableValues,\n );\n\n if (!defer) {\n return;\n }\n\n if (defer.if === false) {\n return;\n }\n\n return {\n label: typeof defer.label === 'string' ? defer.label : undefined,\n parentDeferUsage,\n };\n}\n\n/**\n * Determines if a field should be included based on the `@include` and `@skip`\n * directives, where `@skip` has higher precedence than `@include`.\n *\n * @internal\n */\nfunction shouldIncludeNode(\n context: CollectFieldsContext,\n node: FragmentSpreadNode | FieldNode | InlineFragmentNode,\n variableValues: VariableValues,\n fragmentVariableValues: FragmentVariableValues | undefined,\n): boolean {\n const skipDirectiveNode = node.directives?.find(\n (directive) => directive.name.value === GraphQLSkipDirective.name,\n );\n if (skipDirectiveNode && context.forbidSkipAndInclude) {\n context.forbiddenDirectiveInstances.push(skipDirectiveNode);\n return false;\n }\n const skip = skipDirectiveNode\n ? getArgumentValues(\n GraphQLSkipDirective,\n skipDirectiveNode,\n variableValues,\n fragmentVariableValues,\n context.hideSuggestions,\n )\n : undefined;\n if (skip?.if === true) {\n return false;\n }\n\n const includeDirectiveNode = node.directives?.find(\n (directive) => directive.name.value === GraphQLIncludeDirective.name,\n );\n if (includeDirectiveNode && context.forbidSkipAndInclude) {\n context.forbiddenDirectiveInstances.push(includeDirectiveNode);\n return false;\n }\n const include = includeDirectiveNode\n ? getArgumentValues(\n GraphQLIncludeDirective,\n includeDirectiveNode,\n variableValues,\n fragmentVariableValues,\n context.hideSuggestions,\n )\n : undefined;\n if (include?.if === false) {\n return false;\n }\n return true;\n}\n\n/**\n * Determines if a fragment is applicable to the given type.\n *\n * @internal\n */\nfunction doesFragmentConditionMatch(\n schema: GraphQLSchema,\n fragment: FragmentDefinitionNode | InlineFragmentNode,\n type: GraphQLObjectType,\n): boolean {\n const typeConditionNode = fragment.typeCondition;\n if (!typeConditionNode) {\n return true;\n }\n const conditionalType = typeFromAST(schema, typeConditionNode);\n if (conditionalType === type) {\n return true;\n }\n if (isAbstractType(conditionalType)) {\n return schema.isSubType(conditionalType, type);\n }\n return false;\n}\n\n/**\n * Implements the logic to compute the key of a given field's entry\n *\n * @internal\n */\nfunction getFieldEntryKey(node: FieldNode): string {\n return node.alias ? node.alias.value : node.name.value;\n}\n"]}