From 3b5df51b80a0e1222b376fcfc730bb5dd0de099a Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Sun, 11 Jun 2023 12:41:48 +0200 Subject: [PATCH] represent unions as regular variants --- CHANGELOG.md | 1 + packages/relay | 2 +- .../__tests__/Test_customScalars.res | 4 +- .../__tests__/Test_localPayload.res | 18 +- .../__tests__/Test_missingFieldHandlers.res | 2 +- .../__tests__/Test_mutation.res | 2 +- .../__tests__/Test_nodeInterface.res | 2 +- .../__tests__/Test_paginationUnion.res | 6 +- .../__tests__/Test_refetchingInNode.res | 2 +- .../__tests__/Test_unionFragment.res | 4 +- .../rescript-relay/__tests__/Test_unions.res | 12 +- .../TestConnections2_user_graphql.res | 33 +-- .../TestCustomScalarsQuery_graphql.res | 33 +-- .../TestLocalPayloadQuery_graphql.res | 156 ++++-------- ...alPayloadViaNodeInterfaceQuery_graphql.res | 233 ++++++------------ .../TestLocalPayload_user_graphql.res | 131 ++++------ .../TestMissingFieldHandlersQuery_graphql.res | 33 +-- ...ragmentSetOnlineStatusMutation_graphql.res | 58 ++--- .../TestMutation_user_graphql.res | 48 ++-- ...deInterfaceOnAbstractTypeQuery_graphql.res | 48 ++-- .../TestNodeInterfaceQuery_graphql.res | 35 +-- .../TestPaginationUnion_query_graphql.res | 54 ++-- .../TestRefetchingInNodeQuery_graphql.res | 33 +-- .../TestUnionFragment_member_graphql.res | 52 ++-- ...estUnionFragment_plural_member_graphql.res | 52 ++-- .../__generated__/TestUnionsQuery_graphql.res | 114 +++------ .../src/RescriptRelay_Internal.res | 12 + .../src/RescriptRelay_Internal.resi | 3 + 28 files changed, 416 insertions(+), 767 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 701bb842..bfce043b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Dedicated tooling for migrating is coming, as well as docs. ## Breaking changes - All trailing unit arguments are removed. Commit showing how this is migrated to in the tests: https://github.com/zth/rescript-relay/commit/2a16791268afb29d106362d0cf17915f69d5b4ff +- Unions are now represented as regular variants. # 0.0.0-version-3-aeebeaab diff --git a/packages/relay b/packages/relay index 3baf5518..0a4b2715 160000 --- a/packages/relay +++ b/packages/relay @@ -1 +1 @@ -Subproject commit 3baf5518f988c9cd3e077dd021fcb0427b00bcc2 +Subproject commit 0a4b2715788ad9968185551e118ed08fd5bba75d diff --git a/packages/rescript-relay/__tests__/Test_customScalars.res b/packages/rescript-relay/__tests__/Test_customScalars.res index 48fb8516..220b68cf 100644 --- a/packages/rescript-relay/__tests__/Test_customScalars.res +++ b/packages/rescript-relay/__tests__/Test_customScalars.res @@ -36,9 +36,9 @@ module Test = {
{switch query.member { - | Some(#User(user)) => + | Some(User(user)) => React.string("member createdAt: " ++ user.createdAt->Js.Date.getTime->Js.Float.toString) - | Some(#UnselectedUnionMember(_)) | None => React.null + | Some(UnselectedUnionMember(_)) | None => React.null }}
diff --git a/packages/rescript-relay/__tests__/Test_localPayload.res b/packages/rescript-relay/__tests__/Test_localPayload.res index 39c099c0..3b89c484 100644 --- a/packages/rescript-relay/__tests__/Test_localPayload.res +++ b/packages/rescript-relay/__tests__/Test_localPayload.res @@ -75,12 +75,12 @@ module Test = { ->Belt.Option.getWithDefault([]) ->Belt.Array.keepMap(v => v) ->Belt.Array.get(0) { - | Some(#Group({name, topMember})) => + | Some(Group({name, topMember})) => `Group ${name}, top member: ${switch topMember { - | Some(#User({firstName})) => firstName + | Some(User({firstName})) => firstName | _ => "-" }}` - | Some(#User({firstName})) => `User ${firstName}` + | Some(User({firstName})) => `User ${firstName}` | _ => "-" }}`, )} @@ -88,8 +88,8 @@ module Test = {
{React.string( `(singular) Member of: ${switch user.memberOfSingular { - | Some(#Group({name})) => `Group ${name}` - | Some(#User({firstName})) => `User ${firstName}` + | Some(Group({name})) => `Group ${name}` + | Some(User({firstName})) => `User ${firstName}` | _ => "-" }}`, )} @@ -107,7 +107,7 @@ module Test = { avatarUrl: None, memberOf: None, memberOfSingular: Some( - #Group({ + Group({ name: "Another Group", id: "group-2", __typename: #Group, @@ -126,7 +126,7 @@ module Test = { ~variables={id: data.loggedInUser.id}, ~payload={ node: Some( - #User({ + User({ id: data.loggedInUser.id, firstName: "AnotherFirst", onlineStatus: Some(Online), @@ -135,13 +135,13 @@ module Test = { memberOfSingular: None, memberOf: Some([ Some( - #Group({ + Group({ name: "Some Group", __typename: #Group, __isNode: #Group, id: "group-1", topMember: Some( - #User({ + User({ firstName: "Some User", id: "user-2", __typename: #User, diff --git a/packages/rescript-relay/__tests__/Test_missingFieldHandlers.res b/packages/rescript-relay/__tests__/Test_missingFieldHandlers.res index edfe792e..0cba795e 100644 --- a/packages/rescript-relay/__tests__/Test_missingFieldHandlers.res +++ b/packages/rescript-relay/__tests__/Test_missingFieldHandlers.res @@ -22,7 +22,7 @@ module RenderMe = { let query = Query.use(~variables=(), ~fetchPolicy=StoreOnly) switch query.node { - | Some(#User(user)) => React.string("2: " ++ user.firstName) + | Some(User(user)) => React.string("2: " ++ user.firstName) | _ => React.string("-") } } diff --git a/packages/rescript-relay/__tests__/Test_mutation.res b/packages/rescript-relay/__tests__/Test_mutation.res index 126c04a5..abccac4f 100644 --- a/packages/rescript-relay/__tests__/Test_mutation.res +++ b/packages/rescript-relay/__tests__/Test_mutation.res @@ -134,7 +134,7 @@ module Test = { lastName: data.lastName, memberOf: Some([ Some( - #User({ + User({ __typename: #User, firstName: "test", id: "123", diff --git a/packages/rescript-relay/__tests__/Test_nodeInterface.res b/packages/rescript-relay/__tests__/Test_nodeInterface.res index 1cee5ff9..6d38acb2 100644 --- a/packages/rescript-relay/__tests__/Test_nodeInterface.res +++ b/packages/rescript-relay/__tests__/Test_nodeInterface.res @@ -38,7 +38,7 @@ module Test = { let query = Query.use(~variables=()) switch query.node { - | Some(#User(user)) => React.string(user.firstName) + | Some(User(user)) => React.string(user.firstName) | _ => React.string("-") } } diff --git a/packages/rescript-relay/__tests__/Test_paginationUnion.res b/packages/rescript-relay/__tests__/Test_paginationUnion.res index b410ab2e..09fd9778 100644 --- a/packages/rescript-relay/__tests__/Test_paginationUnion.res +++ b/packages/rescript-relay/__tests__/Test_paginationUnion.res @@ -84,11 +84,11 @@ module Test = { ->Fragment.getConnectionNodes ->Belt.Array.mapWithIndex((i, member) => switch member { - | #User(user) => + | User(user) =>
- | #Group(group) => + | Group(group) =>
{React.string( "Group " ++ @@ -101,7 +101,7 @@ module Test = { " admins"))), )}
- | #UnselectedUnionMember(_) => + | UnselectedUnionMember(_) =>
string_of_int}> {React.string("Unknown type")}
} ) diff --git a/packages/rescript-relay/__tests__/Test_refetchingInNode.res b/packages/rescript-relay/__tests__/Test_refetchingInNode.res index ed19148e..49316cde 100644 --- a/packages/rescript-relay/__tests__/Test_refetchingInNode.res +++ b/packages/rescript-relay/__tests__/Test_refetchingInNode.res @@ -63,7 +63,7 @@ module Test = { let query = Query.use(~variables={userId: "user-1", friendsOnlineStatuses: [Online]}) switch query.node { - | Some(#User(user)) => + | Some(User(user)) => | _ => React.string("-") } } diff --git a/packages/rescript-relay/__tests__/Test_unionFragment.res b/packages/rescript-relay/__tests__/Test_unionFragment.res index 5441734f..897b7765 100644 --- a/packages/rescript-relay/__tests__/Test_unionFragment.res +++ b/packages/rescript-relay/__tests__/Test_unionFragment.res @@ -57,7 +57,7 @@ module FragmentRenderer = { <> {switch regular { - | #User({onlineStatus: Some(Online), firstName, fragmentRefs}) => + | User({onlineStatus: Some(Online), firstName, fragmentRefs}) => <>
{React.string(firstName ++ " is online")}
@@ -65,7 +65,7 @@ module FragmentRenderer = { | _ => React.null }} {switch plural { - | [#User({onlineStatus: Some(Online), firstName, fragmentRefs})] => + | [User({onlineStatus: Some(Online), firstName, fragmentRefs})] => <>
{React.string("plural: " ++ (firstName ++ " is online"))}
diff --git a/packages/rescript-relay/__tests__/Test_unions.res b/packages/rescript-relay/__tests__/Test_unions.res index 05ae8804..a7ee1f65 100644 --- a/packages/rescript-relay/__tests__/Test_unions.res +++ b/packages/rescript-relay/__tests__/Test_unions.res @@ -61,11 +61,11 @@ module Test = { } ->Belt.Array.map(x => switch x { - | #User(user) => + | User(user) =>
{React.string("First level: " ++ printUser(user.firstName, user.onlineStatus))}
- | #Group(group) => + | Group(group) =>
{React.string( "First level: " ++ @@ -76,11 +76,11 @@ module Test = { ->Belt.Option.getWithDefault([]) ->Belt.Array.map(x => switch x { - | Some(#User(user)) => + | Some(User(user)) =>
{React.string("Second level: " ++ printUser(user.firstName, user.onlineStatus))}
- | Some(#Group(g)) => + | Some(Group(g)) =>
{React.string( group.name ++ @@ -90,12 +90,12 @@ module Test = { g.avatarUrl->Belt.Option.getWithDefault("[no avatar]")))), )}
- | Some(#UnselectedUnionMember(_)) | None => React.null + | Some(UnselectedUnionMember(_)) | None => React.null } ) ->React.array}
- | #UnselectedUnionMember(_) => React.null + | UnselectedUnionMember(_) => React.null } ) ->React.array} diff --git a/packages/rescript-relay/__tests__/__generated__/TestConnections2_user_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestConnections2_user_graphql.res index 62dd3124..3c7791e5 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestConnections2_user_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestConnections2_user_graphql.res @@ -13,14 +13,14 @@ module Types = { and fragment_member_User_friendsConnection = { edges: option>>, } - and fragment_member_User = { - @live __typename: [ | #User], - friendsConnection: fragment_member_User_friendsConnection, - } - and fragment_member = [ - | #User(fragment_member_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") and fragment_member = + | User( + { + @live __typename: [ | #User], + friendsConnection: fragment_member_User_friendsConnection, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type fragment = { member: option, @@ -28,22 +28,9 @@ module Types = { } @live -let unwrap_fragment_member: {. "__typename": string } => [ - | #User(Types.fragment_member_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_member: Types.fragment_member => Types.fragment_member = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_fragment_member: [ - | #User(Types.fragment_member_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_member: Types.fragment_member => Types.fragment_member = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res index 56dc83bb..6f779b8d 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res @@ -4,14 +4,14 @@ module Types = { @@warning("-30") - type rec response_member_User = { - @live __typename: [ | #User], - createdAt: TestsUtils.Datetime.t, - } - and response_member = [ - | #User(response_member_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_member = + | User( + { + @live __typename: [ | #User], + createdAt: TestsUtils.Datetime.t, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type rec response_loggedInUser_friends = { createdAt: TestsUtils.Datetime.t, @@ -47,22 +47,9 @@ module Types = { } @live -let unwrap_response_member: {. "__typename": string } => [ - | #User(Types.response_member_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_member: Types.response_member => Types.response_member = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_response_member: [ - | #User(Types.response_member_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_member: Types.response_member => Types.response_member = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res index 49c8c59e..33d87750 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res @@ -4,58 +4,55 @@ module Types = { @@warning("-30") - @live - type rec rawResponse_loggedInUser_memberOf_Group_topMember_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - @live - and rawResponse_loggedInUser_memberOf_Group = { - @live __typename: [ | #Group], - __isNode: [ | #Group], - @live id: string, - name: string, - topMember: option, - } - @live - and rawResponse_loggedInUser_memberOf_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - @live - and rawResponse_loggedInUser_memberOfSingular_Group = { - @live __typename: [ | #Group], - __isNode: [ | #Group], - @live id: string, - name: string, - } - @live - and rawResponse_loggedInUser_memberOfSingular_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - and rawResponse_loggedInUser_memberOf_Group_topMember = [ - | #User(rawResponse_loggedInUser_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_loggedInUser_memberOf_Group_topMember = + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_loggedInUser_memberOf = [ - | #Group(rawResponse_loggedInUser_memberOf_Group) - | #User(rawResponse_loggedInUser_memberOf_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_loggedInUser_memberOf = + | Group( + { + @live __typename: [ | #Group], + __isNode: [ | #Group], + @live id: string, + name: string, + topMember: option, + } + ) + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_loggedInUser_memberOfSingular = [ - | #Group(rawResponse_loggedInUser_memberOfSingular_Group) - | #User(rawResponse_loggedInUser_memberOfSingular_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_loggedInUser_memberOfSingular = + | Group( + { + @live __typename: [ | #Group], + __isNode: [ | #Group], + @live id: string, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type rec response_loggedInUser = { @live id: string, @@ -85,64 +82,17 @@ module Types = { } @live -let unwrap_rawResponse_loggedInUser_memberOf_Group_topMember: {. "__typename": string } => [ - | #User(Types.rawResponse_loggedInUser_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_loggedInUser_memberOf_Group_topMember: Types.rawResponse_loggedInUser_memberOf_Group_topMember => Types.rawResponse_loggedInUser_memberOf_Group_topMember = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_rawResponse_loggedInUser_memberOf_Group_topMember: [ - | #User(Types.rawResponse_loggedInUser_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_loggedInUser_memberOf_Group_topMember: Types.rawResponse_loggedInUser_memberOf_Group_topMember => Types.rawResponse_loggedInUser_memberOf_Group_topMember = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_loggedInUser_memberOf: {. "__typename": string } => [ - | #Group(Types.rawResponse_loggedInUser_memberOf_Group) - | #User(Types.rawResponse_loggedInUser_memberOf_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_loggedInUser_memberOf: Types.rawResponse_loggedInUser_memberOf => Types.rawResponse_loggedInUser_memberOf = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_rawResponse_loggedInUser_memberOf: [ - | #Group(Types.rawResponse_loggedInUser_memberOf_Group) - | #User(Types.rawResponse_loggedInUser_memberOf_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_loggedInUser_memberOf: Types.rawResponse_loggedInUser_memberOf => Types.rawResponse_loggedInUser_memberOf = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_loggedInUser_memberOfSingular: {. "__typename": string } => [ - | #Group(Types.rawResponse_loggedInUser_memberOfSingular_Group) - | #User(Types.rawResponse_loggedInUser_memberOfSingular_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_loggedInUser_memberOfSingular: Types.rawResponse_loggedInUser_memberOfSingular => Types.rawResponse_loggedInUser_memberOfSingular = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_rawResponse_loggedInUser_memberOfSingular: [ - | #Group(Types.rawResponse_loggedInUser_memberOfSingular_Group) - | #User(Types.rawResponse_loggedInUser_memberOfSingular_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_loggedInUser_memberOfSingular: Types.rawResponse_loggedInUser_memberOfSingular => Types.rawResponse_loggedInUser_memberOfSingular = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res index 0be0a5ae..68a0f112 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res @@ -4,82 +4,78 @@ module Types = { @@warning("-30") - type rec response_node_User = { - @live __typename: [ | #User], - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestLocalPayload_user]>, - } - @live - and rawResponse_node_User_memberOf_Group_topMember_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - @live - and rawResponse_node_User_memberOf_Group = { - @live __typename: [ | #Group], - __isNode: [ | #Group], - @live id: string, - name: string, - topMember: option, - } - @live - and rawResponse_node_User_memberOf_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - @live - and rawResponse_node_User_memberOfSingular_Group = { - @live __typename: [ | #Group], - __isNode: [ | #Group], - @live id: string, - name: string, - } - @live - and rawResponse_node_User_memberOfSingular_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - @live - and rawResponse_node_User = { - @live __typename: [ | #User], - avatarUrl: option, - firstName: string, - @live id: string, - memberOf: option>>, - memberOfSingular: option, - onlineStatus: option, - } - and response_node = [ - | #User(response_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_node = + | User( + { + @live __typename: [ | #User], + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestLocalPayload_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_node_User_memberOf_Group_topMember = [ - | #User(rawResponse_node_User_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_node_User_memberOf_Group_topMember = + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_node_User_memberOf = [ - | #Group(rawResponse_node_User_memberOf_Group) - | #User(rawResponse_node_User_memberOf_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_node_User_memberOf = + | Group( + { + @live __typename: [ | #Group], + __isNode: [ | #Group], + @live id: string, + name: string, + topMember: option, + } + ) + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_node_User_memberOfSingular = [ - | #Group(rawResponse_node_User_memberOfSingular_Group) - | #User(rawResponse_node_User_memberOfSingular_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_node_User_memberOfSingular = + | Group( + { + @live __typename: [ | #Group], + __isNode: [ | #Group], + @live id: string, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and rawResponse_node = [ - | #User(rawResponse_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_node = + | User( + { + @live __typename: [ | #User], + avatarUrl: option, + firstName: string, + @live id: string, + memberOf: option>>, + memberOfSingular: option, + onlineStatus: option, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type response = { node: option, @@ -105,98 +101,25 @@ module Types = { } @live -let unwrap_response_node: {. "__typename": string } => [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_response_node: [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_node_User_memberOf_Group_topMember: {. "__typename": string } => [ - | #User(Types.rawResponse_node_User_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_node_User_memberOf_Group_topMember: Types.rawResponse_node_User_memberOf_Group_topMember => Types.rawResponse_node_User_memberOf_Group_topMember = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_rawResponse_node_User_memberOf_Group_topMember: [ - | #User(Types.rawResponse_node_User_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_node_User_memberOf_Group_topMember: Types.rawResponse_node_User_memberOf_Group_topMember => Types.rawResponse_node_User_memberOf_Group_topMember = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_node_User_memberOf: {. "__typename": string } => [ - | #Group(Types.rawResponse_node_User_memberOf_Group) - | #User(Types.rawResponse_node_User_memberOf_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_node_User_memberOf: Types.rawResponse_node_User_memberOf => Types.rawResponse_node_User_memberOf = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_rawResponse_node_User_memberOf: [ - | #Group(Types.rawResponse_node_User_memberOf_Group) - | #User(Types.rawResponse_node_User_memberOf_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_node_User_memberOf: Types.rawResponse_node_User_memberOf => Types.rawResponse_node_User_memberOf = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_node_User_memberOfSingular: {. "__typename": string } => [ - | #Group(Types.rawResponse_node_User_memberOfSingular_Group) - | #User(Types.rawResponse_node_User_memberOfSingular_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_node_User_memberOfSingular: Types.rawResponse_node_User_memberOfSingular => Types.rawResponse_node_User_memberOfSingular = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_rawResponse_node_User_memberOfSingular: [ - | #Group(Types.rawResponse_node_User_memberOfSingular_Group) - | #User(Types.rawResponse_node_User_memberOfSingular_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_node_User_memberOfSingular: Types.rawResponse_node_User_memberOfSingular => Types.rawResponse_node_User_memberOfSingular = RescriptRelay_Internal.wrapUnion @live -let unwrap_rawResponse_node: {. "__typename": string } => [ - | #User(Types.rawResponse_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_node: Types.rawResponse_node => Types.rawResponse_node = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_rawResponse_node: [ - | #User(Types.rawResponse_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_node: Types.rawResponse_node => Types.rawResponse_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayload_user_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayload_user_graphql.res index 55f505a3..cd98f6e4 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayload_user_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayload_user_graphql.res @@ -4,43 +4,45 @@ module Types = { @@warning("-30") - type rec fragment_memberOf_Group_topMember_User = { - @live __typename: [ | #User], - firstName: string, - } - and fragment_memberOf_Group = { - @live __typename: [ | #Group], - name: string, - topMember: option, - } - and fragment_memberOf_User = { - @live __typename: [ | #User], - firstName: string, - } - and fragment_memberOfSingular_Group = { - @live __typename: [ | #Group], - name: string, - } - and fragment_memberOfSingular_User = { - @live __typename: [ | #User], - firstName: string, - } - and fragment_memberOf_Group_topMember = [ - | #User(fragment_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment_memberOf_Group_topMember = + | User( + { + @live __typename: [ | #User], + firstName: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and fragment_memberOf = [ - | #Group(fragment_memberOf_Group) - | #User(fragment_memberOf_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment_memberOf = + | Group( + { + @live __typename: [ | #Group], + name: string, + topMember: option, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and fragment_memberOfSingular = [ - | #Group(fragment_memberOfSingular_Group) - | #User(fragment_memberOfSingular_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment_memberOfSingular = + | Group( + { + @live __typename: [ | #Group], + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type fragment = { avatarUrl: option, @@ -52,64 +54,17 @@ module Types = { } @live -let unwrap_fragment_memberOf_Group_topMember: {. "__typename": string } => [ - | #User(Types.fragment_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_memberOf_Group_topMember: Types.fragment_memberOf_Group_topMember => Types.fragment_memberOf_Group_topMember = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_fragment_memberOf_Group_topMember: [ - | #User(Types.fragment_memberOf_Group_topMember_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_memberOf_Group_topMember: Types.fragment_memberOf_Group_topMember => Types.fragment_memberOf_Group_topMember = RescriptRelay_Internal.wrapUnion @live -let unwrap_fragment_memberOf: {. "__typename": string } => [ - | #Group(Types.fragment_memberOf_Group) - | #User(Types.fragment_memberOf_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_memberOf: Types.fragment_memberOf => Types.fragment_memberOf = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment_memberOf: [ - | #Group(Types.fragment_memberOf_Group) - | #User(Types.fragment_memberOf_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_memberOf: Types.fragment_memberOf => Types.fragment_memberOf = RescriptRelay_Internal.wrapUnion @live -let unwrap_fragment_memberOfSingular: {. "__typename": string } => [ - | #Group(Types.fragment_memberOfSingular_Group) - | #User(Types.fragment_memberOfSingular_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_memberOfSingular: Types.fragment_memberOfSingular => Types.fragment_memberOfSingular = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment_memberOfSingular: [ - | #Group(Types.fragment_memberOfSingular_Group) - | #User(Types.fragment_memberOfSingular_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_memberOfSingular: Types.fragment_memberOfSingular => Types.fragment_memberOfSingular = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res index 2ffcca50..e2c8805b 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res @@ -4,14 +4,14 @@ module Types = { @@warning("-30") - type rec response_node_User = { - @live __typename: [ | #User], - firstName: string, - } - and response_node = [ - | #User(response_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_node = + | User( + { + @live __typename: [ | #User], + firstName: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type response = { node: option, @@ -26,22 +26,9 @@ module Types = { } @live -let unwrap_response_node: {. "__typename": string } => [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_response_node: [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestMutationWithOnlyFragmentSetOnlineStatusMutation_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMutationWithOnlyFragmentSetOnlineStatusMutation_graphql.res index dc2e2bcb..2bb3f46c 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMutationWithOnlyFragmentSetOnlineStatusMutation_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMutationWithOnlyFragmentSetOnlineStatusMutation_graphql.res @@ -4,25 +4,24 @@ module Types = { @@warning("-30") - @live - type rec rawResponse_setOnlineStatus_user_memberOf_Group = { - @live __typename: [ | #Group], - __isNode: [ | #Group], - @live id: string, - name: string, - } - @live - and rawResponse_setOnlineStatus_user_memberOf_User = { - @live __typename: [ | #User], - __isNode: [ | #User], - firstName: string, - @live id: string, - } - and rawResponse_setOnlineStatus_user_memberOf = [ - | #Group(rawResponse_setOnlineStatus_user_memberOf_Group) - | #User(rawResponse_setOnlineStatus_user_memberOf_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type rawResponse_setOnlineStatus_user_memberOf = + | Group( + { + @live __typename: [ | #Group], + __isNode: [ | #Group], + @live id: string, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + __isNode: [ | #User], + firstName: string, + @live id: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) @live type rec response_setOnlineStatus_user = { @@ -59,26 +58,9 @@ module Types = { } @live -let unwrap_rawResponse_setOnlineStatus_user_memberOf: {. "__typename": string } => [ - | #Group(Types.rawResponse_setOnlineStatus_user_memberOf_Group) - | #User(Types.rawResponse_setOnlineStatus_user_memberOf_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_rawResponse_setOnlineStatus_user_memberOf: Types.rawResponse_setOnlineStatus_user_memberOf => Types.rawResponse_setOnlineStatus_user_memberOf = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_rawResponse_setOnlineStatus_user_memberOf: [ - | #Group(Types.rawResponse_setOnlineStatus_user_memberOf_Group) - | #User(Types.rawResponse_setOnlineStatus_user_memberOf_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_rawResponse_setOnlineStatus_user_memberOf: Types.rawResponse_setOnlineStatus_user_memberOf => Types.rawResponse_setOnlineStatus_user_memberOf = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestMutation_user_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMutation_user_graphql.res index 7367e108..b5e399c0 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMutation_user_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMutation_user_graphql.res @@ -4,19 +4,20 @@ module Types = { @@warning("-30") - type rec fragment_memberOf_Group = { - @live __typename: [ | #Group], - name: string, - } - and fragment_memberOf_User = { - @live __typename: [ | #User], - firstName: string, - } - and fragment_memberOf = [ - | #Group(fragment_memberOf_Group) - | #User(fragment_memberOf_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment_memberOf = + | Group( + { + @live __typename: [ | #Group], + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type fragment = { firstName: string, @@ -28,26 +29,9 @@ module Types = { } @live -let unwrap_fragment_memberOf: {. "__typename": string } => [ - | #Group(Types.fragment_memberOf_Group) - | #User(Types.fragment_memberOf_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_memberOf: Types.fragment_memberOf => Types.fragment_memberOf = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment_memberOf: [ - | #Group(Types.fragment_memberOf_Group) - | #User(Types.fragment_memberOf_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_memberOf: Types.fragment_memberOf => Types.fragment_memberOf = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res index 598dc96e..f225f2df 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res @@ -4,19 +4,20 @@ module Types = { @@warning("-30") - type rec response_node_Group = { - @live __typename: [ | #Group], - name: option, - } - and response_node_User = { - @live __typename: [ | #User], - firstName: option, - } - and response_node = [ - | #Group(response_node_Group) - | #User(response_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_node = + | Group( + { + @live __typename: [ | #Group], + name: option, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: option, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type response = { node: option, @@ -31,26 +32,9 @@ module Types = { } @live -let unwrap_response_node: {. "__typename": string } => [ - | #Group(Types.response_node_Group) - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_response_node: [ - | #Group(Types.response_node_Group) - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res index 7dbf0892..21e35806 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res @@ -4,15 +4,15 @@ module Types = { @@warning("-30") - type rec response_node_User = { - @live __typename: [ | #User], - firstName: string, - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestNodeInterface_user]>, - } - and response_node = [ - | #User(response_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_node = + | User( + { + @live __typename: [ | #User], + firstName: string, + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestNodeInterface_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type response = { node: option, @@ -27,22 +27,9 @@ module Types = { } @live -let unwrap_response_node: {. "__typename": string } => [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_response_node: [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnion_query_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnion_query_graphql.res index bb76c894..49a8bc5b 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnion_query_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnion_query_graphql.res @@ -14,22 +14,23 @@ module Types = { and fragment_members_edges_node_Group_adminsConnection = { edges: option>>, } - and fragment_members_edges_node_Group = { - @live __typename: [ | #Group], - adminsConnection: fragment_members_edges_node_Group_adminsConnection, - @live id: string, - name: string, - } - and fragment_members_edges_node_User = { - @live __typename: [ | #User], - @live id: string, - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestPaginationUnion_user]>, - } - and fragment_members_edges_node = [ - | #Group(fragment_members_edges_node_Group) - | #User(fragment_members_edges_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") and fragment_members_edges_node = + | Group( + { + @live __typename: [ | #Group], + adminsConnection: fragment_members_edges_node_Group_adminsConnection, + @live id: string, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + @live id: string, + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestPaginationUnion_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type rec fragment_members_edges = { node: option, @@ -43,26 +44,9 @@ module Types = { } @live -let unwrap_fragment_members_edges_node: {. "__typename": string } => [ - | #Group(Types.fragment_members_edges_node_Group) - | #User(Types.fragment_members_edges_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment_members_edges_node: Types.fragment_members_edges_node => Types.fragment_members_edges_node = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment_members_edges_node: [ - | #Group(Types.fragment_members_edges_node_Group) - | #User(Types.fragment_members_edges_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment_members_edges_node: Types.fragment_members_edges_node => Types.fragment_members_edges_node = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res index 057e571b..bc41e835 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res @@ -4,14 +4,14 @@ module Types = { @@warning("-30") - type rec response_node_User = { - @live __typename: [ | #User], - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestRefetchingInNode_user]>, - } - and response_node = [ - | #User(response_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_node = + | User( + { + @live __typename: [ | #User], + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestRefetchingInNode_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type response = { node: option, @@ -39,22 +39,9 @@ module Types = { } @live -let unwrap_response_node: {. "__typename": string } => [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.unwrapUnion(_, ["User"]) @live -let wrap_response_node: [ - | #User(Types.response_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_node: Types.response_node => Types.response_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_member_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_member_graphql.res index 92edd938..a5b636a5 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_member_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_member_graphql.res @@ -4,45 +4,29 @@ module Types = { @@warning("-30") - type rec fragment_Group = { - @live __typename: [ | #Group], - name: string, - } - and fragment_User = { - @live __typename: [ | #User], - firstName: string, - onlineStatus: option, - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestUnionFragmentUser_user]>, - } - type fragment = [ - | #Group(fragment_Group) - | #User(fragment_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment = + | Group( + { + @live __typename: [ | #Group], + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + onlineStatus: option, + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestUnionFragmentUser_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) } @live -let unwrap_fragment: {. "__typename": string } => [ - | #Group(Types.fragment_Group) - | #User(Types.fragment_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment: Types.fragment => Types.fragment = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment: [ - | #Group(Types.fragment_Group) - | #User(Types.fragment_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment: Types.fragment => Types.fragment = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_plural_member_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_plural_member_graphql.res index 4c34a7ca..1f1ecc65 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_plural_member_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUnionFragment_plural_member_graphql.res @@ -4,46 +4,30 @@ module Types = { @@warning("-30") - type rec fragment_Group = { - @live __typename: [ | #Group], - name: string, - } - and fragment_User = { - @live __typename: [ | #User], - firstName: string, - onlineStatus: option, - fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestUnionFragmentUser_user]>, - } - type fragment_t = [ - | #Group(fragment_Group) - | #User(fragment_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type fragment_t = + | Group( + { + @live __typename: [ | #Group], + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + onlineStatus: option, + fragmentRefs: RescriptRelay.fragmentRefs<[ | #TestUnionFragmentUser_user]>, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type fragment = array } @live -let unwrap_fragment: {. "__typename": string } => [ - | #Group(Types.fragment_Group) - | #User(Types.fragment_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_fragment: Types.fragment => Types.fragment = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_fragment: [ - | #Group(Types.fragment_Group) - | #User(Types.fragment_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_fragment: Types.fragment => Types.fragment = RescriptRelay_Internal.wrapUnion module Internal = { @live type fragmentRaw diff --git a/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res index 94220333..aa50a2ee 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res @@ -4,42 +4,44 @@ module Types = { @@warning("-30") - type rec response_members_edges_node_Group_members_Group = { - @live __typename: [ | #Group], - avatarUrl: option, - @live id: string, - name: string, - } - and response_members_edges_node_Group_members_User = { - @live __typename: [ | #User], - firstName: string, - @live id: string, - onlineStatus: option, - } - and response_members_edges_node_Group = { - @live __typename: [ | #Group], - avatarUrl: option, - @live id: string, - members: option>>, - name: string, - } - and response_members_edges_node_User = { - @live __typename: [ | #User], - firstName: string, - @live id: string, - onlineStatus: option, - } - and response_members_edges_node_Group_members = [ - | #Group(response_members_edges_node_Group_members_Group) - | #User(response_members_edges_node_Group_members_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_members_edges_node_Group_members = + | Group( + { + @live __typename: [ | #Group], + avatarUrl: option, + @live id: string, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + @live id: string, + onlineStatus: option, + } + ) + | @as("__unselected") UnselectedUnionMember(string) - and response_members_edges_node = [ - | #Group(response_members_edges_node_Group) - | #User(response_members_edges_node_User) - | #UnselectedUnionMember(string) - ] + @tag("__typename") type response_members_edges_node = + | Group( + { + @live __typename: [ | #Group], + avatarUrl: option, + @live id: string, + members: option>>, + name: string, + } + ) + | User( + { + @live __typename: [ | #User], + firstName: string, + @live id: string, + onlineStatus: option, + } + ) + | @as("__unselected") UnselectedUnionMember(string) type rec response_members_edges = { node: option, @@ -60,47 +62,13 @@ module Types = { } @live -let unwrap_response_members_edges_node_Group_members: {. "__typename": string } => [ - | #Group(Types.response_members_edges_node_Group_members_Group) - | #User(Types.response_members_edges_node_Group_members_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_members_edges_node_Group_members: Types.response_members_edges_node_Group_members => Types.response_members_edges_node_Group_members = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_response_members_edges_node_Group_members: [ - | #Group(Types.response_members_edges_node_Group_members_Group) - | #User(Types.response_members_edges_node_Group_members_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_members_edges_node_Group_members: Types.response_members_edges_node_Group_members => Types.response_members_edges_node_Group_members = RescriptRelay_Internal.wrapUnion @live -let unwrap_response_members_edges_node: {. "__typename": string } => [ - | #Group(Types.response_members_edges_node_Group) - | #User(Types.response_members_edges_node_User) - | #UnselectedUnionMember(string) -] = u => switch u["__typename"] { - | "Group" => #Group(u->Obj.magic) - | "User" => #User(u->Obj.magic) - | v => #UnselectedUnionMember(v) -} - +let unwrap_response_members_edges_node: Types.response_members_edges_node => Types.response_members_edges_node = RescriptRelay_Internal.unwrapUnion(_, ["Group", "User"]) @live -let wrap_response_members_edges_node: [ - | #Group(Types.response_members_edges_node_Group) - | #User(Types.response_members_edges_node_User) - | #UnselectedUnionMember(string) -] => {. "__typename": string } = v => switch v { - | #Group(v) => v->Obj.magic - | #User(v) => v->Obj.magic - | #UnselectedUnionMember(v) => {"__typename": v} -} +let wrap_response_members_edges_node: Types.response_members_edges_node => Types.response_members_edges_node = RescriptRelay_Internal.wrapUnion module Internal = { @live let variablesConverter: Js.Dict.t>> = %raw( diff --git a/packages/rescript-relay/src/RescriptRelay_Internal.res b/packages/rescript-relay/src/RescriptRelay_Internal.res index e47d437f..d7e7e693 100644 --- a/packages/rescript-relay/src/RescriptRelay_Internal.res +++ b/packages/rescript-relay/src/RescriptRelay_Internal.res @@ -35,3 +35,15 @@ let internal_nullableToOptionalExnHandler = x => } @live @unboxed type rec arg = Arg(_): arg + +let unwrapUnion: ('a, array) => 'a = %raw(` + function unwrapUnion(union, members) { + if (union != null && members.indexOf(union.__typename) === -1) { + return Object.assign({}, union, {__typename: "__unselected"}); + } + + return union; + } +`) + +let wrapUnion = union => union diff --git a/packages/rescript-relay/src/RescriptRelay_Internal.resi b/packages/rescript-relay/src/RescriptRelay_Internal.resi index fd294b12..964343e1 100644 --- a/packages/rescript-relay/src/RescriptRelay_Internal.resi +++ b/packages/rescript-relay/src/RescriptRelay_Internal.resi @@ -5,3 +5,6 @@ let internal_nullableToOptionalExnHandler: option => 'a> => option< Js.Nullable.t<'b> => 'a, > @live @unboxed type rec arg = Arg(_): arg + +let unwrapUnion: ('a, array) => 'a +let wrapUnion: 'a => 'a