
import {
  type GraphQLType, __EnumValue, __Schema, __Type, __TypeKind,
} from "graphql";

import { createArg, modifyResolver } from "../utilities";

let once = false;

export function withAugmentedIntrospection ( ) {
  if (once) { return; } once = true;

  __Schema.getFields()["types"]!.args = [
    createArg({ name: "kind", type: __TypeKind, }),
  ];

  const resolver = __Type.getFields()["kind"]!.resolve as (
    type: GraphQLType
  ) => string;

  modifyResolver(__Schema.getFields()["types"]!,
    function filterByKind ( result, _source, args ) {
      if (!args.kind) { return result; }

      return (result as Array<GraphQLType>).filter(function filter (
        type: GraphQLType
      ): boolean { return args.kind === resolver(type); });
    });
}
