From 8376ad3ac62b6ce749a29277445a168cf88faccc Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Mon, 31 Aug 2026 02:44:09 +0300 Subject: [PATCH] Fixed component storage for prototype-named keys --- src/components/Store.test.ts | 22 ++++++++++++++++++++++ src/components/Store.ts | 10 +++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/components/Store.test.ts b/src/components/Store.test.ts index e25336e4116..28c2545fbf4 100644 --- a/src/components/Store.test.ts +++ b/src/components/Store.test.ts @@ -48,6 +48,28 @@ describe('Store', () => { expect(uut.getComponentClassForName('example.mycomponent')).toEqual(MyWrappedComponent); }); + it.each(['toString', '__proto__'])('treats %s as a regular store key', (key) => { + expect(uut.getPropsForId(key)).toEqual({}); + expect(uut.getComponentClassForName(key)).toBeUndefined(); + expect(uut.getComponentInstance(key)).toBeUndefined(); + expect(uut.hasRegisteredWrappedComponent(key)).toBe(false); + + const ComponentClass = () => class MyComponent extends React.Component {}; + const componentInstance = {} as IWrappedComponent; + class WrappedComponent extends React.Component {} + + uut.updateProps(key, { foo: 'bar' }); + uut.setComponentClassForName(key, ComponentClass); + uut.setComponentInstance(key, componentInstance); + uut.setWrappedComponent(key, WrappedComponent); + + expect(uut.getPropsForId(key)).toEqual({ foo: 'bar' }); + expect(uut.getComponentClassForName(key)).toBe(ComponentClass); + expect(uut.getComponentInstance(key)).toBe(componentInstance); + expect(uut.hasRegisteredWrappedComponent(key)).toBe(true); + expect(uut.getWrappedComponent(key)).toBe(WrappedComponent); + }); + it('clear props by component id when clear component', () => { uut.updateProps('refUniqueId', { foo: 'bar' }); uut.clearComponent('refUniqueId'); diff --git a/src/components/Store.ts b/src/components/Store.ts index 1c67dd7b77f..14707ecd0c5 100644 --- a/src/components/Store.ts +++ b/src/components/Store.ts @@ -3,11 +3,11 @@ import { ComponentProvider } from 'react-native'; import { IWrappedComponent } from './ComponentWrapper'; export class Store { - private componentsByName: Record = {}; - private propsById: Record = {}; - private pendingPropsById: Record = {}; - private componentsInstancesById: Record = {}; - private wrappedComponents: Record> = {}; + private componentsByName: Record = Object.create(null); + private propsById: Record = Object.create(null); + private pendingPropsById: Record = Object.create(null); + private componentsInstancesById: Record = Object.create(null); + private wrappedComponents: Record> = Object.create(null); private lazyRegistratorFn: ((lazyComponentRequest: string | number) => void) | undefined; updateProps(componentId: string, props: any, callback?: () => void) {