Simple functions for one-off GraphQL requests without maintaining client state. These functions are perfect for scripts and simple applications where you don't need persistent configuration or state management.
The primary static function for sending GraphQL documents. Returns only the data from the response, throwing errors if the GraphQL request fails.
/**
* Send a GraphQL document to a GraphQL server
* @param url - GraphQL endpoint URL
* @param document - GraphQL document (string or DocumentNode)
* @param variables - Optional variables for the query
* @param requestHeaders - Optional headers for the request
* @returns Promise resolving to the response data
*/
function request<T, V extends Variables = Variables>(
url: string,
document: RequestDocument | TypedDocumentNode<T, V>,
variables?: V,
requestHeaders?: HeadersInit
): Promise<T>;
/**
* Send a GraphQL document using an options object
* @param options - Complete request configuration
* @returns Promise resolving to the response data
*/
function request<T, V extends Variables = Variables>(
options: RequestExtendedOptions<V, T>
): Promise<T>;
interface RequestExtendedOptions<V extends Variables = Variables, T = unknown> {
url: string;
document: RequestDocument | TypedDocumentNode<T, V>;
requestHeaders?: HeadersInit;
signal?: RequestInit["signal"];
variables?: V;
}Usage Examples:
import { gql, request } from "graphql-request";
// Simple query with no variables
const query = gql`
{
users {
id
name
}
}
`;
const data = await request("https://api.example.com/graphql", query);
// Query with variables
const queryWithVariables = gql`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
const userData = await request(
"https://api.example.com/graphql",
queryWithVariables,
{ id: "123" }
);
// Using options object
const result = await request({
url: "https://api.example.com/graphql",
document: query,
requestHeaders: {
authorization: "Bearer TOKEN",
},
});
// Mutation example
const mutation = gql`
mutation CreateUser($input: CreateUserInput!) {
createUser(input: $input) {
id
name
}
}
`;
const newUser = await request(
"https://api.example.com/graphql",
mutation,
{
input: {
name: "John Doe",
email: "john@example.com",
},
}
);Convenience template tag for GraphQL documents that provides tooling support (syntax highlighting, formatting) without parsing overhead.
/**
* Template tag for GraphQL documents providing tooling support
* @param chunks - Template string parts
* @param variables - Interpolated variables
* @returns String with variables interpolated
*/
function gql(chunks: TemplateStringsArray, ...variables: unknown[]): string;Usage Examples:
import { gql, request } from "graphql-request";
// Basic usage - provides syntax highlighting and formatting
const query = gql`
query GetPosts($limit: Int!) {
posts(limit: $limit) {
id
title
content
author {
name
}
}
}
`;
// Variable interpolation
const fieldName = "description";
const dynamicQuery = gql`
{
products {
id
name
${fieldName}
}
}
`;
await request("https://api.example.com/graphql", query, { limit: 10 });Utility function for analyzing GraphQL documents to extract operation information.
/**
* Analyze a GraphQL document to extract metadata
* @param document - GraphQL document to analyze
* @param excludeOperationName - Skip operation name extraction for performance
* @returns Document analysis result
*/
function analyzeDocument(
document: RequestDocument,
excludeOperationName?: boolean
): DocumentAnalysis;
interface DocumentAnalysis {
expression: string;
operationName: string | undefined;
isMutation: boolean;
}Usage Examples:
import { gql, analyzeDocument } from "graphql-request";
const mutation = gql`
mutation CreatePost($title: String!) {
createPost(input: { title: $title }) {
id
title
}
}
`;
const analysis = analyzeDocument(mutation);
console.log(analysis.operationName); // "CreatePost"
console.log(analysis.isMutation); // true
// Performance optimization - skip operation name extraction
const fastAnalysis = analyzeDocument(mutation, true);
console.log(fastAnalysis.operationName); // undefinedtype Variables = object;
type RequestDocument = string | DocumentNode;
type VariablesAndRequestHeadersArgs<V extends Variables> = V extends Record<any, never>
? [variables?: V, requestHeaders?: HeadersInit]
: keyof RemoveIndex<V> extends never
? [variables?: V, requestHeaders?: HeadersInit]
: [variables: V, requestHeaders?: HeadersInit];