{"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"]}