From f5ccb9561b2a75ab7c75fbb2478ab6db221486f2 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Fri, 17 Jan 2025 17:06:18 -0800 Subject: [PATCH 1/3] Permit non-`DEV` Elements in `React.Children` w/ `DEV` --- .../react/src/__tests__/ReactChildren-test.js | 26 +++++++++++++++++++ packages/react/src/jsx/ReactJSXElement.js | 4 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/react/src/__tests__/ReactChildren-test.js b/packages/react/src/__tests__/ReactChildren-test.js index 5cce6b24873f0..2d8729a20defd 100644 --- a/packages/react/src/__tests__/ReactChildren-test.js +++ b/packages/react/src/__tests__/ReactChildren-test.js @@ -1039,6 +1039,32 @@ describe('ReactChildren', () => { }); }); + // @gate __DEV__ + it('does not throw on children without `_store`', async () => { + function ComponentRenderingFlattenedChildren({children}) { + return
{React.Children.toArray(children)}
; + } + + const source =
; + const productionElement = {}; + for (const [key, value] of Object.entries(source)) { + if (key !== '_owner' && key !== '_store') { + productionElement[key] = value; + } + } + Object.freeze(productionElement); + + const container = document.createElement('div'); + const root = ReactDOMClient.createRoot(container); + await act(() => { + root.render( + + {productionElement} + , + ); + }); + }); + it('should escape keys', () => { const zero =
; const one =
; diff --git a/packages/react/src/jsx/ReactJSXElement.js b/packages/react/src/jsx/ReactJSXElement.js index e0a689ec2404f..5edcb333ea571 100644 --- a/packages/react/src/jsx/ReactJSXElement.js +++ b/packages/react/src/jsx/ReactJSXElement.js @@ -813,7 +813,9 @@ export function cloneAndReplaceKey(oldElement, newKey) { ); if (__DEV__) { // The cloned element should inherit the original element's key validation. - clonedElement._store.validated = oldElement._store.validated; + if (oldElement._store) { + clonedElement._store.validated = oldElement._store.validated; + } } return clonedElement; } From e8a6f546c27588c8deeeff2962d24941a0de2d58 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Tue, 21 Jan 2025 11:23:31 -0800 Subject: [PATCH 2/3] Avoid `for ... of` syntax --- packages/react/src/__tests__/ReactChildren-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react/src/__tests__/ReactChildren-test.js b/packages/react/src/__tests__/ReactChildren-test.js index 2d8729a20defd..551335e1e62d1 100644 --- a/packages/react/src/__tests__/ReactChildren-test.js +++ b/packages/react/src/__tests__/ReactChildren-test.js @@ -1047,11 +1047,11 @@ describe('ReactChildren', () => { const source =
; const productionElement = {}; - for (const [key, value] of Object.entries(source)) { + Object.entries(source).forEach(([key, value]) => { if (key !== '_owner' && key !== '_store') { productionElement[key] = value; } - } + }); Object.freeze(productionElement); const container = document.createElement('div'); From 33003074f4556aedb285a8a2e507b12574b90dc7 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 27 Jan 2025 10:45:35 -0800 Subject: [PATCH 3/3] Enable test for non-`__DEV__` --- packages/react/src/__tests__/ReactChildren-test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react/src/__tests__/ReactChildren-test.js b/packages/react/src/__tests__/ReactChildren-test.js index 551335e1e62d1..7843d203b0a15 100644 --- a/packages/react/src/__tests__/ReactChildren-test.js +++ b/packages/react/src/__tests__/ReactChildren-test.js @@ -1039,7 +1039,6 @@ describe('ReactChildren', () => { }); }); - // @gate __DEV__ it('does not throw on children without `_store`', async () => { function ComponentRenderingFlattenedChildren({children}) { return
{React.Children.toArray(children)}
;