// @flow import * as React from 'react' import { withEmotionCache } from './context' import { ThemeContext } from './theming' import { getRegisteredStyles, insertStyles, registerStyles } from '@emotion/utils' import { hasOwn, isBrowser } from './utils' import { serializeStyles } from '@emotion/serialize' import { getLabelFromStackTrace } from './get-label-from-stack-trace' import { useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks' let typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__' let labelPropName = '__EMOTION_LABEL_PLEASE_DO_NOT_USE__' export const createEmotionProps = (type: React.ElementType, props: Object) => { if ( process.env.NODE_ENV !== 'production' && typeof props.css === 'string' && // check if there is a css declaration props.css.indexOf(':') !== -1 ) { throw new Error( `Strings are not allowed as css prop values, please wrap it in a css template literal from '@emotion/react' like this: css\`${props.css}\`` ) } let newProps: any = {} for (let key in props) { if (hasOwn.call(props, key)) { newProps[key] = props[key] } } newProps[typePropName] = type // For performance, only call getLabelFromStackTrace in development and when // the label hasn't already been computed if ( process.env.NODE_ENV !== 'production' && !!props.css && (typeof props.css !== 'object' || typeof props.css.name !== 'string' || props.css.name.indexOf('-') === -1) ) { const label = getLabelFromStackTrace(new Error().stack) if (label) newProps[labelPropName] = label } return newProps } const Insertion = ({ cache, serialized, isStringTag }) => { registerStyles(cache, serialized, isStringTag) const rules = useInsertionEffectAlwaysWithSyncFallback(() => insertStyles(cache, serialized, isStringTag) ) if (!isBrowser && rules !== undefined) { let serializedNames = serialized.name let next = serialized.next while (next !== undefined) { serializedNames += ' ' + next.name next = next.next } return (