react-relay 0.0.0-main-510cf1ea → 0.0.0-main-b3837342

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-510cf1ea
2
+ * Relay v0.0.0-main-b3837342
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/hooks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-510cf1ea
2
+ * Relay v0.0.0-main-b3837342
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-510cf1ea
2
+ * Relay v0.0.0-main-b3837342
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/legacy.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-510cf1ea
2
+ * Relay v0.0.0-main-b3837342
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var invariant = require('invariant');
4
+ var _require = require('relay-runtime'),
5
+ createOperationDescriptor = _require.createOperationDescriptor,
6
+ getRequest = _require.getRequest;
7
+ function serverPreloadQuery(environment, query, variables) {
8
+ var _ref, _request$params$id;
9
+ var request = getRequest(query);
10
+ var operationDescriptor = createOperationDescriptor(request, variables);
11
+ var observable = environment.execute({
12
+ operation: operationDescriptor
13
+ });
14
+ var queryId = (_ref = (_request$params$id = request.params.id) !== null && _request$params$id !== void 0 ? _request$params$id : request.params.cacheID) !== null && _ref !== void 0 ? _ref : request.params.name;
15
+ var response = observable.toPromise().then(function (rawResponse) {
16
+ !(rawResponse != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Unexpected null response from execute') : invariant(false) : void 0;
17
+ !!Array.isArray(rawResponse) ? process.env.NODE_ENV !== "production" ? invariant(false, '@defer is not yet supported in serverPreloadQuery') : invariant(false) : void 0;
18
+ return {
19
+ data: rawResponse.data,
20
+ errors: rawResponse.errors
21
+ };
22
+ });
23
+ return {
24
+ kind: 'PreloadedQueryRef',
25
+ queryId: queryId,
26
+ variables: variables,
27
+ _response: response,
28
+ fetchedAt: Date.now()
29
+ };
30
+ }
31
+ module.exports = serverPreloadQuery;
@@ -0,0 +1,62 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var usePreloadedQuery = require('../usePreloadedQuery');
5
+ var useRelayEnvironment = require('../useRelayEnvironment');
6
+ var _require = require('react'),
7
+ use = _require.use,
8
+ useMemo = _require.useMemo;
9
+ var _require2 = require('relay-runtime'),
10
+ __internal = _require2.__internal,
11
+ ROOT_TYPE = _require2.ROOT_TYPE,
12
+ createOperationDescriptor = _require2.createOperationDescriptor,
13
+ getRequest = _require2.getRequest;
14
+ var defaultGetDataID = __internal.defaultGetDataID,
15
+ normalizeResponse = __internal.normalizeResponse;
16
+ var committedRefs = new WeakSet();
17
+ var DEFAULT_STALE_MS = 30_000;
18
+ function useQueryFromServer(query, queryRef, options) {
19
+ var _options$staleThresho, _environment$_getData;
20
+ var environment = useRelayEnvironment();
21
+ var request = getRequest(query);
22
+ var threshold = (_options$staleThresho = options === null || options === void 0 ? void 0 : options.staleThresholdMs) !== null && _options$staleThresho !== void 0 ? _options$staleThresho : DEFAULT_STALE_MS;
23
+ var getDataID = (_environment$_getData = environment._getDataID) !== null && _environment$_getData !== void 0 ? _environment$_getData : defaultGetDataID;
24
+ var response = use(queryRef._response);
25
+ var isFresh = response.data != null && Date.now() - queryRef.fetchedAt <= threshold;
26
+ var shouldCommit = isFresh && !committedRefs.has(queryRef);
27
+ if (shouldCommit) {
28
+ var _environment$__log;
29
+ committedRefs.add(queryRef);
30
+ var operation = createOperationDescriptor(request, queryRef.variables);
31
+ var responsePayload = {
32
+ data: response.data,
33
+ errors: response.errors
34
+ };
35
+ var relayPayload = normalizeResponse(responsePayload, operation.root, ROOT_TYPE, {
36
+ getDataID: getDataID,
37
+ treatMissingFieldsAsNull: false,
38
+ deferDeduplicatedFields: false,
39
+ log: (_environment$__log = environment.__log) !== null && _environment$__log !== void 0 ? _environment$__log : null,
40
+ path: [],
41
+ shouldProcessClientComponents: false
42
+ }, false);
43
+ environment.getStore().publish(relayPayload.source);
44
+ }
45
+ var preloadedQuery = useMemo(function () {
46
+ var _request$params$id;
47
+ var isFreshAtMemo = response.data != null && Date.now() - queryRef.fetchedAt <= threshold;
48
+ var useStore = isFreshAtMemo || committedRefs.has(queryRef);
49
+ return {
50
+ kind: 'PreloadedQuery_DEPRECATED',
51
+ environment: environment,
52
+ fetchKey: queryRef.fetchedAt,
53
+ fetchPolicy: useStore ? 'store-or-network' : 'network-only',
54
+ id: (_request$params$id = request.params.id) !== null && _request$params$id !== void 0 ? _request$params$id : request.params.name,
55
+ name: request.params.name,
56
+ source: null,
57
+ variables: queryRef.variables
58
+ };
59
+ }, [environment, queryRef.fetchedAt, response.data, queryRef.variables, request.params.id, request.params.name, threshold]);
60
+ return usePreloadedQuery(query, preloadedQuery);
61
+ }
62
+ module.exports = useQueryFromServer;
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var useQueryFromServer = require('./relay-hooks/rsc/useQueryFromServer');
5
+ module.exports = {
6
+ useQueryFromServer: useQueryFromServer
7
+ };
@@ -2,6 +2,7 @@
2
2
 
3
3
  var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator").default;
4
4
  var serverFetchQueryImpl = require('./relay-hooks/rsc/serverFetchQuery');
5
+ var serverPreloadQueryImpl = require('./relay-hooks/rsc/serverPreloadQuery');
5
6
  var serverReadFragmentImpl = require('./relay-hooks/rsc/serverReadFragment');
6
7
  var invariant = require('invariant');
7
8
  var React = require('react');
@@ -18,6 +19,9 @@ function createServerEnvironment(create) {
18
19
  });
19
20
  return _serverFetchQuery.apply(this, arguments);
20
21
  }
22
+ function serverPreloadQuery(query, variables) {
23
+ return serverPreloadQueryImpl(getEnvironment(), query, variables);
24
+ }
21
25
  function serverReadFragment(_x3, _x4) {
22
26
  return _serverReadFragment.apply(this, arguments);
23
27
  }
@@ -30,6 +34,7 @@ function createServerEnvironment(create) {
30
34
  return {
31
35
  getEnvironment: getEnvironment,
32
36
  serverFetchQuery: serverFetchQuery,
37
+ serverPreloadQuery: serverPreloadQuery,
33
38
  serverReadFragment: serverReadFragment
34
39
  };
35
40
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-relay",
3
3
  "description": "A framework for building GraphQL-driven React applications.",
4
- "version": "0.0.0-main-510cf1ea",
4
+ "version": "0.0.0-main-b3837342",
5
5
  "keywords": [
6
6
  "graphql",
7
7
  "relay",
@@ -20,7 +20,7 @@
20
20
  "fbjs": "^3.0.2",
21
21
  "invariant": "^2.2.4",
22
22
  "nullthrows": "^1.1.1",
23
- "relay-runtime": "0.0.0-main-510cf1ea"
23
+ "relay-runtime": "0.0.0-main-b3837342"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "react": "^16.9.0 || ^17 || ^18 || ^19"
@@ -0,0 +1,69 @@
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 {IEnvironment, PayloadError, Query, Variables} from 'relay-runtime';
15
+
16
+ const invariant = require('invariant');
17
+ const {createOperationDescriptor, getRequest} = require('relay-runtime');
18
+
19
+ export type PreloadedQueryResponse<TData> = {
20
+ +data: TData,
21
+ +errors?: ReadonlyArray<PayloadError>,
22
+ };
23
+
24
+ export type PreloadedQueryRef<TVariables, TData> = {
25
+ +kind: 'PreloadedQueryRef',
26
+ +queryId: string,
27
+ +variables: TVariables,
28
+ +_response: Promise<PreloadedQueryResponse<TData>>,
29
+ +fetchedAt: number,
30
+ };
31
+
32
+ function serverPreloadQuery<TVariables extends Variables, TData>(
33
+ environment: IEnvironment,
34
+ query: Query<TVariables, TData>,
35
+ variables: TVariables,
36
+ ): PreloadedQueryRef<TVariables, TData> {
37
+ const request = getRequest(query);
38
+ const operationDescriptor = createOperationDescriptor(request, variables);
39
+
40
+ const observable = environment.execute({operation: operationDescriptor});
41
+
42
+ const queryId =
43
+ request.params.id ?? request.params.cacheID ?? request.params.name;
44
+
45
+ const response: Promise<PreloadedQueryResponse<TData>> =
46
+ // $FlowFixMe[incompatible-type] PayloadData -> TData; shape validated by the Relay compiler
47
+ observable.toPromise().then(rawResponse => {
48
+ invariant(rawResponse != null, 'Unexpected null response from execute');
49
+ // TODO: @defer returns batched responses; this only handles the first payload
50
+ invariant(
51
+ !Array.isArray(rawResponse),
52
+ '@defer is not yet supported in serverPreloadQuery',
53
+ );
54
+ return {
55
+ data: rawResponse.data,
56
+ errors: rawResponse.errors,
57
+ };
58
+ });
59
+
60
+ return {
61
+ kind: 'PreloadedQueryRef',
62
+ queryId,
63
+ variables,
64
+ _response: response,
65
+ fetchedAt: Date.now(),
66
+ };
67
+ }
68
+
69
+ module.exports = serverPreloadQuery;
@@ -0,0 +1,135 @@
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 {
16
+ PreloadedQueryRef,
17
+ PreloadedQueryResponse,
18
+ } from './serverPreloadQuery';
19
+ import type {Query, Variables} from 'relay-runtime';
20
+
21
+ const usePreloadedQuery = require('../usePreloadedQuery');
22
+ const useRelayEnvironment = require('../useRelayEnvironment');
23
+ // $FlowFixMe[missing-export] React.use is available in React 19+
24
+ const {use, useMemo} = require('react');
25
+ const {
26
+ __internal,
27
+ ROOT_TYPE,
28
+ createOperationDescriptor,
29
+ getRequest,
30
+ } = require('relay-runtime');
31
+
32
+ const {defaultGetDataID, normalizeResponse} = __internal;
33
+
34
+ // $FlowFixMe[unclear-type] WeakSet used for identity-based dedup only
35
+ const committedRefs: WeakSet<any> = new WeakSet();
36
+
37
+ const DEFAULT_STALE_MS = 30_000;
38
+
39
+ function useQueryFromServer<TVariables extends Variables, TData>(
40
+ query: Query<TVariables, TData>,
41
+ queryRef: PreloadedQueryRef<TVariables, TData>,
42
+ options?: {staleThresholdMs?: number},
43
+ ): TData {
44
+ const environment = useRelayEnvironment();
45
+ const request = getRequest(query);
46
+ const threshold = options?.staleThresholdMs ?? DEFAULT_STALE_MS;
47
+ // TODO: Add a method to IEnvironment for server-side publish so custom
48
+ // IEnvironment implementations don't need to access _getDataID.
49
+ // $FlowFixMe[prop-missing] _getDataID is not on IEnvironment
50
+ // $FlowFixMe[unclear-type]
51
+ const getDataID: any = environment._getDataID ?? defaultGetDataID;
52
+
53
+ const response: PreloadedQueryResponse<TData> = use(queryRef._response);
54
+
55
+ const isFresh =
56
+ response.data != null && Date.now() - queryRef.fetchedAt <= threshold;
57
+
58
+ const shouldCommit = isFresh && !committedRefs.has(queryRef);
59
+
60
+ // Publish server data to the Relay store without notifying subscribers.
61
+ // This avoids the React "Cannot update a component while rendering a
62
+ // different component" error that occurs when store.notify() triggers
63
+ // setState in other mounted components that subscribe to overlapping records.
64
+ if (shouldCommit) {
65
+ committedRefs.add(queryRef);
66
+
67
+ const operation = createOperationDescriptor(request, queryRef.variables);
68
+
69
+ // $FlowFixMe[unclear-type]
70
+ const responsePayload: any = {
71
+ data: response.data,
72
+ errors: response.errors,
73
+ };
74
+ const relayPayload = normalizeResponse(
75
+ responsePayload,
76
+ operation.root,
77
+ ROOT_TYPE,
78
+ {
79
+ getDataID,
80
+ treatMissingFieldsAsNull: false,
81
+ deferDeduplicatedFields: false,
82
+ // $FlowFixMe[prop-missing]
83
+ log: environment.__log ?? null,
84
+ path: [],
85
+ shouldProcessClientComponents: false,
86
+ },
87
+ false,
88
+ );
89
+
90
+ environment.getStore().publish(relayPayload.source);
91
+ }
92
+
93
+ // Build a PreloadedQuery shim. Fresh data was committed to the store
94
+ // above, so source is null and fetchPolicy is "store-or-network".
95
+ // Stale path uses "network-only" to trigger a client-side refetch.
96
+ const preloadedQuery = useMemo(() => {
97
+ const isFreshAtMemo =
98
+ response.data != null && Date.now() - queryRef.fetchedAt <= threshold;
99
+
100
+ // If this queryRef was already committed to the store by a previous
101
+ // component instance, read from the store even if the server timestamp
102
+ // is past the staleness threshold. This prevents a network refetch
103
+ // from overwriting store mutations made after the initial commit.
104
+ const useStore = isFreshAtMemo || committedRefs.has(queryRef);
105
+
106
+ return {
107
+ kind: 'PreloadedQuery_DEPRECATED',
108
+ environment,
109
+ fetchKey: queryRef.fetchedAt,
110
+ fetchPolicy: useStore ? 'store-or-network' : 'network-only',
111
+ id: request.params.id ?? request.params.name,
112
+ name: request.params.name,
113
+ source: null,
114
+ variables: queryRef.variables,
115
+ };
116
+ }, [
117
+ environment,
118
+ queryRef.fetchedAt,
119
+ response.data,
120
+ queryRef.variables,
121
+ request.params.id,
122
+ request.params.name,
123
+ threshold,
124
+ ]);
125
+
126
+ // usePreloadedQuery expects an opaque PreloadedQuery that can only be
127
+ // created via loadQuery/useQueryLoader. There's no public API to create
128
+ // one from server-fetched data, so we construct a plain object with the
129
+ // fields usePreloadedQuery reads internally.
130
+ // $FlowFixMe[incompatible-call]
131
+ // $FlowFixMe[incompatible-type]
132
+ return usePreloadedQuery(query, preloadedQuery);
133
+ }
134
+
135
+ module.exports = useQueryFromServer;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Relay v0.0.0-main-b3837342
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
+ };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-510cf1ea
2
+ * Relay v0.0.0-main-b3837342
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -11,6 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
+ import type {PreloadedQueryRef} from './relay-hooks/rsc/serverPreloadQuery';
14
15
  import type {
15
16
  Fragment,
16
17
  FragmentType,
@@ -20,10 +21,13 @@ import type {
20
21
  } from 'relay-runtime';
21
22
 
22
23
  const serverFetchQueryImpl = require('./relay-hooks/rsc/serverFetchQuery');
24
+ const serverPreloadQueryImpl = require('./relay-hooks/rsc/serverPreloadQuery');
23
25
  const serverReadFragmentImpl = require('./relay-hooks/rsc/serverReadFragment');
24
26
  const invariant = require('invariant');
25
27
  const React = require('react');
26
28
 
29
+ export type {PreloadedQueryRef};
30
+
27
31
  type HasSpread<TFragmentType> = {+$fragmentSpreads: TFragmentType, ...};
28
32
 
29
33
  export type ServerEnvironment = {
@@ -32,6 +36,10 @@ export type ServerEnvironment = {
32
36
  query: Query<TVariables, TData>,
33
37
  variables: TVariables,
34
38
  ) => Promise<TData>,
39
+ +serverPreloadQuery: <TVariables extends Variables, TData>(
40
+ query: Query<TVariables, TData>,
41
+ variables: TVariables,
42
+ ) => PreloadedQueryRef<TVariables, TData>,
35
43
  +serverReadFragment: <TFragmentType extends FragmentType, TData>(
36
44
  fragment: Fragment<TFragmentType, TData>,
37
45
  fragmentRef:
@@ -55,6 +63,13 @@ function createServerEnvironment(
55
63
  return serverFetchQueryImpl(getEnvironment(), query, variables);
56
64
  }
57
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
+
58
73
  async function serverReadFragment<TFragmentType extends FragmentType, TData>(
59
74
  fragment: Fragment<TFragmentType, TData>,
60
75
  fragmentRef:
@@ -67,6 +82,7 @@ function createServerEnvironment(
67
82
  return {
68
83
  getEnvironment,
69
84
  serverFetchQuery,
85
+ serverPreloadQuery,
70
86
  serverReadFragment,
71
87
  };
72
88
  }