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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v20.1.1
2
+ * Relay v21.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -17,6 +17,6 @@ const {
17
17
  __internal: {createRelayContext},
18
18
  } = require('relay-runtime');
19
19
 
20
- module.exports = (createRelayContext(
20
+ module.exports = createRelayContext(
21
21
  React,
22
- ): React.Context<RelayContext | null>);
22
+ ) as React.Context<RelayContext | null>;
@@ -31,7 +31,7 @@ const {
31
31
 
32
32
  type ContainerProps = $FlowFixMe;
33
33
  type ContainerState = {
34
- data: {[key: string]: mixed, ...},
34
+ data: {[key: string]: unknown, ...},
35
35
  prevProps: ContainerProps,
36
36
  prevPropsContext: RelayContext,
37
37
  relayProp: RelayProp,
@@ -45,8 +45,8 @@ type ContainerState = {
45
45
  * updates.
46
46
  */
47
47
  function createContainerWithFragments<
48
- Props: {...},
49
- TComponent: component(...Props),
48
+ Props extends {...},
49
+ TComponent extends component(...Props),
50
50
  >(
51
51
  Component: TComponent,
52
52
  fragments: FragmentMap,
@@ -121,8 +121,8 @@ function createContainerWithFragments<
121
121
 
122
122
  return {
123
123
  data: resolver.resolve(),
124
- prevPropsContext: relayContext,
125
124
  prevProps: nextProps,
125
+ prevPropsContext: relayContext,
126
126
  relayProp: getRelayProp(relayContext.environment),
127
127
  resolver,
128
128
  };
@@ -266,14 +266,13 @@ function getRelayProp(environment: IEnvironment) {
266
266
  * instance of the container constructed/rendered.
267
267
  */
268
268
  function createContainer<
269
- Props: {...},
270
- Ref,
271
- TComponent: component(ref: Ref, ...Props),
269
+ Props extends {...},
270
+ TComponent extends component(...Props),
272
271
  >(
273
272
  Component: TComponent,
274
273
  fragmentSpec: GeneratedNodeMap,
275
- ): component(ref: Ref, ...$RelayProps<Props, RelayProp>) {
276
- // $FlowFixMe[incompatible-return]
274
+ ): component(...$RelayProps<Props, RelayProp>) {
275
+ // $FlowFixMe[incompatible-type]
277
276
  return buildReactRelayContainer(
278
277
  Component,
279
278
  fragmentSpec,
@@ -12,7 +12,12 @@
12
12
  'use strict';
13
13
 
14
14
  import type {ReactRelayQueryRendererContext as ReactRelayQueryRendererContextType} from './ReactRelayQueryRendererContext';
15
- import type {GraphQLTaggedNode, IEnvironment, Variables} from 'relay-runtime';
15
+ import type {
16
+ GraphQLTaggedNode,
17
+ IEnvironment,
18
+ RelayContext,
19
+ Variables,
20
+ } from 'relay-runtime';
16
21
  import type {SelectorData} from 'relay-runtime/store/RelayStoreTypes';
17
22
 
18
23
  const ReactRelayContext = require('./ReactRelayContext');
@@ -40,7 +45,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
40
45
  rootIsQueryRenderer: true,
41
46
  };
42
47
 
43
- hook useDeepCompare<T: {...}>(value: T): T {
48
+ hook useDeepCompare<T extends {...}>(value: T): T {
44
49
  const latestValue = React.useRef(value);
45
50
  // $FlowFixMe[react-rule-unsafe-ref]
46
51
  if (!areEqual(latestValue.current, value)) {
@@ -62,7 +67,10 @@ function ReactRelayLocalQueryRenderer(props: Props): React.Node {
62
67
  return createOperationDescriptor(request, latestVariables);
63
68
  }, [query, latestVariables]);
64
69
 
65
- const relayContext = useMemo(() => ({environment}), [environment]);
70
+ const relayContext = useMemo(
71
+ (): RelayContext => ({environment}),
72
+ [environment],
73
+ );
66
74
 
67
75
  // Use a ref to prevent rendering twice when data changes
68
76
  // because of props change
@@ -16,6 +16,6 @@ const {
16
16
  __internal: {createRelayLoggingContext},
17
17
  } = require('relay-runtime');
18
18
 
19
- module.exports = (createRelayLoggingContext(React): React.Context<
20
- mixed | null,
21
- >);
19
+ module.exports = createRelayLoggingContext(React) as React.Context<
20
+ unknown | null,
21
+ >;
@@ -59,7 +59,7 @@ const {
59
59
  const warning = require('warning');
60
60
 
61
61
  type ContainerState = {
62
- data: {[key: string]: mixed, ...},
62
+ data: {[key: string]: unknown, ...},
63
63
  relayProp: RelayPaginationProp,
64
64
  prevContext: RelayContext,
65
65
  contextForChildren: RelayContext,
@@ -91,7 +91,7 @@ export type ConnectionConfig = {
91
91
  ...
92
92
  };
93
93
  export type ConnectionData = {
94
- +edges?: ?$ReadOnlyArray<any>,
94
+ +edges?: ?ReadonlyArray<any>,
95
95
  +pageInfo?: ?PageInfo,
96
96
  ...
97
97
  };
@@ -258,7 +258,7 @@ function createGetFragmentVariables(
258
258
  );
259
259
  return (prevVars: Variables, totalCount: number): Variables => ({
260
260
  ...prevVars,
261
- [(countVariable: string)]: totalCount,
261
+ [countVariable as string]: totalCount,
262
262
  });
263
263
  }
264
264
 
@@ -272,7 +272,7 @@ function findConnectionMetadata(
272
272
  for (const fragmentName in fragments) {
273
273
  const fragment = fragments[fragmentName];
274
274
  const connectionMetadata: ?Array<ConnectionMetadata> = (fragment.metadata &&
275
- fragment.metadata.connection: any);
275
+ fragment.metadata.connection) as any;
276
276
  // HACK: metadata is always set to `undefined` in classic. In modern, even
277
277
  // if empty, it is set to null (never undefined). We use that knowlege to
278
278
  // check if we're dealing with classic or modern
@@ -302,24 +302,24 @@ function findConnectionMetadata(
302
302
  !isRelayModern || foundConnectionMetadata !== null,
303
303
  'ReactRelayPaginationContainer: A @connection directive must be present.',
304
304
  );
305
- return foundConnectionMetadata || ({}: any);
305
+ return foundConnectionMetadata || ({} as any);
306
306
  }
307
307
 
308
308
  function toObserver(observerOrCallback: ?ObserverOrCallback): Observer<void> {
309
309
  return typeof observerOrCallback === 'function'
310
310
  ? {
311
- error: observerOrCallback,
312
311
  complete: observerOrCallback,
312
+ error: observerOrCallback,
313
313
  unsubscribe: (subscription: Subscription) => {
314
314
  typeof observerOrCallback === 'function' && observerOrCallback();
315
315
  },
316
316
  }
317
- : observerOrCallback || ({}: any);
317
+ : observerOrCallback || ({} as any);
318
318
  }
319
319
 
320
320
  function createContainerWithFragments<
321
- Props: {...},
322
- TComponent: component(...Props),
321
+ Props extends {...},
322
+ TComponent extends component(...Props),
323
323
  >(
324
324
  Component: TComponent,
325
325
  fragments: FragmentMap,
@@ -386,9 +386,9 @@ function createContainerWithFragments<
386
386
  );
387
387
  }
388
388
  this.state = {
389
+ contextForChildren: relayContext,
389
390
  data: this._resolver.resolve(),
390
391
  prevContext: relayContext,
391
- contextForChildren: relayContext,
392
392
  relayProp: this._buildRelayProp(relayContext),
393
393
  resolverGeneration: 0,
394
394
  };
@@ -463,8 +463,8 @@ function createContainerWithFragments<
463
463
  );
464
464
  }
465
465
  this.setState(prevState => ({
466
- prevContext: relayContext,
467
466
  contextForChildren: relayContext,
467
+ prevContext: relayContext,
468
468
  relayProp: this._buildRelayProp(relayContext),
469
469
  resolverGeneration: prevState.resolverGeneration + 1,
470
470
  }));
@@ -499,6 +499,8 @@ function createContainerWithFragments<
499
499
  const keys = Object.keys(nextProps);
500
500
  for (let ii = 0; ii < keys.length; ii++) {
501
501
  const key = keys[ii];
502
+ /* $FlowFixMe[invalid-compare] Error discovered during Constant
503
+ * Condition roll out. See https://fburl.com/workplace/4oq3zi07. */
502
504
  if (key === '__relayContext') {
503
505
  if (
504
506
  nextState.prevContext.environment !==
@@ -520,11 +522,11 @@ function createContainerWithFragments<
520
522
 
521
523
  _buildRelayProp(relayContext: RelayContext): RelayPaginationProp {
522
524
  return {
525
+ environment: relayContext.environment,
523
526
  hasMore: this._hasMore,
524
527
  isLoading: this._isLoading,
525
528
  loadMore: this._loadMore,
526
529
  refetchConnection: this._refetchConnection,
527
- environment: relayContext.environment,
528
530
  };
529
531
  }
530
532
 
@@ -717,7 +719,7 @@ function createContainerWithFragments<
717
719
  );
718
720
  const paginatingVariables = {
719
721
  count: pageSize,
720
- cursor: cursor,
722
+ cursor,
721
723
  totalCount,
722
724
  };
723
725
  const fetch = this._fetchPage(paginatingVariables, observer, options);
@@ -750,12 +752,12 @@ function createContainerWithFragments<
750
752
  }
751
753
 
752
754
  _fetchPage(
753
- paginatingVariables: {
755
+ paginatingVariables: Readonly<{
754
756
  count: number,
755
757
  cursor: ?string,
756
758
  totalCount: number,
757
759
  ...
758
- },
760
+ }>,
759
761
  observer: Observer<void>,
760
762
  options: ?RefetchOptions,
761
763
  ): Subscription {
@@ -790,20 +792,22 @@ function createContainerWithFragments<
790
792
  fragmentVariables,
791
793
  );
792
794
  invariant(
795
+ /* $FlowFixMe[invalid-compare] Error discovered during Constant
796
+ * Condition roll out. See https://fburl.com/workplace/5whu3i34. */
793
797
  typeof fetchVariables === 'object' && fetchVariables !== null,
794
798
  'ReactRelayPaginationContainer: Expected `getVariables()` to ' +
795
799
  'return an object, got `%s` in `%s`.',
796
800
  fetchVariables,
797
801
  componentName,
798
802
  );
799
- fetchVariables = ({
803
+ fetchVariables = {
800
804
  ...fetchVariables,
801
805
  ...this._refetchVariables,
802
- }: Variables);
803
- fragmentVariables = ({
806
+ } as Variables;
807
+ fragmentVariables = {
804
808
  ...fetchVariables,
805
809
  ...fragmentVariables,
806
- }: Variables);
810
+ } as Variables;
807
811
 
808
812
  const cacheConfig: ?{...CacheConfig} = options
809
813
  ? {force: !!options.force}
@@ -825,7 +829,7 @@ function createContainerWithFragments<
825
829
  }
826
830
  this._hasFetched = true;
827
831
 
828
- const onNext = (payload: mixed, complete: () => void) => {
832
+ const onNext = (payload: unknown, complete: () => void) => {
829
833
  const prevData = this._resolver.resolve();
830
834
  this._resolver.setVariables(
831
835
  getFragmentVariables(
@@ -848,10 +852,10 @@ function createContainerWithFragments<
848
852
  if (!areEqual(prevData, nextData)) {
849
853
  this.setState(
850
854
  {
851
- data: nextData,
852
855
  contextForChildren: {
853
856
  environment: this.props.__relayContext.environment,
854
857
  },
858
+ data: nextData,
855
859
  },
856
860
  complete,
857
861
  );
@@ -884,8 +888,8 @@ function createContainerWithFragments<
884
888
  )
885
889
  // use do instead of finally so that observer's `complete` fires after cleanup
886
890
  .do({
887
- error: cleanup,
888
891
  complete: cleanup,
892
+ error: cleanup,
889
893
  unsubscribe: cleanup,
890
894
  })
891
895
  .subscribe(observer || {});
@@ -937,14 +941,17 @@ function createContainerWithFragments<
937
941
  * `fragmentSpec` is memoized once per environment, rather than once per
938
942
  * instance of the container constructed/rendered.
939
943
  */
940
- function createContainer<Props: {...}, TComponent: component(...Props)>(
944
+ function createContainer<
945
+ Props extends {...},
946
+ TComponent extends component(...Props),
947
+ >(
941
948
  Component: TComponent,
942
949
  fragmentSpec: GeneratedNodeMap,
943
950
  connectionConfig: ConnectionConfig,
944
951
  ): component(
945
952
  ...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
946
953
  ) {
947
- // $FlowFixMe[incompatible-return]
954
+ // $FlowFixMe[incompatible-type]
948
955
  return buildReactRelayContainer(
949
956
  Component,
950
957
  fragmentSpec,
@@ -116,7 +116,7 @@ class ReactRelayQueryFetcher {
116
116
  environment,
117
117
  operation,
118
118
  preservePreviousReferences = false,
119
- }: ExecuteConfig): Observable<mixed> {
119
+ }: ExecuteConfig): Observable<unknown> {
120
120
  const reference = environment.retain(operation);
121
121
  const error = () => {
122
122
  // We may have partially fulfilled the request, so let the next request
@@ -61,7 +61,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
61
61
  rootIsQueryRenderer: true,
62
62
  };
63
63
 
64
- export type Props = $ReadOnly<{
64
+ export type Props = Readonly<{
65
65
  cacheConfig?: ?CacheConfig,
66
66
  fetchPolicy?: 'store-and-network' | 'network-only',
67
67
  environment: IEnvironment,
@@ -105,7 +105,7 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
105
105
  // "leak" them before mounting (since we would be unable to clean up). For
106
106
  // that reason, we define them as null initially and fill them in after
107
107
  // mounting to avoid leaking memory.
108
- const retryCallbacks = {
108
+ const retryCallbacks: RetryCallbacks = {
109
109
  handleDataChange: null,
110
110
  handleRetryAfterError: null,
111
111
  };
@@ -14,6 +14,6 @@ const React = require('react');
14
14
 
15
15
  export type ReactRelayQueryRendererContext = {rootIsQueryRenderer: boolean};
16
16
 
17
- module.exports = (React.createContext({
17
+ module.exports = React.createContext({
18
18
  rootIsQueryRenderer: false,
19
- }): React.Context<ReactRelayQueryRendererContext | null>);
19
+ }) as React.Context<ReactRelayQueryRendererContext | null>;
@@ -52,7 +52,7 @@ const warning = require('warning');
52
52
  type ContainerProps = $FlowFixMe;
53
53
 
54
54
  type ContainerState = {
55
- data: {[key: string]: mixed, ...},
55
+ data: {[key: string]: unknown, ...},
56
56
  prevProps: ContainerProps,
57
57
  localVariables: ?Variables,
58
58
  prevPropsContext: RelayContext,
@@ -68,8 +68,8 @@ type ContainerState = {
68
68
  * updates.
69
69
  */
70
70
  function createContainerWithFragments<
71
- Props: {...},
72
- TComponent: component(...Props),
71
+ Props extends {...},
72
+ TComponent extends component(...Props),
73
73
  >(
74
74
  Component: TComponent,
75
75
  fragments: FragmentMap,
@@ -104,11 +104,11 @@ function createContainerWithFragments<
104
104
  rootIsQueryRenderer,
105
105
  );
106
106
  this.state = {
107
+ contextForChildren: relayContext,
107
108
  data: resolver.resolve(),
108
109
  localVariables: null,
109
110
  prevProps: props,
110
111
  prevPropsContext: relayContext,
111
- contextForChildren: relayContext,
112
112
  relayProp: getRelayProp(relayContext.environment, this._refetch),
113
113
  resolver,
114
114
  };
@@ -146,7 +146,7 @@ function createContainerWithFragments<
146
146
  prevState: ContainerState,
147
147
  ): Partial<ContainerState> | null {
148
148
  // Any props change could impact the query, so we mirror props in state.
149
- // This is an unusual pattern, but necessary for this container usecase.
149
+ // This is an unusual pattern, but necessary for this container use case.
150
150
  const {prevProps} = prevState;
151
151
  const relayContext = assertRelayContext(nextProps.__relayContext);
152
152
  const rootIsQueryRenderer = nextProps.__rootIsQueryRenderer ?? false;
@@ -187,11 +187,11 @@ function createContainerWithFragments<
187
187
  rootIsQueryRenderer,
188
188
  );
189
189
  return {
190
+ contextForChildren: relayContext,
190
191
  data: resolver.resolve(),
191
192
  localVariables: null,
192
193
  prevProps: nextProps,
193
194
  prevPropsContext: relayContext,
194
- contextForChildren: relayContext,
195
195
  relayProp: getRelayProp(
196
196
  relayContext.environment,
197
197
  prevState.relayProp.refetch,
@@ -349,12 +349,12 @@ function createContainerWithFragments<
349
349
  const observer =
350
350
  typeof observerOrCallback === 'function'
351
351
  ? {
352
- // callback is not exectued on complete or unsubscribe
352
+ error: observerOrCallback,
353
+ // callback is not executed on complete or unsubscribe
353
354
  // for backward compatibility
354
355
  next: observerOrCallback,
355
- error: observerOrCallback,
356
356
  }
357
- : observerOrCallback || ({}: any);
357
+ : observerOrCallback || ({} as any);
358
358
 
359
359
  const query = getRequest(taggedNode);
360
360
  const operation = createOperationDescriptor(
@@ -385,10 +385,10 @@ function createContainerWithFragments<
385
385
  );
386
386
  this.setState(
387
387
  latestState => ({
388
- data: latestState.resolver.resolve(),
389
388
  contextForChildren: {
390
389
  environment: this.props.__relayContext.environment,
391
390
  },
391
+ data: latestState.resolver.resolve(),
392
392
  }),
393
393
  () => {
394
394
  observer.next && observer.next();
@@ -415,10 +415,10 @@ function createContainerWithFragments<
415
415
  return Observable.create<void>(sink =>
416
416
  this.setState(
417
417
  latestState => ({
418
- data: latestState.resolver.resolve(),
419
418
  contextForChildren: {
420
419
  environment: this.props.__relayContext.environment,
421
420
  },
421
+ data: latestState.resolver.resolve(),
422
422
  }),
423
423
  () => {
424
424
  sink.next();
@@ -429,7 +429,7 @@ function createContainerWithFragments<
429
429
  })
430
430
  .finally(() => {
431
431
  // Finalizing a refetch should only clear this._refetchSubscription
432
- // if the finizing subscription is the most recent call.
432
+ // if the finalizing subscription is the most recent call.
433
433
  if (this._refetchSubscription === refetchSubscription) {
434
434
  this._refetchSubscription = null;
435
435
  }
@@ -486,14 +486,17 @@ function getRelayProp(
486
486
  * `fragmentSpec` is memoized once per environment, rather than once per
487
487
  * instance of the container constructed/rendered.
488
488
  */
489
- function createContainer<Props: {...}, TComponent: component(...Props)>(
489
+ function createContainer<
490
+ Props extends {...},
491
+ TComponent extends component(...Props),
492
+ >(
490
493
  Component: TComponent,
491
494
  fragmentSpec: GeneratedNodeMap,
492
495
  taggedNode: GraphQLTaggedNode,
493
496
  ): component(
494
497
  ...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
495
498
  ) {
496
- // $FlowFixMe[incompatible-return]
499
+ // $FlowFixMe[incompatible-type]
497
500
  return buildReactRelayContainer(
498
501
  Component,
499
502
  fragmentSpec,
@@ -162,9 +162,9 @@ class ReactRelayTestMocker {
162
162
  }
163
163
 
164
164
  this._pendingFetches.push({
165
- ident,
166
165
  cacheConfig,
167
- deferred: {resolve, reject},
166
+ deferred: {reject, resolve},
167
+ ident,
168
168
  request,
169
169
  variables: strippedVars,
170
170
  });
@@ -199,16 +199,16 @@ class ReactRelayTestMocker {
199
199
  deferred.reject(payload.error);
200
200
  };
201
201
 
202
- (env: any).mock = {
202
+ (env as any).mock = {
203
+ fetch,
203
204
  isLoading,
204
205
  rejectQuery,
205
206
  resolveRawQuery,
206
- fetch,
207
207
  };
208
208
 
209
- (env: any).hasMockedNetwork = true;
209
+ (env as any).hasMockedNetwork = true;
210
210
 
211
- (env: any).__setNet(Network.create(fetch));
211
+ (env as any).__setNet(Network.create(fetch));
212
212
  return env;
213
213
  }
214
214
 
@@ -264,7 +264,7 @@ class ReactRelayTestMocker {
264
264
  */
265
265
  networkWrite(config: NetworkWriteConfig): void {
266
266
  invariant(
267
- (this._environment: any).hasMockedNetwork,
267
+ (this._environment as any).hasMockedNetwork,
268
268
  'You cannot resolve queries without a mocked environment. Did you mean ' +
269
269
  'to use `writeDirect` instead?',
270
270
  );
@@ -315,16 +315,16 @@ class ReactRelayTestMocker {
315
315
  );
316
316
 
317
317
  const realPayload =
318
- // $FlowFixMe[incompatible-call]
318
+ // $FlowFixMe[incompatible-type]
319
319
  typeof payload === 'function' ? payload(toResolve.variables) : payload;
320
320
 
321
321
  // if there are errors, reject the query
322
322
  if (realPayload.errors != null && realPayload.errors.length > 0) {
323
- (this._environment: any).mock.rejectQuery(toResolve, {
323
+ (this._environment as any).mock.rejectQuery(toResolve, {
324
324
  error: realPayload.errors[0],
325
325
  });
326
326
  } else {
327
- (this._environment: any).mock.resolveRawQuery(toResolve, realPayload);
327
+ (this._environment as any).mock.resolveRawQuery(toResolve, realPayload);
328
328
  }
329
329
  }
330
330
  }
@@ -22,7 +22,7 @@ import type {
22
22
 
23
23
  export type GeneratedNodeMap = {[key: string]: GraphQLTaggedNode, ...};
24
24
 
25
- export type ObserverOrCallback = Observer<void> | ((error: ?Error) => mixed);
25
+ export type ObserverOrCallback = Observer<void> | ((error: ?Error) => unknown);
26
26
 
27
27
  // NOTE: This is an inexact type in order to allow a RelayPaginationProp or
28
28
  // RelayRefetchProp to flow into a RelayProp.
@@ -57,7 +57,7 @@ export type RelayRefetchProp = {
57
57
  export type RefetchOptions = {
58
58
  +force?: boolean,
59
59
  +fetchPolicy?: 'store-or-network' | 'network-only',
60
- +metadata?: {[key: string]: mixed, ...},
60
+ +metadata?: {[key: string]: unknown, ...},
61
61
  };
62
62
 
63
63
  /**
@@ -99,9 +99,9 @@ export type $FragmentRef<T> = {
99
99
 
100
100
  /* $FlowExpectedError[unclear-type]: Intentional so that it won't fail,
101
101
  * even if the type we want to exclude doesn't exist in Props */
102
- type LooseOmitRelayProps<Props, K: $Keys<any>> = Pick<
102
+ type LooseOmitRelayProps<Props, K extends keyof any> = Pick<
103
103
  Props,
104
- Exclude<$Keys<Props>, K>,
104
+ Exclude<keyof Props, K>,
105
105
  >;
106
106
  /**
107
107
  * A utility type that takes the Props of a component and the type of
@@ -121,44 +121,42 @@ type MapRelayProp<T> = [+t: T] extends [+t: {+$fragmentType: empty, ...}]
121
121
  : [+t: T] extends [+t: {+$fragmentType: FragmentType, ...}]
122
122
  ? $FragmentRef<T>
123
123
  : [+t: T] extends [+t: ?{+$fragmentType: FragmentType, ...}]
124
- ? ?$FragmentRef<$NonMaybeType<T>>
124
+ ? ?$FragmentRef<NonNullable<T>>
125
125
  : [+t: T] extends [
126
- +t: $ReadOnlyArray<
126
+ +t: ReadonlyArray<
127
127
  infer V extends {+$fragmentType: FragmentType, ...},
128
128
  >,
129
129
  ]
130
- ? $ReadOnlyArray<$FragmentRef<V>>
130
+ ? ReadonlyArray<$FragmentRef<V>>
131
131
  : [+t: T] extends [
132
- +t: ?$ReadOnlyArray<
132
+ +t: ?ReadonlyArray<
133
133
  infer V extends {+$fragmentType: FragmentType, ...},
134
134
  >,
135
135
  ]
136
- ? ?$ReadOnlyArray<$FragmentRef<V>>
136
+ ? ?ReadonlyArray<$FragmentRef<V>>
137
137
  : [+t: T] extends [
138
- +t: $ReadOnlyArray<?infer V extends {
138
+ +t: ReadonlyArray<?infer V extends {
139
139
  +$fragmentType: FragmentType,
140
140
  ...
141
141
  }>,
142
142
  ]
143
- ? $ReadOnlyArray<?$FragmentRef<$NonMaybeType<V>>>
143
+ ? ReadonlyArray<?$FragmentRef<NonNullable<V>>>
144
144
  : [+t: T] extends [
145
- +t: ?$ReadOnlyArray<?infer V extends {
145
+ +t: ?ReadonlyArray<?infer V extends {
146
146
  +$fragmentType: FragmentType,
147
147
  ...
148
148
  }>,
149
149
  ]
150
- ? ?$ReadOnlyArray<?$FragmentRef<$NonMaybeType<V>>>
150
+ ? ?ReadonlyArray<?$FragmentRef<NonNullable<V>>>
151
151
  : T;
152
152
 
153
- export type RelayFragmentContainer<TComponent: component(...empty)> = component(
154
- ...$RelayProps<React.ElementConfig<TComponent>, RelayProp>
155
- );
153
+ export type RelayFragmentContainer<TComponent extends component(...empty)> =
154
+ component(...$RelayProps<React.ElementConfig<TComponent>, RelayProp>);
156
155
 
157
- export type RelayPaginationContainer<TComponent: component(...empty)> =
156
+ export type RelayPaginationContainer<TComponent extends component(...empty)> =
158
157
  component(
159
158
  ...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
160
159
  );
161
160
 
162
- export type RelayRefetchContainer<TComponent: component(...empty)> = component(
163
- ...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
164
- );
161
+ export type RelayRefetchContainer<TComponent extends component(...empty)> =
162
+ component(...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>);
@@ -20,21 +20,21 @@ const invariant = require('invariant');
20
20
  * Asserts that the input is a matches the `RelayContext` type defined in
21
21
  * `RelayEnvironmentTypes` and returns it as that type.
22
22
  */
23
- function assertRelayContext(relay: mixed): RelayContext {
23
+ function assertRelayContext(relay: unknown): RelayContext {
24
24
  invariant(
25
25
  isRelayContext(relay),
26
26
  'RelayContext: Expected `context.relay` to be an object conforming to ' +
27
27
  'the `RelayContext` interface, got `%s`.',
28
28
  relay,
29
29
  );
30
- return (relay: any);
30
+ return relay as any;
31
31
  }
32
32
 
33
33
  /**
34
34
  * Determine if the input is a plain object that matches the `RelayContext`
35
35
  * type defined in `RelayEnvironmentTypes`.
36
36
  */
37
- function isRelayContext(context: mixed): boolean {
37
+ function isRelayContext(context: unknown): boolean {
38
38
  return (
39
39
  typeof context === 'object' &&
40
40
  context !== null &&