fix: fixed an error in the form onChange within Naive (#4558)

* fix: fixed an error in the form onChange within Naive

* chore: update
This commit is contained in:
Vben 2024-10-03 14:22:18 +08:00 committed by GitHub
parent 64428b9b11
commit 0cd865e211
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 128 additions and 65 deletions

View File

@ -4,7 +4,8 @@ import type {
VbenFormProps, VbenFormProps,
} from '@vben/common-ui'; } from '@vben/common-ui';
import { type Component, h, type SetupContext } from 'vue'; import type { Component, SetupContext } from 'vue';
import { h } from 'vue';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui'; import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -63,7 +64,7 @@ const withDefaultPlaceholder = <T extends Component>(
) => { ) => {
return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => { return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => {
const placeholder = props?.placeholder || $t(`placeholder.${type}`); const placeholder = props?.placeholder || $t(`placeholder.${type}`);
return h(component, { ...props, attrs, placeholder }, slots); return h(component, { ...props, ...attrs, placeholder }, slots);
}; };
}; };

View File

@ -4,6 +4,7 @@ import type {
VbenFormProps, VbenFormProps,
} from '@vben/common-ui'; } from '@vben/common-ui';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui'; import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
@ -42,6 +43,16 @@ export type FormComponentType =
| 'Upload' | 'Upload'
| BaseFormComponentType; | BaseFormComponentType;
const withDefaultPlaceholder = <T extends Component>(
component: T,
type: 'input' | 'select',
) => {
return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => {
const placeholder = props?.placeholder || $t(`placeholder.${type}`);
return h(component, { ...props, ...attrs, placeholder }, slots);
};
};
// 初始化表单组件并注册到form组件内部 // 初始化表单组件并注册到form组件内部
setupVbenForm<FormComponentType>({ setupVbenForm<FormComponentType>({
components: { components: {
@ -56,14 +67,14 @@ setupVbenForm<FormComponentType>({
return h(ElButton, { ...props, attrs, type: 'primary' }, slots); return h(ElButton, { ...props, attrs, type: 'primary' }, slots);
}, },
Divider: ElDivider, Divider: ElDivider,
Input: ElInput, Input: withDefaultPlaceholder(ElInput, 'input'),
InputNumber: ElInputNumber, InputNumber: withDefaultPlaceholder(ElInputNumber, 'input'),
RadioGroup: ElRadioGroup, RadioGroup: ElRadioGroup,
Select: ElSelect, Select: withDefaultPlaceholder(ElSelect, 'select'),
Space: ElSpace, Space: ElSpace,
Switch: ElSwitch, Switch: ElSwitch,
TimePicker: ElTimePicker, TimePicker: ElTimePicker,
TreeSelect: ElTreeSelect, TreeSelect: withDefaultPlaceholder(ElTreeSelect, 'select'),
Upload: ElUpload, Upload: ElUpload,
}, },
config: { config: {

View File

@ -4,6 +4,7 @@ import type {
VbenFormProps, VbenFormProps,
} from '@vben/common-ui'; } from '@vben/common-ui';
import type { Component, SetupContext } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui'; import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
@ -43,6 +44,16 @@ export type FormComponentType =
| 'Upload' | 'Upload'
| BaseFormComponentType; | BaseFormComponentType;
const withDefaultPlaceholder = <T extends Component>(
component: T,
type: 'input' | 'select',
) => {
return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => {
const placeholder = props?.placeholder || $t(`placeholder.${type}`);
return h(component, { ...props, ...attrs, placeholder }, slots);
};
};
// 初始化表单组件并注册到form组件内部 // 初始化表单组件并注册到form组件内部
setupVbenForm<FormComponentType>({ setupVbenForm<FormComponentType>({
components: { components: {
@ -62,17 +73,18 @@ setupVbenForm<FormComponentType>({
); );
}, },
Divider: NDivider, Divider: NDivider,
Input: NInput, Input: withDefaultPlaceholder(NInput, 'input'),
InputNumber: NInputNumber, InputNumber: withDefaultPlaceholder(NInputNumber, 'input'),
RadioGroup: NRadioGroup, RadioGroup: NRadioGroup,
Select: NSelect, Select: withDefaultPlaceholder(NSelect, 'select'),
Space: NSpace, Space: NSpace,
Switch: NSwitch, Switch: NSwitch,
TimePicker: NTimePicker, TimePicker: NTimePicker,
TreeSelect: NTreeSelect, TreeSelect: withDefaultPlaceholder(NTreeSelect, 'select'),
Upload: NUpload, Upload: NUpload,
}, },
config: { config: {
disabledOnChangeListener: true,
baseModelPropName: 'value', baseModelPropName: 'value',
modelPropNameMap: { modelPropNameMap: {
Checkbox: 'checked', Checkbox: 'checked',

View File

@ -25,7 +25,6 @@ const routes: RouteRecordRaw[] = [
}, },
{ {
meta: { meta: {
icon: 'mdi:shield-key-outline',
title: $t('page.demos.table'), title: $t('page.demos.table'),
}, },
name: 'Table', name: 'Table',

View File

@ -1,4 +1,8 @@
import type { BaseFormComponentType, VbenFormAdapterOptions } from './types'; import type {
BaseFormComponentType,
FormCommonConfig,
VbenFormAdapterOptions,
} from './types';
import type { Component } from 'vue'; import type { Component } from 'vue';
import { h } from 'vue'; import { h } from 'vue';
@ -16,6 +20,8 @@ import { defineRule } from 'vee-validate';
const DEFAULT_MODEL_PROP_NAME = 'modelValue'; const DEFAULT_MODEL_PROP_NAME = 'modelValue';
export const DEFAULT_FORM_COMMON_CONFIG: FormCommonConfig = {};
export const COMPONENT_MAP: Record<BaseFormComponentType, Component> = { export const COMPONENT_MAP: Record<BaseFormComponentType, Component> = {
DefaultResetActionButton: h(VbenButton, { size: 'sm', variant: 'outline' }), DefaultResetActionButton: h(VbenButton, { size: 'sm', variant: 'outline' }),
DefaultSubmitActionButton: h(VbenButton, { size: 'sm', variant: 'default' }), DefaultSubmitActionButton: h(VbenButton, { size: 'sm', variant: 'default' }),
@ -37,6 +43,9 @@ export function setupVbenForm<
>(options: VbenFormAdapterOptions<T>) { >(options: VbenFormAdapterOptions<T>) {
const { components, config, defineRules } = options; const { components, config, defineRules } = options;
DEFAULT_FORM_COMMON_CONFIG.disabledOnChangeListener =
config?.disabledOnChangeListener ?? false;
if (defineRules) { if (defineRules) {
for (const key of Object.keys(defineRules)) { for (const key of Object.keys(defineRules)) {
defineRule(key, defineRules[key as never]); defineRule(key, defineRules[key as never]);

View File

@ -3,7 +3,7 @@ import type { ZodType } from 'zod';
import type { FormSchema, MaybeComponentProps } from '../types'; import type { FormSchema, MaybeComponentProps } from '../types';
import { computed, nextTick, ref, watch } from 'vue'; import { computed, nextTick, useTemplateRef, watch } from 'vue';
import { import {
FormControl, FormControl,
@ -32,6 +32,7 @@ const {
dependencies, dependencies,
description, description,
disabled, disabled,
disabledOnChangeListener,
fieldName, fieldName,
formFieldProps, formFieldProps,
label, label,
@ -49,19 +50,10 @@ const { componentBindEventMap, componentMap, isVertical } = useFormContext();
const formRenderProps = injectRenderFormProps(); const formRenderProps = injectRenderFormProps();
const values = useFormValues(); const values = useFormValues();
const errors = useFieldError(fieldName); const errors = useFieldError(fieldName);
const fieldComponentRef = useTemplateRef<HTMLInputElement>('fieldComponentRef');
const formApi = formRenderProps.form; const formApi = formRenderProps.form;
const isInValid = computed(() => errors.value?.length > 0); const isInValid = computed(() => errors.value?.length > 0);
const fieldComponentRef = ref<HTMLInputElement | null>(null);
const focus = () => {
if (
fieldComponentRef.value &&
typeof fieldComponentRef.value.focus === 'function' &&
document.activeElement !== fieldComponentRef.value //
) {
fieldComponentRef.value.focus();
}
};
const fieldComponent = computed(() => { const fieldComponent = computed(() => {
const finalComponent = isString(component) const finalComponent = isString(component)
@ -171,7 +163,7 @@ watch(
(value) => { (value) => {
if (value === true) { if (value === true) {
nextTick(() => { nextTick(() => {
focus(); autofocus();
}); });
} }
}, },
@ -222,15 +214,16 @@ function fieldBindEvent(slotProps: Record<string, any>) {
return { return {
[`onUpdate:${bindEventField}`]: handler, [`onUpdate:${bindEventField}`]: handler,
[bindEventField]: value, [bindEventField]: value,
onChange: (e: Record<string, any>) => { onChange: disabledOnChangeListener
const shouldUnwrap = isEventObjectLike(e); ? undefined
const onChange = slotProps?.componentField?.onChange; : (e: Record<string, any>) => {
if (!shouldUnwrap) { const shouldUnwrap = isEventObjectLike(e);
return onChange?.(e); const onChange = slotProps?.componentField?.onChange;
} if (!shouldUnwrap) {
return onChange?.(e);
return onChange?.(e?.target?.[bindEventField] ?? e); }
}, return onChange?.(e?.target?.[bindEventField] ?? e);
},
onInput: () => {}, onInput: () => {},
}; };
} }
@ -248,6 +241,17 @@ function createComponentProps(slotProps: Record<string, any>) {
return binds; return binds;
} }
function autofocus() {
if (
fieldComponentRef.value &&
isFunction(fieldComponentRef.value.focus) &&
//
document.activeElement !== fieldComponentRef.value
) {
fieldComponentRef.value?.focus?.();
}
}
</script> </script>
<template> <template>

View File

@ -1,12 +1,17 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ZodTypeAny } from 'zod'; import type { ZodTypeAny } from 'zod';
import type { FormRenderProps, FormSchema, FormShape } from '../types'; import type {
FormCommonConfig,
FormRenderProps,
FormSchema,
FormShape,
} from '../types';
import { computed } from 'vue'; import { computed } from 'vue';
import { Form } from '@vben-core/shadcn-ui'; import { Form } from '@vben-core/shadcn-ui';
import { cn, isString } from '@vben-core/shared/utils'; import { cn, isString, mergeWithArrayOverride } from '@vben-core/shared/utils';
import { type GenericObject } from 'vee-validate'; import { type GenericObject } from 'vee-validate';
@ -17,12 +22,16 @@ import { getBaseRules, getDefaultValueInZodStack } from './helper';
interface Props extends FormRenderProps {} interface Props extends FormRenderProps {}
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(
collapsedRows: 1, defineProps<{ globalCommonConfig?: FormCommonConfig } & Props>(),
commonConfig: () => ({}), {
showCollapseButton: false, collapsedRows: 1,
wrapperClass: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3', commonConfig: () => ({}),
}); globalCommonConfig: () => ({}),
showCollapseButton: false,
wrapperClass: 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3',
},
);
const emits = defineEmits<{ const emits = defineEmits<{
submit: [event: any]; submit: [event: any];
@ -77,6 +86,7 @@ const computedSchema = computed(
componentProps = {}, componentProps = {},
controlClass = '', controlClass = '',
disabled, disabled,
disabledOnChangeListener = false,
formFieldProps = {}, formFieldProps = {},
formItemClass = '', formItemClass = '',
hideLabel = false, hideLabel = false,
@ -84,7 +94,7 @@ const computedSchema = computed(
labelClass = '', labelClass = '',
labelWidth = 100, labelWidth = 100,
wrapperClass = '', wrapperClass = '',
} = props.commonConfig; } = mergeWithArrayOverride(props.commonConfig, props.globalCommonConfig);
return (props.schema || []).map((schema, index) => { return (props.schema || []).map((schema, index) => {
const keepIndex = keepFormItemIndex.value; const keepIndex = keepFormItemIndex.value;
@ -96,6 +106,7 @@ const computedSchema = computed(
return { return {
disabled, disabled,
disabledOnChangeListener,
hideLabel, hideLabel,
hideRequiredMark, hideRequiredMark,
labelWidth, labelWidth,

View File

@ -139,6 +139,11 @@ export interface FormCommonConfig {
* @default false * @default false
*/ */
disabled?: boolean; disabled?: boolean;
/**
* change事件监听
* @default false
*/
disabledOnChangeListener?: boolean;
/** /**
* *
* @default {} * @default {}
@ -317,6 +322,7 @@ export interface VbenFormAdapterOptions<
components: Partial<Record<T, Component>>; components: Partial<Record<T, Component>>;
config?: { config?: {
baseModelPropName?: string; baseModelPropName?: string;
disabledOnChangeListener?: boolean;
modelPropNameMap?: Partial<Record<T, string>>; modelPropNameMap?: Partial<Record<T, string>>;
}; };
defineRules?: { defineRules?: {

View File

@ -6,7 +6,11 @@ import { ref, watchEffect } from 'vue';
import { useForwardPropsEmits } from '@vben-core/composables'; import { useForwardPropsEmits } from '@vben-core/composables';
import FormActions from './components/form-actions.vue'; import FormActions from './components/form-actions.vue';
import { COMPONENT_BIND_EVENT_MAP, COMPONENT_MAP } from './config'; import {
COMPONENT_BIND_EVENT_MAP,
COMPONENT_MAP,
DEFAULT_FORM_COMMON_CONFIG,
} from './config';
import { Form } from './form-render'; import { Form } from './form-render';
import { provideFormProps, useFormInitial } from './use-form-context'; import { provideFormProps, useFormInitial } from './use-form-context';
@ -51,6 +55,7 @@ watchEffect(() => {
:component-bind-event-map="COMPONENT_BIND_EVENT_MAP" :component-bind-event-map="COMPONENT_BIND_EVENT_MAP"
:component-map="COMPONENT_MAP" :component-map="COMPONENT_MAP"
:form="form" :form="form"
:global-common-config="DEFAULT_FORM_COMMON_CONFIG"
> >
<template <template
v-for="slotName in delegatedSlots" v-for="slotName in delegatedSlots"

View File

@ -4,10 +4,13 @@ import type { ExtendedFormApi, VbenFormProps } from './types';
import { useForwardPriorityValues } from '@vben-core/composables'; import { useForwardPriorityValues } from '@vben-core/composables';
import FormActions from './components/form-actions.vue'; import FormActions from './components/form-actions.vue';
import { COMPONENT_BIND_EVENT_MAP, COMPONENT_MAP } from './config'; import {
COMPONENT_BIND_EVENT_MAP,
COMPONENT_MAP,
DEFAULT_FORM_COMMON_CONFIG,
} from './config';
import { Form } from './form-render'; import { Form } from './form-render';
import { provideFormProps, useFormInitial } from './use-form-context'; import { provideFormProps, useFormInitial } from './use-form-context';
// extends // extends
interface Props extends VbenFormProps { interface Props extends VbenFormProps {
formApi: ExtendedFormApi; formApi: ExtendedFormApi;
@ -36,6 +39,7 @@ const handleUpdateCollapsed = (value: boolean) => {
:component-bind-event-map="COMPONENT_BIND_EVENT_MAP" :component-bind-event-map="COMPONENT_BIND_EVENT_MAP"
:component-map="COMPONENT_MAP" :component-map="COMPONENT_MAP"
:form="form" :form="form"
:global-common-config="DEFAULT_FORM_COMMON_CONFIG"
> >
<template <template
v-for="slotName in delegatedSlots" v-for="slotName in delegatedSlots"

View File

@ -4,7 +4,8 @@ import type {
VbenFormProps, VbenFormProps,
} from '@vben/common-ui'; } from '@vben/common-ui';
import { type Component, h, type SetupContext } from 'vue'; import type { Component, SetupContext } from 'vue';
import { h } from 'vue';
import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui'; import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
@ -63,7 +64,7 @@ const withDefaultPlaceholder = <T extends Component>(
) => { ) => {
return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => { return (props: any, { attrs, slots }: Omit<SetupContext, 'expose'>) => {
const placeholder = props?.placeholder || $t(`placeholder.${type}`); const placeholder = props?.placeholder || $t(`placeholder.${type}`);
return h(component, { ...props, attrs, placeholder }, slots); return h(component, { ...props, ...attrs, placeholder }, slots);
}; };
}; };

View File

@ -10910,7 +10910,7 @@ snapshots:
'@babel/generator@7.25.6': '@babel/generator@7.25.6':
dependencies: dependencies:
'@babel/types': 7.25.6 '@babel/types': 7.25.7
'@jridgewell/gen-mapping': 0.3.5 '@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
jsesc: 2.5.2 jsesc: 2.5.2
@ -10924,7 +10924,7 @@ snapshots:
'@babel/helper-annotate-as-pure@7.24.7': '@babel/helper-annotate-as-pure@7.24.7':
dependencies: dependencies:
'@babel/types': 7.25.6 '@babel/types': 7.25.7
'@babel/helper-annotate-as-pure@7.25.7': '@babel/helper-annotate-as-pure@7.25.7':
dependencies: dependencies:
@ -11000,7 +11000,7 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.24.8': '@babel/helper-member-expression-to-functions@7.24.8':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.6 '@babel/types': 7.25.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -11014,7 +11014,7 @@ snapshots:
'@babel/helper-module-imports@7.24.7': '@babel/helper-module-imports@7.24.7':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.6 '@babel/types': 7.25.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -11047,7 +11047,7 @@ snapshots:
'@babel/helper-optimise-call-expression@7.24.7': '@babel/helper-optimise-call-expression@7.24.7':
dependencies: dependencies:
'@babel/types': 7.25.6 '@babel/types': 7.25.7
'@babel/helper-optimise-call-expression@7.25.7': '@babel/helper-optimise-call-expression@7.25.7':
dependencies: dependencies:
@ -11087,7 +11087,7 @@ snapshots:
'@babel/helper-simple-access@7.24.7': '@babel/helper-simple-access@7.24.7':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.6 '@babel/types': 7.25.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -11101,7 +11101,7 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.24.7': '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
dependencies: dependencies:
'@babel/traverse': 7.25.6 '@babel/traverse': 7.25.6
'@babel/types': 7.25.6 '@babel/types': 7.25.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -11135,11 +11135,11 @@ snapshots:
'@babel/helpers@7.25.6': '@babel/helpers@7.25.6':
dependencies: dependencies:
'@babel/template': 7.25.0 '@babel/template': 7.25.0
'@babel/types': 7.25.6 '@babel/types': 7.25.7
'@babel/highlight@7.24.7': '@babel/highlight@7.24.7':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.24.7 '@babel/helper-validator-identifier': 7.25.7
chalk: 2.4.2 chalk: 2.4.2
js-tokens: 4.0.0 js-tokens: 4.0.0
picocolors: 1.1.0 picocolors: 1.1.0
@ -11787,8 +11787,8 @@ snapshots:
'@babel/template@7.25.0': '@babel/template@7.25.0':
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@babel/types': 7.25.6 '@babel/types': 7.25.7
'@babel/template@7.25.7': '@babel/template@7.25.7':
dependencies: dependencies:
@ -11800,7 +11800,7 @@ snapshots:
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
'@babel/generator': 7.25.6 '@babel/generator': 7.25.6
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@babel/template': 7.25.0 '@babel/template': 7.25.0
'@babel/types': 7.25.6 '@babel/types': 7.25.6
debug: 4.3.7 debug: 4.3.7
@ -13053,7 +13053,7 @@ snapshots:
'@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@10.0.0)(@vue/compiler-dom@3.5.10)(vue-i18n@10.0.3(vue@3.5.10(typescript@5.6.2)))(vue@3.5.10(typescript@5.6.2))': '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@10.0.0)(@vue/compiler-dom@3.5.10)(vue-i18n@10.0.3(vue@3.5.10(typescript@5.6.2)))(vue@3.5.10(typescript@5.6.2))':
dependencies: dependencies:
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
optionalDependencies: optionalDependencies:
'@intlify/shared': 10.0.0 '@intlify/shared': 10.0.0
'@vue/compiler-dom': 3.5.10 '@vue/compiler-dom': 3.5.10
@ -14244,14 +14244,14 @@ snapshots:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
'@babel/helper-module-imports': 7.24.7 '@babel/helper-module-imports': 7.24.7
'@babel/helper-plugin-utils': 7.24.8 '@babel/helper-plugin-utils': 7.24.8
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@vue/compiler-sfc': 3.5.10 '@vue/compiler-sfc': 3.5.10
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vue/compiler-core@3.5.10': '@vue/compiler-core@3.5.10':
dependencies: dependencies:
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@vue/shared': 3.5.10 '@vue/shared': 3.5.10
entities: 4.5.0 entities: 4.5.0
estree-walker: 2.0.2 estree-walker: 2.0.2
@ -14259,7 +14259,7 @@ snapshots:
'@vue/compiler-core@3.5.8': '@vue/compiler-core@3.5.8':
dependencies: dependencies:
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@vue/shared': 3.5.8 '@vue/shared': 3.5.8
entities: 4.5.0 entities: 4.5.0
estree-walker: 2.0.2 estree-walker: 2.0.2
@ -14277,7 +14277,7 @@ snapshots:
'@vue/compiler-sfc@3.5.10': '@vue/compiler-sfc@3.5.10':
dependencies: dependencies:
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@vue/compiler-core': 3.5.10 '@vue/compiler-core': 3.5.10
'@vue/compiler-dom': 3.5.10 '@vue/compiler-dom': 3.5.10
'@vue/compiler-ssr': 3.5.10 '@vue/compiler-ssr': 3.5.10
@ -14289,7 +14289,7 @@ snapshots:
'@vue/compiler-sfc@3.5.8': '@vue/compiler-sfc@3.5.8':
dependencies: dependencies:
'@babel/parser': 7.25.6 '@babel/parser': 7.25.7
'@vue/compiler-core': 3.5.8 '@vue/compiler-core': 3.5.8
'@vue/compiler-dom': 3.5.8 '@vue/compiler-dom': 3.5.8
'@vue/compiler-ssr': 3.5.8 '@vue/compiler-ssr': 3.5.8