From ca10d145d51a0f6e1851b02bbc98dc740cbda9bc Mon Sep 17 00:00:00 2001 From: Kael Date: Fri, 12 May 2023 02:05:48 +1000 Subject: [PATCH] feat: support vue 3.3 (#17282) --- package.json | 5 +- packages/api-generator/package.json | 2 +- packages/docs/package.json | 9 +- .../docs/src/examples/v-app-bar/misc-menu.vue | 7 +- .../v-calendar/misc-drag-and-drop.vue | 6 +- .../examples/v-item-group/prop-mandatory.vue | 2 + .../examples/v-item-group/prop-multiple.vue | 2 + .../v-item-group/prop-selected-class.vue | 2 + .../docs/src/examples/v-item-group/usage.vue | 2 + packages/vuetify/package.json | 4 +- .../vuetify/src/components/VAlert/VAlert.tsx | 2 +- .../VAutocomplete/VAutocomplete.tsx | 34 +- .../components/VBreadcrumbs/VBreadcrumbs.tsx | 19 +- .../vuetify/src/components/VCard/VCard.tsx | 8 +- .../src/components/VCarousel/VCarousel.tsx | 13 +- .../vuetify/src/components/VChip/VChip.tsx | 11 +- .../src/components/VChipGroup/VChipGroup.tsx | 12 +- .../src/components/VCombobox/VCombobox.tsx | 34 +- .../src/components/VCounter/VCounter.tsx | 12 +- .../vuetify/src/components/VField/VField.tsx | 19 +- .../src/components/VFileInput/VFileInput.tsx | 5 + .../vuetify/src/components/VForm/VForm.tsx | 6 +- .../vuetify/src/components/VHover/VHover.tsx | 2 +- .../vuetify/src/components/VInput/VInput.tsx | 3 +- .../src/components/VItemGroup/VItem.tsx | 14 +- .../src/components/VItemGroup/VItemGroup.tsx | 12 +- .../vuetify/src/components/VList/VList.tsx | 9 +- .../src/components/VList/VListChildren.tsx | 27 +- .../src/components/VList/VListItem.tsx | 4 +- .../components/VList/__tests__/VList.spec.ts | 4 +- .../VNavigationDrawer/VNavigationDrawer.tsx | 2 +- .../components/VPagination/VPagination.tsx | 31 +- .../VProgressCircular/VProgressCircular.tsx | 6 +- .../src/components/VSelect/VSelect.tsx | 31 +- .../VSelectionControl/VSelectionControl.tsx | 11 +- .../src/components/VSlider/VSlider.tsx | 3 +- .../src/components/VSlider/VSliderThumb.tsx | 2 +- .../src/components/VSlider/VSliderTrack.tsx | 4 +- .../vuetify/src/components/VSlider/slider.ts | 2 +- .../src/components/VTextField/VTextField.tsx | 9 +- .../src/components/VTextarea/VTextarea.tsx | 8 +- .../components/VValidation/VValidation.tsx | 6 +- .../VVirtualScroll/VVirtualScroll.tsx | 13 +- .../vuetify/src/composables/forwardRefs.ts | 2 +- packages/vuetify/src/composables/icons.tsx | 2 +- .../src/labs/VDataTable/VDataTable.tsx | 4 +- .../VDataTable/VDataTableGroupHeaderRow.tsx | 2 +- .../src/labs/VDataTable/VDataTableHeaders.tsx | 17 +- .../src/labs/VDataTable/VDataTableRows.tsx | 4 +- .../labs/VInfiniteScroll/VInfiniteScroll.tsx | 7 +- packages/vuetify/src/util/defineComponent.tsx | 64 +++- packages/vuetify/src/util/propsFactory.ts | 26 +- yarn.lock | 334 +++++++++--------- 53 files changed, 518 insertions(+), 363 deletions(-) diff --git a/package.json b/package.json index ccc31c34a77..8f96da634d2 100755 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@octokit/core": "^4.2.0", "@typescript-eslint/eslint-plugin": "^5.57.0", "@typescript-eslint/parser": "^5.57.0", - "@vue/compiler-sfc": "^3.2.47", + "@vue/compiler-sfc": "^3.3.1", "@vueuse/head": "^1.1.23", "babel-eslint": "^10.1.0", "babel-jest": "^28.1.3", @@ -81,9 +81,10 @@ "upath": "^2.0.1", "vite-plugin-inspect": "^0.7.18", "vite-plugin-warmup": "^0.0.2", - "vue": "^3.2.47", + "vue": "^3.3.1", "vue-analytics": "^5.16.1", "vue-router": "^4.1.6", + "vue-tsc": "^1.6.4", "yargs": "^17.7.1" } } diff --git a/packages/api-generator/package.json b/packages/api-generator/package.json index 42a17d93db6..7fd134d355e 100755 --- a/packages/api-generator/package.json +++ b/packages/api-generator/package.json @@ -17,7 +17,7 @@ "piscina": "^3.2.0", "rimraf": "^3.0.2", "ts-morph": "^18.0.0", - "vue": "^3.2.47", + "vue": "^3.3.1", "vuetify": "^3.2.1" }, "devDependencies": { diff --git a/packages/docs/package.json b/packages/docs/package.json index 6cef1b683b4..c08459467fb 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -35,7 +35,7 @@ "prismjs": "^1.29.0", "roboto-fontface": "^0.10.0", "vee-validate": "^4.8.4", - "vue": "^3.2.47", + "vue": "^3.3.1", "vue-gtag-next": "^1.14.0", "vue-i18n": "^9.3.0-beta.16", "vue-instantsearch": "^4.8.8", @@ -50,8 +50,8 @@ "@types/prismjs": "^1.26.0", "@types/rimraf": "^3.0.2", "@vitejs/plugin-basic-ssl": "^1.0.1", - "@vitejs/plugin-vue": "^4.1.0", - "@vue/compiler-sfc": "^3.2.47", + "@vitejs/plugin-vue": "^4.2.2", + "@vue/compiler-sfc": "^3.3.1", "@vuetify/api-generator": "^3.2.1", "@vuetify/vite-ssg": "^0.20.2", "ajv": "^8.12.0", @@ -74,13 +74,12 @@ "markdownlint-cli": "^0.33.0", "unplugin-fonts": "^1.0.0", "unplugin-vue-components": "^0.24.1", - "vite": "^4.3.0-beta.2", + "vite": "^4.3.5", "vite-plugin-md": "^0.21.5", "vite-plugin-pages": "^0.29.0", "vite-plugin-pwa": "^0.14.7", "vite-plugin-vue-layouts": "^0.8.0", "vite-plugin-vuetify": "^1.0.2", - "vue-tsc": "^1.2.0", "workbox-precaching": "^6.5.4", "workbox-routing": "^6.5.4", "workbox-strategies": "^6.5.4", diff --git a/packages/docs/src/examples/v-app-bar/misc-menu.vue b/packages/docs/src/examples/v-app-bar/misc-menu.vue index 9f6d4d1ea4c..f300df4b9d6 100644 --- a/packages/docs/src/examples/v-app-bar/misc-menu.vue +++ b/packages/docs/src/examples/v-app-bar/misc-menu.vue @@ -10,11 +10,8 @@ fade-img-on-scroll scroll-target="#scrolling-techniques-4" > - + + diff --git a/packages/docs/src/examples/v-item-group/usage.vue b/packages/docs/src/examples/v-item-group/usage.vue index 48101bf0bf3..862677dfd25 100644 --- a/packages/docs/src/examples/v-item-group/usage.vue +++ b/packages/docs/src/examples/v-item-group/usage.vue @@ -31,3 +31,5 @@ + + diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index f5c23467a78..6d1666c3e74 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -131,7 +131,7 @@ "@types/jest": "^28.1.8", "@types/node": "^18.15.11", "@types/resize-observer-browser": "^0.1.7", - "@vitejs/plugin-vue": "^4.1.0", + "@vitejs/plugin-vue": "^4.2.2", "@vitejs/plugin-vue-jsx": "^3.0.1", "@vue/babel-plugin-jsx": "^1.1.1", "@vue/test-utils": "2.3.2", @@ -161,7 +161,7 @@ "rollup-plugin-sourcemaps": "^0.6.3", "rollup-plugin-terser": "^7.0.2", "ts-json-schema-generator": "^1.2.0", - "vite": "^4.3.0-beta.2", + "vite": "^4.3.5", "vite-ssr": "^0.17.1", "vue-i18n": "^9.3.0-beta.16", "vue-router": "^4.1.6" diff --git a/packages/vuetify/src/components/VAlert/VAlert.tsx b/packages/vuetify/src/components/VAlert/VAlert.tsx index 2c814fac7b7..81d123e5ed6 100644 --- a/packages/vuetify/src/components/VAlert/VAlert.tsx +++ b/packages/vuetify/src/components/VAlert/VAlert.tsx @@ -40,7 +40,7 @@ export type VAlertSlots = { title: [] text: [] append: [] - close: [] + close: [{ props: Record }] } export const VAlert = genericComponent()({ diff --git a/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx b/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx index 373245de3cc..0d5f28e08d1 100644 --- a/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx +++ b/packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx @@ -65,20 +65,23 @@ export const VAutocomplete = genericComponent = Value ->(props: { - items?: readonly T[] - returnObject?: ReturnObject - multiple?: Multiple - modelValue?: V - 'onUpdate:modelValue'?: (val: V) => void -}) => GenericProps & { - item: [{ item: InternalItem, index: number, props: Record }] - chip: [{ item: InternalItem, index: number, props: Record }] - selection: [{ item: InternalItem, index: number }] - 'prepend-item': [] - 'append-item': [] - 'no-data': [] -}>>()({ +>( + props: { + items?: readonly T[] + returnObject?: ReturnObject + multiple?: Multiple + modelValue?: V + 'onUpdate:modelValue'?: (val: V) => void + }, + slots: Omit & { + item: [{ item: InternalItem, index: number, props: Record }] + chip: [{ item: InternalItem, index: number, props: Record }] + selection: [{ item: InternalItem, index: number }] + 'prepend-item': [] + 'append-item': [] + 'no-data': [] + } +) => GenericProps>()({ name: 'VAutocomplete', props: { @@ -377,8 +380,9 @@ export const VAutocomplete = genericComponent slots.item?.({ + { displayItems.value.map((item, index) => slots.item?.({ item, + index, props: mergeProps(item.props, { onClick: () => select(item) }), }) ?? ( & { disabled?: boolean }) -export const VBreadcrumbs = genericComponent(props: { - items?: T[] -}) => GenericProps>()({ +export const VBreadcrumbs = genericComponent( + props: { + items?: T[] + }, + slots: { + prepend: [] + title: [{ item: T, index: number }] + divider: [{ item: T, index: number }] + default: [] + } +) => GenericProps>()({ name: 'VBreadcrumbs', props: { diff --git a/packages/vuetify/src/components/VCard/VCard.tsx b/packages/vuetify/src/components/VCard/VCard.tsx index 86bf3f5df9c..f6dab71683b 100644 --- a/packages/vuetify/src/components/VCard/VCard.tsx +++ b/packages/vuetify/src/components/VCard/VCard.tsx @@ -5,6 +5,7 @@ import './VCard.sass' // Components import { VCardActions } from './VCardActions' +import type { VCardItemSlots } from './VCardItem' import { VCardItem } from './VCardItem' import { VCardText } from './VCardText' import { VDefaultsProvider } from '@/components/VDefaultsProvider' @@ -36,16 +37,13 @@ import { genericComponent, useRender } from '@/util' // Types import type { LoaderSlotProps } from '@/composables/loader' -export type VCardSlots = { +export type VCardSlots = VCardItemSlots & { default: [] actions: [] - title: [] - subtitle: [] text: [] loader: [LoaderSlotProps] image: [] - prepend: [] - append: [] + item: [] } export const VCard = genericComponent()({ diff --git a/packages/vuetify/src/components/VCarousel/VCarousel.tsx b/packages/vuetify/src/components/VCarousel/VCarousel.tsx index 823f1a70317..7e00862803d 100644 --- a/packages/vuetify/src/components/VCarousel/VCarousel.tsx +++ b/packages/vuetify/src/components/VCarousel/VCarousel.tsx @@ -21,7 +21,18 @@ import type { GroupProvide } from '@/composables/group' import type { PropType } from 'vue' import type { VWindowSlots } from '../VWindow/VWindow' -export const VCarousel = genericComponent()({ +type VCarouselSlots = VWindowSlots & { + item: [{ + props: Record + item: { + id: number + value: unknown + disabled: boolean | undefined + } + }] +} + +export const VCarousel = genericComponent()({ name: 'VCarousel', props: { diff --git a/packages/vuetify/src/components/VChip/VChip.tsx b/packages/vuetify/src/components/VChip/VChip.tsx index 2aa57e5b0f2..cb665a0ad3c 100644 --- a/packages/vuetify/src/components/VChip/VChip.tsx +++ b/packages/vuetify/src/components/VChip/VChip.tsx @@ -33,10 +33,19 @@ import { EventProp, genericComponent } from '@/util' import { computed } from 'vue' export type VChipSlots = { - default: [] + default: [{ + isSelected: boolean | undefined + selectedClass: boolean | (string | undefined)[] | undefined + select: ((value: boolean) => void) | undefined + toggle: (() => void) | undefined + value: unknown + disabled: boolean + }] label: [] prepend: [] append: [] + close: [] + filter: [] } export const VChip = genericComponent()({ diff --git a/packages/vuetify/src/components/VChipGroup/VChipGroup.tsx b/packages/vuetify/src/components/VChipGroup/VChipGroup.tsx index 4048c71e04d..370f60d0342 100644 --- a/packages/vuetify/src/components/VChipGroup/VChipGroup.tsx +++ b/packages/vuetify/src/components/VChipGroup/VChipGroup.tsx @@ -18,7 +18,17 @@ import type { PropType } from 'vue' export const VChipGroupSymbol = Symbol.for('vuetify:v-chip-group') -export const VChipGroup = genericComponent()({ +type VChipGroupProps = { + default: [{ + isSelected: (id: number) => boolean + select: (id: number, value: boolean) => void + next: () => void + prev: () => void + selected: readonly number[] + }] +} + +export const VChipGroup = genericComponent()({ name: 'VChipGroup', props: { diff --git a/packages/vuetify/src/components/VCombobox/VCombobox.tsx b/packages/vuetify/src/components/VCombobox/VCombobox.tsx index 7e052d11755..fe14a6809ee 100644 --- a/packages/vuetify/src/components/VCombobox/VCombobox.tsx +++ b/packages/vuetify/src/components/VCombobox/VCombobox.tsx @@ -66,20 +66,23 @@ export const VCombobox = genericComponent = Value ->(props: { - items?: readonly T[] - returnObject?: ReturnObject - multiple?: Multiple - modelValue?: V - 'onUpdate:modelValue'?: (val: V) => void -}) => GenericProps & { - item: [{ item: InternalItem, index: number, props: Record }] - chip: [{ item: InternalItem, index: number, props: Record }] - selection: [{ item: InternalItem, index: number }] - 'prepend-item': [] - 'append-item': [] - 'no-data': [] -}>>()({ +>( + props: { + items?: readonly T[] + returnObject?: ReturnObject + multiple?: Multiple + modelValue?: V + 'onUpdate:modelValue'?: (val: V) => void + }, + slots: Omit & { + item: [{ item: InternalItem, index: number, props: Record }] + chip: [{ item: InternalItem, index: number, props: Record }] + selection: [{ item: InternalItem, index: number }] + 'prepend-item': [] + 'append-item': [] + 'no-data': [] + } +) => GenericProps>()({ name: 'VCombobox', props: { @@ -412,8 +415,9 @@ export const VCombobox = genericComponent slots.item?.({ + { displayItems.value.map((item, index) => slots.item?.({ item, + index, props: mergeProps(item.props, { onClick: () => select(item) }), }) ?? ( ()({ name: 'VCounter', functional: true, diff --git a/packages/vuetify/src/components/VField/VField.tsx b/packages/vuetify/src/components/VField/VField.tsx index 0979b660200..f7a8ab5374e 100644 --- a/packages/vuetify/src/components/VField/VField.tsx +++ b/packages/vuetify/src/components/VField/VField.tsx @@ -35,7 +35,6 @@ import { import type { LoaderSlotProps } from '@/composables/loader' import type { GenericProps } from '@/util' import type { PropType, Ref } from 'vue' -import type { VInputSlot } from '@/components/VInput/VInput' const allowedVariants = ['underlined', 'outlined', 'filled', 'solo', 'solo-inverted', 'solo-filled', 'plain'] as const type Variant = typeof allowedVariants[number] @@ -90,17 +89,20 @@ export const makeVFieldProps = propsFactory({ export type VFieldSlots = { clear: [] - 'prepend-inner': [DefaultInputSlot & VInputSlot] - 'append-inner': [DefaultInputSlot & VInputSlot] - label: [DefaultInputSlot & VInputSlot] + 'prepend-inner': [DefaultInputSlot] + 'append-inner': [DefaultInputSlot] + label: [DefaultInputSlot & { label: string | undefined, props: Record }] loader: [LoaderSlotProps] default: [VFieldSlot] } -export const VField = genericComponent(props: { - modelValue?: T - 'onUpdate:modelValue'?: (val: T) => any -}) => GenericProps>()({ +export const VField = genericComponent( + props: { + modelValue?: T + 'onUpdate:modelValue'?: (val: T) => any + }, + slots: VFieldSlots +) => GenericProps>()({ name: 'VField', inheritAttrs: false, @@ -205,6 +207,7 @@ export const VField = genericComponent(props: { const hasAppend = !!(slots['append-inner'] || props.appendInnerIcon || hasClear) const label = slots.label ? slots.label({ + ...slotProps.value, label: props.label, props: { for: id.value }, }) diff --git a/packages/vuetify/src/components/VFileInput/VFileInput.tsx b/packages/vuetify/src/components/VFileInput/VFileInput.tsx index efc8a8c8b9d..15f5cee6d8e 100644 --- a/packages/vuetify/src/components/VFileInput/VFileInput.tsx +++ b/packages/vuetify/src/components/VFileInput/VFileInput.tsx @@ -32,6 +32,11 @@ import type { VInputSlots } from '@/components/VInput/VInput' export type VFileInputSlots = VInputSlots & VFieldSlots & { counter: [] + selection: [{ + fileNames: string[] + totalBytes: number + totalBytesReadable: string + }] } export const VFileInput = genericComponent()({ diff --git a/packages/vuetify/src/components/VForm/VForm.tsx b/packages/vuetify/src/components/VForm/VForm.tsx index c7deb4782ac..824aad24a70 100644 --- a/packages/vuetify/src/components/VForm/VForm.tsx +++ b/packages/vuetify/src/components/VForm/VForm.tsx @@ -10,7 +10,11 @@ import { genericComponent, useRender } from '@/util' // Types import type { SubmitEventPromise } from '@/composables/form' -export const VForm = genericComponent()({ +type VFormSlots = { + default: [ReturnType] +} + +export const VForm = genericComponent()({ name: 'VForm', props: { diff --git a/packages/vuetify/src/components/VHover/VHover.tsx b/packages/vuetify/src/components/VHover/VHover.tsx index b249e8515ee..0d589db1ab8 100644 --- a/packages/vuetify/src/components/VHover/VHover.tsx +++ b/packages/vuetify/src/components/VHover/VHover.tsx @@ -7,7 +7,7 @@ import { genericComponent } from '@/util' type VHoverSlots = { default: [{ - isHovering: boolean + isHovering: boolean | undefined props: Record }] } diff --git a/packages/vuetify/src/components/VInput/VInput.tsx b/packages/vuetify/src/components/VInput/VInput.tsx index b00eb45a48c..49117aedb91 100644 --- a/packages/vuetify/src/components/VInput/VInput.tsx +++ b/packages/vuetify/src/components/VInput/VInput.tsx @@ -2,7 +2,7 @@ import './VInput.sass' // Components -import { VMessages } from '@/components/VMessages' +import { VMessages, type VMessageSlot } from '@/components/VMessages/VMessages' // Composables import { IconValue } from '@/composables/icons' @@ -62,6 +62,7 @@ export type VInputSlots = { prepend: [VInputSlot] append: [VInputSlot] details: [VInputSlot] + message: [VMessageSlot] } export const VInput = genericComponent()({ diff --git a/packages/vuetify/src/components/VItemGroup/VItem.tsx b/packages/vuetify/src/components/VItemGroup/VItem.tsx index 97666470844..2d72fe361f6 100644 --- a/packages/vuetify/src/components/VItemGroup/VItem.tsx +++ b/packages/vuetify/src/components/VItemGroup/VItem.tsx @@ -5,10 +5,18 @@ import { VItemGroupSymbol } from './VItemGroup' // Utilities import { genericComponent } from '@/util' -// Types -import type { GroupItemProvide } from '@/composables/group' +type VItemSlots = { + default: [{ + isSelected: boolean | undefined + selectedClass: boolean | (string | undefined)[] | undefined + select: ((value: boolean) => void) | undefined + toggle: (() => void) | undefined + value: unknown + disabled: boolean | undefined + }] +} -export const VItem = genericComponent<{ default: [GroupItemProvide] }>()({ +export const VItem = genericComponent()({ name: 'VItem', props: makeGroupItemProps(), diff --git a/packages/vuetify/src/components/VItemGroup/VItemGroup.tsx b/packages/vuetify/src/components/VItemGroup/VItemGroup.tsx index 199469da211..e48513e07f0 100644 --- a/packages/vuetify/src/components/VItemGroup/VItemGroup.tsx +++ b/packages/vuetify/src/components/VItemGroup/VItemGroup.tsx @@ -12,7 +12,17 @@ import { genericComponent } from '@/util' export const VItemGroupSymbol = Symbol.for('vuetify:v-item-group') -export const VItemGroup = genericComponent()({ +type VItemGroupSlots = { + default: [{ + isSelected: (id: number) => boolean + select: (id: number, value: boolean) => void + next: () => void + prev: () => void + selected: readonly number[] + }] +} + +export const VItemGroup = genericComponent()({ name: 'VItemGroup', props: { diff --git a/packages/vuetify/src/components/VList/VList.tsx b/packages/vuetify/src/components/VList/VList.tsx index 93052439b4d..6bdab7e9842 100644 --- a/packages/vuetify/src/components/VList/VList.tsx +++ b/packages/vuetify/src/components/VList/VList.tsx @@ -77,9 +77,12 @@ function useListItems (props: ItemProps & { itemType: string }) { return { items } } -export const VList = genericComponent(props: { - items?: T[] -}) => GenericProps>>()({ +export const VList = genericComponent( + props: { + items?: T[] + }, + slots: VListChildrenSlots +) => GenericProps>()({ name: 'VList', props: { diff --git a/packages/vuetify/src/components/VList/VListChildren.tsx b/packages/vuetify/src/components/VList/VListChildren.tsx index 16083c428c6..09e82e71753 100644 --- a/packages/vuetify/src/components/VList/VListChildren.tsx +++ b/packages/vuetify/src/components/VList/VListChildren.tsx @@ -15,16 +15,21 @@ import type { GenericProps } from '@/util' import type { PropType } from 'vue' export type VListChildrenSlots = { - [K in keyof VListItemSlots]: VListItemSlots[K] & [{ item: T }] + [K in keyof Omit]: VListItemSlots[K] & [{ item: T }] } & { - item: [T] - divider: [{ props: T }] - subheader: [{ props: T }] + default: [] + item: [{ props: InternalListItem['props'] }] + divider: [{ props: InternalListItem['props'] }] + subheader: [{ props: InternalListItem['props'] }] + header: [{ props: InternalListItem['props'] }] } -export const VListChildren = genericComponent(props: { - items?: T[] -}) => GenericProps>>()({ +export const VListChildren = genericComponent( + props: { + items?: T[] + }, + slots: VListChildrenSlots +) => GenericProps>()({ name: 'VListChildren', props: { @@ -43,10 +48,7 @@ export const VListChildren = genericComponent(p if (type === 'subheader') { return slots.subheader?.({ props: itemProps }) ?? ( - + ) } @@ -54,7 +56,6 @@ export const VListChildren = genericComponent(p subtitle: slots.subtitle ? (slotProps: any) => slots.subtitle?.({ ...slotProps, item }) : undefined, prepend: slots.prepend ? (slotProps: any) => slots.prepend?.({ ...slotProps, item }) : undefined, append: slots.append ? (slotProps: any) => slots.append?.({ ...slotProps, item }) : undefined, - default: slots.default ? (slotProps: any) => slots.default?.({ ...slotProps, item }) : undefined, title: slots.title ? (slotProps: any) => slots.title?.({ ...slotProps, item }) : undefined, } @@ -75,7 +76,7 @@ export const VListChildren = genericComponent(p }} ) : ( - slots.item ? slots.item(itemProps) : ( + slots.item ? slots.item({ props: itemProps }) : ( { @@ -13,7 +13,7 @@ describe('VList', () => { return mount(VList, { global: { plugins: [vuetify] }, ...options, - }) as VueWrapper + }) } it('should match a snapshot', () => { diff --git a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx index 5f9e302166b..c068e39bd7f 100644 --- a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx +++ b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx @@ -27,7 +27,7 @@ import { genericComponent, toPhysical, useRender } from '@/util' import type { PropType } from 'vue' export type VNavigationDrawerImageSlot = { - image: string + image: string | undefined } export type VNavigationDrawerSlots = { diff --git a/packages/vuetify/src/components/VPagination/VPagination.tsx b/packages/vuetify/src/components/VPagination/VPagination.tsx index e8d561a444e..e9caf1a4cf1 100644 --- a/packages/vuetify/src/components/VPagination/VPagination.tsx +++ b/packages/vuetify/src/components/VPagination/VPagination.tsx @@ -29,12 +29,27 @@ import { createRange, genericComponent, keyValues, useRender } from '@/util' // Types import type { ComponentPublicInstance } from 'vue' +type ItemSlot = { + isActive: boolean + key: string | number + page: string + props: Record +} + +type ControlSlot = { + icon: IconValue + onClick: (e: Event) => void + disabled: boolean + ariaLabel: string + ariaDisabled: boolean +} + export type VPaginationSlots = { - item: [] - first: [] - next: [] - prev: [] - last: [] + item: [ItemSlot] + first: [ControlSlot] + prev: [ControlSlot] + next: [ControlSlot] + last: [ControlSlot] } export const VPagination = genericComponent()({ @@ -48,7 +63,7 @@ export const VPagination = genericComponent()({ }, modelValue: { type: Number, - default: (props: any) => props.start, + default: (props: any) => props.start as number, }, disabled: Boolean, length: { @@ -323,7 +338,7 @@ export const VPagination = genericComponent()({
    { props.showFirstLastPage && (
  • - { slots.first ? slots.first(controls.value.first) : ( + { slots.first ? slots.first(controls.value.first!) : ( )}
  • @@ -368,7 +383,7 @@ export const VPagination = genericComponent()({ class="v-pagination__last" data-test="v-pagination-last" > - { slots.last ? slots.last(controls.value.last) : ( + { slots.last ? slots.last(controls.value.last!) : ( )} diff --git a/packages/vuetify/src/components/VProgressCircular/VProgressCircular.tsx b/packages/vuetify/src/components/VProgressCircular/VProgressCircular.tsx index 3d58b78f3a4..ee56a9a0a2f 100644 --- a/packages/vuetify/src/components/VProgressCircular/VProgressCircular.tsx +++ b/packages/vuetify/src/components/VProgressCircular/VProgressCircular.tsx @@ -17,7 +17,11 @@ import { convertToUnit, genericComponent, useRender } from '@/util' // Types import type { PropType } from 'vue' -export const VProgressCircular = genericComponent()({ +type VProgressCircularSlots = { + default: [{ value: number }] +} + +export const VProgressCircular = genericComponent()({ name: 'VProgressCircular', props: { diff --git a/packages/vuetify/src/components/VSelect/VSelect.tsx b/packages/vuetify/src/components/VSelect/VSelect.tsx index bbeb1bcade0..1eb33740127 100644 --- a/packages/vuetify/src/components/VSelect/VSelect.tsx +++ b/packages/vuetify/src/components/VSelect/VSelect.tsx @@ -77,20 +77,23 @@ export const VSelect = genericComponent = Value ->(props: { - items?: readonly T[] - returnObject?: ReturnObject - multiple?: Multiple - modelValue?: V - 'onUpdate:modelValue'?: (val: V) => void -}) => GenericProps & { - item: [{ item: InternalItem, index: number, props: Record }] - chip: [{ item: InternalItem, index: number, props: Record }] - selection: [{ item: InternalItem, index: number }] - 'prepend-item': [] - 'append-item': [] - 'no-data': [] -}>>()({ +>( + props: { + items?: readonly T[] + returnObject?: ReturnObject + multiple?: Multiple + modelValue?: V + 'onUpdate:modelValue'?: (val: V) => void + }, + slots: Omit & { + item: [{ item: InternalItem, index: number, props: Record }] + chip: [{ item: InternalItem, index: number, props: Record }] + selection: [{ item: InternalItem, index: number }] + 'prepend-item': [] + 'append-item': [] + 'no-data': [] + } +) => GenericProps>()({ name: 'VSelect', props: { diff --git a/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx b/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx index fef75a138ab..b1cf70b5d27 100644 --- a/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx +++ b/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx @@ -125,10 +125,13 @@ export function useSelectionControl ( } } -export const VSelectionControl = genericComponent(props: { - modelValue?: T - 'onUpdate:modelValue'?: (val: T) => any -}) => GenericProps>()({ +export const VSelectionControl = genericComponent( + props: { + modelValue?: T + 'onUpdate:modelValue'?: (val: T) => any + }, + slots: VSelectionControlSlots, +) => GenericProps>()({ name: 'VSelectionControl', directives: { Ripple }, diff --git a/packages/vuetify/src/components/VSlider/VSlider.tsx b/packages/vuetify/src/components/VSlider/VSlider.tsx index 627155f376f..4c818ea5811 100644 --- a/packages/vuetify/src/components/VSlider/VSlider.tsx +++ b/packages/vuetify/src/components/VSlider/VSlider.tsx @@ -17,9 +17,10 @@ import { computed, ref } from 'vue' import { genericComponent, useRender } from '@/util' // Types -import type { VInputSlots } from '@/components/VInput/VInput' +import type { VInputSlot, VInputSlots } from '@/components/VInput/VInput' export type VSliderSlots = VInputSlots & { + label: [VInputSlot] 'tick-label': [] 'thumb-label': [] } diff --git a/packages/vuetify/src/components/VSlider/VSliderThumb.tsx b/packages/vuetify/src/components/VSlider/VSliderThumb.tsx index 6ca817dbad4..08b79f00df5 100644 --- a/packages/vuetify/src/components/VSlider/VSliderThumb.tsx +++ b/packages/vuetify/src/components/VSlider/VSliderThumb.tsx @@ -18,7 +18,7 @@ import { computed, inject } from 'vue' import { convertToUnit, genericComponent, keyValues, useRender } from '@/util' export type VSliderThumbSlots = { - 'thumb-label': [] + 'thumb-label': [{ modelValue: number }] } export const VSliderThumb = genericComponent()({ diff --git a/packages/vuetify/src/components/VSlider/VSliderTrack.tsx b/packages/vuetify/src/components/VSlider/VSliderTrack.tsx index e41ff38c2f3..5c77a495d5f 100644 --- a/packages/vuetify/src/components/VSlider/VSliderTrack.tsx +++ b/packages/vuetify/src/components/VSlider/VSliderTrack.tsx @@ -2,7 +2,7 @@ import './VSliderTrack.sass' // Components -import { VSliderSymbol } from './slider' +import { type Tick, VSliderSymbol } from './slider' // Composables import { makeComponentProps } from '@/composables/component' @@ -14,7 +14,7 @@ import { computed, inject } from 'vue' import { convertToUnit, genericComponent, useRender } from '@/util' export type VSliderTrackSlots = { - 'tick-label': [] + 'tick-label': [{ tick: Tick, index: number }] } export const VSliderTrack = genericComponent()({ diff --git a/packages/vuetify/src/components/VSlider/slider.ts b/packages/vuetify/src/components/VSlider/slider.ts index e9f12f1fc35..91c51830ec7 100644 --- a/packages/vuetify/src/components/VSlider/slider.ts +++ b/packages/vuetify/src/components/VSlider/slider.ts @@ -12,7 +12,7 @@ import { computed, provide, ref, toRef } from 'vue' import type { ExtractPropTypes, InjectionKey, PropType, Ref } from 'vue' import type { VSliderTrack } from './VSliderTrack' -type Tick = { +export type Tick = { value: number position: number label?: string diff --git a/packages/vuetify/src/components/VTextField/VTextField.tsx b/packages/vuetify/src/components/VTextField/VTextField.tsx index 7c828a117e3..57a3f64c001 100644 --- a/packages/vuetify/src/components/VTextField/VTextField.tsx +++ b/packages/vuetify/src/components/VTextField/VTextField.tsx @@ -4,7 +4,7 @@ import './VTextField.sass' // Components import { filterFieldProps, makeVFieldProps, VField } from '@/components/VField/VField' import { makeVInputProps, VInput } from '@/components/VInput/VInput' -import { VCounter } from '@/components/VCounter' +import { VCounter, type VCounterSlot } from '@/components/VCounter/VCounter' // Directives import Intersect from '@/directives/intersect' @@ -44,9 +44,12 @@ export const makeVTextFieldProps = propsFactory({ ...makeVFieldProps(), }, 'v-text-field') -export const VTextField = genericComponent & { +export type VTextFieldSlots = Omit & { default: [] -}>()({ + counter: [VCounterSlot] +} + +export const VTextField = genericComponent()({ name: 'VTextField', directives: { Intersect }, diff --git a/packages/vuetify/src/components/VTextarea/VTextarea.tsx b/packages/vuetify/src/components/VTextarea/VTextarea.tsx index 54d47f8b737..34eaf8ea224 100644 --- a/packages/vuetify/src/components/VTextarea/VTextarea.tsx +++ b/packages/vuetify/src/components/VTextarea/VTextarea.tsx @@ -5,7 +5,7 @@ import '../VTextField/VTextField.sass' // Components import { filterFieldProps, makeVFieldProps } from '@/components/VField/VField' import { makeVInputProps, VInput } from '@/components/VInput/VInput' -import { VCounter } from '@/components/VCounter' +import { VCounter, type VCounterSlot } from '@/components/VCounter/VCounter' import { VField } from '@/components/VField' // Directives @@ -25,7 +25,11 @@ import type { PropType } from 'vue' import type { VFieldSlots } from '@/components/VField/VField' import type { VInputSlots } from '@/components/VInput/VInput' -export const VTextarea = genericComponent>()({ +type VTextareaSlots = Omit & { + counter: [VCounterSlot] +} + +export const VTextarea = genericComponent()({ name: 'VTextarea', directives: { Intersect }, diff --git a/packages/vuetify/src/components/VValidation/VValidation.tsx b/packages/vuetify/src/components/VValidation/VValidation.tsx index 84058dfa911..0efc1d09980 100644 --- a/packages/vuetify/src/components/VValidation/VValidation.tsx +++ b/packages/vuetify/src/components/VValidation/VValidation.tsx @@ -4,7 +4,11 @@ import { makeValidationProps, useValidation } from '@/composables/validation' // Utilities import { genericComponent } from '@/util' -export const VValidation = genericComponent()({ +export type VValidationSlots = { + default: [ReturnType] +} + +export const VValidation = genericComponent()({ name: 'VValidation', props: { diff --git a/packages/vuetify/src/components/VVirtualScroll/VVirtualScroll.tsx b/packages/vuetify/src/components/VVirtualScroll/VVirtualScroll.tsx index 0c6b2b84d8c..a6c3de92ed0 100644 --- a/packages/vuetify/src/components/VVirtualScroll/VVirtualScroll.tsx +++ b/packages/vuetify/src/components/VVirtualScroll/VVirtualScroll.tsx @@ -31,11 +31,14 @@ export interface VVirtualScrollSlot { index: number } -export const VVirtualScroll = genericComponent(props: { - items?: readonly T[] -}) => GenericProps] -}>>()({ +export const VVirtualScroll = genericComponent( + props: { + items?: readonly T[] + }, + slots: { + default: [VVirtualScrollSlot] + } +) => GenericProps>()({ name: 'VVirtualScroll', props: { diff --git a/packages/vuetify/src/composables/forwardRefs.ts b/packages/vuetify/src/composables/forwardRefs.ts index 65d6322f8d9..d3aa2763936 100644 --- a/packages/vuetify/src/composables/forwardRefs.ts +++ b/packages/vuetify/src/composables/forwardRefs.ts @@ -18,7 +18,7 @@ function getDescriptor (obj: any, key: PropertyKey) { return undefined } -export function forwardRefs | undefined>[]> ( +export function forwardRefs | undefined>[]> ( target: T, ...refs: U ): T & UnionToIntersection<{ [K in keyof U]: OmitPrefix>>, '$'> }[number]> { diff --git a/packages/vuetify/src/composables/icons.tsx b/packages/vuetify/src/composables/icons.tsx index 8c7f1758ccf..6b98455aa09 100644 --- a/packages/vuetify/src/composables/icons.tsx +++ b/packages/vuetify/src/composables/icons.tsx @@ -192,7 +192,7 @@ export const useIcon = (props: Ref | { icon?: IconValue }) = if (!icons) throw new Error('Missing Vuetify Icons provide!') - const iconData: Ref = computed(() => { + const iconData = computed(() => { const iconAlias = isRef(props) ? props.value : props.icon if (!iconAlias) return { component: VComponentIcon } diff --git a/packages/vuetify/src/labs/VDataTable/VDataTable.tsx b/packages/vuetify/src/labs/VDataTable/VDataTable.tsx index 83424ac2bca..44450275308 100644 --- a/packages/vuetify/src/labs/VDataTable/VDataTable.tsx +++ b/packages/vuetify/src/labs/VDataTable/VDataTable.tsx @@ -25,11 +25,11 @@ import { genericComponent, propsFactory, useRender } from '@/util' import { makeFilterProps, useFilter } from '@/composables/filter' // Types -import type { PropType } from 'vue' +import type { PropType, Ref } from 'vue' import type { DataTableItem, InternalDataTableHeader } from './types' export type VDataTableSlots = VDataTableRowsSlots & { - colgroup: [InternalDataTableHeader] + colgroup: [{ columns: Ref }] default: [] top: [] headers: [] diff --git a/packages/vuetify/src/labs/VDataTable/VDataTableGroupHeaderRow.tsx b/packages/vuetify/src/labs/VDataTable/VDataTableGroupHeaderRow.tsx index d857447c4ae..89eac4be547 100644 --- a/packages/vuetify/src/labs/VDataTable/VDataTableGroupHeaderRow.tsx +++ b/packages/vuetify/src/labs/VDataTable/VDataTableGroupHeaderRow.tsx @@ -16,7 +16,7 @@ import { genericComponent } from '@/util' import type { PropType } from 'vue' import type { GroupHeaderItem } from './types' -type VDataTableGroupHeaderRowSlots = { +export type VDataTableGroupHeaderRowSlots = { 'data-table-group': [{ item: GroupHeaderItem, count: number, props: Record }] 'data-table-select': [{ props: Record }] } diff --git a/packages/vuetify/src/labs/VDataTable/VDataTableHeaders.tsx b/packages/vuetify/src/labs/VDataTable/VDataTableHeaders.tsx index 071267010c4..17538f9dcb1 100644 --- a/packages/vuetify/src/labs/VDataTable/VDataTableHeaders.tsx +++ b/packages/vuetify/src/labs/VDataTable/VDataTableHeaders.tsx @@ -16,6 +16,7 @@ import { computed } from 'vue' import { convertToUnit, genericComponent, useRender } from '@/util' // Types +import type { CSSProperties } from 'vue' import type { InternalDataTableHeader } from './types' import type { LoaderSlotProps } from '@/composables/loader' import type { SortItem } from './composables/sort' @@ -23,21 +24,21 @@ import type { SortItem } from './composables/sort' type HeadersSlotProps = { headers: InternalDataTableHeader[][] columns: InternalDataTableHeader[] - sortBy: SortItem[] + sortBy: readonly SortItem[] someSelected: boolean allSelected: boolean toggleSort: (key: string) => void selectAll: (value: boolean) => void getSortIcon: (key: string) => IconValue - getFixedStyles: (column: InternalDataTableHeader) => Record + getFixedStyles: (column: InternalDataTableHeader, y: number) => CSSProperties | undefined } export type VDataTableHeadersSlots = { default: [] headers: [HeadersSlotProps] loader: [LoaderSlotProps] - 'column.data-table-select': [InternalDataTableHeader, (value: boolean) => void] -} + 'column.data-table-select': [{ column: InternalDataTableHeader, selectAll: (value: boolean) => void }] +} & { [key: `column.${string}`]: [{ column: InternalDataTableHeader, selectAll: (value: boolean) => void }] } export const VDataTableHeaders = genericComponent()({ name: 'VDataTableHeaders', @@ -64,8 +65,8 @@ export const VDataTableHeaders = genericComponent()({ const { columns, headers } = useHeaders() const { loaderClasses } = useLoader(props) - const getFixedStyles = (column: InternalDataTableHeader, y: number) => { - if (!props.sticky && !column.fixed) return null + const getFixedStyles = (column: InternalDataTableHeader, y: number): CSSProperties | undefined => { + if (!props.sticky && !column.fixed) return undefined return { position: 'sticky', @@ -95,7 +96,7 @@ export const VDataTableHeaders = genericComponent()({ selectAll, getSortIcon, getFixedStyles, - })) + } satisfies HeadersSlotProps)) const VDataTableHeaderCell = ({ column, x, y }: { column: InternalDataTableHeader, x: number, y: number }) => { const isSorted = !!sortBy.value.find(x => x.key === column.key) @@ -126,7 +127,7 @@ export const VDataTableHeaders = genericComponent()({ > {{ default: () => { - const columnSlotName = `column.${column.key}` + const columnSlotName = `column.${column.key}` as const const columnSlotProps = { column, selectAll, diff --git a/packages/vuetify/src/labs/VDataTable/VDataTableRows.tsx b/packages/vuetify/src/labs/VDataTable/VDataTableRows.tsx index 0a3c305fbae..ac9235bf6e9 100644 --- a/packages/vuetify/src/labs/VDataTable/VDataTableRows.tsx +++ b/packages/vuetify/src/labs/VDataTable/VDataTableRows.tsx @@ -1,5 +1,5 @@ // Components -import { VDataTableGroupHeaderRow } from './VDataTableGroupHeaderRow' +import { VDataTableGroupHeaderRow, type VDataTableGroupHeaderRowSlots } from './VDataTableGroupHeaderRow' import { VDataTableRow } from './VDataTableRow' // Composables @@ -38,7 +38,7 @@ type ItemSlot = { toggleSelect: (item: DataTableItem) => void } -export type VDataTableRowsSlots = { +export type VDataTableRowsSlots = VDataTableGroupHeaderRowSlots & { default: [] item: [ItemSlot] loading: [] diff --git a/packages/vuetify/src/labs/VInfiniteScroll/VInfiniteScroll.tsx b/packages/vuetify/src/labs/VInfiniteScroll/VInfiniteScroll.tsx index e21380a8435..32df7586a58 100644 --- a/packages/vuetify/src/labs/VInfiniteScroll/VInfiniteScroll.tsx +++ b/packages/vuetify/src/labs/VInfiniteScroll/VInfiniteScroll.tsx @@ -22,14 +22,11 @@ export type InfiniteScrollStatus = 'ok' | 'empty' | 'loading' | 'error' type InfiniteScrollSlot = { side: InfiniteScrollSide - props: { - onClick: () => (side: InfiniteScrollSide) => void - color: string | undefined - } + props: Record } type VInfiniteScrollSlots = { - default: [InfiniteScrollSlot] + default: [] loading: [InfiniteScrollSlot] error: [InfiniteScrollSlot] empty: [InfiniteScrollSlot] diff --git a/packages/vuetify/src/util/defineComponent.tsx b/packages/vuetify/src/util/defineComponent.tsx index 71b67d0a77e..9ad583a52f9 100644 --- a/packages/vuetify/src/util/defineComponent.tsx +++ b/packages/vuetify/src/util/defineComponent.tsx @@ -11,6 +11,7 @@ import { injectDefaults, internalUseDefaults } from '@/composables/defaults' import type { AllowedComponentProps, ComponentCustomProps, + ComponentInjectOptions, ComponentObjectPropsOptions, ComponentOptions, ComponentOptionsMixin, @@ -25,6 +26,8 @@ import type { FunctionalComponent, MethodOptions, ObjectEmitsOptions, + SlotsType, + VNode, VNodeChild, VNodeProps, } from 'vue' @@ -41,7 +44,8 @@ export function defineComponent< E extends EmitsOptions = {}, EE extends string = string, I extends {} = {}, - II extends string = string + II extends string = string, + S extends SlotsType = {}, >( options: ComponentOptionsWithoutProps< Props, @@ -54,7 +58,8 @@ export function defineComponent< E, EE, I, - II + II, + S > ): DefineComponent @@ -70,7 +75,8 @@ export function defineComponent< E extends EmitsOptions = {}, EE extends string = string, I extends {} = {}, - II extends string = string + II extends string = string, + S extends SlotsType = {}, >( options: ComponentOptionsWithObjectProps< PropsOptions, @@ -83,7 +89,8 @@ export function defineComponent< E, EE, I, - II + II, + S > ): DefineComponent & FilterPropsOptions @@ -127,7 +134,7 @@ export function defineComponent (options: ComponentOptions) { type ToListeners = { [K in T]: K extends `on${infer U}` ? Uncapitalize : K }[T] export type SlotsToProps< - U extends Record | Record, + U extends RawSlots, T = U extends Record ? MakeSlots : U > = { $children?: ( @@ -140,17 +147,22 @@ export type SlotsToProps< [K in keyof T as `v-slot:${K & string}`]?: T[K] | false } +type RawSlots = Record | Record type Slot = (...args: T) => VNodeChild -export type MakeSlots | Record> = { +type VueSlot = (...args: T) => VNode[] +export type MakeSlots = { [K in keyof T]: T[K] extends any[] ? Slot : T[K] } +type MakeInternalSlots = { + [K in keyof T]: T[K] extends any[] ? VueSlot : T[K] +} export type GenericProps> = { $props: Props & SlotsToProps $slots: MakeSlots } -type DefineComponentWithGenericProps) => { +type DefineComponentWithGenericProps, slots: RawSlots) => { $props?: Record })> = < PropsOptions extends Readonly, @@ -162,25 +174,35 @@ type DefineComponentWithGenericProps) Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = Record, EE extends string = string, - I = InstanceType, + I extends ComponentInjectOptions = {}, + II extends string = string, + // Slots extends RawSlots = ConstructorParameters extends [any, infer SS extends RawSlots | undefined] ? Exclude : {}, + Slots extends RawSlots = ConstructorParameters[1], + S extends SlotsType = SlotsType>>, + III = InstanceType, + P = III extends Record<'$props', any> + ? Omit + : PropsOptions, Base = DefineComponent< - I extends Record<'$props', any> - ? Omit - : PropsOptions, + P, RawBindings, D, C, M, Mixin, Extends, - E extends any[] ? E : I extends Record<'$props', any> ? Omit> : E, - EE + E extends any[] ? E : III extends Record<'$props', any> ? Omit> : E, + EE, + PublicProps, + ExtractPropTypes

    & ({} extends E ? {} : EmitsToProps), + ExtractDefaultPropTypes

    , + S > >( - options: ComponentOptionsWithObjectProps + options: ComponentOptionsWithObjectProps ) => Base & T & FilterPropsOptions -type DefineComponentWithSlots | Record> = < +type DefineComponentWithSlots = < PropsOptions extends Readonly, RawBindings, D, @@ -190,8 +212,11 @@ type DefineComponentWithSlots | Record, EE extends string = string, + I extends ComponentInjectOptions = {}, + II extends string = string, + S extends SlotsType = SlotsType>>, >( - options: ComponentOptionsWithObjectProps + options: ComponentOptionsWithObjectProps ) => DefineComponent< ExtractPropTypes & SlotsToProps, RawBindings, @@ -204,20 +229,21 @@ type DefineComponentWithSlots | Record & SlotsToProps & ({} extends E ? {} : EmitsToProps), - ExtractDefaultPropTypes + ExtractDefaultPropTypes, + S > & FilterPropsOptions // No argument - simple default slot export function genericComponent (exposeDefaults?: boolean): DefineComponentWithSlots<{ default: [] }> // Generic constructor argument - generic props and slots -export function genericComponent) => { +export function genericComponent, slots: any) => { $props?: Record })> (exposeDefaults?: boolean): DefineComponentWithGenericProps // Slots argument - simple slots export function genericComponent< - Slots extends Record | Record + Slots extends RawSlots > (exposeDefaults?: boolean): DefineComponentWithSlots // Implementation diff --git a/packages/vuetify/src/util/propsFactory.ts b/packages/vuetify/src/util/propsFactory.ts index ec531d7cf68..26ea2b3ee06 100644 --- a/packages/vuetify/src/util/propsFactory.ts +++ b/packages/vuetify/src/util/propsFactory.ts @@ -1,4 +1,5 @@ import type { ComponentObjectPropsOptions, Prop, PropType } from 'vue' +import type { IfAny } from '@vue/shared' // eslint-disable-line vue/prefer-import-from-vue /** * Creates a factory function for props definitions. @@ -76,12 +77,25 @@ type MergeDefault = unknown extends D ? InferPropType : (NonNullable = { [P in keyof T]?: unknown } // Copied from Vue -type InferPropType = T extends null +type InferPropType = [T] extends [null] ? any // null & true would fail to infer - : T extends { type: null | true } - ? any // As TS issue https://github.com/Microsoft/TypeScript/issues/14829 // somehow `ObjectConstructor` when inferred from { (): T } becomes `any` // `BooleanConstructor` when inferred from PropConstructor(with PropMethod) becomes `Boolean` - : T extends ObjectConstructor | { type: ObjectConstructor } + : [T] extends [{ type: null | true }] + // As TS issue https://github.com/Microsoft/TypeScript/issues/14829 + // somehow `ObjectConstructor` when inferred from { (): T } becomes `any` + // `BooleanConstructor` when inferred from PropConstructor(with PropMethod) becomes `Boolean` + ? any + : [T] extends [ObjectConstructor | { type: ObjectConstructor }] ? Record - : T extends BooleanConstructor | { type: BooleanConstructor } + : [T] extends [BooleanConstructor | { type: BooleanConstructor }] ? boolean - : T extends Prop ? (unknown extends V ? D : V) : T + : [T] extends [DateConstructor | { type: DateConstructor }] + ? Date + : [T] extends [(infer U)[] | { type: (infer U)[] }] + ? U extends DateConstructor + ? Date | InferPropType + : InferPropType + : [T] extends [Prop] + ? unknown extends V + ? IfAny + : V + : T diff --git a/yarn.lock b/yarn.lock index 79114a1ba14..be3b7e872eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -455,10 +455,10 @@ regenerator-runtime "^0.13.11" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.7.0": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3", "@babel/parser@^7.7.0": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -3638,54 +3638,54 @@ "@babel/plugin-transform-typescript" "^7.20.7" "@vue/babel-plugin-jsx" "^1.1.1" -"@vitejs/plugin-vue@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz#b6a9d83cd91575f7ee15593f6444397f68751073" - integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ== +"@vitejs/plugin-vue@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.2.tgz#eb145aa86e673e5e3620132851200dcd604af8cf" + integrity sha512-kNH4wMAqs13UiZe/2If1ioO0Mjz71rr2oALTl2c5ajBIox9Vz/UGW/wGkr7GA3SC6Eb29c1HtzAtxdGfbXAkfQ== -"@volar/language-core@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.3.0-alpha.0.tgz#4924b4cbc37dbce5f3845c1d2b2811938223a980" - integrity sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA== +"@volar/language-core@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.4.1.tgz#66b5758252e35c4e5e71197ca7fa0344d306442c" + integrity sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ== dependencies: - "@volar/source-map" "1.3.0-alpha.0" + "@volar/source-map" "1.4.1" -"@volar/source-map@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.3.0-alpha.0.tgz#c45d51ecb9759604d29fb80211d2fc9765e5559c" - integrity sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ== +"@volar/source-map@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.4.1.tgz#e3b561775c742508e5e1f28609a4787c98056715" + integrity sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA== dependencies: muggle-string "^0.2.2" -"@volar/typescript@1.3.0-alpha.0": - version "1.3.0-alpha.0" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.3.0-alpha.0.tgz#f79bbc9939016700812b18191c47eb035913c6c3" - integrity sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow== - dependencies: - "@volar/language-core" "1.3.0-alpha.0" - -"@volar/vue-language-core@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.2.0.tgz#a600aa93c6a4e89bf2b525b7e876b39e3afdfb9b" - integrity sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ== - dependencies: - "@volar/language-core" "1.3.0-alpha.0" - "@volar/source-map" "1.3.0-alpha.0" - "@vue/compiler-dom" "^3.2.47" - "@vue/compiler-sfc" "^3.2.47" - "@vue/reactivity" "^3.2.47" - "@vue/shared" "^3.2.47" - minimatch "^6.1.6" +"@volar/typescript@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.4.1.tgz#a013419e6f029155e5467443f3ab72815da608b5" + integrity sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ== + dependencies: + "@volar/language-core" "1.4.1" + +"@volar/vue-language-core@1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.6.4.tgz#b1d695861945e63c65ff4e74609b07cb06772b7c" + integrity sha512-1o+cAtN2DIDNAX/HS8rkjZc8wTMTK+zCab/qtYbvEVlmokhZiDrQeoD9/l0Ug7YCNg+mVuMNHKNBY7pX8U2/Jw== + dependencies: + "@volar/language-core" "1.4.1" + "@volar/source-map" "1.4.1" + "@vue/compiler-dom" "^3.3.0-beta.3" + "@vue/compiler-sfc" "^3.3.0-beta.3" + "@vue/reactivity" "^3.3.0-beta.3" + "@vue/shared" "^3.3.0-beta.3" + minimatch "^9.0.0" muggle-string "^0.2.2" vue-template-compiler "^2.7.14" -"@volar/vue-typescript@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.2.0.tgz#825dab4624a116d8be21efbf0c4a7bd6dec51d37" - integrity sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA== +"@volar/vue-typescript@1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.6.4.tgz#9358e2c7cdb5bdc3ef05926084be4bb6cd3673f7" + integrity sha512-qKwgP0KVQR/aaH/SN3AP7RB8NnXPWDn3tjyXP6IT6etxkDeZLBLsXWUD9KMak/RvV1DgbXDuz4F9yuZlbt29rA== dependencies: - "@volar/typescript" "1.3.0-alpha.0" - "@volar/vue-language-core" "1.2.0" + "@volar/typescript" "1.4.1" + "@volar/vue-language-core" "1.6.4" "@vue/babel-helper-vue-transform-on@^1.0.2": version "1.0.2" @@ -3707,100 +3707,100 @@ html-tags "^3.1.0" svg-tags "^1.0.0" -"@vue/compiler-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8" - integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== +"@vue/compiler-core@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.1.tgz#4e60a13a4dc65dd1f70e19d30f3746d4f9367af2" + integrity sha512-5le1qYSBgLWg2jdLrbydlhnPJkkzMw46UrRUvTnOKlfg6pThtm9ohhqBhNPHbr0RcM1MCbK5WZe/3Ghz0SZjpQ== dependencies: - "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.47" + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.1" estree-walker "^2.0.2" - source-map "^0.6.1" + source-map-js "^1.0.2" -"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.0.1", "@vue/compiler-dom@^3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" - integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== - dependencies: - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" - -"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.2.31", "@vue/compiler-sfc@^3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" - integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-ssr" "3.2.47" - "@vue/reactivity-transform" "3.2.47" - "@vue/shared" "3.2.47" +"@vue/compiler-dom@3.3.1", "@vue/compiler-dom@^3.0.1", "@vue/compiler-dom@^3.3.0-beta.3": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.1.tgz#2d94431071377ace74c770aafb6ab2d62205b336" + integrity sha512-VmgIsoLivCft3+oNc5KM7b9wd0nZxP/g2qilMwi1hJyGA624KWnNKHn4hzBQs4FpzydUVpNy+TWVT8KiRCh3MQ== + dependencies: + "@vue/compiler-core" "3.3.1" + "@vue/shared" "3.3.1" + +"@vue/compiler-sfc@3.3.1", "@vue/compiler-sfc@^3.2.31", "@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@^3.3.0-beta.3", "@vue/compiler-sfc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.1.tgz#16a614fe9c85f35ca0e4333793441edb126323fc" + integrity sha512-G+FPwBbXSLaA4+Ry5/bdD9Oda+sRslQcE9o6JSZaougRiT4OjVL0vtkbQHPrGRTULZV28OcrAjRfSZOSB0OTXQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.1" + "@vue/compiler-dom" "3.3.1" + "@vue/compiler-ssr" "3.3.1" + "@vue/reactivity-transform" "3.3.1" + "@vue/shared" "3.3.1" estree-walker "^2.0.2" - magic-string "^0.25.7" + magic-string "^0.30.0" postcss "^8.1.10" - source-map "^0.6.1" + source-map-js "^1.0.2" -"@vue/compiler-ssr@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" - integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== +"@vue/compiler-ssr@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.1.tgz#4572a5ff79fefd1ba68cb57f024763f5d004f7b3" + integrity sha512-QOQWGNCWuSeyKx4KvWSJlnIMGg+/2oCHgkFUYo7aJ+9Uaaz45yRgKQ+FNigy50NYBQIhpXn2e4OSR8GXh4knrQ== dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/shared" "3.2.47" + "@vue/compiler-dom" "3.3.1" + "@vue/shared" "3.3.1" "@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== -"@vue/reactivity-transform@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e" - integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== +"@vue/reactivity-transform@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.1.tgz#35000e3bd4d481b228e5f0b97eb652ec9e6894dc" + integrity sha512-MkOrJauAGH4MNdxGW/PmrDegMyOGX0wGIdKUZJRBXOTpotDONg7/TPJe2QeGeBCow/5v9iOqZOWCfvmOWIaDMg== dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.1" + "@vue/shared" "3.3.1" estree-walker "^2.0.2" - magic-string "^0.25.7" + magic-string "^0.30.0" -"@vue/reactivity@3.2.47", "@vue/reactivity@^3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" - integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== +"@vue/reactivity@3.3.1", "@vue/reactivity@^3.3.0-beta.3": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.1.tgz#b134186493113f9f8c3fb6d65a047e19825a46e1" + integrity sha512-zCfmazOtyUdC1NS/EPiSYJ4RqojqmTAviJyBbyVvY8zAv5NhK44Yfw0E1tt+m5vz0ZO1ptI9jDKBr3MWIEkpgw== dependencies: - "@vue/shared" "3.2.47" + "@vue/shared" "3.3.1" -"@vue/runtime-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d" - integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== +"@vue/runtime-core@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.1.tgz#ed244dcb48d4e1e2079bf7d698a218e5b8ef5f62" + integrity sha512-Ljb37LYafhQqKIasc0r32Cva8gIh6VeSMjlwO6V03tCjHd18gmjP0F4UD+8/a59sGTysAgA8Rb9lIC2DVxRz2Q== dependencies: - "@vue/reactivity" "3.2.47" - "@vue/shared" "3.2.47" + "@vue/reactivity" "3.3.1" + "@vue/shared" "3.3.1" -"@vue/runtime-dom@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" - integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== +"@vue/runtime-dom@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.1.tgz#c07aef5b72385a2f22fdc82a203db6eba7f39fb4" + integrity sha512-NBjYbQPtMklb7lsJsM2Juv5Ygry6mvZP7PdH1GZqrzfLkvlplQT3qCtQMd/sib6yiy8t9m/Y4hVU7X9nzb9Oeg== dependencies: - "@vue/runtime-core" "3.2.47" - "@vue/shared" "3.2.47" - csstype "^2.6.8" + "@vue/runtime-core" "3.3.1" + "@vue/shared" "3.3.1" + csstype "^3.1.1" -"@vue/server-renderer@3.2.47", "@vue/server-renderer@^3.0.1", "@vue/server-renderer@^3.2.26": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" - integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== +"@vue/server-renderer@3.3.1", "@vue/server-renderer@^3.0.1", "@vue/server-renderer@^3.2.26": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.1.tgz#c750a775ca4abd8213748a540cce7344af00dac4" + integrity sha512-sod8ggOwbkQXw3lBjfzrbdxRS9lw/lNHoMaXghHawNYowf+4WoaLWD5ouz6fPZadUqNKAsqK95p8DYb1vcVfPA== dependencies: - "@vue/compiler-ssr" "3.2.47" - "@vue/shared" "3.2.47" + "@vue/compiler-ssr" "3.3.1" + "@vue/shared" "3.3.1" -"@vue/shared@3.2.47", "@vue/shared@^3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" - integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== +"@vue/shared@3.3.1", "@vue/shared@^3.3.0-beta.3": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.1.tgz#875a1c1847ec0646fc3dbe5581cb46b49ca3c469" + integrity sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw== "@vue/test-utils@2.3.2": version "2.3.2" @@ -5769,10 +5769,10 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.6.8: - version "2.6.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" - integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== +csstype@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== currently-unhandled@^0.4.1: version "0.4.1" @@ -10306,13 +10306,6 @@ minimatch@^5.0.1, minimatch@~5.1.2: dependencies: brace-expansion "^2.0.1" -minimatch@^6.1.6: - version "6.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" - integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^7.4.2, minimatch@^7.4.3: version "7.4.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.3.tgz#012cbf110a65134bb354ae9773b55256cdb045a2" @@ -10320,6 +10313,13 @@ minimatch@^7.4.2, minimatch@^7.4.3: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" + integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -10493,10 +10493,10 @@ mz@^2.5.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== nanomatch@^1.2.9: version "1.2.13" @@ -11649,12 +11649,12 @@ postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.10, postcss@^8.4.21: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.1.10, postcss@^8.4.21, postcss@^8.4.23: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -12393,10 +12393,10 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.18.0, rollup@^3.20.2, rollup@^3.7.2: - version "3.20.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" - integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== +rollup@^3.20.2, rollup@^3.21.0, rollup@^3.7.2: + version "3.21.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.21.6.tgz#f5649ccdf8fcc7729254faa457cbea9547eb86db" + integrity sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg== optionalDependencies: fsevents "~2.3.2" @@ -14089,27 +14089,14 @@ vite-ssr@^0.17.1: react-router-dom "^6.2.2" react-ssr-prepass "^1.4.0" -"vite@^3.0.0 || ^4.0.0": - version "4.2.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" - integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== +"vite@^3.0.0 || ^4.0.0", vite@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.5.tgz#3871fe0f4b582ea7f49a85386ac80e84826367d9" + integrity sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA== dependencies: esbuild "^0.17.5" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.18.0" - optionalDependencies: - fsevents "~2.3.2" - -vite@^4.3.0-beta.2: - version "4.3.0-beta.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.0-beta.2.tgz#228572cee4582fc4e196de4b72c3c551097c912d" - integrity sha512-RRghM7RiRnwknCG3hS+NE8C+N3CNX4yKfVhFxO3NqrtYErN6htac//De9IwIHWqgV8DdKoNPeK8Yb/FOlZvjoQ== - dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.20.2" + postcss "^8.4.23" + rollup "^3.21.0" optionalDependencies: fsevents "~2.3.2" @@ -14199,24 +14186,25 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.2.0.tgz#2b64b960cc96208492541394423ace589a461be6" - integrity sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw== - dependencies: - "@volar/vue-language-core" "1.2.0" - "@volar/vue-typescript" "1.2.0" - -vue@^3.2.41, vue@^3.2.47: - version "3.2.47" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" - integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== - dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-sfc" "3.2.47" - "@vue/runtime-dom" "3.2.47" - "@vue/server-renderer" "3.2.47" - "@vue/shared" "3.2.47" +vue-tsc@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.6.4.tgz#ca4e931e9d3b9c55cd7a0f551bc0c9536edb6386" + integrity sha512-8rg8S1AhRJ6/WriENQEhyqH5wsxSxuD5iaD+QnkZn2ArZ6evlhqfBAIcVN8mfSyCV9DeLkQXkOSv/MaeJiJPAQ== + dependencies: + "@volar/vue-language-core" "1.6.4" + "@volar/vue-typescript" "1.6.4" + semver "^7.3.8" + +vue@^3.2.41, vue@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.1.tgz#267372cecd953900412bb00108bb56a591f57d33" + integrity sha512-3Rwy4I5idbPVSDZu6I+fFh6tdDSZbauImCTqLxE7y0LpHtiDvPeY01OI7RkFPbva1nk4hoO0sv/NzosH2h60sg== + dependencies: + "@vue/compiler-dom" "3.3.1" + "@vue/compiler-sfc" "3.3.1" + "@vue/runtime-dom" "3.3.1" + "@vue/server-renderer" "3.3.1" + "@vue/shared" "3.3.1" w3c-hr-time@^1.0.2: version "1.0.2"