import type { RequestInstance } from "@hyper-fetch/core"; import { HttpMethods, stringifyQueryParams } from "@hyper-fetch/core"; import type { OperationDefinitionNode } from "graphql"; import { print, parse } from "graphql"; import type { GraphQlEndpointType } from "./adapter.types"; export const getRequestValues = (request: R) => { const isPostRequest = request.method === HttpMethods.POST; const query = request.endpoint; const variables = request.payload; const fullUrl = isPostRequest ? request.client.url : request.client.url + stringifyQueryParams({ query, variables }); const payload = isPostRequest ? JSON.stringify({ query, variables, }) : null; return { fullUrl, payload }; }; export const gqlEndpointMapper = (endpoint: E): string => { if (typeof endpoint === "string") { return endpoint; } return print(endpoint); }; export const gqlEndpointNameMapper = (endpoint: string): string => { try { const ast = parse(endpoint); const operationDefinition = ast.definitions.find( (def): def is OperationDefinitionNode => def.kind === "OperationDefinition", ); if (operationDefinition) { if (operationDefinition.name?.value) { return operationDefinition.name.value; } const selection = operationDefinition.selectionSet.selections[0]; if (selection?.kind === "Field") { return selection.name.value; } if (selection?.kind === "InlineFragment" && selection.typeCondition) { return selection.typeCondition.name.value; } } } catch { // We can ignore this error and just return some fallback } // Fallback for invalid gql queries or something else const clearedQuery = endpoint .replace(/(query|mutation|subscription)/, "") .replaceAll(/[{}().,:]/g, " ") .trim(); const [name] = clearedQuery.split(" "); return name || "graphql-request"; };