relay-runtime 20.1.1 → 21.0.1
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.
- package/experimental.d.ts +34 -0
- package/experimental.js +1 -1
- package/experimental.js.flow +11 -11
- package/handlers/RelayDefaultHandlerProvider.d.ts +12 -0
- package/handlers/connection/ConnectionHandler.d.ts +51 -0
- package/handlers/connection/ConnectionHandler.js.flow +5 -5
- package/handlers/connection/ConnectionInterface.d.ts +40 -0
- package/handlers/connection/ConnectionInterface.js.flow +1 -1
- package/handlers/connection/MutationHandlers.d.ts +17 -0
- package/index.d.ts +274 -0
- package/index.js +1 -1
- package/index.js.flow +125 -62
- package/lib/experimental.js +3 -3
- package/lib/index.js +105 -57
- package/lib/multi-actor-environment/ActorIdentifier.js +2 -2
- package/lib/multi-actor-environment/MultiActorEnvironment.js +3 -1
- package/lib/mutations/commitMutation.js +8 -8
- package/lib/mutations/validateMutation.js +4 -4
- package/lib/query/GraphQLTag.js +3 -3
- package/lib/query/fetchQuery.js +15 -3
- package/lib/store/DataChecker.js +38 -4
- package/lib/store/NormalizationEngine.js +373 -0
- package/lib/store/OperationExecutor.js +172 -113
- package/lib/store/RelayConcreteVariables.js +1 -1
- package/lib/store/RelayErrorTrie.js +2 -2
- package/lib/store/RelayExperimentalGraphResponseTransform.js +8 -8
- package/lib/store/RelayModernEnvironment.js +26 -19
- package/lib/store/RelayModernRecord.js +18 -8
- package/lib/store/RelayModernSelector.js +9 -9
- package/lib/store/RelayModernStore.js +152 -43
- package/lib/store/RelayPublishQueue.js +1 -1
- package/lib/store/RelayReader.js +76 -38
- package/lib/store/RelayRecordSource.js +6 -0
- package/lib/store/RelayReferenceMarker.js +2 -1
- package/lib/store/RelayResponseNormalizer.js +88 -55
- package/lib/store/RelayStoreSubscriptions.js +34 -10
- package/lib/store/RelayStoreUtils.js +8 -1
- package/lib/store/ResolverFragments.js +2 -2
- package/lib/store/live-resolvers/LiveResolverCache.js +25 -9
- package/lib/store/observeFragmentExperimental.js +17 -1
- package/lib/store/observeQueryExperimental.js +2 -2
- package/lib/subscription/requestSubscription.js +3 -3
- package/lib/util/RelayError.js +3 -0
- package/lib/util/RelayFeatureFlags.js +6 -2
- package/lib/util/RelayReplaySubject.js +4 -4
- package/lib/util/handlePotentialSnapshotErrors.js +2 -2
- package/lib/util/stableCopy.js +2 -2
- package/llm-docs/api-reference/entrypoint-apis/entrypoint-container.mdx +38 -0
- package/llm-docs/api-reference/entrypoint-apis/load-entrypoint.mdx +77 -0
- package/llm-docs/api-reference/entrypoint-apis/use-entrypoint-loader.mdx +99 -0
- package/llm-docs/api-reference/graphql/graphql-directives.mdx +378 -0
- package/llm-docs/api-reference/hooks/_use-lazy-load-query-extra.mdx +16 -0
- package/llm-docs/api-reference/hooks/load-query.mdx +84 -0
- package/llm-docs/api-reference/hooks/relay-environment-provider.mdx +78 -0
- package/llm-docs/api-reference/hooks/use-client-query.mdx +65 -0
- package/llm-docs/api-reference/hooks/use-fragment.mdx +69 -0
- package/llm-docs/api-reference/hooks/use-lazy-load-query.mdx +62 -0
- package/llm-docs/api-reference/hooks/use-mutation.mdx +94 -0
- package/llm-docs/api-reference/hooks/use-pagination-fragment.mdx +166 -0
- package/llm-docs/api-reference/hooks/use-prefetchable-forward-pagination-fragment.mdx +134 -0
- package/llm-docs/api-reference/hooks/use-preloaded-query.mdx +84 -0
- package/llm-docs/api-reference/hooks/use-query-loader.mdx +95 -0
- package/llm-docs/api-reference/hooks/use-refetchable-fragment.mdx +122 -0
- package/llm-docs/api-reference/hooks/use-relay-environment.mdx +37 -0
- package/llm-docs/api-reference/hooks/use-subscription.mdx +66 -0
- package/llm-docs/api-reference/relay-resolvers/docblock-format.mdx +321 -0
- package/llm-docs/api-reference/relay-resolvers/runtime-functions.mdx +94 -0
- package/llm-docs/api-reference/relay-runtime/commit-mutation.mdx +65 -0
- package/llm-docs/api-reference/relay-runtime/fetch-query.mdx +118 -0
- package/llm-docs/api-reference/relay-runtime/field-logger.mdx +170 -0
- package/llm-docs/api-reference/relay-runtime/observe-fragment.mdx +92 -0
- package/llm-docs/api-reference/relay-runtime/relay-environment.mdx +53 -0
- package/llm-docs/api-reference/relay-runtime/request-subscription.mdx +54 -0
- package/llm-docs/api-reference/relay-runtime/runtime-configuration.mdx +52 -0
- package/llm-docs/api-reference/relay-runtime/store.mdx +734 -0
- package/llm-docs/api-reference/relay-runtime/wait-for-fragment-data.mdx +89 -0
- package/llm-docs/api-reference/types/CacheConfig.mdx +8 -0
- package/llm-docs/api-reference/types/Disposable.mdx +4 -0
- package/llm-docs/api-reference/types/GraphQLSubscriptionConfig.mdx +17 -0
- package/llm-docs/api-reference/types/MutationConfig.mdx +31 -0
- package/llm-docs/api-reference/types/SelectorStoreUpdater.mdx +6 -0
- package/llm-docs/api-reference/types/UploadableMap.mdx +3 -0
- package/llm-docs/community/learning-resources.mdx +64 -0
- package/llm-docs/debugging/declarative-mutation-directives.mdx +34 -0
- package/llm-docs/debugging/disallowed-id-types-error.mdx +43 -0
- package/llm-docs/debugging/inconsistent-typename-error.mdx +47 -0
- package/llm-docs/debugging/relay-devtools.mdx +73 -0
- package/llm-docs/debugging/why-null.mdx +116 -0
- package/llm-docs/editor-support.mdx +55 -0
- package/llm-docs/error-reference/unknown-field.mdx +36 -0
- package/llm-docs/getting-started/babel-plugin.mdx +31 -0
- package/llm-docs/getting-started/compiler-config.mdx +25 -0
- package/llm-docs/getting-started/compiler.mdx +98 -0
- package/llm-docs/getting-started/lint-rules.mdx +87 -0
- package/llm-docs/getting-started/production.mdx +30 -0
- package/llm-docs/getting-started/quick-start.mdx +216 -0
- package/llm-docs/glossary/glossary.mdx +1040 -0
- package/llm-docs/guided-tour/list-data/advanced-pagination.mdx +157 -0
- package/llm-docs/guided-tour/list-data/connections.mdx +81 -0
- package/llm-docs/guided-tour/list-data/pagination.mdx +193 -0
- package/llm-docs/guided-tour/list-data/rendering-connections.mdx +112 -0
- package/llm-docs/guided-tour/list-data/streaming-pagination.mdx +87 -0
- package/llm-docs/guided-tour/managing-data-outside-react/retaining-queries.mdx +51 -0
- package/llm-docs/guided-tour/refetching/refetching-queries-with-different-data.mdx +337 -0
- package/llm-docs/guided-tour/refetching/refreshing-queries.mdx +350 -0
- package/llm-docs/guided-tour/rendering/environment.mdx +59 -0
- package/llm-docs/guided-tour/rendering/error-states.mdx +295 -0
- package/llm-docs/guided-tour/rendering/fragments.mdx +354 -0
- package/llm-docs/guided-tour/rendering/loading-states.mdx +245 -0
- package/llm-docs/guided-tour/rendering/queries.mdx +261 -0
- package/llm-docs/guided-tour/rendering/variables.mdx +233 -0
- package/llm-docs/guided-tour/reusing-cached-data/fetch-policies.mdx +56 -0
- package/llm-docs/guided-tour/reusing-cached-data/filling-in-missing-data.mdx +102 -0
- package/llm-docs/guided-tour/reusing-cached-data/introduction.mdx +22 -0
- package/llm-docs/guided-tour/reusing-cached-data/presence-of-data.mdx +93 -0
- package/llm-docs/guided-tour/reusing-cached-data/rendering-partially-cached-data.mdx +175 -0
- package/llm-docs/guided-tour/reusing-cached-data/staleness-of-data.mdx +116 -0
- package/llm-docs/guided-tour/updating-data/client-only-data.mdx +115 -0
- package/llm-docs/guided-tour/updating-data/graphql-mutations.mdx +334 -0
- package/llm-docs/guided-tour/updating-data/graphql-subscriptions.mdx +279 -0
- package/llm-docs/guided-tour/updating-data/imperatively-modifying-linked-fields.mdx +511 -0
- package/llm-docs/guided-tour/updating-data/imperatively-modifying-store-data-legacy.mdx +142 -0
- package/llm-docs/guided-tour/updating-data/imperatively-modifying-store-data.mdx +275 -0
- package/llm-docs/guided-tour/updating-data/introduction.mdx +25 -0
- package/llm-docs/guided-tour/updating-data/local-data-updates.mdx +71 -0
- package/llm-docs/guided-tour/updating-data/typesafe-updaters-faq.mdx +83 -0
- package/llm-docs/guided-tour/updating-data/updating-connections.mdx +592 -0
- package/llm-docs/guides/alias-directive.mdx +160 -0
- package/llm-docs/guides/catch-directive.mdx +167 -0
- package/llm-docs/guides/client-schema-extensions.mdx +208 -0
- package/llm-docs/guides/codemods.mdx +79 -0
- package/llm-docs/guides/data-driven-dependencies/client-3d.mdx +255 -0
- package/llm-docs/guides/data-driven-dependencies/configuration.mdx +127 -0
- package/llm-docs/guides/data-driven-dependencies/introduction.mdx +39 -0
- package/llm-docs/guides/data-driven-dependencies/server-3d.mdx +664 -0
- package/llm-docs/guides/document-comparison.mdx +106 -0
- package/llm-docs/guides/graphql-server-specification.mdx +453 -0
- package/llm-docs/guides/network-layer.mdx +69 -0
- package/llm-docs/guides/persisted-queries.mdx +328 -0
- package/llm-docs/guides/relay-resolvers/context.mdx +99 -0
- package/llm-docs/guides/relay-resolvers/defining-fields.mdx +151 -0
- package/llm-docs/guides/relay-resolvers/defining-types.mdx +164 -0
- package/llm-docs/guides/relay-resolvers/deprecated.mdx +27 -0
- package/llm-docs/guides/relay-resolvers/derived-fields.mdx +127 -0
- package/llm-docs/guides/relay-resolvers/descriptions.mdx +44 -0
- package/llm-docs/guides/relay-resolvers/enabling.mdx +41 -0
- package/llm-docs/guides/relay-resolvers/errors.mdx +64 -0
- package/llm-docs/guides/relay-resolvers/field-arguments.mdx +63 -0
- package/llm-docs/guides/relay-resolvers/introduction.mdx +62 -0
- package/llm-docs/guides/relay-resolvers/limitations.mdx +30 -0
- package/llm-docs/guides/relay-resolvers/live-fields.mdx +164 -0
- package/llm-docs/guides/relay-resolvers/return-types.mdx +161 -0
- package/llm-docs/guides/relay-resolvers/suspense.mdx +41 -0
- package/llm-docs/guides/required-directive.mdx +240 -0
- package/llm-docs/guides/semantic-nullability.mdx +93 -0
- package/llm-docs/guides/testing-relay-components.mdx +642 -0
- package/llm-docs/guides/testing-relay-with-preloaded-queries.mdx +160 -0
- package/llm-docs/guides/throw-on-field-error-directive.mdx +58 -0
- package/llm-docs/guides/type-emission.mdx +414 -0
- package/llm-docs/home.mdx +32 -0
- package/llm-docs/principles-and-architecture/architecture-overview.mdx +24 -0
- package/llm-docs/principles-and-architecture/compiler-architecture.mdx +106 -0
- package/llm-docs/principles-and-architecture/runtime-architecture.mdx +249 -0
- package/llm-docs/principles-and-architecture/thinking-in-graphql.mdx +309 -0
- package/llm-docs/principles-and-architecture/thinking-in-relay.mdx +104 -0
- package/llm-docs/principles-and-architecture/videos.mdx +50 -0
- package/llm-docs/tutorial/arrays-lists.mdx +126 -0
- package/llm-docs/tutorial/fragments-1.mdx +487 -0
- package/llm-docs/tutorial/graphql.mdx +172 -0
- package/llm-docs/tutorial/interfaces-polymorphism.mdx +161 -0
- package/llm-docs/tutorial/intro.mdx +58 -0
- package/llm-docs/tutorial/mutations-updates.mdx +624 -0
- package/llm-docs/tutorial/organizing-mutations-queries-and-subscriptions.mdx +13 -0
- package/llm-docs/tutorial/queries-1.mdx +267 -0
- package/llm-docs/tutorial/queries-2.mdx +389 -0
- package/llm-docs/tutorial/refetchable-fragments.mdx +352 -0
- package/multi-actor-environment/ActorIdentifier.d.ts +17 -0
- package/multi-actor-environment/ActorIdentifier.js.flow +2 -2
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +15 -15
- package/multi-actor-environment/ActorUtils.js.flow +1 -1
- package/multi-actor-environment/MultiActorEnvironment.d.ts +123 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +32 -24
- package/multi-actor-environment/MultiActorEnvironmentTypes.d.ts +225 -0
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +6 -6
- package/multi-actor-environment/index.d.ts +14 -0
- package/multi-actor-environment.d.ts +8 -0
- package/mutations/RelayDeclarativeMutationConfig.d.ts +70 -0
- package/mutations/RelayDeclarativeMutationConfig.js.flow +9 -9
- package/mutations/RelayRecordProxy.js.flow +8 -11
- package/mutations/RelayRecordSourceMutator.js.flow +4 -4
- package/mutations/RelayRecordSourceProxy.js.flow +4 -4
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +6 -6
- package/mutations/applyOptimisticMutation.d.ts +25 -0
- package/mutations/applyOptimisticMutation.js.flow +2 -2
- package/mutations/commitLocalUpdate.d.ts +10 -0
- package/mutations/commitMutation.d.ts +48 -0
- package/mutations/commitMutation.js.flow +21 -17
- package/mutations/createUpdatableProxy.js.flow +19 -19
- package/mutations/readUpdatableFragment.js.flow +3 -3
- package/mutations/readUpdatableQuery.js.flow +3 -3
- package/mutations/validateMutation.js.flow +7 -7
- package/network/RelayNetwork.d.ts +12 -0
- package/network/RelayNetworkTypes.d.ts +145 -0
- package/network/RelayNetworkTypes.js.flow +18 -18
- package/network/RelayObservable.d.ts +197 -0
- package/network/RelayObservable.js.flow +32 -30
- package/network/RelayQueryResponseCache.d.ts +16 -0
- package/network/RelayQueryResponseCache.js.flow +3 -3
- package/network/wrapNetworkWithLogObserver.js.flow +1 -1
- package/package.json +2 -1
- package/query/GraphQLTag.d.ts +45 -0
- package/query/GraphQLTag.js.flow +22 -10
- package/query/fetchQuery.d.ts +21 -0
- package/query/fetchQuery.js.flow +23 -10
- package/query/fetchQueryInternal.d.ts +26 -0
- package/query/fetchQueryInternal.js.flow +4 -4
- package/query/fetchQuery_DEPRECATED.d.ts +17 -0
- package/query/fetchQuery_DEPRECATED.js.flow +1 -1
- package/store/ClientID.d.ts +14 -0
- package/store/DataChecker.js.flow +51 -15
- package/store/NormalizationEngine.js.flow +782 -0
- package/store/OperationExecutor.d.ts +51 -0
- package/store/OperationExecutor.js.flow +204 -98
- package/store/RelayConcreteVariables.js.flow +5 -5
- package/store/RelayErrorTrie.js.flow +12 -12
- package/store/RelayExperimentalGraphResponseHandler.js.flow +3 -3
- package/store/RelayExperimentalGraphResponseTransform.js.flow +10 -10
- package/store/RelayModernEnvironment.d.ts +97 -0
- package/store/RelayModernEnvironment.js.flow +58 -43
- package/store/RelayModernFragmentSpecResolver.js.flow +1 -1
- package/store/RelayModernOperationDescriptor.d.ts +28 -0
- package/store/RelayModernOperationDescriptor.js.flow +1 -1
- package/store/RelayModernRecord.d.ts +92 -0
- package/store/RelayModernRecord.js.flow +44 -20
- package/store/RelayModernSelector.d.ts +123 -0
- package/store/RelayModernSelector.js.flow +21 -21
- package/store/RelayModernStore.d.ts +57 -0
- package/store/RelayModernStore.js.flow +219 -58
- package/store/RelayOperationTracker.d.ts +29 -0
- package/store/RelayOperationTracker.js.flow +2 -2
- package/store/RelayOptimisticRecordSource.js.flow +2 -2
- package/store/RelayPublishQueue.js.flow +29 -20
- package/store/RelayReader.js.flow +129 -57
- package/store/RelayRecordSource.d.ts +26 -0
- package/store/RelayRecordSource.js.flow +10 -0
- package/store/RelayRecordState.d.ts +28 -0
- package/store/RelayRecordState.js.flow +1 -1
- package/store/RelayReferenceMarker.js.flow +5 -4
- package/store/RelayResponseNormalizer.d.ts +28 -0
- package/store/RelayResponseNormalizer.js.flow +130 -62
- package/store/RelayStoreSubscriptions.js.flow +52 -8
- package/store/RelayStoreTypes.d.ts +1327 -0
- package/store/RelayStoreTypes.js.flow +371 -278
- package/store/RelayStoreUtils.d.ts +86 -0
- package/store/RelayStoreUtils.js.flow +16 -8
- package/store/ResolverCache.js.flow +2 -2
- package/store/ResolverFragments.d.ts +43 -0
- package/store/ResolverFragments.js.flow +22 -14
- package/store/StoreInspector.js.flow +7 -8
- package/store/ViewerPattern.d.ts +11 -0
- package/store/cloneRelayHandleSourceField.js.flow +1 -1
- package/store/cloneRelayScalarHandleSourceField.js.flow +1 -1
- package/store/createFragmentSpecResolver.d.ts +16 -0
- package/store/createRelayContext.js.flow +1 -1
- package/store/createRelayLoggingContext.js.flow +4 -4
- package/store/defaultGetDataID.js.flow +2 -2
- package/store/isRelayModernEnvironment.d.ts +8 -0
- package/store/isRelayModernEnvironment.js.flow +4 -2
- package/store/live-resolvers/LiveResolverCache.js.flow +55 -20
- package/store/live-resolvers/LiveResolverSuspenseSentinel.js.flow +3 -3
- package/store/live-resolvers/getOutputTypeRecordIDs.js.flow +1 -1
- package/store/live-resolvers/isLiveStateValue.js.flow +2 -2
- package/store/live-resolvers/resolverDataInjector.d.ts +27 -0
- package/store/live-resolvers/resolverDataInjector.js.flow +8 -5
- package/store/observeFragmentExperimental.d.ts +46 -0
- package/store/observeFragmentExperimental.js.flow +50 -21
- package/store/observeQueryExperimental.d.ts +30 -0
- package/store/observeQueryExperimental.js.flow +5 -5
- package/store/readInlineData.d.ts +19 -0
- package/store/readInlineData.js.flow +5 -5
- package/store/waitForFragmentExperimental.d.ts +49 -0
- package/store/waitForFragmentExperimental.js.flow +3 -3
- package/subscription/requestSubscription.d.ts +27 -0
- package/subscription/requestSubscription.js.flow +10 -10
- package/util/JSResourceTypes.flow.js.flow +4 -4
- package/util/NormalizationNode.d.ts +235 -0
- package/util/NormalizationNode.js.flow +127 -123
- package/util/ReaderNode.d.ts +264 -0
- package/util/ReaderNode.js.flow +156 -151
- package/util/RelayConcreteNode.d.ts +120 -0
- package/util/RelayConcreteNode.js.flow +32 -32
- package/util/RelayError.d.ts +13 -0
- package/util/RelayError.js.flow +4 -1
- package/util/RelayFeatureFlags.d.ts +40 -0
- package/util/RelayFeatureFlags.js.flow +21 -1
- package/util/RelayProfiler.d.ts +121 -0
- package/util/RelayProfiler.js.flow +1 -1
- package/util/RelayReplaySubject.d.ts +25 -0
- package/util/RelayReplaySubject.js.flow +3 -3
- package/util/RelayRuntimeTypes.d.ts +59 -0
- package/util/RelayRuntimeTypes.js.flow +36 -33
- package/util/createPayloadFor3DField.d.ts +17 -0
- package/util/createPayloadFor3DField.js.flow +9 -5
- package/util/deepFreeze.d.ts +8 -0
- package/util/deepFreeze.js.flow +2 -2
- package/util/getFragmentIdentifier.d.ts +10 -0
- package/util/getFragmentIdentifier.js.flow +1 -1
- package/util/getPaginationMetadata.d.ts +20 -0
- package/util/getPaginationMetadata.js.flow +1 -1
- package/util/getPaginationVariables.d.ts +20 -0
- package/util/getPaginationVariables.js.flow +1 -1
- package/util/getPendingOperationsForFragment.d.ts +18 -0
- package/util/getPendingOperationsForFragment.js.flow +2 -2
- package/util/getRefetchMetadata.d.ts +19 -0
- package/util/getRefetchMetadata.js.flow +6 -5
- package/util/getRelayHandleKey.d.ts +8 -0
- package/util/getRequestIdentifier.d.ts +17 -0
- package/util/getValueAtPath.d.ts +8 -0
- package/util/getValueAtPath.js.flow +3 -3
- package/util/handlePotentialSnapshotErrors.d.ts +14 -0
- package/util/handlePotentialSnapshotErrors.js.flow +5 -5
- package/util/isEmptyObject.js.flow +1 -1
- package/util/isPromise.d.ts +8 -0
- package/util/isPromise.js.flow +2 -2
- package/util/isScalarAndEqual.d.ts +8 -0
- package/util/isScalarAndEqual.js.flow +1 -1
- package/util/recycleNodesInto.d.ts +8 -0
- package/util/recycleNodesInto.js.flow +2 -2
- package/util/registerEnvironmentWithDevTools.js.flow +1 -1
- package/util/shallowFreeze.js.flow +1 -1
- package/util/stableCopy.d.ts +8 -0
- package/util/stableCopy.js.flow +5 -5
- package/util/withProvidedVariables.d.ts +19 -0
- package/util/withProvidedVariables.js.flow +14 -10
|
@@ -53,14 +53,14 @@ class RelayRecordSourceProxy implements RecordSourceProxy {
|
|
|
53
53
|
_getDataID: GetDataID;
|
|
54
54
|
_invalidatedStore: boolean;
|
|
55
55
|
_idsMarkedForInvalidation: DataIDSet;
|
|
56
|
-
_missingFieldHandlers:
|
|
56
|
+
_missingFieldHandlers: ReadonlyArray<MissingFieldHandler>;
|
|
57
57
|
_log: LogFunction;
|
|
58
58
|
|
|
59
59
|
constructor(
|
|
60
60
|
mutator: RelayRecordSourceMutator,
|
|
61
61
|
getDataID: GetDataID,
|
|
62
62
|
handlerProvider?: ?HandlerProvider,
|
|
63
|
-
missingFieldHandlers:
|
|
63
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
64
64
|
log: ?LogFunction,
|
|
65
65
|
) {
|
|
66
66
|
this.__mutator = mutator;
|
|
@@ -176,7 +176,7 @@ class RelayRecordSourceProxy implements RecordSourceProxy {
|
|
|
176
176
|
return this._idsMarkedForInvalidation;
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
readUpdatableQuery<TVariables
|
|
179
|
+
readUpdatableQuery<TVariables extends Variables, TData>(
|
|
180
180
|
query: UpdatableQuery<TVariables, TData>,
|
|
181
181
|
variables: TVariables,
|
|
182
182
|
): UpdatableData<TData> {
|
|
@@ -188,7 +188,7 @@ class RelayRecordSourceProxy implements RecordSourceProxy {
|
|
|
188
188
|
);
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
readUpdatableFragment<TFragmentType
|
|
191
|
+
readUpdatableFragment<TFragmentType extends FragmentType, TData>(
|
|
192
192
|
fragment: UpdatableFragment<TFragmentType, TData>,
|
|
193
193
|
fragmentReference: HasUpdatableSpread<TFragmentType>,
|
|
194
194
|
): UpdatableData<TData> {
|
|
@@ -21,7 +21,7 @@ import type {
|
|
|
21
21
|
SingularReaderSelector,
|
|
22
22
|
UpdatableData,
|
|
23
23
|
} from '../store/RelayStoreTypes';
|
|
24
|
-
import type {ReaderLinkedField} from '../util/ReaderNode';
|
|
24
|
+
import type {ReaderLinkedField, ReaderSelection} from '../util/ReaderNode';
|
|
25
25
|
import type {
|
|
26
26
|
DataID,
|
|
27
27
|
UpdatableFragment,
|
|
@@ -47,13 +47,13 @@ class RelayRecordSourceSelectorProxy implements RecordSourceSelectorProxy {
|
|
|
47
47
|
__mutator: RelayRecordSourceMutator;
|
|
48
48
|
__recordSource: RecordSourceProxy;
|
|
49
49
|
_readSelector: SingularReaderSelector;
|
|
50
|
-
_missingFieldHandlers:
|
|
50
|
+
_missingFieldHandlers: ReadonlyArray<MissingFieldHandler>;
|
|
51
51
|
|
|
52
52
|
constructor(
|
|
53
53
|
mutator: RelayRecordSourceMutator,
|
|
54
54
|
recordSource: RecordSourceProxy,
|
|
55
55
|
readSelector: SingularReaderSelector,
|
|
56
|
-
missingFieldHandlers:
|
|
56
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
57
57
|
) {
|
|
58
58
|
this.__mutator = mutator;
|
|
59
59
|
this.__recordSource = recordSource;
|
|
@@ -90,7 +90,7 @@ class RelayRecordSourceSelectorProxy implements RecordSourceSelectorProxy {
|
|
|
90
90
|
fieldName: string,
|
|
91
91
|
plural: boolean,
|
|
92
92
|
): ReaderLinkedField {
|
|
93
|
-
let field = selector.node.selections.find(
|
|
93
|
+
let field: ReaderSelection | void = selector.node.selections.find(
|
|
94
94
|
selection =>
|
|
95
95
|
(selection.kind === 'LinkedField' && selection.name === fieldName) ||
|
|
96
96
|
(selection.kind === 'RequiredField' &&
|
|
@@ -132,7 +132,7 @@ class RelayRecordSourceSelectorProxy implements RecordSourceSelectorProxy {
|
|
|
132
132
|
this.__recordSource.invalidateStore();
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
readUpdatableQuery<TVariables
|
|
135
|
+
readUpdatableQuery<TVariables extends Variables, TData>(
|
|
136
136
|
query: UpdatableQuery<TVariables, TData>,
|
|
137
137
|
variables: TVariables,
|
|
138
138
|
): UpdatableData<TData> {
|
|
@@ -144,7 +144,7 @@ class RelayRecordSourceSelectorProxy implements RecordSourceSelectorProxy {
|
|
|
144
144
|
);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
readUpdatableFragment<TFragmentType
|
|
147
|
+
readUpdatableFragment<TFragmentType extends FragmentType, TData>(
|
|
148
148
|
fragment: UpdatableFragment<TFragmentType, TData>,
|
|
149
149
|
fragmentReference: HasUpdatableSpread<TFragmentType>,
|
|
150
150
|
): UpdatableData<TData> {
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
import { GraphQLTaggedNode } from '../query/GraphQLTag';
|
|
9
|
+
import {Environment, SelectorStoreUpdater} from '../store/RelayStoreTypes';
|
|
10
|
+
import {Disposable, Variables} from '../util/RelayRuntimeTypes';
|
|
11
|
+
import { DeclarativeMutationConfig } from './RelayDeclarativeMutationConfig';
|
|
12
|
+
|
|
13
|
+
export interface OptimisticMutationConfig {
|
|
14
|
+
configs?: readonly DeclarativeMutationConfig[] | null | undefined;
|
|
15
|
+
mutation: GraphQLTaggedNode;
|
|
16
|
+
variables: Variables;
|
|
17
|
+
optimisticUpdater?: SelectorStoreUpdater | null | undefined;
|
|
18
|
+
optimisticResponse?: object | undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Higher-level helper function to execute a mutation against a specific
|
|
23
|
+
* environment.
|
|
24
|
+
*/
|
|
25
|
+
export function applyOptimisticMutation(environment: Environment, config: OptimisticMutationConfig): Disposable;
|
|
@@ -28,7 +28,7 @@ const {
|
|
|
28
28
|
const RelayDeclarativeMutationConfig = require('./RelayDeclarativeMutationConfig');
|
|
29
29
|
const invariant = require('invariant');
|
|
30
30
|
|
|
31
|
-
export type OptimisticMutationConfig<TMutation
|
|
31
|
+
export type OptimisticMutationConfig<TMutation extends MutationParameters> = {
|
|
32
32
|
configs?: ?Array<DeclarativeMutationConfig>,
|
|
33
33
|
mutation: GraphQLTaggedNode,
|
|
34
34
|
variables: Variables,
|
|
@@ -40,7 +40,7 @@ export type OptimisticMutationConfig<TMutation: MutationParameters> = {
|
|
|
40
40
|
* Higher-level helper function to execute a mutation against a specific
|
|
41
41
|
* environment.
|
|
42
42
|
*/
|
|
43
|
-
function applyOptimisticMutation<TMutation
|
|
43
|
+
function applyOptimisticMutation<TMutation extends MutationParameters>(
|
|
44
44
|
environment: IEnvironment,
|
|
45
45
|
config: OptimisticMutationConfig<TMutation>,
|
|
46
46
|
): Disposable {
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
import {Environment, SelectorStoreUpdater} from '../store/RelayStoreTypes';
|
|
9
|
+
|
|
10
|
+
export function commitLocalUpdate(environment: Environment, updater: SelectorStoreUpdater): void;
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
import {PayloadError, UploadableMap} from '../network/RelayNetworkTypes';
|
|
9
|
+
import { GraphQLTaggedNode } from '../query/GraphQLTag';
|
|
10
|
+
import {Environment, SelectorStoreUpdater} from '../store/RelayStoreTypes';
|
|
11
|
+
import {CacheConfig, Disposable} from '../util/RelayRuntimeTypes';
|
|
12
|
+
import { DeclarativeMutationConfig } from './RelayDeclarativeMutationConfig';
|
|
13
|
+
|
|
14
|
+
export interface MutationParameters {
|
|
15
|
+
readonly response: Record<string, unknown>;
|
|
16
|
+
readonly variables: Record<string, unknown>;
|
|
17
|
+
readonly rawResponse?: Record<string, unknown> | undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface MutationConfig<TOperation extends MutationParameters> {
|
|
21
|
+
configs?: DeclarativeMutationConfig[] | undefined;
|
|
22
|
+
cacheConfig?: CacheConfig | undefined;
|
|
23
|
+
mutation: GraphQLTaggedNode;
|
|
24
|
+
onError?: ((error: Error) => void) | null | undefined;
|
|
25
|
+
onCompleted?:
|
|
26
|
+
| ((response: TOperation['response'], errors: readonly PayloadError[] | null | undefined) => void)
|
|
27
|
+
| null
|
|
28
|
+
| undefined;
|
|
29
|
+
onUnsubscribe?: (() => void | null | undefined) | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* An object whose type matches the raw response type of the mutation. Make sure you decorate
|
|
32
|
+
* your mutation with `@raw_response_type` if you are using this field.
|
|
33
|
+
*/
|
|
34
|
+
optimisticResponse?: (TOperation['rawResponse'] extends Record<string, unknown> ? TOperation['rawResponse'] : never) | undefined;
|
|
35
|
+
optimisticUpdater?: SelectorStoreUpdater<TOperation['response']> | null | undefined;
|
|
36
|
+
updater?: SelectorStoreUpdater<TOperation['response']> | null | undefined;
|
|
37
|
+
uploadables?: UploadableMap | null | undefined;
|
|
38
|
+
variables: TOperation['variables'];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Higher-level helper function to execute a mutation against a specific
|
|
43
|
+
* environment.
|
|
44
|
+
*/
|
|
45
|
+
export function commitMutation<TOperation extends MutationParameters = MutationParameters>(
|
|
46
|
+
environment: Environment,
|
|
47
|
+
config: MutationConfig<TOperation>,
|
|
48
|
+
): Disposable;
|
|
@@ -37,7 +37,7 @@ const validateMutation = require('./validateMutation');
|
|
|
37
37
|
const invariant = require('invariant');
|
|
38
38
|
const warning = require('warning');
|
|
39
39
|
|
|
40
|
-
export type MutationConfig<TMutation
|
|
40
|
+
export type MutationConfig<TMutation extends MutationParameters> = Readonly<{
|
|
41
41
|
cacheConfig?: CacheConfig,
|
|
42
42
|
configs?: Array<DeclarativeMutationConfig>,
|
|
43
43
|
mutation: GraphQLTaggedNode,
|
|
@@ -49,7 +49,7 @@ export type MutationConfig<TMutation: MutationParameters> = $ReadOnly<{
|
|
|
49
49
|
onNext?: ?() => void,
|
|
50
50
|
onUnsubscribe?: ?() => void,
|
|
51
51
|
optimisticResponse?: {
|
|
52
|
-
|
|
52
|
+
readonly rawResponse?: {...},
|
|
53
53
|
...TMutation,
|
|
54
54
|
...
|
|
55
55
|
}['rawResponse'],
|
|
@@ -59,7 +59,7 @@ export type MutationConfig<TMutation: MutationParameters> = $ReadOnly<{
|
|
|
59
59
|
variables: TMutation['variables'],
|
|
60
60
|
}>;
|
|
61
61
|
|
|
62
|
-
export type CommitMutationConfig<TVariables, TData, TRawResponse> =
|
|
62
|
+
export type CommitMutationConfig<TVariables, TData, TRawResponse> = Readonly<{
|
|
63
63
|
cacheConfig?: CacheConfig,
|
|
64
64
|
configs?: Array<DeclarativeMutationConfig>,
|
|
65
65
|
mutation: Mutation<TVariables, TData, TRawResponse>,
|
|
@@ -78,7 +78,11 @@ export type CommitMutationConfig<TVariables, TData, TRawResponse> = $ReadOnly<{
|
|
|
78
78
|
* Higher-level helper function to execute a mutation against a specific
|
|
79
79
|
* environment.
|
|
80
80
|
*/
|
|
81
|
-
function commitMutation<
|
|
81
|
+
function commitMutation<
|
|
82
|
+
TVariables extends Variables,
|
|
83
|
+
TData,
|
|
84
|
+
TRawResponse = {...},
|
|
85
|
+
>(
|
|
82
86
|
environment: IEnvironment,
|
|
83
87
|
config: CommitMutationConfig<TVariables, TData, TRawResponse>,
|
|
84
88
|
): Disposable {
|
|
@@ -122,7 +126,7 @@ function commitMutation<TVariables: Variables, TData, TRawResponse = {...}>(
|
|
|
122
126
|
if (configs) {
|
|
123
127
|
({optimisticUpdater, updater} = RelayDeclarativeMutationConfig.convert<{
|
|
124
128
|
variables: TVariables,
|
|
125
|
-
/* $FlowFixMe[incompatible-
|
|
129
|
+
/* $FlowFixMe[incompatible-type] error exposed when improving flow typing
|
|
126
130
|
* of commitMutation */
|
|
127
131
|
response: TData,
|
|
128
132
|
}>(configs, mutation, optimisticUpdater, updater));
|
|
@@ -131,7 +135,7 @@ function commitMutation<TVariables: Variables, TData, TRawResponse = {...}>(
|
|
|
131
135
|
const subscription = environment
|
|
132
136
|
.executeMutation<{
|
|
133
137
|
variables: TVariables,
|
|
134
|
-
/* $FlowFixMe[incompatible-
|
|
138
|
+
/* $FlowFixMe[incompatible-type] error exposed when improving flow typing
|
|
135
139
|
* of commitMutation */
|
|
136
140
|
response: TData,
|
|
137
141
|
}>({
|
|
@@ -142,6 +146,17 @@ function commitMutation<TVariables: Variables, TData, TRawResponse = {...}>(
|
|
|
142
146
|
uploadables,
|
|
143
147
|
})
|
|
144
148
|
.subscribe({
|
|
149
|
+
complete: () => {
|
|
150
|
+
const {onCompleted} = config;
|
|
151
|
+
if (onCompleted) {
|
|
152
|
+
const snapshot = environment.lookup(operation.fragment);
|
|
153
|
+
onCompleted(
|
|
154
|
+
snapshot.data as $FlowFixMe,
|
|
155
|
+
errors.length !== 0 ? errors : null,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
error: onError,
|
|
145
160
|
next: payload => {
|
|
146
161
|
if (Array.isArray(payload)) {
|
|
147
162
|
payload.forEach(item => {
|
|
@@ -156,17 +171,6 @@ function commitMutation<TVariables: Variables, TData, TRawResponse = {...}>(
|
|
|
156
171
|
}
|
|
157
172
|
config.onNext?.();
|
|
158
173
|
},
|
|
159
|
-
complete: () => {
|
|
160
|
-
const {onCompleted} = config;
|
|
161
|
-
if (onCompleted) {
|
|
162
|
-
const snapshot = environment.lookup(operation.fragment);
|
|
163
|
-
onCompleted(
|
|
164
|
-
(snapshot.data: $FlowFixMe),
|
|
165
|
-
errors.length !== 0 ? errors : null,
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
error: onError,
|
|
170
174
|
unsubscribe: onUnsubscribe,
|
|
171
175
|
});
|
|
172
176
|
return {dispose: subscription.unsubscribe};
|
|
@@ -27,12 +27,12 @@ const {getArgumentValues} = require('../store/RelayStoreUtils');
|
|
|
27
27
|
|
|
28
28
|
const nonUpdatableKeys = ['id', '__id', '__typename', 'js'];
|
|
29
29
|
|
|
30
|
-
function createUpdatableProxy<TData
|
|
30
|
+
function createUpdatableProxy<TData extends {...}>(
|
|
31
31
|
updatableProxyRootRecord: RecordProxy,
|
|
32
32
|
variables: Variables,
|
|
33
|
-
selections:
|
|
33
|
+
selections: ReadonlyArray<ReaderSelection>,
|
|
34
34
|
recordSourceProxy: RecordSourceProxy,
|
|
35
|
-
missingFieldHandlers:
|
|
35
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
36
36
|
): TData {
|
|
37
37
|
const mutableUpdatableProxy = {};
|
|
38
38
|
updateProxyFromSelections(
|
|
@@ -49,16 +49,16 @@ function createUpdatableProxy<TData: {...}>(
|
|
|
49
49
|
// unless ReaderSelection carries more type information, we will never be able
|
|
50
50
|
// to flowtype mutableUpdatableProxy without a type assertion.
|
|
51
51
|
// $FlowFixMe[unclear-type]
|
|
52
|
-
return
|
|
52
|
+
return mutableUpdatableProxy as any as TData;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
function updateProxyFromSelections<TData>(
|
|
56
56
|
mutableUpdatableProxy: TData,
|
|
57
57
|
updatableProxyRootRecord: RecordProxy,
|
|
58
58
|
variables: Variables,
|
|
59
|
-
selections:
|
|
59
|
+
selections: ReadonlyArray<ReaderSelection>,
|
|
60
60
|
recordSourceProxy: RecordSourceProxy,
|
|
61
|
-
missingFieldHandlers:
|
|
61
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
62
62
|
): void {
|
|
63
63
|
for (const selection of selections) {
|
|
64
64
|
switch (selection.kind) {
|
|
@@ -108,7 +108,7 @@ function updateProxyFromSelections<TData>(
|
|
|
108
108
|
case 'ScalarField':
|
|
109
109
|
const scalarFieldName = selection.alias ?? selection.name;
|
|
110
110
|
Object.defineProperty(mutableUpdatableProxy, scalarFieldName, {
|
|
111
|
-
get
|
|
111
|
+
get() {
|
|
112
112
|
const newVariables = getArgumentValues(
|
|
113
113
|
selection.args ?? [],
|
|
114
114
|
variables,
|
|
@@ -191,7 +191,7 @@ function updateProxyFromSelections<TData>(
|
|
|
191
191
|
'Encountered an unexpected ReaderSelection variant in RelayRecordSourceProxy. This indicates a bug in Relay.',
|
|
192
192
|
);
|
|
193
193
|
default:
|
|
194
|
-
|
|
194
|
+
selection.kind as empty;
|
|
195
195
|
throw new Error(
|
|
196
196
|
'Encountered an unexpected ReaderSelection variant in RelayRecordSourceProxy. This indicates a bug in Relay.',
|
|
197
197
|
);
|
|
@@ -205,7 +205,7 @@ function createSetterForPluralLinkedField(
|
|
|
205
205
|
updatableProxyRootRecord: RecordProxy,
|
|
206
206
|
recordSourceProxy: RecordSourceProxy,
|
|
207
207
|
) {
|
|
208
|
-
return function set(newValue:
|
|
208
|
+
return function set(newValue: ReadonlyArray<{__id: string, ...}>) {
|
|
209
209
|
const newVariables = getArgumentValues(selection.args ?? [], variables);
|
|
210
210
|
if (newValue == null) {
|
|
211
211
|
throw new Error(
|
|
@@ -276,7 +276,7 @@ function createGetterForPluralLinkedField(
|
|
|
276
276
|
variables: Variables,
|
|
277
277
|
updatableProxyRootRecord: RecordProxy,
|
|
278
278
|
recordSourceProxy: RecordSourceProxy,
|
|
279
|
-
missingFieldHandlers:
|
|
279
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
280
280
|
): () => $FlowFixMe {
|
|
281
281
|
return function () {
|
|
282
282
|
const newVariables = getArgumentValues(selection.args ?? [], variables);
|
|
@@ -296,7 +296,7 @@ function createGetterForPluralLinkedField(
|
|
|
296
296
|
}
|
|
297
297
|
|
|
298
298
|
if (linkedRecords != null) {
|
|
299
|
-
return
|
|
299
|
+
return linkedRecords.map(linkedRecord => {
|
|
300
300
|
if (linkedRecord != null) {
|
|
301
301
|
const updatableProxy = {};
|
|
302
302
|
updateProxyFromSelections(
|
|
@@ -313,12 +313,12 @@ function createGetterForPluralLinkedField(
|
|
|
313
313
|
// Flow incorrect assumes that the return value for the get method must match
|
|
314
314
|
// the set parameter.
|
|
315
315
|
// $FlowFixMe[unclear-type] Typed by the generated updatable query flow type
|
|
316
|
-
return
|
|
316
|
+
return updatableProxy as any;
|
|
317
317
|
} else {
|
|
318
318
|
return linkedRecord;
|
|
319
319
|
}
|
|
320
320
|
// $FlowFixMe[unclear-type] Typed by the generated updatable query flow type
|
|
321
|
-
})
|
|
321
|
+
}) as any;
|
|
322
322
|
} else {
|
|
323
323
|
return linkedRecords;
|
|
324
324
|
}
|
|
@@ -330,7 +330,7 @@ function createGetterForSingularLinkedField(
|
|
|
330
330
|
variables: Variables,
|
|
331
331
|
updatableProxyRootRecord: RecordProxy,
|
|
332
332
|
recordSourceProxy: RecordSourceProxy,
|
|
333
|
-
missingFieldHandlers:
|
|
333
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
334
334
|
): () => ?$FlowFixMe {
|
|
335
335
|
return function () {
|
|
336
336
|
const newVariables = getArgumentValues(selection.args ?? [], variables);
|
|
@@ -364,7 +364,7 @@ function createGetterForSingularLinkedField(
|
|
|
364
364
|
// Flow incorrect assumes that the return value for the get method must match
|
|
365
365
|
// the set parameter.
|
|
366
366
|
// $FlowFixMe[unclear-type] Typed by the generated updatable query flow type
|
|
367
|
-
return
|
|
367
|
+
return updatableProxy as any;
|
|
368
368
|
} else {
|
|
369
369
|
return linkedRecord;
|
|
370
370
|
}
|
|
@@ -376,7 +376,7 @@ function getLinkedRecordUsingMissingFieldHandlers(
|
|
|
376
376
|
newVariables: Variables,
|
|
377
377
|
updatableProxyRootRecord: RecordProxy,
|
|
378
378
|
recordSourceProxy: RecordSourceProxy,
|
|
379
|
-
missingFieldHandlers:
|
|
379
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
380
380
|
): ?RecordProxy {
|
|
381
381
|
for (const handler of missingFieldHandlers) {
|
|
382
382
|
if (handler.kind === 'linked') {
|
|
@@ -398,7 +398,7 @@ function getPluralLinkedRecordUsingMissingFieldHandlers(
|
|
|
398
398
|
newVariables: Variables,
|
|
399
399
|
updatableProxyRootRecord: RecordProxy,
|
|
400
400
|
recordSourceProxy: RecordSourceProxy,
|
|
401
|
-
missingFieldHandlers:
|
|
401
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
402
402
|
): ?Array<?RecordProxy> {
|
|
403
403
|
for (const handler of missingFieldHandlers) {
|
|
404
404
|
if (handler.kind === 'pluralLinked') {
|
|
@@ -424,8 +424,8 @@ function getScalarUsingMissingFieldHandlers(
|
|
|
424
424
|
newVariables: Variables,
|
|
425
425
|
updatableProxyRootRecord: RecordProxy,
|
|
426
426
|
recordSourceProxy: RecordSourceProxy,
|
|
427
|
-
missingFieldHandlers:
|
|
428
|
-
):
|
|
427
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
428
|
+
): unknown {
|
|
429
429
|
for (const handler of missingFieldHandlers) {
|
|
430
430
|
if (handler.kind === 'scalar') {
|
|
431
431
|
const value = handler.handle(
|
|
@@ -27,11 +27,11 @@ const {createUpdatableProxy} = require('./createUpdatableProxy');
|
|
|
27
27
|
const invariant = require('invariant');
|
|
28
28
|
|
|
29
29
|
// Note: plural fragment references are currently not supported
|
|
30
|
-
function readUpdatableFragment<TFragmentType
|
|
30
|
+
function readUpdatableFragment<TFragmentType extends FragmentType, TData>(
|
|
31
31
|
fragment: UpdatableFragment<TFragmentType, TData>,
|
|
32
32
|
fragmentReference: HasUpdatableSpread<TFragmentType>,
|
|
33
33
|
proxy: RecordSourceProxy,
|
|
34
|
-
missingFieldHandlers:
|
|
34
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
35
35
|
): UpdatableData<TData> {
|
|
36
36
|
const updatableFragment = getFragment(fragment);
|
|
37
37
|
const fragmentVariables = getVariablesFromFragment(
|
|
@@ -48,7 +48,7 @@ function readUpdatableFragment<TFragmentType: FragmentType, TData>(
|
|
|
48
48
|
);
|
|
49
49
|
|
|
50
50
|
return {
|
|
51
|
-
// $FlowFixMe[incompatible-
|
|
51
|
+
// $FlowFixMe[incompatible-type]
|
|
52
52
|
updatableData: createUpdatableProxy<TData>(
|
|
53
53
|
fragmentRoot,
|
|
54
54
|
fragmentVariables,
|
|
@@ -21,16 +21,16 @@ import type {UpdatableQuery, Variables} from '../util/RelayRuntimeTypes';
|
|
|
21
21
|
const {getUpdatableQuery} = require('../query/GraphQLTag');
|
|
22
22
|
const {createUpdatableProxy} = require('./createUpdatableProxy');
|
|
23
23
|
|
|
24
|
-
function readUpdatableQuery<TVariables
|
|
24
|
+
function readUpdatableQuery<TVariables extends Variables, TData>(
|
|
25
25
|
query: UpdatableQuery<TVariables, TData>,
|
|
26
26
|
variables: TVariables,
|
|
27
27
|
proxy: RecordSourceProxy,
|
|
28
|
-
missingFieldHandlers:
|
|
28
|
+
missingFieldHandlers: ReadonlyArray<MissingFieldHandler>,
|
|
29
29
|
): UpdatableData<TData> {
|
|
30
30
|
const updatableQuery = getUpdatableQuery(query);
|
|
31
31
|
|
|
32
32
|
return {
|
|
33
|
-
// $FlowFixMe[incompatible-
|
|
33
|
+
// $FlowFixMe[incompatible-type]
|
|
34
34
|
updatableData: createUpdatableProxy<TData>(
|
|
35
35
|
proxy.getRoot(),
|
|
36
36
|
variables,
|
|
@@ -62,12 +62,12 @@ if (__DEV__) {
|
|
|
62
62
|
) => {
|
|
63
63
|
const operationName = mutation.operation.name;
|
|
64
64
|
const context: ValidationContext = {
|
|
65
|
-
path: 'ROOT',
|
|
66
|
-
visitedPaths: new Set(),
|
|
67
|
-
variables: variables || {},
|
|
68
|
-
missingDiff: {},
|
|
69
65
|
extraDiff: {},
|
|
66
|
+
missingDiff: {},
|
|
70
67
|
moduleImportPaths: new Set(),
|
|
68
|
+
path: 'ROOT',
|
|
69
|
+
variables: variables || {},
|
|
70
|
+
visitedPaths: new Set(),
|
|
71
71
|
};
|
|
72
72
|
validateSelections(
|
|
73
73
|
optimisticResponse,
|
|
@@ -91,7 +91,7 @@ if (__DEV__) {
|
|
|
91
91
|
|
|
92
92
|
const validateSelections = (
|
|
93
93
|
optimisticResponse: Object,
|
|
94
|
-
selections:
|
|
94
|
+
selections: ReadonlyArray<NormalizationSelection>,
|
|
95
95
|
context: ValidationContext,
|
|
96
96
|
) => {
|
|
97
97
|
selections.forEach(selection =>
|
|
@@ -156,7 +156,7 @@ if (__DEV__) {
|
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
158
|
default:
|
|
159
|
-
|
|
159
|
+
selection as empty;
|
|
160
160
|
return;
|
|
161
161
|
}
|
|
162
162
|
};
|
|
@@ -261,4 +261,4 @@ if (__DEV__) {
|
|
|
261
261
|
};
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
module.exports =
|
|
264
|
+
module.exports = validateMutation as (Object, ConcreteRequest, ?Object) => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
import {FetchFunction, Network, SubscribeFunction} from './RelayNetworkTypes';
|
|
9
|
+
|
|
10
|
+
export const RelayNetwork: {
|
|
11
|
+
create(fetchFn: FetchFunction, subscribeFn?: SubscribeFunction): Network;
|
|
12
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
import { RequestParameters } from '../util/RelayConcreteNode';
|
|
9
|
+
import {CacheConfig, Disposable, Variables} from '../util/RelayRuntimeTypes';
|
|
10
|
+
import {ObservableFromValue, RelayObservable} from './RelayObservable';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* An interface for fetching the data for one or more (possibly interdependent)
|
|
14
|
+
* queries.
|
|
15
|
+
*/
|
|
16
|
+
export interface Network {
|
|
17
|
+
execute: ExecuteFunction;
|
|
18
|
+
}
|
|
19
|
+
export type LogRequestInfoFunction = (arg: any) => void;
|
|
20
|
+
|
|
21
|
+
export interface PayloadData {
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PayloadError {
|
|
26
|
+
message: string;
|
|
27
|
+
locations?:
|
|
28
|
+
| Array<{
|
|
29
|
+
line: number;
|
|
30
|
+
column: number;
|
|
31
|
+
}>
|
|
32
|
+
| undefined;
|
|
33
|
+
path?: Array<string | number>;
|
|
34
|
+
severity?: 'CRITICAL' | 'ERROR' | 'WARNING' | undefined; // Not officially part of the spec, but used at Facebook
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface PayloadExtensions {
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The shape of a GraphQL response as dictated by the
|
|
43
|
+
* [spec](https://graphql.github.io/graphql-spec/June2018/#sec-Response-Format)
|
|
44
|
+
*/
|
|
45
|
+
export interface GraphQLResponseWithData {
|
|
46
|
+
data: PayloadData;
|
|
47
|
+
errors?: PayloadError[] | undefined;
|
|
48
|
+
extensions?: PayloadExtensions | undefined;
|
|
49
|
+
label?: string | undefined;
|
|
50
|
+
path?: Array<string | number> | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface GraphQLResponseWithoutData {
|
|
53
|
+
data?: PayloadData | undefined;
|
|
54
|
+
errors: PayloadError[];
|
|
55
|
+
extensions?: PayloadExtensions | undefined;
|
|
56
|
+
label?: string | undefined;
|
|
57
|
+
path?: Array<string | number> | undefined;
|
|
58
|
+
}
|
|
59
|
+
export interface GraphQLResponseWithExtensionsOnly {
|
|
60
|
+
// Per https://spec.graphql.org/June2018/#sec-Errors
|
|
61
|
+
// > If the data entry in the response is not present, the errors entry
|
|
62
|
+
// > in the response must not be empty. It must contain at least one error
|
|
63
|
+
// This means a payload has to have either a data key or an errors key:
|
|
64
|
+
// but the spec leaves room for the combination of data: null plus extensions
|
|
65
|
+
// since `data: null` is a *required* output if there was an error during
|
|
66
|
+
// execution, but the inverse is not described in the sepc: `data: null`
|
|
67
|
+
// does not necessarily indicate that there was an error.
|
|
68
|
+
data: null;
|
|
69
|
+
extensions: PayloadExtensions;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type GraphQLSingularResponse =
|
|
73
|
+
| GraphQLResponseWithData
|
|
74
|
+
| GraphQLResponseWithExtensionsOnly
|
|
75
|
+
| GraphQLResponseWithoutData;
|
|
76
|
+
|
|
77
|
+
export type GraphQLResponse = GraphQLSingularResponse | readonly GraphQLSingularResponse[];
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* A function that returns an Observable representing the response of executing
|
|
81
|
+
* a GraphQL operation.
|
|
82
|
+
*/
|
|
83
|
+
export type ExecuteFunction = (
|
|
84
|
+
request: RequestParameters,
|
|
85
|
+
variables: Variables,
|
|
86
|
+
cacheConfig: CacheConfig,
|
|
87
|
+
uploadables?: UploadableMap | null,
|
|
88
|
+
) => RelayObservable<GraphQLResponse>;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A function that executes a GraphQL operation with request/response semantics.
|
|
92
|
+
*
|
|
93
|
+
* May return an Observable or Promise of a plain GraphQL server response, or
|
|
94
|
+
* a composed ExecutePayload object supporting additional metadata.
|
|
95
|
+
*/
|
|
96
|
+
export type FetchFunction = (
|
|
97
|
+
request: RequestParameters,
|
|
98
|
+
variables: Variables,
|
|
99
|
+
cacheConfig: CacheConfig,
|
|
100
|
+
uploadables?: UploadableMap | null,
|
|
101
|
+
) => ObservableFromValue<GraphQLResponse>;
|
|
102
|
+
|
|
103
|
+
export interface LegacyObserver<T> {
|
|
104
|
+
onCompleted?: (() => void) | undefined;
|
|
105
|
+
onError?: ((error: Error) => void) | undefined;
|
|
106
|
+
onNext?: ((data: T) => void) | undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* A function that executes a GraphQL subscription operation, returning zero or
|
|
111
|
+
* more raw server responses over time.
|
|
112
|
+
*/
|
|
113
|
+
export type SubscribeFunction = (
|
|
114
|
+
request: RequestParameters,
|
|
115
|
+
variables: Variables,
|
|
116
|
+
cacheConfig: CacheConfig,
|
|
117
|
+
observer?: LegacyObserver<GraphQLResponse>,
|
|
118
|
+
) => RelayObservable<GraphQLResponse> | Disposable;
|
|
119
|
+
|
|
120
|
+
export type Uploadable = File | Blob;
|
|
121
|
+
export interface UploadableMap {
|
|
122
|
+
[key: string]: Uploadable;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* React Flight tree created on the server.
|
|
127
|
+
*/
|
|
128
|
+
export type ReactFlightServerTree = any;
|
|
129
|
+
export interface ReactFlightPayloadQuery {
|
|
130
|
+
readonly id: any;
|
|
131
|
+
readonly module: any;
|
|
132
|
+
readonly response: GraphQLSingularResponse;
|
|
133
|
+
readonly variables: Variables;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Data that is returned by a Flight compliant GraphQL server.
|
|
137
|
+
*
|
|
138
|
+
* - tree: an array of values that will be iterated and fed into
|
|
139
|
+
* ReactFlightDOMRelayClient.
|
|
140
|
+
* - queries: an array of queries that the server preloaded for the client.
|
|
141
|
+
*/
|
|
142
|
+
export interface ReactFlightPayloadData {
|
|
143
|
+
readonly tree: ReactFlightServerTree[];
|
|
144
|
+
readonly queries: ReactFlightPayloadQuery[];
|
|
145
|
+
}
|