{"version":3,"file":"props.mjs","sources":["../../../../packages/utils/props.ts"],"sourcesContent":["import { warn } from 'vue'\nimport { isObject } from '@vue/shared'\nimport fromPairs from 'lodash/fromPairs'\nimport type { ExtractPropTypes, PropType } from '@vue/runtime-core'\nimport type { Mutable } from './types'\n\nconst wrapperKey = Symbol()\nexport type PropWrapper = { [wrapperKey]: T }\n\nexport const propKey = '__elPropsReservedKey'\n\ntype ResolveProp = ExtractPropTypes<{\n key: { type: T; required: true }\n}>['key']\ntype ResolvePropType = ResolveProp extends { type: infer V }\n ? V\n : ResolveProp\ntype ResolvePropTypeWithReadonly = Readonly extends Readonly<\n Array\n>\n ? ResolvePropType\n : ResolvePropType\n\ntype IfUnknown = [unknown] extends [T] ? V : T\n\nexport type BuildPropOption, R, V, C> = {\n type?: T\n values?: readonly V[]\n required?: R\n default?: R extends true\n ? never\n : D extends Record | Array\n ? () => D\n : (() => D) | D\n validator?: ((val: any) => val is C) | ((val: any) => boolean)\n}\n\ntype _BuildPropType =\n | (T extends PropWrapper\n ? T[typeof wrapperKey]\n : [V] extends [never]\n ? ResolvePropTypeWithReadonly\n : never)\n | V\n | C\nexport type BuildPropType = _BuildPropType<\n IfUnknown,\n IfUnknown,\n IfUnknown\n>\n\ntype _BuildPropDefault = [T] extends [\n // eslint-disable-next-line @typescript-eslint/ban-types\n Record | Array | Function\n]\n ? D\n : D extends () => T\n ? ReturnType\n : D\n\nexport type BuildPropDefault = R extends true\n ? { readonly default?: undefined }\n : {\n readonly default: Exclude extends never\n ? undefined\n : Exclude<_BuildPropDefault, undefined>\n }\nexport type BuildPropReturn = {\n readonly type: PropType>\n readonly required: IfUnknown\n readonly validator: ((val: unknown) => boolean) | undefined\n [propKey]: true\n} & BuildPropDefault<\n BuildPropType,\n IfUnknown,\n IfUnknown\n>\n\n/**\n * @description Build prop. It can better optimize prop types\n * @description 生成 prop,能更好地优化类型\n * @example\n // limited options\n // the type will be PropType<'light' | 'dark'>\n buildProp({\n type: String,\n values: ['light', 'dark'],\n } as const)\n * @example\n // limited options and other types\n // the type will be PropType<'small' | 'large' | number>\n buildProp({\n type: [String, Number],\n values: ['small', 'large'],\n validator: (val: unknown): val is number => typeof val === 'number',\n } as const)\n @link see more: https://github.com/element-plus/element-plus/pull/3341\n */\nexport function buildProp<\n T = never,\n D extends BuildPropType = never,\n R extends boolean = false,\n V = never,\n C = never\n>(\n option: BuildPropOption,\n key?: string\n): BuildPropReturn {\n // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`)\n if (!isObject(option) || !!option[propKey]) return option as any\n\n const { values, required, default: defaultValue, type, validator } = option\n\n const _validator =\n values || validator\n ? (val: unknown) => {\n let valid = false\n let allowedValues: unknown[] = []\n\n if (values) {\n allowedValues = [...values, defaultValue]\n valid ||= allowedValues.includes(val)\n }\n if (validator) valid ||= validator(val)\n\n if (!valid && allowedValues.length > 0) {\n const allowValuesText = [...new Set(allowedValues)]\n .map((value) => JSON.stringify(value))\n .join(', ')\n warn(\n `Invalid prop: validation failed${\n key ? ` for prop \"${key}\"` : ''\n }. Expected one of [${allowValuesText}], got value ${JSON.stringify(\n val\n )}.`\n )\n }\n return valid\n }\n : undefined\n\n return {\n type:\n typeof type === 'object' &&\n Object.getOwnPropertySymbols(type).includes(wrapperKey)\n ? type[wrapperKey]\n : type,\n required: !!required,\n default: defaultValue,\n validator: _validator,\n [propKey]: true,\n } as unknown as BuildPropReturn\n}\n\ntype NativePropType = [\n ((...args: any) => any) | { new (...args: any): any } | undefined | null\n]\n\nexport const buildProps = <\n O extends {\n [K in keyof O]: O[K] extends BuildPropReturn\n ? O[K]\n : [O[K]] extends NativePropType\n ? O[K]\n : O[K] extends BuildPropOption<\n infer T,\n infer D,\n infer R,\n infer V,\n infer C\n >\n ? D extends BuildPropType\n ? BuildPropOption\n : never\n : never\n }\n>(\n props: O\n) =>\n fromPairs(\n Object.entries(props).map(([key, option]) => [\n key,\n buildProp(option as any, key),\n ])\n ) as unknown as {\n [K in keyof O]: O[K] extends { [propKey]: boolean }\n ? O[K]\n : [O[K]] extends NativePropType\n ? O[K]\n : O[K] extends BuildPropOption<\n infer T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n infer _D,\n infer R,\n infer V,\n infer C\n >\n ? BuildPropReturn\n : never\n }\n\nexport const definePropType = (val: any) =>\n ({ [wrapperKey]: val } as PropWrapper)\n\nexport const keyOf = (arr: T) => Object.keys(arr) as Array\nexport const mutable = >(\n val: T\n) => val as Mutable\n\nexport const componentSize = ['large', 'default', 'small'] as const\n"],"names":[],"mappings":";;;;AAGA,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;AAChB,MAAC,OAAO,GAAG,uBAAuB;AACvC,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;AACvC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5C,IAAI,OAAO,MAAM,CAAC;AAClB,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;AAC9E,EAAE,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,GAAG,CAAC,GAAG,KAAK;AACpD,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC;AACtB,IAAI,IAAI,aAAa,GAAG,EAAE,CAAC;AAC3B,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,CAAC;AAChD,MAAM,KAAK,KAAK,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,KAAK;AACL,IAAI,IAAI,SAAS;AACjB,MAAM,KAAK,KAAK,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,IAAI,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3G,MAAM,IAAI,CAAC,CAAC,+BAA+B,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzJ,KAAK;AACL,IAAI,OAAO,KAAK,CAAC;AACjB,GAAG,GAAG,KAAK,CAAC,CAAC;AACb,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI;AACvH,IAAI,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACxB,IAAI,OAAO,EAAE,YAAY;AACzB,IAAI,SAAS,EAAE,UAAU;AACzB,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,GAAG,CAAC;AACJ,CAAC;AACW,MAAC,UAAU,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK;AAC5F,EAAE,GAAG;AACL,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;AACxB,CAAC,CAAC,EAAE;AACQ,MAAC,cAAc,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,EAAE;AACnD,MAAC,KAAK,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;AACnC,MAAC,OAAO,GAAG,CAAC,GAAG,KAAK,IAAI;AACxB,MAAC,aAAa,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO;;;;"}