vue-antd-ui
Version:
An enterprise-class UI design language and Vue-based implementation
269 lines (238 loc) • 7.26 kB
JavaScript
import _typeof from 'babel-runtime/helpers/typeof';
import isPlainObject from 'lodash/isPlainObject';
import { toType, getType, isFunction, validateType, isInteger, isArray, warn } from './utils';
var VuePropTypes = {
get any() {
return toType('any', {
type: null
});
},
get func() {
return toType('function', {
type: Function
}).def(currentDefaults.func);
},
get bool() {
return toType('boolean', {
type: Boolean
}).def(currentDefaults.bool);
},
get string() {
return toType('string', {
type: String
}).def(currentDefaults.string);
},
get number() {
return toType('number', {
type: Number
}).def(currentDefaults.number);
},
get array() {
return toType('array', {
type: Array
}).def(currentDefaults.array);
},
get object() {
return toType('object', {
type: Object
}).def(currentDefaults.object);
},
get integer() {
return toType('integer', {
type: Number,
validator: function validator(value) {
return isInteger(value);
}
}).def(currentDefaults.integer);
},
get symbol() {
return toType('symbol', {
type: null,
validator: function validator(value) {
return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'symbol';
}
});
},
custom: function custom(validatorFn) {
var warnMsg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'custom validation failed';
if (typeof validatorFn !== 'function') {
throw new TypeError('[VueTypes error]: You must provide a function as argument');
}
return toType(validatorFn.name || '<<anonymous function>>', {
validator: function validator() {
var valid = validatorFn.apply(undefined, arguments);
if (!valid) warn(this._vueTypes_name + ' - ' + warnMsg);
return valid;
}
});
},
oneOf: function oneOf(arr) {
if (!isArray(arr)) {
throw new TypeError('[VueTypes error]: You must provide an array as argument');
}
var msg = 'oneOf - value should be one of "' + arr.join('", "') + '"';
var allowedTypes = arr.reduce(function (ret, v) {
if (v !== null && v !== undefined) {
ret.indexOf(v.constructor) === -1 && ret.push(v.constructor);
}
return ret;
}, []);
return toType('oneOf', {
type: allowedTypes.length > 0 ? allowedTypes : null,
validator: function validator(value) {
var valid = arr.indexOf(value) !== -1;
if (!valid) warn(msg);
return valid;
}
});
},
instanceOf: function instanceOf(instanceConstructor) {
return toType('instanceOf', {
type: instanceConstructor
});
},
oneOfType: function oneOfType(arr) {
if (!isArray(arr)) {
throw new TypeError('[VueTypes error]: You must provide an array as argument');
}
var hasCustomValidators = false;
var nativeChecks = arr.reduce(function (ret, type, i) {
if (isPlainObject(type)) {
if (type._vueTypes_name === 'oneOf') {
return ret.concat(type.type || []);
}
if (type.type && !isFunction(type.validator)) {
if (isArray(type.type)) return ret.concat(type.type);
ret.push(type.type);
} else if (isFunction(type.validator)) {
hasCustomValidators = true;
}
return ret;
}
ret.push(type);
return ret;
}, []);
if (!hasCustomValidators) {
// we got just native objects (ie: Array, Object)
// delegate to Vue native prop check
return toType('oneOfType', {
type: nativeChecks
}).def(undefined);
}
var typesStr = arr.map(function (type) {
if (type && isArray(type.type)) {
return type.type.map(getType);
}
return getType(type);
}).reduce(function (ret, type) {
return ret.concat(isArray(type) ? type : [type]);
}, []).join('", "');
return this.custom(function oneOfType(value) {
var valid = arr.some(function (type) {
if (type._vueTypes_name === 'oneOf') {
return type.type ? validateType(type.type, value, true) : true;
}
return validateType(type, value, true);
});
if (!valid) warn('oneOfType - value type should be one of "' + typesStr + '"');
return valid;
}).def(undefined);
},
arrayOf: function arrayOf(type) {
return toType('arrayOf', {
type: Array,
validator: function validator(values) {
var valid = values.every(function (value) {
return validateType(type, value);
});
if (!valid) warn('arrayOf - value must be an array of "' + getType(type) + '"');
return valid;
}
});
},
objectOf: function objectOf(type) {
return toType('objectOf', {
type: Object,
validator: function validator(obj) {
var valid = Object.keys(obj).every(function (key) {
return validateType(type, obj[key]);
});
if (!valid) warn('objectOf - value must be an object of "' + getType(type) + '"');
return valid;
}
});
},
shape: function shape(obj) {
var keys = Object.keys(obj);
var requiredKeys = keys.filter(function (key) {
return obj[key] && obj[key].required === true;
});
var type = toType('shape', {
type: Object,
validator: function validator(value) {
var _this = this;
if (!isPlainObject(value)) {
return false;
}
var valueKeys = Object.keys(value);
// check for required keys (if any)
if (requiredKeys.length > 0 && requiredKeys.some(function (req) {
return valueKeys.indexOf(req) === -1;
})) {
warn('shape - at least one of required properties "' + requiredKeys.join('", "') + '" is not present');
return false;
}
return valueKeys.every(function (key) {
if (keys.indexOf(key) === -1) {
if (_this._vueTypes_isLoose === true) return true;
warn('shape - object is missing "' + key + '" property');
return false;
}
var type = obj[key];
return validateType(type, value[key]);
});
}
});
Object.defineProperty(type, '_vueTypes_isLoose', {
enumerable: false,
writable: true,
value: false
});
Object.defineProperty(type, 'loose', {
get: function get() {
this._vueTypes_isLoose = true;
return this;
},
enumerable: false
});
return type;
}
};
var typeDefaults = function typeDefaults() {
return {
func: undefined,
bool: undefined,
string: undefined,
number: undefined,
array: undefined,
object: undefined,
integer: undefined
};
};
var currentDefaults = typeDefaults();
Object.defineProperty(VuePropTypes, 'sensibleDefaults', {
enumerable: false,
set: function set(value) {
if (value === false) {
currentDefaults = {};
} else if (value === true) {
currentDefaults = typeDefaults();
} else if (isPlainObject(value)) {
currentDefaults = value;
}
},
get: function get() {
return currentDefaults;
}
});
export default VuePropTypes;