react-relay 20.1.1 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayContext.js.flow +2 -2
  3. package/ReactRelayFragmentContainer.js.flow +8 -9
  4. package/ReactRelayLocalQueryRenderer.js.flow +11 -3
  5. package/ReactRelayLoggingContext.js.flow +3 -3
  6. package/ReactRelayPaginationContainer.js.flow +31 -24
  7. package/ReactRelayQueryFetcher.js.flow +1 -1
  8. package/ReactRelayQueryRenderer.js.flow +2 -2
  9. package/ReactRelayQueryRendererContext.js.flow +2 -2
  10. package/ReactRelayRefetchContainer.js.flow +17 -14
  11. package/ReactRelayTestMocker.js.flow +10 -10
  12. package/ReactRelayTypes.js.flow +18 -20
  13. package/RelayContext.js.flow +3 -3
  14. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +11 -11
  15. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +5 -5
  16. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +5 -5
  17. package/__flowtests__/RelayModern-flowtest.js.flow +24 -27
  18. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -1
  19. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -4
  20. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -4
  21. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +9 -10
  22. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +4 -5
  23. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +9 -10
  24. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +4 -5
  25. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
  26. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
  27. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -4
  28. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +5 -6
  29. package/buildReactRelayContainer.js.flow +4 -4
  30. package/getRootVariablesForFragments.js.flow +1 -1
  31. package/hooks.js +1 -1
  32. package/hooks.js.flow +23 -8
  33. package/index.js +1 -1
  34. package/index.js.flow +40 -14
  35. package/isRelayEnvironment.js.flow +1 -1
  36. package/jest-react/internalAct.js.flow +1 -1
  37. package/legacy.js +1 -1
  38. package/legacy.js.flow +32 -13
  39. package/lib/ReactRelayFragmentContainer.js +1 -1
  40. package/lib/ReactRelayPaginationContainer.js +8 -8
  41. package/lib/ReactRelayRefetchContainer.js +8 -8
  42. package/lib/ReactRelayTestMocker.js +5 -5
  43. package/lib/hooks.js +18 -8
  44. package/lib/index.js +30 -14
  45. package/lib/legacy.js +26 -13
  46. package/lib/relay-hooks/legacy/useBlockingPaginationFragment.js +5 -5
  47. package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +34 -34
  48. package/lib/relay-hooks/loadEntryPoint.js +2 -2
  49. package/lib/relay-hooks/loadQuery.js +14 -14
  50. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -10
  51. package/lib/relay-hooks/readFragmentInternal.js +6 -6
  52. package/lib/relay-hooks/rsc/serverFetchQuery.js +20 -0
  53. package/lib/relay-hooks/rsc/serverPreloadQuery.js +31 -0
  54. package/lib/relay-hooks/rsc/serverReadFragment.js +15 -0
  55. package/lib/relay-hooks/rsc/useQueryFromServer.js +62 -0
  56. package/lib/relay-hooks/useFragmentInternal_CURRENT.js +49 -25
  57. package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +81 -44
  58. package/lib/relay-hooks/useLazyLoadQueryNode.js +32 -19
  59. package/lib/relay-hooks/useMutation.js +6 -14
  60. package/lib/relay-hooks/useMutationAction_EXPERIMENTAL.js +26 -0
  61. package/lib/relay-hooks/usePreloadedQuery.js +52 -47
  62. package/lib/relay-hooks/useQueryLoader.js +2 -2
  63. package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +2 -2
  64. package/lib/relay-hooks/useRefetchableFragmentInternal.js +31 -31
  65. package/lib/rsc-client_EXPERIMENTAL.js +7 -0
  66. package/lib/rsc_EXPERIMENTAL.js +43 -0
  67. package/multi-actor/ActorChange.js.flow +1 -1
  68. package/package.json +3 -2
  69. package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
  70. package/relay-hooks/EntryPointTypes.flow.js.flow +61 -67
  71. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
  72. package/relay-hooks/MatchContainer.js.flow +12 -6
  73. package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
  74. package/relay-hooks/QueryResource.js.flow +6 -6
  75. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
  76. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -6
  77. package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +48 -1
  78. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -9
  79. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -4
  80. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +5 -6
  81. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +27 -32
  82. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +25 -25
  83. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +26 -32
  84. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +23 -30
  85. package/relay-hooks/__flowtests__/utils.js.flow +4 -4
  86. package/relay-hooks/getConnectionState.js.flow +2 -2
  87. package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
  88. package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +24 -25
  89. package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
  90. package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
  91. package/relay-hooks/loadEntryPoint.js.flow +15 -13
  92. package/relay-hooks/loadQuery.js.flow +18 -18
  93. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
  94. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
  95. package/relay-hooks/readFragmentInternal.js.flow +9 -9
  96. package/relay-hooks/rsc/serverFetchQuery.js.flow +31 -0
  97. package/relay-hooks/rsc/serverPreloadQuery.js.flow +69 -0
  98. package/relay-hooks/rsc/serverReadFragment.js.flow +33 -0
  99. package/relay-hooks/rsc/useQueryFromServer.js.flow +135 -0
  100. package/relay-hooks/useClientQuery.js.flow +2 -2
  101. package/relay-hooks/useEntryPointLoader.js.flow +11 -11
  102. package/relay-hooks/useFragment.js.flow +7 -7
  103. package/relay-hooks/useFragmentInternal.js.flow +1 -1
  104. package/relay-hooks/useFragmentInternal_CURRENT.js.flow +54 -22
  105. package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +95 -46
  106. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  107. package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
  108. package/relay-hooks/useLazyLoadQuery.js.flow +10 -3
  109. package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
  110. package/relay-hooks/useLoadMoreFunction.js.flow +7 -6
  111. package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -5
  112. package/relay-hooks/useMemoVariables.js.flow +1 -1
  113. package/relay-hooks/useMutation.js.flow +8 -16
  114. package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
  115. package/relay-hooks/usePaginationFragment.js.flow +15 -11
  116. package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +19 -18
  117. package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +19 -18
  118. package/relay-hooks/usePreloadedQuery.js.flow +119 -85
  119. package/relay-hooks/useQueryLoader.js.flow +27 -23
  120. package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
  121. package/relay-hooks/useRefetchableFragment.js.flow +16 -11
  122. package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
  123. package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
  124. package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
  125. package/relay-hooks/useSubscription.js.flow +1 -1
  126. package/rsc-client_EXPERIMENTAL.js +10 -0
  127. package/rsc-client_EXPERIMENTAL.js.flow +23 -0
  128. package/rsc_EXPERIMENTAL.js +10 -0
  129. package/rsc_EXPERIMENTAL.js.flow +90 -0
@@ -13,64 +13,69 @@ var _require2 = require('relay-runtime'),
13
13
  var warning = require("fbjs/lib/warning");
14
14
  function usePreloadedQuery(gqlQuery, preloadedQuery, options) {
15
15
  var environment = useRelayEnvironment();
16
- var fetchKey = preloadedQuery.fetchKey,
17
- fetchPolicy = preloadedQuery.fetchPolicy,
18
- source = preloadedQuery.source,
19
- variables = preloadedQuery.variables,
20
- networkCacheConfig = preloadedQuery.networkCacheConfig;
21
- var operation = useMemoOperationDescriptor(gqlQuery, variables, networkCacheConfig);
16
+ var operation = useMemoOperationDescriptor(gqlQuery, preloadedQuery != null ? preloadedQuery.variables : {}, preloadedQuery != null ? preloadedQuery.networkCacheConfig : undefined);
22
17
  var useLazyLoadQueryNodeParams;
23
- if (preloadedQuery.kind === 'PreloadedQuery_DEPRECATED') {
24
- !(operation.request.node.params.name === preloadedQuery.name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'usePreloadedQuery(): Expected data to be prefetched for query `%s`, ' + 'got prefetch results for query `%s`.', operation.request.node.params.name, preloadedQuery.name) : invariant(false) : void 0;
25
- useLazyLoadQueryNodeParams = {
26
- componentDisplayName: 'usePreloadedQuery()',
27
- fetchKey: fetchKey,
28
- fetchObservable: fetchQueryDeduped(environment, operation.request.identifier, function () {
29
- if (environment === preloadedQuery.environment && source != null) {
30
- return environment.executeWithSource({
31
- operation: operation,
32
- source: source
33
- });
34
- } else {
35
- return environment.execute({
36
- operation: operation
37
- });
38
- }
39
- }),
40
- fetchPolicy: fetchPolicy,
41
- query: operation,
42
- renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy
43
- };
44
- } else {
45
- process.env.NODE_ENV !== "production" ? warning(preloadedQuery.isDisposed === false, 'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' + 'This is because disposing the query marks it for future garbage ' + 'collection, and as such query results may no longer be present in the Relay ' + 'store. In the future, this will become a hard error.') : void 0;
46
- var fallbackFetchObservable = fetchQuery(environment, operation);
47
- var fetchObservable;
48
- if (source != null && environment === preloadedQuery.environment) {
49
- fetchObservable = source.ifEmpty(fallbackFetchObservable);
50
- } else if (environment !== preloadedQuery.environment) {
51
- process.env.NODE_ENV !== "production" ? warning(false, 'usePreloadedQuery(): usePreloadedQuery was passed a preloaded query ' + 'that was created with a different environment than the one that is currently ' + 'in context. In the future, this will become a hard error.') : void 0;
52
- fetchObservable = fallbackFetchObservable;
18
+ if (preloadedQuery != null) {
19
+ var fetchKey = preloadedQuery.fetchKey,
20
+ fetchPolicy = preloadedQuery.fetchPolicy,
21
+ source = preloadedQuery.source;
22
+ if (preloadedQuery.kind === 'PreloadedQuery_DEPRECATED') {
23
+ !(operation.request.node.params.name === preloadedQuery.name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'usePreloadedQuery(): Expected data to be prefetched for query `%s`, ' + 'got prefetch results for query `%s`.', operation.request.node.params.name, preloadedQuery.name) : invariant(false) : void 0;
24
+ useLazyLoadQueryNodeParams = {
25
+ componentDisplayName: 'usePreloadedQuery()',
26
+ fetchKey: fetchKey,
27
+ fetchObservable: fetchQueryDeduped(environment, operation.request.identifier, function () {
28
+ if (environment === preloadedQuery.environment && source != null) {
29
+ return environment.executeWithSource({
30
+ operation: operation,
31
+ source: source
32
+ });
33
+ } else {
34
+ return environment.execute({
35
+ operation: operation
36
+ });
37
+ }
38
+ }),
39
+ fetchPolicy: fetchPolicy,
40
+ query: operation,
41
+ renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy
42
+ };
53
43
  } else {
54
- fetchObservable = fallbackFetchObservable;
44
+ process.env.NODE_ENV !== "production" ? warning(preloadedQuery.isDisposed === false, 'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' + 'This is because disposing the query marks it for future garbage ' + 'collection, and as such query results may no longer be present in the Relay ' + 'store. In the future, this will become a hard error.') : void 0;
45
+ var fallbackFetchObservable = fetchQuery(environment, operation);
46
+ var fetchObservable;
47
+ if (source != null && environment === preloadedQuery.environment) {
48
+ fetchObservable = source.ifEmpty(fallbackFetchObservable);
49
+ } else if (environment !== preloadedQuery.environment) {
50
+ process.env.NODE_ENV !== "production" ? warning(false, 'usePreloadedQuery(): usePreloadedQuery was passed a preloaded query ' + 'that was created with a different environment than the one that is currently ' + 'in context. In the future, this will become a hard error.') : void 0;
51
+ fetchObservable = fallbackFetchObservable;
52
+ } else {
53
+ fetchObservable = fallbackFetchObservable;
54
+ }
55
+ useLazyLoadQueryNodeParams = {
56
+ componentDisplayName: 'usePreloadedQuery()',
57
+ fetchKey: fetchKey,
58
+ fetchObservable: fetchObservable,
59
+ fetchPolicy: fetchPolicy,
60
+ query: operation,
61
+ renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy
62
+ };
55
63
  }
64
+ } else {
56
65
  useLazyLoadQueryNodeParams = {
57
66
  componentDisplayName: 'usePreloadedQuery()',
58
- fetchObservable: fetchObservable,
59
- fetchKey: fetchKey,
60
- fetchPolicy: fetchPolicy,
61
- query: operation,
62
- renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy
67
+ fragmentNode: gqlQuery.fragment
63
68
  };
64
69
  }
65
70
  var data = useLazyLoadQueryNode(useLazyLoadQueryNodeParams);
66
71
  if (process.env.NODE_ENV !== "production") {
67
72
  useDebugValue({
68
- query: preloadedQuery.name,
69
- variables: preloadedQuery.variables,
70
73
  data: data,
71
- fetchKey: fetchKey,
72
- fetchPolicy: fetchPolicy,
73
- renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy
74
+ fetchKey: preloadedQuery === null || preloadedQuery === void 0 ? void 0 : preloadedQuery.fetchKey,
75
+ fetchPolicy: preloadedQuery === null || preloadedQuery === void 0 ? void 0 : preloadedQuery.fetchPolicy,
76
+ query: preloadedQuery === null || preloadedQuery === void 0 ? void 0 : preloadedQuery.name,
77
+ renderPolicy: options === null || options === void 0 ? void 0 : options.UNSTABLE_renderPolicy,
78
+ variables: preloadedQuery === null || preloadedQuery === void 0 ? void 0 : preloadedQuery.variables
74
79
  });
75
80
  }
76
81
  return data;
@@ -59,9 +59,9 @@ function useQueryLoader_CURRENT(preloadableRequest, initialQueryReference) {
59
59
  }, [isMountedRef]);
60
60
  var queryLoaderCallback = useCallback(function (variables, options) {
61
61
  var mergedOptions = options != null && options.hasOwnProperty('__environment') ? {
62
+ __nameForWarning: options.__nameForWarning,
62
63
  fetchPolicy: options.fetchPolicy,
63
- networkCacheConfig: options.networkCacheConfig,
64
- __nameForWarning: options.__nameForWarning
64
+ networkCacheConfig: options.networkCacheConfig
65
65
  } : options;
66
66
  if (isMountedRef.current) {
67
67
  var _options$__environmen;
@@ -62,9 +62,9 @@ function useQueryLoader_EXPERIMENTAL(preloadableRequest, initialQueryReference)
62
62
  return;
63
63
  }
64
64
  var mergedOptions = options != null && options.hasOwnProperty('__environment') ? {
65
+ __nameForWarning: options.__nameForWarning,
65
66
  fetchPolicy: options.fetchPolicy,
66
- networkCacheConfig: options.networkCacheConfig,
67
- __nameForWarning: options.__nameForWarning
67
+ networkCacheConfig: options.networkCacheConfig
68
68
  } : options;
69
69
  var updatedQueryReference = loadQuery((_options$__environmen = options === null || options === void 0 ? void 0 : options.__environment) !== null && _options$__environmen !== void 0 ? _options$__environmen : environment, preloadableRequest, variables, mergedOptions);
70
70
  (_undisposedQueryRefer3 = undisposedQueryReferencesRef.current) === null || _undisposedQueryRefer3 === void 0 ? void 0 : _undisposedQueryRefer3.add(updatedQueryReference);
@@ -91,9 +91,9 @@ function useRefetchableFragmentInternal(fragmentNode, parentFragmentRef, compone
91
91
  var fragmentRef = parentFragmentRef;
92
92
  if (shouldReset) {
93
93
  dispatch({
94
- type: 'reset',
95
94
  environment: environment,
96
- fragmentIdentifier: fragmentIdentifier
95
+ fragmentIdentifier: fragmentIdentifier,
96
+ type: 'reset'
97
97
  });
98
98
  disposeQuery();
99
99
  } else if (refetchQuery != null && queryRef != null) {
@@ -107,13 +107,13 @@ function useRefetchableFragmentInternal(fragmentNode, parentFragmentRef, compone
107
107
  var fetchObservable = queryRef.source != null ? queryRef.source : fetchQuery(environment, refetchQuery);
108
108
  var queryResult = profilerContext.wrapPrepareQueryResource(function () {
109
109
  return QueryResource.prepare(refetchQuery, fetchObservable, fetchPolicy, renderPolicy, {
110
- error: handleQueryCompleted,
111
110
  complete: function complete() {
112
111
  if (process.env.NODE_ENV !== "production") {
113
112
  debugFunctions.checkSameTypeAfterRefetch(debugPreviousIDAndTypename, environment, fragmentNode, componentDisplayName);
114
113
  }
115
114
  handleQueryCompleted();
116
- }
115
+ },
116
+ error: handleQueryCompleted
117
117
  }, queryRef.fetchKey, profilerContext);
118
118
  });
119
119
  var queryData = readFragmentInternal(environment, queryResult.fragmentNode, queryResult.fragmentRef, componentDisplayName).data;
@@ -174,17 +174,17 @@ function useRefetchFunction(componentDisplayName, dispatch, disposeQuery, fragme
174
174
  force: true
175
175
  });
176
176
  loadQuery(refetchQuery.request.variables, {
177
- fetchPolicy: fetchPolicy,
178
177
  __environment: refetchEnvironment,
179
- __nameForWarning: 'refetch'
178
+ __nameForWarning: 'refetch',
179
+ fetchPolicy: fetchPolicy
180
180
  });
181
181
  dispatch({
182
- type: 'refetch',
183
182
  fetchPolicy: fetchPolicy,
184
183
  onComplete: onComplete,
185
184
  refetchEnvironment: refetchEnvironment,
186
185
  refetchQuery: refetchQuery,
187
- renderPolicy: renderPolicy
186
+ renderPolicy: renderPolicy,
187
+ type: 'refetch'
188
188
  });
189
189
  return {
190
190
  dispose: disposeQuery
@@ -194,23 +194,16 @@ function useRefetchFunction(componentDisplayName, dispatch, disposeQuery, fragme
194
194
  var debugFunctions;
195
195
  if (process.env.NODE_ENV !== "production") {
196
196
  debugFunctions = {
197
- getInitialIDAndType: function getInitialIDAndType(memoRefetchVariables, fragmentRefPathInResponse, identifierQueryVariableName, environment) {
198
- var _require4 = require('relay-runtime'),
199
- Record = _require4.Record;
200
- var id = memoRefetchVariables === null || memoRefetchVariables === void 0 ? void 0 : memoRefetchVariables[identifierQueryVariableName !== null && identifierQueryVariableName !== void 0 ? identifierQueryVariableName : 'id'];
201
- if (fragmentRefPathInResponse.length !== 1 || fragmentRefPathInResponse[0] !== 'node' || id == null) {
202
- return null;
197
+ checkSameIDAfterRefetch: function checkSameIDAfterRefetch(previousIDAndTypename, refetchedFragmentRef, fragmentNode, componentDisplayName) {
198
+ if (previousIDAndTypename == null || refetchedFragmentRef == null) {
199
+ return;
203
200
  }
204
- var recordSource = environment.getStore().getSource();
205
- var record = recordSource.get(id);
206
- var typename = record == null ? null : Record.getType(record);
207
- if (typename == null) {
208
- return null;
201
+ var _require4 = require('relay-runtime'),
202
+ ID_KEY = _require4.ID_KEY;
203
+ var resultID = refetchedFragmentRef[ID_KEY];
204
+ if (resultID != null && resultID !== previousIDAndTypename.id) {
205
+ process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Call to `refetch` returned a different id, expected ' + '`%s`, got `%s`, on `%s` in `%s`. ' + 'Please make sure the server correctly implements ' + 'unique id requirement.', resultID, previousIDAndTypename.id, fragmentNode.name, componentDisplayName) : void 0;
209
206
  }
210
- return {
211
- id: id,
212
- typename: typename
213
- };
214
207
  },
215
208
  checkSameTypeAfterRefetch: function checkSameTypeAfterRefetch(previousIDAndType, environment, fragmentNode, componentDisplayName) {
216
209
  var _require5 = require('relay-runtime'),
@@ -225,16 +218,23 @@ if (process.env.NODE_ENV !== "production") {
225
218
  process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Call to `refetch` returned data with a different ' + '__typename: was `%s`, now `%s`, on `%s` in `%s`. ' + 'Please make sure the server correctly implements' + 'unique id requirement.', previousIDAndType.typename, typename, fragmentNode.name, componentDisplayName) : void 0;
226
219
  }
227
220
  },
228
- checkSameIDAfterRefetch: function checkSameIDAfterRefetch(previousIDAndTypename, refetchedFragmentRef, fragmentNode, componentDisplayName) {
229
- if (previousIDAndTypename == null || refetchedFragmentRef == null) {
230
- return;
231
- }
221
+ getInitialIDAndType: function getInitialIDAndType(memoRefetchVariables, fragmentRefPathInResponse, identifierQueryVariableName, environment) {
232
222
  var _require6 = require('relay-runtime'),
233
- ID_KEY = _require6.ID_KEY;
234
- var resultID = refetchedFragmentRef[ID_KEY];
235
- if (resultID != null && resultID !== previousIDAndTypename.id) {
236
- process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Call to `refetch` returned a different id, expected ' + '`%s`, got `%s`, on `%s` in `%s`. ' + 'Please make sure the server correctly implements ' + 'unique id requirement.', resultID, previousIDAndTypename.id, fragmentNode.name, componentDisplayName) : void 0;
223
+ Record = _require6.Record;
224
+ var id = memoRefetchVariables === null || memoRefetchVariables === void 0 ? void 0 : memoRefetchVariables[identifierQueryVariableName !== null && identifierQueryVariableName !== void 0 ? identifierQueryVariableName : 'id'];
225
+ if (fragmentRefPathInResponse.length !== 1 || fragmentRefPathInResponse[0] !== 'node' || id == null) {
226
+ return null;
237
227
  }
228
+ var recordSource = environment.getStore().getSource();
229
+ var record = recordSource.get(id);
230
+ var typename = record == null ? null : Record.getType(record);
231
+ if (typename == null) {
232
+ return null;
233
+ }
234
+ return {
235
+ id: id,
236
+ typename: typename
237
+ };
238
238
  }
239
239
  };
240
240
  }
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var useQueryFromServer = require('./relay-hooks/rsc/useQueryFromServer');
5
+ module.exports = {
6
+ useQueryFromServer: useQueryFromServer
7
+ };
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator").default;
4
+ var serverFetchQueryImpl = require('./relay-hooks/rsc/serverFetchQuery');
5
+ var serverPreloadQueryImpl = require('./relay-hooks/rsc/serverPreloadQuery');
6
+ var serverReadFragmentImpl = require('./relay-hooks/rsc/serverReadFragment');
7
+ var invariant = require('invariant');
8
+ var React = require('react');
9
+ function createServerEnvironment(create) {
10
+ var cache = React.cache;
11
+ !(typeof cache === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay RSC APIs require React 19+') : invariant(false) : void 0;
12
+ var getEnvironment = cache(create);
13
+ function serverFetchQuery(_x, _x2) {
14
+ return _serverFetchQuery.apply(this, arguments);
15
+ }
16
+ function _serverFetchQuery() {
17
+ _serverFetchQuery = _asyncToGenerator(function* (query, variables) {
18
+ return serverFetchQueryImpl(getEnvironment(), query, variables);
19
+ });
20
+ return _serverFetchQuery.apply(this, arguments);
21
+ }
22
+ function serverPreloadQuery(query, variables) {
23
+ return serverPreloadQueryImpl(getEnvironment(), query, variables);
24
+ }
25
+ function serverReadFragment(_x3, _x4) {
26
+ return _serverReadFragment.apply(this, arguments);
27
+ }
28
+ function _serverReadFragment() {
29
+ _serverReadFragment = _asyncToGenerator(function* (fragment, fragmentRef) {
30
+ return serverReadFragmentImpl(getEnvironment(), fragment, fragmentRef);
31
+ });
32
+ return _serverReadFragment.apply(this, arguments);
33
+ }
34
+ return {
35
+ getEnvironment: getEnvironment,
36
+ serverFetchQuery: serverFetchQuery,
37
+ serverPreloadQuery: serverPreloadQuery,
38
+ serverReadFragment: serverReadFragment
39
+ };
40
+ }
41
+ module.exports = {
42
+ createServerEnvironment: createServerEnvironment
43
+ };
@@ -17,7 +17,7 @@ const RelayEnvironmentProvider = require('../relay-hooks/RelayEnvironmentProvide
17
17
  const useRelayActorEnvironment = require('./useRelayActorEnvironment');
18
18
  const React = require('react');
19
19
 
20
- export opaque type ActorChangePoint<TFragmentRef> = $ReadOnly<{
20
+ export opaque type ActorChangePoint<TFragmentRef> = Readonly<{
21
21
  __fragmentRef: TFragmentRef,
22
22
  __viewer: ActorIdentifier,
23
23
  }>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-relay",
3
3
  "description": "A framework for building GraphQL-driven React applications.",
4
- "version": "20.1.1",
4
+ "version": "21.0.0",
5
5
  "keywords": [
6
6
  "graphql",
7
7
  "relay",
@@ -20,7 +20,7 @@
20
20
  "fbjs": "^3.0.2",
21
21
  "invariant": "^2.2.4",
22
22
  "nullthrows": "^1.1.1",
23
- "relay-runtime": "20.1.1"
23
+ "relay-runtime": "21.0.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "react": "^16.9.0 || ^17 || ^18 || ^19"
@@ -29,5 +29,6 @@
29
29
  "": "./"
30
30
  },
31
31
  "main": "index.js",
32
+ "types": "index.d.ts",
32
33
  "haste_commonjs": true
33
34
  }
@@ -24,16 +24,16 @@ const warning = require('warning');
24
24
 
25
25
  component EntryPointContainer<
26
26
  // $FlowFixMe[unsupported-variance-annotation]
27
- TRuntimeProps: {...},
28
- TRenders: React.Node,
27
+ TRuntimeProps extends {...},
28
+ TRenders extends React.Node,
29
29
  // $FlowFixMe[unsupported-variance-annotation]
30
- TEntryPointComponent: EntryPointComponent<
31
- // $FlowExpectedErrors[unclear-type] Use any to accept all kinds of EntryPointComponent
30
+ TEntryPointComponent extends EntryPointComponent<
31
+ // $FlowExpectedError[unclear-type] s[unclear-type] Use any to accept all kinds of EntryPointComponent
32
32
  any,
33
- // $FlowExpectedErrors[unclear-type] Use any to accept all kinds of EntryPointComponent
33
+ // $FlowExpectedError[unclear-type] s[unclear-type] Use any to accept all kinds of EntryPointComponent
34
34
  any,
35
35
  TRuntimeProps,
36
- // $FlowExpectedErrors[unclear-type] Use any to accept all kinds of EntryPointComponent
36
+ // $FlowExpectedError[unclear-type] s[unclear-type] Use any to accept all kinds of EntryPointComponent
37
37
  any,
38
38
  TRenders,
39
39
  >,
@@ -37,6 +37,7 @@ export type PreloadOptions = {
37
37
  +fetchKey?: string | number,
38
38
  +fetchPolicy?: ?PreloadFetchPolicy,
39
39
  +includeIf?: ?boolean,
40
+ +enableForOfflineCacheJob?: ?boolean,
40
41
  +prefetchExpiryInHours?: ?number,
41
42
  +networkCacheConfig?: ?CacheConfig,
42
43
  };
@@ -47,7 +48,7 @@ export type LoadQueryOptions = {
47
48
  +__nameForWarning?: ?string,
48
49
  };
49
50
 
50
- export type PreloadableConcreteRequest<+TQuery: OperationType> = {
51
+ export type PreloadableConcreteRequest<+TQuery extends OperationType> = {
51
52
  kind: 'PreloadableConcreteRequest',
52
53
  params: RequestParameters,
53
54
  // Note: the phantom type parameter here helps ensures that the
@@ -58,17 +59,17 @@ export type PreloadableConcreteRequest<+TQuery: OperationType> = {
58
59
  +__phantom__?: ?TQuery,
59
60
  };
60
61
 
61
- export type EnvironmentProviderOptions = {+[string]: mixed, ...};
62
+ export type EnvironmentProviderOptions = {+[string]: unknown, ...};
62
63
 
63
64
  export type PreloadedQuery<
64
- +TQuery: OperationType,
65
+ +TQuery extends OperationType,
65
66
  TEnvironmentProviderOptions = EnvironmentProviderOptions,
66
67
  > =
67
68
  | PreloadedQueryInner_DEPRECATED<TQuery, TEnvironmentProviderOptions>
68
69
  | PreloadedQueryInner<TQuery, TEnvironmentProviderOptions>;
69
70
 
70
71
  export type PreloadedQueryInner_DEPRECATED<
71
- +TQuery: OperationType,
72
+ +TQuery extends OperationType,
72
73
  TEnvironmentProviderOptions = EnvironmentProviderOptions,
73
74
  > = {
74
75
  +kind: 'PreloadedQuery_DEPRECATED',
@@ -85,7 +86,7 @@ export type PreloadedQueryInner_DEPRECATED<
85
86
  };
86
87
 
87
88
  export type PreloadedQueryInner<
88
- +TQuery: OperationType,
89
+ +TQuery extends OperationType,
89
90
  TEnvironmentProviderOptions = EnvironmentProviderOptions,
90
91
  > = {
91
92
  // Releases query data and cancels network request if still in flight
@@ -125,40 +126,21 @@ Every .entrypoint file it's an object that must have two required fields:
125
126
  TEntryPointParams - object that contains all necessary information to execute
126
127
  the preloaders (routeParams, query variables)
127
128
 
128
- TPreloadedQueries - queries, defined in the root components
129
-
130
- TPreloadedEntryPoints - nested entry points, defined in the root components
131
-
132
- TRuntimeProps - the type of additional props that you may pass to the
133
- component (like `onClick` handler, etc) during runtime. Values for them
134
- defined during component runtime
135
-
136
- TExtraProps - a bag of extra props that you may define in `entrypoint` file
137
- and they will be passed to the EntryPointComponent as `extraProps`
129
+ TEntryPointComponent - the root components
138
130
  */
139
- export type InternalEntryPointRepresentation<
140
- TEntryPointParams,
141
- TPreloadedQueries,
142
- TPreloadedEntryPoints = {...},
143
- TRuntimeProps = {...},
144
- TExtraProps = null,
145
- > = $ReadOnly<{
131
+ export type EntryPoint<
132
+ -TEntryPointParams,
133
+ // $FlowExpectedError[unclear-type] accepts any root component
134
+ +TEntryPointComponent extends EntryPointComponent<any, any, any, any, any>,
135
+ > = Readonly<{
146
136
  getPreloadProps: (
147
137
  entryPointParams: TEntryPointParams,
148
138
  ) => PreloadProps<
149
- TEntryPointParams,
150
- TPreloadedQueries,
151
- TPreloadedEntryPoints,
152
- TExtraProps,
153
- >,
154
- root: JSResourceReference<
155
- EntryPointComponent<
156
- TPreloadedQueries,
157
- TPreloadedEntryPoints,
158
- TRuntimeProps,
159
- TExtraProps,
160
- >,
139
+ ElementConfig<TEntryPointComponent>['queries'],
140
+ ElementConfig<TEntryPointComponent>['entryPoints'],
141
+ ElementConfig<TEntryPointComponent>['extraProps'],
161
142
  >,
143
+ root: JSResourceReference<TEntryPointComponent>,
162
144
  }>;
163
145
 
164
146
  // The shape of the props of the entry point `root` component
@@ -167,20 +149,36 @@ export type EntryPointProps<
167
149
  TPreloadedEntryPoints = {},
168
150
  TRuntimeProps = {},
169
151
  TExtraProps = null,
170
- > = $ReadOnly<{
152
+ > = Readonly<{
171
153
  entryPoints: TPreloadedEntryPoints,
172
154
  extraProps: TExtraProps | null,
173
155
  props: TRuntimeProps,
174
156
  queries: TPreloadedQueries,
175
157
  }>;
176
158
 
177
- // Type of the entry point `root` component
159
+ /**
160
+ Type of the entry point `root` component
161
+
162
+ TEntryPointParams - object that contains all necessary information to execute
163
+ the preloaders (routeParams, query variables)
164
+
165
+ TPreloadedQueries - queries, defined in the root components
166
+
167
+ TPreloadedEntryPoints - nested entry points, defined in the root components
168
+
169
+ TRuntimeProps - the type of additional props that you may pass to the
170
+ component (like `onClick` handler, etc) during runtime. Values for them
171
+ defined during component runtime
172
+
173
+ TExtraProps - a bag of extra props that you may define in `entrypoint` file
174
+ and they will be passed to the EntryPointComponent as `extraProps`
175
+ */
178
176
  export type EntryPointComponent<
179
177
  TPreloadedQueries,
180
178
  TPreloadedEntryPoints = {},
181
179
  TRuntimeProps = {},
182
180
  TExtraProps = null,
183
- TRenders: React.Node = React.Node,
181
+ +TRenders extends React.Node = React.Node,
184
182
  > = component(
185
183
  ...EntryPointProps<
186
184
  TPreloadedQueries,
@@ -192,13 +190,12 @@ export type EntryPointComponent<
192
190
 
193
191
  // Return type of the `getPreloadProps(...)` of the entry point
194
192
  export type PreloadProps<
195
- +TPreloadParams,
196
193
  // $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
197
- TPreloadedQueries: {+[string]: PreloadedQuery<any>},
198
- TPreloadedEntryPoints: {...},
194
+ TPreloadedQueries extends {+[string]: ?PreloadedQuery<any>},
195
+ TPreloadedEntryPoints extends {...},
199
196
  TExtraProps = null,
200
197
  TEnvironmentProviderOptions = EnvironmentProviderOptions,
201
- > = $ReadOnly<{
198
+ > = Readonly<{
202
199
  entryPoints?: {
203
200
  +[K in keyof TPreloadedEntryPoints]?: ?ThinNestedEntryPointParams,
204
201
  },
@@ -207,7 +204,7 @@ export type PreloadProps<
207
204
  }>;
208
205
 
209
206
  // Return type of `loadEntryPoint(...)`
210
- export type PreloadedEntryPoint<TEntryPointComponent> = $ReadOnly<{
207
+ export type PreloadedEntryPoint<TEntryPointComponent> = Readonly<{
211
208
  dispose: () => void,
212
209
  entryPoints: ElementConfig<TEntryPointComponent>['entryPoints'],
213
210
  extraProps: ElementConfig<TEntryPointComponent>['extraProps'],
@@ -218,27 +215,24 @@ export type PreloadedEntryPoint<TEntryPointComponent> = $ReadOnly<{
218
215
  }>;
219
216
 
220
217
  export type EntryPointElementConfig<
221
- // $FlowExpectedError[unclear-type] Need any to make it supertype of all InternalEntryPointRepresentation
222
- +TEntryPoint: InternalEntryPointRepresentation<any, any, any, any, any>,
223
- > =
224
- TEntryPoint extends InternalEntryPointRepresentation<
225
- // $FlowExpectedError[unclear-type] Need any to make it supertype of all InternalEntryPointRepresentation
226
- any,
218
+ +TEntryPoint extends EntryPoint<
227
219
  // $FlowExpectedError[unclear-type] Need any to make it supertype of all InternalEntryPointRepresentation
228
220
  any,
229
221
  // $FlowExpectedError[unclear-type] Need any to make it supertype of all InternalEntryPointRepresentation
230
222
  any,
231
- infer Props,
232
- // $FlowExpectedError[unclear-type] Need any to make it supertype of all InternalEntryPointRepresentation
233
- any,
223
+ >,
224
+ > =
225
+ TEntryPoint extends EntryPoint<
226
+ infer _EntryPointParams,
227
+ infer EntryPointComponent,
234
228
  >
235
- ? Props
229
+ ? ElementConfig<EntryPointComponent>['props']
236
230
  : empty;
237
231
 
238
232
  export type ThinQueryParams<
239
- +TQuery: OperationType,
233
+ +TQuery extends OperationType,
240
234
  TEnvironmentProviderOptions,
241
- > = $ReadOnly<{
235
+ > = Readonly<{
242
236
  environmentProviderOptions?: ?TEnvironmentProviderOptions,
243
237
  options?: ?PreloadOptions,
244
238
  parameters: PreloadableConcreteRequest<TQuery>,
@@ -261,20 +255,24 @@ export type ExtractQueryTypeHelper<TEnvironmentProviderOptions> = <TQuery>(
261
255
  // because PreloadedQuery's TQuery parameter is almost phantom, and breaking
262
256
  // up the union type would cause us to lose track of TQuery.
263
257
  type ExtractThinQueryParams<T, TEnvironmentProviderOptions> = [+t: T] extends [
264
- // $FlowFixMe[incompatible-type-arg]
265
- +t: PreloadedQuery<infer TQuery>,
258
+ // $FlowFixMe[incompatible-type]
259
+ +t: PreloadedQuery<infer TQuery extends OperationType>,
266
260
  ]
267
261
  ? ThinQueryParams<TQuery, TEnvironmentProviderOptions>
268
262
  : [+t: T] extends [
269
263
  +t: PreloadedQuery<infer TQuery extends OperationType> | void,
270
264
  ]
271
265
  ? ThinQueryParams<TQuery, TEnvironmentProviderOptions> | void
272
- : empty;
266
+ : [+t: T] extends [
267
+ +t: PreloadedQuery<infer TQuery extends OperationType> | null | void,
268
+ ]
269
+ ? ThinQueryParams<TQuery, TEnvironmentProviderOptions> | null | void
270
+ : empty;
273
271
 
274
272
  export type ExtractQueryTypes<
275
273
  TEnvironmentProviderOptions,
276
274
  // $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
277
- PreloadedQueries: {+[string]: PreloadedQuery<any>} | void,
275
+ PreloadedQueries extends {+[string]: ?PreloadedQuery<any>} | void,
278
276
  > = {
279
277
  [K in keyof PreloadedQueries]: ExtractThinQueryParams<
280
278
  PreloadedQueries[K],
@@ -282,17 +280,13 @@ export type ExtractQueryTypes<
282
280
  >,
283
281
  };
284
282
 
285
- export type EntryPoint<TEntryPointParams, +TEntryPointComponent> =
286
- InternalEntryPointRepresentation<
287
- TEntryPointParams,
288
- ElementConfig<TEntryPointComponent>['queries'],
289
- ElementConfig<TEntryPointComponent>['entryPoints'],
290
- ElementConfig<TEntryPointComponent>['props'],
291
- ElementConfig<TEntryPointComponent>['extraProps'],
292
- >;
283
+ // $FlowFixMe[unclear-type]: we don't care about the props
284
+ export type RootComponentRenders<+C extends component(...any)> =
285
+ // $FlowFixMe[unclear-type]: we don't care about the props
286
+ C extends component(...any) renders infer R extends React.Node ? R : empty;
293
287
 
294
288
  export type PreloadParamsOf<T> = Parameters<T['getPreloadProps']>[0];
295
289
 
296
- export type IEnvironmentProvider<TOptions> = $ReadOnly<{
290
+ export type IEnvironmentProvider<TOptions> = Readonly<{
297
291
  getEnvironment: (options: ?TOptions) => IEnvironment,
298
292
  }>;