From 050fe0b808ec34a54211794a3dd1886fd79f17c6 Mon Sep 17 00:00:00 2001 From: tsnobip Date: Thu, 27 Nov 2025 12:18:57 +0100 Subject: [PATCH 1/4] use optional fields for refetch variables --- packages/relay | 2 +- .../TestAliasedFragmentsQuery_graphql.res | 4 ++-- .../__generated__/TestCodesplitQuery_graphql.res | 4 ++-- .../TestConnectionsQuery_graphql.res | 4 ++-- .../TestCustomScalarsQuery_graphql.res | 8 ++++---- .../TestInputUnionQuery_graphql.res | 4 ++-- ...LocalPayloadViaNodeInterfaceQuery_graphql.res | 4 ++-- .../TestPaginationInNodeQuery_graphql.res | 4 ++-- .../TestPaginationInNodeRefetchQuery_graphql.res | 16 ++++++++-------- .../TestPaginationUnionQuery_graphql.res | 4 ++-- .../TestPaginationUnionRefetchQuery_graphql.res | 16 ++++++++-------- ...refetchablePaginationRefetchQuery_graphql.res | 12 ++++++------ .../TestQueryInputObjectsQuery_graphql.res | 4 ++-- .../__generated__/TestQuery_graphql.res | 4 ++-- .../TestRefetchingInNodeQuery_graphql.res | 8 ++++---- .../TestRefetchingInNodeRefetchQuery_graphql.res | 12 ++++++------ .../TestRefetchingQuery_graphql.res | 4 ++-- .../TestRefetchingRefetchQuery_graphql.res | 16 ++++++++-------- .../__generated__/TestUpdatableQuery_graphql.res | 4 ++-- .../__generated__/TestPreloadedQuery_graphql.res | 4 ++-- 20 files changed, 69 insertions(+), 69 deletions(-) diff --git a/packages/relay b/packages/relay index 9296be1f..91a9680c 160000 --- a/packages/relay +++ b/packages/relay @@ -1 +1 @@ -Subproject commit 9296be1f6fa7b8fd9fd326d556b20222b04c331e +Subproject commit 91a9680c8fd5d33598e117644412755513c08924 diff --git a/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res index 69b1f07a..293316b5 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res @@ -19,12 +19,12 @@ module Types = { } @live type refetchVariables = { - skipThing: option, + skipThing?: bool, } @live let makeRefetchVariables = ( ~skipThing=?, ): refetchVariables => { - skipThing: skipThing + skipThing: ?skipThing } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res index 21db2265..ae4a4053 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res @@ -33,12 +33,12 @@ module Types = { } @live type refetchVariables = { - includeBestFriendDescription: option, + includeBestFriendDescription?: bool, } @live let makeRefetchVariables = ( ~includeBestFriendDescription=?, ): refetchVariables => { - includeBestFriendDescription: includeBestFriendDescription + includeBestFriendDescription: ?includeBestFriendDescription } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res index 00c188e8..2c877f79 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res @@ -18,12 +18,12 @@ module Types = { } @live type refetchVariables = { - beforeDate: option, + beforeDate?: TestsUtils.Datetime.t, } @live let makeRefetchVariables = ( ~beforeDate=?, ): refetchVariables => { - beforeDate: beforeDate + beforeDate: ?beforeDate } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res index 042cad39..870857e7 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res @@ -32,15 +32,15 @@ module Types = { } @live type refetchVariables = { - beforeDate: option>, - number: option, + beforeDate?: option, + number?: TestsUtils.Number.t, } @live let makeRefetchVariables = ( ~beforeDate=?, ~number=?, ): refetchVariables => { - beforeDate: beforeDate, - number: number + beforeDate: ?beforeDate, + number: ?number } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res index 497004ad..3bb7cacf 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res @@ -18,12 +18,12 @@ module Types = { } @live type refetchVariables = { - location: option, + location?: location, } @live let makeRefetchVariables = ( ~location=?, ): refetchVariables => { - location: location + location: ?location } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res index 86d036ff..13d059da 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res @@ -83,12 +83,12 @@ module Types = { } @live type refetchVariables = { - @live id: option, + @live id?: string, } @live let makeRefetchVariables = ( ~id=?, ): refetchVariables => { - id: id + id: ?id } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res index 75520b28..75f623f6 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res @@ -20,12 +20,12 @@ module Types = { } @live type refetchVariables = { - userId: option, + userId?: string, } @live let makeRefetchVariables = ( ~userId=?, ): refetchVariables => { - userId: userId + userId: ?userId } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res index a6eee2dc..faac0330 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res @@ -24,10 +24,10 @@ module Types = { } @live type refetchVariables = { - count: option>, - cursor: option>, - @live id: option, - onlineStatuses: option>>, + count?: option, + cursor?: option, + @live id?: string, + onlineStatuses?: option>, } @live let makeRefetchVariables = ( ~count=?, @@ -35,10 +35,10 @@ module Types = { ~id=?, ~onlineStatuses=?, ): refetchVariables => { - count: count, - cursor: cursor, - id: id, - onlineStatuses: onlineStatuses + count: ?count, + cursor: ?cursor, + id: ?id, + onlineStatuses: ?onlineStatuses } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res index 0ae7862e..b07dbef4 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res @@ -15,12 +15,12 @@ module Types = { } @live type refetchVariables = { - groupId: option, + groupId?: string, } @live let makeRefetchVariables = ( ~groupId=?, ): refetchVariables => { - groupId: groupId + groupId: ?groupId } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res index 4b31b7c2..a7438813 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res @@ -19,10 +19,10 @@ module Types = { } @live type refetchVariables = { - count: option>, - cursor: option>, - groupId: option, - onlineStatuses: option>>, + count?: option, + cursor?: option, + groupId?: string, + onlineStatuses?: option>, } @live let makeRefetchVariables = ( ~count=?, @@ -30,10 +30,10 @@ module Types = { ~groupId=?, ~onlineStatuses=?, ): refetchVariables => { - count: count, - cursor: cursor, - groupId: groupId, - onlineStatuses: onlineStatuses + count: ?count, + cursor: ?cursor, + groupId: ?groupId, + onlineStatuses: ?onlineStatuses } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res index aa056425..53215b62 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res @@ -23,18 +23,18 @@ module Types = { } @live type refetchVariables = { - count: option>, - cursor: option>, - @live id: option, + count?: option, + cursor?: option, + @live id?: string, } @live let makeRefetchVariables = ( ~count=?, ~cursor=?, ~id=?, ): refetchVariables => { - count: count, - cursor: cursor, - id: id + count: ?count, + cursor: ?cursor, + id: ?id } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res index bccf7044..96258848 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res @@ -16,12 +16,12 @@ module Types = { } @live type refetchVariables = { - input: option, + input?: searchInput, } @live let makeRefetchVariables = ( ~input=?, ): refetchVariables => { - input: input + input: ?input } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res index 27b50628..3b8db4ff 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res @@ -26,12 +26,12 @@ module Types = { } @live type refetchVariables = { - status: option>, + status?: option, } @live let makeRefetchVariables = ( ~status=?, ): refetchVariables => { - status: status + status: ?status } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res index c464a9eb..0b5e84fa 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res @@ -24,15 +24,15 @@ module Types = { } @live type refetchVariables = { - friendsOnlineStatuses: option>>, - userId: option, + friendsOnlineStatuses?: option>, + userId?: string, } @live let makeRefetchVariables = ( ~friendsOnlineStatuses=?, ~userId=?, ): refetchVariables => { - friendsOnlineStatuses: friendsOnlineStatuses, - userId: userId + friendsOnlineStatuses: ?friendsOnlineStatuses, + userId: ?userId } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res index 418a3599..67f6935b 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res @@ -23,18 +23,18 @@ module Types = { } @live type refetchVariables = { - friendsOnlineStatuses: option>>, - @live id: option, - showOnlineStatus: option>, + friendsOnlineStatuses?: option>, + @live id?: string, + showOnlineStatus?: option, } @live let makeRefetchVariables = ( ~friendsOnlineStatuses=?, ~id=?, ~showOnlineStatus=?, ): refetchVariables => { - friendsOnlineStatuses: friendsOnlineStatuses, - id: id, - showOnlineStatus: showOnlineStatus + friendsOnlineStatuses: ?friendsOnlineStatuses, + id: ?id, + showOnlineStatus: ?showOnlineStatus } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res index 7c06c26c..988bbb32 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res @@ -18,12 +18,12 @@ module Types = { } @live type refetchVariables = { - beforeDate: option>, + beforeDate?: option, } @live let makeRefetchVariables = ( ~beforeDate=?, ): refetchVariables => { - beforeDate: beforeDate + beforeDate: ?beforeDate } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res index 50c8837e..1294fbc7 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res @@ -24,10 +24,10 @@ module Types = { } @live type refetchVariables = { - beforeDate: option>, - friendsOnlineStatuses: option>>, - @live id: option, - showOnlineStatus: option>, + beforeDate?: option, + friendsOnlineStatuses?: option>, + @live id?: string, + showOnlineStatus?: option, } @live let makeRefetchVariables = ( ~beforeDate=?, @@ -35,10 +35,10 @@ module Types = { ~id=?, ~showOnlineStatus=?, ): refetchVariables => { - beforeDate: beforeDate, - friendsOnlineStatuses: friendsOnlineStatuses, - id: id, - showOnlineStatus: showOnlineStatus + beforeDate: ?beforeDate, + friendsOnlineStatuses: ?friendsOnlineStatuses, + id: ?id, + showOnlineStatus: ?showOnlineStatus } } diff --git a/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res index d2029ee5..da75e9d3 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res @@ -23,12 +23,12 @@ module Types = { } @live type refetchVariables = { - @live id: option, + @live id?: string, } @live let makeRefetchVariables = ( ~id=?, ): refetchVariables => { - id: id + id: ?id } } diff --git a/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_graphql.res b/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_graphql.res index bb004541..dd575f06 100644 --- a/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_graphql.res +++ b/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_graphql.res @@ -33,12 +33,12 @@ module Types = { } @live type refetchVariables = { - status: option>, + status?: option, } @live let makeRefetchVariables = ( ~status=?, ): refetchVariables => { - status: status + status: ?status } } From 49377c70e39c0555ad6d40190158b73491f80073 Mon Sep 17 00:00:00 2001 From: tsnobip Date: Fri, 5 Dec 2025 17:46:51 +0100 Subject: [PATCH 2/4] add more tests for refetchVariables --- .../__tests__/Test_refetching-tests.js | 5 +- .../__tests__/Test_refetching.res | 10 ++- .../TestRefetchingQuery_graphql.res | 75 +++++++++++++++---- .../TestRefetchingRefetchQuery_graphql.res | 51 +++++++++---- .../TestRefetching_user_graphql.res | 10 +++ .../src/RescriptRelay_Internal.res | 2 +- 6 files changed, 117 insertions(+), 36 deletions(-) diff --git a/packages/rescript-relay/__tests__/Test_refetching-tests.js b/packages/rescript-relay/__tests__/Test_refetching-tests.js index 865f64ed..b3a00d83 100644 --- a/packages/rescript-relay/__tests__/Test_refetching-tests.js +++ b/packages/rescript-relay/__tests__/Test_refetching-tests.js @@ -10,12 +10,12 @@ describe("Fragment", () => { test("refetching works", async () => { queryMock.mockQuery({ name: "TestRefetchingQuery", - variables: { beforeDate: "2023-01-01T00:00:00.000Z" }, + variables: { beforeDate: "2023-01-01T00:00:00.000Z", showOnlineStatus: true, number: 10 }, data: { loggedInUser: { id: "user-1", firstName: "First", - onlineStatus: null, + onlineStatus: "offline", friendsConnection: { totalCount: 20, }, @@ -40,6 +40,7 @@ describe("Fragment", () => { showOnlineStatus: true, friendsOnlineStatuses: ["Online", "offline"], beforeDate: null, + number:10, }, data: { node: { diff --git a/packages/rescript-relay/__tests__/Test_refetching.res b/packages/rescript-relay/__tests__/Test_refetching.res index eb2ca824..d8da9d67 100644 --- a/packages/rescript-relay/__tests__/Test_refetching.res +++ b/packages/rescript-relay/__tests__/Test_refetching.res @@ -1,8 +1,10 @@ module Query = %relay(` - query TestRefetchingQuery($beforeDate: Datetime) { + query TestRefetchingQuery($beforeDate: Datetime, $number: Number, $showOnlineStatus: Boolean!) { loggedInUser { ...TestRefetching_user @arguments( beforeDate: $beforeDate + number: $number + showOnlineStatus: $showOnlineStatus ) } } @@ -15,13 +17,14 @@ module Fragment = %relay(` friendsOnlineStatuses: { type: "[OnlineStatus!]" } showOnlineStatus: { type: "Boolean", defaultValue: false } beforeDate: { type: "Datetime" } + number: { type: "Number" } ) { firstName onlineStatus @include(if: $showOnlineStatus) friendsConnection(statuses: $friendsOnlineStatuses) { totalCount } - friends(beforeDate: $beforeDate) { + friends(beforeDate: $beforeDate, number: $number) { id } } @@ -43,6 +46,8 @@ module Test = { let query = Query.use( ~variables={ beforeDate: Date.fromString("2023-01-01T00:00:00.000Z"), + showOnlineStatus: true, + number: [10], }, ) @@ -65,7 +70,6 @@ module Test = { startTransition(() => { refetch( ~variables=Fragment.makeRefetchVariables( - ~showOnlineStatus=Some(true), ~friendsOnlineStatuses=Some([Online, Offline]), ~beforeDate=None, ), diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res index 988bbb32..0abff77c 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res @@ -15,15 +15,23 @@ module Types = { @live type variables = { beforeDate?: TestsUtils.Datetime.t, + number?: TestsUtils.Number.t, + showOnlineStatus: bool, } @live type refetchVariables = { beforeDate?: option, + number?: option, + showOnlineStatus?: bool, } @live let makeRefetchVariables = ( ~beforeDate=?, + ~number=?, + ~showOnlineStatus=?, ): refetchVariables => { - beforeDate: ?beforeDate + beforeDate: ?beforeDate, + number: ?number, + showOnlineStatus: ?showOnlineStatus } } @@ -34,11 +42,12 @@ type queryRef module Internal = { @live let variablesConverter: dict>> = %raw( - json`{"__root":{"beforeDate":{"c":"TestsUtils.Datetime"}}}` + json`{"__root":{"number":{"c":"TestsUtils.Number"},"beforeDate":{"c":"TestsUtils.Datetime"}}}` ) @live let variablesConverterMap = { "TestsUtils.Datetime": TestsUtils.Datetime.serialize, + "TestsUtils.Number": TestsUtils.Number.serialize, } @live let convertVariables = v => v->RescriptRelay.convertObj( @@ -98,16 +107,29 @@ var v0 = [ "defaultValue": null, "kind": "LocalArgument", "name": "beforeDate" - } -], -v1 = [ + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" + }, { - "kind": "Variable", - "name": "beforeDate", - "variableName": "beforeDate" + "defaultValue": null, + "kind": "LocalArgument", + "name": "showOnlineStatus" } ], +v1 = { + "kind": "Variable", + "name": "beforeDate", + "variableName": "beforeDate" +}, v2 = { + "kind": "Variable", + "name": "number", + "variableName": "number" +}, +v3 = { "alias": null, "args": null, "kind": "ScalarField", @@ -130,7 +152,15 @@ return { "plural": false, "selections": [ { - "args": (v1/*: any*/), + "args": [ + (v1/*: any*/), + (v2/*: any*/), + { + "kind": "Variable", + "name": "showOnlineStatus", + "variableName": "showOnlineStatus" + } + ], "kind": "FragmentSpread", "name": "TestRefetching_user" } @@ -162,6 +192,20 @@ return { "name": "firstName", "storageKey": null }, + { + "condition": "showOnlineStatus", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "onlineStatus", + "storageKey": null + } + ] + }, { "alias": null, "args": null, @@ -182,29 +226,32 @@ return { }, { "alias": null, - "args": (v1/*: any*/), + "args": [ + (v1/*: any*/), + (v2/*: any*/) + ], "concreteType": "User", "kind": "LinkedField", "name": "friends", "plural": true, "selections": [ - (v2/*: any*/) + (v3/*: any*/) ], "storageKey": null }, - (v2/*: any*/) + (v3/*: any*/) ], "storageKey": null } ] }, "params": { - "cacheID": "c6ca14e8318dbc1d7e27af6e2cef078f", + "cacheID": "3bd1e8bddc99b7cc3c3a34d21038c550", "id": null, "metadata": {}, "name": "TestRefetchingQuery", "operationKind": "query", - "text": "query TestRefetchingQuery(\n $beforeDate: Datetime\n) {\n loggedInUser {\n ...TestRefetching_user_3xCS8w\n id\n }\n}\n\nfragment TestRefetching_user_3xCS8w on User {\n firstName\n friendsConnection {\n totalCount\n }\n friends(beforeDate: $beforeDate) {\n id\n }\n id\n}\n" + "text": "query TestRefetchingQuery(\n $beforeDate: Datetime\n $number: Number\n $showOnlineStatus: Boolean!\n) {\n loggedInUser {\n ...TestRefetching_user_1LqbfJ\n id\n }\n}\n\nfragment TestRefetching_user_1LqbfJ on User {\n firstName\n onlineStatus @include(if: $showOnlineStatus)\n friendsConnection {\n totalCount\n }\n friends(beforeDate: $beforeDate, number: $number) {\n id\n }\n id\n}\n" } }; })() `) diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res index 1294fbc7..f146b217 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res @@ -20,6 +20,7 @@ module Types = { beforeDate?: TestsUtils.Datetime.t, friendsOnlineStatuses?: array, @live id: string, + number?: TestsUtils.Number.t, showOnlineStatus?: bool, } @live @@ -27,17 +28,20 @@ module Types = { beforeDate?: option, friendsOnlineStatuses?: option>, @live id?: string, + number?: option, showOnlineStatus?: option, } @live let makeRefetchVariables = ( ~beforeDate=?, ~friendsOnlineStatuses=?, ~id=?, + ~number=?, ~showOnlineStatus=?, ): refetchVariables => { beforeDate: ?beforeDate, friendsOnlineStatuses: ?friendsOnlineStatuses, id: ?id, + number: ?number, showOnlineStatus: ?showOnlineStatus } @@ -49,11 +53,12 @@ type queryRef module Internal = { @live let variablesConverter: dict>> = %raw( - json`{"__root":{"beforeDate":{"c":"TestsUtils.Datetime"}}}` + json`{"__root":{"number":{"c":"TestsUtils.Number"},"beforeDate":{"c":"TestsUtils.Datetime"}}}` ) @live let variablesConverterMap = { "TestsUtils.Datetime": TestsUtils.Datetime.serialize, + "TestsUtils.Number": TestsUtils.Number.serialize, } @live let convertVariables = v => v->RescriptRelay.convertObj( @@ -139,30 +144,40 @@ v2 = { "name": "id" }, v3 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" +}, +v4 = { "defaultValue": false, "kind": "LocalArgument", "name": "showOnlineStatus" }, -v4 = [ +v5 = [ { "kind": "Variable", "name": "id", "variableName": "id" } ], -v5 = { +v6 = { "alias": null, "args": null, "kind": "ScalarField", "name": "__typename", "storageKey": null }, -v6 = { +v7 = { "kind": "Variable", "name": "beforeDate", "variableName": "beforeDate" }, -v7 = { +v8 = { + "kind": "Variable", + "name": "number", + "variableName": "number" +}, +v9 = { "alias": null, "args": null, "kind": "ScalarField", @@ -175,7 +190,8 @@ return { (v0/*: any*/), (v1/*: any*/), (v2/*: any*/), - (v3/*: any*/) + (v3/*: any*/), + (v4/*: any*/) ], "kind": "Fragment", "metadata": null, @@ -183,21 +199,22 @@ return { "selections": [ { "alias": null, - "args": (v4/*: any*/), + "args": (v5/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", "plural": false, "selections": [ - (v5/*: any*/), + (v6/*: any*/), { "args": [ - (v6/*: any*/), + (v7/*: any*/), { "kind": "Variable", "name": "friendsOnlineStatuses", "variableName": "friendsOnlineStatuses" }, + (v8/*: any*/), { "kind": "Variable", "name": "showOnlineStatus", @@ -220,6 +237,7 @@ return { (v0/*: any*/), (v1/*: any*/), (v3/*: any*/), + (v4/*: any*/), (v2/*: any*/) ], "kind": "Operation", @@ -227,14 +245,14 @@ return { "selections": [ { "alias": null, - "args": (v4/*: any*/), + "args": (v5/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", "plural": false, "selections": [ - (v5/*: any*/), - (v7/*: any*/), + (v6/*: any*/), + (v9/*: any*/), { "kind": "InlineFragment", "selections": [ @@ -272,14 +290,15 @@ return { { "alias": null, "args": [ - (v6/*: any*/) + (v7/*: any*/), + (v8/*: any*/) ], "concreteType": "User", "kind": "LinkedField", "name": "friends", "plural": true, "selections": [ - (v7/*: any*/) + (v9/*: any*/) ], "storageKey": null }, @@ -307,12 +326,12 @@ return { ] }, "params": { - "cacheID": "96b532bc34e59747ed5f0218df680f03", + "cacheID": "b9df0a6da4d2b173b69055029ae0e779", "id": null, "metadata": {}, "name": "TestRefetchingRefetchQuery", "operationKind": "query", - "text": "query TestRefetchingRefetchQuery(\n $beforeDate: Datetime\n $friendsOnlineStatuses: [OnlineStatus!]\n $showOnlineStatus: Boolean = false\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TestRefetching_user_1E7e32\n id\n }\n}\n\nfragment TestRefetching_user_1E7e32 on User {\n firstName\n onlineStatus @include(if: $showOnlineStatus)\n friendsConnection(statuses: $friendsOnlineStatuses) {\n totalCount\n }\n friends(beforeDate: $beforeDate) {\n id\n }\n id\n}\n" + "text": "query TestRefetchingRefetchQuery(\n $beforeDate: Datetime\n $friendsOnlineStatuses: [OnlineStatus!]\n $number: Number\n $showOnlineStatus: Boolean = false\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TestRefetching_user_2VpWUn\n id\n }\n}\n\nfragment TestRefetching_user_2VpWUn on User {\n firstName\n onlineStatus @include(if: $showOnlineStatus)\n friendsConnection(statuses: $friendsOnlineStatuses) {\n totalCount\n }\n friends(beforeDate: $beforeDate, number: $number) {\n id\n }\n id\n}\n" } }; })() `) diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetching_user_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetching_user_graphql.res index 68228fdc..a4c72777 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetching_user_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetching_user_graphql.res @@ -87,6 +87,11 @@ return { "kind": "LocalArgument", "name": "friendsOnlineStatuses" }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" + }, { "defaultValue": false, "kind": "LocalArgument", @@ -161,6 +166,11 @@ return { "kind": "Variable", "name": "beforeDate", "variableName": "beforeDate" + }, + { + "kind": "Variable", + "name": "number", + "variableName": "number" } ], "concreteType": "User", diff --git a/packages/rescript-relay/src/RescriptRelay_Internal.res b/packages/rescript-relay/src/RescriptRelay_Internal.res index 2b9d71a3..b0a2464b 100644 --- a/packages/rescript-relay/src/RescriptRelay_Internal.res +++ b/packages/rescript-relay/src/RescriptRelay_Internal.res @@ -20,8 +20,8 @@ let internal_cleanObjectFromUndefinedRaw = record => let internal_removeUndefinedAndConvertNullsRaw = record => internal_keepMapFieldsRaw(record, ((key, value)) => { switch (value, value == Some(None)) { - | (Some(value), _) => Some((key, Nullable.make(value))) | (_, true) => Some((key, Nullable.null)) + | (Some(value), _) => Some((key, Nullable.make(value))) | (None, _) => None } }) From 21c6af709fced561b0cb727810af6a4022524049 Mon Sep 17 00:00:00 2001 From: tsnobip Date: Fri, 5 Dec 2025 17:48:05 +0100 Subject: [PATCH 3/4] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb23cd80..6d344ab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # master +- Fix behavior of `refetchVariables` on optional variables. https://github.com/zth/rescript-relay/pull/588 + # 4.1.0 - Add support for `autoExhaustiveTypes` config and a `@nonExhaustive` directive to control automatic exhaustive checks for unions/interfaces. From 1b350234ffdb7c9a3854b5e3c99868a8e0e631d2 Mon Sep 17 00:00:00 2001 From: tsnobip Date: Sun, 7 Dec 2025 16:51:20 +0100 Subject: [PATCH 4/4] add refetching tests with record for refetchVariables --- .../__tests__/Test_refetchingRecord-tests.js | 73 ++++ .../__tests__/Test_refetchingRecord.res | 98 +++++ ...tchingRecordNoArgsRefetchQuery_graphql.res | 174 ++++++++ ...stRefetchingRecordNoArgs_query_graphql.res | 84 ++++ .../TestRefetchingRecordQuery_graphql.res | 299 ++++++++++++++ ...stRefetchingRecordRefetchQuery_graphql.res | 379 ++++++++++++++++++ .../TestRefetchingRecord_user_graphql.res | 193 +++++++++ 7 files changed, 1300 insertions(+) create mode 100644 packages/rescript-relay/__tests__/Test_refetchingRecord-tests.js create mode 100644 packages/rescript-relay/__tests__/Test_refetchingRecord.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgsRefetchQuery_graphql.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgs_query_graphql.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordQuery_graphql.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordRefetchQuery_graphql.res create mode 100644 packages/rescript-relay/__tests__/__generated__/TestRefetchingRecord_user_graphql.res diff --git a/packages/rescript-relay/__tests__/Test_refetchingRecord-tests.js b/packages/rescript-relay/__tests__/Test_refetchingRecord-tests.js new file mode 100644 index 00000000..1e0101bf --- /dev/null +++ b/packages/rescript-relay/__tests__/Test_refetchingRecord-tests.js @@ -0,0 +1,73 @@ +require("@testing-library/jest-dom/extend-expect"); +const t = require("@testing-library/react"); +const React = require("react"); +const queryMock = require("./queryMock"); +const ReactTestUtils = require("react-dom/test-utils"); + +const { test_refetching } = require("./Test_refetchingRecord.bs"); + +describe("Fragment", () => { + test("refetching works when using a record for refetchVariables", async () => { + queryMock.mockQuery({ + name: "TestRefetchingRecordQuery", + variables: { beforeDate: "2023-01-01T00:00:00.000Z", showOnlineStatus: true, number: 10 }, + data: { + loggedInUser: { + id: "user-1", + firstName: "First", + onlineStatus: "offline", + friendsConnection: { + totalCount: 20, + }, + friends: [ + { + id: "user-2", + }, + ], + }, + }, + }); + + t.render(test_refetching()); + + await t.screen.findByText("First is -"); + await t.screen.findByText("Friends: 20"); + + queryMock.mockQuery({ + name: "TestRefetchingRecordRefetchQuery", + variables: { + id: "user-1", + showOnlineStatus: true, + friendsOnlineStatuses: ["Online", "offline"], + beforeDate: null, + number:10, + }, + data: { + node: { + __typename: "User", + id: "user-1", + firstName: "First", + onlineStatus: "Online", + friendsConnection: { + totalCount: 10, + }, + friends: [ + { + id: "user-2", + }, + { + id: "user-3", + }, + ], + }, + }, + }); + + ReactTestUtils.act(() => { + t.fireEvent.click(t.screen.getByText("Fetch online status")); + }); + + await t.screen.findByText("First is online"); + await t.screen.findByText("Friends: 10"); + }); +}); diff --git a/packages/rescript-relay/__tests__/Test_refetchingRecord.res b/packages/rescript-relay/__tests__/Test_refetchingRecord.res new file mode 100644 index 00000000..723875bb --- /dev/null +++ b/packages/rescript-relay/__tests__/Test_refetchingRecord.res @@ -0,0 +1,98 @@ +module Query = %relay(` + query TestRefetchingRecordQuery($beforeDate: Datetime, $number: Number, $showOnlineStatus: Boolean!) { + loggedInUser { + ...TestRefetchingRecord_user @arguments( + beforeDate: $beforeDate + number: $number + showOnlineStatus: $showOnlineStatus + ) + } + } +`) + +module Fragment = %relay(` + fragment TestRefetchingRecord_user on User + @refetchable(queryName: "TestRefetchingRecordRefetchQuery") + @argumentDefinitions( + friendsOnlineStatuses: { type: "[OnlineStatus!]" } + showOnlineStatus: { type: "Boolean", defaultValue: false } + beforeDate: { type: "Datetime" } + number: { type: "Number" } + ) { + firstName + onlineStatus @include(if: $showOnlineStatus) + friendsConnection(statuses: $friendsOnlineStatuses) { + totalCount + } + friends(beforeDate: $beforeDate, number: $number) { + id + } + } +`) + +module FragmentWithNoArgs = %relay(` + fragment TestRefetchingRecordNoArgs_query on Query + @refetchable(queryName: "TestRefetchingRecordNoArgsRefetchQuery") + { + loggedInUser { + id + } + } +`) + +module Test = { + @react.component + let make = () => { + let query = Query.use( + ~variables={ + beforeDate: Date.fromString("2023-01-01T00:00:00.000Z"), + showOnlineStatus: true, + number: [10], + }, + ) + + let (data, refetch) = Fragment.useRefetchable(query.loggedInUser.fragmentRefs) + + let (_, startTransition) = React.useTransition() + +
+ {React.string( + data.firstName ++ + (" is " ++ + switch data.onlineStatus { + | Some(Online) => "online" + | _ => "-" + }), + )} +
{React.string("Friends: " ++ data.friendsConnection.totalCount->Int.toString)}
+ +
+ } +} + +@live +let test_refetching = () => { + let network = RescriptRelay.Network.makePromiseBased(~fetchFunction=RelayEnv.fetchQuery) + + let environment = RescriptRelay.Environment.make( + ~network, + ~store=RescriptRelay.Store.make(~source=RescriptRelay.RecordSource.make()), + ) + + + + +} diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgsRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgsRefetchQuery_graphql.res new file mode 100644 index 00000000..9ef6c472 --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgsRefetchQuery_graphql.res @@ -0,0 +1,174 @@ +/* @sourceLoc Test_refetchingRecord.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + @live + type response = { + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestRefetchingRecordNoArgs_query]>, + } + @live + type rawResponse = response + @live + type variables = unit + @live + type refetchVariables = unit + @live let makeRefetchVariables = () => () +} + + +type queryRef + +module Internal = { + @live + let variablesConverter: dict>> = %raw( + json`{}` + ) + @live + let variablesConverterMap = () + @live + let convertVariables = v => v->RescriptRelay.convertObj( + variablesConverter, + variablesConverterMap, + None + ) + @live + type wrapResponseRaw + @live + let wrapResponseConverter: dict>> = %raw( + json`{"__root":{"":{"f":""}}}` + ) + @live + let wrapResponseConverterMap = () + @live + let convertWrapResponse = v => v->RescriptRelay.convertObj( + wrapResponseConverter, + wrapResponseConverterMap, + null + ) + @live + type responseRaw + @live + let responseConverter: dict>> = %raw( + json`{"__root":{"":{"f":""}}}` + ) + @live + let responseConverterMap = () + @live + let convertResponse = v => v->RescriptRelay.convertObj( + responseConverter, + responseConverterMap, + None + ) + type wrapRawResponseRaw = wrapResponseRaw + @live + let convertWrapRawResponse = convertWrapResponse + type rawResponseRaw = responseRaw + @live + let convertRawResponse = convertResponse + type rawPreloadToken<'response> = {source: Nullable.t>} + external tokenToRaw: queryRef => rawPreloadToken = "%identity" +} +module Utils = { + @@warning("-33") + open Types +} + +type relayOperationNode +type operationType = RescriptRelay.queryNode + + +let node: operationType = %raw(json` { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TestRefetchingRecordNoArgsRefetchQuery", + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "TestRefetchingRecordNoArgs_query" + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "TestRefetchingRecordNoArgsRefetchQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "loggedInUser", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "a54c3435e7d0f924531f3bfe73265447", + "id": null, + "metadata": {}, + "name": "TestRefetchingRecordNoArgsRefetchQuery", + "operationKind": "query", + "text": "query TestRefetchingRecordNoArgsRefetchQuery {\n ...TestRefetchingRecordNoArgs_query\n}\n\nfragment TestRefetchingRecordNoArgs_query on Query {\n loggedInUser {\n id\n }\n}\n" + } +} `) + +@live let load: ( + ~environment: RescriptRelay.Environment.t, + ~variables: Types.variables, + ~fetchPolicy: RescriptRelay.fetchPolicy=?, + ~fetchKey: string=?, + ~networkCacheConfig: RescriptRelay.cacheConfig=?, +) => queryRef = ( + ~environment, + ~variables, + ~fetchPolicy=?, + ~fetchKey=?, + ~networkCacheConfig=?, +) => + RescriptRelayReact.loadQuery( + environment, + node, + variables->Internal.convertVariables, + { + fetchKey, + fetchPolicy, + networkCacheConfig, + }, + ) + +@live +let queryRefToObservable = token => { + let raw = token->Internal.tokenToRaw + raw.source->Nullable.toOption +} + +@live +let queryRefToPromise = token => { + Promise.make((resolve, _reject) => { + switch token->queryRefToObservable { + | None => resolve(Error()) + | Some(o) => + open RescriptRelay.Observable + let _: subscription = o->subscribe(makeObserver(~complete=() => resolve(Ok()))) + } + }) +} diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgs_query_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgs_query_graphql.res new file mode 100644 index 00000000..a39e76d1 --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgs_query_graphql.res @@ -0,0 +1,84 @@ +/* @sourceLoc Test_refetchingRecord.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + type rec fragment_loggedInUser = { + @live id: string, + } + type fragment = { + loggedInUser: fragment_loggedInUser, + } +} + +module Internal = { + @live + type fragmentRaw + @live + let fragmentConverter: dict>> = %raw( + json`{}` + ) + @live + let fragmentConverterMap = () + @live + let convertFragment = v => v->RescriptRelay.convertObj( + fragmentConverter, + fragmentConverterMap, + None + ) +} + +type t +type fragmentRef +external getFragmentRef: + RescriptRelay.fragmentRefs<[> | #TestRefetchingRecordNoArgs_query]> => fragmentRef = "%identity" + +module Utils = { + @@warning("-33") + open Types +} + +type relayOperationNode +type operationType = RescriptRelay.fragmentNode + + +%%private(let makeNode = (rescript_graphql_node_TestRefetchingRecordNoArgsRefetchQuery): operationType => { + ignore(rescript_graphql_node_TestRefetchingRecordNoArgsRefetchQuery) + %raw(json`{ + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": { + "refetch": { + "connection": null, + "fragmentPathInResult": [], + "operation": rescript_graphql_node_TestRefetchingRecordNoArgsRefetchQuery + } + }, + "name": "TestRefetchingRecordNoArgs_query", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "loggedInUser", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null +}`) +}) +let node: operationType = makeNode(TestRefetchingRecordNoArgsRefetchQuery_graphql.node) + diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordQuery_graphql.res new file mode 100644 index 00000000..d67bd471 --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordQuery_graphql.res @@ -0,0 +1,299 @@ +/* @sourceLoc Test_refetchingRecord.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + type rec response_loggedInUser = { + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestRefetchingRecord_user]>, + } + type response = { + loggedInUser: response_loggedInUser, + } + @live + type rawResponse = response + @live + type variables = { + beforeDate?: TestsUtils.Datetime.t, + number?: TestsUtils.Number.t, + showOnlineStatus: bool, + } + @live + type refetchVariables = { + beforeDate?: option, + number?: option, + showOnlineStatus?: bool, + } + @live let makeRefetchVariables = ( + ~beforeDate=?, + ~number=?, + ~showOnlineStatus=?, + ): refetchVariables => { + beforeDate: ?beforeDate, + number: ?number, + showOnlineStatus: ?showOnlineStatus + } + +} + + +type queryRef + +module Internal = { + @live + let variablesConverter: dict>> = %raw( + json`{"__root":{"number":{"c":"TestsUtils.Number"},"beforeDate":{"c":"TestsUtils.Datetime"}}}` + ) + @live + let variablesConverterMap = { + "TestsUtils.Datetime": TestsUtils.Datetime.serialize, + "TestsUtils.Number": TestsUtils.Number.serialize, + } + @live + let convertVariables = v => v->RescriptRelay.convertObj( + variablesConverter, + variablesConverterMap, + None + ) + @live + type wrapResponseRaw + @live + let wrapResponseConverter: dict>> = %raw( + json`{"__root":{"loggedInUser":{"f":""}}}` + ) + @live + let wrapResponseConverterMap = () + @live + let convertWrapResponse = v => v->RescriptRelay.convertObj( + wrapResponseConverter, + wrapResponseConverterMap, + null + ) + @live + type responseRaw + @live + let responseConverter: dict>> = %raw( + json`{"__root":{"loggedInUser":{"f":""}}}` + ) + @live + let responseConverterMap = () + @live + let convertResponse = v => v->RescriptRelay.convertObj( + responseConverter, + responseConverterMap, + None + ) + type wrapRawResponseRaw = wrapResponseRaw + @live + let convertWrapRawResponse = convertWrapResponse + type rawResponseRaw = responseRaw + @live + let convertRawResponse = convertResponse + type rawPreloadToken<'response> = {source: Nullable.t>} + external tokenToRaw: queryRef => rawPreloadToken = "%identity" +} +module Utils = { + @@warning("-33") + open Types +} + +type relayOperationNode +type operationType = RescriptRelay.queryNode + + +let node: operationType = %raw(json` (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "beforeDate" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "showOnlineStatus" + } +], +v1 = { + "kind": "Variable", + "name": "beforeDate", + "variableName": "beforeDate" +}, +v2 = { + "kind": "Variable", + "name": "number", + "variableName": "number" +}, +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "TestRefetchingRecordQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "loggedInUser", + "plural": false, + "selections": [ + { + "args": [ + (v1/*: any*/), + (v2/*: any*/), + { + "kind": "Variable", + "name": "showOnlineStatus", + "variableName": "showOnlineStatus" + } + ], + "kind": "FragmentSpread", + "name": "TestRefetchingRecord_user" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "TestRefetchingRecordQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "loggedInUser", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "firstName", + "storageKey": null + }, + { + "condition": "showOnlineStatus", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "onlineStatus", + "storageKey": null + } + ] + }, + { + "alias": null, + "args": null, + "concreteType": "UserConnection", + "kind": "LinkedField", + "name": "friendsConnection", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "totalCount", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": [ + (v1/*: any*/), + (v2/*: any*/) + ], + "concreteType": "User", + "kind": "LinkedField", + "name": "friends", + "plural": true, + "selections": [ + (v3/*: any*/) + ], + "storageKey": null + }, + (v3/*: any*/) + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "40d124e59b4851cddc342ab87b9064bc", + "id": null, + "metadata": {}, + "name": "TestRefetchingRecordQuery", + "operationKind": "query", + "text": "query TestRefetchingRecordQuery(\n $beforeDate: Datetime\n $number: Number\n $showOnlineStatus: Boolean!\n) {\n loggedInUser {\n ...TestRefetchingRecord_user_1LqbfJ\n id\n }\n}\n\nfragment TestRefetchingRecord_user_1LqbfJ on User {\n firstName\n onlineStatus @include(if: $showOnlineStatus)\n friendsConnection {\n totalCount\n }\n friends(beforeDate: $beforeDate, number: $number) {\n id\n }\n id\n}\n" + } +}; +})() `) + +@live let load: ( + ~environment: RescriptRelay.Environment.t, + ~variables: Types.variables, + ~fetchPolicy: RescriptRelay.fetchPolicy=?, + ~fetchKey: string=?, + ~networkCacheConfig: RescriptRelay.cacheConfig=?, +) => queryRef = ( + ~environment, + ~variables, + ~fetchPolicy=?, + ~fetchKey=?, + ~networkCacheConfig=?, +) => + RescriptRelayReact.loadQuery( + environment, + node, + variables->Internal.convertVariables, + { + fetchKey, + fetchPolicy, + networkCacheConfig, + }, + ) + +@live +let queryRefToObservable = token => { + let raw = token->Internal.tokenToRaw + raw.source->Nullable.toOption +} + +@live +let queryRefToPromise = token => { + Promise.make((resolve, _reject) => { + switch token->queryRefToObservable { + | None => resolve(Error()) + | Some(o) => + open RescriptRelay.Observable + let _: subscription = o->subscribe(makeObserver(~complete=() => resolve(Ok()))) + } + }) +} diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordRefetchQuery_graphql.res new file mode 100644 index 00000000..65ba518f --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordRefetchQuery_graphql.res @@ -0,0 +1,379 @@ +/* @sourceLoc Test_refetchingRecord.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + @live + type rec response_node = { + @live __typename: string, + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestRefetchingRecord_user]>, + } + @live + type response = { + node: option, + } + @live + type rawResponse = response + @live + type variables = { + beforeDate?: TestsUtils.Datetime.t, + friendsOnlineStatuses?: array, + @live id: string, + number?: TestsUtils.Number.t, + showOnlineStatus?: bool, + } + @live + type refetchVariables = { + beforeDate?: option, + friendsOnlineStatuses?: option>, + @live id?: string, + number?: option, + showOnlineStatus?: option, + } + @live let makeRefetchVariables = ( + ~beforeDate=?, + ~friendsOnlineStatuses=?, + ~id=?, + ~number=?, + ~showOnlineStatus=?, + ): refetchVariables => { + beforeDate: ?beforeDate, + friendsOnlineStatuses: ?friendsOnlineStatuses, + id: ?id, + number: ?number, + showOnlineStatus: ?showOnlineStatus + } + +} + + +type queryRef + +module Internal = { + @live + let variablesConverter: dict>> = %raw( + json`{"__root":{"number":{"c":"TestsUtils.Number"},"beforeDate":{"c":"TestsUtils.Datetime"}}}` + ) + @live + let variablesConverterMap = { + "TestsUtils.Datetime": TestsUtils.Datetime.serialize, + "TestsUtils.Number": TestsUtils.Number.serialize, + } + @live + let convertVariables = v => v->RescriptRelay.convertObj( + variablesConverter, + variablesConverterMap, + None + ) + @live + type wrapResponseRaw + @live + let wrapResponseConverter: dict>> = %raw( + json`{"__root":{"node":{"f":""}}}` + ) + @live + let wrapResponseConverterMap = () + @live + let convertWrapResponse = v => v->RescriptRelay.convertObj( + wrapResponseConverter, + wrapResponseConverterMap, + null + ) + @live + type responseRaw + @live + let responseConverter: dict>> = %raw( + json`{"__root":{"node":{"f":""}}}` + ) + @live + let responseConverterMap = () + @live + let convertResponse = v => v->RescriptRelay.convertObj( + responseConverter, + responseConverterMap, + None + ) + type wrapRawResponseRaw = wrapResponseRaw + @live + let convertWrapRawResponse = convertWrapResponse + type rawResponseRaw = responseRaw + @live + let convertRawResponse = convertResponse + type rawPreloadToken<'response> = {source: Nullable.t>} + external tokenToRaw: queryRef => rawPreloadToken = "%identity" +} +module Utils = { + @@warning("-33") + open Types + @live + external onlineStatus_toString: RelaySchemaAssets_graphql.enum_OnlineStatus => string = "%identity" + @live + external onlineStatus_input_toString: RelaySchemaAssets_graphql.enum_OnlineStatus_input => string = "%identity" + @live + let onlineStatus_decode = (enum: RelaySchemaAssets_graphql.enum_OnlineStatus): option => { + switch enum { + | FutureAddedValue(_) => None + | valid => Some(Obj.magic(valid)) + } + } + @live + let onlineStatus_fromString = (str: string): option => { + onlineStatus_decode(Obj.magic(str)) + } +} + +type relayOperationNode +type operationType = RescriptRelay.queryNode + + +let node: operationType = %raw(json` (function(){ +var v0 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "beforeDate" +}, +v1 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "friendsOnlineStatuses" +}, +v2 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "id" +}, +v3 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" +}, +v4 = { + "defaultValue": false, + "kind": "LocalArgument", + "name": "showOnlineStatus" +}, +v5 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "id" + } +], +v6 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v7 = { + "kind": "Variable", + "name": "beforeDate", + "variableName": "beforeDate" +}, +v8 = { + "kind": "Variable", + "name": "number", + "variableName": "number" +}, +v9 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [ + (v0/*: any*/), + (v1/*: any*/), + (v2/*: any*/), + (v3/*: any*/), + (v4/*: any*/) + ], + "kind": "Fragment", + "metadata": null, + "name": "TestRefetchingRecordRefetchQuery", + "selections": [ + { + "alias": null, + "args": (v5/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v6/*: any*/), + { + "args": [ + (v7/*: any*/), + { + "kind": "Variable", + "name": "friendsOnlineStatuses", + "variableName": "friendsOnlineStatuses" + }, + (v8/*: any*/), + { + "kind": "Variable", + "name": "showOnlineStatus", + "variableName": "showOnlineStatus" + } + ], + "kind": "FragmentSpread", + "name": "TestRefetchingRecord_user" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [ + (v0/*: any*/), + (v1/*: any*/), + (v3/*: any*/), + (v4/*: any*/), + (v2/*: any*/) + ], + "kind": "Operation", + "name": "TestRefetchingRecordRefetchQuery", + "selections": [ + { + "alias": null, + "args": (v5/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v6/*: any*/), + (v9/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "firstName", + "storageKey": null + }, + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "statuses", + "variableName": "friendsOnlineStatuses" + } + ], + "concreteType": "UserConnection", + "kind": "LinkedField", + "name": "friendsConnection", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "totalCount", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": [ + (v7/*: any*/), + (v8/*: any*/) + ], + "concreteType": "User", + "kind": "LinkedField", + "name": "friends", + "plural": true, + "selections": [ + (v9/*: any*/) + ], + "storageKey": null + }, + { + "condition": "showOnlineStatus", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "onlineStatus", + "storageKey": null + } + ] + } + ], + "type": "User", + "abstractKey": null + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "2d68c9862ef4512ede22a8a0d64b1058", + "id": null, + "metadata": {}, + "name": "TestRefetchingRecordRefetchQuery", + "operationKind": "query", + "text": "query TestRefetchingRecordRefetchQuery(\n $beforeDate: Datetime\n $friendsOnlineStatuses: [OnlineStatus!]\n $number: Number\n $showOnlineStatus: Boolean = false\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TestRefetchingRecord_user_2VpWUn\n id\n }\n}\n\nfragment TestRefetchingRecord_user_2VpWUn on User {\n firstName\n onlineStatus @include(if: $showOnlineStatus)\n friendsConnection(statuses: $friendsOnlineStatuses) {\n totalCount\n }\n friends(beforeDate: $beforeDate, number: $number) {\n id\n }\n id\n}\n" + } +}; +})() `) + +@live let load: ( + ~environment: RescriptRelay.Environment.t, + ~variables: Types.variables, + ~fetchPolicy: RescriptRelay.fetchPolicy=?, + ~fetchKey: string=?, + ~networkCacheConfig: RescriptRelay.cacheConfig=?, +) => queryRef = ( + ~environment, + ~variables, + ~fetchPolicy=?, + ~fetchKey=?, + ~networkCacheConfig=?, +) => + RescriptRelayReact.loadQuery( + environment, + node, + variables->Internal.convertVariables, + { + fetchKey, + fetchPolicy, + networkCacheConfig, + }, + ) + +@live +let queryRefToObservable = token => { + let raw = token->Internal.tokenToRaw + raw.source->Nullable.toOption +} + +@live +let queryRefToPromise = token => { + Promise.make((resolve, _reject) => { + switch token->queryRefToObservable { + | None => resolve(Error()) + | Some(o) => + open RescriptRelay.Observable + let _: subscription = o->subscribe(makeObserver(~complete=() => resolve(Ok()))) + } + }) +} diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecord_user_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecord_user_graphql.res new file mode 100644 index 00000000..09bb452a --- /dev/null +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRecord_user_graphql.res @@ -0,0 +1,193 @@ +/* @sourceLoc Test_refetchingRecord.res */ +/* @generated */ +%%raw("/* @generated */") +module Types = { + @@warning("-30") + + type rec fragment_friends = { + @live id: string, + } + and fragment_friendsConnection = { + totalCount: int, + } + type fragment = { + firstName: string, + friends: array, + friendsConnection: fragment_friendsConnection, + @live id: string, + onlineStatus: option, + } +} + +module Internal = { + @live + type fragmentRaw + @live + let fragmentConverter: dict>> = %raw( + json`{}` + ) + @live + let fragmentConverterMap = () + @live + let convertFragment = v => v->RescriptRelay.convertObj( + fragmentConverter, + fragmentConverterMap, + None + ) +} + +type t +type fragmentRef +external getFragmentRef: + RescriptRelay.fragmentRefs<[> | #TestRefetchingRecord_user]> => fragmentRef = "%identity" + +module Utils = { + @@warning("-33") + open Types + @live + external onlineStatus_toString: RelaySchemaAssets_graphql.enum_OnlineStatus => string = "%identity" + @live + external onlineStatus_input_toString: RelaySchemaAssets_graphql.enum_OnlineStatus_input => string = "%identity" + @live + let onlineStatus_decode = (enum: RelaySchemaAssets_graphql.enum_OnlineStatus): option => { + switch enum { + | FutureAddedValue(_) => None + | valid => Some(Obj.magic(valid)) + } + } + @live + let onlineStatus_fromString = (str: string): option => { + onlineStatus_decode(Obj.magic(str)) + } +} + +type relayOperationNode +type operationType = RescriptRelay.fragmentNode + + +%%private(let makeNode = (rescript_graphql_node_TestRefetchingRecordRefetchQuery): operationType => { + ignore(rescript_graphql_node_TestRefetchingRecordRefetchQuery) + %raw(json`(function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "argumentDefinitions": [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "beforeDate" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "friendsOnlineStatuses" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "number" + }, + { + "defaultValue": false, + "kind": "LocalArgument", + "name": "showOnlineStatus" + } + ], + "kind": "Fragment", + "metadata": { + "refetch": { + "connection": null, + "fragmentPathInResult": [ + "node" + ], + "operation": rescript_graphql_node_TestRefetchingRecordRefetchQuery, + "identifierInfo": { + "identifierField": "id", + "identifierQueryVariableName": "id" + } + } + }, + "name": "TestRefetchingRecord_user", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "firstName", + "storageKey": null + }, + { + "condition": "showOnlineStatus", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "onlineStatus", + "storageKey": null + } + ] + }, + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "statuses", + "variableName": "friendsOnlineStatuses" + } + ], + "concreteType": "UserConnection", + "kind": "LinkedField", + "name": "friendsConnection", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "totalCount", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "beforeDate", + "variableName": "beforeDate" + }, + { + "kind": "Variable", + "name": "number", + "variableName": "number" + } + ], + "concreteType": "User", + "kind": "LinkedField", + "name": "friends", + "plural": true, + "selections": [ + (v0/*: any*/) + ], + "storageKey": null + }, + (v0/*: any*/) + ], + "type": "User", + "abstractKey": null +}; +})()`) +}) +let node: operationType = makeNode(TestRefetchingRecordRefetchQuery_graphql.node) +