
import { DirectiveLocation, type GraphQLDirective } from "graphql";

export const isInternal: Readonly<Record<DirectiveLocation, boolean>> = {
  // Request Definitions
  [DirectiveLocation.QUERY]                 : false,
  [DirectiveLocation.MUTATION]              : false,
  [DirectiveLocation.SUBSCRIPTION]          : false,
  [DirectiveLocation.FIELD]                 : false,
  [DirectiveLocation.FRAGMENT_DEFINITION]   : false,
  [DirectiveLocation.FRAGMENT_SPREAD]       : false,
  [DirectiveLocation.INLINE_FRAGMENT]       : false,
  [DirectiveLocation.VARIABLE_DEFINITION]   : false,
  // Type System Definitions
  [DirectiveLocation.SCHEMA]                : true,
  [DirectiveLocation.SCALAR]                : true,
  [DirectiveLocation.OBJECT]                : true,
  [DirectiveLocation.FIELD_DEFINITION]      : true,
  [DirectiveLocation.ARGUMENT_DEFINITION]   : true,
  [DirectiveLocation.INTERFACE]             : true,
  [DirectiveLocation.UNION]                 : true,
  [DirectiveLocation.ENUM]                  : true,
  [DirectiveLocation.ENUM_VALUE]            : true,
  [DirectiveLocation.INPUT_OBJECT]          : true,
  [DirectiveLocation.INPUT_FIELD_DEFINITION]: true,
};

export function isInternalLocation ( location: DirectiveLocation ) {
  return isInternal[location];
}

export function isInternalDirective ( directive: GraphQLDirective ) {
  return directive.locations.every(isInternalLocation);
}
