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"