Skip to content

Commit

Permalink
new take on resolvers using fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
zth committed Jun 27, 2024
1 parent c8ffc8c commit 053bdc1
Show file tree
Hide file tree
Showing 17 changed files with 240 additions and 36 deletions.
17 changes: 17 additions & 0 deletions packages/rescript-relay/__tests__/TestRelayUserResolver2.res
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module Fragment = %relay(`
fragment TestRelayUserResolver2 on User {
firstName
lastName
}
`)

/**
* @RelayResolver User.fullName2(maxLength: Int!): String
* @rootFragment TestRelayUserResolver2
*
* A users full name 2.
*/
let fullName2 = (user, args) => {
let user = Fragment.readResolverFragment(user)
`${user.firstName} ${user.lastName}`->Js.String2.slice(~from=0, ~to_=args.maxLength)
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ describe("Relay Resolvers", () => {
});

t.render(test_relayResolvers());
await t.screen.findByText("First Last is online");
await t.screen.findByText("First Last Fi is online");
});
});
5 changes: 3 additions & 2 deletions packages/rescript-relay/__tests__/Test_relayResolvers.res
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module Fragment = %relay(`
fragment TestRelayResolvers_user on User {
isOnline
fullName
fullName2(maxLength: 2)
}
`)

Expand All @@ -23,8 +24,8 @@ module Test = {

<div>
{switch data {
| {isOnline: Some(isOnline), fullName: Some(fullName)} =>
React.string(`${fullName} is ${isOnline ? "online" : "offline"}`)
| {isOnline: Some(isOnline), fullName: Some(fullName), fullName2: Some(fullName2)} =>
React.string(`${fullName} ${fullName2} is ${isOnline ? "online" : "offline"}`)
| _ => React.string("-")
}}
</div>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 32 additions & 4 deletions packages/rescript-relay/rescript-relay-ppx/library/Fragment.ml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ open Ppxlib
open Util

let make ~loc ~moduleName ~refetchableQueryName ~extractedConnectionInfo
~hasInlineDirective =
~hasInlineDirective ~isPlural =
let typeFromGeneratedModule = makeTypeAccessor ~loc ~moduleName in
let valFromGeneratedModule = makeExprAccessor ~loc ~moduleName in
let moduleIdentFromGeneratedModule = makeModuleIdent ~loc ~moduleName in
Expand Down Expand Up @@ -35,7 +35,8 @@ let make ~loc ~moduleName ~refetchableQueryName ~extractedConnectionInfo
~node:[%e valFromGeneratedModule ["node"]]];
[%stri
let useOpt fRef :
[%t typeFromGeneratedModule ["Types"; "fragment"]] option =
[%t typeFromGeneratedModule ["Types"; "fragment"]] option
=
RescriptRelay_Fragment.useFragmentOpt ~convertFragment
~fRef:
(match fRef with
Expand All @@ -45,6 +46,34 @@ let make ~loc ~moduleName ~refetchableQueryName ~extractedConnectionInfo
|. [%e valFromGeneratedModule ["getFragmentRef"]])
| None -> None)
~node:[%e valFromGeneratedModule ["node"]]];
(if isPlural then
[%stri
let readResolverFragment fRef :
[%t typeFromGeneratedModule ["Types"; "fragment"]] =
let fRef =
fRef
|. RescriptRelay_Internal
.internal_resolverFragmentRefsToFragmentRefsPlural
in
RescriptRelay_Fragment.read ~convertFragment
~fRef:
(fRef
|. [%e valFromGeneratedModule ["getFragmentRef"]])
~node:[%e valFromGeneratedModule ["node"]]]
else
[%stri
let readResolverFragment fRef :
[%t typeFromGeneratedModule ["Types"; "fragment"]] =
let fRef =
fRef
|. RescriptRelay_Internal
.internal_resolverFragmentRefsToFragmentRefs
in
RescriptRelay_Fragment.read ~convertFragment
~fRef:
(fRef
|. [%e valFromGeneratedModule ["getFragmentRef"]])
~node:[%e valFromGeneratedModule ["node"]]]);
]
| true -> []);
(match hasInlineDirective with
Expand Down Expand Up @@ -73,8 +102,7 @@ let make ~loc ~moduleName ~refetchableQueryName ~extractedConnectionInfo
let makeRefetchVariables =
[%e
valFromRefetchableModule ["Types"; "makeRefetchVariables"]]
[@@ocaml.doc "A helper to make refetch variables. "]
[@@live]];
[@@ocaml.doc "A helper to make refetch variables. "] [@@live]];
[%stri
let convertRefetchVariables :
[%t
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ let commonExtension =
~refetchableQueryName
~extractedConnectionInfo:(op |> extractFragmentConnectionInfo ~loc)
~hasInlineDirective:(op |> fragmentHasInlineDirective ~loc)
~isPlural:(op |> fragmentIsPlural ~loc)
~loc
| Operation {optype = Query} ->
if Util.queryIsUpdatable op then
Expand Down
10 changes: 10 additions & 0 deletions packages/rescript-relay/rescript-relay-ppx/library/Util.ml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,16 @@ let fragmentHasInlineDirective ~loc op =
|> List.exists (fun (directive : Graphql_parser.directive) ->
directive.name = "inline")
| _ -> false

let fragmentIsPlural ~loc op =
match op with
| Graphql_parser.Fragment {name = _; directives} ->
directives
|> List.exists (fun (directive : Graphql_parser.directive) ->
directive.name = "relay"
&& directive.arguments
|> List.exists (fun (n, v) -> n = "plural" && v = `Bool true))
| _ -> false
let getGraphQLModuleName opName = String.capitalize_ascii opName ^ "_graphql"

let rec longidentFromStrings = function
Expand Down
1 change: 1 addition & 0 deletions packages/rescript-relay/src/RescriptRelay.res
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type mutationNode<'node>
type subscriptionNode<'node>

type fragmentRefs<'fragments>
type resolverFragmentRefs<'fragments>
type updatableFragmentRefs<'fragments>

type dataId
Expand Down
3 changes: 3 additions & 0 deletions packages/rescript-relay/src/RescriptRelay.resi
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ type subscriptionNode<'node>
/**This type shows all of the fragments that has been spread on this particular object.*/
type fragmentRefs<'fragments>

/**This type shows the Relay resolver fragment that has been spread on this particular object.*/
type resolverFragmentRefs<'fragments>

/**This type shows all of the updatable fragments that has been spread on this particular object.*/
type updatableFragmentRefs<'fragments>

Expand Down
Loading

0 comments on commit 053bdc1

Please sign in to comment.