{"version":3,"file":"runtime.mjs","sources":["../../../../src/utils/vue/props/runtime.ts"],"sourcesContent":["import { warn } from 'vue';\r\nimport { fromPairs } from 'lodash-unified';\r\nimport { isObject } from '../../types';\r\nimport { hasOwn } from '../../objects';\r\n\r\nimport type { PropType } from 'vue';\r\nimport type {\r\n  EpProp,\r\n  EpPropConvert,\r\n  EpPropFinalized,\r\n  EpPropInput,\r\n  EpPropMergeType,\r\n  IfEpProp,\r\n  IfNativePropType,\r\n  NativePropType,\r\n} from './types';\r\n\r\nexport const epPropKey = '__epPropKey';\r\n\r\nexport const definePropType = <T>(val: any): PropType<T> => val;\r\n\r\nexport const isEpProp = (val: unknown): val is EpProp<any, any, any> =>\r\n  isObject(val) && !!(val as any)[epPropKey];\r\n\r\n/**\r\n * @description Build prop. It can better optimize prop types\r\n * @description 生成 prop，能更好地优化类型\r\n * @example\r\n  // limited options\r\n  // the type will be PropType<'light' | 'dark'>\r\n  buildProp({\r\n    type: String,\r\n    values: ['light', 'dark'],\r\n  } as const)\r\n  * @example\r\n  // limited options and other types\r\n  // the type will be PropType<'small' | 'large' | number>\r\n  buildProp({\r\n    type: [String, Number],\r\n    values: ['small', 'large'],\r\n    validator: (val: unknown): val is number => typeof val === 'number',\r\n  } as const)\r\n  @link see more: https://github.com/element-plus/element-plus/pull/3341\r\n */\r\nexport const buildProp = <\r\n  Type = never,\r\n  Value = never,\r\n  Validator = never,\r\n  Default extends EpPropMergeType<Type, Value, Validator> = never,\r\n  Required extends boolean = false,\r\n>(\r\n  prop: EpPropInput<Type, Value, Validator, Default, Required>,\r\n  key?: string,\r\n): EpPropFinalized<Type, Value, Validator, Default, Required> => {\r\n  // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`)\r\n  if (!isObject(prop) || isEpProp(prop)) return prop as any;\r\n\r\n  const { values, required, default: defaultValue, type, validator } = prop;\r\n\r\n  const _validator =\r\n    values || validator\r\n      ? (val: unknown) => {\r\n          let valid = false;\r\n          let allowedValues: unknown[] = [];\r\n\r\n          if (values) {\r\n            allowedValues = Array.from(values);\r\n            if (hasOwn(prop, 'default')) {\r\n              allowedValues.push(defaultValue);\r\n            }\r\n            valid ||= allowedValues.includes(val);\r\n          }\r\n          if (validator) valid ||= validator(val);\r\n\r\n          if (!valid && allowedValues.length > 0) {\r\n            const allowValuesText = [...new Set(allowedValues)]\r\n              .map((value) => JSON.stringify(value))\r\n              .join(', ');\r\n            warn(\r\n              `Invalid prop: validation failed${\r\n                key ? ` for prop \"${key}\"` : ''\r\n              }. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`,\r\n            );\r\n          }\r\n          return valid;\r\n        }\r\n      : undefined;\r\n\r\n  const epProp: any = {\r\n    type,\r\n    required: !!required,\r\n    validator: _validator,\r\n    [epPropKey]: true,\r\n  };\r\n  if (hasOwn(prop, 'default')) epProp.default = defaultValue;\r\n  return epProp;\r\n};\r\n\r\nexport const buildProps = <\r\n  Props extends Record<\r\n    string,\r\n    { [epPropKey]: true } | NativePropType | EpPropInput<any, any, any, any, any>\r\n  >,\r\n>(\r\n  props: Props,\r\n): {\r\n  [K in keyof Props]: IfEpProp<\r\n    Props[K],\r\n    Props[K],\r\n    IfNativePropType<Props[K], Props[K], EpPropConvert<Props[K]>>\r\n  >;\r\n} =>\r\n  fromPairs(\r\n    Object.entries(props).map(([key, option]) => [key, buildProp(option as any, key)]),\r\n  ) as any;\r\n"],"names":[],"mappings":";;;;;;AAiBO,MAAM,SAAY,GAAA,cAAA;AAEZ,MAAA,cAAA,GAAiB,CAAI,GAA0B,KAAA,IAAA;AAE/C,MAAA,QAAA,GAAW,CAAC,GACvB,KAAA,QAAA,CAAS,GAAG,CAAK,IAAA,CAAC,CAAE,GAAY,CAAA,SAAA,EAAA;AAsBrB,MAAA,SAAA,GAAY,CAOvB,IAAA,EACA,GAC+D,KAAA;AAE/D,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,SAAS,IAAI,CAAA;AAAG,IAAO,OAAA,IAAA,CAAA;AAE9C,EAAA,MAAM,EAAE,MAAQ,EAAA,QAAA,EAAU,SAAS,YAAc,EAAA,IAAA,EAAM,WAAc,GAAA,IAAA,CAAA;AAErE,EAAA,MAAM,UACJ,GAAA,MAAA,IAAU,SACN,GAAA,CAAC,GAAiB,KAAA;AAChB,IAAA,IAAI,KAAQ,GAAA,KAAA,CAAA;AACZ,IAAA,IAAI,gBAA2B,EAAC,CAAA;AAEhC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAgB,aAAA,GAAA,KAAA,CAAM,KAAK,MAAM,CAAA,CAAA;AACjC,MAAI,IAAA,MAAA,CAAO,IAAM,EAAA,SAAS,CAAG,EAAA;AAC3B,QAAA,aAAA,CAAc,KAAK,YAAY,CAAA,CAAA;AAAA,OACjC;AACA,MAAU,KAAA,KAAA,aAAA,CAAc,SAAS,GAAG,CAAA,CAAA;AAAA,KACtC;AACA,IAAI,IAAA,SAAA;AAAW,MAAA,KAAA,KAAU,UAAU,GAAG,CAAA,CAAA;AAEtC,IAAA,IAAI,CAAC,KAAA,IAAS,aAAc,CAAA,MAAA,GAAS,CAAG,EAAA;AACtC,MAAA,MAAM,kBAAkB,CAAC,GAAG,IAAI,GAAA,CAAI,aAAa,CAAC,CAAA,CAC/C,GAAI,CAAA,CAAC,UAAU,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CACpC,KAAK,IAAI,CAAA,CAAA;AACZ,MAAA,IAAA;AAAA,QACE,CAAA,+BAAA,EACE,MAAM,CAAc,WAAA,EAAA,GAAA,CAAA,CAAA,CAAA,GAAS,wBACT,eAA+B,CAAA,aAAA,EAAA,IAAA,CAAK,UAAU,GAAG,CAAA,CAAA,CAAA,CAAA;AAAA,OACzE,CAAA;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GAET,GAAA,KAAA,CAAA,CAAA;AAEN,EAAA,MAAM,MAAc,GAAA;AAAA,IAClB,IAAA;AAAA,IACA,QAAA,EAAU,CAAC,CAAC,QAAA;AAAA,IACZ,SAAW,EAAA,UAAA;AAAA,IACX,CAAC,SAAY,GAAA,IAAA;AAAA,GACf,CAAA;AACA,EAAI,IAAA,MAAA,CAAO,MAAM,SAAS,CAAA;AAAG,IAAA,MAAA,CAAO,OAAU,GAAA,YAAA,CAAA;AAC9C,EAAO,OAAA,MAAA,CAAA;AACT,EAAA;AAEa,MAAA,UAAA,GAAa,CAMxB,KAQA,KAAA,SAAA;AAAA,EACE,OAAO,OAAQ,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,KAAM,CAAC,GAAK,EAAA,SAAA,CAAU,MAAe,EAAA,GAAG,CAAC,CAAC,CAAA;AACnF;;;;"}