UNPKG

element-plus

Version:

A Component Library for Vue 3

60 lines (58 loc) 2.13 kB
import { isObject } from "../../types.mjs"; import { hasOwn } from "../../objects.mjs"; import { fromPairs } from "lodash-unified"; import { warn } from "vue"; //#region ../../packages/utils/vue/props/runtime.ts const epPropKey = "__epPropKey"; const definePropType = (val) => val; const isEpProp = (val) => isObject(val) && !!val[epPropKey]; /** * @description Build prop. It can better optimize prop types * @description 生成 prop,能更好地优化类型 * @example // limited options // the type will be PropType<'light' | 'dark'> buildProp({ type: String, values: ['light', 'dark'], } as const) * @example // limited options and other types // the type will be PropType<'small' | 'large' | number> buildProp({ type: [String, Number], values: ['small', 'large'], validator: (val: unknown): val is number => typeof val === 'number', } as const) @link see more: https://github.com/element-plus/element-plus/pull/3341 */ const buildProp = (prop, key) => { if (!isObject(prop) || isEpProp(prop)) return prop; const { values, required, default: defaultValue, type, validator } = prop; const epProp = { type, required: !!required, validator: values || validator ? (val) => { let valid = false; let allowedValues = []; if (values) { allowedValues = Array.from(values); if (hasOwn(prop, "default")) allowedValues.push(defaultValue); valid ||= allowedValues.includes(val); } if (validator) valid ||= validator(val); if (!valid && allowedValues.length > 0) { const allowValuesText = [...new Set(allowedValues)].map((value) => JSON.stringify(value)).join(", "); warn(`Invalid prop: validation failed${key ? ` for prop "${key}"` : ""}. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`); } return valid; } : void 0, [epPropKey]: true }; if (hasOwn(prop, "default")) epProp.default = defaultValue; return epProp; }; const buildProps = (props) => fromPairs(Object.entries(props).map(([key, option]) => [key, buildProp(option, key)])); //#endregion export { buildProp, buildProps, definePropType, epPropKey, isEpProp }; //# sourceMappingURL=runtime.mjs.map