/* @flow */ import { tip, hasOwn, isDef, isUndef, hyphenate, formatComponentName } from 'core/util/index' export function extractPropsFromVNodeData ( data: VNodeData, Ctor: Class, tag?: string ): ?Object { // we are only extracting raw values here. // validation and default values are handled in the child // component itself. const propOptions = Ctor.options.props if (isUndef(propOptions)) { return } const res = {} const { attrs, props } = data if (isDef(attrs) || isDef(props)) { for (const key in propOptions) { const altKey = hyphenate(key) if (process.env.NODE_ENV !== 'production') { const keyInLowerCase = key.toLowerCase() if ( key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase) ) { tip( `Prop "${keyInLowerCase}" is passed to component ` + `${formatComponentName(tag || Ctor)}, but the declared prop name is` + ` "${key}". ` + `Note that HTML attributes are case-insensitive and camelCased ` + `props need to use their kebab-case equivalents when using in-DOM ` + `templates. You should probably use "${altKey}" instead of "${key}".` ) } } checkProp(res, props, key, altKey, true) || checkProp(res, attrs, key, altKey, false) } } return res } function checkProp ( res: Object, hash: ?Object, key: string, altKey: string, preserve: boolean ): boolean { if (isDef(hash)) { if (hasOwn(hash, key)) { res[key] = hash[key] if (!preserve) { delete hash[key] } return true } else if (hasOwn(hash, altKey)) { res[key] = hash[altKey] if (!preserve) { delete hash[altKey] } return true } } return false }