mirror of
https://github.com/status-im/react-native.git
synced 2025-02-23 06:38:13 +00:00
Summary: Fixes a redbox about setting both the accessor and the value for an object. It looks like it's actually coming from PolyfillFunctions, where we set the value as well as spreading in the object descriptor for modules in DEV. Reviewed By: yungsters Differential Revision: D9792991 fbshipit-source-id: a2fa5d1820c5eddfd8244722771e76de62f89976
57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const defineLazyObjectProperty = require('defineLazyObjectProperty');
|
|
|
|
/**
|
|
* Sets an object's property. If a property with the same name exists, this will
|
|
* replace it but maintain its descriptor configuration. The property will be
|
|
* replaced with a lazy getter.
|
|
*
|
|
* In DEV mode the original property value will be preserved as `original[PropertyName]`
|
|
* so that, if necessary, it can be restored. For example, if you want to route
|
|
* network requests through DevTools (to trace them):
|
|
*
|
|
* global.XMLHttpRequest = global.originalXMLHttpRequest;
|
|
*
|
|
* @see https://github.com/facebook/react-native/issues/934
|
|
*/
|
|
function polyfillObjectProperty<T>(
|
|
object: Object,
|
|
name: string,
|
|
getValue: () => T,
|
|
): void {
|
|
const descriptor = Object.getOwnPropertyDescriptor(object, name);
|
|
if (__DEV__ && descriptor) {
|
|
const backupName = `original${name[0].toUpperCase()}${name.substr(1)}`;
|
|
Object.defineProperty(object, backupName, descriptor);
|
|
}
|
|
|
|
const {enumerable, writable, configurable} = descriptor || {};
|
|
if (descriptor && !configurable) {
|
|
console.error('Failed to set polyfill. ' + name + ' is not configurable.');
|
|
return;
|
|
}
|
|
|
|
defineLazyObjectProperty(object, name, {
|
|
get: getValue,
|
|
enumerable: enumerable !== false,
|
|
writable: writable !== false,
|
|
});
|
|
}
|
|
|
|
function polyfillGlobal<T>(name: string, getValue: () => T): void {
|
|
polyfillObjectProperty(global, name, getValue);
|
|
}
|
|
|
|
module.exports = {polyfillObjectProperty, polyfillGlobal};
|