11import type { DocumentTypeDecoration } from "@graphql-typed-document-node/core" ;
22import { createSha256 , extractOperationName , pruneObject } from "helpers" ;
33
4- export type ModeFlags = "persisted" | "document" | "both" ;
5-
64export type DocumentIdFn = < TResult , TVariables > (
75 query : DocumentTypeDecoration < TResult , TVariables > ,
86) => string | undefined ;
97
108export type GraphQLRequest < TVariables > = {
11- mode : ModeFlags ;
129 operationName : string ;
1310 query : string | undefined ;
1411 documentId : string | undefined ;
1512 variables : TVariables | undefined ;
1613 extensions : Record < string , unknown > ;
14+ includeQuery : boolean ;
1715} ;
1816
19- export const isPersistedQuery = < T > ( request : GraphQLRequest < T > ) : boolean =>
20- request . mode === "persisted" || request . mode === "both" ;
17+ export const isPersistedQuery = < TVariables > (
18+ request : GraphQLRequest < TVariables > ,
19+ ) => {
20+ return request . documentId !== undefined ;
21+ } ;
2122
2223export const createRequestSearchParams = < TVariables > (
2324 request : GraphQLRequest < TVariables > ,
@@ -26,22 +27,18 @@ export const createRequestSearchParams = <TVariables>(
2627 op : request . operationName ,
2728 } ;
2829
29- if ( request . mode === "both" || request . mode === "persisted" ) {
30- if ( ! request . documentId ) {
31- throw new Error ( "Persisted query mode requires a documentId" ) ;
32- }
33- params . documentId = request . documentId ;
34- }
35-
3630 params = {
3731 ...params ,
3832 ...pruneObject ( {
33+ documentId : request . documentId ,
3934 variables : isNotEmpty ( request . variables )
4035 ? JSON . stringify ( request . variables )
4136 : undefined ,
42- extensions : isNotEmpty ( request . extensions )
43- ? JSON . stringify ( request . extensions )
44- : undefined ,
37+ extensions :
38+ isNotEmpty ( request . extensions ) &&
39+ ( ! request . documentId || request . includeQuery )
40+ ? JSON . stringify ( request . extensions )
41+ : undefined ,
4542 } ) ,
4643 } ;
4744 return new URLSearchParams ( params ) ;
@@ -66,53 +63,40 @@ export const createRequestURL = <TVariables>(
6663export const createRequestBody = < TVariables > (
6764 request : GraphQLRequest < TVariables > ,
6865) => {
69- switch ( request . mode ) {
70- case "both" :
71- return JSON . stringify (
72- pruneObject ( {
73- documentId : request . documentId ,
74- query : request . query ,
75- variables : request . variables ,
76- extensions : request . extensions ,
77- } ) ,
78- ) ;
79- case "document" :
80- return JSON . stringify (
81- pruneObject ( {
82- query : request . query ,
83- variables : request . variables ,
84- extensions : request . extensions ,
85- } ) ,
86- ) ;
87- case "persisted" :
88- if ( ! request . documentId ) {
89- throw new Error ( "Persisted query mode requires a documentId" ) ;
90- }
91- return JSON . stringify (
92- pruneObject ( {
93- documentId : request . documentId ,
94- variables : request . variables ,
95- extensions : request . extensions ,
96- } ) ,
97- ) ;
66+ if ( ! request . documentId || request . includeQuery ) {
67+ return JSON . stringify (
68+ pruneObject ( {
69+ documentId : request . documentId ,
70+ query : request . query ,
71+ variables : request . variables ,
72+ extensions : request . extensions ,
73+ } ) ,
74+ ) ;
9875 }
76+ return JSON . stringify (
77+ pruneObject ( {
78+ documentId : request . documentId ,
79+ variables : request . variables ,
80+ extensions : request . extensions ,
81+ } ) ,
82+ ) ;
9983} ;
10084
10185export const createRequest = async < TVariables > (
102- mode : ModeFlags ,
10386 query : string ,
10487 variables : TVariables ,
10588 documentId ?: string ,
89+ includeQuery ?: boolean ,
10690) : Promise < GraphQLRequest < TVariables > > => {
10791 const operationName = extractOperationName ( query ) || "(GraphQL)" ;
10892
10993 const request = {
110- mode,
11194 documentId,
11295 query,
11396 operationName,
11497 variables,
11598 extensions : { } ,
99+ includeQuery : includeQuery ?? false ,
116100 } ;
117101
118102 /**
@@ -122,7 +106,7 @@ export const createRequest = async <TVariables>(
122106 * Note that these are not the same hashes as the documentId, which is
123107 * used for allowlisting of query documents
124108 */
125- if ( mode === "document" || mode === "both" ) {
109+ if ( ! documentId || request . includeQuery ) {
126110 request . extensions = {
127111 persistedQuery : {
128112 version : 1 ,
0 commit comments