From 12d169fc9c23acd4204c72c62d448c9b312bb9c0 Mon Sep 17 00:00:00 2001 From: Itamar Kestenbaum Date: Tue, 16 Jan 2024 15:48:51 -0800 Subject: [PATCH] 4/n - Add logging on seeing relayFieldErrors Reviewed By: tyao1 Differential Revision: D51944687 fbshipit-source-id: 8c1db06d9cabf0d4174d15327035dd7f0fb1784f --- .../relay-hooks/FragmentResource.js | 2 ++ .../readFragmentInternal_EXPERIMENTAL.js | 2 ++ .../useFragmentInternal_EXPERIMENTAL.js | 2 ++ packages/relay-runtime/query/fetchQuery.js | 1 + .../store/RelayModernFragmentSpecResolver.js | 1 + .../relay-runtime/store/RelayStoreTypes.js | 6 ++++++ .../relay-runtime/util/RelayFeatureFlags.js | 4 ++++ .../util/handlePotentialSnapshotErrors.js | 19 +++++++++++++++++++ 8 files changed, 37 insertions(+) diff --git a/packages/react-relay/relay-hooks/FragmentResource.js b/packages/react-relay/relay-hooks/FragmentResource.js index 0d4993dce7100..030aa8bdb5b22 100644 --- a/packages/react-relay/relay-hooks/FragmentResource.js +++ b/packages/react-relay/relay-hooks/FragmentResource.js @@ -566,6 +566,7 @@ class FragmentResourceImpl { this._environment, s.missingRequiredFields, s.relayResolverErrors, + s.errorResponseFields, ); }); } else { @@ -573,6 +574,7 @@ class FragmentResourceImpl { this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors, + snapshot.errorResponseFields, ); } } diff --git a/packages/react-relay/relay-hooks/experimental/readFragmentInternal_EXPERIMENTAL.js b/packages/react-relay/relay-hooks/experimental/readFragmentInternal_EXPERIMENTAL.js index 7b93cff42ef41..b30506f9ee465 100644 --- a/packages/react-relay/relay-hooks/experimental/readFragmentInternal_EXPERIMENTAL.js +++ b/packages/react-relay/relay-hooks/experimental/readFragmentInternal_EXPERIMENTAL.js @@ -87,6 +87,7 @@ function handlePotentialSnapshotErrorsForState( environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors, + state.snapshot.errorResponseFields, ); } else if (state.kind === 'plural') { for (const snapshot of state.snapshots) { @@ -94,6 +95,7 @@ function handlePotentialSnapshotErrorsForState( environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors, + snapshot.errorResponseFields, ); } } diff --git a/packages/react-relay/relay-hooks/experimental/useFragmentInternal_EXPERIMENTAL.js b/packages/react-relay/relay-hooks/experimental/useFragmentInternal_EXPERIMENTAL.js index c64f6500fe8aa..42549144f6c9e 100644 --- a/packages/react-relay/relay-hooks/experimental/useFragmentInternal_EXPERIMENTAL.js +++ b/packages/react-relay/relay-hooks/experimental/useFragmentInternal_EXPERIMENTAL.js @@ -117,6 +117,7 @@ function handlePotentialSnapshotErrorsForState( environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors, + state.snapshot.errorResponseFields, ); } else if (state.kind === 'plural') { for (const snapshot of state.snapshots) { @@ -124,6 +125,7 @@ function handlePotentialSnapshotErrorsForState( environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors, + snapshot.errorResponseFields, ); } } diff --git a/packages/relay-runtime/query/fetchQuery.js b/packages/relay-runtime/query/fetchQuery.js index 11b7a8d6683c1..4a1e9c46dfb27 100644 --- a/packages/relay-runtime/query/fetchQuery.js +++ b/packages/relay-runtime/query/fetchQuery.js @@ -140,6 +140,7 @@ function fetchQuery( environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors, + snapshot.errorResponseFields, ); /* $FlowFixMe[incompatible-return] we assume readData returns the right * data just having written it from network or checked availability. */ diff --git a/packages/relay-runtime/store/RelayModernFragmentSpecResolver.js b/packages/relay-runtime/store/RelayModernFragmentSpecResolver.js index ea2cbc34931d7..dc1ce0b2992fc 100644 --- a/packages/relay-runtime/store/RelayModernFragmentSpecResolver.js +++ b/packages/relay-runtime/store/RelayModernFragmentSpecResolver.js @@ -333,6 +333,7 @@ class SelectorResolver { this._environment, this._missingRequiredFields, this._relayResolverErrors, + this._errorResponseFields, ); return this._data; } diff --git a/packages/relay-runtime/store/RelayStoreTypes.js b/packages/relay-runtime/store/RelayStoreTypes.js index 80b055d36e10d..3a1287dcb1628 100644 --- a/packages/relay-runtime/store/RelayStoreTypes.js +++ b/packages/relay-runtime/store/RelayStoreTypes.js @@ -1207,6 +1207,12 @@ export type RelayFieldLoggerEvent = +owner: string, +fieldPath: string, +error: Error, + } + | { + +kind: 'relay_field_payload.error', + +owner: string, + +fieldPath: string, + +error: TRelayFieldError, }; /** diff --git a/packages/relay-runtime/util/RelayFeatureFlags.js b/packages/relay-runtime/util/RelayFeatureFlags.js index d26de0a8c6b5e..1d0ab130ecf91 100644 --- a/packages/relay-runtime/util/RelayFeatureFlags.js +++ b/packages/relay-runtime/util/RelayFeatureFlags.js @@ -46,6 +46,8 @@ export type FeatureFlags = { ENABLE_FIELD_ERROR_HANDLING: boolean, ENABLE_STRICT_EQUAL_SELECTORS: boolean, + ENABLE_FIELD_ERROR_HANDLING_THROW_BY_DEFAULT: boolean, + ENABLE_FIELD_ERROR_HANDLING_CATCH_DIRECTIVE: boolean, }; const RelayFeatureFlags: FeatureFlags = { @@ -66,6 +68,8 @@ const RelayFeatureFlags: FeatureFlags = { ENABLE_OPERATION_TRACKER_OPTIMISTIC_UPDATES: false, ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE: false, ENABLE_FIELD_ERROR_HANDLING: false, + ENABLE_FIELD_ERROR_HANDLING_THROW_BY_DEFAULT: false, + ENABLE_FIELD_ERROR_HANDLING_CATCH_DIRECTIVE: false, ENABLE_SHALLOW_FREEZE_RESOLVER_VALUES: true, ENABLE_STRICT_EQUAL_SELECTORS: false, }; diff --git a/packages/relay-runtime/util/handlePotentialSnapshotErrors.js b/packages/relay-runtime/util/handlePotentialSnapshotErrors.js index 474ae46b239d7..84d2c42e9607b 100644 --- a/packages/relay-runtime/util/handlePotentialSnapshotErrors.js +++ b/packages/relay-runtime/util/handlePotentialSnapshotErrors.js @@ -12,15 +12,19 @@ 'use strict'; import type { + ErrorResponseFields, IEnvironment, MissingRequiredFields, RelayResolverErrors, } from '../store/RelayStoreTypes'; +import RelayFeatureFlags from './RelayFeatureFlags'; + function handlePotentialSnapshotErrors( environment: IEnvironment, missingRequiredFields: ?MissingRequiredFields, relayResolverErrors: RelayResolverErrors, + errorResponseFields: ?ErrorResponseFields, ) { for (const resolverError of relayResolverErrors) { environment.relayFieldLogger({ @@ -30,6 +34,21 @@ function handlePotentialSnapshotErrors( error: resolverError.error, }); } + if (RelayFeatureFlags.ENABLE_FIELD_ERROR_HANDLING) { + if (errorResponseFields != null) { + for (const fieldError of errorResponseFields) { + const {path, owner, error} = fieldError; + + environment.relayFieldLogger({ + kind: 'relay_field_payload.error', + owner: owner, + fieldPath: path, + error, + }); + } + } + } + if (missingRequiredFields != null) { switch (missingRequiredFields.action) { case 'THROW': {