react-relay 15.0.0 → 16.1.0
Sign up to get free protection for your applications and to get access to all the features.
- package/ReactRelayContext.js +1 -1
- package/ReactRelayQueryFetcher.js.flow +1 -5
- package/ReactRelayQueryRenderer.js.flow +9 -36
- package/ReactRelayTypes.js.flow +1 -0
- package/buildReactRelayContainer.js.flow +3 -1
- package/hooks.js +1 -1
- package/index.js +1 -1
- package/legacy.js +1 -1
- package/lib/ReactRelayContainerUtils.js +0 -11
- package/lib/ReactRelayContext.js +0 -11
- package/lib/ReactRelayFragmentContainer.js +6 -78
- package/lib/ReactRelayFragmentMockRenderer.js +0 -11
- package/lib/ReactRelayLocalQueryRenderer.js +0 -17
- package/lib/ReactRelayPaginationContainer.js +5 -208
- package/lib/ReactRelayQueryFetcher.js +2 -51
- package/lib/ReactRelayQueryRenderer.js +6 -94
- package/lib/ReactRelayQueryRendererContext.js +0 -11
- package/lib/ReactRelayRefetchContainer.js +5 -91
- package/lib/ReactRelayTestMocker.js +9 -85
- package/lib/ReactRelayTypes.js +0 -11
- package/lib/RelayContext.js +0 -21
- package/lib/assertFragmentMap.js +0 -15
- package/lib/buildReactRelayContainer.js +0 -19
- package/lib/getRootVariablesForFragments.js +0 -14
- package/lib/hooks.js +0 -15
- package/lib/index.js +0 -17
- package/lib/isRelayEnvironment.js +1 -18
- package/lib/jest-react/enqueueTask.js +0 -20
- package/lib/jest-react/internalAct.js +0 -38
- package/lib/legacy.js +0 -15
- package/lib/multi-actor/ActorChange.js +0 -11
- package/lib/multi-actor/index.js +0 -11
- package/lib/multi-actor/useRelayActorEnvironment.js +0 -11
- package/lib/relay-hooks/EntryPointContainer.react.js +0 -11
- package/lib/relay-hooks/EntryPointTypes.flow.js +1 -14
- package/lib/relay-hooks/FragmentResource.js +76 -132
- package/lib/relay-hooks/HooksImplementation.js +1 -12
- package/lib/relay-hooks/InternalLogger.js +0 -11
- package/lib/relay-hooks/LRUCache.js +0 -22
- package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +0 -18
- package/lib/relay-hooks/MatchContainer.js +0 -94
- package/lib/relay-hooks/NestedRelayEntryPointBuilderUtils.js +9 -0
- package/lib/relay-hooks/ProfilerContext.js +0 -15
- package/lib/relay-hooks/QueryResource.js +2 -68
- package/lib/relay-hooks/RelayEnvironmentProvider.js +0 -11
- package/lib/relay-hooks/SuspenseResource.js +0 -34
- package/lib/relay-hooks/{react-cache/readFragmentInternal_REACT_CACHE.js → experimental/readFragmentInternal_EXPERIMENTAL.js} +5 -29
- package/lib/relay-hooks/{react-cache/useFragmentInternal_REACT_CACHE.js → experimental/useFragmentInternal_EXPERIMENTAL.js} +35 -100
- package/lib/relay-hooks/{react-cache/useFragment_REACT_CACHE.js → experimental/useFragment_EXPERIMENTAL.js} +1 -16
- package/lib/relay-hooks/{react-cache/usePaginationFragment_REACT_CACHE.js → experimental/usePaginationFragment_EXPERIMENTAL.js} +2 -24
- package/lib/relay-hooks/{react-cache/useRefetchableFragmentInternal_REACT_CACHE.js → experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js} +14 -98
- package/lib/relay-hooks/{react-cache/useRefetchableFragment_REACT_CACHE.js → experimental/useRefetchableFragment_EXPERIMENTAL.js} +1 -15
- package/lib/relay-hooks/loadEntryPoint.js +1 -24
- package/lib/relay-hooks/loadQuery.js +2 -106
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +2 -27
- package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +0 -13
- package/lib/relay-hooks/useBlockingPaginationFragment.js +0 -42
- package/lib/relay-hooks/useClientQuery.js +0 -18
- package/lib/relay-hooks/useEntryPointLoader.js +0 -69
- package/lib/relay-hooks/useFetchTrackingRef.js +0 -26
- package/lib/relay-hooks/useFragment.js +0 -17
- package/lib/relay-hooks/useFragmentNode.js +2 -32
- package/lib/relay-hooks/useIsMountedRef.js +0 -11
- package/lib/relay-hooks/useIsOperationNodeActive.js +0 -11
- package/lib/relay-hooks/useIsParentQueryActive.js +0 -11
- package/lib/relay-hooks/useLazyLoadQuery.js +0 -18
- package/lib/relay-hooks/useLazyLoadQueryNode.js +12 -37
- package/lib/relay-hooks/useLoadMoreFunction.js +9 -34
- package/lib/relay-hooks/useMemoOperationDescriptor.js +0 -11
- package/lib/relay-hooks/useMemoVariables.js +0 -17
- package/lib/relay-hooks/useMutation.js +0 -11
- package/lib/relay-hooks/usePaginationFragment.js +1 -26
- package/lib/relay-hooks/usePreloadedQuery.js +0 -27
- package/lib/relay-hooks/useQueryLoader.js +0 -74
- package/lib/relay-hooks/useRefetchableFragment.js +0 -16
- package/lib/relay-hooks/useRefetchableFragmentNode.js +14 -97
- package/lib/relay-hooks/useRelayEnvironment.js +0 -11
- package/lib/relay-hooks/useStaticFragmentNodeWarning.js +0 -15
- package/lib/relay-hooks/useSubscribeToInvalidationState.js +0 -25
- package/lib/relay-hooks/useSubscription.js +0 -15
- package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +0 -17
- package/package.json +2 -2
- package/react-relay-hooks.js +2 -2
- package/react-relay-hooks.min.js +2 -2
- package/react-relay-legacy.js +2 -2
- package/react-relay-legacy.min.js +2 -2
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/relay-hooks/EntryPointContainer.react.js.flow +5 -0
- package/relay-hooks/EntryPointTypes.flow.js.flow +34 -35
- package/relay-hooks/FragmentResource.js.flow +114 -26
- package/relay-hooks/HooksImplementation.js.flow +3 -1
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +4 -2
- package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +51 -0
- package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +7 -5
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +5 -0
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +5 -0
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +2 -0
- package/relay-hooks/{react-cache/readFragmentInternal_REACT_CACHE.js.flow → experimental/readFragmentInternal_EXPERIMENTAL.js.flow} +4 -3
- package/relay-hooks/{react-cache/useFragmentInternal_REACT_CACHE.js.flow → experimental/useFragmentInternal_EXPERIMENTAL.js.flow} +32 -14
- package/relay-hooks/{react-cache/useFragment_REACT_CACHE.js.flow → experimental/useFragment_EXPERIMENTAL.js.flow} +4 -10
- package/relay-hooks/{react-cache/usePaginationFragment_REACT_CACHE.js.flow → experimental/usePaginationFragment_EXPERIMENTAL.js.flow} +30 -59
- package/relay-hooks/{react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow → experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js.flow} +30 -23
- package/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js.flow +49 -0
- package/relay-hooks/loadEntryPoint.js.flow +4 -2
- package/relay-hooks/loadQuery.js.flow +21 -1
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +4 -2
- package/relay-hooks/useBlockingPaginationFragment.js.flow +10 -17
- package/relay-hooks/useClientQuery.js.flow +2 -2
- package/relay-hooks/useFragmentNode.js.flow +2 -2
- package/relay-hooks/useLazyLoadQueryNode.js.flow +17 -1
- package/relay-hooks/useLoadMoreFunction.js.flow +15 -9
- package/relay-hooks/useMutation.js.flow +26 -9
- package/relay-hooks/usePaginationFragment.js.flow +7 -15
- package/relay-hooks/useQueryLoader.js.flow +2 -8
- package/relay-hooks/useRefetchableFragment.js.flow +14 -16
- package/relay-hooks/useRefetchableFragmentNode.js.flow +33 -20
- package/lib/relay-hooks/react-cache/RelayReactCache.js +0 -32
- package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +0 -290
- package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +0 -49
- package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +0 -110
- package/relay-hooks/react-cache/RelayReactCache.js.flow +0 -40
- package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +0 -430
- package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +0 -70
- package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +0 -150
- package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +0 -65
@@ -1,14 +1,3 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var preloadQuery_DEPRECATED = require('./preloadQuery_DEPRECATED');
|
@@ -26,7 +15,6 @@ function stableStringify(value) {
|
|
26
15
|
return (_JSON$stringify = JSON.stringify(stableCopy(value))) !== null && _JSON$stringify !== void 0 ? _JSON$stringify : 'null';
|
27
16
|
}
|
28
17
|
function prepareEntryPoint(environmentProvider, entryPoint, entryPointParams) {
|
29
|
-
// Start loading the code for the entrypoint
|
30
18
|
var loadingPromise = null;
|
31
19
|
if (entryPoint.root.getModuleIfRequired() == null) {
|
32
20
|
loadingPromise = entryPoint.root.load();
|
@@ -71,7 +59,6 @@ function prepareEntryPoint(environmentProvider, entryPoint, entryPointParams) {
|
|
71
59
|
loadingPromise = (_loadingPromise = loadingPromise) !== null && _loadingPromise !== void 0 ? _loadingPromise : entryPoint.root.load();
|
72
60
|
throw loadingPromise;
|
73
61
|
}
|
74
|
-
// $FlowFixMe[incompatible-cast] - trust me Flow, its entryPoint component
|
75
62
|
return component;
|
76
63
|
},
|
77
64
|
queries: preloadedQueries,
|
@@ -85,9 +72,6 @@ function LazyLoadEntryPointContainer_DEPRECATED(_ref) {
|
|
85
72
|
environmentProvider = _ref.environmentProvider;
|
86
73
|
var environment = useRelayEnvironment();
|
87
74
|
var getPreloadProps = entryPoint.getPreloadProps;
|
88
|
-
// IMPORTANT: Loading the component may suspend (throw), so the props
|
89
|
-
// *must* be computed first to fetch the component's data-dependencies in
|
90
|
-
// parallel with the component itself (the code).
|
91
75
|
var entryPointParamsHash = stableStringify(entryPointParams);
|
92
76
|
var _useMemo = useMemo(function () {
|
93
77
|
return prepareEntryPoint(environmentProvider !== null && environmentProvider !== void 0 ? environmentProvider : {
|
@@ -95,8 +79,6 @@ function LazyLoadEntryPointContainer_DEPRECATED(_ref) {
|
|
95
79
|
return environment;
|
96
80
|
}
|
97
81
|
}, entryPoint, entryPointParams);
|
98
|
-
// NOTE: stableParams encodes the information from params
|
99
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
100
82
|
}, [environment, environmentProvider, getPreloadProps, entryPointParamsHash]),
|
101
83
|
getComponent = _useMemo.getComponent,
|
102
84
|
queries = _useMemo.queries,
|
@@ -1,92 +1,9 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
15
4
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
16
5
|
var React = require('react');
|
17
6
|
var useMemo = React.useMemo;
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Renders the results of a data-driven dependency fetched with the `@match`
|
21
|
-
* directive. The `@match` directive can be used to specify a mapping of
|
22
|
-
* result types to the containers used to render those types. The result
|
23
|
-
* value is an opaque object that described which component was selected
|
24
|
-
* and a reference to its data. Use <MatchContainer/> to render these
|
25
|
-
* values.
|
26
|
-
*
|
27
|
-
* ## Example
|
28
|
-
*
|
29
|
-
* For example, consider a piece of media content that might be text or
|
30
|
-
* an image, where for clients that don't support images the application
|
31
|
-
* should fall back to rendering the image caption as text. @match can be
|
32
|
-
* used to dynamically select whether to render a given media item as
|
33
|
-
* an image or text (on the server) and then fetch the corresponding
|
34
|
-
* React component and its data dependencies (information about the
|
35
|
-
* image or about the text).
|
36
|
-
*
|
37
|
-
* ```
|
38
|
-
* // Media.react.js
|
39
|
-
*
|
40
|
-
* // Define a React component that uses <MatchContainer /> to render the
|
41
|
-
* // results of a @module selection
|
42
|
-
* function Media(props) {
|
43
|
-
* const {media, ...restProps} = props;
|
44
|
-
*
|
45
|
-
* const loader = moduleReference => {
|
46
|
-
* // given the data returned by your server for the @module directive,
|
47
|
-
* // return the React component (or throw a Suspense promise if
|
48
|
-
* // it is loading asynchronously).
|
49
|
-
* todo_returnModuleOrThrowPromise(moduleReference);
|
50
|
-
* };
|
51
|
-
* return <MatchContainer
|
52
|
-
* loader={loader}
|
53
|
-
* match={media.mediaAttachment}
|
54
|
-
* props={restProps}
|
55
|
-
* />;
|
56
|
-
* }
|
57
|
-
*
|
58
|
-
* module.exports = createSuspenseFragmentContainer(
|
59
|
-
* Media,
|
60
|
-
* {
|
61
|
-
* media: graphql`
|
62
|
-
* fragment Media_media on Media {
|
63
|
-
* # ...
|
64
|
-
* mediaAttachment @match {
|
65
|
-
* ...ImageContainer_image @module(name: "ImageContainer.react")
|
66
|
-
* ...TextContainer_text @module(name: "TextContainer.react")
|
67
|
-
* }
|
68
|
-
* }
|
69
|
-
* `
|
70
|
-
* },
|
71
|
-
* );
|
72
|
-
* ```
|
73
|
-
*
|
74
|
-
* ## API
|
75
|
-
*
|
76
|
-
* MatchContainer accepts the following props:
|
77
|
-
* - `match`: The results (an opaque object) of a `@match` field.
|
78
|
-
* - `props`: Props that should be passed through to the dynamically
|
79
|
-
* selected component. Note that any of the components listed in
|
80
|
-
* `@module()` could be selected, so all components should accept
|
81
|
-
* the value passed here.
|
82
|
-
* - `loader`: A function to load a module given a reference (whatever
|
83
|
-
* your server returns for the `js(moduleName: String)` field).
|
84
|
-
*
|
85
|
-
*/
|
86
|
-
|
87
|
-
// Note: this type is intentionally non-exact, it is expected that the
|
88
|
-
// object may contain sibling fields.
|
89
|
-
|
90
7
|
function MatchContainer(_ref2) {
|
91
8
|
var _ref;
|
92
9
|
var fallback = _ref2.fallback,
|
@@ -96,13 +13,6 @@ function MatchContainer(_ref2) {
|
|
96
13
|
if (match != null && typeof match !== 'object') {
|
97
14
|
throw new Error('MatchContainer: Expected `match` value to be an object or null/undefined.');
|
98
15
|
}
|
99
|
-
// NOTE: the MatchPointer type has a $fragmentSpreads field to ensure that only
|
100
|
-
// an object that contains a FragmentSpread can be passed. If the fragment
|
101
|
-
// spread matches, then the metadata fields below (__id, __fragments, etc.)
|
102
|
-
// will be present. But they can be missing if all the fragment spreads use
|
103
|
-
// @module and none of the types matched. The cast here is necessary because
|
104
|
-
// fragment Flow types don't describe metadata fields, only the actual schema
|
105
|
-
// fields the developer selected.
|
106
16
|
var _ref3 = (_ref = match) !== null && _ref !== void 0 ? _ref : {},
|
107
17
|
__id = _ref3.__id,
|
108
18
|
__fragments = _ref3.__fragments,
|
@@ -114,8 +24,6 @@ function MatchContainer(_ref2) {
|
|
114
24
|
}
|
115
25
|
var LoadedContainer = __module_component != null ? loader(__module_component) : null;
|
116
26
|
var fragmentProps = useMemo(function () {
|
117
|
-
// TODO: Perform this transformation in RelayReader so that unchanged
|
118
|
-
// output of subscriptions already has a stable identity.
|
119
27
|
if (__fragmentPropName != null && __id != null && __fragments != null) {
|
120
28
|
var fragProps = {};
|
121
29
|
fragProps[__fragmentPropName] = {
|
@@ -128,8 +36,6 @@ function MatchContainer(_ref2) {
|
|
128
36
|
return null;
|
129
37
|
}, [__id, __fragments, __fragmentOwner, __fragmentPropName]);
|
130
38
|
if (LoadedContainer != null && fragmentProps != null) {
|
131
|
-
// $FlowFixMe[incompatible-type]
|
132
|
-
// $FlowFixMe[cannot-spread-indexer]
|
133
39
|
return /*#__PURE__*/React.createElement(LoadedContainer, (0, _extends2["default"])({}, props, fragmentProps));
|
134
40
|
} else {
|
135
41
|
return fallback !== null && fallback !== void 0 ? fallback : null;
|
@@ -1,18 +1,3 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
|
-
// This contextual profiler can be used to wrap a react sub-tree. It will bind
|
13
|
-
// the RelayProfiler during the render phase of these components. Allows
|
14
|
-
// collecting metrics for a specific part of your application.
|
15
|
-
|
16
1
|
'use strict';
|
17
2
|
|
18
3
|
var React = require('react');
|
@@ -1,14 +1,3 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
@@ -58,9 +47,6 @@ function createCacheEntry(cacheIdentifier, operation, operationAvailability, val
|
|
58
47
|
var retention = environment.retain(operation);
|
59
48
|
return {
|
60
49
|
dispose: function dispose() {
|
61
|
-
// Normally if this entry never commits, the request would've ended by the
|
62
|
-
// time this timeout expires and the temporary retain is released. However,
|
63
|
-
// we need to do this for live queries which remain open indefinitely.
|
64
50
|
if (isLiveQuery && currentNetworkSubscription != null) {
|
65
51
|
currentNetworkSubscription.unsubscribe();
|
66
52
|
}
|
@@ -111,34 +97,17 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
111
97
|
_proto.prepare = function prepare(operation, fetchObservable, maybeFetchPolicy, maybeRenderPolicy, observer, cacheBreaker, profilerContext) {
|
112
98
|
var cacheIdentifier = getQueryCacheIdentifier(this._environment, operation, maybeFetchPolicy, maybeRenderPolicy, cacheBreaker);
|
113
99
|
return this.prepareWithIdentifier(cacheIdentifier, operation, fetchObservable, maybeFetchPolicy, maybeRenderPolicy, observer, profilerContext);
|
114
|
-
}
|
115
|
-
|
116
|
-
/**
|
117
|
-
* This function should be called during a Component's render function,
|
118
|
-
* to either read an existing cached value for the query, or fetch the query
|
119
|
-
* and suspend.
|
120
|
-
*/;
|
100
|
+
};
|
121
101
|
_proto.prepareWithIdentifier = function prepareWithIdentifier(cacheIdentifier, operation, fetchObservable, maybeFetchPolicy, maybeRenderPolicy, observer, profilerContext) {
|
122
102
|
var environment = this._environment;
|
123
103
|
var fetchPolicy = maybeFetchPolicy !== null && maybeFetchPolicy !== void 0 ? maybeFetchPolicy : operationIsLiveQuery(operation) ? DEFAULT_LIVE_FETCH_POLICY : DEFAULT_FETCH_POLICY;
|
124
104
|
var renderPolicy = maybeRenderPolicy !== null && maybeRenderPolicy !== void 0 ? maybeRenderPolicy : environment.UNSTABLE_getDefaultRenderPolicy();
|
125
|
-
|
126
|
-
// 1. Check if there's a cached value for this operation, and reuse it if
|
127
|
-
// it's available
|
128
105
|
var cacheEntry = this._cache.get(cacheIdentifier);
|
129
106
|
var temporaryRetainDisposable = null;
|
130
107
|
var entryWasCached = cacheEntry != null;
|
131
108
|
if (cacheEntry == null) {
|
132
|
-
// 2. If a cached value isn't available, try fetching the operation.
|
133
|
-
// _fetchAndSaveQuery will update the cache with either a Promise or
|
134
|
-
// an Error to throw, or a QueryResult to return.
|
135
109
|
cacheEntry = this._fetchAndSaveQuery(cacheIdentifier, operation, fetchObservable, fetchPolicy, renderPolicy, profilerContext, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, observer), {}, {
|
136
110
|
unsubscribe: function unsubscribe(subscription) {
|
137
|
-
// 4. If the request is cancelled, make sure to dispose
|
138
|
-
// of the temporary retain; this will ensure that a promise
|
139
|
-
// doesn't remain unnecessarily cached until the temporary retain
|
140
|
-
// expires. Not clearing the temporary retain might cause the
|
141
|
-
// query to incorrectly re-suspend.
|
142
111
|
if (temporaryRetainDisposable != null) {
|
143
112
|
temporaryRetainDisposable.dispose();
|
144
113
|
}
|
@@ -147,12 +116,6 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
147
116
|
}
|
148
117
|
}));
|
149
118
|
}
|
150
|
-
|
151
|
-
// 3. Temporarily retain here in render phase. When the component reading
|
152
|
-
// the operation is committed, we will transfer ownership of data retention
|
153
|
-
// to the component.
|
154
|
-
// In case the component never commits (mounts or updates) from this render,
|
155
|
-
// this data retention hold will auto-release itself after a timeout.
|
156
119
|
temporaryRetainDisposable = cacheEntry.temporaryRetain(environment);
|
157
120
|
var cachedValue = cacheEntry.getValue();
|
158
121
|
if (isPromise(cachedValue)) {
|
@@ -170,13 +133,7 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
170
133
|
throw cachedValue;
|
171
134
|
}
|
172
135
|
return cachedValue;
|
173
|
-
}
|
174
|
-
|
175
|
-
/**
|
176
|
-
* This function should be called during a component's commit phase
|
177
|
-
* (e.g. inside useEffect), in order to retain the operation in the Relay store
|
178
|
-
* and transfer ownership of the operation to the component lifecycle.
|
179
|
-
*/;
|
136
|
+
};
|
180
137
|
_proto.retain = function retain(queryResult, profilerContext) {
|
181
138
|
var environment = this._environment;
|
182
139
|
var cacheIdentifier = queryResult.cacheIdentifier,
|
@@ -216,19 +173,12 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
216
173
|
_proto._fetchAndSaveQuery = function _fetchAndSaveQuery(cacheIdentifier, operation, fetchObservable, fetchPolicy, renderPolicy, profilerContext, observer) {
|
217
174
|
var _this2 = this;
|
218
175
|
var environment = this._environment;
|
219
|
-
|
220
|
-
// NOTE: Running `check` will write missing data to the store using any
|
221
|
-
// missing data handlers specified on the environment;
|
222
|
-
// We run it here first to make the handlers get a chance to populate
|
223
|
-
// missing data.
|
224
176
|
var queryAvailability = environment.check(operation);
|
225
177
|
var queryStatus = queryAvailability.status;
|
226
178
|
var hasFullQuery = queryStatus === 'available';
|
227
179
|
var canPartialRender = hasFullQuery || renderPolicy === 'partial' && queryStatus !== 'stale';
|
228
180
|
var shouldFetch;
|
229
181
|
var shouldAllowRender;
|
230
|
-
// Different definitions for Promise in our repos can cause this variable
|
231
|
-
// to cause errors when synced elsewhere
|
232
182
|
var resolveNetworkPromise = function resolveNetworkPromise() {};
|
233
183
|
switch (fetchPolicy) {
|
234
184
|
case 'store-only':
|
@@ -257,11 +207,6 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
257
207
|
break;
|
258
208
|
}
|
259
209
|
}
|
260
|
-
|
261
|
-
// NOTE: If this value is false, we will cache a promise for this
|
262
|
-
// query, which means we will suspend here at this query root.
|
263
|
-
// If it's true, we will cache the query resource and allow rendering to
|
264
|
-
// continue.
|
265
210
|
if (shouldAllowRender) {
|
266
211
|
var queryResult = getQueryResult(operation, cacheIdentifier);
|
267
212
|
var _cacheEntry = createCacheEntry(cacheIdentifier, operation, queryAvailability, queryResult, null, this._clearCacheEntry);
|
@@ -281,7 +226,6 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
281
226
|
if (observerStart) {
|
282
227
|
var subscriptionWithConditionalCancelation = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, subscription), {}, {
|
283
228
|
unsubscribe: function unsubscribe() {
|
284
|
-
// Only live queries should have their network requests canceled.
|
285
229
|
if (operationIsLiveQuery(operation)) {
|
286
230
|
subscription.unsubscribe();
|
287
231
|
}
|
@@ -303,17 +247,9 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
303
247
|
},
|
304
248
|
error: function error(_error) {
|
305
249
|
var cacheEntry = _this2._getOrCreateCacheEntry(cacheIdentifier, operation, queryAvailability, _error, networkSubscription);
|
306
|
-
|
307
|
-
// If, this is the first thing we receive for the query,
|
308
|
-
// before any other payload handled is error, we will cache and
|
309
|
-
// re-throw that error later.
|
310
|
-
|
311
|
-
// We will ignore errors for any incremental payloads we receive.
|
312
250
|
if (cacheEntry.processedPayloadsCount === 0) {
|
313
251
|
cacheEntry.setValue(_error);
|
314
252
|
} else {
|
315
|
-
// TODO:T92030819 Remove this warning and actually throw the network error
|
316
|
-
// To complete this task we need to have a way of precisely tracking suspendable points
|
317
253
|
process.env.NODE_ENV !== "production" ? warning(false, 'QueryResource: An incremental payload for query `%s` returned an error: `%s`.', operation.fragment.node.name, String(_error.message)) : void 0;
|
318
254
|
}
|
319
255
|
resolveNetworkPromise();
|
@@ -339,8 +275,6 @@ var QueryResourceImpl = /*#__PURE__*/function () {
|
|
339
275
|
var networkPromise = new Promise(function (resolve) {
|
340
276
|
resolveNetworkPromise = resolve;
|
341
277
|
});
|
342
|
-
|
343
|
-
// $FlowExpectedError[prop-missing] Expando to annotate Promises.
|
344
278
|
networkPromise.displayName = 'Relay(' + operation.fragment.node.name + ')';
|
345
279
|
_cacheEntry2 = createCacheEntry(cacheIdentifier, operation, queryAvailability, networkPromise, networkSubscription, this._clearCacheEntry);
|
346
280
|
this._cache.set(cacheIdentifier, _cacheEntry2);
|
@@ -1,14 +1,3 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var ReactRelayContext = require('./../ReactRelayContext');
|
@@ -1,26 +1,9 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
15
4
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
16
5
|
var invariant = require('invariant');
|
17
6
|
var TEMPORARY_RETAIN_DURATION_MS = 5 * 60 * 1000;
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Allows you to retain a resource as part of a component lifecycle accounting
|
21
|
-
* for Suspense. You temporarily retain the resource during render, then
|
22
|
-
* permanently retain it during commit and release it during unmount.
|
23
|
-
*/
|
24
7
|
var SuspenseResource = /*#__PURE__*/function () {
|
25
8
|
function SuspenseResource(retain) {
|
26
9
|
var _this = this;
|
@@ -48,20 +31,11 @@ var SuspenseResource = /*#__PURE__*/function () {
|
|
48
31
|
_proto.temporaryRetain = function temporaryRetain(environment) {
|
49
32
|
var _this2 = this;
|
50
33
|
var _this$_releaseTempora;
|
51
|
-
// If we're executing in a server environment, there's no need
|
52
|
-
// to create temporary retains, since the component will never commit.
|
53
34
|
if (environment.isServer()) {
|
54
35
|
return {
|
55
36
|
dispose: function dispose() {}
|
56
37
|
};
|
57
38
|
}
|
58
|
-
|
59
|
-
// temporaryRetain is called during the render phase. However,
|
60
|
-
// given that we can't tell if this render will eventually commit or not,
|
61
|
-
// we create a timer to autodispose of this retain in case the associated
|
62
|
-
// component never commits.
|
63
|
-
// If the component /does/ commit, permanentRetain will clear this timeout
|
64
|
-
// and permanently retain the data.
|
65
39
|
var retention = this._retain(environment);
|
66
40
|
var releaseQueryTimeout = null;
|
67
41
|
var releaseTemporaryRetain = function releaseTemporaryRetain() {
|
@@ -71,14 +45,6 @@ var SuspenseResource = /*#__PURE__*/function () {
|
|
71
45
|
retention.dispose();
|
72
46
|
};
|
73
47
|
releaseQueryTimeout = setTimeout(releaseTemporaryRetain, TEMPORARY_RETAIN_DURATION_MS);
|
74
|
-
|
75
|
-
// NOTE: Since temporaryRetain can be called multiple times, we release
|
76
|
-
// the previous temporary retain after we re-establish a new one, since
|
77
|
-
// we only ever need a single temporary retain until the permanent retain is
|
78
|
-
// established.
|
79
|
-
// temporaryRetain may be called multiple times by React during the render
|
80
|
-
// phase, as well as multiple times by other query components that are
|
81
|
-
// rendering the same query/variables.
|
82
48
|
(_this$_releaseTempora = this._releaseTemporaryRetain) === null || _this$_releaseTempora === void 0 ? void 0 : _this$_releaseTempora.call(this);
|
83
49
|
this._releaseTemporaryRetain = releaseTemporaryRetain;
|
84
50
|
return {
|
@@ -1,14 +1,3 @@
|
|
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
|
-
*
|
8
|
-
* @format
|
9
|
-
* @oncall relay
|
10
|
-
*/
|
11
|
-
|
12
1
|
'use strict';
|
13
2
|
|
14
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
@@ -19,6 +8,7 @@ var _require = require('../QueryResource'),
|
|
19
8
|
var invariant = require('invariant');
|
20
9
|
var _require2 = require('relay-runtime'),
|
21
10
|
fetchQueryInternal = _require2.__internal.fetchQuery,
|
11
|
+
RelayFeatureFlags = _require2.RelayFeatureFlags,
|
22
12
|
createOperationDescriptor = _require2.createOperationDescriptor,
|
23
13
|
getPendingOperationsForFragment = _require2.getPendingOperationsForFragment,
|
24
14
|
getSelector = _require2.getSelector,
|
@@ -95,14 +85,9 @@ function handlePotentialSnapshotErrorsForState(environment, state) {
|
|
95
85
|
function handleMissingClientEdge(environment, parentFragmentNode, parentFragmentRef, missingClientEdgeRequestInfo, queryOptions) {
|
96
86
|
var originalVariables = getVariablesFromFragment(parentFragmentNode, parentFragmentRef);
|
97
87
|
var variables = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, originalVariables), {}, {
|
98
|
-
id: missingClientEdgeRequestInfo.clientEdgeDestinationID
|
88
|
+
id: missingClientEdgeRequestInfo.clientEdgeDestinationID
|
99
89
|
});
|
100
|
-
|
101
90
|
var queryOperationDescriptor = createOperationDescriptor(missingClientEdgeRequestInfo.request, variables, queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.networkCacheConfig);
|
102
|
-
// This may suspend. We don't need to do anything with the results; all we're
|
103
|
-
// doing here is started the query if needed and retaining and releasing it
|
104
|
-
// according to the component mount/suspense cycle; QueryResource
|
105
|
-
// already handles this by itself.
|
106
91
|
var QueryResource = getQueryResourceForEnvironment(environment);
|
107
92
|
return QueryResource.prepare(queryOperationDescriptor, fetchQueryInternal(environment, queryOperationDescriptor), queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.fetchPolicy);
|
108
93
|
}
|
@@ -133,9 +118,7 @@ function getFragmentState(environment, fragmentSelector) {
|
|
133
118
|
};
|
134
119
|
}
|
135
120
|
}
|
136
|
-
|
137
|
-
// fragmentNode cannot change during the lifetime of the component, though fragmentRef may change.
|
138
|
-
function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef, hookDisplayName, queryOptions, fragmentKey) {
|
121
|
+
function readFragmentInternal_EXPERIMENTAL(environment, fragmentNode, fragmentRef, hookDisplayName, queryOptions, fragmentKey) {
|
139
122
|
var _fragmentNode$metadat, _fragmentNode$metadat2;
|
140
123
|
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
141
124
|
var isPlural = (fragmentNode === null || fragmentNode === void 0 ? void 0 : (_fragmentNode$metadat = fragmentNode.metadata) === null || _fragmentNode$metadat === void 0 ? void 0 : _fragmentNode$metadat.plural) === true;
|
@@ -146,9 +129,6 @@ function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef
|
|
146
129
|
}
|
147
130
|
!(fragmentRef == null || isPlural && Array.isArray(fragmentRef) && fragmentRef.length === 0 || fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, hookDisplayName, fragmentNode.name, fragmentKey == null ? 'a fragment reference' : "the `".concat(fragmentKey, "`"), hookDisplayName) : invariant(false) : void 0;
|
148
131
|
var state = getFragmentState(environment, fragmentSelector);
|
149
|
-
|
150
|
-
// Handle the queries for any missing client edges; this may suspend.
|
151
|
-
// FIXME handle client edges in parallel.
|
152
132
|
var clientEdgeQueries = null;
|
153
133
|
if (((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true) {
|
154
134
|
var missingClientEdges = getMissingClientEdges(state);
|
@@ -169,16 +149,12 @@ function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef
|
|
169
149
|
}
|
170
150
|
}
|
171
151
|
if (isMissingData(state)) {
|
172
|
-
// Suspend if an active operation bears on this fragment, either the
|
173
|
-
// fragment's owner or some other mutation etc. that could affect it:
|
174
152
|
!(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
|
175
153
|
var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
|
176
154
|
var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner);
|
177
155
|
if (pendingOperationsResult) {
|
178
156
|
throw pendingOperationsResult.promise;
|
179
157
|
}
|
180
|
-
// Report required fields only if we're not suspending, since that means
|
181
|
-
// they're missing even though we are out of options for possibly fetching them:
|
182
158
|
handlePotentialSnapshotErrorsForState(environment, state);
|
183
159
|
}
|
184
160
|
var data;
|
@@ -191,7 +167,7 @@ function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef
|
|
191
167
|
return s.data;
|
192
168
|
});
|
193
169
|
}
|
194
|
-
if (process.env.NODE_ENV !== "production") {
|
170
|
+
if (RelayFeatureFlags.LOG_MISSING_RECORDS_IN_PROD || process.env.NODE_ENV !== "production") {
|
195
171
|
if (fragmentRef != null && (data === undefined || Array.isArray(data) && data.length > 0 && data.every(function (d) {
|
196
172
|
return d === undefined;
|
197
173
|
}))) {
|
@@ -203,4 +179,4 @@ function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef
|
|
203
179
|
clientEdgeQueries: clientEdgeQueries
|
204
180
|
};
|
205
181
|
}
|
206
|
-
module.exports =
|
182
|
+
module.exports = readFragmentInternal_EXPERIMENTAL;
|