UNPKG

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