var _ = require('./index') /** * Check if an element is a component, if yes return its * component id. * * @param {Element} el * @param {Object} options * @return {String|undefined} */ exports.commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option)$/ exports.checkComponent = function (el, options) { var tag = el.tagName.toLowerCase() if (tag === 'component') { // dynamic syntax var exp = el.getAttribute('is') if (exp != null) { el.removeAttribute('is') } else { exp = el.getAttribute('bind-is') if (exp != null) { // leverage literal dynamic for now. // TODO: make this cleaner exp = '{{' + exp + '}}' el.removeAttribute('bind-is') } } return exp } else if (!exports.commonTagRE.test(tag)) { if (_.resolveAsset(options, 'components', tag)) { return tag } else if (process.env.NODE_ENV !== 'production') { if (tag.indexOf('-') > -1 || /HTMLUnknownElement/.test(Object.prototype.toString.call(el))) { _.warn( 'Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly?' ) } } } /* eslint-disable no-cond-assign */ if (tag = _.attr(el, 'component')) { /* eslint-enable no-cond-assign */ return tag } } /** * Set a prop's initial value on a vm and its data object. * * @param {Vue} vm * @param {Object} prop * @param {*} value */ exports.initProp = function (vm, prop, value) { if (exports.assertProp(prop, value)) { var key = prop.path vm[key] = vm._data[key] = value } } /** * Assert whether a prop is valid. * * @param {Object} prop * @param {*} value */ exports.assertProp = function (prop, value) { // if a prop is not provided and is not required, // skip the check. if (prop.raw === null && !prop.required) { return true } var options = prop.options var type = options.type var valid = true var expectedType if (type) { if (type === String) { expectedType = 'string' valid = typeof value === expectedType } else if (type === Number) { expectedType = 'number' valid = typeof value === 'number' } else if (type === Boolean) { expectedType = 'boolean' valid = typeof value === 'boolean' } else if (type === Function) { expectedType = 'function' valid = typeof value === 'function' } else if (type === Object) { expectedType = 'object' valid = _.isPlainObject(value) } else if (type === Array) { expectedType = 'array' valid = _.isArray(value) } else { valid = value instanceof type } } if (!valid) { process.env.NODE_ENV !== 'production' && _.warn( 'Invalid prop: type check failed for ' + prop.path + '="' + prop.raw + '".' + ' Expected ' + formatType(expectedType) + ', got ' + formatValue(value) + '.' ) return false } var validator = options.validator if (validator) { if (!validator.call(null, value)) { process.env.NODE_ENV !== 'production' && _.warn( 'Invalid prop: custom validator check failed for ' + prop.path + '="' + prop.raw + '"' ) return false } } return true } function formatType (val) { return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type' } function formatValue (val) { return Object.prototype.toString.call(val).slice(8, -1) }