diff --git a/CHANGELOG.md b/CHANGELOG.md index a7d472aa..c974db38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ - Add support for `autoExhaustiveTypes` config and a `@nonExhaustive` directive to control automatic exhaustive checks for unions/interfaces. +- Add React-free mode support and split React APIs into `RescriptRelayReact`. + + - New compiler config: `rescriptRelayMode: "Default" | "NonReact"` (defaults to `"Default"`). + - PPX `-non-react` + - Mark `@rescript/react` and `react-relay` as optional peer deps so non‑React usage does not require them. + +- BREAKING: Move all React-specific APIs out of `RescriptRelay` into `RescriptRelayReact`. + + - `RescriptRelay.Context.Provider` -> `RescriptRelayReact.Context.Provider` + - `RescriptRelay.useEnvironmentFromContext` -> `RescriptRelayReact.useEnvironmentFromContext` + - `RescriptRelay.useSubscribeToInvalidationState` -> `RescriptRelayReact.useSubscribeToInvalidationState` + + Migration: + + - Update imports/usages in app code to reference `RescriptRelayReact` for the APIs listed above. + - For non‑React usage, set `rescriptRelayMode: "NonReact"` in `relay.config.js` and pass `-non-react` to the PPX. + # 4.0.0 - Support `@exhaustive` on interfaces as well. diff --git a/packages/relay b/packages/relay index 08b7496e..9296be1f 160000 --- a/packages/relay +++ b/packages/relay @@ -1 +1 @@ -Subproject commit 08b7496e4cd75faa183399bfebbafb342efdf7ad +Subproject commit 9296be1f6fa7b8fd9fd326d556b20222b04c331e diff --git a/packages/rescript-relay/__tests__/TestProviders.res b/packages/rescript-relay/__tests__/TestProviders.res index da9b0d78..6af42562 100644 --- a/packages/rescript-relay/__tests__/TestProviders.res +++ b/packages/rescript-relay/__tests__/TestProviders.res @@ -2,6 +2,6 @@ module Wrapper = { @react.component let make = (~environment, ~children) => {React.string("Loading...")} }> - children + children } diff --git a/packages/rescript-relay/__tests__/Test_connections.res b/packages/rescript-relay/__tests__/Test_connections.res index fb736eda..90a5c0a2 100644 --- a/packages/rescript-relay/__tests__/Test_connections.res +++ b/packages/rescript-relay/__tests__/Test_connections.res @@ -137,7 +137,7 @@ module Test = { let user = Fragment.use(query.loggedInUser.fragmentRefs) let friends = user.friendsConnection->Fragment.getConnectionNodes let (addFriend, _isAddingFriend) = AddFriendMutation.use() - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let addFriend = useFindAllConnectionIds => addFriend( ~variables={ diff --git a/packages/rescript-relay/__tests__/Test_localPayload.res b/packages/rescript-relay/__tests__/Test_localPayload.res index cf698abc..96b0449c 100644 --- a/packages/rescript-relay/__tests__/Test_localPayload.res +++ b/packages/rescript-relay/__tests__/Test_localPayload.res @@ -54,7 +54,7 @@ module Fragment = %relay(` module Test = { @react.component let make = () => { - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let data = Query.use(~variables=()) let user = Fragment.use(data.loggedInUser.fragmentRefs) diff --git a/packages/rescript-relay/__tests__/Test_mutation.res b/packages/rescript-relay/__tests__/Test_mutation.res index fa730905..8c3df786 100644 --- a/packages/rescript-relay/__tests__/Test_mutation.res +++ b/packages/rescript-relay/__tests__/Test_mutation.res @@ -79,7 +79,7 @@ module InlineFragment = %relay(` module Test = { @react.component let make = () => { - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let query = Query.use(~variables=()) let data = Fragment.use(query.loggedInUser.fragmentRefs) let (mutate, isMutating) = Mutation.use() diff --git a/packages/rescript-relay/__tests__/Test_nullableVariables.res b/packages/rescript-relay/__tests__/Test_nullableVariables.res index 4ef7351c..df32837f 100644 --- a/packages/rescript-relay/__tests__/Test_nullableVariables.res +++ b/packages/rescript-relay/__tests__/Test_nullableVariables.res @@ -20,7 +20,7 @@ module Mutation = %relay(` module Test = { @react.component let make = () => { - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let query = Query.use(~variables=()) let data = query.loggedInUser diff --git a/packages/rescript-relay/__tests__/Test_query.res b/packages/rescript-relay/__tests__/Test_query.res index de7bb3c4..0cf1f761 100644 --- a/packages/rescript-relay/__tests__/Test_query.res +++ b/packages/rescript-relay/__tests__/Test_query.res @@ -50,7 +50,7 @@ module TestPreloaded = { module Test = { @react.component let make = () => { - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let (status, setStatus) = React.useState(() => Some(RelaySchemaAssets_graphql.Online)) let (queryRefFromModule, setQueryRefFromModule) = React.useState(() => None) diff --git a/packages/rescript-relay/__tests__/Test_subscription.res b/packages/rescript-relay/__tests__/Test_subscription.res index 046dae80..b4d083c6 100644 --- a/packages/rescript-relay/__tests__/Test_subscription.res +++ b/packages/rescript-relay/__tests__/Test_subscription.res @@ -30,7 +30,7 @@ module UserUpdatedSubscription = %relay(` module Test = { @react.component let make = () => { - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let query = Query.use(~variables=()) let data = Fragment.use(query.loggedInUser.fragmentRefs) let (ready, setReady) = React.useState(() => false) diff --git a/packages/rescript-relay/__tests__/Test_updatableFragments.res b/packages/rescript-relay/__tests__/Test_updatableFragments.res index 05897a72..07dfd3cf 100644 --- a/packages/rescript-relay/__tests__/Test_updatableFragments.res +++ b/packages/rescript-relay/__tests__/Test_updatableFragments.res @@ -24,7 +24,7 @@ module Test = { @react.component let make = () => { let query = Query.use(~variables=()) - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() let {loggedInUser: {firstName, isOnline, updatableFragmentRefs, bestFriend}} = Fragment.use( query.fragmentRefs, ) diff --git a/packages/rescript-relay/__tests__/Test_updatableQuery.res b/packages/rescript-relay/__tests__/Test_updatableQuery.res index 6500aa1d..126e4a6b 100644 --- a/packages/rescript-relay/__tests__/Test_updatableQuery.res +++ b/packages/rescript-relay/__tests__/Test_updatableQuery.res @@ -14,7 +14,7 @@ module Test = { @react.component let make = () => { let query = Query.use(~variables={id: "user-1"}) - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() switch query.user { | Some({firstName, isOnline, bestFriend}) => diff --git a/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res index 32dd9f50..69b1f07a 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestAliasedFragmentsQuery_graphql.res @@ -231,7 +231,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCatchLoggedInUserPropQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCatchLoggedInUserPropQuery_graphql.res index cf8be883..aa7641fc 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCatchLoggedInUserPropQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCatchLoggedInUserPropQuery_graphql.res @@ -191,7 +191,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropNestedQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropNestedQuery_graphql.res index 23f5bdfd..94edaecf 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropNestedQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropNestedQuery_graphql.res @@ -272,7 +272,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropQuery_graphql.res index bbccc8a9..a9a3bc37 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCatchMemberPropQuery_graphql.res @@ -215,7 +215,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCatchMembersPropQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCatchMembersPropQuery_graphql.res index ea3e51d0..ab98d67e 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCatchMembersPropQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCatchMembersPropQuery_graphql.res @@ -265,7 +265,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCatchUnionMemberQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCatchUnionMemberQuery_graphql.res index b58dfad9..6414b720 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCatchUnionMemberQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCatchUnionMemberQuery_graphql.res @@ -218,7 +218,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res index ab3f6f47..21db2265 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCodesplitQuery_graphql.res @@ -470,7 +470,7 @@ let node = RescriptRelay_Internal.applyCodesplitMetadata(node, [ ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res index 3bee4814..00c188e8 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestConnectionsQuery_graphql.res @@ -314,7 +314,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res index 498a14f9..042cad39 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestCustomScalarsQuery_graphql.res @@ -307,7 +307,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestFragmentQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestFragmentQuery_graphql.res index 8b87d04b..ee9f89cc 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestFragmentQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestFragmentQuery_graphql.res @@ -314,7 +314,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestFragmentRequiredQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestFragmentRequiredQuery_graphql.res index 386db231..acdc53ac 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestFragmentRequiredQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestFragmentRequiredQuery_graphql.res @@ -253,7 +253,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res index bc74263f..497004ad 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestInputUnionQuery_graphql.res @@ -154,7 +154,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res index cfe04352..57f7d3f4 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadQuery_graphql.res @@ -385,7 +385,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res index d828de88..86d036ff 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestLocalPayloadViaNodeInterfaceQuery_graphql.res @@ -445,7 +445,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersMeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersMeQuery_graphql.res index 03a38289..3ab9c8c2 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersMeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersMeQuery_graphql.res @@ -163,7 +163,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res index 3c35ab8a..acaea7b3 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMissingFieldHandlersQuery_graphql.res @@ -199,7 +199,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestMutationQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestMutationQuery_graphql.res index 5147e71d..ddd1e3da 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestMutationQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestMutationQuery_graphql.res @@ -230,7 +230,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res index c6beecac..695288ae 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceOnAbstractTypeQuery_graphql.res @@ -235,7 +235,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res index 38cdf653..f95a6428 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNodeInterfaceQuery_graphql.res @@ -271,7 +271,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestNonReactQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNonReactQuery_graphql.res index e37f3d0a..65f42ae0 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNonReactQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNonReactQuery_graphql.res @@ -176,7 +176,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestNullableVariablesQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestNullableVariablesQuery_graphql.res index 456e570b..9e4dcc3d 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestNullableVariablesQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestNullableVariablesQuery_graphql.res @@ -163,7 +163,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestObserverQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestObserverQuery_graphql.res index a8352506..d32676d8 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestObserverQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestObserverQuery_graphql.res @@ -143,7 +143,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res index 764d9910..75520b28 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeQuery_graphql.res @@ -330,7 +330,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res index bf3eb56e..a6eee2dc 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationInNodeRefetchQuery_graphql.res @@ -394,7 +394,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res index 302fa279..0ae7862e 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionQuery_graphql.res @@ -353,7 +353,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res index 69e72a51..4b31b7c2 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPaginationUnionRefetchQuery_graphql.res @@ -413,7 +413,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestParseCustomScalarArrayQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestParseCustomScalarArrayQuery_graphql.res index 3ed5b0aa..cc39ff17 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestParseCustomScalarArrayQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestParseCustomScalarArrayQuery_graphql.res @@ -197,7 +197,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationQuery_graphql.res index 7b514860..f1ac5687 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationQuery_graphql.res @@ -249,7 +249,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res index bde1a36e..aa056425 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestPrefetchablePaginationRefetchQuery_graphql.res @@ -319,7 +319,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestProvidedVariablesQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestProvidedVariablesQuery_graphql.res index eed6d17b..d57b30ba 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestProvidedVariablesQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestProvidedVariablesQuery_graphql.res @@ -254,7 +254,7 @@ let node: operationType = makeNode(providedVariablesDefinition) ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res index c4a9ab3d..bccf7044 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestQueryInputObjectsQuery_graphql.res @@ -152,7 +152,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res index 859beb70..27b50628 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestQuery_graphql.res @@ -224,7 +224,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res index d3539653..c464a9eb 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeQuery_graphql.res @@ -283,7 +283,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res index a36973c0..418a3599 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingInNodeRefetchQuery_graphql.res @@ -296,7 +296,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingNoArgsRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingNoArgsRefetchQuery_graphql.res index 3f8391cb..dbc361d5 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingNoArgsRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingNoArgsRefetchQuery_graphql.res @@ -144,7 +144,7 @@ let node: operationType = %raw(json` { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res index d9a1a087..7c06c26c 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingQuery_graphql.res @@ -222,7 +222,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res index 03a7b1c4..50c8837e 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRefetchingRefetchQuery_graphql.res @@ -330,7 +330,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRelayResolversAllQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRelayResolversAllQuery_graphql.res index cb348d46..7c54e405 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRelayResolversAllQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRelayResolversAllQuery_graphql.res @@ -391,7 +391,7 @@ let node: operationType = makeNode(LocalUser__id_graphql.node, LocalUser____rela ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRelayResolversQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRelayResolversQuery_graphql.res index 1ffbbb47..c1438373 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRelayResolversQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRelayResolversQuery_graphql.res @@ -209,7 +209,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestRequiredFieldLoggerQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestRequiredFieldLoggerQuery_graphql.res index 156d3aef..21658bf1 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestRequiredFieldLoggerQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestRequiredFieldLoggerQuery_graphql.res @@ -167,7 +167,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestSubscriptionQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestSubscriptionQuery_graphql.res index 70e2b9fc..d3d7ce89 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestSubscriptionQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestSubscriptionQuery_graphql.res @@ -178,7 +178,7 @@ let node: operationType = %raw(json` { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestUnionFragmentQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUnionFragmentQuery_graphql.res index 13fb6bf7..81cf6d51 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUnionFragmentQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUnionFragmentQuery_graphql.res @@ -227,7 +227,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res index 2113e82c..f0a2e9e0 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUnionsQuery_graphql.res @@ -387,7 +387,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestUpdatableFragmentsQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUpdatableFragmentsQuery_graphql.res index a06d087a..4c937703 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUpdatableFragmentsQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUpdatableFragmentsQuery_graphql.res @@ -197,7 +197,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res b/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res index 6e39f7f4..d2029ee5 100644 --- a/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res +++ b/packages/rescript-relay/__tests__/__generated__/TestUpdatableQuery_graphql.res @@ -226,7 +226,7 @@ return { ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/__tests_preloaded__/Test_preloadedQuery.res b/packages/rescript-relay/__tests_preloaded__/Test_preloadedQuery.res index abb966e6..4b923a1d 100644 --- a/packages/rescript-relay/__tests_preloaded__/Test_preloadedQuery.res +++ b/packages/rescript-relay/__tests_preloaded__/Test_preloadedQuery.res @@ -73,7 +73,7 @@ module Test = { @react.component let make = () => { let (queryRef, setQueryRef) = React.useState(() => None) - let environment = RescriptRelay.useEnvironmentFromContext() + let environment = RescriptRelayReact.useEnvironmentFromContext() React.useEffect0(() => { setQueryRef(_ => Some( diff --git a/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_preloadable_graphql.res b/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_preloadable_graphql.res index 48cefb35..a516d383 100644 --- a/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_preloadable_graphql.res +++ b/packages/rescript-relay/__tests_preloaded__/__generated__/TestPreloadedQuery_preloadable_graphql.res @@ -91,7 +91,7 @@ let node: operationType = makeNode(providedVariablesDefinition) ~fetchKey=?, ~networkCacheConfig=?, ) => - RescriptRelay.loadQuery( + RescriptRelayReact.loadQuery( environment, node, variables->Internal.convertVariables, diff --git a/packages/rescript-relay/package.json b/packages/rescript-relay/package.json index 9c9dc8d3..b7336dc6 100644 --- a/packages/rescript-relay/package.json +++ b/packages/rescript-relay/package.json @@ -64,6 +64,14 @@ "relay-runtime": "20.1.1", "rescript": "^12.0.0-0" }, + "peerDependenciesMeta": { + "@rescript/react": { + "optional": true + }, + "react-relay": { + "optional": true + } + }, "dependencies": { "detect-libc": "^2.0.1" } diff --git a/packages/rescript-relay/rescript-relay-ppx/library/DeferredComp.ml b/packages/rescript-relay/rescript-relay-ppx/library/DeferredComp.ml index 9af261fb..5eaa14f6 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/DeferredComp.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/DeferredComp.ml @@ -6,10 +6,10 @@ open Util let lazyExtension = Extension.declare "relay.deferredComponent" Extension.Context.module_expr (let open Ast_pattern in - single_expr_payload - (pexp_ident __ - ||| map (pexp_construct __ none) ~f:(fun f ident -> - f (Ldot (ident, "make"))))) + single_expr_payload + (pexp_ident __ + ||| map (pexp_construct __ none) ~f:(fun f ident -> + f (Ldot (ident, "make"))))) (fun ~loc ~path:_ ident -> match ident with | Ldot (Lident moduleName, "make") -> @@ -30,7 +30,7 @@ let lazyExtension = chunk = [%e makeStringExpr ~loc moduleName]; load = preload; } - [@@live]] + [@@live]] |> UncurriedUtils.wrapAsUncurriedFn ~arity:1; [%stri let make = React.lazy_ loadComponent]; ]; diff --git a/packages/rescript-relay/rescript-relay-ppx/library/Fragment.ml b/packages/rescript-relay/rescript-relay-ppx/library/Fragment.ml index 1e9fc343..73d8c535 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/Fragment.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/Fragment.ml @@ -23,7 +23,9 @@ let make ~loc ~moduleName ~refetchableQueryName [%t typeFromGeneratedModule ["Types"; "fragment"]] = [%e valFromGeneratedModule ["Internal"; "convertFragment"]]]; ]; - (match (!NonReactUtils.enabled, hasAutocodesplitDirective) with + (match + (NonReactUtils.enabled.contents, hasAutocodesplitDirective) + with | true, _ -> [] | false, true -> [ @@ -34,15 +36,24 @@ let make ~loc ~moduleName ~refetchableQueryName ] | false, false -> []); [ - [%stri - let waitForFragmentData ~environment fRef = - RescriptRelay_Fragment.waitForFragmentData ~environment - ~convertFragment - ~fRef: - (fRef |. [%e valFromGeneratedModule ["getFragmentRef"]]) - ~node:[%e valFromGeneratedModule ["node"]]]; + (if NonReactUtils.enabled.contents then + [%stri + let waitForFragmentData ~environment fRef = + RescriptRelay_FragmentNonReact.waitForFragmentData + ~environment ~convertFragment + ~fRef: + (fRef |. [%e valFromGeneratedModule ["getFragmentRef"]]) + ~node:[%e valFromGeneratedModule ["node"]]] + else + [%stri + let waitForFragmentData ~environment fRef = + RescriptRelay_Fragment.waitForFragmentData ~environment + ~convertFragment + ~fRef: + (fRef |. [%e valFromGeneratedModule ["getFragmentRef"]]) + ~node:[%e valFromGeneratedModule ["node"]]]); ]; - (match (!NonReactUtils.enabled, hasInlineDirective) with + (match (NonReactUtils.enabled.contents, hasInlineDirective) with | true, _ -> [] | false, false -> [ @@ -72,15 +83,44 @@ let make ~loc ~moduleName ~refetchableQueryName | false -> [ (if isPlural then + if NonReactUtils.enabled.contents then + [%stri + let readResolverFragment fRef : + [%t typeFromGeneratedModule ["Types"; "fragment"]] = + let fRef = + fRef + |. RescriptRelay_Internal + .internal_resolverFragmentRefsToFragmentRefsPlural + in + RescriptRelay_FragmentNonReact.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_resolverFragmentRefsToFragmentRefsPlural + in + RescriptRelay_Fragment.read ~convertFragment + ~fRef: + (fRef + |. [%e valFromGeneratedModule ["getFragmentRef"]]) + ~node:[%e valFromGeneratedModule ["node"]]] + else if NonReactUtils.enabled.contents then [%stri let readResolverFragment fRef : [%t typeFromGeneratedModule ["Types"; "fragment"]] = let fRef = fRef |. RescriptRelay_Internal - .internal_resolverFragmentRefsToFragmentRefsPlural + .internal_resolverFragmentRefsToFragmentRefs in - RescriptRelay_Fragment.read ~convertFragment + RescriptRelay_FragmentNonReact.read ~convertFragment ~fRef: (fRef |. [%e valFromGeneratedModule ["getFragmentRef"]]) @@ -101,20 +141,32 @@ let make ~loc ~moduleName ~refetchableQueryName ~node:[%e valFromGeneratedModule ["node"]]]); ] | true -> []); - (match (!NonReactUtils.enabled, hasInlineDirective) with + (match (NonReactUtils.enabled.contents, hasInlineDirective) with | true, _ -> [] | false, true -> [ - [%stri - let readInline fRef : - [%t typeFromGeneratedModule ["Types"; "fragment"]] = - RescriptRelay_Fragment.readInlineData ~convertFragment - ~fRef: - (fRef |. [%e valFromGeneratedModule ["getFragmentRef"]]) - ~node:[%e valFromGeneratedModule ["node"]]]; + (if NonReactUtils.enabled.contents then + [%stri + let readInline fRef : + [%t typeFromGeneratedModule ["Types"; "fragment"]] = + RescriptRelay_FragmentNonReact.readInlineData_ + ~convertFragment + ~fRef: + (fRef + |. [%e valFromGeneratedModule ["getFragmentRef"]]) + ~node:[%e valFromGeneratedModule ["node"]]] + else + [%stri + let readInline fRef : + [%t typeFromGeneratedModule ["Types"; "fragment"]] = + RescriptRelay_Fragment.readInlineData ~convertFragment + ~fRef: + (fRef + |. [%e valFromGeneratedModule ["getFragmentRef"]]) + ~node:[%e valFromGeneratedModule ["node"]]]); ] | false, false -> []); - (match (!NonReactUtils.enabled, refetchableQueryName) with + (match (NonReactUtils.enabled.contents, refetchableQueryName) with | true, _ | false, None -> [] | false, Some refetchableQueryName -> ( let typeFromRefetchableModule = diff --git a/packages/rescript-relay/rescript-relay-ppx/library/Mutation.ml b/packages/rescript-relay/rescript-relay-ppx/library/Mutation.ml index ef69f805..42f4b9ab 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/Mutation.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/Mutation.ml @@ -32,14 +32,22 @@ let make ~loc ~moduleName = [%e valFromGeneratedModule ["Internal"; "convertWrapRawResponse"]]]; - [%stri - let commitMutation = - RescriptRelay_Mutation.commitMutation ~convertVariables - ~convertResponse ~convertWrapRawResponse - ~node:[%e valFromGeneratedModule ["node"]]]; + (if NonReactUtils.enabled.contents then + [%stri + let commitMutation = + RescriptRelay_MutationNonReact.commitMutation + ~convertVariables ~convertResponse + ~convertWrapRawResponse + ~node:[%e valFromGeneratedModule ["node"]]] + else + [%stri + let commitMutation = + RescriptRelay_Mutation.commitMutation ~convertVariables + ~convertResponse ~convertWrapRawResponse + ~node:[%e valFromGeneratedModule ["node"]]]); ] @ - if not !NonReactUtils.enabled then + if not NonReactUtils.enabled.contents then [ [%stri let use = diff --git a/packages/rescript-relay/rescript-relay-ppx/library/Query.ml b/packages/rescript-relay/rescript-relay-ppx/library/Query.ml index d204ac82..6053dcb4 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/Query.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/Query.ml @@ -9,39 +9,40 @@ let make ~loc ~moduleName ~hasRawResponseType ~hasAutocodesplitDirective = (Pmod_structure (List.concat [ - [ - [%stri [@@@ocaml.warning "-32-34-60"]]; - [%stri include [%m moduleIdentFromGeneratedModule ["Utils"]]]; - [%stri module Operation = [%m moduleIdentFromGeneratedModule []]]; - [%stri - module Types = [%m moduleIdentFromGeneratedModule ["Types"]]]; - [%stri - let convertVariables : - [%t typeFromGeneratedModule ["Types"; "variables"]] -> - [%t typeFromGeneratedModule ["Types"; "variables"]] = - [%e valFromGeneratedModule ["Internal"; "convertVariables"]]]; - [%stri - let convertResponse : - [%t typeFromGeneratedModule ["Types"; "response"]] -> - [%t typeFromGeneratedModule ["Types"; "response"]] = - [%e valFromGeneratedModule ["Internal"; "convertResponse"]]]; - [%stri - let convertWrapRawResponse : - [%t typeFromGeneratedModule ["Types"; "rawResponse"]] -> - [%t typeFromGeneratedModule ["Types"; "rawResponse"]] = - [%e - valFromGeneratedModule - ["Internal"; "convertWrapRawResponse"]]]; - [%stri - external mkQueryRefOpt : - [%t typeFromGeneratedModule ["queryRef"]] option -> - [%t typeFromGeneratedModule ["queryRef"]] option = "%identity"]; - [%stri - external mkQueryRef : - [%t typeFromGeneratedModule ["queryRef"]] -> - [%t typeFromGeneratedModule ["queryRef"]] = "%identity"]; - ] - @ (if not !NonReactUtils.enabled then + ([ + [%stri [@@@ocaml.warning "-32-34-60"]]; + [%stri include [%m moduleIdentFromGeneratedModule ["Utils"]]]; + [%stri module Operation = [%m moduleIdentFromGeneratedModule []]]; + [%stri + module Types = [%m moduleIdentFromGeneratedModule ["Types"]]]; + [%stri + let convertVariables : + [%t typeFromGeneratedModule ["Types"; "variables"]] -> + [%t typeFromGeneratedModule ["Types"; "variables"]] = + [%e valFromGeneratedModule ["Internal"; "convertVariables"]]]; + [%stri + let convertResponse : + [%t typeFromGeneratedModule ["Types"; "response"]] -> + [%t typeFromGeneratedModule ["Types"; "response"]] = + [%e valFromGeneratedModule ["Internal"; "convertResponse"]]]; + [%stri + let convertWrapRawResponse : + [%t typeFromGeneratedModule ["Types"; "rawResponse"]] -> + [%t typeFromGeneratedModule ["Types"; "rawResponse"]] = + [%e + valFromGeneratedModule + ["Internal"; "convertWrapRawResponse"]]]; + [%stri + external mkQueryRefOpt : + [%t typeFromGeneratedModule ["queryRef"]] option -> + [%t typeFromGeneratedModule ["queryRef"]] option + = "%identity"]; + [%stri + external mkQueryRef : + [%t typeFromGeneratedModule ["queryRef"]] -> + [%t typeFromGeneratedModule ["queryRef"]] = "%identity"]; + ] + @ (if not NonReactUtils.enabled.contents then [ [%stri let use = @@ -60,7 +61,34 @@ let make ~loc ~moduleName ~hasRawResponseType ~hasAutocodesplitDirective = ~node:[%e valFromGeneratedModule ["node"]]]; ] else []) - @ [ + @ + if NonReactUtils.enabled.contents then + [ + [%stri + let fetch = + RescriptRelay_QueryNonReact.fetch ~convertResponse + ~convertVariables + ~node:[%e valFromGeneratedModule ["node"]]]; + [%stri + let fetchPromised = + RescriptRelay_QueryNonReact.fetchPromised ~convertResponse + ~convertVariables + ~node:[%e valFromGeneratedModule ["node"]]]; + [%stri + let retain = + RescriptRelay_QueryNonReact.retain ~convertVariables + ~node:[%e valFromGeneratedModule ["node"]]]; + (match hasRawResponseType with + | true -> + [%stri + let commitLocalPayload = + RescriptRelay_QueryNonReact.commitLocalPayload + ~convertVariables ~convertWrapRawResponse + ~node:[%e valFromGeneratedModule ["node"]]] + | false -> [%stri ()]); + ] + else + [ [%stri let fetch = RescriptRelay_Query.fetch ~convertResponse ~convertVariables @@ -82,8 +110,10 @@ let make ~loc ~moduleName ~hasRawResponseType ~hasAutocodesplitDirective = ~convertWrapRawResponse ~node:[%e valFromGeneratedModule ["node"]]] | false -> [%stri ()]); - ]; - (match (!NonReactUtils.enabled, hasAutocodesplitDirective) with + ]); + (match + (NonReactUtils.enabled.contents, hasAutocodesplitDirective) + with | true, _ -> [] | false, true -> [ diff --git a/packages/rescript-relay/rescript-relay-ppx/library/UncurriedUtils.ml b/packages/rescript-relay/rescript-relay-ppx/library/UncurriedUtils.ml index e18c6079..31e08630 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/UncurriedUtils.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/UncurriedUtils.ml @@ -113,4 +113,5 @@ let uncurriedMapper = } let mapStructureItem str = - if !enabled then uncurriedMapper.structure_item uncurriedMapper str else str + if enabled.contents then uncurriedMapper.structure_item uncurriedMapper str + else str diff --git a/packages/rescript-relay/rescript-relay-ppx/library/UpdatableFragment.ml b/packages/rescript-relay/rescript-relay-ppx/library/UpdatableFragment.ml index b4296f17..d50681d5 100644 --- a/packages/rescript-relay/rescript-relay-ppx/library/UpdatableFragment.ml +++ b/packages/rescript-relay/rescript-relay-ppx/library/UpdatableFragment.ml @@ -12,7 +12,8 @@ let make ~loc ~moduleName = [%stri module Types = [%m moduleIdentFromGeneratedModule ["Types"]]]; [%stri - let readUpdatableFragment = [%e valFromGeneratedModule ["readUpdatableFragment"]]]; + let readUpdatableFragment = + [%e valFromGeneratedModule ["readUpdatableFragment"]]]; ]; ] |> List.map UncurriedUtils.mapStructureItem)) diff --git a/packages/rescript-relay/src/RescriptRelay.res b/packages/rescript-relay/src/RescriptRelay.res index 64aaca48..2148395a 100644 --- a/packages/rescript-relay/src/RescriptRelay.res +++ b/packages/rescript-relay/src/RescriptRelay.res @@ -827,33 +827,7 @@ module Environment = { } } -module Context = { - type t - - type contextShape = {"environment": Environment.t} - - @module("react-relay") - external context: React.Context.t> = "ReactRelayContext" - - module Provider = { - @react.component - let make = (~environment: Environment.t, ~children) => { - let provider = React.Context.provider(context) - React.createElement(provider, {value: Some({"environment": environment}), children}) - } - } -} - -exception EnvironmentNotFoundInContext - -let useEnvironmentFromContext = () => { - let context = React.useContext(Context.context) - - switch context { - | Some(ctx) => ctx["environment"] - | None => throw(EnvironmentNotFoundInContext) - } -} +/* React Context moved to RescriptRelayReact */ type fetchPolicy = | @as("store-only") StoreOnly @@ -870,69 +844,7 @@ type fetchQueryOptions = { fetchPolicy?: fetchPolicy, } -type loadQueryConfig = { - fetchKey: option, - fetchPolicy: option, - networkCacheConfig: option, -} - -@module("react-relay") -external loadQuery: (Environment.t, queryNode<'a>, 'variables, loadQueryConfig) => 'queryResponse = - "loadQuery" - -module type MakeLoadQueryConfig = { - type variables - type loadedQueryRef - type response - type node - let query: queryNode - let convertVariables: variables => variables -} - -module MakeLoadQuery = (C: MakeLoadQueryConfig) => { - let load: ( - ~environment: Environment.t, - ~variables: C.variables, - ~fetchPolicy: fetchPolicy=?, - ~fetchKey: string=?, - ~networkCacheConfig: cacheConfig=?, - ) => C.loadedQueryRef = ( - ~environment, - ~variables, - ~fetchPolicy=?, - ~fetchKey=?, - ~networkCacheConfig=?, - ) => - loadQuery( - environment, - C.query, - variables->C.convertVariables, - { - fetchKey, - fetchPolicy, - networkCacheConfig, - }, - ) - - type rawPreloadToken<'response> = {source: Nullable.t>} - external tokenToRaw: C.loadedQueryRef => rawPreloadToken = "%identity" - - let queryRefToObservable = token => { - let raw = token->tokenToRaw - raw.source->Nullable.toOption - } - - let queryRefToPromise = token => { - Promise.make((resolve, _) => { - switch token->queryRefToObservable { - | None => resolve(Error()) - | Some(o) => - open Observable - let _: subscription = o->subscribe(makeObserver(~complete=() => resolve(Ok()))) - } - }) - } -} +/* React loadQuery helpers moved to RescriptRelayReact */ type mutationError = {message: string} @@ -944,6 +856,4 @@ external commitLocalUpdate: ( ~updater: RecordSourceSelectorProxy.t => unit, ) => unit = "commitLocalUpdate" -@module("react-relay") -external useSubscribeToInvalidationState: (array, unit => unit) => Disposable.t = - "useSubscribeToInvalidationState" +/* React invalidation subscribe moved to RescriptRelayReact */ diff --git a/packages/rescript-relay/src/RescriptRelay.resi b/packages/rescript-relay/src/RescriptRelay.resi index fcc48f81..a7c560d8 100644 --- a/packages/rescript-relay/src/RescriptRelay.resi +++ b/packages/rescript-relay/src/RescriptRelay.resi @@ -1534,34 +1534,7 @@ type fetchQueryFetchPolicy = /**An error from a mutation.*/ type mutationError = {message: string} -/**Context provider for the Relay environment.*/ -module Context: { - /**Type representing the context.*/ - type t - - /**The expected shape of the context.*/ - type contextShape = {"environment": Environment.t} - - /**The actual React context coming from Relay.*/ - @module("react-relay") - external context: React.Context.t> = "ReactRelayContext" - - /**The context provider you wrap your app in and pass your `Environment` for Relay to work.*/ - module Provider: { - /**The React component you wrap your app in and pass your `Environment` for Relay to work.*/ - type props<'environment, 'children> = { - environment: 'environment, - children: 'children, - } - let make: props => React.element - } -} - -/**An exception saying that the environment could not be found in the context. Means you forgot to wrap your app in ``*/ -exception EnvironmentNotFoundInContext - -/**Hook for getting the current environment from context.*/ -let useEnvironmentFromContext: unit => Environment.t +/* React Context moved to RescriptRelayReact */ /**An exception detailing that a mutation failed.*/ exception Mutation_failed(array) @@ -1603,38 +1576,7 @@ external commitLocalUpdate: ( ~updater: RecordSourceSelectorProxy.t => unit, ) => unit = "commitLocalUpdate" -/** - Subscribes to invalidation events for specific records. - - Executes a callback whenever any of the specified records are invalidated. - Useful for triggering refetches or UI updates when cached data becomes stale. - - ## Parameters - - Array of `dataId`s to watch for invalidation - - Callback function executed when any watched record is invalidated - - ## Examples - - ```rescript - // Watch for user invalidation and refetch - let disposable = RescriptRelay.useSubscribeToInvalidationState( - [user.__id], - () => { - // Refetch user data when invalidated - UserQuery.fetchPromised(~environment, ~variables={id: user.id}) - ->Promise.done - } - ) - - // Clean up subscription - React.useEffect1(() => { - Some(() => disposable->RescriptRelay.Disposable.dispose) - }, [disposable]) - ``` -*/ -@module("react-relay") -external useSubscribeToInvalidationState: (array, unit => unit) => Disposable.t = - "useSubscribeToInvalidationState" +/* React invalidation subscribe moved to RescriptRelayReact */ /**Options valid when fetching a query outside of React's render method (like when using `Query.fetch`).*/ type fetchQueryOptions = { @@ -1642,35 +1584,4 @@ type fetchQueryOptions = { fetchPolicy?: fetchPolicy, } -type loadQueryConfig = { - fetchKey: option, - fetchPolicy: option, - networkCacheConfig: option, -} - -@module("react-relay") -external loadQuery: (Environment.t, queryNode<'a>, 'variables, loadQueryConfig) => 'queryResponse = - "loadQuery" - -module type MakeLoadQueryConfig = { - type variables - type loadedQueryRef - type response - type node - let query: queryNode - let convertVariables: variables => variables -} - -module MakeLoadQuery: (C: MakeLoadQueryConfig) => -{ - let load: ( - ~environment: Environment.t, - ~variables: C.variables, - ~fetchPolicy: fetchPolicy=?, - ~fetchKey: string=?, - ~networkCacheConfig: cacheConfig=?, - ) => C.loadedQueryRef - - let queryRefToObservable: C.loadedQueryRef => option> - let queryRefToPromise: C.loadedQueryRef => promise> -} +/* React loadQuery helpers moved to RescriptRelayReact */ diff --git a/packages/rescript-relay/src/RescriptRelayReact.res b/packages/rescript-relay/src/RescriptRelayReact.res new file mode 100644 index 00000000..4df59751 --- /dev/null +++ b/packages/rescript-relay/src/RescriptRelayReact.res @@ -0,0 +1,94 @@ +open RescriptRelay + +module Context = { + type t + type contextShape = {"environment": Environment.t} + @module("react-relay") + external context: React.Context.t> = "ReactRelayContext" + + module Provider = { + @react.component + let make = (~environment: Environment.t, ~children) => { + let provider = React.Context.provider(context) + React.createElement(provider, {value: Some({"environment": environment}), children}) + } + } +} + +exception EnvironmentNotFoundInContext + +let useEnvironmentFromContext = () => { + let context = React.useContext(Context.context) + switch context { + | Some(ctx) => ctx["environment"] + | None => throw(EnvironmentNotFoundInContext) + } +} + +type loadQueryConfig = { + fetchKey: option, + fetchPolicy: option, + networkCacheConfig: option, +} + +@module("react-relay") +external loadQuery: (Environment.t, queryNode<'a>, 'variables, loadQueryConfig) => 'queryResponse = + "loadQuery" + +module type MakeLoadQueryConfig = { + type variables + type loadedQueryRef + type response + type node + let query: queryNode + let convertVariables: variables => variables +} + +module MakeLoadQuery = (C: MakeLoadQueryConfig) => { + let load: ( + ~environment: Environment.t, + ~variables: C.variables, + ~fetchPolicy: fetchPolicy=?, + ~fetchKey: string=?, + ~networkCacheConfig: cacheConfig=?, + ) => C.loadedQueryRef = ( + ~environment, + ~variables, + ~fetchPolicy=?, + ~fetchKey=?, + ~networkCacheConfig=?, + ) => + loadQuery( + environment, + C.query, + variables->C.convertVariables, + { + fetchKey, + fetchPolicy, + networkCacheConfig, + }, + ) + + type rawPreloadToken<'response> = {source: Nullable.t>} + external tokenToRaw: C.loadedQueryRef => rawPreloadToken = "%identity" + + let queryRefToObservable = token => { + let raw = token->tokenToRaw + raw.source->Nullable.toOption + } + + let queryRefToPromise = token => { + Promise.make((resolve, _) => { + switch token->queryRefToObservable { + | None => resolve(Error()) + | Some(o) => + open Observable + let _: subscription = o->subscribe(makeObserver(~complete=() => resolve(Ok()))) + } + }) + } +} + +@module("react-relay") +external useSubscribeToInvalidationState: (array, unit => unit) => Disposable.t = + "useSubscribeToInvalidationState" diff --git a/packages/rescript-relay/src/RescriptRelay_FragmentNonReact.res b/packages/rescript-relay/src/RescriptRelay_FragmentNonReact.res new file mode 100644 index 00000000..dc80902b --- /dev/null +++ b/packages/rescript-relay/src/RescriptRelay_FragmentNonReact.res @@ -0,0 +1,29 @@ +/* React-free Fragment runtime: read, readInlineData, waitForFragmentData */ + +open RescriptRelay + +type fragmentNode<'node> = RescriptRelay.fragmentNode<'node> + +@module("relay-runtime/lib/store/ResolverFragments") +external readFragment_: (fragmentNode<'node>, 'fragmentRef) => 'fragment = "readFragment" + +@module("relay-runtime") +external readInlineData: (fragmentNode<'node>, 'fragmentRef) => 'fragment = "readInlineData" + +@module("relay-runtime/experimental") +external waitForFragmentData_: ( + Environment.t, + fragmentNode<'node>, + 'fragmentRef, +) => promise<'fragment> = "waitForFragmentData" + +let read = (~node, ~convertFragment: 'fragment => 'fragment, ~fRef) => + fRef->readFragment_(node)->convertFragment + +let readInlineData_ = (~node, ~convertFragment: 'fragment => 'fragment, ~fRef) => + fRef->readInlineData(node)->convertFragment + +let waitForFragmentData = (~environment, ~node, ~convertFragment: 'fragment => 'fragment, ~fRef) => + waitForFragmentData_(environment, node, fRef)->Promise.then(res => + res->convertFragment->Promise.resolve + ) diff --git a/packages/rescript-relay/src/RescriptRelay_MutationNonReact.res b/packages/rescript-relay/src/RescriptRelay_MutationNonReact.res new file mode 100644 index 00000000..8aa7abfe --- /dev/null +++ b/packages/rescript-relay/src/RescriptRelay_MutationNonReact.res @@ -0,0 +1,56 @@ +/* React-free Mutation runtime: commitMutation only */ + +type mutationNode<'node> = RescriptRelay.mutationNode<'node> + +@obj +external makeConfig: ( + ~mutation: mutationNode<'node>, + ~variables: 'variables, + ~onCompleted: ('response, option) => unit=?, + ~onError: JsExn.t => unit=?, + ~optimisticResponse: 'rawResponse=?, + ~optimisticUpdater: RescriptRelay.RecordSourceSelectorProxy.t => unit=?, + ~updater: (RescriptRelay.RecordSourceSelectorProxy.t, 'response) => unit=?, + ~uploadables: RescriptRelay.uploadables=?, + unit, +) => 'config = "" + +@module("relay-runtime") +external commitMutation: (RescriptRelay.Environment.t, 'config) => RescriptRelay.Disposable.t = + "commitMutation" + +let commitMutation = ( + ~convertVariables: 'variables => 'variables, + ~node: 'm, + ~convertResponse: 'response => 'response, + ~convertWrapRawResponse: 'rawResponse => 'rawResponse, +) => + ( + ~environment: RescriptRelay.Environment.t, + ~variables: 'variables, + ~optimisticUpdater=?, + ~optimisticResponse: option<'rawResponse>=?, + ~updater: option<(RescriptRelay.RecordSourceSelectorProxy.t, 'response) => unit>=?, + ~onCompleted: option<('response, option) => unit>=?, + ~onError: option unit>=?, + ~uploadables: option=?, + ) => + commitMutation( + environment, + makeConfig( + ~mutation=node, + ~variables=variables->convertVariables, + ~onCompleted=?switch onCompleted { + | Some(f) => Some((res, err) => f(res->convertResponse, err)) + | None => None + }, + ~onError?, + ~optimisticResponse=?optimisticResponse->Option.map(convertWrapRawResponse), + ~optimisticUpdater?, + ~updater=?updater->Option.map(u => + (store, response) => u(store, response->convertResponse) + ), + ~uploadables?, + (), + ), + ) diff --git a/packages/rescript-relay/src/RescriptRelay_QueryNonReact.res b/packages/rescript-relay/src/RescriptRelay_QueryNonReact.res new file mode 100644 index 00000000..ca62755a --- /dev/null +++ b/packages/rescript-relay/src/RescriptRelay_QueryNonReact.res @@ -0,0 +1,108 @@ +/* React-free Query runtime: fetch, fetchPromised, retain, commitLocalPayload */ + +type subscription +type observable<'a> +type operationDescriptor + +type queryNode<'node> = RescriptRelay.queryNode<'node> + +@module("relay-runtime") +external fetchQuery: ( + RescriptRelay.Environment.t, + queryNode<'node>, + 'variables, + option, +) => observable<'response> = "fetchQuery" + +@module("relay-runtime") +external createOperationDescriptor: (queryNode<'node>, 'variables) => operationDescriptor = + "createOperationDescriptor" + +/* moved type decls above */ + +@obj +external makeObserver: ( + ~next: 'a => unit=?, + ~error: JsExn.t => unit=?, + ~complete: unit => unit=?, +) => 'obs = "" + +@send +external subscribe: (observable<'a>, 'obs) => subscription = "subscribe" + +@send +external toPromise: observable<'a> => promise<'a> = "toPromise" + +external ignoreSubscription: subscription => unit = "%ignore" + +let fetch = ( + ~node, + ~convertResponse: 'response => 'response, + ~convertVariables: 'variables => 'variables, +) => { + ( + ~environment: RescriptRelay.Environment.t, + ~variables: 'variables, + ~onResult, + ~networkCacheConfig=?, + ~fetchPolicy=?, + ) => { + fetchQuery( + environment, + node, + variables->convertVariables, + Some({?networkCacheConfig, ?fetchPolicy}), + ) + ->subscribe( + makeObserver( + ~next=res => onResult(Ok(res->convertResponse)), + ~error=err => onResult(Error(err)), + ), + ) + ->ignoreSubscription + } +} + +let fetchPromised = ( + ~node, + ~convertResponse: 'response => 'response, + ~convertVariables: 'variables => 'variables, +) => { + ( + ~environment: RescriptRelay.Environment.t, + ~variables: 'variables, + ~networkCacheConfig=?, + ~fetchPolicy=?, + ) => + fetchQuery( + environment, + node, + variables->convertVariables, + Some({?networkCacheConfig, ?fetchPolicy}), + ) + ->toPromise + ->Promise.then(res => res->convertResponse->Promise.resolve) +} + +@send +external retain_: (RescriptRelay.Environment.t, operationDescriptor) => RescriptRelay.Disposable.t = + "retain" +@send +external commitPayload: (RescriptRelay.Environment.t, operationDescriptor, 'payload) => unit = + "commitPayload" + +let retain = (~node, ~convertVariables: 'variables => 'variables) => { + (~environment: RescriptRelay.Environment.t, ~variables: 'variables) => + environment->retain_(createOperationDescriptor(node, variables->convertVariables)) +} + +let commitLocalPayload = ( + ~node, + ~convertVariables: 'variables => 'variables, + ~convertWrapRawResponse: 'rawResponse => 'rawResponse, +) => + (~environment: RescriptRelay.Environment.t, ~variables: 'variables, ~payload: 'rawResponse) => + environment->commitPayload( + createOperationDescriptor(node, variables->convertVariables), + payload->convertWrapRawResponse, + )