diff --git a/packages/recoil/core/Recoil_RecoilRoot.js b/packages/recoil/core/Recoil_RecoilRoot.js index 19305447c..d0a81cff2 100644 --- a/packages/recoil/core/Recoil_RecoilRoot.js +++ b/packages/recoil/core/Recoil_RecoilRoot.js @@ -65,6 +65,7 @@ type InternalProps = { initializeState?: MutableSnapshot => void, store_INTERNAL?: Store, children: React.Node, + skipCircularDependencyDetection_DANGEROUS?: boolean, }; function notInAContext() { @@ -365,6 +366,7 @@ function RecoilRoot_INTERNAL({ initializeState, store_INTERNAL: storeProp, // For use with React "context bridging" children, + skipCircularDependencyDetection_DANGEROUS, }: InternalProps): React.Node { // prettier-ignore // @fb-only: useEffect(() => { @@ -486,6 +488,7 @@ function RecoilRoot_INTERNAL({ getGraph, subscribeToTransactions, addTransactionMetadata, + skipCircularDependencyDetection_DANGEROUS, }, ); if (storeProp != null) { @@ -550,6 +553,7 @@ type Props = store_INTERNAL?: Store, override?: true, children: React.Node, + skipCircularDependencyDetection_DANGEROUS?: boolean, } | { store_INTERNAL?: Store, @@ -562,6 +566,7 @@ type Props = */ override: false, children: React.Node, + skipCircularDependencyDetection_DANGEROUS?: boolean, }; function RecoilRoot(props: Props): React.Node { diff --git a/packages/recoil/core/Recoil_State.js b/packages/recoil/core/Recoil_State.js index 8976c190f..e86334d22 100644 --- a/packages/recoil/core/Recoil_State.js +++ b/packages/recoil/core/Recoil_State.js @@ -132,6 +132,7 @@ export type Store = $ReadOnly<{ getGraph: StateID => Graph, subscribeToTransactions: ((Store) => void, ?NodeKey) => {release: () => void}, addTransactionMetadata: ({...}) => void, + skipCircularDependencyDetection_DANGEROUS?: boolean, }>; export type StoreRef = { diff --git a/packages/recoil/recoil_values/Recoil_selector.js b/packages/recoil/recoil_values/Recoil_selector.js index c38cfc4da..76720270d 100644 --- a/packages/recoil/recoil_values/Recoil_selector.js +++ b/packages/recoil/recoil_values/Recoil_selector.js @@ -1102,6 +1102,9 @@ function selector( } function selectorGet(store: Store, state: TreeState): Loadable { + if (store.skipCircularDependencyDetection_DANGEROUS === true) { + return getSelectorLoadableAndUpdateDeps(store, state); + } return detectCircularDependencies(() => getSelectorLoadableAndUpdateDeps(store, state), );