diff --git a/@xen-orchestra/web-core/lib/components/ui/input/UiInput.vue b/@xen-orchestra/web-core/lib/components/ui/input/UiInput.vue index e36f5a630c4..6d3ef0b5f1f 100644 --- a/@xen-orchestra/web-core/lib/components/ui/input/UiInput.vue +++ b/@xen-orchestra/web-core/lib/components/ui/input/UiInput.vue @@ -8,23 +8,26 @@ {{ info }} + + {{ errorMessage }} + @@ -35,6 +38,7 @@ import UiLabel from '@core/components/ui/label/UiLabel.vue' import { toVariants } from '@core/utils/to-variants.util' import type { IconDefinition } from '@fortawesome/fontawesome-common-types' import { faXmark } from '@fortawesome/free-solid-svg-icons' +import { useField } from 'vee-validate' import { computed, useAttrs, useId } from 'vue' type InputAccent = 'brand' | 'warning' | 'danger' @@ -43,8 +47,14 @@ type InputType = 'text' | 'number' | 'password' | 'search' defineOptions({ inheritAttrs: false, }) - -const { accent, id = useId() } = defineProps<{ +const { + accent, + id = useId(), + name, + modelValue, +} = defineProps<{ + name?: string + modelValue: string | number accent: InputAccent label?: string info?: string @@ -58,16 +68,31 @@ const { accent, id = useId() } = defineProps<{ type?: InputType }>() -const modelValue = defineModel({ required: true }) +const emit = defineEmits<{ + 'update:modelValue': [value: string | number] +}>() const slots = defineSlots<{ default?(): any info?(): any }>() +const { value, errorMessage } = useField(() => name ?? '', undefined, { + initialValue: modelValue, + syncVModel: true, +}) + const attrs = useAttrs() const labelAccent = computed(() => (accent === 'brand' ? 'neutral' : accent)) + +const inputValue = computed({ + get: () => modelValue, + set: val => { + value.value = val + emit('update:modelValue', val) + }, +}) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/pif.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/pif.store.ts index 1fd329a4bb8..5f4e63a3e7a 100644 --- a/@xen-orchestra/web/src/stores/xo-rest-api/pif.store.ts +++ b/@xen-orchestra/web/src/stores/xo-rest-api/pif.store.ts @@ -33,6 +33,20 @@ export const usePifStore = defineStore('pif', () => { return hostMasterPifsByNetworkMap }) + const pifsByNetwork = computed(() => { + const pifsByNetworkMap = new Map() + + baseContext.records.value.forEach(pif => { + const networkId = pif.$network + if (!pifsByNetworkMap.has(networkId)) { + pifsByNetworkMap.set(networkId, []) + } + pifsByNetworkMap.get(networkId)?.push(pif) + }) + + return pifsByNetworkMap + }) + const getPifsByNetworkId = (networkId: XoNetwork['id']) => { return baseContext.records.value.filter(pif => pif.$network === networkId) } @@ -67,6 +81,7 @@ export const usePifStore = defineStore('pif', () => { const context = { ...baseContext, hostMasterPifsByNetwork, + pifsByNetwork, pifsByHost, getPifsByNetworkId, getPifStatus, diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/pool.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/pool.store.ts index 52c00f8142f..e02ae5f196f 100644 --- a/@xen-orchestra/web/src/stores/xo-rest-api/pool.store.ts +++ b/@xen-orchestra/web/src/stores/xo-rest-api/pool.store.ts @@ -1,12 +1,20 @@ +import type { XoPool } from '@/types/xo/pool.type' import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' import { sortByNameLabel } from '@core/utils/sort-by-name-label.util' import { defineStore } from 'pinia' +import { computed } from 'vue' export const usePoolStore = defineStore('pool', () => { - const config = createXoStoreConfig('pool', { + const { context: baseContext, ...configRest } = createXoStoreConfig('pool', { sortBy: sortByNameLabel, }) + const pool = computed(() => baseContext.records.value[0]) - return createSubscribableStoreContext(config, {}) + const context = { + ...baseContext, + pool, + } + + return createSubscribableStoreContext({ context, ...configRest }, {}) }) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/sr.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/sr.store.ts new file mode 100644 index 00000000000..1646d834a5b --- /dev/null +++ b/@xen-orchestra/web/src/stores/xo-rest-api/sr.store.ts @@ -0,0 +1,47 @@ +import { useVdiStore } from '@/stores/xo-rest-api/vdi.store' +import type { XoSr } from '@/types/xo/sr.type' +import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' +import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' +import { defineStore } from 'pinia' +import { computed } from 'vue' + +export const useSrStore = defineStore('sr', () => { + const { context: baseContext, ...configRest } = createXoStoreConfig('sr') + + const deps = { + vdiStore: useVdiStore(), + } + const vdiContext = deps.vdiStore.getContext() + + const srs = computed(() => baseContext.records.value) + const srsName = (ref: XoSr['id']) => baseContext.get(ref)?.name_label + + const getSrWithISO = computed(() => srs.value.filter(sr => sr.SR_type === 'iso')) + + const concatVidsArray = computed(() => getSrWithISO.value.flatMap(sr => sr.VDIs || [])) + + const vdisGroupedBySrName = computed(() => { + const groupedVdis: Record = {} + + concatVidsArray.value.forEach(vdiRef => { + const vdi = vdiContext.get(vdiRef) + + if (vdi) { + const srName = srsName(vdi.$SR) || 'Unknown SR' + if (!groupedVdis[srName]) { + groupedVdis[srName] = [] + } + groupedVdis[srName].push(vdi as any) + } + }) + + return groupedVdis + }) + + const context = { + ...baseContext, + vdisGroupedBySrName, + } + + return createSubscribableStoreContext({ context, ...configRest }, deps) +}) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/vbd.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/vbd.store.ts new file mode 100644 index 00000000000..8f47dce70cf --- /dev/null +++ b/@xen-orchestra/web/src/stores/xo-rest-api/vbd.store.ts @@ -0,0 +1,9 @@ +import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' +import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' +import { defineStore } from 'pinia' + +export const useVbdStore = defineStore('vbd', () => { + const config = createXoStoreConfig('vbd') + + return createSubscribableStoreContext(config, {}) +}) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/vdi.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/vdi.store.ts new file mode 100644 index 00000000000..65751feedd2 --- /dev/null +++ b/@xen-orchestra/web/src/stores/xo-rest-api/vdi.store.ts @@ -0,0 +1,9 @@ +import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' +import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' +import { defineStore } from 'pinia' + +export const useVdiStore = defineStore('vdi', () => { + const config = createXoStoreConfig('vdi') + + return createSubscribableStoreContext(config, {}) +}) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/vif.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/vif.store.ts new file mode 100644 index 00000000000..faeb58c5e14 --- /dev/null +++ b/@xen-orchestra/web/src/stores/xo-rest-api/vif.store.ts @@ -0,0 +1,9 @@ +import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' +import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' +import { defineStore } from 'pinia' + +export const useVifStore = defineStore('vif', () => { + const config = createXoStoreConfig('vif') + + return createSubscribableStoreContext(config, {}) +}) diff --git a/@xen-orchestra/web/src/stores/xo-rest-api/vm-template.store.ts b/@xen-orchestra/web/src/stores/xo-rest-api/vm-template.store.ts new file mode 100644 index 00000000000..8030bf20645 --- /dev/null +++ b/@xen-orchestra/web/src/stores/xo-rest-api/vm-template.store.ts @@ -0,0 +1,33 @@ +import type { XoPool } from '@/types/xo/pool.type' +import type { XoVmTemplate } from '@/types/xo/vm-template.type' +import { createXoStoreConfig } from '@/utils/create-xo-store-config.util' +import { createSubscribableStoreContext } from '@core/utils/create-subscribable-store-context.util' +import { sortByNameLabel } from '@core/utils/sort-by-name-label.util' +import { defineStore } from 'pinia' +import { computed } from 'vue' + +export const useVmTemplateStore = defineStore('vm-template', () => { + const { context: baseContext, ...configRest } = createXoStoreConfig('vm_template', { + sortBy: sortByNameLabel, + }) + + const vmsTemplatesByPool = computed(() => { + const vmTemplatesByPoolMap = new Map() + baseContext.records.value.forEach(template => { + const poolId = template.$pool + if (!vmTemplatesByPoolMap.has(poolId)) { + vmTemplatesByPoolMap.set(poolId, []) + } + vmTemplatesByPoolMap.get(poolId)?.push(template) + }) + + return vmTemplatesByPoolMap + }) + + const context = { + ...baseContext, + vmsTemplatesByPool, + } + + return createSubscribableStoreContext({ context, ...configRest }, {}) +}) diff --git a/@xen-orchestra/web/src/types/xo/network.type.ts b/@xen-orchestra/web/src/types/xo/network.type.ts index a3afbafc233..a5c2e3b8d92 100644 --- a/@xen-orchestra/web/src/types/xo/network.type.ts +++ b/@xen-orchestra/web/src/types/xo/network.type.ts @@ -9,6 +9,7 @@ export type XoNetwork = { name_description: string MTU: number nbd: boolean + other_config: { automatic: string } tags: string[] PIFs: string[] } diff --git a/@xen-orchestra/web/src/types/xo/pool.type.ts b/@xen-orchestra/web/src/types/xo/pool.type.ts index 4811f8589be..13159acba4a 100644 --- a/@xen-orchestra/web/src/types/xo/pool.type.ts +++ b/@xen-orchestra/web/src/types/xo/pool.type.ts @@ -9,4 +9,5 @@ export type XoPool = { name_description: string name_label: string _xapiRef: string + default_SR: string } diff --git a/@xen-orchestra/web/src/types/xo/sr.type.ts b/@xen-orchestra/web/src/types/xo/sr.type.ts new file mode 100644 index 00000000000..b16d4728da5 --- /dev/null +++ b/@xen-orchestra/web/src/types/xo/sr.type.ts @@ -0,0 +1,14 @@ +import type { XoPool } from '@/types/xo/pool.type' +import type { XoVdi } from '@/types/xo/vdi.type' +import type { Branded } from '@core/types/utility.type' + +export type XoSr = { + $pool: XoPool['id'] + id: Branded<'sr'> + name_label: string + name_description: string + content_type: string + physical_usage: number + SR_type: string + VDIs: XoVdi['id'] +} diff --git a/@xen-orchestra/web/src/types/xo/vbd.type.ts b/@xen-orchestra/web/src/types/xo/vbd.type.ts new file mode 100644 index 00000000000..373760431ad --- /dev/null +++ b/@xen-orchestra/web/src/types/xo/vbd.type.ts @@ -0,0 +1,10 @@ +import type { XoVdi } from '@/types/xo/vdi.type' +import type { Branded } from '@core/types/utility.type' + +export type XoVbd = { + id: Branded<'vbd'> + name_label: string + name_description: string + type: string + VDI: XoVdi['id'] +} diff --git a/@xen-orchestra/web/src/types/xo/vdi.type.ts b/@xen-orchestra/web/src/types/xo/vdi.type.ts new file mode 100644 index 00000000000..12b4f99fa58 --- /dev/null +++ b/@xen-orchestra/web/src/types/xo/vdi.type.ts @@ -0,0 +1,13 @@ +import type { XoSr } from '@/types/xo/sr.type' +import type { XoVbd } from '@/types/xo/vbd.type' +import type { Branded } from '@core/types/utility.type' + +export type XoVdi = { + id: Branded<'vdi'> + name_label: string + name_description: string + type: string + size: number + $SR: XoSr['id'] + $VBDs: XoVbd['id'][] +} diff --git a/@xen-orchestra/web/src/types/xo/vif.type.ts b/@xen-orchestra/web/src/types/xo/vif.type.ts new file mode 100644 index 00000000000..cbc88275e7c --- /dev/null +++ b/@xen-orchestra/web/src/types/xo/vif.type.ts @@ -0,0 +1,8 @@ +import type { XoNetwork } from '@/types/xo/network.type' +import type { Branded } from '@core/types/utility.type' + +export type XoVif = { + id: Branded<'vif'> + MAC: string + $network: XoNetwork['id'] +} diff --git a/@xen-orchestra/web/src/types/xo/vm-template.type.ts b/@xen-orchestra/web/src/types/xo/vm-template.type.ts new file mode 100644 index 00000000000..700777e846b --- /dev/null +++ b/@xen-orchestra/web/src/types/xo/vm-template.type.ts @@ -0,0 +1,32 @@ +import type { XoPool } from '@/types/xo/pool.type' +import type { Branded } from '@core/types/utility.type' + +type Disk = { + bootable: boolean + device: string + size: number + type: string + SR: string +} + +export type XoVmTemplate = { + $VBDs: [] + $pool: XoPool['id'] + CPUs: { max: number; number: number } + VIFs: [] + boot: { firmware: string; order: string } + id: Branded<'vm-template'> + uuid: Branded<'vm-template'> + isDefaultTemplate: boolean + memory: { dynamic: number[]; static: number[]; size: number } + name_description: string + name_label: string + install: { + method: string + repository?: string + } + affinity_host: string + tags: [] + template_info: { disks: Disk[]; install_methods: string[] } + type: 'VM-template' +} diff --git a/@xen-orchestra/web/src/types/xo/vm.type.ts b/@xen-orchestra/web/src/types/xo/vm.type.ts index 8423846c622..4a8e9959927 100644 --- a/@xen-orchestra/web/src/types/xo/vm.type.ts +++ b/@xen-orchestra/web/src/types/xo/vm.type.ts @@ -1,5 +1,6 @@ import type { XoHost } from '@/types/xo/host.type' import type { XoPool } from '@/types/xo/pool.type' +import type { XoVbd } from '@/types/xo/vbd.type' import type { Branded } from '@core/types/utility.type' export enum VM_POWER_STATE { @@ -24,6 +25,7 @@ export type XoVm = { type: 'VM' $container: XoPool['id'] | XoHost['id'] $pool: XoPool['id'] + $VBDs: XoVbd['id'] _xapiRef: string current_operations: Record name_label: string diff --git a/@xen-orchestra/web/src/utils/xo-api-definition.util.ts b/@xen-orchestra/web/src/utils/xo-api-definition.util.ts index e1e2fef3d0f..d28502eaf59 100644 --- a/@xen-orchestra/web/src/utils/xo-api-definition.util.ts +++ b/@xen-orchestra/web/src/utils/xo-api-definition.util.ts @@ -4,15 +4,20 @@ import type { XoHost } from '@/types/xo/host.type' import type { XoNetwork } from '@/types/xo/network.type' import type { XoPif } from '@/types/xo/pif.type' import type { XoPool } from '@/types/xo/pool.type' +import type { XoSr } from '@/types/xo/sr.type' import type { XoTask } from '@/types/xo/task.type' +import type { XoVbd } from '@/types/xo/vbd.type' +import type { XoVdi } from '@/types/xo/vdi.type' +import type { XoVif } from '@/types/xo/vif.type' +import type { XoVmTemplate } from '@/types/xo/vm-template.type' import type { XoVm } from '@/types/xo/vm.type' export const xoApiDefinition = { - pool: { - type: 'collection', - path: 'pools', - fields: 'id,name_label,master', - handler: (record: XoPool) => record, + dashboard: { + type: 'single', + path: 'dashboard', + fields: '*', + handler: (record: XoDashboard) => record, }, host: { type: 'collection', @@ -20,11 +25,29 @@ export const xoApiDefinition = { fields: 'id,name_label,name_description,power_state,controlDomain,residentVms,$pool,current_operations', handler: (record: XoHost) => record, }, - vm: { + network: { type: 'collection', - path: 'vms', - fields: 'id,name_label,name_description,power_state,$container,$pool,other,current_operations', - handler: (record: XoVm) => record, + path: 'networks', + fields: 'id,defaultIsLocked,name_label,nbd,tags,$pool,name_description,MTU,PIFs,other_config', + handler: (record: XoNetwork) => record, + }, + pif: { + type: 'collection', + path: 'pifs', + fields: '$host,$network,attached,carrier,device,dns,gateway,id,ip,ipv6,mac,management,mode,mtu,netmask,speed,vlan', + handler: (record: XoPif) => record, + }, + pool: { + type: 'collection', + path: 'pools', + fields: 'id,name_label,master,default_SR', + handler: (record: XoPool) => record, + }, + sr: { + type: 'collection', + path: 'srs', + fields: 'id,name_label,name_description,$pool,content_type,physical_usage,SR_type,VDIs', + handler: (record: XoSr) => record, }, task: { type: 'collection', @@ -32,22 +55,34 @@ export const xoApiDefinition = { fields: 'id,start,end,properties,status,progress,tasks', handler: (record: XoTask) => record, }, - dashboard: { - type: 'single', - path: 'dashboard', - fields: '*', - handler: (record: XoDashboard) => record, + vbd: { + type: 'collection', + path: 'vbds', + fields: 'id,name_label,name_description,VDI', + handler: (record: XoVbd) => record, }, - pif: { + vdi: { type: 'collection', - path: 'pifs', - fields: '$host,$network,attached,carrier,device,dns,gateway,id,ip,ipv6,mac,management,mode,mtu,netmask,speed,vlan', - handler: (record: XoPif) => record, + path: 'vdis', + fields: 'id,name_label,name_description,$VBDs,$SR,size', + handler: (record: XoVdi) => record, }, - network: { + vif: { type: 'collection', - path: 'networks', - fields: 'id,defaultIsLocked,name_label,nbd,tags,$pool,name_description,MTU,PIFs', - handler: (record: XoNetwork) => record, + path: 'vifs', + fields: 'id,MAC,$network', + handler: (record: XoVif) => record, + }, + vm: { + type: 'collection', + path: 'vms', + fields: 'id,name_label,name_description,power_state,$container,$pool,other,current_operations', + handler: (record: XoVm) => record, + }, + vm_template: { + type: 'collection', + path: 'vm-templates', + fields: 'id,uuid,name_label,name_description,$pool,template_info,VIFs,$VBDs,boot,CPUs,memory,tags', + handler: (record: XoVmTemplate) => record, }, } satisfies ApiDefinition diff --git a/@xen-orchestra/web/src/validation/vm-create.schema.ts b/@xen-orchestra/web/src/validation/vm-create.schema.ts new file mode 100644 index 00000000000..a0776c35fce --- /dev/null +++ b/@xen-orchestra/web/src/validation/vm-create.schema.ts @@ -0,0 +1,19 @@ +import { toTypedSchema } from '@vee-validate/yup' +import * as yup from 'yup' + +export const createVMSchema = (maxRam: number, maxVcpu: number) => + toTypedSchema( + yup.object({ + vm_name: yup.string().required('VM Name is required'), + ram: yup + .number() + .min(1, 'RAM must be at least 1') + .max(maxRam, `RAM cannot exceed ${maxRam} GB`) + .required('RAM is required'), + vCpu: yup + .number() + .min(1, 'vCPU must be at least 1') + .max(maxVcpu, `vCpu cannot exceed ${maxVcpu}`) + .required('vCPU is required'), + }) + ) diff --git a/@xen-orchestra/web/typed-router.d.ts b/@xen-orchestra/web/typed-router.d.ts index a166ad3f08d..939575ed275 100644 --- a/@xen-orchestra/web/typed-router.d.ts +++ b/@xen-orchestra/web/typed-router.d.ts @@ -35,5 +35,6 @@ declare module 'vue-router/auto-routes' { '/pool/[id]/vms': RouteRecordInfo<'/pool/[id]/vms', '/pool/:id/vms', { id: ParamValue }, { id: ParamValue }>, '/vm/[id]': RouteRecordInfo<'/vm/[id]', '/vm/:id', { id: ParamValue }, { id: ParamValue }>, '/vm/[id]/console': RouteRecordInfo<'/vm/[id]/console', '/vm/:id/console', { id: ParamValue }, { id: ParamValue }>, + '/vm/NewVm': RouteRecordInfo<'/vm/NewVm', '/vm/NewVm', Record, Record>, } } diff --git a/yarn.lock b/yarn.lock index 50ea7c06431..f6e940588d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4901,6 +4901,14 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@vee-validate/yup@^4.15.0": + version "4.15.0" + resolved "https://registry.yarnpkg.com/@vee-validate/yup/-/yup-4.15.0.tgz#409f9b57414fadd5b86bc6ada18cd51a7ccd121c" + integrity sha512-paK2ZdxZJRrUGwqaqf7KMNC+n5C7UGs7DofK7wZCza/zKT/QtFSxVYgopGoYYrbAfd6DpVmNpf/ouBuRdPBthA== + dependencies: + type-fest "^4.8.3" + vee-validate "4.15.0" + "@vitejs/plugin-vue@^5.1.4": version "5.2.1" resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz#d1491f678ee3af899f7ae57d9c21dc52a65c7133" @@ -4994,6 +5002,33 @@ resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343" integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g== +"@vue/devtools-api@^7.5.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.2.tgz#49837eae6f61fc43a09f5d6c2d3210f9f73a0d09" + integrity sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA== + dependencies: + "@vue/devtools-kit" "^7.7.2" + +"@vue/devtools-kit@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz#3315bd5b144f98c7b84c2f44270b445644ec8f10" + integrity sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ== + dependencies: + "@vue/devtools-shared" "^7.7.2" + birpc "^0.2.19" + hookable "^5.5.3" + mitt "^3.0.1" + perfect-debounce "^1.0.0" + speakingurl "^14.0.1" + superjson "^2.2.1" + +"@vue/devtools-shared@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz#b11b143820130a32d8ce5737e264d06ab6d62f40" + integrity sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA== + dependencies: + rfdc "^1.4.1" + "@vue/eslint-config-prettier@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#f63394f8f7759d92b6ef3f3e1d30ff6b0c0b97c1" @@ -6434,6 +6469,11 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +birpc@^0.2.19: + version "0.2.19" + resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.19.tgz#cdd183a4a70ba103127d49765b4a71349da5a0ca" + integrity sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ== + bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -7725,6 +7765,13 @@ cookies@~0.9.0: depd "~2.0.0" keygrip "~1.1.0" +copy-anything@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" + integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== + dependencies: + is-what "^4.1.8" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -11376,6 +11423,11 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +hookable@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -14339,6 +14391,11 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -16088,6 +16145,11 @@ pbkdf2@^3.1.2: safe-buffer "^5.0.1" sha.js "^2.4.8" +perfect-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" + integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -16539,6 +16601,11 @@ proper-lockfile@^4.1.2: retry "^0.12.0" signal-exit "^3.0.2" +property-expr@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -18540,6 +18607,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== +speakingurl@^14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" + integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== + speedometer@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.0.0.tgz#cd671cb06752c22bca3370e2f334440be4fc62e2" @@ -19028,6 +19100,13 @@ subleveldown@^6.0.1: levelup "^5.1.1" reachdown "^1.1.0" +superjson@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173" + integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q== + dependencies: + copy-anything "^3.0.2" + supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" @@ -19320,6 +19399,11 @@ timers-ext@^0.1.7: es5-ext "^0.10.64" next-tick "^1.1.0" +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + tinyexec@^0.3.0: version "0.3.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" @@ -19422,6 +19506,11 @@ token-stream@1.0.0: resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -19623,6 +19712,16 @@ type-fest@^1.0.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-fest@^4.8.3: + version "4.35.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.35.0.tgz#007ed74d65c2ca0fb3b564b3dc8170d5c872d665" + integrity sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A== + type-is@^1.6.16, type-is@~1.6.10, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -20128,6 +20227,14 @@ vary@^1.1.2, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vee-validate@4.15.0, vee-validate@^4.15.0: + version "4.15.0" + resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-4.15.0.tgz#eb77a9c867669d34abbc33ca5e16f2a991eb7ad5" + integrity sha512-PGJh1QCFwCBjbHu5aN6vB8macYVWrajbDvgo1Y/8fz9n/RVIkLmZCJDpUgu7+mUmCOPMxeyq7vXUOhbwAqdXcA== + dependencies: + "@vue/devtools-api" "^7.5.2" + type-fest "^4.8.3" + vinyl-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" @@ -20921,6 +21028,16 @@ yoga-wasm-web@~0.3.3: resolved "https://registry.yarnpkg.com/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz#eb8e9fcb18e5e651994732f19a220cb885d932ba" integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== +yup@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.6.1.tgz#8defcff9daaf9feac178029c0e13b616563ada4b" + integrity sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" + zrender@5.6.1: version "5.6.1" resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.6.1.tgz#e08d57ecf4acac708c4fcb7481eb201df7f10a6b"