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
@@ -46,7 +46,7 @@ const {
46
46
  const warning = require('warning');
47
47
 
48
48
  export type RefetchFn<
49
- TQuery: OperationType,
49
+ TQuery extends OperationType,
50
50
  TOptions = Options,
51
51
  > = RefetchFnExact<TQuery, TOptions>;
52
52
 
@@ -56,20 +56,20 @@ export type RefetchFn<
56
56
  // - Or, expects /a subset/ of the query variables if the provided key type is
57
57
  // /non-null/.
58
58
  export type RefetchFnDynamic<
59
- TQuery: OperationType,
60
- TKey: ?{+$data?: mixed, ...},
59
+ TQuery extends OperationType,
60
+ TKey extends ?{+$data?: unknown, ...},
61
61
  TOptions = Options,
62
- > = [TKey] extends [{+$data?: mixed, ...}]
62
+ > = [TKey] extends [{+$data?: unknown, ...}]
63
63
  ? RefetchFnInexact<TQuery, TOptions>
64
64
  : RefetchFnExact<TQuery, TOptions>;
65
65
 
66
66
  export type ReturnType<
67
- TQuery: OperationType,
68
- TKey: ?{+$data?: mixed, ...},
67
+ TQuery extends OperationType,
68
+ TKey extends ?{+$data?: unknown, ...},
69
69
  TOptions = Options,
70
70
  > = {
71
- fragmentData: mixed,
72
- fragmentRef: mixed,
71
+ fragmentData: unknown,
72
+ fragmentRef: unknown,
73
73
  refetch: RefetchFnDynamic<TQuery, TKey, TOptions>,
74
74
  };
75
75
 
@@ -89,14 +89,14 @@ type RefetchFnBase<TVars, TOptions> = (
89
89
  options?: TOptions,
90
90
  ) => Disposable;
91
91
 
92
- type RefetchFnExact<TQuery: OperationType, TOptions = Options> = RefetchFnBase<
93
- VariablesOf<TQuery>,
94
- TOptions,
95
- >;
92
+ type RefetchFnExact<
93
+ TQuery extends OperationType,
94
+ TOptions = Options,
95
+ > = RefetchFnBase<VariablesOf<TQuery>, TOptions>;
96
96
  type RefetchFnInexact<
97
- TQuery: OperationType,
97
+ TQuery extends OperationType,
98
98
  TOptions = Options,
99
- > = RefetchFnBase<$ReadOnly<Partial<VariablesOf<TQuery>>>, TOptions>;
99
+ > = RefetchFnBase<Readonly<Partial<VariablesOf<TQuery>>>, TOptions>;
100
100
 
101
101
  type Action =
102
102
  | {
@@ -154,18 +154,18 @@ function reducer(state: RefetchState, action: Action): RefetchState {
154
154
  };
155
155
  }
156
156
  default: {
157
- (action.type: empty);
157
+ action.type as empty;
158
158
  throw new Error('useRefetchableFragmentNode: Unexpected action type');
159
159
  }
160
160
  }
161
161
  }
162
162
 
163
163
  hook useRefetchableFragmentInternal<
164
- TQuery: OperationType,
165
- TKey: ?{+$data?: mixed, ...},
164
+ TQuery extends OperationType,
165
+ TKey extends ?{+$data?: unknown, ...},
166
166
  >(
167
167
  fragmentNode: ReaderFragment,
168
- parentFragmentRef: mixed,
168
+ parentFragmentRef: unknown,
169
169
  componentDisplayName: string,
170
170
  ): ReturnType<TQuery, TKey, InternalOptions> {
171
171
  const parentEnvironment = useRelayEnvironment();
@@ -184,7 +184,7 @@ hook useRefetchableFragmentInternal<
184
184
  refetchEnvironment: null,
185
185
  refetchQuery: null,
186
186
  renderPolicy: undefined,
187
- });
187
+ } as RefetchState);
188
188
  const {
189
189
  fetchPolicy,
190
190
  mirroredEnvironment,
@@ -206,14 +206,14 @@ hook useRefetchableFragmentInternal<
206
206
  TQuery['variables'],
207
207
  TQuery['response'],
208
208
  TQuery['rawResponse'],
209
- >((refetchableRequest: $FlowFixMe));
209
+ >(refetchableRequest as $FlowFixMe);
210
210
 
211
211
  let fragmentRef = parentFragmentRef;
212
212
  if (shouldReset) {
213
213
  dispatch({
214
- type: 'reset',
215
214
  environment,
216
215
  fragmentIdentifier,
216
+ type: 'reset',
217
217
  });
218
218
  disposeQuery();
219
219
  } else if (refetchQuery != null && queryRef != null) {
@@ -268,7 +268,6 @@ hook useRefetchableFragmentInternal<
268
268
  fetchPolicy,
269
269
  renderPolicy,
270
270
  {
271
- error: handleQueryCompleted,
272
271
  complete: () => {
273
272
  // Validate that the type of the object we got back matches the type
274
273
  // of the object already in the store
@@ -282,6 +281,7 @@ hook useRefetchableFragmentInternal<
282
281
  }
283
282
  handleQueryCompleted();
284
283
  },
284
+ error: handleQueryCompleted,
285
285
  },
286
286
  queryRef.fetchKey,
287
287
  profilerContext,
@@ -350,12 +350,12 @@ hook useRefetchableFragmentInternal<
350
350
  return {
351
351
  fragmentData,
352
352
  fragmentRef,
353
- // $FlowFixMe[incompatible-return] RefetchFn not compatible with RefetchFnDynamic
353
+ // $FlowFixMe[incompatible-type] RefetchFn not compatible with RefetchFnDynamic
354
354
  refetch,
355
355
  };
356
356
  }
357
357
 
358
- hook useRefetchFunction<TQuery: OperationType>(
358
+ hook useRefetchFunction<TQuery extends OperationType>(
359
359
  componentDisplayName: string,
360
360
  dispatch: (
361
361
  | {
@@ -373,13 +373,13 @@ hook useRefetchFunction<TQuery: OperationType>(
373
373
  },
374
374
  ) => void,
375
375
  disposeQuery: () => void,
376
- fragmentData: mixed,
376
+ fragmentData: unknown,
377
377
  fragmentIdentifier: string,
378
378
  fragmentNode: ReaderFragment,
379
- fragmentRefPathInResponse: $ReadOnlyArray<string | number>,
379
+ fragmentRefPathInResponse: ReadonlyArray<string | number>,
380
380
  identifierInfo: ?RefetchableIdentifierInfo,
381
381
  loadQuery: LoaderFn<TQuery>,
382
- parentFragmentRef: mixed,
382
+ parentFragmentRef: unknown,
383
383
  refetchableRequest: ConcreteRequest,
384
384
  ): RefetchFn<TQuery, InternalOptions> {
385
385
  const isMountedRef = useIsMountedRef();
@@ -446,7 +446,7 @@ hook useRefetchFunction<TQuery: OperationType>(
446
446
  // We fill in any variables not passed by the call to `refetch()` with the
447
447
  // variables from the original parent fragment owner.
448
448
  const refetchVariables: VariablesOf<TQuery> = {
449
- ...(parentVariables: $FlowFixMe),
449
+ ...(parentVariables as $FlowFixMe),
450
450
  ...fragmentVariables,
451
451
  ...providedRefetchVariables,
452
452
  };
@@ -471,7 +471,7 @@ hook useRefetchFunction<TQuery: OperationType>(
471
471
  identifierValue,
472
472
  );
473
473
  }
474
- (refetchVariables: $FlowFixMe)[
474
+ (refetchVariables as $FlowFixMe)[
475
475
  identifierInfo.identifierQueryVariableName
476
476
  ] = identifierValue;
477
477
  }
@@ -492,18 +492,18 @@ hook useRefetchFunction<TQuery: OperationType>(
492
492
  // so that they have been filtered out to include only the
493
493
  // variables actually declared in the query.
494
494
  loadQuery(refetchQuery.request.variables, {
495
- fetchPolicy,
496
495
  __environment: refetchEnvironment,
497
496
  __nameForWarning: 'refetch',
497
+ fetchPolicy,
498
498
  });
499
499
 
500
500
  dispatch({
501
- type: 'refetch',
502
501
  fetchPolicy,
503
502
  onComplete,
504
503
  refetchEnvironment,
505
504
  refetchQuery,
506
505
  renderPolicy,
506
+ type: 'refetch',
507
507
  });
508
508
  return {dispose: disposeQuery};
509
509
  },
@@ -521,33 +521,32 @@ hook useRefetchFunction<TQuery: OperationType>(
521
521
  let debugFunctions;
522
522
  if (__DEV__) {
523
523
  debugFunctions = {
524
- getInitialIDAndType(
525
- memoRefetchVariables: ?Variables,
526
- fragmentRefPathInResponse: $ReadOnlyArray<string | number>,
527
- identifierQueryVariableName: ?string,
528
- environment: IEnvironment,
529
- ): ?DebugIDandTypename {
530
- const {Record} = require('relay-runtime');
531
- const id = memoRefetchVariables?.[identifierQueryVariableName ?? 'id'];
532
- if (
533
- fragmentRefPathInResponse.length !== 1 ||
534
- fragmentRefPathInResponse[0] !== 'node' ||
535
- id == null
536
- ) {
537
- return null;
524
+ checkSameIDAfterRefetch(
525
+ previousIDAndTypename: ?DebugIDandTypename,
526
+ refetchedFragmentRef: unknown,
527
+ fragmentNode: ReaderFragment,
528
+ componentDisplayName: string,
529
+ ): void {
530
+ if (previousIDAndTypename == null || refetchedFragmentRef == null) {
531
+ return;
538
532
  }
539
- const recordSource = environment.getStore().getSource();
540
- const record = recordSource.get(id);
541
- const typename = record == null ? null : Record.getType(record);
542
- if (typename == null) {
543
- return null;
533
+ const {ID_KEY} = require('relay-runtime');
534
+ // $FlowExpectedError[incompatible-use]
535
+ const resultID = refetchedFragmentRef[ID_KEY];
536
+ if (resultID != null && resultID !== previousIDAndTypename.id) {
537
+ warning(
538
+ false,
539
+ 'Relay: Call to `refetch` returned a different id, expected ' +
540
+ '`%s`, got `%s`, on `%s` in `%s`. ' +
541
+ 'Please make sure the server correctly implements ' +
542
+ 'unique id requirement.',
543
+ resultID,
544
+ previousIDAndTypename.id,
545
+ fragmentNode.name,
546
+ componentDisplayName,
547
+ );
544
548
  }
545
- return {
546
- id,
547
- typename,
548
- };
549
549
  },
550
-
551
550
  checkSameTypeAfterRefetch(
552
551
  previousIDAndType: ?DebugIDandTypename,
553
552
  environment: IEnvironment,
@@ -575,32 +574,31 @@ if (__DEV__) {
575
574
  );
576
575
  }
577
576
  },
578
-
579
- checkSameIDAfterRefetch(
580
- previousIDAndTypename: ?DebugIDandTypename,
581
- refetchedFragmentRef: mixed,
582
- fragmentNode: ReaderFragment,
583
- componentDisplayName: string,
584
- ): void {
585
- if (previousIDAndTypename == null || refetchedFragmentRef == null) {
586
- return;
577
+ getInitialIDAndType(
578
+ memoRefetchVariables: ?Variables,
579
+ fragmentRefPathInResponse: ReadonlyArray<string | number>,
580
+ identifierQueryVariableName: ?string,
581
+ environment: IEnvironment,
582
+ ): ?DebugIDandTypename {
583
+ const {Record} = require('relay-runtime');
584
+ const id = memoRefetchVariables?.[identifierQueryVariableName ?? 'id'];
585
+ if (
586
+ fragmentRefPathInResponse.length !== 1 ||
587
+ fragmentRefPathInResponse[0] !== 'node' ||
588
+ id == null
589
+ ) {
590
+ return null;
587
591
  }
588
- const {ID_KEY} = require('relay-runtime');
589
- // $FlowExpectedError[incompatible-use]
590
- const resultID = refetchedFragmentRef[ID_KEY];
591
- if (resultID != null && resultID !== previousIDAndTypename.id) {
592
- warning(
593
- false,
594
- 'Relay: Call to `refetch` returned a different id, expected ' +
595
- '`%s`, got `%s`, on `%s` in `%s`. ' +
596
- 'Please make sure the server correctly implements ' +
597
- 'unique id requirement.',
598
- resultID,
599
- previousIDAndTypename.id,
600
- fragmentNode.name,
601
- componentDisplayName,
602
- );
592
+ const recordSource = environment.getStore().getSource();
593
+ const record = recordSource.get(id);
594
+ const typename = record == null ? null : Record.getType(record);
595
+ if (typename == null) {
596
+ return null;
603
597
  }
598
+ return {
599
+ id,
600
+ typename,
601
+ };
604
602
  },
605
603
  };
606
604
  }
@@ -14,7 +14,7 @@
14
14
  const ReactRelayLoggingContext = require('./../ReactRelayLoggingContext');
15
15
  const {useContext} = require('react');
16
16
 
17
- hook useRelayLoggingContext(): mixed | void {
17
+ hook useRelayLoggingContext(): unknown | void {
18
18
  return useContext(ReactRelayLoggingContext);
19
19
  }
20
20
 
@@ -26,7 +26,7 @@ const {useEffect, useRef} = require('react');
26
26
  * The subscription will automatically be disposed on unmount
27
27
  */
28
28
  hook useSubscribeToInvalidationState(
29
- dataIDs: $ReadOnlyArray<DataID>,
29
+ dataIDs: ReadonlyArray<DataID>,
30
30
  callback: () => void,
31
31
  ): Disposable {
32
32
  const environment = useRelayEnvironment();
@@ -41,7 +41,7 @@ hook useSubscription<TVariables, TData, TRawResponse>(
41
41
  TVariables,
42
42
  TData,
43
43
  TRawResponse,
44
- > = requestSubscriptionFn ?? (requestSubscription: $FlowFixMe);
44
+ > = requestSubscriptionFn ?? (requestSubscription as $FlowFixMe);
45
45
  const environment = useRelayEnvironment();
46
46
  useEffect(() => {
47
47
  // $FlowFixMe[method-unbinding] added when improving typing for this parameters
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Relay v21.0.0
3
+ *
4
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+
10
+ module.exports = require('./lib/rsc-client_EXPERIMENTAL.js');
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict-local
8
+ * @format
9
+ * @oncall relay
10
+ */
11
+
12
+ 'use client';
13
+ 'use strict';
14
+
15
+ import type {PreloadedQueryRef} from './relay-hooks/rsc/serverPreloadQuery';
16
+
17
+ const useQueryFromServer = require('./relay-hooks/rsc/useQueryFromServer');
18
+
19
+ export type {PreloadedQueryRef};
20
+
21
+ module.exports = {
22
+ useQueryFromServer,
23
+ };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Relay v21.0.0
3
+ *
4
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+
10
+ module.exports = require('./lib/rsc_EXPERIMENTAL.js');
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict-local
8
+ * @format
9
+ * @oncall relay
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ import type {PreloadedQueryRef} from './relay-hooks/rsc/serverPreloadQuery';
15
+ import type {
16
+ Fragment,
17
+ FragmentType,
18
+ IEnvironment,
19
+ Query,
20
+ Variables,
21
+ } from 'relay-runtime';
22
+
23
+ const serverFetchQueryImpl = require('./relay-hooks/rsc/serverFetchQuery');
24
+ const serverPreloadQueryImpl = require('./relay-hooks/rsc/serverPreloadQuery');
25
+ const serverReadFragmentImpl = require('./relay-hooks/rsc/serverReadFragment');
26
+ const invariant = require('invariant');
27
+ const React = require('react');
28
+
29
+ export type {PreloadedQueryRef};
30
+
31
+ type HasSpread<TFragmentType> = {+$fragmentSpreads: TFragmentType, ...};
32
+
33
+ export type ServerEnvironment = {
34
+ +getEnvironment: () => IEnvironment,
35
+ +serverFetchQuery: <TVariables extends Variables, TData>(
36
+ query: Query<TVariables, TData>,
37
+ variables: TVariables,
38
+ ) => Promise<TData>,
39
+ +serverPreloadQuery: <TVariables extends Variables, TData>(
40
+ query: Query<TVariables, TData>,
41
+ variables: TVariables,
42
+ ) => PreloadedQueryRef<TVariables, TData>,
43
+ +serverReadFragment: <TFragmentType extends FragmentType, TData>(
44
+ fragment: Fragment<TFragmentType, TData>,
45
+ fragmentRef:
46
+ | HasSpread<TFragmentType>
47
+ | ReadonlyArray<HasSpread<TFragmentType>>,
48
+ ) => Promise<TData>,
49
+ };
50
+
51
+ function createServerEnvironment(
52
+ create: () => IEnvironment,
53
+ ): ServerEnvironment {
54
+ // $FlowFixMe[missing-export] React.cache is available in React 19+
55
+ const cache = React.cache;
56
+ invariant(typeof cache === 'function', 'Relay RSC APIs require React 19+');
57
+ const getEnvironment = cache(create);
58
+
59
+ async function serverFetchQuery<TVariables extends Variables, TData>(
60
+ query: Query<TVariables, TData>,
61
+ variables: TVariables,
62
+ ): Promise<TData> {
63
+ return serverFetchQueryImpl(getEnvironment(), query, variables);
64
+ }
65
+
66
+ function serverPreloadQuery<TVariables extends Variables, TData>(
67
+ query: Query<TVariables, TData>,
68
+ variables: TVariables,
69
+ ): PreloadedQueryRef<TVariables, TData> {
70
+ return serverPreloadQueryImpl(getEnvironment(), query, variables);
71
+ }
72
+
73
+ async function serverReadFragment<TFragmentType extends FragmentType, TData>(
74
+ fragment: Fragment<TFragmentType, TData>,
75
+ fragmentRef:
76
+ | HasSpread<TFragmentType>
77
+ | ReadonlyArray<HasSpread<TFragmentType>>,
78
+ ): Promise<TData> {
79
+ return serverReadFragmentImpl(getEnvironment(), fragment, fragmentRef);
80
+ }
81
+
82
+ return {
83
+ getEnvironment,
84
+ serverFetchQuery,
85
+ serverPreloadQuery,
86
+ serverReadFragment,
87
+ };
88
+ }
89
+
90
+ module.exports = {createServerEnvironment};