Skip to content

Commit 0cdf393

Browse files
authored
fix(core): AugmentObject should check for own propeties correctly (#12534)
1 parent 5f1adef commit 0cdf393

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

Diff for: packages/workflow/src/AugmentObject.ts

+12-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import type { IDataObject } from './Interfaces';
22

33
const defaultPropertyDescriptor = Object.freeze({ enumerable: true, configurable: true });
44

5+
// eslint-disable-next-line @typescript-eslint/unbound-method
6+
const { hasOwnProperty } = Object.prototype;
7+
58
const augmentedObjects = new WeakSet<object>();
69

710
function augment<T>(value: T): T {
@@ -84,7 +87,7 @@ export function augmentObject<T extends object>(data: T): T {
8487
return undefined;
8588
}
8689

87-
if (newData[key] !== undefined) {
90+
if (hasOwnProperty.call(newData, key)) {
8891
return newData[key];
8992
}
9093

@@ -102,11 +105,11 @@ export function augmentObject<T extends object>(data: T): T {
102105

103106
return value;
104107
},
105-
deleteProperty(target, key: string) {
106-
if (key in newData) {
108+
deleteProperty(_target, key: string) {
109+
if (hasOwnProperty.call(newData, key)) {
107110
delete newData[key];
108111
}
109-
if (key in target) {
112+
if (hasOwnProperty.call(data, key)) {
110113
deletedProperties.add(key);
111114
}
112115

@@ -131,9 +134,10 @@ export function augmentObject<T extends object>(data: T): T {
131134

132135
return true;
133136
},
134-
has(target, key) {
137+
has(_target, key) {
135138
if (deletedProperties.has(key)) return false;
136-
return Reflect.has(newData, key) || Reflect.has(target, key);
139+
const target = hasOwnProperty.call(newData, key) ? newData : data;
140+
return Reflect.has(target, key);
137141
},
138142
ownKeys(target) {
139143
const originalKeys = Reflect.ownKeys(target);
@@ -145,7 +149,8 @@ export function augmentObject<T extends object>(data: T): T {
145149

146150
getOwnPropertyDescriptor(_target, key) {
147151
if (deletedProperties.has(key)) return undefined;
148-
return Object.getOwnPropertyDescriptor(key in newData ? newData : data, key);
152+
const target = hasOwnProperty.call(newData, key) ? newData : data;
153+
return Object.getOwnPropertyDescriptor(target, key);
149154
},
150155
});
151156

Diff for: packages/workflow/test/AugmentObject.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -572,5 +572,22 @@ describe('AugmentObject', () => {
572572
expect('z' in augmentedObject.x).toBe(true);
573573
expect('y' in augmentedObject.x).toBe(true);
574574
});
575+
576+
test('should ignore non-enumerable keys', () => {
577+
const originalObject: { toString?: string } = { toString: '123' };
578+
const augmentedObject = augmentObject(originalObject);
579+
expect('toString' in augmentedObject).toBe(true);
580+
expect(Object.keys(augmentedObject)).toEqual(['toString']);
581+
expect(Object.getOwnPropertyDescriptor(augmentedObject, 'toString')?.value).toEqual(
582+
originalObject.toString,
583+
);
584+
expect(augmentedObject.toString).toEqual(originalObject.toString);
585+
586+
augmentedObject.toString = '456';
587+
expect(augmentedObject.toString).toBe('456');
588+
589+
delete augmentedObject.toString;
590+
expect(augmentedObject.toString).toBeUndefined();
591+
});
575592
});
576593
});

0 commit comments

Comments
 (0)