UNPKG

2.8 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3 typeof define === 'function' && define.amd ? define(factory) :
4 (global.hoistNonReactStatics = factory());
5}(this, (function () { 'use strict';
6
7/**
8 * Copyright 2015, Yahoo! Inc.
9 * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
10 */
11var ReactIs = require('react-is');
12var React = require('react');
13var REACT_STATICS = {
14 childContextTypes: true,
15 contextType: true,
16 contextTypes: true,
17 defaultProps: true,
18 displayName: true,
19 getDefaultProps: true,
20 getDerivedStateFromProps: true,
21 mixins: true,
22 propTypes: true,
23 type: true
24};
25
26var KNOWN_STATICS = {
27 name: true,
28 length: true,
29 prototype: true,
30 caller: true,
31 callee: true,
32 arguments: true,
33 arity: true
34};
35
36var FORWARD_REF_STATICS = {
37 '$$typeof': true,
38 render: true
39};
40
41var TYPE_STATICS = {};
42TYPE_STATICS[ReactIs.ForwardRef] = FORWARD_REF_STATICS;
43
44var defineProperty = Object.defineProperty;
45var getOwnPropertyNames = Object.getOwnPropertyNames;
46var getOwnPropertySymbols = Object.getOwnPropertySymbols;
47var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
48var getPrototypeOf = Object.getPrototypeOf;
49var objectPrototype = Object.prototype;
50
51function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
52 if (typeof sourceComponent !== 'string') {
53 // don't hoist over string (html) components
54
55 if (objectPrototype) {
56 var inheritedComponent = getPrototypeOf(sourceComponent);
57 if (inheritedComponent && inheritedComponent !== objectPrototype) {
58 hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
59 }
60 }
61
62 var keys = getOwnPropertyNames(sourceComponent);
63
64 if (getOwnPropertySymbols) {
65 keys = keys.concat(getOwnPropertySymbols(sourceComponent));
66 }
67
68 var targetStatics = TYPE_STATICS[targetComponent['$$typeof']] || REACT_STATICS;
69 var sourceStatics = TYPE_STATICS[sourceComponent['$$typeof']] || REACT_STATICS;
70
71 for (var i = 0; i < keys.length; ++i) {
72 var key = keys[i];
73 if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
74 var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
75 try {
76 // Avoid failures from read-only properties
77 defineProperty(targetComponent, key, descriptor);
78 } catch (e) {}
79 }
80 }
81
82 return targetComponent;
83 }
84
85 return targetComponent;
86}
87
88return hoistNonReactStatics;
89
90})));