fingerprintjs
36 строк · 1.2 Кб
1/**
2* Sets new property values to the object and reverts the properties when the action is complete
3*/
4export default async function withMockProperties<T>(5object: Record<never, unknown>,6mockProperties: Record<string, PropertyDescriptor | undefined>,7action: () => Promise<T> | T,8): Promise<T> {9const originalProperties: Record<string, PropertyDescriptor | undefined> = {}10
11for (const property of Object.keys(mockProperties)) {12originalProperties[property] = Object.getOwnPropertyDescriptor(object, property)13const mockProperty = mockProperties[property]14if (mockProperty) {15Object.defineProperty(object, property, {16...mockProperty,17configurable: true, // Must be configurable, otherwise won't be able to revert18})19} else {20delete (object as Record<keyof never, unknown>)[property]21}22}23
24try {25return await action()26} finally {27for (const property of Object.keys(originalProperties)) {28const propertyDescriptor = originalProperties[property]29if (propertyDescriptor === undefined) {30delete (object as Record<keyof never, unknown>)[property]31} else {32Object.defineProperty(object, property, propertyDescriptor)33}34}35}36}
37