Fix user tests

This commit is contained in:
Jean Andreani
2024-04-22 08:24:34 +00:00
parent 6291f0567e
commit fe54cd78a2
32 changed files with 552 additions and 441 deletions

View File

@@ -23,21 +23,21 @@ cache:
install:
stage: Install
image: node:18.16.1
image: node:21.7.2
script:
- yarn install
- ls node_modules/.bin/cypress
test:unit:
stage: Test
image: node:18.16.1
image: node:21.7.2
script:
- yarn test:unit
coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
test:e2e:
stage: Test
image: node:18.16.1-alpine
image: node:21.7.2-alpine
services:
- docker:dind
script:
@@ -56,7 +56,7 @@ test:e2e:
deploy:
stage: Deploy
image: node:18.16.1
image: node:21.7.2
cache:
paths:
- node_modules

View File

@@ -2,7 +2,7 @@
#- Build image
#-
FROM node:18.16.1-alpine AS build
FROM node:21.7.2-alpine AS build
WORKDIR /opt/geovisio

View File

@@ -1,7 +1,7 @@
# Docker-compose used in gitlab-ci to run a container having access to all the other containers
services:
web:
image: node:18.16.1-alpine
image: node:21.7.2-alpine
volumes:
- $PROJECT_DIR:/src
working_dir: /src
@@ -29,7 +29,7 @@ services:
aliases:
- front.localtest.me
e2e:
image: cypress/included:cypress-12.17.3-node-18.16.1-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1
image: cypress/included:cypress-12.17.3-node-21.7.2-chrome-114.0.5735.133-1-ff-114.0.2-edge-114.0.1823.51-1
volumes:
- $PROJECT_DIR:/src
working_dir: /src

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

View File

@@ -2,7 +2,7 @@
"name": "geovisio-website",
"version": "2.5.1",
"engines": {
"node": "18.16.1"
"node": "21"
},
"private": true,
"scripts": {
@@ -25,18 +25,18 @@
"axios": "^1.2.3",
"bootstrap": "^5.2.3",
"bootstrap-icons": "^1.10.3",
"geovisio": "2.5.1-develop-e622a156",
"geovisio": "2.5.1-develop-54c2e0c8",
"moment": "^2.29.4",
"pako": "^2.1.0",
"pinia": "^2.1.4",
"v-calendar": "^3.1.2",
"vue": "^3.2.45",
"vue": "^3.4.21",
"vue-axios": "^3.5.2",
"vue-draggable-resizable-vue3": "^2.3.1-beta.13",
"vue-eslint-parser": "^9.1.0",
"vue-i18n": "9.2.2",
"vue-i18n": "9.11.1",
"vue-matomo": "^4.2.0",
"vue-router": "^4.1.6",
"vue-router": "^4.3.0",
"vue3-cookies": "^1.0.6",
"vue3-smooth-scroll": "^0.8.1"
},

View File

@@ -42,10 +42,6 @@
font-size: toRem(1.4);
font-weight: normal;
}
@if $size == xss-regular {
font-size: toRem(0.9);
font-weight: normal;
}
@if $size == m-r-regular {
font-size: toRem(1.6);
@@ -54,13 +50,6 @@
font-size: toRem(1.4);
}
}
@if $size == xs-r-regular {
font-size: toRem(1.2);
font-weight: normal;
@media (max-width: toRem(50)) {
font-size: toRem(1);
}
}
@if $size == s-r-regular {
font-size: toRem(1.4);
font-weight: normal;
@@ -68,4 +57,15 @@
font-size: toRem(1.2);
}
}
@if $size == xs-r-regular {
font-size: toRem(1.2);
font-weight: normal;
@media (max-width: toRem(50)) {
font-size: toRem(1);
}
}
@if $size == xss-regular {
font-size: toRem(1);
font-weight: normal;
}
}

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="48"
height="48"
viewBox="0 0 12.7 12.7"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<path
d="M-3.007-.005a5.978 5.978 0 0 1-5.979 5.978V-.005z"
style="fill:#1a237e;fill-opacity:1;stroke:#fff;stroke-width:0.661458;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
transform="rotate(-135)"
id="path1" />
<circle
cx="6.35"
cy="6.545"
r="2.64"
style="fill:#1e88e5;fill-opacity:1;stroke:#fff;stroke-width:0.660027;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle1" />
</svg>

After

Width:  |  Height:  |  Size: 721 B

View File

@@ -27,8 +27,8 @@
<div class="close-button">
<Button
id="close-button"
look="no-text-white"
icon="bi bi-x"
look="no-text-blue-dark"
icon="bi bi-x-lg"
@trigger="closeEdition"
/>
</div>
@@ -122,6 +122,7 @@ const isDisabled = computed<boolean>(() => props.isLoading && !props.isLoaded)
width: 100%;
}
.edit-button {
min-width: toRem(11);
margin-left: toRem(1);
z-index: 2;
}
@@ -142,10 +143,8 @@ const isDisabled = computed<boolean>(() => props.isLoading && !props.isLoaded)
align-items: center;
height: toRem(2);
width: toRem(2);
top: toRem(-1);
left: toRem(-1);
background-color: var(--blue-dark);
color: var(--white);
border-radius: 50%;
top: toRem(0.5);
right: toRem(0.5);
border-radius: toRem(0.5);
}
</style>

View File

@@ -212,7 +212,18 @@ const userName = computed((): string => {
padding-left: toRem(0.5);
color: var(--blue);
}
@media (max-width: toRem(76.8)) {
@media (max-width: toRem(102.4)) {
.nav {
padding-right: toRem(2);
padding-left: toRem(2);
}
.wrapper-right-entries {
div {
margin-right: toRem(1.5);
}
}
}
@media (max-width: toRem(84.8)) {
.nav {
padding-right: toRem(2);
padding-left: toRem(2);

View File

@@ -2,7 +2,7 @@
<div :class="status">
<div class="wrapper-image">
<button
:class="[{ selected }, 'button-image-item']"
:class="[{ selected: selectedOnMap }, 'button-image-item']"
:disabled="status === 'waiting-for-process'"
type="button"
@click="$emit('trigger')"
@@ -33,18 +33,8 @@
$t('pages.sequence.waiting_process')
}}</span>
</div>
<div
v-if="selectedOnMap && !selected"
class="icon-img pointer-map"
></div>
<div v-if="selected && !selectedOnMap" class="icon-img button-check">
<i class="bi bi-check-lg" />
</div>
<div
v-if="selected && selectedOnMap"
class="icon-img button-check-pointer"
>
<i class="bi bi-check-lg" />
<div v-if="selectedOnMap" class="pointer-map">
<img src="@/assets/images/logo-geovisio.svg" alt="" />
</div>
<div
v-if="status.length && (status === 'ready' || status === 'hidden')"
@@ -64,6 +54,9 @@
</div>
</div>
</button>
<div class="geovisio-pointer">
<slot name="checkbox"></slot>
</div>
</div>
</div>
</template>
@@ -75,7 +68,6 @@ defineProps({
created: { type: String, default: null },
href: { type: String, default: null },
hrefHd: { type: String, default: null },
selected: { type: Boolean, default: false },
selectedOnMap: { type: Boolean, default: false },
status: {
type: String,
@@ -95,12 +87,16 @@ defineProps({
position: relative;
}
.selected {
border: toRem(0.1) solid var(--blue);
border-radius: toRem(0.5);
border: toRem(0.2) solid var(--blue);
border-radius: toRem(1.5);
box-shadow: 0px 4px 4px 0px #00000040;
.photo-img-wrapper {
padding: toRem(0.2);
}
}
.wrapper-image {
display: flex;
position: relative;
}
.photo-img-wrapper {
display: flex;
@@ -115,7 +111,7 @@ defineProps({
.photo-img {
height: 100%;
width: 100%;
border-radius: toRem(0.5);
border-radius: toRem(1.5);
}
.icon-hidden {
color: var(--grey-dark);
@@ -146,7 +142,7 @@ defineProps({
}
.info {
@include text(xs-r-regular);
@include text(xss-regular);
padding: toRem(0.5) toRem(0.8);
background-color: var(--white);
border-radius: toRem(0.5);
@@ -164,9 +160,15 @@ defineProps({
align-items: center;
font-size: toRem(1.3);
}
.pointer-map,
.button-check-pointer {
background-color: var(--orange);
.geovisio-pointer {
position: absolute;
top: toRem(1.5);
right: toRem(1.5);
}
.pointer-map {
position: absolute;
top: toRem(1);
left: 0;
}
.delete-checked {
opacity: 1;

View File

@@ -56,7 +56,7 @@ h3 {
}
.icon-block-img {
margin-right: toRem(0.5);
height: toRem(2.2);
height: toRem(2);
}
.information-text {
margin-top: toRem(1);

View File

@@ -43,7 +43,7 @@ const instanceName = computed((): string | null => {
position: absolute;
top: toRem(0.3);
margin-left: toRem(0.5);
width: toRem(7);
width: toRem(7.3);
text-align: center;
}
</style>

View File

@@ -79,6 +79,10 @@ function triggerButton() {
&:hover {
opacity: 0.8;
}
&.disabled {
pointer-events: none;
cursor: default;
}
}
.button {
height: toRem(4);

View File

@@ -2,6 +2,7 @@
<div class="tab">
<button
:class="['tablinks', { selected: panelSelected === 'photos' }]"
:disabled="isLoading"
@click="$emit('trigger', 'photos')"
>
{{ $t('pages.sequence.button_panel_photos') }}
@@ -9,6 +10,7 @@
<button
v-if="isSequenceOwner"
:class="['tablinks', { selected: panelSelected === 'orientation' }]"
:disabled="isLoading"
@click="$emit('trigger', 'orientation')"
>
{{ $t('pages.sequence.button_panel_orientation') }}
@@ -16,6 +18,7 @@
<button
v-if="isSequenceOwner"
:class="['tablinks', { selected: panelSelected === 'sort' }]"
:disabled="isLoading"
@click="$emit('trigger', 'sort')"
>
{{ $t('pages.sequence.button_panel_sort') }}
@@ -26,6 +29,7 @@
<script setup lang="ts">
defineProps({
panelSelected: { type: String, default: '' },
isLoading: { type: Boolean, default: false },
isSequenceOwner: { type: Boolean, default: false }
})
</script>

View File

@@ -20,7 +20,6 @@ const sequenceStore = useSequenceStore()
const { t } = useI18n()
let mapIsLoaded = ref<boolean>(false)
let viewer = ref()
const props = defineProps({
id: { type: String, default: 'viewer' },
fetchOptions: { type: Object, default: {} },
@@ -87,7 +86,7 @@ function createViewerButton(link: HTMLDivElement): void {
}
)
}
function setupViewer(tiles: string): void {
function setupViewer(style: void | null): void {
const maxZoom = import.meta.env.VITE_MAX_ZOOM
const zoom = import.meta.env.VITE_ZOOM
const center = import.meta.env.VITE_CENTER
@@ -126,11 +125,11 @@ function setupViewer(tiles: string): void {
}
}
}
if (tiles && tiles.length) {
if (style) {
paramsViewer = {
map: {
...paramsViewer.map,
style: tiles
style
}
}
}
@@ -160,13 +159,13 @@ function setupViewer(tiles: string): void {
createViewerButton(reportLink)
}
}
function setupStandAlone(tiles: string): void {
function setupStandAlone(style: void | null): void {
let paramsMap: MapInterface
paramsMap = { users: [props.userId], minZoom: 7 }
if (tiles && tiles.length) {
if (style) {
paramsMap = {
...paramsMap,
style: tiles
style
}
}
const bbox = [props.bbox[0], props.bbox[1], props.bbox[2], props.bbox[3]]
@@ -183,19 +182,24 @@ function setupStandAlone(tiles: string): void {
}
)
}
async function setupEditor(tiles: string): void {
function setupEditor(style: void | null): 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)
selectedSequence: props.seqId
}
if (tiles && tiles.length) {
if (raster && raster !== '') {
paramsMap = {
...paramsMap,
style: tiles
raster: JSON.parse(raster)
}
}
if (style) {
paramsMap = {
...paramsMap,
style
}
}
if (props.picId) {
@@ -211,7 +215,7 @@ async function setupEditor(tiles: string): void {
}
}
try {
viewer.value = await new Editor(
viewer.value = new Editor(
'viewer', // Div ID
`${manageSlashUrl()}/api/search`,
{
@@ -222,12 +226,14 @@ async function setupEditor(tiles: string): void {
console.log(e)
}
}
onMounted(async (): Promise<void> => {
const tiles = import.meta.env.VITE_TILES
const style = tiles ? await fetchTiles(tiles) : null
try {
if (props.viewerType === 'standAlone') setupStandAlone(tiles)
else if (props.viewerType === 'editor') setupEditor(tiles)
else setupViewer(tiles)
if (props.viewerType === 'standAlone') setupStandAlone(style)
else if (props.viewerType === 'editor') setupEditor(style)
else setupViewer(style)
mapIsLoaded.value = true
} catch (err) {
mapIsLoaded.value = true
@@ -236,6 +242,12 @@ onMounted(async (): Promise<void> => {
onUnmounted((): void => {
if (viewer.value && props.viewerType) viewer.value.destroy()
})
async function fetchTiles(tiles: string): Promise<void> {
return fetch(tiles)
.then((res) => res.json())
.then((style) => style)
}
</script>
<style scoped lang="scss">

View File

@@ -40,6 +40,22 @@
</div>
</div>
</div>
<div v-if="informationCardDisplayed" class="entry-info-card">
<InformationCard look="blue">
<template v-slot:title>
<span class="msg-info">
{{ $t('pages.sequence.info_msg_maj') }}
</span>
</template>
<template v-slot:cross>
<Button
icon="bi bi-x-lg"
look="no-text-blue-dark"
@trigger="informationCardDisplayed = false"
/>
</template>
</InformationCard>
</div>
<ul class="photo-list">
<li v-for="(item, i) in pictures" :id="`el-list${i}`" class="photo-item">
<ImageItem
@@ -52,7 +68,16 @@
imageStatus(item.properties['geovisio:status'], sequence.status)
"
@trigger="triggerSelectImageAndMove(item)"
/>
>
<template v-slot:checkbox>
<InputCheckbox
:is-checked="photoToDeleteOrPatchSelected(item, picturesToDelete)"
:name="item.id"
:is-indeterminate="false"
@trigger.self="triggerInputCheckItem"
/>
</template>
</ImageItem>
</li>
<div class="entry-pagination">
<Pagination
@@ -69,13 +94,14 @@
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { ref, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import type { PropType } from 'vue'
import Pagination from '@/components/Pagination.vue'
import InputCheckbox from '@/components/InputCheckbox.vue'
import ImageItem from '@/components/ImageItem.vue'
import Button from '@/components/Button.vue'
import InputCheckbox from '@/components/InputCheckbox.vue'
import InformationCard from '@/components/InformationCard.vue'
import { formatDate } from '@/utils/dates'
import {
imageStatus,
@@ -90,11 +116,12 @@ import type {
const { t } = useI18n()
const emit = defineEmits<{
(e: 'triggerInputCheck', value: CheckboxInterface): void
(e: 'triggerInputCheckItem', value: string): void
(e: 'triggerGoToNextPage', value: string): void
(e: 'triggerSelectImageAndMove', value: ResponseUserPhotoInterface): void
(e: 'triggerPatchOrDeleteCollectionItems', value: string): void
}>()
let informationCardDisplayed = ref<boolean>(true)
const props = defineProps({
pictures: {
type: Array as PropType<ResponseUserPhotoInterface[]>,
@@ -159,6 +186,9 @@ function triggerSelectImageAndMove(value: ResponseUserPhotoInterface): void {
function triggerPatchOrDeleteCollectionItems(value: string): void {
emit('triggerPatchOrDeleteCollectionItems', value)
}
function triggerInputCheckItem(value: CheckboxInterface): void {
emit('triggerInputCheckItem', value.name)
}
</script>
<style scoped lang="scss">
@@ -190,6 +220,12 @@ function triggerPatchOrDeleteCollectionItems(value: string): void {
margin-right: toRem(1);
margin-left: toRem(1);
}
.msg-info {
@include text(xs-r-regular);
}
.entry-info-card {
padding: toRem(1);
}
.photo-list {
display: flex;
flex-wrap: wrap;
@@ -202,7 +238,7 @@ function triggerPatchOrDeleteCollectionItems(value: string): void {
width: calc(33% - #{toRem(2)});
height: fit-content;
margin: toRem(1);
border-radius: toRem(0.5);
border-radius: toRem(1.5);
background-color: var(--grey);
}
.no-photo {
@@ -213,6 +249,7 @@ function triggerPatchOrDeleteCollectionItems(value: string): void {
}
.entry-pagination {
margin-top: toRem(2);
margin-bottom: toRem(2);
width: 100%;
display: flex;
justify-content: center;
@@ -223,6 +260,9 @@ function triggerPatchOrDeleteCollectionItems(value: string): void {
}
}
@media (max-width: toRem(76.8)) {
.entry-info-card {
display: none;
}
.delete-all {
text-align: left;
}

View File

@@ -34,7 +34,13 @@
<span>{{ $t('pages.upload.images_count_text') }}</span>
</div>
</div>
<div v-else class="loaded-block">
<div v-else-if="uploadError" class="loaded-block error">
<div class="error-block">
<i class="bi bi-x-octagon"></i>
<p>{{ uploadError }}</p>
</div>
</div>
<div v-else class="loaded-block success">
<img src="@/assets/images/success.svg" alt="" />
<p>{{ $t('pages.upload.upload_done') }}</p>
</div>
@@ -74,7 +80,8 @@ defineProps({
type: Object as PropType<SequenceInterface | null>,
default: null
},
picturesCount: { type: Number, default: null }
picturesCount: { type: Number, default: null },
uploadError: { type: String, default: null }
})
</script>
@@ -161,12 +168,21 @@ defineProps({
justify-content: center;
align-items: center;
}
.loaded-block {
.success {
color: var(--green);
img {
margin-bottom: toRem(2);
}
}
.error-block {
display: flex;
i {
margin-right: toRem(1);
}
}
.error {
color: var(--red);
}
@media (max-width: toRem(102.4)) {
.loader-title {
flex-direction: column;

View File

@@ -57,6 +57,7 @@
"delete_sequence_tooltip": "Permanently delete this sequence",
"hide_photo_tooltip": "Hide selected pictures",
"delete_photo_tooltip": "Permanently delete selected pictures",
"info_msg_maj": "Use the SHIFT key to select many pictures",
"conf_pic_msg": "⚠️ Selected photos will be permanently deleted",
"conf_sequence_msg": "⚠️ This sequence will be permanently deleted",
"button_panel_photos": "Manage pictures",
@@ -180,6 +181,7 @@
"uploading_cancel": "Cancel sending photos",
"cancel_message": "⚠️ Please note, the download will be interrupted if you validate and the sequence will be deleted.",
"sequence_title": "Sequence ",
"error_upload": "Sequence creation error",
"import": "Uploads",
"upload_pending": "Upload in progress...",
"images_count_text": "Pictures uploaded",

View File

@@ -57,6 +57,7 @@
"delete_sequence_tooltip": "Supprime définitivement la séquence",
"hide_photo_tooltip": "Masque les photos sur la carte",
"delete_photo_tooltip": "Supprime définitivement les photos",
"info_msg_maj": "Utilisez la touche MAJ pour sélectionner plusieurs photos",
"conf_pic_msg": "⚠️ Les photos sélectionnées vont être définitivement supprimées",
"conf_sequence_msg": "⚠️ La séquence va être définitivement supprimée",
"button_panel_photos": "Gérer les photos",
@@ -145,7 +146,7 @@
"upload_subtitle": "Chargez vos images simplement en ligne",
"upload_illustration_alt": "Illustration qui représente l'envoie de photo en ligne",
"upload_description": "L'application web de Panoramax vous permet de déposer toutes vos photos de terrain au format jpg d'un simple clic. Aucune notion de programmation n'est nécessaire. Pour les envois en grand nombre, il est toutefois conseillé de faire appel à l'outil en ligne de commande",
"upload_button": "+ Partager des images",
"upload_button": "+ Partager des photos",
"command_line_subtitle": "L'outil en ligne de commande",
"comment_install": "Installer loutil en ligne de commande geovisio",
"comment_upload": "Lancez la commande de versement dimages sur le dossier choisi",
@@ -180,6 +181,7 @@
"uploading_cancel": "Annuler l'envoi des photos",
"cancel_message": "⚠️ Attention, le téléchargement sera interrompu si vous validez et la séquence sera supprimée.",
"sequence_title": "Séquence du ",
"error_upload": "Erreur de création de la séquence",
"import": "Imports",
"upload_pending": "Transfert en cours...",
"images_count_text": "Images chargées",

View File

@@ -57,6 +57,7 @@
"delete_sequence_tooltip": "A sorozat végleges törlése",
"hide_photo_tooltip": "A kiválasztott fényképek elrejtése",
"delete_photo_tooltip": "A kiválasztottt fényképek végleges törlése",
"info_msg_maj": "Használja a SHIFT billentyűt sok kép kiválasztásához",
"conf_pic_msg": "⚠️ A kiválasztott fényképek véglegesen elvesznek",
"conf_sequence_msg": "⚠️ A kiválasztott sorozat véglegesen elvész",
"button_panel_photos": "Fényképek kezelése",
@@ -180,6 +181,7 @@
"uploading_cancel": "Fényképek küldésének megszakítása",
"cancel_message": "⚠️ Felhívjuk figyelmét, hogy a letöltés megszakad, ha érvényesíti, és a sorozat törlődik.",
"sequence_title": "Sorozat ",
"error_upload": "Sorozat létrehozási hiba",
"import": "Feltöltések",
"upload_pending": "Feltöltés folyamatban…",
"images_count_text": "Feltöltött képek",

View File

@@ -40,7 +40,6 @@ describe('Template', () => {
await wrapper.vm.$nextTick()
expect(wrapper.html()).contains('text="title to edit"')
expect(wrapper.html()).contains('icon="bi bi-x"')
expect(wrapper.html()).contains('text="Valider"')
})
test('should valid the name and emit', async () => {

View File

@@ -16,7 +16,6 @@ describe('Template', () => {
expect(wrapper.vm.created).toBe(null)
expect(wrapper.vm.href).toBe(null)
expect(wrapper.vm.hrefHd).toBe(null)
expect(wrapper.vm.selected).toBe(false)
expect(wrapper.vm.selectedOnMap).toBe(false)
expect(wrapper.vm.status).toBe('')
})
@@ -42,21 +41,6 @@ describe('Template', () => {
expect(wrapper.html()).contains('10 mars 2023')
})
})
describe('When the component is selected', () => {
it('should render the component with the selected class', () => {
const wrapper = shallowMount(ImageItem, {
global: {
mocks: {
$t: (msg) => msg
}
},
props: {
selected: true
}
})
expect(wrapper.html()).contains('class="selected button-image-item"')
})
})
describe('When the component is ready', () => {
it('should render the component with the status class', () => {
const wrapper = shallowMount(ImageItem, {
@@ -93,7 +77,7 @@ describe('Template', () => {
expect(wrapper.html()).contains('class="bi bi-card-image icon-waiting"')
})
})
describe('When the component is selected on the map but not selected', () => {
describe('When the component is selected on the map', () => {
it('should render the component with the map pointer', () => {
const wrapper = shallowMount(ImageItem, {
global: {
@@ -102,11 +86,11 @@ describe('Template', () => {
}
},
props: {
selectedOnMap: true,
selected: false
selectedOnMap: true
}
})
expect(wrapper.html()).contains('class="icon-img pointer-map"')
expect(wrapper.html()).contains('class="pointer-map"')
expect(wrapper.html()).contains('class="selected button-image-item"')
})
})
describe('When the component is selected but not selected on the map', () => {
@@ -118,29 +102,10 @@ describe('Template', () => {
}
},
props: {
selectedOnMap: false,
selected: true
selectedOnMap: false
}
})
expect(wrapper.html()).contains('class="bi bi-check-lg"')
expect(wrapper.html()).contains('class="icon-img button-check"')
})
})
describe('When the component is selected and selected on the map', () => {
it('should render the component with the check icon', () => {
const wrapper = shallowMount(ImageItem, {
global: {
mocks: {
$t: (msg) => msg
}
},
props: {
selectedOnMap: true,
selected: true
}
})
expect(wrapper.html()).contains('class="icon-img button-check-pointer"')
expect(wrapper.html()).contains('class="bi bi-check-lg"')
expect(wrapper.html()).contains('class="button-image-item"')
})
})
describe('When the button is trigger', () => {

View File

@@ -269,7 +269,9 @@ describe('Template', () => {
sequence
}
})
expect(wrapper.html()).contains('status="hidden"></image-item')
expect(wrapper.html()).contains(
'status="hidden" selected="false"></image-item'
)
})
})
})

View File

@@ -27,24 +27,29 @@ const viewerRef = ref<InstanceType<typeof ViewerType>>()
.logged .entry-section {
height: calc(100vh - #{toRem(8)});
}
// dvh fix the bug the size of ths viewer depending on the device
// 2 times height because dvh not working on all browsers versions
.full-viewer {
.entry-section {
height: 100vh;
height: calc(100dvh - #{toRem(0)});
}
}
.gvs-focus-map .entry-report-button {
display: none;
}
@media (max-width: toRem(76.8)) {
@media (max-width: toRem(84.8)) {
.entry-page {
padding-top: toRem(11.5);
overflow: hidden;
}
.entry-section {
height: calc(100vh - #{toRem(18)});
height: calc(100dvh - #{toRem(18)});
}
.full-viewer {
height: 100vh;
height: calc(100dvh - #{toRem(0)});
padding-top: 0;
}
}

View File

@@ -26,12 +26,14 @@
icon="bi bi-arrow-left"
:text="$t('pages.sequence.back_button')"
:route="{ name: 'my-sequences' }"
:disabled="isLoadingOrient || isLoadingSort"
look="link--grey-dark"
/>
</div>
<div class="entry-tab-panel">
<TabPanel
:panel-selected="panelView"
:is-loading="isLoadingOrient || isLoadingSort"
:is-sequence-owner="isSequenceOwner"
@trigger="setPanelView"
/>
@@ -150,6 +152,7 @@
"
:item-selected="itemSelected"
@triggerInputCheck="triggerCheck"
@triggerInputCheckItem="triggerCheckItem"
@triggerGoToNextPage="goToNextPage"
@triggerSelectImageAndMove="selectImageAndMove"
@triggerPatchOrDeleteCollectionItems="patchOrDeleteCollectionItems"
@@ -183,7 +186,7 @@
</template>
<script setup lang="ts">
import { onMounted, ref, watchEffect, nextTick, computed } from 'vue'
import { onMounted, onUnmounted, watchEffect, ref, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useSequenceStore } from '@/store/sequence'
@@ -245,7 +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')
let viewerType = ref<string>('editor')
const collapseMenu = ref<HTMLDivElement>()
const deleteAll = ref<HTMLDivElement>()
const menuHeight = ref<string>('0')
@@ -265,61 +268,57 @@ onMounted(async () => {
fetchAllCollectionInfo[1].data.links
)
formatSequenceFetched(fetchAllCollectionInfo[0].data)
const collItems = fetchAllCollectionInfo[1].data.features
const collItemsReady = collItems.filter(
(el) => el.properties['geovisio:status'] === 'ready'
)
pictures.value = collItems
pictures.value = fetchAllCollectionInfo[1].data.features
setHeightValue()
if (itemSelected.value.length || !getCurrentPicId(collItemsReady[0].id)) {
return
}
await nextTick()
if (!viewerRef.value) return
const viewerMap = viewerRef.value.viewer
await viewerMap._api.onceReady()
await goToThePageAndScroll()
document.addEventListener('keydown', (evt) => {
if (evt.key === 'Shift') isShiftPressed.value = true
})
document.addEventListener('keyup', (evt) => {
if (evt.key === 'Shift') isShiftPressed.value = false
})
} catch (err) {
console.log(err)
}
})
async function goToThePageAndScroll() {
if (!viewerRef.value || !viewerRef.value || !viewerRef.value.viewer) return
console.log('111111')
const viewerMap = viewerRef.value.viewer
viewerMap.addEventListener(
onUnmounted(() => {
document.removeEventListener('keydown', (evt) => {
if (evt.key === 'Shift') isShiftPressed.value = true
})
document.removeEventListener('keyup', (evt) => {
if (evt.key === 'Shift') isShiftPressed.value = false
})
})
watchEffect(() => goToThePageAndScroll())
function goToThePageAndScroll(): void {
if (!viewerRef?.value?.viewer) return
viewerRef.value.viewer.addEventListener(
'psv:picture-loaded',
async (e: { detail: { picId: string } }): Promise<void> => {
console.log('222222')
if (!pictureExistInList(getCurrentPicId(e.detail.picId))) {
console.log('333333')
await goToTheGoodPage(getCurrentPicId(e.detail.picId))
}
itemSelected.value = getCurrentPicId(e.detail.picId)
if (!sequence.value) return
console.log('44444')
viewerMap.select(sequence.value.id, itemSelected.value)
if (!sequence.value || !viewerRef?.value?.viewer) return
viewerRef.value.viewer.select(sequence.value.id, itemSelected.value)
scrollIntoSelected(
getCurrentPicId(e.detail.picId),
pictures.value.map((e) => e.id)
)
console.log('555555')
isLoading.value = false
}
)
}
function setPanelView(value: string): void {
isLoading.value = true
panelView.value = value
if (!viewerRef?.value?.viewer) return
if (value === 'orientation') {
viewerType.value = 'editor'
const raster = import.meta.env.VITE_RASTER_TILE
if (raster) viewerRef.value.viewer.map.setBackground('aerial')
setSeqDegrees()
} else viewerType.value = 'viewer'
isLoading.value = false
} else viewerRef.value.viewer.map.setBackground('streets')
}
function setSeqDegrees(): void {
if (!viewerRef.value) return
if (!viewerRef?.value?.viewer) return
const seqRelativeDeg = viewerRef.value.viewer.psv.getPictureRelativeHeading()
seqBruteDeg.value =
viewerRef.value.viewer.psv.getPictureMetadata().properties['view:azimuth']
@@ -446,7 +445,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.map.reloadVectorTiles()
if (viewerRef?.value?.viewer) viewerRef.value.viewer.map.reloadVectorTiles()
isLoading.value = false
}
async function goToNextPage(value: string): Promise<void> {
@@ -470,9 +469,8 @@ function triggerCheck(value: CheckboxInterface): void {
.map((e) => e.id)
} else picturesToDelete.value = []
}
function orientMovingSequence(value: number): void {
if (!viewerRef.value) return
if (!viewerRef?.value?.viewer) return
viewerRef.value.viewer.previewSequenceHeadingChange(value)
}
async function orientSequence(value: number): Promise<void> {
@@ -499,36 +497,28 @@ async function sortSequence(value: string): Promise<void> {
sequenceStore.addToastText(t('pages.sequence.sort_updated'), 'success')
isLoadingSort.value = false
}
function selectPhotoToDeleteOrPatch(
item: ResponseUserPhotoInterface
): string[] {
document.addEventListener('keydown', function (evt) {
if (evt.key === 'Shift') {
isShiftPressed.value = true
}
})
document.addEventListener('keyup', function (evt) {
if (evt.key === 'Shift') {
isShiftPressed.value = false
}
})
if (isShiftPressed.value) {
const picturesIndex = pictures.value.findIndex((el) => el.id === item.id)
const picturesLastIndex = pictures.value.findIndex(
(el) => el.id === picturesToDelete.value[0]
)
const slicedUserPhotos = pictures.value.slice(
picturesLastIndex,
picturesIndex + 1
)
return (picturesToDelete.value = slicedUserPhotos.map((el) => el.id))
}
if (picturesToDelete.value.includes(item.id)) {
function triggerCheckItem(value: string) {
if (picturesToDelete.value.includes(value)) {
return (picturesToDelete.value = picturesToDelete.value.filter(
(el) => el !== item.id
(el) => el !== value
))
}
return (picturesToDelete.value = [...picturesToDelete.value, item.id])
picturesToDelete.value = [...picturesToDelete.value, value]
}
function selectPhotoToDeleteOrPatch(
item: ResponseUserPhotoInterface
): void | string[] {
if (!isShiftPressed.value) return
const picturesIndex = pictures.value.findIndex((el) => el.id === item.id)
let picturesLastIndex = pictures.value.findIndex(
(el) => el.id === picturesToDelete.value[0]
)
if (picturesLastIndex === -1) picturesLastIndex = 0
const slicedUserPhotos = pictures.value.slice(
picturesLastIndex,
picturesIndex + 1
)
return (picturesToDelete.value = slicedUserPhotos.map((el) => el.id))
}
async function selectImageAndMove(
item: ResponseUserPhotoInterface
@@ -539,13 +529,9 @@ async function selectImageAndMove(
await router.push({ name: 'sequence', params: { id: route.params.id } })
}
selectPhotoToDeleteOrPatch(item)
if (
picturesToDelete.value.length < 2 &&
item.properties['geovisio:status'] === 'ready'
) {
if (!isShiftPressed.value) {
if (viewerRef.value && sequence.value) {
const viewerMap = viewerRef.value.viewer
viewerMap.select(sequence.value.id, item.id)
viewerRef.value.viewer.select(sequence.value.id, item.id)
}
itemSelected.value = item.id
await goToTheGoodPage(item.id)
@@ -591,7 +577,8 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
isLoading.value = false
if (viewerRef.value) {
viewerRef.value.viewer.map.reloadVectorTiles()
viewerRef.value.viewer.select(pictures.value[0].id, route.params.id)
viewerRef.value.viewer.map.reloadLayersStyles()
viewerRef.value.viewer.select(route.params.id, pictures.value[0].id)
}
scrollIntoSelected(
picturesToDelete.value[0],
@@ -644,6 +631,7 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
width: 100%;
}
.wrapper-title {
display: flex;
width: 100%;
}
.wrapper-button {
@@ -726,7 +714,7 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
}
.sequence-status {
@include text(xs-r-regular);
height: 100%;
height: fit-content;
border-radius: toRem(0.4);
padding: toRem(0.3) toRem(0.8);
color: var(--white);
@@ -738,8 +726,8 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
border: toRem(0.1) solid var(--green);
}
&.waiting-for-process {
background-color: var(--yellow);
border: toRem(0.1) solid var(--yellow);
background-color: var(--orange);
border: toRem(0.1) solid var(--orange);
}
&.hidden {
background-color: var(--red-pale);
@@ -766,9 +754,6 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
.menu-right {
width: 55vw;
}
.wrapper-title {
width: 90%;
}
.block-collapse {
flex-direction: column;
}
@@ -784,7 +769,7 @@ async function patchOrDeleteCollectionItems(reqType: string): Promise<void> {
}
}
}
@media (max-width: toRem(76.8)) {
@media (max-width: toRem(84.8)) {
.entry-page {
padding-top: toRem(11.6);
}

View File

@@ -488,7 +488,7 @@ function bboxIsInsideOther(mainBbox: number[], bboxInside: number[]): boolean {
)
}
function goToSequence(sequence: SequenceLinkInterface): void {
if (!viewerRef.value) return
if (!viewerRef?.value?.viewer) return
const currentBbox = [
viewerRef.value.viewer.map.getBounds()._ne.lng,
viewerRef.value.viewer.map.getBounds()._ne.lat,
@@ -594,17 +594,19 @@ async function updateFilters(value: {
await updateSequence(uri.value)
}
watchEffect(() => {
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)
})
if (!viewerRef?.value?.viewer) return
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)
}
)
})
</script>
<style lang="scss">
@@ -612,20 +614,24 @@ watchEffect(() => {
top: 0;
right: toRem(0);
cursor: e-resize;
background-color: var(--black);
background-color: var(--blue);
display: block !important;
opacity: 0.7;
&:hover {
opacity: 1;
}
}
.resize-handle-map {
z-index: 999999;
box-sizing: border-box;
position: absolute;
height: 100%;
width: toRem(0.5);
width: toRem(0.4);
&:hover {
cursor: col-resize;
}
}
@media (max-width: toRem(76.8)) {
@media (max-width: toRem(84.8)) {
.resize-handle-map-mr {
display: none !important;
}
@@ -893,7 +899,7 @@ watchEffect(() => {
width: 70%;
}
}
@media (max-width: toRem(76.8)) {
@media (max-width: toRem(84.8)) {
.section-viewer {
height: calc(100vh - #{toRem(11.6)});
width: 100vw;

View File

@@ -46,6 +46,7 @@
</p>
<div class="wrapper-edit-text">
<EditText
:form-title="$t('pages.sequence.sequence_form_title')"
:default-text="newSequenceTitle || sequenceTitle"
:is-loading="isLoading"
:is-loaded="isLoaded"
@@ -90,6 +91,7 @@
v-if="isLoading"
:load-percentage="loadPercentage"
:is-loaded="isLoaded"
:upload-error="uploadError"
:uploaded-sequence="uploadedSequence"
:pictures-count="picturesCount"
@triggerModal="displayModal"
@@ -134,6 +136,7 @@ import InformationCard from '@/components/InformationCard.vue'
import UploadLoader from '@/components/upload/UploadLoader.vue'
import License from '@/components/License.vue'
import type { SequenceInterface } from './interfaces/UploadPicturesView'
import type { SequenceCreatedInterface } from './interfaces/UploadPicturesView'
import { formatDate } from '@/utils/dates'
import {
createAPictureToASequence,
@@ -149,6 +152,7 @@ let pictures = ref<File[] | []>([])
let picturesCount = ref<number>(0)
let isLoading = ref<boolean>(false)
let isLoaded = ref<boolean>(false)
let uploadError = ref<string | undefined>(undefined)
let informationCardDisplayed = ref<boolean>(true)
let uploadedSequence = ref<SequenceInterface | null>(null)
let picturesUploadingSize = ref<number>(0)
@@ -250,10 +254,17 @@ async function uploadPicture(): Promise<void> {
const title = newSequenceTitle.value
? newSequenceTitle.value
: sequenceTitle.value
const { data } = await createASequence(title)
let sequence: SequenceCreatedInterface | null = null
try {
sequence = await createASequence(title)
} catch (e) {
uploadError.value = t('pages.upload.error_upload')
isLoaded.value = true
}
if (!sequence || !sequence.data) return
uploadedSequence.value = {
title: title,
id: data.id,
id: sequence.data.id,
pictures: [],
picturesOnError: [],
pictureCount: pictures.value.length,
@@ -269,7 +280,10 @@ async function uploadPicture(): Promise<void> {
body.append('position', i.toString())
body.append('picture', el)
try {
const pictureUploaded = await createAPictureToASequence(data.id, body)
const pictureUploaded = await createAPictureToASequence(
sequence.data.id,
body
)
const pictures = { ...pictureUploaded, name: el.name }
picturesUploadingSize.value = picturesUploadingSize.value + el.size
uploadedSequence.value.pictures = [
@@ -291,8 +305,8 @@ async function uploadPicture(): Promise<void> {
calcPercentage()
}
}
isLoaded.value = true
pictures.value = []
isLoaded.value = true
picturesCount.value = 0
newSequenceTitle.value = null
sequenceTitle.value = formatSequenceTitle()

View File

@@ -11,3 +11,22 @@ export interface uploadErrorInterface {
details: { error: string }
name: string
}
export interface SequenceCreatedInterface {
data: {
created: string
description: string
extent: { spatial: object; temporal: object }
['geovisio:status']: string
id: string
keywords: string[]
license: string
links: object[]
providers: object[]
stac_extensions: string[]
stac_version: string
['stats:items']: { count: number }
title: string
type: string
}
}

View File

@@ -9,6 +9,7 @@ export interface MapInterface {
zoom?: number
center?: number[]
bounds?: number[]
background?: string
raster?: {
type: string
tiles: string[]
@@ -27,4 +28,10 @@ export interface ViewerInterface {
customWidget: HTMLAnchorElement
}
map: MapInterface
raster?: {
type: string
tiles: string[]
attribution: string
tileSize: number
}
}

View File

@@ -1,23 +1,5 @@
import axios from 'axios'
interface SequenceCreatedInterface {
data: {
created: string
description: string
extent: { spatial: object; temporal: object }
['geovisio:status']: string
id: string
keywords: string[]
license: string
links: object[]
providers: object[]
stac_extensions: string[]
stac_version: string
['stats:items']: { count: number }
title: string
type: string
}
}
import type { SequenceCreatedInterface } from '../../interfaces/UploadPicturesView'
interface PictureCreatedInterface {
data: {

View File

@@ -11,10 +11,13 @@ export default ({ mode }) => {
host: true,
port: 5173,
strictPort: true,
hmr: mode == "development" ? {
overlay: false,
clientPort: 5173,
} : false,
hmr:
mode == 'development'
? {
overlay: false,
clientPort: 5173
}
: false
},
base: '/',
plugins: [

405
yarn.lock
View File

@@ -33,22 +33,22 @@
picocolors "^1.0.0"
"@babel/compat-data@^7.23.5":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742"
integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
"@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.3"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3"
integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1"
"@babel/generator" "^7.24.4"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helpers" "^7.24.1"
"@babel/parser" "^7.24.1"
"@babel/helpers" "^7.24.4"
"@babel/parser" "^7.24.4"
"@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.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==
"@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==
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.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94"
integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==
"@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==
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":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a"
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
"@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/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.1"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57"
integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
dependencies:
regenerator-runtime "^0.14.0"
@@ -558,43 +558,26 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
"@intlify/core-base@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
integrity sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==
"@intlify/core-base@9.11.1":
version "9.11.1"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.11.1.tgz#0cef49b87bc493eba8e024c4ae688aa5503fdb97"
integrity sha512-qWXBBlEA+DC0CsHkfJiQK9ELm11c9I6lDpodY4FoOf99eMas1R6JR4woPhrfAcrtxFHp1UmXWdrQNKDegSW9IA==
dependencies:
"@intlify/devtools-if" "9.2.2"
"@intlify/message-compiler" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/vue-devtools" "9.2.2"
"@intlify/message-compiler" "9.11.1"
"@intlify/shared" "9.11.1"
"@intlify/devtools-if@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz#b13d9ac4b4e2fe6d2e7daa556517a8061fe8bd39"
integrity sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==
"@intlify/message-compiler@9.11.1":
version "9.11.1"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.11.1.tgz#6da0ab700c994903ddcac0ccf2d38e7ad4edf912"
integrity sha512-y/aWx7DkaTKK2qWUw0hVbJpon8+urWXngeqh15DuIXZh6n/V/oPQiO/Ho1hUKbwap6MVMuz0OcnAJvqh3p9YPg==
dependencies:
"@intlify/shared" "9.2.2"
"@intlify/shared" "9.11.1"
source-map-js "^1.0.2"
"@intlify/message-compiler@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz#e42ab6939b8ae5b3d21faf6a44045667a18bba1c"
integrity sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==
dependencies:
"@intlify/shared" "9.2.2"
source-map "0.6.1"
"@intlify/shared@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
"@intlify/vue-devtools@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
integrity sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==
dependencies:
"@intlify/core-base" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/shared@9.11.1":
version "9.11.1"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.11.1.tgz#03e9ae5a90d62df4800f307d9f1dfc34b6fd8cbc"
integrity sha512-yuDG82vjgId2oasNRgZ0PKJrF65zlL33MNyITP5itbLcP4AYOR/NcIuD+/DiI+GHXdxASMKJU0ZiITLc6RC+qw==
"@isaacs/cliui@^8.0.2":
version "8.0.2"
@@ -941,29 +924,29 @@
resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323"
integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
"@photo-sphere-viewer/core@^5.7.0":
"@photo-sphere-viewer/core@^5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@photo-sphere-viewer/core/-/core-5.7.2.tgz#689a93354370b733441cfe336f7b0a04ab9df631"
integrity sha512-5RznXVRwuO+Izceae2SbwYM/H8GHtwxKlT26P4UcRFZYsYKllMAggAz9hhU729Vu+r1+il5PHvomIsmPHVTTaw==
dependencies:
three "^0.161.0"
"@photo-sphere-viewer/equirectangular-tiles-adapter@^5.7.0":
"@photo-sphere-viewer/equirectangular-tiles-adapter@^5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@photo-sphere-viewer/equirectangular-tiles-adapter/-/equirectangular-tiles-adapter-5.7.2.tgz#a83fc71b27c5f5ea8f6e4f3574db9528f0f3ad0d"
integrity sha512-ldObfwS0LAUKhPaTXlN+3NEkdfHd8qqqe4GeYcUjfirdRujPXsp2lCxanWstRI9qOF2HEYV1KwhSMyC92Tdy9g==
"@photo-sphere-viewer/gallery-plugin@^5.7.0":
"@photo-sphere-viewer/gallery-plugin@^5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@photo-sphere-viewer/gallery-plugin/-/gallery-plugin-5.7.2.tgz#1fa92520879a06cc9b80aa7123e933a0d3e467f0"
integrity sha512-TG8sho17Q6vbVOtoQZ8Pfuo41vXOcswbHlLvlvnJyJyW46A9/VIA/8amcPEhVw4n1FZ07inp5/HoM9Hzd1VpEg==
"@photo-sphere-viewer/markers-plugin@^5.7.0":
"@photo-sphere-viewer/markers-plugin@^5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@photo-sphere-viewer/markers-plugin/-/markers-plugin-5.7.2.tgz#c48f296c919eff7893df28536a246af6a361ca4f"
integrity sha512-WBbFCRl6+XYkqRwJlN7Hpavhr5qnjaEyFRqY0rnsFelLIb/lfiYtMInJ1K0L4zv0so/NOW+AY+Tt8+HbIQMSTQ==
"@photo-sphere-viewer/virtual-tour-plugin@^5.7.0":
"@photo-sphere-viewer/virtual-tour-plugin@^5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@photo-sphere-viewer/virtual-tour-plugin/-/virtual-tour-plugin-5.7.2.tgz#e85183b852bf4a62cc68e6e296bd83ab8d788ee4"
integrity sha512-3pal6sgTtoIlgQwmqimjKlEfa1XZKZpYO6Wft4Zk/J6r3pyGf8ZqrD4XPtxrDgiV3f3nZXyaUry3xkrLrxQbSw==
@@ -994,9 +977,9 @@
picomatch "^2.2.2"
"@rushstack/eslint-patch@^1.1.4":
version "1.10.1"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf"
integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==
version "1.10.2"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda"
integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==
"@sideway/address@^4.1.5":
version "4.1.5"
@@ -1100,9 +1083,9 @@
"@types/estree" "*"
"@types/eslint@*", "@types/eslint@^8.4.5":
version "8.56.7"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366"
integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==
version "8.56.9"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.9.tgz#403e9ced04a34e63f1c383c5b8ee1a94442c8cc4"
integrity sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
@@ -1214,16 +1197,16 @@
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
"@types/node@*":
version "20.12.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.3.tgz#d6658c2c7776c1cad93534bb45428195ed840c65"
integrity sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==
version "20.12.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384"
integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==
dependencies:
undici-types "~5.26.4"
"@types/node@^18.11.18":
version "18.19.29"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.29.tgz#e7e9d796c1e195be7e7daf82b4abc50d017fb9db"
integrity sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==
version "18.19.31"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd"
integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==
dependencies:
undici-types "~5.26.4"
@@ -1472,49 +1455,49 @@
semver "^7.3.4"
strip-ansi "^6.0.0"
"@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==
"@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==
dependencies:
"@babel/parser" "^7.23.9"
"@vue/shared" "3.4.21"
"@babel/parser" "^7.24.1"
"@vue/shared" "3.4.23"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.0.2"
source-map-js "^1.2.0"
"@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==
"@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==
dependencies:
"@vue/compiler-core" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/compiler-core" "3.4.23"
"@vue/shared" "3.4.23"
"@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==
"@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==
dependencies:
"@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"
"@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"
estree-walker "^2.0.2"
magic-string "^0.30.7"
postcss "^8.4.35"
source-map-js "^1.0.2"
magic-string "^0.30.8"
postcss "^8.4.38"
source-map-js "^1.2.0"
"@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==
"@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==
dependencies:
"@vue/compiler-dom" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/compiler-dom" "3.4.23"
"@vue/shared" "3.4.23"
"@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1":
"@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1":
version "6.6.1"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83"
integrity sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==
@@ -1551,42 +1534,42 @@
path-browserify "^1.0.1"
vue-template-compiler "^2.7.14"
"@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==
"@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==
dependencies:
"@vue/shared" "3.4.21"
"@vue/shared" "3.4.23"
"@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==
"@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==
dependencies:
"@vue/reactivity" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/reactivity" "3.4.23"
"@vue/shared" "3.4.23"
"@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==
"@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==
dependencies:
"@vue/runtime-core" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/runtime-core" "3.4.23"
"@vue/shared" "3.4.23"
csstype "^3.1.3"
"@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==
"@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==
dependencies:
"@vue/compiler-ssr" "3.4.21"
"@vue/shared" "3.4.21"
"@vue/compiler-ssr" "3.4.23"
"@vue/shared" "3.4.23"
"@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/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/test-utils@^2.2.4":
version "2.4.5"
@@ -2285,9 +2268,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001587:
version "1.0.30001605"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6"
integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
version "1.0.30001610"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf"
integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==
caseless@~0.12.0:
version "0.12.0"
@@ -2665,9 +2648,9 @@ csstype@^3.1.3:
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
cypress@^13.1.0:
version "13.7.2"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.2.tgz#61e841382abb20e0a9a063086ee0d850af3ef6bc"
integrity sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==
version "13.7.3"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.3.tgz#3e7dcd32e007676a6c8e972293c50d6ef329d991"
integrity sha512-uoecY6FTCAuIEqLUYkTrxamDBjMHTYak/1O7jtgwboHiTnS1NaMOoR08KcTrbRZFCBvYOiS4tEkQRmsV+xcrag==
dependencies:
"@cypress/request" "^3.0.0"
"@cypress/xvfb" "^1.2.4"
@@ -2804,9 +2787,9 @@ decode-named-character-reference@^1.0.0:
character-entities "^2.0.0"
dedent@^1.0.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff"
integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==
version "1.5.3"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a"
integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==
deep-eql@^4.1.3:
version "4.1.3"
@@ -3043,16 +3026,16 @@ editorconfig@^1.0.4:
semver "^7.5.3"
ejs@^3.1.6:
version "3.1.9"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361"
integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==
version "3.1.10"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
dependencies:
jake "^10.8.5"
electron-to-chromium@^1.4.668:
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==
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==
emittery@^0.13.1:
version "0.13.1"
@@ -3479,9 +3462,9 @@ eslint-plugin-prettier@^4.0.0:
prettier-linter-helpers "^1.0.0"
eslint-plugin-vue@^9.8.0:
version "9.24.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz#71209f4652ee767f18c0bf56f25991b7cdc5aa46"
integrity sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==
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==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
globals "^13.24.0"
@@ -3985,18 +3968,18 @@ 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-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==
geovisio@2.5.1-develop-54c2e0c8:
version "2.5.1-develop-54c2e0c8"
resolved "https://registry.yarnpkg.com/geovisio/-/geovisio-2.5.1-develop-54c2e0c8.tgz#2fa5d12d0d8b26fc6bfc8a344cc6207ee38d988f"
integrity sha512-OA47XzvsdZn8CjKhup/IHtpKV48zePzrYa2AaP7cEDEELdb+GjnJNL20NsFmaVzy+Z+m37KYocGw1YNjQlDpRQ==
dependencies:
"@fortawesome/fontawesome-svg-core" "^6.4.0"
"@fortawesome/free-solid-svg-icons" "^6.4.0"
"@photo-sphere-viewer/core" "^5.7.0"
"@photo-sphere-viewer/equirectangular-tiles-adapter" "^5.7.0"
"@photo-sphere-viewer/gallery-plugin" "^5.7.0"
"@photo-sphere-viewer/markers-plugin" "^5.7.0"
"@photo-sphere-viewer/virtual-tour-plugin" "^5.7.0"
"@photo-sphere-viewer/core" "^5.7.2"
"@photo-sphere-viewer/equirectangular-tiles-adapter" "^5.7.2"
"@photo-sphere-viewer/gallery-plugin" "^5.7.2"
"@photo-sphere-viewer/markers-plugin" "^5.7.2"
"@photo-sphere-viewer/virtual-tour-plugin" "^5.7.2"
documentation "^14.0.1"
maplibre-gl "^3.6.2"
pmtiles "^2.11.0"
@@ -5666,10 +5649,10 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
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==
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==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
@@ -6861,7 +6844,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.35:
postcss@^8.4.18, postcss@^8.4.27, postcss@^8.4.38:
version "8.4.38"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
@@ -7307,9 +7290,9 @@ safe-regex-test@^1.0.3:
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass@^1.62.0:
version "1.72.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c"
integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==
version "1.75.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c"
integrity sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@@ -7530,7 +7513,7 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -7613,7 +7596,16 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -7684,7 +7676,14 @@ stringify-entities@^4.0.0:
character-entities-html4 "^2.0.0"
character-entities-legacy "^3.0.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -7850,9 +7849,9 @@ through@^2.3.8:
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tinybench@^2.3.1:
version "2.6.0"
resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b"
integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==
version "2.7.0"
resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.7.0.tgz#d56198a69bead7e240c8f9542484f3eb3c3f749d"
integrity sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==
tinypool@^0.3.0:
version "0.3.1"
@@ -8396,9 +8395,9 @@ vue-axios@^3.5.2:
integrity sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==
vue-component-type-helpers@^2.0.0:
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==
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==
vue-demi@>=0.14.5, vue-demi@>=0.14.7:
version "0.14.7"
@@ -8431,25 +8430,24 @@ vue-eslint-parser@^9.1.0, vue-eslint-parser@^9.1.1, vue-eslint-parser@^9.4.2:
lodash "^4.17.21"
semver "^7.3.6"
vue-i18n@9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.2.2.tgz#aeb49d9424923c77e0d6441e3f21dafcecd0e666"
integrity sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==
vue-i18n@9.11.1:
version "9.11.1"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.11.1.tgz#87d8fceaf8862240d64091227ecf66a1465d6096"
integrity sha512-S7Xi8DkLQG4xnnbxkxzipJK6CdfLdZkmApn95st89HFGp8LTmTH0Tv+Zw6puhOCZJCFrH73PHo3Ylwd2+Bmdxg==
dependencies:
"@intlify/core-base" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/vue-devtools" "9.2.2"
"@vue/devtools-api" "^6.2.1"
"@intlify/core-base" "9.11.1"
"@intlify/shared" "9.11.1"
"@vue/devtools-api" "^6.5.0"
vue-matomo@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/vue-matomo/-/vue-matomo-4.2.0.tgz#d65e369e4ead1d95ef790bef3627512cac3d25e9"
integrity sha512-m5hCw7LH3wPDcERaF4sp/ojR9sEx7Rl8TpOyH/4jjQxMF2DuY/q5pO+i9o5Dx+BXLSa9+IQ0qhAbWYRyESQXmA==
vue-router@^4.1.6:
version "4.3.0"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.3.0.tgz#d5913f27bf68a0a178ee798c3c88be471811a235"
integrity sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==
vue-router@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.3.1.tgz#05943e16781d8feb5195a932824afecd4d0b8282"
integrity sha512-D0h3oyP6vp28BOvxv2hVpiqFTjTJizCf1BuMmCibc8UW0Ll/N80SWqDd/hqPMaZfzW1j+s2s+aTRyBIP9ElzOw==
dependencies:
"@vue/devtools-api" "^6.5.1"
@@ -8487,16 +8485,16 @@ vue3-smooth-scroll@^0.8.1:
resolved "https://registry.yarnpkg.com/vue3-smooth-scroll/-/vue3-smooth-scroll-0.8.1.tgz#c2de7dc33c0da8f195bbd70ac27b02c9cb1bd44c"
integrity sha512-9EN1aiBT2RtkIe1MoGiyGjUoLmqmlJ96R9/QVCylaiurHQ7oGu1SPzEoGJyxdhCa1q3qyMcX/pne1oTAn1UaoQ==
vue@^3.0.0, vue@^3.2.45:
version "3.4.21"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.21.tgz#69ec30e267d358ee3a0ce16612ba89e00aaeb731"
integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==
vue@^3.0.0, vue@^3.4.21:
version "3.4.23"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.23.tgz#9d5a990a71c5bd5446f80377828e6587cfc488d5"
integrity sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==
dependencies:
"@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"
"@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"
w3c-xmlserializer@^4.0.0:
version "4.0.0"
@@ -8641,7 +8639,7 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -8659,6 +8657,15 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"