mirror of
https://github.com/idanoo/GoScrobble.git
synced 2024-11-25 09:55:15 +00:00
61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
|
import { ForwardRef, Memo } from 'react-is'; // Simplified polyfill for IE 11 support
|
||
|
// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3
|
||
|
|
||
|
const fnNameMatchRegex = /^\s*function(?:\s|\s*\/\*.*\*\/\s*)+([^(\s/]*)\s*/;
|
||
|
export function getFunctionName(fn) {
|
||
|
const match = `${fn}`.match(fnNameMatchRegex);
|
||
|
const name = match && match[1];
|
||
|
return name || '';
|
||
|
}
|
||
|
/**
|
||
|
* @param {function} Component
|
||
|
* @param {string} fallback
|
||
|
* @returns {string | undefined}
|
||
|
*/
|
||
|
|
||
|
function getFunctionComponentName(Component, fallback = '') {
|
||
|
return Component.displayName || Component.name || getFunctionName(Component) || fallback;
|
||
|
}
|
||
|
|
||
|
function getWrappedName(outerType, innerType, wrapperName) {
|
||
|
const functionName = getFunctionComponentName(innerType);
|
||
|
return outerType.displayName || (functionName !== '' ? `${wrapperName}(${functionName})` : wrapperName);
|
||
|
}
|
||
|
/**
|
||
|
* cherry-pick from
|
||
|
* https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js
|
||
|
* originally forked from recompose/getDisplayName with added IE 11 support
|
||
|
*
|
||
|
* @param {React.ReactType} Component
|
||
|
* @returns {string | undefined}
|
||
|
*/
|
||
|
|
||
|
|
||
|
export default function getDisplayName(Component) {
|
||
|
if (Component == null) {
|
||
|
return undefined;
|
||
|
}
|
||
|
|
||
|
if (typeof Component === 'string') {
|
||
|
return Component;
|
||
|
}
|
||
|
|
||
|
if (typeof Component === 'function') {
|
||
|
return getFunctionComponentName(Component, 'Component');
|
||
|
}
|
||
|
|
||
|
if (typeof Component === 'object') {
|
||
|
switch (Component.$$typeof) {
|
||
|
case ForwardRef:
|
||
|
return getWrappedName(Component, Component.render, 'ForwardRef');
|
||
|
|
||
|
case Memo:
|
||
|
return getWrappedName(Component, Component.type, 'memo');
|
||
|
|
||
|
default:
|
||
|
return undefined;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return undefined;
|
||
|
}
|