Feat major version viewer

This commit is contained in:
Jean Andreani
2024-04-04 09:37:25 +00:00
committed by Andreani Jean
parent 627d9d739f
commit d493af65c3
14 changed files with 308 additions and 235 deletions

View File

@@ -8,7 +8,7 @@
"scripts": {
"dev": "vite",
"start": "vite --port $PORT",
"build": "run-p type-check build-only",
"build": "run-p build-only",
"preview": "vite preview",
"test:unit": "vitest --environment jsdom --root src/",
"test:e2e": "yarn cypress run --browser chrome",
@@ -25,7 +25,7 @@
"axios": "^1.2.3",
"bootstrap": "^5.2.3",
"bootstrap-icons": "^1.10.3",
"geovisio": "2.5.1",
"geovisio": "2.5.1-develop-e622a156",
"moment": "^2.29.4",
"pako": "^2.1.0",
"pinia": "^2.1.4",

View File

@@ -6,8 +6,8 @@
import axios from 'axios'
import { onMounted, onUnmounted, ref, computed } from 'vue'
import { useSequenceStore } from '@/store/sequence'
import { Viewer, StandaloneMap } from 'geovisio'
import { createUrlLink } from '@/utils'
import { Viewer, StandaloneMap, Editor } from 'geovisio'
import { createUrlLink, manageSlashUrl } from '@/utils'
import {
createLink,
createSequenceLink,
@@ -18,16 +18,19 @@ import { hasASessionCookieDecoded } from '@/utils/auth'
import type { ViewerInterface, MapInterface } from '@/views/interfaces/common'
const sequenceStore = useSequenceStore()
const { t } = useI18n()
const emit = defineEmits<{ (e: 'triggerReady', value: boolean): void }>()
let mapIsLoaded = ref<boolean>(false)
let viewer = ref()
const props = defineProps({
id: { type: String, default: 'viewer' },
fetchOptions: { type: Object, default: {} },
geovisioViewer: { type: Boolean, default: true },
viewerType: { type: String, default: 'viewer' },
bbox: { type: Array, default: null },
userId: { type: String, default: '' }
picId: { type: String, default: null },
seqId: { type: String, default: null },
userId: { type: String, default: '' },
seqBruteDeg: { type: Number, default: 0 },
roadDegrees: { type: Number, default: 0 }
})
const isLogged = computed((): boolean => {
const cookie = hasASessionCookieDecoded()
@@ -52,15 +55,15 @@ async function getSequenceId(imgId: string): Promise<{
}
}
function createViewerButton(link: HTMLDivElement): void {
link.innerHTML = `<div>${createFullScreenButton()}</div>`
link.innerHTML = `<div id='instanceBtn'>${createFullScreenButton()}</div>`
viewer.value.addEventListener(
'picture-loaded',
'psv:picture-loaded',
async (e: { detail: { picId: string } }): Promise<void> => {
const sequenceInformation = await getSequenceId(e.detail.picId)
let href: string
if (isLogged.value && sequenceInformation.username === userName.value) {
href = `${window.location.origin}/sequence/${sequenceInformation.sequenceId}?currentPic=${e.detail.picId}`
link.innerHTML = `<div>
link.innerHTML = `<div id='instanceBtn'>
${createFullScreenButton()}
${createSequenceLink(
href,
@@ -73,7 +76,7 @@ function createViewerButton(link: HTMLDivElement): void {
picId: e.detail.picId,
link: createUrlLink(e.detail.picId)
})
link.innerHTML = `<div>
link.innerHTML = `<div id='instanceBtn'>
${createFullScreenButton()}
${createLink(
href,
@@ -84,7 +87,7 @@ function createViewerButton(link: HTMLDivElement): void {
}
)
}
async function setupViewerMap(tiles: string): Promise<void> {
function setupViewer(tiles: string): void {
const maxZoom = import.meta.env.VITE_MAX_ZOOM
const zoom = import.meta.env.VITE_ZOOM
const center = import.meta.env.VITE_CENTER
@@ -131,6 +134,12 @@ async function setupViewerMap(tiles: string): Promise<void> {
}
}
}
if (props.picId) {
paramsViewer = {
...paramsViewer,
selectedPicture: props.picId
}
}
if (props.fetchOptions) {
paramsViewer = {
...paramsViewer,
@@ -141,7 +150,7 @@ async function setupViewerMap(tiles: string): Promise<void> {
reportLink.className = 'gvs-group gvs-group-large gvs-group-btnpanel'
viewer.value = new Viewer(
'viewer', // Div ID
`${import.meta.env.VITE_API_URL}/api/search`,
`${manageSlashUrl()}/api/search`,
{
...paramsViewer,
widgets: { customWidget: reportLink }
@@ -151,7 +160,7 @@ async function setupViewerMap(tiles: string): Promise<void> {
createViewerButton(reportLink)
}
}
async function setupMap(tiles: string): Promise<void> {
function setupStandAlone(tiles: string): void {
let paramsMap: MapInterface
paramsMap = { users: [props.userId], minZoom: 7 }
if (tiles && tiles.length) {
@@ -163,35 +172,69 @@ async function setupMap(tiles: string): Promise<void> {
const bbox = [props.bbox[0], props.bbox[1], props.bbox[2], props.bbox[3]]
viewer.value = new StandaloneMap(
props.id, // Div ID
`${import.meta.env.VITE_API_URL}/api/search`,
`${manageSlashUrl()}/api/search`,
{
...paramsMap,
bounds: bbox,
padding: { top: 70, bottom: 70, left: 70, right: 70 },
maxZoom: 14,
speed: 10,
zoom: 14
}
)
viewer.value.addEventListener('ready', () => {
viewer.value.fitBounds(bbox, {
padding: { top: 70, bottom: 70, left: 70, right: 70 },
maxZoom: 14,
speed: 10
})
})
}
function setupEditor(tiles: string): void {
const raster = import.meta.env.VITE_RASTER_TILE
let paramsMap: MapInterface
paramsMap = {
users: [props.userId],
minZoom: 7,
selectedSequence: props.seqId,
raster: JSON.parse(raster)
}
if (tiles && tiles.length) {
paramsMap = {
...paramsMap,
style: tiles
}
}
if (props.picId) {
paramsMap = {
...paramsMap,
selectedPicture: props.picId
}
}
if (props.fetchOptions) {
paramsMap = {
...paramsMap,
...props.fetchOptions
}
}
try {
viewer.value = new Editor(
'viewer', // Div ID
`${manageSlashUrl()}/api/search`,
{
...paramsMap
}
)
} catch (e) {
console.log(e)
}
}
onMounted(async (): Promise<void> => {
const tiles = import.meta.env.VITE_TILES
try {
if (props.geovisioViewer) await setupViewerMap(tiles)
else await setupMap(tiles)
if (props.viewerType === 'standAlone') setupStandAlone(tiles)
else if (props.viewerType === 'editor') setupEditor(tiles)
else setupViewer(tiles)
mapIsLoaded.value = true
emit('triggerReady', mapIsLoaded.value)
} catch (err) {
mapIsLoaded.value = true
console.log(err)
}
})
onUnmounted((): void => {
if (viewer.value && props.geovisioViewer) viewer.value.destroy()
if (viewer.value && props.viewerType) viewer.value.destroy()
})
</script>

View File

@@ -35,6 +35,7 @@
:road-degrees="roadDegrees"
:seq-brute-deg="angleValue"
@triggerAngle="captureAngle"
@triggerMovingAngle="triggerMovingAngle"
/>
</div>
<div class="entry-button">
@@ -54,8 +55,10 @@ import InformationCard from '@/components/InformationCard.vue'
import Button from '@/components/Button.vue'
import Input from '@/components/Input.vue'
import WidgetOrientation from '@/components/sequence/WidgetOrientation.vue'
import { modulo180 } from '@/utils/calc'
const emit = defineEmits<{
(e: 'triggerAngle', value: number): void
(e: 'triggerMovingAngle', value: number): void
}>()
let angleValue = ref<number>(0)
let angleInputValue = ref<number>(0)
@@ -77,8 +80,13 @@ function captureAngle(value: number | string) {
const valueNum = Number(value)
angleInputValue.value = valueNum
angleValue.value = valueNum + props.roadDegrees
const movingAngle = modulo180(angleValue.value, Math.round(props.roadDegrees))
emit('triggerMovingAngle', movingAngle)
if (isDisabled(valueNum)) return (errorAngleValue.value = true)
}
function triggerMovingAngle(value: number) {
emit('triggerMovingAngle', value)
}
function triggerAngle() {
const valueToSend = angleValue.value - Number(props.roadDegrees)
if (isDisabled(valueToSend)) return

View File

@@ -48,6 +48,7 @@
<script setup lang="ts">
import { onMounted, ref, watchEffect } from 'vue'
import { modulo180 } from '@/utils/calc'
let angleValue = ref<number>(0)
let angle = ref<number>(0)
let prevRotation = ref<number>(0)
@@ -60,6 +61,7 @@ let center: { x: number; y: number } = { x: 0, y: 0 }
const R2D: number = 180 / Math.PI
const emit = defineEmits<{
(e: 'triggerAngle', value: number): void
(e: 'triggerMovingAngle', value: number): void
}>()
const props = defineProps({
roadDegrees: { type: Number, default: 0 },
@@ -102,6 +104,7 @@ function mouseup(): void {
prevRotation.value = rotation.value
angleValue.value = angle.value
if (angleValue.value !== 0) {
emit('triggerMovingAngle', modulo180(angle.value, props.roadDegrees))
emit('triggerAngle', modulo180(angle.value, props.roadDegrees))
}
}
@@ -115,13 +118,6 @@ function clickAndMove(value: number): void {
let closestMultiple = Math.ceil(moduloAngle / 45) * value
return emit('triggerAngle', closestMultiple)
}
function modulo180(value: number, roadDegrees: number): number {
let moduloAngle = (value - roadDegrees) % 360
if (moduloAngle < -180) moduloAngle += 360
if (moduloAngle > 180) moduloAngle -= 360
return Math.round(moduloAngle)
}
</script>
<style scoped lang="scss">

View File

@@ -4,6 +4,7 @@ import HeaderOpen from '../../../../components/header/HeaderOpen.vue'
import i18n from '../../config'
import { createRouter, createWebHistory } from 'vue-router/dist/vue-router'
vi.mock('vue-router')
import.meta.env.VITE_API_URL = 'api-url/'
const router = createRouter({
history: createWebHistory(),
@@ -53,7 +54,6 @@ describe('Template', () => {
})
})
it('should render all the commons entries', () => {
import.meta.env.VITE_API_URL = 'api-url/'
const wrapper = shallowMount(HeaderOpen, {
global: {
plugins: [i18n, router]

View File

@@ -1,12 +1,13 @@
import pako from 'pako'
import { useCookies } from 'vue3-cookies'
import { manageSlashUrl } from '@/utils'
const { cookies } = useCookies()
function getAuthRoute(authRoute: string, nextRoute: string): string {
const next = `${location.protocol}//${location.host}${nextRoute}`
return `${
import.meta.env.VITE_API_URL
}api/${authRoute}?next_url=${encodeURIComponent(`${next}`)}`
return `${manageSlashUrl()}api/${authRoute}?next_url=${encodeURIComponent(
`${next}`
)}`
}
// This function to decode the flask cookie and have the user information like username

8
src/utils/calc.ts Normal file
View File

@@ -0,0 +1,8 @@
function modulo180(value: number, roadDegrees: number): number {
let moduloAngle = (value - roadDegrees) % 360
if (moduloAngle < -180) moduloAngle += 360
if (moduloAngle > 180) moduloAngle -= 360
return Math.round(moduloAngle)
}
export { modulo180 }

View File

@@ -1,3 +1,11 @@
export function createUrlLink(picId: string): string {
function createUrlLink(picId: string): string {
return encodeURIComponent(`${window.location.origin}/#focus=pic&pic=${picId}`)
}
function manageSlashUrl(): string {
let apiUrl = import.meta.env.VITE_API_URL
if (apiUrl.charAt(apiUrl.length - 1) !== '/') apiUrl += '/'
return apiUrl
}
export { createUrlLink, manageSlashUrl }

View File

@@ -6,9 +6,10 @@
<script setup lang="ts">
import { computed } from 'vue'
import { manageSlashUrl } from '@/utils'
const myAccountUrl = computed<string>(
() => `${import.meta.env.VITE_API_URL}oauth/realms/geovisio/account`
() => `${manageSlashUrl()}oauth/realms/geovisio/account`
)
</script>

View File

@@ -7,9 +7,15 @@
@trigger="menuIsOpen = !menuIsOpen"
/>
</div>
<section class="entry-viewer">
<section v-if="sequence" class="entry-viewer">
<Viewer
:key="viewerType"
:fetch-options="{ fetchOptions: { credentials: 'include' } }"
:pic-id="pictures[0].id"
:seq-id="sequence.id"
:viewer-type="viewerType"
:seq-brute-deg="seqBruteDeg"
:road-degrees="seqDegrees"
ref="viewerRef"
/>
</section>
@@ -162,6 +168,7 @@
:seq-brute-deg="seqBruteDeg"
:is-loading="isLoadingOrient"
@triggerAngle="orientSequence"
@triggerMovingAngle="orientMovingSequence"
/>
</div>
<div v-if="panelView === 'sort' && isSequenceOwner" class="entry-panel">
@@ -179,7 +186,7 @@
</template>
<script setup lang="ts">
import { onMounted, ref, watchEffect, computed } from 'vue'
import { onMounted, ref, watchEffect, nextTick, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useSequenceStore } from '@/store/sequence'
@@ -241,6 +248,7 @@ let isLoadingSort = ref<boolean>(false)
let seqDegrees = ref<number>(0)
let seqBruteDeg = ref<number>(0)
let panelView = ref<string>('photos')
let viewerType = ref<string>('viewer')
const collapseMenu = ref<HTMLDivElement>()
const deleteAll = ref<HTMLDivElement>()
const menuHeight = ref<string>('0')
@@ -268,22 +276,11 @@ onMounted(async () => {
if (itemSelected.value.length || !getCurrentPicId(collItemsReady[0].id)) {
return
}
await nextTick()
if (!viewerRef.value) return
viewerRef.value.viewer.addEventListener('picture-loaded', (): void => {
if (!viewerRef.value) return
const seqRelativeDeg = viewerRef.value.viewer.getPictureRelativeHeading()
seqBruteDeg.value =
viewerRef.value.viewer.getPictureMetadata().properties['view:azimuth']
seqDegrees.value = seqBruteDeg.value - seqRelativeDeg
})
if (!viewerRef.value) return
viewerRef.value.viewer._api.onceReady().then(() => {
if (!sequence.value || !viewerRef.value) return
viewerRef.value.viewer.goToPicture(
getCurrentPicId(collItemsReady[0].id),
sequence.value.id
)
})
const viewerMap = viewerRef.value.viewer
await viewerMap._api.onceReady()
if (sequence.value) viewerMap.select(sequence.value.id, itemSelected.value)
await goToThePageAndScroll()
} catch (err) {
console.log(err)
@@ -296,7 +293,7 @@ watchEffect(() => {
async function goToThePageAndScroll() {
if (!viewerRef || !viewerRef.value || !viewerRef.value.viewer) return
viewerRef.value.viewer.addEventListener(
'picture-loaded',
'psv:picture-loaded',
async (e: { detail: { picId: string } }): Promise<void> => {
if (!pictureExistInList(getCurrentPicId(e.detail.picId))) {
await goToTheGoodPage(getCurrentPicId(e.detail.picId))
@@ -311,8 +308,17 @@ async function goToThePageAndScroll() {
}
function setPanelView(value: string): void {
panelView.value = value
if (value === 'orientation') window.location.hash = '#background=aerial'
else window.location.hash = '#background=streets'
if (value === 'orientation') {
viewerType.value = 'editor'
setSeqDegrees()
} else viewerType.value = 'viewer'
}
function setSeqDegrees(): void {
if (!viewerRef.value) return
const seqRelativeDeg = viewerRef.value.viewer.psv.getPictureRelativeHeading()
seqBruteDeg.value =
viewerRef.value.viewer.psv.getPictureMetadata().properties['view:azimuth']
seqDegrees.value = seqBruteDeg.value - seqRelativeDeg
}
async function setNewSequenceTitle(value: string | null): Promise<void> {
isLoadingTitle.value = true
@@ -435,7 +441,7 @@ async function patchCollection(): Promise<void> {
const { data } = await fetchCollectionItems(route.params.id, '?limit=100')
pictures.value = data.features
}
if (viewerRef.value) viewerRef.value.viewer.reloadVectorTiles()
if (viewerRef.value) viewerRef.value.viewer.map.reloadVectorTiles()
isLoading.value = false
}
async function goToNextPage(value: string): Promise<void> {
@@ -459,6 +465,11 @@ function triggerCheck(value: CheckboxInterface): void {
.map((e) => e.id)
} else picturesToDelete.value = []
}
function orientMovingSequence(value: number): void {
if (!viewerRef.value) return
viewerRef.value.viewer.previewSequenceHeadingChange(value)
}
async function orientSequence(value: number): Promise<void> {
isLoadingOrient.value = true
const { data }: { data: ResponseUserSequenceInterface } =
@@ -466,7 +477,6 @@ async function orientSequence(value: number): Promise<void> {
relative_heading: value
})
formatSequenceFetched(data)
if (viewerRef.value) viewerRef.value.viewer.clearPictureMetadataCache()
sequenceStore.addToastText(t('pages.sequence.orientation_updated'), 'success')
isLoadingOrient.value = false
}
@@ -528,9 +538,9 @@ async function selectImageAndMove(
picturesToDelete.value.length < 2 &&
item.properties['geovisio:status'] === 'ready'
) {
if (viewerRef.value) {
const viewerMap = await viewerRef.value.viewer
viewerMap.goToPicture(item.id, sequence.value?.id)
if (viewerRef.value && sequence.value) {
const viewerMap = viewerRef.value.viewer
viewerMap.select(sequence.value.id, item.id)
}
itemSelected.value = item.id
await goToTheGoodPage(item.id)
@@ -575,8 +585,8 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
pictures.value = data.features
isLoading.value = false
if (viewerRef.value) {
viewerRef.value.viewer.reloadVectorTiles()
viewerRef.value.viewer.goToPicture(pictures.value[0].id, route.params.id)
viewerRef.value.viewer.map.reloadVectorTiles()
viewerRef.value.viewer.select(pictures.value[0].id, route.params.id)
}
scrollIntoSelected(
picturesToDelete.value[0],

View File

@@ -26,7 +26,7 @@
credentials: 'include'
}
}"
:geovisio-viewer="false"
viewer-type="standAlone"
:user-id="getUserId"
:bbox="collectionBbox"
ref="viewerRef"
@@ -372,10 +372,10 @@ function triggerBboxFilter(): void {
if (viewerRef.value) {
isLoading.value = true
const currentBbox = [
viewerRef.value.viewer._map.getBounds()._ne.lng,
viewerRef.value.viewer._map.getBounds()._ne.lat,
viewerRef.value.viewer._map.getBounds()._sw.lng,
viewerRef.value.viewer._map.getBounds()._sw.lat
viewerRef.value.viewer.map.getBounds()._ne.lng,
viewerRef.value.viewer.map.getBounds()._ne.lat,
viewerRef.value.viewer.map.getBounds()._sw.lng,
viewerRef.value.viewer.map.getBounds()._sw.lat
]
filterBbox.value = currentBbox
formatUri()
@@ -414,7 +414,7 @@ async function patchCollection(sequence: SequenceLinkInterface): Promise<void> {
else visible = 'true'
await patchACollection(sequence.id, { visible: visible })
await fetchAndFormatSequence()
if (viewerRef.value) viewerRef.value.viewer.reloadVectorTiles()
if (viewerRef.value) viewerRef.value.viewer.map.reloadVectorTiles()
isLoading.value = false
}
async function deleteCollection(
@@ -424,7 +424,7 @@ async function deleteCollection(
if (confirm(t('pages.sequence.conf_sequence_msg'))) {
await deleteACollection(sequence.id)
await fetchAndFormatSequence()
if (viewerRef.value) viewerRef.value.viewer.reloadVectorTiles()
if (viewerRef.value) viewerRef.value.viewer.map.reloadVectorTiles()
}
isLoading.value = false
}
@@ -490,10 +490,10 @@ function bboxIsInsideOther(mainBbox: number[], bboxInside: number[]): boolean {
function goToSequence(sequence: SequenceLinkInterface): void {
if (!viewerRef.value) return
const currentBbox = [
viewerRef.value.viewer._map.getBounds()._ne.lng,
viewerRef.value.viewer._map.getBounds()._ne.lat,
viewerRef.value.viewer._map.getBounds()._sw.lng,
viewerRef.value.viewer._map.getBounds()._sw.lat
viewerRef.value.viewer.map.getBounds()._ne.lng,
viewerRef.value.viewer.map.getBounds()._ne.lat,
viewerRef.value.viewer.map.getBounds()._sw.lng,
viewerRef.value.viewer.map.getBounds()._sw.lat
]
if (
seqId.value === sequence.id &&
@@ -503,7 +503,7 @@ function goToSequence(sequence: SequenceLinkInterface): void {
}
seqId.value = sequence.id
viewerRef.value.viewer.select(seqId.value)
viewerRef.value.viewer._map.flyTo({
viewerRef.value.viewer.map.flyTo({
center: [
sequence.extent.spatial.bbox[0][0],
sequence.extent.spatial.bbox[0][1]
@@ -597,20 +597,17 @@ async function updateFilters(value: {
await updateSequence(uri.value)
}
watchEffect(() => {
if (viewerRef.value && viewerRef.value.viewer) {
viewerRef.value.viewer.addEventListener(
'select',
(e: { detail: { seqId: string } }) => {
if (seqId.value === e.detail.seqId) return
seqId.value = e.detail.seqId
scrollIntoSelected(
e.detail.seqId,
userSequences.value.map((e) => e.id)
)
if (viewerRef.value) viewerRef.value.viewer.select(e.detail.seqId)
}
if (!viewerRef || !viewerRef.value) return
const viewerMap = viewerRef.value.viewer
viewerMap.addEventListener('select', (e: { detail: { seqId: string } }) => {
if (seqId.value === e.detail.seqId) return
seqId.value = e.detail.seqId
scrollIntoSelected(
e.detail.seqId,
userSequences.value.map((e) => e.id)
)
}
viewerMap.select(e.detail.seqId)
})
})
</script>
<style lang="scss">

View File

@@ -166,13 +166,12 @@ import License from '@/components/License.vue'
import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
import authConfig from '../composables/auth'
import { manageSlashUrl } from '@/utils'
const { t } = useI18n()
const { authConf } = authConfig()
const apiUrl = computed((): string =>
import.meta.env.VITE_API_URL
? import.meta.env.VITE_API_URL
: 'https://panoramax.ign.fr/'
import.meta.env.VITE_API_URL ? manageSlashUrl() : 'https://panoramax.ign.fr/'
)
const formatTextInfoCard = computed((): string => {

View File

@@ -2,6 +2,8 @@ export interface MapInterface {
startWide?: boolean
users?: string[]
maxZoom?: number
selectedSequence?: string
selectedPicture?: string
minZoom?: number
style?: object | string
zoom?: number
@@ -20,7 +22,7 @@ export interface ViewerInterface {
credentials: string
}
hash?: boolean
picId?: string
selectedPicture?: string
widgets?: {
customWidget: HTMLAnchorElement
}

278
yarn.lock
View File

@@ -33,22 +33,22 @@
picocolors "^1.0.0"
"@babel/compat-data@^7.23.5":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742"
integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==
"@babel/core@^7.11.6", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.18.10", "@babel/core@^7.23.9":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3"
integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.4"
"@babel/generator" "^7.24.1"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helpers" "^7.24.4"
"@babel/parser" "^7.24.4"
"@babel/helpers" "^7.24.1"
"@babel/parser" "^7.24.1"
"@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
@@ -58,10 +58,10 @@
json5 "^2.2.3"
semver "^6.3.1"
"@babel/generator@^7.18.10", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498"
integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==
"@babel/generator@^7.18.10", "@babel/generator@^7.24.1", "@babel/generator@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0"
integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==
dependencies:
"@babel/types" "^7.24.0"
"@jridgewell/gen-mapping" "^0.3.5"
@@ -151,10 +151,10 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
"@babel/helpers@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==
"@babel/helpers@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94"
integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==
dependencies:
"@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
@@ -170,10 +170,10 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.10.5", "@babel/parser@^7.14.7", "@babel/parser@^7.18.11", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
"@babel/parser@^7.1.0", "@babel/parser@^7.10.5", "@babel/parser@^7.14.7", "@babel/parser@^7.18.11", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a"
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -274,9 +274,9 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/runtime@^7.21.0":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57"
integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
dependencies:
regenerator-runtime "^0.14.0"
@@ -994,9 +994,9 @@
picomatch "^2.2.2"
"@rushstack/eslint-patch@^1.1.4":
version "1.10.2"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda"
integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==
version "1.10.1"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf"
integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==
"@sideway/address@^4.1.5":
version "4.1.5"
@@ -1100,9 +1100,9 @@
"@types/estree" "*"
"@types/eslint@*", "@types/eslint@^8.4.5":
version "8.56.9"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.9.tgz#403e9ced04a34e63f1c383c5b8ee1a94442c8cc4"
integrity sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==
version "8.56.7"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366"
integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -1214,16 +1214,16 @@
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
"@types/node@*":
version "20.12.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384"
integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==
version "20.12.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.3.tgz#d6658c2c7776c1cad93534bb45428195ed840c65"
integrity sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==
dependencies:
undici-types "~5.26.4"
"@types/node@^18.11.18":
version "18.19.31"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd"
integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==
version "18.19.29"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.29.tgz#e7e9d796c1e195be7e7daf82b4abc50d017fb9db"
integrity sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==
dependencies:
undici-types "~5.26.4"
@@ -1472,47 +1472,47 @@
semver "^7.3.4"
strip-ansi "^6.0.0"
"@vue/compiler-core@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.23.tgz#a08f5998e391ad75e602a66dd7255af9054df2f3"
integrity sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==
"@vue/compiler-core@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a"
integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==
dependencies:
"@babel/parser" "^7.24.1"
"@vue/shared" "3.4.23"
"@babel/parser" "^7.23.9"
"@vue/shared" "3.4.21"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.0"
source-map-js "^1.0.2"
"@vue/compiler-dom@3.4.23", "@vue/compiler-dom@^3.3.0":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz#6fa622d1e5c8508551564c5dc5948e9cddf60867"
integrity sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==
"@vue/compiler-dom@3.4.21", "@vue/compiler-dom@^3.3.0":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803"
integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==
dependencies:
"@vue/compiler-core" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/compiler-core" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/compiler-sfc@3.4.23", "@vue/compiler-sfc@^3.2.37":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz#7041517b9bbd1b304f0db33bfa424e9a899fda8d"
integrity sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==
"@vue/compiler-sfc@3.4.21", "@vue/compiler-sfc@^3.2.37":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2"
integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==
dependencies:
"@babel/parser" "^7.24.1"
"@vue/compiler-core" "3.4.23"
"@vue/compiler-dom" "3.4.23"
"@vue/compiler-ssr" "3.4.23"
"@vue/shared" "3.4.23"
"@babel/parser" "^7.23.9"
"@vue/compiler-core" "3.4.21"
"@vue/compiler-dom" "3.4.21"
"@vue/compiler-ssr" "3.4.21"
"@vue/shared" "3.4.21"
estree-walker "^2.0.2"
magic-string "^0.30.8"
postcss "^8.4.38"
source-map-js "^1.2.0"
magic-string "^0.30.7"
postcss "^8.4.35"
source-map-js "^1.0.2"
"@vue/compiler-ssr@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz#1ae4afe962a9e156b1a79eff909c37cd423dd4c2"
integrity sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==
"@vue/compiler-ssr@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef"
integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==
dependencies:
"@vue/compiler-dom" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/compiler-dom" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1":
version "6.6.1"
@@ -1551,42 +1551,42 @@
path-browserify "^1.0.1"
vue-template-compiler "^2.7.14"
"@vue/reactivity@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.23.tgz#f29044a90a24994af075e4368790f31fa29ed747"
integrity sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==
"@vue/reactivity@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.21.tgz#affd3415115b8ebf4927c8d2a0d6a24bccfa9f02"
integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==
dependencies:
"@vue/shared" "3.4.23"
"@vue/shared" "3.4.21"
"@vue/runtime-core@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.23.tgz#21f6c7153c33f56081145c2819c2f194cbe3eb22"
integrity sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==
"@vue/runtime-core@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz#3749c3f024a64c4c27ecd75aea4ca35634db0062"
integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==
dependencies:
"@vue/reactivity" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/reactivity" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/runtime-dom@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.23.tgz#d5a9cca88b445de125c57e6b0d73faa2491e853f"
integrity sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==
"@vue/runtime-dom@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz#91f867ef64eff232cac45095ab28ebc93ac74588"
integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==
dependencies:
"@vue/runtime-core" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/runtime-core" "3.4.21"
"@vue/shared" "3.4.21"
csstype "^3.1.3"
"@vue/server-renderer@3.4.23":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.23.tgz#e605872e26d995f5ba9382e8758cd8cc7fa2e16d"
integrity sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==
"@vue/server-renderer@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz#150751579d26661ee3ed26a28604667fa4222a97"
integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==
dependencies:
"@vue/compiler-ssr" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/compiler-ssr" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/shared@3.4.23", "@vue/shared@^3.3.0":
version "3.4.23"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.23.tgz#e536a6dfd2f5f950d08c2e8ebcfe7e5329a851a1"
integrity sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==
"@vue/shared@3.4.21", "@vue/shared@^3.3.0":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1"
integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==
"@vue/test-utils@^2.2.4":
version "2.4.5"
@@ -2285,9 +2285,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001587:
version "1.0.30001610"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf"
integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==
version "1.0.30001605"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6"
integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
caseless@~0.12.0:
version "0.12.0"
@@ -2665,9 +2665,9 @@ csstype@^3.1.3:
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
cypress@^13.1.0:
version "13.7.3"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.3.tgz#3e7dcd32e007676a6c8e972293c50d6ef329d991"
integrity sha512-uoecY6FTCAuIEqLUYkTrxamDBjMHTYak/1O7jtgwboHiTnS1NaMOoR08KcTrbRZFCBvYOiS4tEkQRmsV+xcrag==
version "13.7.2"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.2.tgz#61e841382abb20e0a9a063086ee0d850af3ef6bc"
integrity sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==
dependencies:
"@cypress/request" "^3.0.0"
"@cypress/xvfb" "^1.2.4"
@@ -2804,9 +2804,9 @@ decode-named-character-reference@^1.0.0:
character-entities "^2.0.0"
dedent@^1.0.0:
version "1.5.3"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a"
integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==
version "1.5.1"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff"
integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==
deep-eql@^4.1.3:
version "4.1.3"
@@ -3043,16 +3043,16 @@ editorconfig@^1.0.4:
semver "^7.5.3"
ejs@^3.1.6:
version "3.1.10"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
version "3.1.9"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361"
integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==
dependencies:
jake "^10.8.5"
electron-to-chromium@^1.4.668:
version "1.4.738"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz#9a7fca98abaee61e20c9c25013d5ce60bb533436"
integrity sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==
version "1.4.724"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz#e0a86fe4d3d0e05a4d7b032549d79608078f830d"
integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==
emittery@^0.13.1:
version "0.13.1"
@@ -3479,9 +3479,9 @@ eslint-plugin-prettier@^4.0.0:
prettier-linter-helpers "^1.0.0"
eslint-plugin-vue@^9.8.0:
version "9.25.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz#615cb7bb6d0e2140d21840b9aa51dce69e803e7a"
integrity sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==
version "9.24.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz#71209f4652ee767f18c0bf56f25991b7cdc5aa46"
integrity sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
globals "^13.24.0"
@@ -3985,10 +3985,10 @@ geojson-vt@^3.2.1:
resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7"
integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==
geovisio@2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/geovisio/-/geovisio-2.5.1.tgz#b7a3930193720a62701cf9f9bb5170fb0475871f"
integrity sha512-zbSHjEHWnh8cRNFmSvXKxlKvHLnTiBqbqpwCFOk2YDnw8HShrxzOZL5OylvJ27nBlMS8o0EetILIXof8G9ddPg==
geovisio@2.5.1-develop-e622a156:
version "2.5.1-develop-e622a156"
resolved "https://registry.yarnpkg.com/geovisio/-/geovisio-2.5.1-develop-e622a156.tgz#622d0ed67d0c7bca993d939bc342bca8afc173b8"
integrity sha512-t3BYAAiKKHPGb2094ThNzdSTtWxJw534H3rI3mXfw659EGkic5HaasjDXCJIpIUsUM0XNZFwRT1LXEE+wbAvOQ==
dependencies:
"@fortawesome/fontawesome-svg-core" "^6.4.0"
"@fortawesome/free-solid-svg-icons" "^6.4.0"
@@ -5666,10 +5666,10 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
magic-string@^0.30.8:
version "0.30.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d"
integrity sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==
magic-string@^0.30.7:
version "0.30.8"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613"
integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
@@ -6861,7 +6861,7 @@ postcss-selector-parser@^6.0.15:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss@^8.4.18, postcss@^8.4.27, postcss@^8.4.38:
postcss@^8.4.18, postcss@^8.4.27, postcss@^8.4.35:
version "8.4.38"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
@@ -7307,9 +7307,9 @@ safe-regex-test@^1.0.3:
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass@^1.62.0:
version "1.75.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c"
integrity sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==
version "1.72.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c"
integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@@ -7509,7 +7509,7 @@ sort-object@^3.0.3:
sort-desc "^0.2.0"
union-value "^1.0.1"
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0:
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
@@ -7850,9 +7850,9 @@ through@^2.3.8:
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tinybench@^2.3.1:
version "2.7.0"
resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.7.0.tgz#d56198a69bead7e240c8f9542484f3eb3c3f749d"
integrity sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==
version "2.6.0"
resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b"
integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==
tinypool@^0.3.0:
version "0.3.1"
@@ -8396,9 +8396,9 @@ vue-axios@^3.5.2:
integrity sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==
vue-component-type-helpers@^2.0.0:
version "2.0.13"
resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.0.13.tgz#4cd08fe6c42a071159664e6c30b7fe1b01e17b68"
integrity sha512-xNO5B7DstNWETnoYflLkVgh8dK8h2ZDgxY1M2O0zrqGeBNq5yAZ8a10yCS9+HnixouNGYNX+ggU9MQQq86HTpg==
version "2.0.7"
resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.0.7.tgz#f142e82440da61fa81671ac2f35fd87146248897"
integrity sha512-7e12Evdll7JcTIocojgnCgwocX4WzIYStGClBQ+QuWPinZo/vQolv2EMq4a3lg16TKfwWafLimG77bxb56UauA==
vue-demi@>=0.14.5, vue-demi@>=0.14.7:
version "0.14.7"
@@ -8488,15 +8488,15 @@ vue3-smooth-scroll@^0.8.1:
integrity sha512-9EN1aiBT2RtkIe1MoGiyGjUoLmqmlJ96R9/QVCylaiurHQ7oGu1SPzEoGJyxdhCa1q3qyMcX/pne1oTAn1UaoQ==
vue@^3.0.0, vue@^3.2.45:
version "3.4.23"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.23.tgz#9d5a990a71c5bd5446f80377828e6587cfc488d5"
integrity sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==
version "3.4.21"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731"
integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==
dependencies:
"@vue/compiler-dom" "3.4.23"
"@vue/compiler-sfc" "3.4.23"
"@vue/runtime-dom" "3.4.23"
"@vue/server-renderer" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/compiler-dom" "3.4.21"
"@vue/compiler-sfc" "3.4.21"
"@vue/runtime-dom" "3.4.21"
"@vue/server-renderer" "3.4.21"
"@vue/shared" "3.4.21"
w3c-xmlserializer@^4.0.0:
version "4.0.0"