UNPKG

2.55 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 ReactIs = require('react-is');
8var React = require('react');
9var REACT_STATICS = {
10 childContextTypes: true,
11 contextType: true,
12 contextTypes: true,
13 defaultProps: true,
14 displayName: true,
15 getDefaultProps: true,
16 getDerivedStateFromProps: true,
17 mixins: true,
18 propTypes: true,
19 type: true
20};
21
22var KNOWN_STATICS = {
23 name: true,
24 length: true,
25 prototype: true,
26 caller: true,
27 callee: true,
28 arguments: true,
29 arity: true
30};
31
32var FORWARD_REF_STATICS = {
33 '$$typeof': true,
34 render: true
35};
36
37var TYPE_STATICS = {};
38TYPE_STATICS[ReactIs.ForwardRef] = FORWARD_REF_STATICS;
39
40var defineProperty = Object.defineProperty;
41var getOwnPropertyNames = Object.getOwnPropertyNames;
42var getOwnPropertySymbols = Object.getOwnPropertySymbols;
43var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
44var getPrototypeOf = Object.getPrototypeOf;
45var objectPrototype = Object.prototype;
46
47function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
48 if (typeof sourceComponent !== 'string') {
49 // don't hoist over string (html) components
50
51 if (objectPrototype) {
52 var inheritedComponent = getPrototypeOf(sourceComponent);
53 if (inheritedComponent && inheritedComponent !== objectPrototype) {
54 hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
55 }
56 }
57
58 var keys = getOwnPropertyNames(sourceComponent);
59
60 if (getOwnPropertySymbols) {
61 keys = keys.concat(getOwnPropertySymbols(sourceComponent));
62 }
63
64 var targetStatics = TYPE_STATICS[targetComponent['$$typeof']] || REACT_STATICS;
65 var sourceStatics = TYPE_STATICS[sourceComponent['$$typeof']] || REACT_STATICS;
66
67 for (var i = 0; i < keys.length; ++i) {
68 var key = keys[i];
69 if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
70 var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
71 try {
72 // Avoid failures from read-only properties
73 defineProperty(targetComponent, key, descriptor);
74 } catch (e) {}
75 }
76 }
77
78 return targetComponent;
79 }
80
81 return targetComponent;
82}
83
84module.exports = hoistNonReactStatics;