39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import * as React from 'react'
|
|
import isPropValid from '@emotion/is-prop-valid'
|
|
import { StyledOptions, ElementType } from './types'
|
|
|
|
const testOmitPropsOnStringTag = isPropValid
|
|
const testOmitPropsOnComponent = (key: string) => key !== 'theme'
|
|
|
|
export const getDefaultShouldForwardProp = (tag: React.ElementType) =>
|
|
typeof tag === 'string' &&
|
|
// 96 is one less than the char code
|
|
// for "a" so this is checking that
|
|
// it's a lowercase character
|
|
tag.charCodeAt(0) > 96
|
|
? testOmitPropsOnStringTag
|
|
: testOmitPropsOnComponent
|
|
|
|
export const composeShouldForwardProps = (
|
|
tag: ElementType,
|
|
options: StyledOptions | undefined,
|
|
isReal: boolean
|
|
) => {
|
|
let shouldForwardProp
|
|
if (options) {
|
|
const optionsShouldForwardProp = options.shouldForwardProp
|
|
shouldForwardProp =
|
|
tag.__emotion_forwardProp && optionsShouldForwardProp
|
|
? (propName: string) =>
|
|
tag.__emotion_forwardProp!(propName) &&
|
|
optionsShouldForwardProp(propName)
|
|
: optionsShouldForwardProp
|
|
}
|
|
|
|
if (typeof shouldForwardProp !== 'function' && isReal) {
|
|
shouldForwardProp = tag.__emotion_forwardProp
|
|
}
|
|
|
|
return shouldForwardProp
|
|
}
|