{"version":3,"file":"useSelect.mjs","names":["isUndefined"],"sources":["../../../../../../packages/components/select-v2/src/useSelect.ts"],"sourcesContent":["import {\n  computed,\n  nextTick,\n  onMounted,\n  reactive,\n  ref,\n  useSlots,\n  watch,\n  watchEffect,\n} from 'vue'\nimport { findLastIndex, get, isEqual } from 'lodash-unified'\nimport { useDebounceFn, useResizeObserver } from '@vueuse/core'\nimport {\n  NOOP,\n  ValidateComponentsMap,\n  debugWarn,\n  escapeStringRegexp,\n  getEventCode,\n  isArray,\n  isEmpty,\n  isFunction,\n  isNumber,\n  isObject,\n  isUndefined,\n  rAF,\n} from '@element-plus/utils'\nimport {\n  useComposition,\n  useEmptyValues,\n  useFocusController,\n  useLocale,\n  useNamespace,\n} from '@element-plus/hooks'\nimport {\n  CHANGE_EVENT,\n  EVENT_CODE,\n  MINIMUM_INPUT_WIDTH,\n  UPDATE_MODEL_EVENT,\n} from '@element-plus/constants'\nimport {\n  useFormDisabled,\n  useFormItem,\n  useFormItemInputId,\n  useFormSize,\n} from '@element-plus/components/form'\nimport { useAllowCreate } from './useAllowCreate'\nimport { useProps } from './useProps'\n\nimport type { Option, OptionType, SelectStates } from './select.types'\nimport type { SelectV2Props } from './token'\nimport type { SelectV2EmitFn } from './defaults'\nimport type { ScrollbarDirection } from '@element-plus/components/scrollbar'\nimport type { TooltipInstance } from '@element-plus/components/tooltip'\nimport type { SelectDropdownInstance } from './select-dropdown'\n\nconst useSelect = (props: SelectV2Props, emit: SelectV2EmitFn) => {\n  // inject\n  const { t } = useLocale()\n  const slots = useSlots()\n  const nsSelect = useNamespace('select')\n  const nsInput = useNamespace('input')\n  const { form: elForm, formItem: elFormItem } = useFormItem()\n  const { inputId } = useFormItemInputId(props, {\n    formItemContext: elFormItem,\n  })\n  const { aliasProps, getLabel, getValue, getDisabled, getOptions } =\n    useProps(props)\n  const { valueOnClear, isEmptyValue } = useEmptyValues(props)\n\n  const states: SelectStates = reactive({\n    inputValue: '',\n    cachedOptions: [],\n    createdOptions: [],\n    hoveringIndex: -1,\n    inputHovering: false,\n    collapseItemWidth: 0,\n    previousQuery: null,\n    previousValue: undefined,\n    selectedLabel: '',\n    menuVisibleOnFocus: false,\n    isBeforeHide: false,\n  })\n\n  // data refs\n  const popperSize = ref(-1)\n  const debouncing = ref(false)\n\n  // DOM & Component refs\n  const selectRef = ref<HTMLElement>()\n  const selectionRef = ref<HTMLElement>()\n  const tooltipRef = ref<TooltipInstance>()\n  const tagTooltipRef = ref<TooltipInstance>()\n  const inputRef = ref<HTMLElement>()\n  const prefixRef = ref<HTMLElement>()\n  const suffixRef = ref<HTMLElement>()\n  const menuRef = ref<SelectDropdownInstance>()\n  const tagMenuRef = ref<HTMLElement>()\n  const collapseItemRef = ref<HTMLElement>()\n\n  const {\n    isComposing,\n    handleCompositionStart,\n    handleCompositionEnd,\n    handleCompositionUpdate,\n  } = useComposition({\n    afterComposition: (e) => onInput(e),\n  })\n\n  const selectDisabled = useFormDisabled()\n\n  const { wrapperRef, isFocused, handleBlur } = useFocusController(inputRef, {\n    disabled: selectDisabled,\n    afterFocus() {\n      if (props.automaticDropdown && !expanded.value) {\n        expanded.value = true\n        states.menuVisibleOnFocus = true\n      }\n    },\n    beforeBlur(event) {\n      return (\n        tooltipRef.value?.isFocusInsideContent(event) ||\n        tagTooltipRef.value?.isFocusInsideContent(event)\n      )\n    },\n    afterBlur() {\n      expanded.value = false\n      states.menuVisibleOnFocus = false\n      if (props.validateEvent) {\n        elFormItem?.validate?.('blur').catch(NOOP)\n      }\n    },\n  })\n\n  const allOptions = computed(() => filterOptions(''))\n\n  const hasOptions = computed(() => {\n    if (props.loading) return false\n    return props.options.length > 0 || states.createdOptions.length > 0\n  })\n\n  const filteredOptions = ref<OptionType[]>([])\n  // the controller of the expanded popup\n  const expanded = ref(false)\n\n  const needStatusIcon = computed(() => elForm?.statusIcon ?? false)\n\n  const popupHeight = computed(() => {\n    const totalHeight = filteredOptions.value.length * props.itemHeight\n    return totalHeight > props.height ? props.height : totalHeight\n  })\n\n  const hasModelValue = computed(() => {\n    return props.multiple\n      ? isArray(props.modelValue) && props.modelValue.length > 0\n      : !isEmptyValue(props.modelValue)\n  })\n\n  const showClearBtn = computed(() => {\n    return (\n      props.clearable &&\n      !selectDisabled.value &&\n      hasModelValue.value &&\n      (isFocused.value || states.inputHovering)\n    )\n  })\n\n  const iconComponent = computed(() =>\n    props.remote && props.filterable && !props.remoteShowSuffix\n      ? ''\n      : props.suffixIcon\n  )\n\n  const iconReverse = computed(\n    () => iconComponent.value && nsSelect.is('reverse', expanded.value)\n  )\n\n  const validateState = computed(() => elFormItem?.validateState || '')\n  const validateIcon = computed(() => {\n    // When we use indexed access to get the type of an undeclared property,\n    // the unsafe type `any` will be inferred, which TypeScript throws an error to emphasize it.\n    // To avoid TypeScript complaining about it, we use truthiness narrowing to narrow the type of validateState.\n    if (!validateState.value) return\n    return ValidateComponentsMap[validateState.value]\n  })\n\n  const debounce = computed(() => (props.remote ? props.debounce : 0))\n\n  const isRemoteSearchEmpty = computed(\n    () => props.remote && !states.inputValue && !hasOptions.value\n  )\n\n  // filteredOptions includes flatten the data into one dimensional array.\n  const emptyText = computed(() => {\n    if (props.loading) {\n      return props.loadingText || t('el.select.loading')\n    } else {\n      if (\n        props.filterable &&\n        states.inputValue &&\n        hasOptions.value &&\n        filteredOptions.value.length === 0\n      ) {\n        return props.noMatchText || t('el.select.noMatch')\n      }\n      if (!hasOptions.value) {\n        return props.noDataText || t('el.select.noData')\n      }\n    }\n    return null\n  })\n\n  const isFilterMethodValid = computed(\n    () => props.filterable && isFunction(props.filterMethod)\n  )\n  const isRemoteMethodValid = computed(\n    () => props.filterable && props.remote && isFunction(props.remoteMethod)\n  )\n\n  const filterOptions = (query: string) => {\n    const regexp = new RegExp(escapeStringRegexp(query), 'i')\n\n    const isValidOption = (o: Option): boolean => {\n      if (isFilterMethodValid.value || isRemoteMethodValid.value) return true\n      // when query was given, we should test on the label see whether the label contains the given query\n      return query ? regexp.test(getLabel(o) || '') : true\n    }\n    if (props.loading) {\n      return []\n    }\n\n    return [...states.createdOptions, ...props.options].reduce((all, item) => {\n      const options = getOptions(item)\n\n      if (isArray(options)) {\n        const filtered = options.filter(isValidOption)\n\n        if (filtered.length > 0) {\n          all.push(\n            {\n              label: getLabel(item),\n              type: 'Group',\n            },\n            ...filtered\n          )\n        }\n      } else if (props.remote || isValidOption(item)) {\n        all.push(item)\n      }\n\n      return all\n    }, []) as OptionType[]\n  }\n\n  const updateOptions = () => {\n    filteredOptions.value = filterOptions(states.inputValue)\n  }\n\n  const allOptionsValueMap = computed(() => {\n    const valueMap = new Map()\n\n    allOptions.value.forEach((option, index) => {\n      valueMap.set(getValueKey(getValue(option)), { option, index })\n    })\n    return valueMap\n  })\n\n  const filteredOptionsValueMap = computed(() => {\n    const valueMap = new Map()\n\n    filteredOptions.value.forEach((option, index) => {\n      valueMap.set(getValueKey(getValue(option)), { option, index })\n    })\n    return valueMap\n  })\n\n  const optionsAllDisabled = computed(() =>\n    filteredOptions.value.every((option) => getDisabled(option))\n  )\n\n  const selectSize = useFormSize()\n\n  const collapseTagSize = computed(() =>\n    'small' === selectSize.value ? 'small' : 'default'\n  )\n\n  const calculatePopperSize = () => {\n    if (isNumber(props.fitInputWidth)) {\n      popperSize.value = props.fitInputWidth\n      return\n    }\n    const width = selectRef.value?.offsetWidth || 200\n    if (!props.fitInputWidth && hasOptions.value) {\n      nextTick(() => {\n        popperSize.value = Math.max(width, calculateLabelMaxWidth())\n      })\n    } else {\n      popperSize.value = width\n    }\n  }\n\n  // TODO Caching implementation\n  // 1. There is no need to calculate options that have already been calculated\n  // 2. Repeatedly expand and close when persistent is set to false, no need for repeated calculations\n  const calculateLabelMaxWidth = () => {\n    const canvas = document.createElement('canvas')\n    const ctx = canvas.getContext('2d')\n    const selector = nsSelect.be('dropdown', 'item')\n    const dom = menuRef.value?.listRef?.innerRef || document\n    const dropdownItemEl = dom.querySelector(`.${selector}`)\n    if (dropdownItemEl === null || ctx === null) return 0\n    const style = getComputedStyle(dropdownItemEl)\n    const padding =\n      Number.parseFloat(style.paddingLeft) +\n      Number.parseFloat(style.paddingRight)\n    ctx.font = `bold ${style.font.replace(\n      new RegExp(`\\\\b${style.fontWeight}\\\\b`),\n      ''\n    )}`\n    const maxWidth = filteredOptions.value.reduce((max, option) => {\n      const metrics = ctx.measureText(getLabel(option))\n      return Math.max(metrics.width, max)\n    }, 0)\n    return maxWidth + padding\n  }\n\n  const getGapWidth = () => {\n    if (!selectionRef.value) return 0\n    const style = window.getComputedStyle(selectionRef.value)\n    return Number.parseFloat(style.gap || '6px')\n  }\n\n  // computed style\n  const tagStyle = computed(() => {\n    const gapWidth = getGapWidth()\n    const inputSlotWidth =\n      props.filterable && !selectDisabled.value\n        ? gapWidth + MINIMUM_INPUT_WIDTH\n        : 0\n    const collapseSlotWidth =\n      collapseItemRef.value && props.maxCollapseTags === 1\n        ? states.collapseItemWidth + gapWidth\n        : 0\n    const reservedWidth = inputSlotWidth + collapseSlotWidth\n    return { maxWidth: `calc(100% - ${reservedWidth}px)` }\n  })\n\n  const shouldShowPlaceholder = computed(() => {\n    if (isArray(props.modelValue)) {\n      return props.modelValue.length === 0 && !states.inputValue\n    }\n\n    // when it's not multiple mode, we only determine this flag based on filterable and expanded\n    // when filterable flag is true, which means we have input box on the screen\n    return props.filterable ? !states.inputValue : true\n  })\n\n  const currentPlaceholder = computed(() => {\n    const _placeholder = props.placeholder ?? t('el.select.placeholder')\n    return props.multiple || !hasModelValue.value\n      ? _placeholder\n      : states.selectedLabel\n  })\n\n  // this obtains the actual popper DOM element.\n  const popperRef = computed(() => tooltipRef.value?.popperRef?.contentRef)\n\n  // the index with current value in options\n  const indexRef = computed<number>(() => {\n    if (props.multiple) {\n      const len = (props.modelValue as []).length\n      if (\n        len > 0 &&\n        filteredOptionsValueMap.value.has(props.modelValue[len - 1])\n      ) {\n        const { index } = filteredOptionsValueMap.value.get(\n          props.modelValue[len - 1]\n        )\n        return index\n      }\n    } else {\n      if (\n        !isEmptyValue(props.modelValue) &&\n        filteredOptionsValueMap.value.has(props.modelValue)\n      ) {\n        const { index } = filteredOptionsValueMap.value.get(props.modelValue)\n        return index\n      }\n    }\n    return -1\n  })\n\n  const dropdownMenuVisible = computed({\n    get() {\n      return (\n        expanded.value &&\n        (props.loading ||\n          !isRemoteSearchEmpty.value ||\n          (props.remote && !!slots.empty)) &&\n        (!debouncing.value ||\n          !isEmpty(states.previousQuery) ||\n          hasOptions.value)\n      )\n    },\n    set(val: boolean) {\n      expanded.value = val\n    },\n  })\n\n  const showTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.cachedOptions.slice(0, props.maxCollapseTags)\n      : states.cachedOptions\n  })\n\n  const collapseTagList = computed(() => {\n    if (!props.multiple) {\n      return []\n    }\n    return props.collapseTags\n      ? states.cachedOptions.slice(props.maxCollapseTags)\n      : []\n  })\n\n  // hooks\n  const {\n    createNewOption,\n    removeNewOption,\n    selectNewOption,\n    clearAllNewOption,\n  } = useAllowCreate(props, states)\n\n  // methods\n  const toggleMenu = (event?: Event) => {\n    if (\n      selectDisabled.value ||\n      (props.filterable &&\n        expanded.value &&\n        event &&\n        !suffixRef.value?.contains(event.target as Node))\n    )\n      return\n\n    if (states.menuVisibleOnFocus) {\n      // controlled by automaticDropdown\n      states.menuVisibleOnFocus = false\n    } else {\n      expanded.value = !expanded.value\n    }\n  }\n\n  const onInputChange = () => {\n    if (states.inputValue.length > 0 && !expanded.value) {\n      expanded.value = true\n    }\n    createNewOption(states.inputValue)\n    nextTick(() => {\n      handleQueryChange(states.inputValue)\n    })\n  }\n\n  const debouncedOnInputChange = useDebounceFn(() => {\n    onInputChange()\n    debouncing.value = false\n  }, debounce)\n\n  const handleQueryChange = (val: string) => {\n    if (states.previousQuery === val || isComposing.value) {\n      return\n    }\n    states.previousQuery = val\n    if (props.filterable && isFunction(props.filterMethod)) {\n      props.filterMethod(val)\n    } else if (\n      props.filterable &&\n      props.remote &&\n      isFunction(props.remoteMethod)\n    ) {\n      props.remoteMethod(val)\n    }\n    if (\n      props.defaultFirstOption &&\n      (props.filterable || props.remote) &&\n      filteredOptions.value.length\n    ) {\n      nextTick(checkDefaultFirstOption)\n    } else {\n      nextTick(updateHoveringIndex)\n    }\n  }\n\n  /**\n   * find and highlight first option as default selected\n   * @remark\n   * - if the first option in dropdown list is user-created,\n   *   it would be at the end of the optionsArray\n   *   so find it and set hover.\n   *   (NOTE: there must be only one user-created option in dropdown list with query)\n   * - if there's no user-created option in list, just find the first one as usual\n   *   (NOTE: exclude options that are disabled or in disabled-group)\n   */\n  const checkDefaultFirstOption = () => {\n    const optionsInDropdown = filteredOptions.value.filter(\n      (n) => !n.disabled && n.type !== 'Group'\n    )\n    const userCreatedOption = optionsInDropdown.find((n) => n.created)\n    const firstOriginOption = optionsInDropdown[0]\n    states.hoveringIndex = getValueIndex(\n      filteredOptions.value,\n      userCreatedOption || firstOriginOption\n    )\n  }\n\n  const emitChange = (val: any | any[]) => {\n    if (!isEqual(props.modelValue, val)) {\n      emit(CHANGE_EVENT, val)\n    }\n  }\n\n  const update = (val: any) => {\n    emit(UPDATE_MODEL_EVENT, val)\n    emitChange(val)\n    states.previousValue = props.multiple ? String(val) : val\n\n    nextTick(() => {\n      if (props.multiple && isArray(props.modelValue)) {\n        const cachedOptions = states.cachedOptions.slice()\n        const selectedOptions = props.modelValue.map((value) =>\n          getOption(value, cachedOptions)\n        )\n\n        if (!isEqual(states.cachedOptions, selectedOptions)) {\n          states.cachedOptions = selectedOptions\n        }\n      } else {\n        initStates(true)\n      }\n    })\n  }\n\n  const getValueIndex = (arr: unknown[] = [], value: unknown) => {\n    if (!isObject(value)) {\n      return arr.indexOf(value)\n    }\n    const valueKey = props.valueKey\n    let index = -1\n    arr.some((item, i) => {\n      if (get(item, valueKey) === get(value, valueKey)) {\n        index = i\n        return true\n      }\n      return false\n    })\n    return index\n  }\n\n  const getValueKey = (item: unknown) => {\n    return isObject(item) ? get(item, props.valueKey) : item\n  }\n\n  const handleResize = () => {\n    calculatePopperSize()\n  }\n\n  const onEndReached = (direction: ScrollbarDirection) => {\n    emit('end-reached', direction)\n  }\n\n  const resetCollapseItemWidth = () => {\n    states.collapseItemWidth =\n      collapseItemRef.value!.getBoundingClientRect().width\n  }\n\n  const updateTooltip = () => {\n    tooltipRef.value?.updatePopper?.()\n  }\n\n  const updateTagTooltip = () => {\n    tagTooltipRef.value?.updatePopper?.()\n  }\n\n  const onSelect = (option: Option) => {\n    const optionValue = getValue(option)\n\n    if (props.multiple) {\n      let selectedOptions = (props.modelValue as any[]).slice()\n\n      const index = getValueIndex(selectedOptions, optionValue)\n      if (index > -1) {\n        selectedOptions = [\n          ...selectedOptions.slice(0, index),\n          ...selectedOptions.slice(index + 1),\n        ]\n        states.cachedOptions.splice(index, 1)\n        removeNewOption(option)\n      } else if (\n        props.multipleLimit <= 0 ||\n        selectedOptions.length < props.multipleLimit\n      ) {\n        selectedOptions = [...selectedOptions, optionValue]\n        states.cachedOptions.push(option)\n        selectNewOption(option)\n      }\n      update(selectedOptions)\n      if (option.created) {\n        handleQueryChange('')\n      }\n      if (props.filterable && (option.created || !props.reserveKeyword)) {\n        states.inputValue = ''\n      }\n    } else {\n      states.selectedLabel = getLabel(option)\n      !isEqual(props.modelValue, optionValue) && update(optionValue)\n      expanded.value = false\n      selectNewOption(option)\n      if (!option.created) {\n        clearAllNewOption()\n      }\n    }\n    focus()\n  }\n\n  const deleteTag = (event: MouseEvent, option: Option) => {\n    let selectedOptions = (props.modelValue as any[]).slice()\n\n    const index = getValueIndex(selectedOptions, getValue(option))\n\n    if (index > -1 && !selectDisabled.value) {\n      selectedOptions = [\n        ...(props.modelValue as Array<unknown>).slice(0, index),\n        ...(props.modelValue as Array<unknown>).slice(index + 1),\n      ]\n      states.cachedOptions.splice(index, 1)\n      update(selectedOptions)\n      emit('remove-tag', getValue(option))\n      removeNewOption(option)\n    }\n    event.stopPropagation()\n    focus()\n  }\n\n  const focus = () => {\n    inputRef.value?.focus()\n  }\n\n  const blur = () => {\n    if (expanded.value) {\n      expanded.value = false\n      nextTick(() => inputRef.value?.blur())\n      return\n    }\n    inputRef.value?.blur()\n  }\n\n  // keyboard handlers\n  const handleEsc = () => {\n    if (states.inputValue.length > 0) {\n      states.inputValue = ''\n    } else {\n      expanded.value = false\n    }\n  }\n\n  const getLastNotDisabledIndex = (value: unknown[]) =>\n    findLastIndex(\n      value,\n      (it) =>\n        !states.cachedOptions.some(\n          (option) => getValue(option) === it && getDisabled(option)\n        )\n    )\n\n  const handleDel = (e: KeyboardEvent) => {\n    const code = getEventCode(e)\n    if (!props.multiple) return\n    if (code === EVENT_CODE.delete) return\n    if (states.inputValue.length === 0) {\n      e.preventDefault()\n      const selected = (props.modelValue as Array<any>).slice()\n      const lastNotDisabledIndex = getLastNotDisabledIndex(selected)\n      if (lastNotDisabledIndex < 0) return\n      const removeTagValue = selected[lastNotDisabledIndex]\n      selected.splice(lastNotDisabledIndex, 1)\n      const option = states.cachedOptions[lastNotDisabledIndex]\n      states.cachedOptions.splice(lastNotDisabledIndex, 1)\n      removeNewOption(option)\n      update(selected)\n      emit('remove-tag', removeTagValue)\n    }\n  }\n\n  const handleClear = () => {\n    let emptyValue: string | any[]\n    if (isArray(props.modelValue)) {\n      emptyValue = []\n    } else {\n      emptyValue = valueOnClear.value\n    }\n\n    states.selectedLabel = ''\n\n    expanded.value = false\n    update(emptyValue)\n    emit('clear')\n    clearAllNewOption()\n    focus()\n  }\n\n  const onKeyboardNavigate = (\n    direction: 'forward' | 'backward',\n    hoveringIndex: number | undefined = undefined\n  ): void => {\n    const options = filteredOptions.value\n    if (\n      !['forward', 'backward'].includes(direction) ||\n      selectDisabled.value ||\n      options.length <= 0 ||\n      optionsAllDisabled.value ||\n      isComposing.value\n    ) {\n      return\n    }\n    if (!expanded.value) {\n      return toggleMenu()\n    }\n    if (isUndefined(hoveringIndex)) {\n      hoveringIndex = states.hoveringIndex\n    }\n    let newIndex = -1\n    if (direction === 'forward') {\n      newIndex = hoveringIndex + 1\n      if (newIndex >= options.length) {\n        // return to the first option\n        newIndex = 0\n      }\n    } else if (direction === 'backward') {\n      newIndex = hoveringIndex - 1\n      if (newIndex < 0 || newIndex >= options.length) {\n        // navigate to the last one\n        newIndex = options.length - 1\n      }\n    }\n    const option = options[newIndex]\n    if (getDisabled(option) || option.type === 'Group') {\n      // prevent dispatching multiple nextTick callbacks.\n      return onKeyboardNavigate(direction, newIndex)\n    } else {\n      states.hoveringIndex = newIndex\n      scrollToItem(newIndex)\n    }\n  }\n\n  const onKeyboardSelect = () => {\n    if (!expanded.value) {\n      return toggleMenu()\n    } else if (\n      ~states.hoveringIndex &&\n      filteredOptions.value[states.hoveringIndex]\n    ) {\n      onSelect(filteredOptions.value[states.hoveringIndex])\n    }\n  }\n\n  const onHoverOption = (idx?: number) => {\n    states.hoveringIndex = idx ?? -1\n  }\n\n  const updateHoveringIndex = () => {\n    if (!props.multiple) {\n      states.hoveringIndex = filteredOptions.value.findIndex((item) => {\n        return getValueKey(getValue(item)) === getValueKey(props.modelValue)\n      })\n    } else {\n      const length = props.modelValue.length\n      if (length > 0) {\n        const lastValue = props.modelValue[length - 1]\n        states.hoveringIndex = filteredOptions.value.findIndex(\n          (item) => getValueKey(lastValue) === getValueKey(getValue(item))\n        )\n      } else {\n        states.hoveringIndex = -1\n      }\n    }\n  }\n\n  const onInput = (event: Event) => {\n    states.inputValue = (event.target as HTMLInputElement).value\n    if (props.remote) {\n      debouncing.value = true\n      debouncedOnInputChange()\n    } else {\n      return onInputChange()\n    }\n  }\n\n  const handleClickOutside = (event: Event) => {\n    expanded.value = false\n\n    if (isFocused.value) {\n      const _event = new FocusEvent('blur', event)\n      handleBlur(_event)\n    }\n  }\n\n  const handleMenuEnter = () => {\n    states.isBeforeHide = false\n    return nextTick(() => {\n      if (~indexRef.value) {\n        scrollToItem(indexRef.value)\n      }\n    })\n  }\n\n  const scrollToItem = (index: number) => {\n    menuRef.value!.scrollToItem(index)\n  }\n\n  const getOption = (value: unknown, cachedOptions?: Option[]) => {\n    // match the option with the given value, if not found, create a new option\n    const selectValue = getValueKey(value)\n\n    if (allOptionsValueMap.value.has(selectValue)) {\n      const { option } = allOptionsValueMap.value.get(selectValue)\n\n      return option\n    }\n    if (cachedOptions && cachedOptions.length) {\n      const option = cachedOptions.find(\n        (option) => getValueKey(getValue(option)) === selectValue\n      )\n      if (option) {\n        return option\n      }\n    }\n\n    return {\n      [aliasProps.value.value]: value,\n      [aliasProps.value.label]: value,\n    }\n  }\n\n  const getIndex = (option: Option) =>\n    allOptionsValueMap.value.get(getValue(option))?.index ?? -1\n\n  const initStates = (needUpdateSelectedLabel = false) => {\n    if (props.multiple) {\n      if ((props.modelValue as Array<any>).length > 0) {\n        const cachedOptions = states.cachedOptions.slice()\n        states.cachedOptions.length = 0\n        states.previousValue = props.modelValue.toString()\n\n        for (const value of props.modelValue) {\n          const option = getOption(value, cachedOptions)\n          states.cachedOptions.push(option)\n        }\n      } else {\n        states.cachedOptions = []\n        states.previousValue = undefined\n      }\n    } else {\n      if (hasModelValue.value) {\n        states.previousValue = props.modelValue\n        const options = filteredOptions.value\n        const selectedItemIndex = options.findIndex(\n          (option) =>\n            getValueKey(getValue(option)) === getValueKey(props.modelValue)\n        )\n        if (~selectedItemIndex) {\n          states.selectedLabel = getLabel(options[selectedItemIndex])\n        } else {\n          if (!states.selectedLabel || needUpdateSelectedLabel) {\n            states.selectedLabel = getValueKey(props.modelValue)\n          }\n        }\n      } else {\n        states.selectedLabel = ''\n        states.previousValue = undefined\n      }\n    }\n    clearAllNewOption()\n    calculatePopperSize()\n  }\n\n  watch(\n    () => props.fitInputWidth,\n    () => {\n      calculatePopperSize()\n    }\n  )\n\n  // in order to track these individually, we need to turn them into refs instead of watching the entire\n  // reactive object which could cause perf penalty when unnecessary field gets changed the watch method will\n  // be invoked.\n\n  watch(expanded, (val) => {\n    if (val) {\n      if (!props.persistent) {\n        calculatePopperSize()\n      }\n      handleQueryChange('')\n    } else {\n      states.inputValue = ''\n      states.previousQuery = null\n      states.isBeforeHide = true\n      states.menuVisibleOnFocus = false\n      createNewOption('')\n    }\n  })\n\n  watch(\n    () => props.modelValue,\n    (val, oldVal) => {\n      const isValEmpty = !val || (isArray(val) && val.length === 0)\n\n      if (\n        isValEmpty ||\n        (props.multiple && !isEqual(val.toString(), states.previousValue)) ||\n        (!props.multiple &&\n          getValueKey(val) !== getValueKey(states.previousValue))\n      ) {\n        initStates(true)\n      }\n      if (!isEqual(val, oldVal) && props.validateEvent) {\n        elFormItem?.validate?.('change').catch(NOOP)\n      }\n    },\n    {\n      deep: true,\n    }\n  )\n\n  watch(\n    () => props.options,\n    () => {\n      const input = inputRef.value\n      // filter or remote-search scenarios are not initialized\n      if (!input || (input && document.activeElement !== input)) {\n        initStates()\n      }\n    },\n    {\n      deep: true,\n      flush: 'post',\n    }\n  )\n\n  // fix the problem that scrollTop is not reset in filterable mode\n  watch(\n    () => filteredOptions.value,\n    () => {\n      calculatePopperSize()\n      return menuRef.value && nextTick(menuRef.value.resetScrollTop)\n    }\n  )\n\n  watchEffect(() => {\n    // Anything could cause options changed, then update options\n    // If you want to control it by condition, write here\n    if (states.isBeforeHide) return\n    updateOptions()\n  })\n\n  watchEffect(() => {\n    const { valueKey, options } = props\n    const duplicateValue = new Map()\n    for (const item of options) {\n      const optionValue = getValue(item)\n      let v = optionValue\n      if (isObject(v)) {\n        v = get(optionValue, valueKey)\n      }\n      if (duplicateValue.get(v)) {\n        debugWarn(\n          'ElSelectV2',\n          `The option values you provided seem to be duplicated, which may cause some problems, please check.`\n        )\n        break\n      } else {\n        duplicateValue.set(v, true)\n      }\n    }\n  })\n\n  onMounted(() => {\n    initStates()\n  })\n  useResizeObserver(selectRef, () => rAF(handleResize))\n  useResizeObserver(wrapperRef, updateTooltip)\n  useResizeObserver(tagMenuRef, updateTagTooltip)\n  useResizeObserver(collapseItemRef, resetCollapseItemWidth)\n\n  // #21498\n  let stop: (() => void) | undefined\n  watch(\n    () => dropdownMenuVisible.value,\n    (newVal) => {\n      if (newVal) {\n        stop = useResizeObserver(menuRef, updateTooltip).stop\n      } else {\n        stop?.()\n        stop = undefined\n      }\n      emit('visible-change', newVal)\n    }\n  )\n\n  return {\n    // data exports\n    inputId,\n    collapseTagSize,\n    currentPlaceholder,\n    expanded,\n    emptyText,\n    popupHeight,\n    debounce,\n    allOptions,\n    allOptionsValueMap,\n    filteredOptions,\n    iconComponent,\n    iconReverse,\n    tagStyle,\n    popperSize,\n    dropdownMenuVisible,\n    hasModelValue,\n    shouldShowPlaceholder,\n    selectDisabled,\n    selectSize,\n    needStatusIcon,\n    showClearBtn,\n    states,\n    isFocused,\n    nsSelect,\n    nsInput,\n\n    // refs items exports\n    inputRef,\n    menuRef,\n    tagMenuRef,\n    tooltipRef,\n    tagTooltipRef,\n    selectRef,\n    wrapperRef,\n    selectionRef,\n    prefixRef,\n    suffixRef,\n    collapseItemRef,\n\n    popperRef,\n\n    validateState,\n    validateIcon,\n    showTagList,\n    collapseTagList,\n\n    // methods exports\n    debouncedOnInputChange,\n    deleteTag,\n    getLabel,\n    getValue,\n    getDisabled,\n    getValueKey,\n    getIndex,\n    handleClear,\n    handleClickOutside,\n    handleDel,\n    handleEsc,\n    focus,\n    blur,\n    handleMenuEnter,\n    handleResize,\n    updateTooltip,\n    updateTagTooltip,\n    updateOptions,\n    toggleMenu,\n    scrollTo: scrollToItem,\n    onInput,\n    onKeyboardNavigate,\n    onKeyboardSelect,\n    onEndReached,\n    onSelect,\n    onHover: onHoverOption,\n    handleCompositionStart,\n    handleCompositionEnd,\n    handleCompositionUpdate,\n  }\n}\n\nexport default useSelect\n"],"mappings":"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B,KAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,cAAc,SAAS,IAAI;GACjC,IAAI,IAAI;GACR,IAAI,SAAS,CAAC,GACZ,IAAI,IAAI,aAAa,QAAQ;GAE/B,IAAI,eAAe,IAAI,CAAC,GAAG;IACzB,UACE,cACA,oGACF;IACA;GACF,OACE,eAAe,IAAI,GAAG,IAAI;EAE9B;CACF,CAAC;CAED,gBAAgB;EACd,WAAW;CACb,CAAC;CACD,kBAAkB,iBAAiB,IAAI,YAAY,CAAC;CACpD,kBAAkB,YAAY,aAAa;CAC3C,kBAAkB,YAAY,gBAAgB;CAC9C,kBAAkB,iBAAiB,sBAAsB;CAGzD,IAAI;CACJ,YACQ,oBAAoB,QACzB,WAAW;EACV,IAAI,QACF,OAAO,kBAAkB,SAAS,aAAa,CAAC,CAAC;OAC5C;GACL,OAAO;GACP,OAAO,KAAA;EACT;EACA,KAAK,kBAAkB,MAAM;CAC/B,CACF;CAEA,OAAO;EAEL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA,SAAS;EACT;EACA;EACA;CACF;AACF"}