Gqtx
From https://github.com/sikanhe/gqtx
import { Gql, buildGraphQLSchema } from "gqtx";
enum Role {
Admin,
User,
}
type User = {
id: string;
role: Role;
name: string;
};
const users: User[] = [
{ id: "1", role: Role.Admin, name: "Sikan" },
{ id: "2", role: Role.User, name: "Nicole" },
];
// We can declare the app context type once, and it will
// be automatically inferred for all our resolvers
declare module "gqtx" {
interface GqlContext {
viewerId: number;
users: User[];
}
}
const RoleEnum = Gql.Enum({
name: "Role",
description: "A user role",
values: [
{ name: "Admin", value: Role.Admin },
{ name: "User", value: Role.User },
],
});
const UserType = Gql.Object<User>({
name: "User",
description: "A User",
fields: () => [
Gql.Field({ name: "id", type: Gql.NonNull(Gql.ID) }),
Gql.Field({ name: "role", type: Gql.NonNull(RoleEnum) }),
Gql.Field({ name: "name", type: Gql.NonNull(Gql.String) }),
],
});
const Query = Gql.Query({
fields: [
Gql.Field({
name: "userById",
type: UserType,
args: {
id: Gql.Arg({ type: Gql.NonNullInput(Gql.ID) }),
},
resolve: (_, args, ctx) => {
// `args` is automatically inferred as { id: string }
// `ctx` (context) is also automatically inferred as { viewerId: number, users: User[] }
const user = ctx.users.find((u) => u.id === args.id);
// Also ensures we return an `User | null | undefined` type
return user;
},
}),
],
});
const schema = buildGraphQLSchema({
query: Query,
});
Grats
import { ID } from "grats";
import { getSchema } from "./schema"; // Generated by Grats
/**
* A user role
* @gqlEnum
*/
enum Role {
Admin = "Admin",
User = "User",
}
/** @gqlType */
type User = {
/** @gqlField */
id: ID;
/** @gqlField */
role: Role;
/** @gqlField */
name: string;
};
const users: User[] = [
{ id: "1", role: Role.Admin, name: "Sikan" },
{ id: "2", role: Role.User, name: "Nicole" },
];
interface GqlContext {
viewerId: number;
users: User[];
}
/** @gqlType */
type Query = unknown;
/** @gqlField */
export function userById(
_: Query,
args: { id: string },
ctx: GqlContext,
): User | null {
return users.find((u) => u.id === args.id) || null;
}
const schema = getSchema();