UNPKG

2.03 kBJavaScriptView Raw
1/**
2 * Copyright 2015, Yahoo! Inc.
3 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
4 */
5var REACT_STATICS = {
6 childContextTypes: true,
7 contextTypes: true,
8 defaultProps: true,
9 displayName: true,
10 getDefaultProps: true,
11 getDerivedStateFromProps: true,
12 mixins: true,
13 propTypes: true,
14 type: true
15};
16
17var KNOWN_STATICS = {
18 name: true,
19 length: true,
20 prototype: true,
21 caller: true,
22 callee: true,
23 arguments: true,
24 arity: true
25};
26
27var defineProperty = Object.defineProperty;
28var getOwnPropertyNames = Object.getOwnPropertyNames;
29var getOwnPropertySymbols = Object.getOwnPropertySymbols;
30var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
31var getPrototypeOf = Object.getPrototypeOf;
32var objectPrototype = getPrototypeOf && getPrototypeOf(Object);
33
34export default function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
35 if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components
36
37 if (objectPrototype) {
38 var inheritedComponent = getPrototypeOf(sourceComponent);
39 if (inheritedComponent && inheritedComponent !== objectPrototype) {
40 hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
41 }
42 }
43
44 var keys = getOwnPropertyNames(sourceComponent);
45
46 if (getOwnPropertySymbols) {
47 keys = keys.concat(getOwnPropertySymbols(sourceComponent));
48 }
49
50 for (var i = 0; i < keys.length; ++i) {
51 var key = keys[i];
52 if (!REACT_STATICS[key] && !KNOWN_STATICS[key] && (!blacklist || !blacklist[key])) {
53 var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
54 try { // Avoid failures from read-only properties
55 defineProperty(targetComponent, key, descriptor);
56 } catch (e) {}
57 }
58 }
59
60 return targetComponent;
61 }
62
63 return targetComponent;
64};