{"version":3,"file":"props.mjs","sources":["../../../../packages/utils/props.ts"],"sourcesContent":["import { warn } from 'vue'\r\nimport { isObject } from '@vue/shared'\r\nimport fromPairs from 'lodash/fromPairs'\r\nimport type { ExtractPropTypes, PropType } from 'vue'\r\n\r\nconst wrapperKey = Symbol()\r\nexport type PropWrapper<T> = { [wrapperKey]: T }\r\n\r\nexport const propKey = Symbol()\r\n\r\ntype ResolveProp<T> = ExtractPropTypes<{\r\n  key: { type: T; required: true }\r\n}>['key']\r\ntype ResolvePropType<T> = ResolveProp<T> extends { type: infer V }\r\n  ? V\r\n  : ResolveProp<T>\r\ntype ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<\r\n  Array<infer A>\r\n>\r\n  ? ResolvePropType<A[]>\r\n  : ResolvePropType<T>\r\n\r\ntype IfUnknown<T, V> = [unknown] extends [T] ? V : T\r\n\r\nexport type BuildPropOption<T, D extends BuildPropType<T, V, C>, R, V, C> = {\r\n  type?: T\r\n  values?: readonly V[]\r\n  required?: R\r\n  default?: R extends true\r\n    ? never\r\n    : D extends Record<string, unknown> | Array<any>\r\n    ? () => D\r\n    : (() => D) | D\r\n  validator?: ((val: any) => val is C) | ((val: any) => boolean)\r\n}\r\n\r\ntype _BuildPropType<T, V, C> =\r\n  | (T extends PropWrapper<unknown>\r\n      ? T[typeof wrapperKey]\r\n      : [V] extends [never]\r\n      ? ResolvePropTypeWithReadonly<T>\r\n      : never)\r\n  | V\r\n  | C\r\nexport type BuildPropType<T, V, C> = _BuildPropType<\r\n  IfUnknown<T, never>,\r\n  IfUnknown<V, never>,\r\n  IfUnknown<C, never>\r\n>\r\n\r\ntype _BuildPropDefault<T, D> = [T] extends [\r\n  // eslint-disable-next-line @typescript-eslint/ban-types\r\n  Record<string, unknown> | Array<any> | Function\r\n]\r\n  ? D\r\n  : D extends () => T\r\n  ? ReturnType<D>\r\n  : D\r\n\r\nexport type BuildPropDefault<T, D, R> = R extends true\r\n  ? { readonly default?: undefined }\r\n  : {\r\n      readonly default: Exclude<D, undefined> extends never\r\n        ? undefined\r\n        : Exclude<_BuildPropDefault<T, D>, undefined>\r\n    }\r\nexport type BuildPropReturn<T, D, R, V, C> = {\r\n  readonly type: PropType<BuildPropType<T, V, C>>\r\n  readonly required: IfUnknown<R, false>\r\n  readonly validator: ((val: unknown) => boolean) | undefined\r\n  [propKey]: true\r\n} & BuildPropDefault<\r\n  BuildPropType<T, V, C>,\r\n  IfUnknown<D, never>,\r\n  IfUnknown<R, false>\r\n>\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' | 'medium' | number>\r\n  buildProp({\r\n    type: [String, Number],\r\n    values: ['small', 'medium'],\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 function buildProp<\r\n  T = never,\r\n  D extends BuildPropType<T, V, C> = never,\r\n  R extends boolean = false,\r\n  V = never,\r\n  C = never\r\n>(\r\n  option: BuildPropOption<T, D, R, V, C>,\r\n  key?: string\r\n): BuildPropReturn<T, D, R, V, C> {\r\n  // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`)\r\n  if (!isObject(option) || !!option[propKey]) return option as any\r\n\r\n  const { values, required, default: defaultValue, type, validator } = option\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 = [...values, defaultValue]\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(\r\n                val\r\n              )}.`\r\n            )\r\n          }\r\n          return valid\r\n        }\r\n      : undefined\r\n\r\n  return {\r\n    type: typeof type === 'object' && Object.getOwnPropertySymbols(type).includes(wrapperKey) ? type![wrapperKey] : type,\r\n    required: !!required,\r\n    default: defaultValue,\r\n    validator: _validator,\r\n    [propKey]: true,\r\n  } as unknown as BuildPropReturn<T, D, R, V, C>\r\n}\r\n\r\ntype NativePropType = [\r\n  ((...args: any) => any) | { new (...args: any): any } | undefined | null\r\n]\r\n\r\nexport const buildProps = <\r\n  O extends {\r\n    [K in keyof O]: O[K] extends BuildPropReturn<any, any, any, any, any>\r\n      ? O[K]\r\n      : [O[K]] extends NativePropType\r\n      ? O[K]\r\n      : O[K] extends BuildPropOption<\r\n          infer T,\r\n          infer D,\r\n          infer R,\r\n          infer V,\r\n          infer C\r\n        >\r\n      ? D extends BuildPropType<T, V, C>\r\n        ? BuildPropOption<T, D, R, V, C>\r\n        : never\r\n      : never\r\n  }\r\n>(\r\n  props: O\r\n) =>\r\n  fromPairs(\r\n    Object.entries(props).map(([key, option]) => [\r\n      key,\r\n      buildProp(option as any, key),\r\n    ])\r\n  ) as unknown as {\r\n    [K in keyof O]: O[K] extends { [propKey]: boolean }\r\n      ? O[K]\r\n      : [O[K]] extends NativePropType\r\n      ? O[K]\r\n      : O[K] extends BuildPropOption<\r\n          infer T,\r\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n          infer _D,\r\n          infer R,\r\n          infer V,\r\n          infer C\r\n        >\r\n      ? BuildPropReturn<T, O[K]['default'], R, V, C>\r\n      : never\r\n  }\r\n\r\nexport const definePropType = <T>(val: any) =>\r\n  ({ [wrapperKey]: val } as PropWrapper<T>)\r\n\r\n"],"names":[],"mappings":";;;;AAGA,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;AAChB,MAAC,OAAO,GAAG,MAAM,GAAG;AACzB,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;;;;"}