fix(core): AugmentObject should handle the constructor property correctly (#12744)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2025-01-21 11:49:43 +01:00 committed by GitHub
parent af5b64a61d
commit 36bc164da4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 0 deletions

View file

@ -36,6 +36,7 @@ export function augmentArray<T>(data: T[]): T[] {
return Reflect.deleteProperty(getData(), key);
},
get(target, key: string, receiver): unknown {
if (key === 'constructor') return Array;
const value = Reflect.get(newData ?? target, key, receiver) as unknown;
const newValue = augment(value);
if (newValue !== value) {
@ -83,6 +84,8 @@ export function augmentObject<T extends object>(data: T): T {
const proxy = new Proxy(data, {
get(target, key: string, receiver): unknown {
if (key === 'constructor') return Object;
if (deletedProperties.has(key)) {
return undefined;
}

View file

@ -10,6 +10,8 @@ describe('AugmentObject', () => {
const augmentedObject = augmentArray(originalObject);
expect(augmentedObject.constructor.name).toEqual('Array');
expect(augmentedObject.push(5)).toEqual(6);
expect(augmentedObject).toEqual([1, 2, 3, 4, null, 5]);
expect(originalObject).toEqual(copyOriginal);
@ -207,6 +209,8 @@ describe('AugmentObject', () => {
const augmentedObject = augmentObject(originalObject);
expect(augmentedObject.constructor.name).toEqual('Object');
augmentedObject[1] = 911;
expect(originalObject[1]).toEqual(11);
expect(augmentedObject[1]).toEqual(911);
@ -589,5 +593,29 @@ describe('AugmentObject', () => {
delete augmentedObject.toString;
expect(augmentedObject.toString).toBeUndefined();
});
test('should handle constructor property correctly', () => {
const originalObject: any = {
a: {
b: {
c: {
d: '4',
},
},
},
};
const augmentedObject = augmentObject(originalObject);
expect(augmentedObject.constructor.name).toEqual('Object');
expect(augmentedObject.a.constructor.name).toEqual('Object');
expect(augmentedObject.a.b.constructor.name).toEqual('Object');
expect(augmentedObject.a.b.c.constructor.name).toEqual('Object');
augmentedObject.constructor = {};
expect(augmentedObject.constructor.name).toEqual('Object');
delete augmentedObject.constructor;
expect(augmentedObject.constructor.name).toEqual('Object');
});
});
});