You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.7 KiB
103 lines
2.7 KiB
'use strict'; |
|
|
|
var reactIs = require('react-is'); |
|
|
|
/** |
|
* Copyright 2015, Yahoo! Inc. |
|
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. |
|
*/ |
|
var REACT_STATICS = { |
|
childContextTypes: true, |
|
contextType: true, |
|
contextTypes: true, |
|
defaultProps: true, |
|
displayName: true, |
|
getDefaultProps: true, |
|
getDerivedStateFromError: true, |
|
getDerivedStateFromProps: true, |
|
mixins: true, |
|
propTypes: true, |
|
type: true |
|
}; |
|
var KNOWN_STATICS = { |
|
name: true, |
|
length: true, |
|
prototype: true, |
|
caller: true, |
|
callee: true, |
|
arguments: true, |
|
arity: true |
|
}; |
|
var FORWARD_REF_STATICS = { |
|
'$$typeof': true, |
|
render: true, |
|
defaultProps: true, |
|
displayName: true, |
|
propTypes: true |
|
}; |
|
var MEMO_STATICS = { |
|
'$$typeof': true, |
|
compare: true, |
|
defaultProps: true, |
|
displayName: true, |
|
propTypes: true, |
|
type: true |
|
}; |
|
var TYPE_STATICS = {}; |
|
TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; |
|
TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; |
|
|
|
function getStatics(component) { |
|
// React v16.11 and below |
|
if (reactIs.isMemo(component)) { |
|
return MEMO_STATICS; |
|
} // React v16.12 and above |
|
|
|
|
|
return TYPE_STATICS[component['$$typeof']] || REACT_STATICS; |
|
} |
|
|
|
var defineProperty = Object.defineProperty; |
|
var getOwnPropertyNames = Object.getOwnPropertyNames; |
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols; |
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; |
|
var getPrototypeOf = Object.getPrototypeOf; |
|
var objectPrototype = Object.prototype; |
|
function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { |
|
if (typeof sourceComponent !== 'string') { |
|
// don't hoist over string (html) components |
|
if (objectPrototype) { |
|
var inheritedComponent = getPrototypeOf(sourceComponent); |
|
|
|
if (inheritedComponent && inheritedComponent !== objectPrototype) { |
|
hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); |
|
} |
|
} |
|
|
|
var keys = getOwnPropertyNames(sourceComponent); |
|
|
|
if (getOwnPropertySymbols) { |
|
keys = keys.concat(getOwnPropertySymbols(sourceComponent)); |
|
} |
|
|
|
var targetStatics = getStatics(targetComponent); |
|
var sourceStatics = getStatics(sourceComponent); |
|
|
|
for (var i = 0; i < keys.length; ++i) { |
|
var key = keys[i]; |
|
|
|
if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { |
|
var descriptor = getOwnPropertyDescriptor(sourceComponent, key); |
|
|
|
try { |
|
// Avoid failures from read-only properties |
|
defineProperty(targetComponent, key, descriptor); |
|
} catch (e) {} |
|
} |
|
} |
|
} |
|
|
|
return targetComponent; |
|
} |
|
|
|
module.exports = hoistNonReactStatics;
|
|
|