/* @flow */ import config from 'core/config' import { warn, isObject, toObject, isReservedAttribute, camelize, hyphenate } from 'core/util/index' /** * Runtime helper for merging v-bind="object" into a VNode's data. */ export function bindObjectProps ( data: any, tag: string, value: any, asProp: boolean, isSync?: boolean ): VNodeData { if (value) { if (!isObject(value)) { process.env.NODE_ENV !== 'production' && warn( 'v-bind without argument expects an Object or Array value', this ) } else { if (Array.isArray(value)) { value = toObject(value) } let hash for (const key in value) { if ( key === 'class' || key === 'style' || isReservedAttribute(key) ) { hash = data } else { const type = data.attrs && data.attrs.type hash = asProp || config.mustUseProp(tag, type, key) ? data.domProps || (data.domProps = {}) : data.attrs || (data.attrs = {}) } const camelizedKey = camelize(key) const hyphenatedKey = hyphenate(key) if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) { hash[key] = value[key] if (isSync) { const on = data.on || (data.on = {}) on[`update:${key}`] = function ($event) { value[key] = $event } } } } } } return data }