Bruno Predot

Ajout et paramétrage de @nuxt/test-utils avec vitest et toutes ses dépendances.

Factorisation en ajoutant les composants :  Loader, MovieCard.
@@ -12,3 +12,5 @@ @@ -12,3 +12,5 @@
12 - Ajout composant MovieCommentList. 12 - Ajout composant MovieCommentList.
13 - Ajout dépendance TinyMCE. 13 - Ajout dépendance TinyMCE.
14 - Ajout composant TinyMceFieldEditor. 14 - Ajout composant TinyMceFieldEditor.
  15 +- Ajout composant Loader.
  16 +- Ajout composant MovieCard.
  1 +<script lang="ts" setup>
  2 +//#region --Props--.
  3 +import { useDateFormat } from "@vueuse/core";
  4 +import { FilmIcon } from "lucide-vue-next";
  5 +//#endregion
  6 +
  7 +//#region --Props--.
  8 +defineProps({
  9 + movie: {
  10 + type: Object,
  11 + required: true,
  12 + nullable: false,
  13 + },
  14 +});
  15 +//#endregion
  16 +</script>
  17 +
  18 +<template>
  19 + <section
  20 + class="bg-gray-800 rounded-lg overflow-hidden shadow-lg transition-transform duration-300 hover:scale-105 cursor-pointer"
  21 + @click="navigateTo(`/movies/${movie.id}`)"
  22 + >
  23 + <div class="relative pb-[150%]">
  24 + <img
  25 + v-if="movie.poster_path"
  26 + :alt="movie.title"
  27 + :src="`https://image.tmdb.org/t/p/w500${movie.poster_path}`"
  28 + class="absolute inset-0 w-full h-full object-cover"
  29 + />
  30 + <div v-else class="absolute inset-0 w-full h-full bg-gray-700 flex items-center justify-center">
  31 + <FilmIcon :size="48" class="text-gray-500" />
  32 + </div>
  33 + <div
  34 + class="absolute top-2 right-2 bg-primary text-white rounded-full w-10 h-10 flex items-center justify-center font-bold"
  35 + >
  36 + {{ movie.vote_average.toFixed(1) }}
  37 + </div>
  38 + </div>
  39 + <div class="p-4">
  40 + <h2 class="text-lg font-bold mb-1 line-clamp-1">{{ movie.title }}</h2>
  41 + <p class="text-sm text-gray-400">{{ useDateFormat(movie.release_date, "DD-MM-YYYY") }}</p>
  42 + </div>
  43 + </section>
  44 +</template>
  45 +
  46 +<style scoped></style>
@@ -3,9 +3,8 @@ @@ -3,9 +3,8 @@
3 import { onBeforeUnmount, ref } from "vue"; 3 import { onBeforeUnmount, ref } from "vue";
4 import { useTMDB } from "~/composables/tMDB"; 4 import { useTMDB } from "~/composables/tMDB";
5 import { Movie } from "~/models/movie"; 5 import { Movie } from "~/models/movie";
6 -import { FilmIcon, SearchXIcon } from "lucide-vue-next"; 6 +import { SearchXIcon } from "lucide-vue-next";
7 import type { MovieInterface } from "~/interfaces/movie"; 7 import type { MovieInterface } from "~/interfaces/movie";
8 -import { useDateFormat } from "@vueuse/core";  
9 //#endregion 8 //#endregion
10 9
11 //#region --Declaration--. 10 //#region --Declaration--.
@@ -99,7 +98,7 @@ function createIntersectionObserver() { @@ -99,7 +98,7 @@ function createIntersectionObserver() {
99 if (entry.isIntersecting && !isLoadingMore.value && currentPage.value < totalPages.value) { 98 if (entry.isIntersecting && !isLoadingMore.value && currentPage.value < totalPages.value) {
100 if (searchQuery.value) { 99 if (searchQuery.value) {
101 // Continue searching query if already active. 100 // Continue searching query if already active.
102 - search(searchQuery.value, currentPage.value + 1) 101 + search(searchQuery.value, currentPage.value + 1);
103 } else { 102 } else {
104 // Continue fetching popular movies. 103 // Continue fetching popular movies.
105 fetchMovies(currentPage.value + 1); 104 fetchMovies(currentPage.value + 1);
@@ -117,7 +116,7 @@ function handleSearchEvent(event: string) { @@ -117,7 +116,7 @@ function handleSearchEvent(event: string) {
117 } 116 }
118 117
119 function handleClearSearchEvent() { 118 function handleClearSearchEvent() {
120 - searchQuery.value = ''; 119 + searchQuery.value = "";
121 currentPage.value = 1; 120 currentPage.value = 1;
122 // Fetch popular movies after clear. 121 // Fetch popular movies after clear.
123 fetchMovies(1); 122 fetchMovies(1);
@@ -159,36 +158,18 @@ onBeforeUnmount(() => { @@ -159,36 +158,18 @@ onBeforeUnmount(() => {
159 @event:search="handleSearchEvent" 158 @event:search="handleSearchEvent"
160 @event:clear_search="handleClearSearchEvent" 159 @event:clear_search="handleClearSearchEvent"
161 /> 160 />
  161 +
162 <!-- Loading Skeleton --> 162 <!-- Loading Skeleton -->
163 - <ui-components-skeleton-movies-loader v-if="isInitialLoading" :is-initial-loading="isInitialLoading" :skeleton-number="20" /> 163 + <ui-components-skeleton-movies-loader
  164 + v-if="isInitialLoading"
  165 + :is-initial-loading="isInitialLoading"
  166 + :skeleton-number="20"
  167 + />
  168 +
164 <!-- Liste des films --> 169 <!-- Liste des films -->
165 <div v-else-if="movies.length > 0" class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6"> 170 <div v-else-if="movies.length > 0" class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
166 - <div 171 + <div v-for="movie in movies" :key="movie.id">
167 - v-for="movie in movies" 172 + <movie-card :movie="movie" />
168 - :key="movie.id"  
169 - class="bg-gray-800 rounded-lg overflow-hidden shadow-lg transition-transform duration-300 hover:scale-105 cursor-pointer"  
170 - @click="navigateTo(`/movies/${movie.id}`)"  
171 - >  
172 - <div class="relative pb-[150%]">  
173 - <img  
174 - v-if="movie.poster_path"  
175 - :alt="movie.title"  
176 - :src="`https://image.tmdb.org/t/p/w500${movie.poster_path}`"  
177 - class="absolute inset-0 w-full h-full object-cover"  
178 - />  
179 - <div v-else class="absolute inset-0 w-full h-full bg-gray-700 flex items-center justify-center">  
180 - <FilmIcon :size="48" class="text-gray-500" />  
181 - </div>  
182 - <div  
183 - class="absolute top-2 right-2 bg-primary text-white rounded-full w-10 h-10 flex items-center justify-center font-bold"  
184 - >  
185 - {{ movie.vote_average.toFixed(1) }}  
186 - </div>  
187 - </div>  
188 - <div class="p-4">  
189 - <h2 class="text-lg font-bold mb-1 line-clamp-1">{{ movie.title }}</h2>  
190 - <p class="text-sm text-gray-400">{{ useDateFormat(movie.release_date, "DD-MM-YYYY") }}</p>  
191 - </div>  
192 </div> 173 </div>
193 </div> 174 </div>
194 175
@@ -200,9 +181,7 @@ onBeforeUnmount(() => { @@ -200,9 +181,7 @@ onBeforeUnmount(() => {
200 </section> 181 </section>
201 182
202 <!-- Loader pour le chargement de plus de films --> 183 <!-- Loader pour le chargement de plus de films -->
203 - <section v-if="isLoadingMore && !isInitialLoading" class="flex justify-center mt-8"> 184 + <ui-components-loader :is-initial-loading="isInitialLoading" :is-loading="isLoadingMore" />
204 - <div class="w-10 h-10 border-4 border-primary border-t-transparent rounded-full animate-spin" />  
205 - </section>  
206 185
207 <!-- Élément observé pour le défilement infini --> 186 <!-- Élément observé pour le défilement infini -->
208 <div ref="loadMoreTrigger" class="h-10 mt-4" /> 187 <div ref="loadMoreTrigger" class="h-10 mt-4" />
  1 +import { describe, it, expect } from 'vitest'
  2 +import { mount } from '@vue/test-utils'
  3 +
  4 +import HelloWorld from './HelloWorld.vue'
  5 +
  6 +describe('HelloWorld', () => {
  7 + it('component renders Hello world properly', () => {
  8 + const wrapper = mount(HelloWorld)
  9 + expect(wrapper.text()).toContain('Hello world')
  10 + })
  11 +})
  1 +<script setup lang="ts">
  2 +
  3 +</script>
  4 +
  5 +<template>
  6 + <p>Hello world</p>
  7 +</template>
  8 +
  9 +<style scoped lang="scss">
  10 +
  11 +</style>
  1 +<script lang="ts" setup>
  2 +//#region --Props--.
  3 +defineProps({
  4 + isLoading: {
  5 + type: Boolean,
  6 + required: true,
  7 + nullable: false,
  8 + },
  9 + isInitialLoading: {
  10 + type: Boolean,
  11 + required: false,
  12 + nullable: false,
  13 + default: false,
  14 + },
  15 +});
  16 +//#endregion
  17 +</script>
  18 +
  19 +<template>
  20 + <section v-if="isLoading && !isInitialLoading" class="flex justify-center mt-8">
  21 + <div class="w-10 h-10 border-4 border-primary border-t-transparent rounded-full animate-spin" />
  22 + </section>
  23 +</template>
  24 +
  25 +<style scoped></style>
@@ -25,6 +25,7 @@ export default defineNuxtConfig({ @@ -25,6 +25,7 @@ export default defineNuxtConfig({
25 "@nuxt/eslint", 25 "@nuxt/eslint",
26 "@nuxt/icon", 26 "@nuxt/icon",
27 "@nuxt/image", 27 "@nuxt/image",
  28 + "@nuxt/test-utils/module",
28 [ 29 [
29 "@pinia/nuxt", 30 "@pinia/nuxt",
30 { 31 {
@@ -13,13 +13,13 @@ @@ -13,13 +13,13 @@
13 "@nuxt/icon": "^1.12.0", 13 "@nuxt/icon": "^1.12.0",
14 "@nuxt/image": "^1.10.0", 14 "@nuxt/image": "^1.10.0",
15 "@nuxt/scripts": "^0.11.6", 15 "@nuxt/scripts": "^0.11.6",
16 - "@nuxt/test-utils": "^3.17.2",  
17 "@nuxt/ui": "^2.22.0", 16 "@nuxt/ui": "^2.22.0",
18 "@pinia-orm/nuxt": "^1.10.2", 17 "@pinia-orm/nuxt": "^1.10.2",
19 "@pinia/nuxt": "^0.9.0", 18 "@pinia/nuxt": "^0.9.0",
20 "@tinymce/tinymce-vue": "^5.1.1", 19 "@tinymce/tinymce-vue": "^5.1.1",
21 "@types/vuelidate": "^0.7.22", 20 "@types/vuelidate": "^0.7.22",
22 "@unhead/vue": "^2.0.8", 21 "@unhead/vue": "^2.0.8",
  22 + "@vitejs/plugin-vue": "^5.2.3",
23 "@vuelidate/core": "^2.0.3", 23 "@vuelidate/core": "^2.0.3",
24 "@vuelidate/validators": "^2.0.4", 24 "@vuelidate/validators": "^2.0.4",
25 "@vueuse/core": "^13.1.0", 25 "@vueuse/core": "^13.1.0",
@@ -34,10 +34,16 @@ @@ -34,10 +34,16 @@
34 "vuetify-nuxt-module": "^0.18.6" 34 "vuetify-nuxt-module": "^0.18.6"
35 }, 35 },
36 "devDependencies": { 36 "devDependencies": {
  37 + "@nuxt/test-utils": "^3.17.2",
37 "@nuxtjs/tailwindcss": "^6.13.2", 38 "@nuxtjs/tailwindcss": "^6.13.2",
  39 + "@vue/test-utils": "^2.4.6",
38 "eslint-config-prettier": "^10.1.2", 40 "eslint-config-prettier": "^10.1.2",
39 "eslint-plugin-prettier": "^5.2.6", 41 "eslint-plugin-prettier": "^5.2.6",
40 - "prettier": "^3.5.3" 42 + "happy-dom": "^17.4.4",
  43 + "jsdom": "^26.1.0",
  44 + "playwright-core": "^1.52.0",
  45 + "prettier": "^3.5.3",
  46 + "vitest": "^3.1.2"
41 } 47 }
42 }, 48 },
43 "node_modules/@alloc/quick-lru": { 49 "node_modules/@alloc/quick-lru": {
@@ -119,6 +125,27 @@ @@ -119,6 +125,27 @@
119 "url": "https://github.com/sponsors/philsturgeon" 125 "url": "https://github.com/sponsors/philsturgeon"
120 } 126 }
121 }, 127 },
  128 + "node_modules/@asamuzakjp/css-color": {
  129 + "version": "3.1.5",
  130 + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.5.tgz",
  131 + "integrity": "sha512-w7AmVyTTiU41fNLsFDf+gA2Dwtbx2EJtn2pbJNAGSRAg50loXy1uLXA3hEpD8+eydcomTurw09tq5/AyceCaGg==",
  132 + "dev": true,
  133 + "license": "MIT",
  134 + "dependencies": {
  135 + "@csstools/css-calc": "^2.1.3",
  136 + "@csstools/css-color-parser": "^3.0.9",
  137 + "@csstools/css-parser-algorithms": "^3.0.4",
  138 + "@csstools/css-tokenizer": "^3.0.3",
  139 + "lru-cache": "^10.4.3"
  140 + }
  141 + },
  142 + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
  143 + "version": "10.4.3",
  144 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
  145 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
  146 + "dev": true,
  147 + "license": "ISC"
  148 + },
122 "node_modules/@babel/code-frame": { 149 "node_modules/@babel/code-frame": {
123 "version": "7.26.2", 150 "version": "7.26.2",
124 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 151 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
@@ -561,6 +588,121 @@ @@ -561,6 +588,121 @@
561 "node": ">=0.1.90" 588 "node": ">=0.1.90"
562 } 589 }
563 }, 590 },
  591 + "node_modules/@csstools/color-helpers": {
  592 + "version": "5.0.2",
  593 + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz",
  594 + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==",
  595 + "dev": true,
  596 + "funding": [
  597 + {
  598 + "type": "github",
  599 + "url": "https://github.com/sponsors/csstools"
  600 + },
  601 + {
  602 + "type": "opencollective",
  603 + "url": "https://opencollective.com/csstools"
  604 + }
  605 + ],
  606 + "license": "MIT-0",
  607 + "engines": {
  608 + "node": ">=18"
  609 + }
  610 + },
  611 + "node_modules/@csstools/css-calc": {
  612 + "version": "2.1.3",
  613 + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz",
  614 + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==",
  615 + "dev": true,
  616 + "funding": [
  617 + {
  618 + "type": "github",
  619 + "url": "https://github.com/sponsors/csstools"
  620 + },
  621 + {
  622 + "type": "opencollective",
  623 + "url": "https://opencollective.com/csstools"
  624 + }
  625 + ],
  626 + "license": "MIT",
  627 + "engines": {
  628 + "node": ">=18"
  629 + },
  630 + "peerDependencies": {
  631 + "@csstools/css-parser-algorithms": "^3.0.4",
  632 + "@csstools/css-tokenizer": "^3.0.3"
  633 + }
  634 + },
  635 + "node_modules/@csstools/css-color-parser": {
  636 + "version": "3.0.9",
  637 + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz",
  638 + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==",
  639 + "dev": true,
  640 + "funding": [
  641 + {
  642 + "type": "github",
  643 + "url": "https://github.com/sponsors/csstools"
  644 + },
  645 + {
  646 + "type": "opencollective",
  647 + "url": "https://opencollective.com/csstools"
  648 + }
  649 + ],
  650 + "license": "MIT",
  651 + "dependencies": {
  652 + "@csstools/color-helpers": "^5.0.2",
  653 + "@csstools/css-calc": "^2.1.3"
  654 + },
  655 + "engines": {
  656 + "node": ">=18"
  657 + },
  658 + "peerDependencies": {
  659 + "@csstools/css-parser-algorithms": "^3.0.4",
  660 + "@csstools/css-tokenizer": "^3.0.3"
  661 + }
  662 + },
  663 + "node_modules/@csstools/css-parser-algorithms": {
  664 + "version": "3.0.4",
  665 + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
  666 + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
  667 + "dev": true,
  668 + "funding": [
  669 + {
  670 + "type": "github",
  671 + "url": "https://github.com/sponsors/csstools"
  672 + },
  673 + {
  674 + "type": "opencollective",
  675 + "url": "https://opencollective.com/csstools"
  676 + }
  677 + ],
  678 + "license": "MIT",
  679 + "engines": {
  680 + "node": ">=18"
  681 + },
  682 + "peerDependencies": {
  683 + "@csstools/css-tokenizer": "^3.0.3"
  684 + }
  685 + },
  686 + "node_modules/@csstools/css-tokenizer": {
  687 + "version": "3.0.3",
  688 + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
  689 + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
  690 + "dev": true,
  691 + "funding": [
  692 + {
  693 + "type": "github",
  694 + "url": "https://github.com/sponsors/csstools"
  695 + },
  696 + {
  697 + "type": "opencollective",
  698 + "url": "https://opencollective.com/csstools"
  699 + }
  700 + ],
  701 + "license": "MIT",
  702 + "engines": {
  703 + "node": ">=18"
  704 + }
  705 + },
564 "node_modules/@csstools/selector-resolve-nested": { 706 "node_modules/@csstools/selector-resolve-nested": {
565 "version": "3.0.0", 707 "version": "3.0.0",
566 "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", 708 "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz",
@@ -3077,6 +3219,7 @@ @@ -3077,6 +3219,7 @@
3077 "version": "3.17.2", 3219 "version": "3.17.2",
3078 "resolved": "https://registry.npmjs.org/@nuxt/test-utils/-/test-utils-3.17.2.tgz", 3220 "resolved": "https://registry.npmjs.org/@nuxt/test-utils/-/test-utils-3.17.2.tgz",
3079 "integrity": "sha512-i1NiWsJx8sv8Zg8z3WD7ITehMi9s8DaR6ArgmDHaKkQ6RJSaVhrPKyGBTv3gzdoF8CHUKa3MNhdX62JWblvLMg==", 3221 "integrity": "sha512-i1NiWsJx8sv8Zg8z3WD7ITehMi9s8DaR6ArgmDHaKkQ6RJSaVhrPKyGBTv3gzdoF8CHUKa3MNhdX62JWblvLMg==",
  3222 + "dev": true,
3080 "license": "MIT", 3223 "license": "MIT",
3081 "dependencies": { 3224 "dependencies": {
3082 "@nuxt/kit": "^3.16.0", 3225 "@nuxt/kit": "^3.16.0",
@@ -3157,6 +3300,7 @@ @@ -3157,6 +3300,7 @@
3157 "version": "0.3.2", 3300 "version": "0.3.2",
3158 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 3301 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
3159 "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 3302 "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
  3303 + "dev": true,
3160 "license": "MIT" 3304 "license": "MIT"
3161 }, 3305 },
3162 "node_modules/@nuxt/ui": { 3306 "node_modules/@nuxt/ui": {
@@ -3323,6 +3467,13 @@ @@ -3323,6 +3467,13 @@
3323 "unctx": "^2.4.1" 3467 "unctx": "^2.4.1"
3324 } 3468 }
3325 }, 3469 },
  3470 + "node_modules/@one-ini/wasm": {
  3471 + "version": "0.1.1",
  3472 + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
  3473 + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
  3474 + "dev": true,
  3475 + "license": "MIT"
  3476 + },
3326 "node_modules/@oxc-parser/binding-darwin-arm64": { 3477 "node_modules/@oxc-parser/binding-darwin-arm64": {
3327 "version": "0.56.5", 3478 "version": "0.56.5",
3328 "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.56.5.tgz", 3479 "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.56.5.tgz",
@@ -5542,6 +5693,119 @@ @@ -5542,6 +5693,119 @@
5542 "vue": "^3.0.0" 5693 "vue": "^3.0.0"
5543 } 5694 }
5544 }, 5695 },
  5696 + "node_modules/@vitest/expect": {
  5697 + "version": "3.1.2",
  5698 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz",
  5699 + "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==",
  5700 + "dev": true,
  5701 + "license": "MIT",
  5702 + "dependencies": {
  5703 + "@vitest/spy": "3.1.2",
  5704 + "@vitest/utils": "3.1.2",
  5705 + "chai": "^5.2.0",
  5706 + "tinyrainbow": "^2.0.0"
  5707 + },
  5708 + "funding": {
  5709 + "url": "https://opencollective.com/vitest"
  5710 + }
  5711 + },
  5712 + "node_modules/@vitest/mocker": {
  5713 + "version": "3.1.2",
  5714 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz",
  5715 + "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==",
  5716 + "dev": true,
  5717 + "license": "MIT",
  5718 + "dependencies": {
  5719 + "@vitest/spy": "3.1.2",
  5720 + "estree-walker": "^3.0.3",
  5721 + "magic-string": "^0.30.17"
  5722 + },
  5723 + "funding": {
  5724 + "url": "https://opencollective.com/vitest"
  5725 + },
  5726 + "peerDependencies": {
  5727 + "msw": "^2.4.9",
  5728 + "vite": "^5.0.0 || ^6.0.0"
  5729 + },
  5730 + "peerDependenciesMeta": {
  5731 + "msw": {
  5732 + "optional": true
  5733 + },
  5734 + "vite": {
  5735 + "optional": true
  5736 + }
  5737 + }
  5738 + },
  5739 + "node_modules/@vitest/pretty-format": {
  5740 + "version": "3.1.2",
  5741 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz",
  5742 + "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==",
  5743 + "dev": true,
  5744 + "license": "MIT",
  5745 + "dependencies": {
  5746 + "tinyrainbow": "^2.0.0"
  5747 + },
  5748 + "funding": {
  5749 + "url": "https://opencollective.com/vitest"
  5750 + }
  5751 + },
  5752 + "node_modules/@vitest/runner": {
  5753 + "version": "3.1.2",
  5754 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz",
  5755 + "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==",
  5756 + "dev": true,
  5757 + "license": "MIT",
  5758 + "dependencies": {
  5759 + "@vitest/utils": "3.1.2",
  5760 + "pathe": "^2.0.3"
  5761 + },
  5762 + "funding": {
  5763 + "url": "https://opencollective.com/vitest"
  5764 + }
  5765 + },
  5766 + "node_modules/@vitest/snapshot": {
  5767 + "version": "3.1.2",
  5768 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz",
  5769 + "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==",
  5770 + "dev": true,
  5771 + "license": "MIT",
  5772 + "dependencies": {
  5773 + "@vitest/pretty-format": "3.1.2",
  5774 + "magic-string": "^0.30.17",
  5775 + "pathe": "^2.0.3"
  5776 + },
  5777 + "funding": {
  5778 + "url": "https://opencollective.com/vitest"
  5779 + }
  5780 + },
  5781 + "node_modules/@vitest/spy": {
  5782 + "version": "3.1.2",
  5783 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz",
  5784 + "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==",
  5785 + "dev": true,
  5786 + "license": "MIT",
  5787 + "dependencies": {
  5788 + "tinyspy": "^3.0.2"
  5789 + },
  5790 + "funding": {
  5791 + "url": "https://opencollective.com/vitest"
  5792 + }
  5793 + },
  5794 + "node_modules/@vitest/utils": {
  5795 + "version": "3.1.2",
  5796 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz",
  5797 + "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==",
  5798 + "dev": true,
  5799 + "license": "MIT",
  5800 + "dependencies": {
  5801 + "@vitest/pretty-format": "3.1.2",
  5802 + "loupe": "^3.1.3",
  5803 + "tinyrainbow": "^2.0.0"
  5804 + },
  5805 + "funding": {
  5806 + "url": "https://opencollective.com/vitest"
  5807 + }
  5808 + },
5545 "node_modules/@vue-macros/common": { 5809 "node_modules/@vue-macros/common": {
5546 "version": "1.16.1", 5810 "version": "1.16.1",
5547 "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz", 5811 "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz",
@@ -5776,6 +6040,17 @@ @@ -5776,6 +6040,17 @@
5776 "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", 6040 "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
5777 "license": "MIT" 6041 "license": "MIT"
5778 }, 6042 },
  6043 + "node_modules/@vue/test-utils": {
  6044 + "version": "2.4.6",
  6045 + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz",
  6046 + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==",
  6047 + "dev": true,
  6048 + "license": "MIT",
  6049 + "dependencies": {
  6050 + "js-beautify": "^1.14.9",
  6051 + "vue-component-type-helpers": "^2.0.0"
  6052 + }
  6053 + },
5779 "node_modules/@vuelidate/core": { 6054 "node_modules/@vuelidate/core": {
5780 "version": "2.0.3", 6055 "version": "2.0.3",
5781 "resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.3.tgz", 6056 "resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.3.tgz",
@@ -6410,6 +6685,16 @@ @@ -6410,6 +6685,16 @@
6410 "node": ">=8" 6685 "node": ">=8"
6411 } 6686 }
6412 }, 6687 },
  6688 + "node_modules/assertion-error": {
  6689 + "version": "2.0.1",
  6690 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
  6691 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
  6692 + "dev": true,
  6693 + "license": "MIT",
  6694 + "engines": {
  6695 + "node": ">=12"
  6696 + }
  6697 + },
6413 "node_modules/ast-kit": { 6698 "node_modules/ast-kit": {
6414 "version": "1.4.2", 6699 "version": "1.4.2",
6415 "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.2.tgz", 6700 "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.2.tgz",
@@ -6990,6 +7275,23 @@ @@ -6990,6 +7275,23 @@
6990 ], 7275 ],
6991 "license": "CC-BY-4.0" 7276 "license": "CC-BY-4.0"
6992 }, 7277 },
  7278 + "node_modules/chai": {
  7279 + "version": "5.2.0",
  7280 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
  7281 + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
  7282 + "dev": true,
  7283 + "license": "MIT",
  7284 + "dependencies": {
  7285 + "assertion-error": "^2.0.1",
  7286 + "check-error": "^2.1.1",
  7287 + "deep-eql": "^5.0.1",
  7288 + "loupe": "^3.1.0",
  7289 + "pathval": "^2.0.0"
  7290 + },
  7291 + "engines": {
  7292 + "node": ">=12"
  7293 + }
  7294 + },
6993 "node_modules/chalk": { 7295 "node_modules/chalk": {
6994 "version": "4.1.2", 7296 "version": "4.1.2",
6995 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 7297 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -7018,6 +7320,16 @@ @@ -7018,6 +7320,16 @@
7018 "node": ">=8" 7320 "node": ">=8"
7019 } 7321 }
7020 }, 7322 },
  7323 + "node_modules/check-error": {
  7324 + "version": "2.1.1",
  7325 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
  7326 + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
  7327 + "dev": true,
  7328 + "license": "MIT",
  7329 + "engines": {
  7330 + "node": ">= 16"
  7331 + }
  7332 + },
7021 "node_modules/chokidar": { 7333 "node_modules/chokidar": {
7022 "version": "4.0.3", 7334 "version": "4.0.3",
7023 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 7335 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -7300,6 +7612,24 @@ @@ -7300,6 +7612,24 @@
7300 "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", 7612 "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
7301 "license": "MIT" 7613 "license": "MIT"
7302 }, 7614 },
  7615 + "node_modules/config-chain": {
  7616 + "version": "1.1.13",
  7617 + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
  7618 + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
  7619 + "dev": true,
  7620 + "license": "MIT",
  7621 + "dependencies": {
  7622 + "ini": "^1.3.4",
  7623 + "proto-list": "~1.2.1"
  7624 + }
  7625 + },
  7626 + "node_modules/config-chain/node_modules/ini": {
  7627 + "version": "1.3.8",
  7628 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
  7629 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
  7630 + "dev": true,
  7631 + "license": "ISC"
  7632 + },
7303 "node_modules/consola": { 7633 "node_modules/consola": {
7304 "version": "3.4.2", 7634 "version": "3.4.2",
7305 "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", 7635 "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
@@ -7692,6 +8022,20 @@ @@ -7692,6 +8022,20 @@
7692 "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", 8022 "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
7693 "license": "CC0-1.0" 8023 "license": "CC0-1.0"
7694 }, 8024 },
  8025 + "node_modules/cssstyle": {
  8026 + "version": "4.3.1",
  8027 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz",
  8028 + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==",
  8029 + "dev": true,
  8030 + "license": "MIT",
  8031 + "dependencies": {
  8032 + "@asamuzakjp/css-color": "^3.1.2",
  8033 + "rrweb-cssom": "^0.8.0"
  8034 + },
  8035 + "engines": {
  8036 + "node": ">=18"
  8037 + }
  8038 + },
7695 "node_modules/csstype": { 8039 "node_modules/csstype": {
7696 "version": "3.1.3", 8040 "version": "3.1.3",
7697 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 8041 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -7707,24 +8051,85 @@ @@ -7707,24 +8051,85 @@
7707 "node": ">= 12" 8051 "node": ">= 12"
7708 } 8052 }
7709 }, 8053 },
7710 - "node_modules/db0": { 8054 + "node_modules/data-urls": {
7711 - "version": "0.3.2", 8055 + "version": "5.0.0",
7712 - "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.2.tgz", 8056 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
7713 - "integrity": "sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==", 8057 + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
  8058 + "dev": true,
7714 "license": "MIT", 8059 "license": "MIT",
7715 - "peerDependencies": { 8060 + "dependencies": {
7716 - "@electric-sql/pglite": "*", 8061 + "whatwg-mimetype": "^4.0.0",
7717 - "@libsql/client": "*", 8062 + "whatwg-url": "^14.0.0"
7718 - "better-sqlite3": "*",  
7719 - "drizzle-orm": "*",  
7720 - "mysql2": "*",  
7721 - "sqlite3": "*"  
7722 - },  
7723 - "peerDependenciesMeta": {  
7724 - "@electric-sql/pglite": {  
7725 - "optional": true  
7726 }, 8063 },
7727 - "@libsql/client": { 8064 + "engines": {
  8065 + "node": ">=18"
  8066 + }
  8067 + },
  8068 + "node_modules/data-urls/node_modules/tr46": {
  8069 + "version": "5.1.1",
  8070 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
  8071 + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
  8072 + "dev": true,
  8073 + "license": "MIT",
  8074 + "dependencies": {
  8075 + "punycode": "^2.3.1"
  8076 + },
  8077 + "engines": {
  8078 + "node": ">=18"
  8079 + }
  8080 + },
  8081 + "node_modules/data-urls/node_modules/webidl-conversions": {
  8082 + "version": "7.0.0",
  8083 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
  8084 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
  8085 + "dev": true,
  8086 + "license": "BSD-2-Clause",
  8087 + "engines": {
  8088 + "node": ">=12"
  8089 + }
  8090 + },
  8091 + "node_modules/data-urls/node_modules/whatwg-mimetype": {
  8092 + "version": "4.0.0",
  8093 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
  8094 + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
  8095 + "dev": true,
  8096 + "license": "MIT",
  8097 + "engines": {
  8098 + "node": ">=18"
  8099 + }
  8100 + },
  8101 + "node_modules/data-urls/node_modules/whatwg-url": {
  8102 + "version": "14.2.0",
  8103 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
  8104 + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
  8105 + "dev": true,
  8106 + "license": "MIT",
  8107 + "dependencies": {
  8108 + "tr46": "^5.1.0",
  8109 + "webidl-conversions": "^7.0.0"
  8110 + },
  8111 + "engines": {
  8112 + "node": ">=18"
  8113 + }
  8114 + },
  8115 + "node_modules/db0": {
  8116 + "version": "0.3.2",
  8117 + "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.2.tgz",
  8118 + "integrity": "sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==",
  8119 + "license": "MIT",
  8120 + "peerDependencies": {
  8121 + "@electric-sql/pglite": "*",
  8122 + "@libsql/client": "*",
  8123 + "better-sqlite3": "*",
  8124 + "drizzle-orm": "*",
  8125 + "mysql2": "*",
  8126 + "sqlite3": "*"
  8127 + },
  8128 + "peerDependenciesMeta": {
  8129 + "@electric-sql/pglite": {
  8130 + "optional": true
  8131 + },
  8132 + "@libsql/client": {
7728 "optional": true 8133 "optional": true
7729 }, 8134 },
7730 "better-sqlite3": { 8135 "better-sqlite3": {
@@ -7767,6 +8172,13 @@ @@ -7767,6 +8172,13 @@
7767 "callsite": "^1.0.0" 8172 "callsite": "^1.0.0"
7768 } 8173 }
7769 }, 8174 },
  8175 + "node_modules/decimal.js": {
  8176 + "version": "10.5.0",
  8177 + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz",
  8178 + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==",
  8179 + "dev": true,
  8180 + "license": "MIT"
  8181 + },
7770 "node_modules/decompress-response": { 8182 "node_modules/decompress-response": {
7771 "version": "6.0.0", 8183 "version": "6.0.0",
7772 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 8184 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -7783,6 +8195,16 @@ @@ -7783,6 +8195,16 @@
7783 "url": "https://github.com/sponsors/sindresorhus" 8195 "url": "https://github.com/sponsors/sindresorhus"
7784 } 8196 }
7785 }, 8197 },
  8198 + "node_modules/deep-eql": {
  8199 + "version": "5.0.2",
  8200 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
  8201 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
  8202 + "dev": true,
  8203 + "license": "MIT",
  8204 + "engines": {
  8205 + "node": ">=6"
  8206 + }
  8207 + },
7786 "node_modules/deep-equal": { 8208 "node_modules/deep-equal": {
7787 "version": "1.0.1", 8209 "version": "1.0.1",
7788 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 8210 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
@@ -8190,6 +8612,41 @@ @@ -8190,6 +8612,41 @@
8190 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 8612 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
8191 "license": "MIT" 8613 "license": "MIT"
8192 }, 8614 },
  8615 + "node_modules/editorconfig": {
  8616 + "version": "1.0.4",
  8617 + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
  8618 + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
  8619 + "dev": true,
  8620 + "license": "MIT",
  8621 + "dependencies": {
  8622 + "@one-ini/wasm": "0.1.1",
  8623 + "commander": "^10.0.0",
  8624 + "minimatch": "9.0.1",
  8625 + "semver": "^7.5.3"
  8626 + },
  8627 + "bin": {
  8628 + "editorconfig": "bin/editorconfig"
  8629 + },
  8630 + "engines": {
  8631 + "node": ">=14"
  8632 + }
  8633 + },
  8634 + "node_modules/editorconfig/node_modules/minimatch": {
  8635 + "version": "9.0.1",
  8636 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
  8637 + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
  8638 + "dev": true,
  8639 + "license": "ISC",
  8640 + "dependencies": {
  8641 + "brace-expansion": "^2.0.1"
  8642 + },
  8643 + "engines": {
  8644 + "node": ">=16 || 14 >=14.17"
  8645 + },
  8646 + "funding": {
  8647 + "url": "https://github.com/sponsors/isaacs"
  8648 + }
  8649 + },
8193 "node_modules/ee-first": { 8650 "node_modules/ee-first": {
8194 "version": "1.1.1", 8651 "version": "1.1.1",
8195 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 8652 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -9182,6 +9639,16 @@ @@ -9182,6 +9639,16 @@
9182 "node": ">=6" 9639 "node": ">=6"
9183 } 9640 }
9184 }, 9641 },
  9642 + "node_modules/expect-type": {
  9643 + "version": "1.2.1",
  9644 + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz",
  9645 + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==",
  9646 + "dev": true,
  9647 + "license": "Apache-2.0",
  9648 + "engines": {
  9649 + "node": ">=12.0.0"
  9650 + }
  9651 + },
9185 "node_modules/exsolve": { 9652 "node_modules/exsolve": {
9186 "version": "1.0.5", 9653 "version": "1.0.5",
9187 "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", 9654 "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz",
@@ -9245,6 +9712,7 @@ @@ -9245,6 +9712,7 @@
9245 "version": "6.0.0", 9712 "version": "6.0.0",
9246 "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz", 9713 "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz",
9247 "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==", 9714 "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==",
  9715 + "dev": true,
9248 "license": "Apache-2.0", 9716 "license": "Apache-2.0",
9249 "engines": { 9717 "engines": {
9250 "node": ">=18" 9718 "node": ">=18"
@@ -9969,6 +10437,30 @@ @@ -9969,6 +10437,30 @@
9969 "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", 10437 "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==",
9970 "license": "MIT" 10438 "license": "MIT"
9971 }, 10439 },
  10440 + "node_modules/happy-dom": {
  10441 + "version": "17.4.4",
  10442 + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-17.4.4.tgz",
  10443 + "integrity": "sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==",
  10444 + "dev": true,
  10445 + "license": "MIT",
  10446 + "dependencies": {
  10447 + "webidl-conversions": "^7.0.0",
  10448 + "whatwg-mimetype": "^3.0.0"
  10449 + },
  10450 + "engines": {
  10451 + "node": ">=18.0.0"
  10452 + }
  10453 + },
  10454 + "node_modules/happy-dom/node_modules/webidl-conversions": {
  10455 + "version": "7.0.0",
  10456 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
  10457 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
  10458 + "dev": true,
  10459 + "license": "BSD-2-Clause",
  10460 + "engines": {
  10461 + "node": ">=12"
  10462 + }
  10463 + },
9972 "node_modules/has-flag": { 10464 "node_modules/has-flag": {
9973 "version": "4.0.0", 10465 "version": "4.0.0",
9974 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 10466 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -10047,6 +10539,19 @@ @@ -10047,6 +10539,19 @@
10047 "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 10539 "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
10048 "license": "ISC" 10540 "license": "ISC"
10049 }, 10541 },
  10542 + "node_modules/html-encoding-sniffer": {
  10543 + "version": "4.0.0",
  10544 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
  10545 + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
  10546 + "dev": true,
  10547 + "license": "MIT",
  10548 + "dependencies": {
  10549 + "whatwg-encoding": "^3.1.1"
  10550 + },
  10551 + "engines": {
  10552 + "node": ">=18"
  10553 + }
  10554 + },
10050 "node_modules/http-assert": { 10555 "node_modules/http-assert": {
10051 "version": "1.5.0", 10556 "version": "1.5.0",
10052 "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", 10557 "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
@@ -10110,6 +10615,20 @@ @@ -10110,6 +10615,20 @@
10110 "node": ">= 0.8" 10615 "node": ">= 0.8"
10111 } 10616 }
10112 }, 10617 },
  10618 + "node_modules/http-proxy-agent": {
  10619 + "version": "7.0.2",
  10620 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
  10621 + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
  10622 + "dev": true,
  10623 + "license": "MIT",
  10624 + "dependencies": {
  10625 + "agent-base": "^7.1.0",
  10626 + "debug": "^4.3.4"
  10627 + },
  10628 + "engines": {
  10629 + "node": ">= 14"
  10630 + }
  10631 + },
10113 "node_modules/http-shutdown": { 10632 "node_modules/http-shutdown": {
10114 "version": "1.2.2", 10633 "version": "1.2.2",
10115 "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", 10634 "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz",
@@ -10148,6 +10667,19 @@ @@ -10148,6 +10667,19 @@
10148 "node": ">=16.17.0" 10667 "node": ">=16.17.0"
10149 } 10668 }
10150 }, 10669 },
  10670 + "node_modules/iconv-lite": {
  10671 + "version": "0.6.3",
  10672 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
  10673 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
  10674 + "dev": true,
  10675 + "license": "MIT",
  10676 + "dependencies": {
  10677 + "safer-buffer": ">= 2.1.2 < 3.0.0"
  10678 + },
  10679 + "engines": {
  10680 + "node": ">=0.10.0"
  10681 + }
  10682 + },
10151 "node_modules/ieee754": { 10683 "node_modules/ieee754": {
10152 "version": "1.2.1", 10684 "version": "1.2.1",
10153 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 10685 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -10985,6 +11517,13 @@ @@ -10985,6 +11517,13 @@
10985 "node": ">=8" 11517 "node": ">=8"
10986 } 11518 }
10987 }, 11519 },
  11520 + "node_modules/is-potential-custom-element-name": {
  11521 + "version": "1.0.1",
  11522 + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
  11523 + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
  11524 + "dev": true,
  11525 + "license": "MIT"
  11526 + },
10988 "node_modules/is-reference": { 11527 "node_modules/is-reference": {
10989 "version": "1.2.1", 11528 "version": "1.2.1",
10990 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 11529 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
@@ -11142,6 +11681,85 @@ @@ -11142,6 +11681,85 @@
11142 "jiti": "bin/jiti.js" 11681 "jiti": "bin/jiti.js"
11143 } 11682 }
11144 }, 11683 },
  11684 + "node_modules/js-beautify": {
  11685 + "version": "1.15.4",
  11686 + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
  11687 + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
  11688 + "dev": true,
  11689 + "license": "MIT",
  11690 + "dependencies": {
  11691 + "config-chain": "^1.1.13",
  11692 + "editorconfig": "^1.0.4",
  11693 + "glob": "^10.4.2",
  11694 + "js-cookie": "^3.0.5",
  11695 + "nopt": "^7.2.1"
  11696 + },
  11697 + "bin": {
  11698 + "css-beautify": "js/bin/css-beautify.js",
  11699 + "html-beautify": "js/bin/html-beautify.js",
  11700 + "js-beautify": "js/bin/js-beautify.js"
  11701 + },
  11702 + "engines": {
  11703 + "node": ">=14"
  11704 + }
  11705 + },
  11706 + "node_modules/js-beautify/node_modules/abbrev": {
  11707 + "version": "2.0.0",
  11708 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
  11709 + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
  11710 + "dev": true,
  11711 + "license": "ISC",
  11712 + "engines": {
  11713 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
  11714 + }
  11715 + },
  11716 + "node_modules/js-beautify/node_modules/glob": {
  11717 + "version": "10.4.5",
  11718 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
  11719 + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
  11720 + "dev": true,
  11721 + "license": "ISC",
  11722 + "dependencies": {
  11723 + "foreground-child": "^3.1.0",
  11724 + "jackspeak": "^3.1.2",
  11725 + "minimatch": "^9.0.4",
  11726 + "minipass": "^7.1.2",
  11727 + "package-json-from-dist": "^1.0.0",
  11728 + "path-scurry": "^1.11.1"
  11729 + },
  11730 + "bin": {
  11731 + "glob": "dist/esm/bin.mjs"
  11732 + },
  11733 + "funding": {
  11734 + "url": "https://github.com/sponsors/isaacs"
  11735 + }
  11736 + },
  11737 + "node_modules/js-beautify/node_modules/nopt": {
  11738 + "version": "7.2.1",
  11739 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
  11740 + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
  11741 + "dev": true,
  11742 + "license": "ISC",
  11743 + "dependencies": {
  11744 + "abbrev": "^2.0.0"
  11745 + },
  11746 + "bin": {
  11747 + "nopt": "bin/nopt.js"
  11748 + },
  11749 + "engines": {
  11750 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
  11751 + }
  11752 + },
  11753 + "node_modules/js-cookie": {
  11754 + "version": "3.0.5",
  11755 + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
  11756 + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
  11757 + "dev": true,
  11758 + "license": "MIT",
  11759 + "engines": {
  11760 + "node": ">=14"
  11761 + }
  11762 + },
11145 "node_modules/js-tokens": { 11763 "node_modules/js-tokens": {
11146 "version": "4.0.0", 11764 "version": "4.0.0",
11147 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 11765 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -11169,6 +11787,103 @@ @@ -11169,6 +11787,103 @@
11169 "node": ">=12.0.0" 11787 "node": ">=12.0.0"
11170 } 11788 }
11171 }, 11789 },
  11790 + "node_modules/jsdom": {
  11791 + "version": "26.1.0",
  11792 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
  11793 + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
  11794 + "dev": true,
  11795 + "license": "MIT",
  11796 + "dependencies": {
  11797 + "cssstyle": "^4.2.1",
  11798 + "data-urls": "^5.0.0",
  11799 + "decimal.js": "^10.5.0",
  11800 + "html-encoding-sniffer": "^4.0.0",
  11801 + "http-proxy-agent": "^7.0.2",
  11802 + "https-proxy-agent": "^7.0.6",
  11803 + "is-potential-custom-element-name": "^1.0.1",
  11804 + "nwsapi": "^2.2.16",
  11805 + "parse5": "^7.2.1",
  11806 + "rrweb-cssom": "^0.8.0",
  11807 + "saxes": "^6.0.0",
  11808 + "symbol-tree": "^3.2.4",
  11809 + "tough-cookie": "^5.1.1",
  11810 + "w3c-xmlserializer": "^5.0.0",
  11811 + "webidl-conversions": "^7.0.0",
  11812 + "whatwg-encoding": "^3.1.1",
  11813 + "whatwg-mimetype": "^4.0.0",
  11814 + "whatwg-url": "^14.1.1",
  11815 + "ws": "^8.18.0",
  11816 + "xml-name-validator": "^5.0.0"
  11817 + },
  11818 + "engines": {
  11819 + "node": ">=18"
  11820 + },
  11821 + "peerDependencies": {
  11822 + "canvas": "^3.0.0"
  11823 + },
  11824 + "peerDependenciesMeta": {
  11825 + "canvas": {
  11826 + "optional": true
  11827 + }
  11828 + }
  11829 + },
  11830 + "node_modules/jsdom/node_modules/tr46": {
  11831 + "version": "5.1.1",
  11832 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
  11833 + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
  11834 + "dev": true,
  11835 + "license": "MIT",
  11836 + "dependencies": {
  11837 + "punycode": "^2.3.1"
  11838 + },
  11839 + "engines": {
  11840 + "node": ">=18"
  11841 + }
  11842 + },
  11843 + "node_modules/jsdom/node_modules/webidl-conversions": {
  11844 + "version": "7.0.0",
  11845 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
  11846 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
  11847 + "dev": true,
  11848 + "license": "BSD-2-Clause",
  11849 + "engines": {
  11850 + "node": ">=12"
  11851 + }
  11852 + },
  11853 + "node_modules/jsdom/node_modules/whatwg-mimetype": {
  11854 + "version": "4.0.0",
  11855 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
  11856 + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
  11857 + "dev": true,
  11858 + "license": "MIT",
  11859 + "engines": {
  11860 + "node": ">=18"
  11861 + }
  11862 + },
  11863 + "node_modules/jsdom/node_modules/whatwg-url": {
  11864 + "version": "14.2.0",
  11865 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
  11866 + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
  11867 + "dev": true,
  11868 + "license": "MIT",
  11869 + "dependencies": {
  11870 + "tr46": "^5.1.0",
  11871 + "webidl-conversions": "^7.0.0"
  11872 + },
  11873 + "engines": {
  11874 + "node": ">=18"
  11875 + }
  11876 + },
  11877 + "node_modules/jsdom/node_modules/xml-name-validator": {
  11878 + "version": "5.0.0",
  11879 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
  11880 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
  11881 + "dev": true,
  11882 + "license": "Apache-2.0",
  11883 + "engines": {
  11884 + "node": ">=18"
  11885 + }
  11886 + },
11172 "node_modules/jsesc": { 11887 "node_modules/jsesc": {
11173 "version": "3.1.0", 11888 "version": "3.1.0",
11174 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 11889 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -11740,6 +12455,13 @@ @@ -11740,6 +12455,13 @@
11740 "node": ">= 12.0.0" 12455 "node": ">= 12.0.0"
11741 } 12456 }
11742 }, 12457 },
  12458 + "node_modules/loupe": {
  12459 + "version": "3.1.3",
  12460 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
  12461 + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
  12462 + "dev": true,
  12463 + "license": "MIT"
  12464 + },
11743 "node_modules/lru-cache": { 12465 "node_modules/lru-cache": {
11744 "version": "5.1.1", 12466 "version": "5.1.1",
11745 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 12467 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -12671,6 +13393,13 @@ @@ -12671,6 +13393,13 @@
12671 } 13393 }
12672 } 13394 }
12673 }, 13395 },
  13396 + "node_modules/nwsapi": {
  13397 + "version": "2.2.20",
  13398 + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz",
  13399 + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==",
  13400 + "dev": true,
  13401 + "license": "MIT"
  13402 + },
12674 "node_modules/nypm": { 13403 "node_modules/nypm": {
12675 "version": "0.6.0", 13404 "version": "0.6.0",
12676 "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz", 13405 "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz",
@@ -13074,6 +13803,32 @@ @@ -13074,6 +13803,32 @@
13074 "node": ">=14.13.0" 13803 "node": ">=14.13.0"
13075 } 13804 }
13076 }, 13805 },
  13806 + "node_modules/parse5": {
  13807 + "version": "7.3.0",
  13808 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
  13809 + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
  13810 + "dev": true,
  13811 + "license": "MIT",
  13812 + "dependencies": {
  13813 + "entities": "^6.0.0"
  13814 + },
  13815 + "funding": {
  13816 + "url": "https://github.com/inikulin/parse5?sponsor=1"
  13817 + }
  13818 + },
  13819 + "node_modules/parse5/node_modules/entities": {
  13820 + "version": "6.0.0",
  13821 + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
  13822 + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
  13823 + "dev": true,
  13824 + "license": "BSD-2-Clause",
  13825 + "engines": {
  13826 + "node": ">=0.12"
  13827 + },
  13828 + "funding": {
  13829 + "url": "https://github.com/fb55/entities?sponsor=1"
  13830 + }
  13831 + },
13077 "node_modules/parseurl": { 13832 "node_modules/parseurl": {
13078 "version": "1.3.3", 13833 "version": "1.3.3",
13079 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 13834 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -13162,6 +13917,16 @@ @@ -13162,6 +13917,16 @@
13162 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 13917 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
13163 "license": "MIT" 13918 "license": "MIT"
13164 }, 13919 },
  13920 + "node_modules/pathval": {
  13921 + "version": "2.0.0",
  13922 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
  13923 + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
  13924 + "dev": true,
  13925 + "license": "MIT",
  13926 + "engines": {
  13927 + "node": ">= 14.16"
  13928 + }
  13929 + },
13165 "node_modules/pend": { 13930 "node_modules/pend": {
13166 "version": "1.2.0", 13931 "version": "1.2.0",
13167 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 13932 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -13283,6 +14048,19 @@ @@ -13283,6 +14048,19 @@
13283 "pathe": "^2.0.3" 14048 "pathe": "^2.0.3"
13284 } 14049 }
13285 }, 14050 },
  14051 + "node_modules/playwright-core": {
  14052 + "version": "1.52.0",
  14053 + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz",
  14054 + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==",
  14055 + "dev": true,
  14056 + "license": "Apache-2.0",
  14057 + "bin": {
  14058 + "playwright-core": "cli.js"
  14059 + },
  14060 + "engines": {
  14061 + "node": ">=18"
  14062 + }
  14063 + },
13286 "node_modules/pluralize": { 14064 "node_modules/pluralize": {
13287 "version": "8.0.0", 14065 "version": "8.0.0",
13288 "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", 14066 "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@@ -14199,6 +14977,13 @@ @@ -14199,6 +14977,13 @@
14199 "node": ">= 6" 14977 "node": ">= 6"
14200 } 14978 }
14201 }, 14979 },
  14980 + "node_modules/proto-list": {
  14981 + "version": "1.2.4",
  14982 + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
  14983 + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
  14984 + "dev": true,
  14985 + "license": "ISC"
  14986 + },
14202 "node_modules/protocols": { 14987 "node_modules/protocols": {
14203 "version": "2.0.2", 14988 "version": "2.0.2",
14204 "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", 14989 "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz",
@@ -14852,6 +15637,13 @@ @@ -14852,6 +15637,13 @@
14852 } 15637 }
14853 } 15638 }
14854 }, 15639 },
  15640 + "node_modules/rrweb-cssom": {
  15641 + "version": "0.8.0",
  15642 + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
  15643 + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
  15644 + "dev": true,
  15645 + "license": "MIT"
  15646 + },
14855 "node_modules/run-applescript": { 15647 "node_modules/run-applescript": {
14856 "version": "7.0.0", 15648 "version": "7.0.0",
14857 "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", 15649 "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
@@ -14933,6 +15725,26 @@ @@ -14933,6 +15725,26 @@
14933 "node": ">=10" 15725 "node": ">=10"
14934 } 15726 }
14935 }, 15727 },
  15728 + "node_modules/safer-buffer": {
  15729 + "version": "2.1.2",
  15730 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
  15731 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
  15732 + "dev": true,
  15733 + "license": "MIT"
  15734 + },
  15735 + "node_modules/saxes": {
  15736 + "version": "6.0.0",
  15737 + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
  15738 + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
  15739 + "dev": true,
  15740 + "license": "ISC",
  15741 + "dependencies": {
  15742 + "xmlchars": "^2.2.0"
  15743 + },
  15744 + "engines": {
  15745 + "node": ">=v12.22.7"
  15746 + }
  15747 + },
14936 "node_modules/scslre": { 15748 "node_modules/scslre": {
14937 "version": "0.3.0", 15749 "version": "0.3.0",
14938 "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", 15750 "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz",
@@ -15205,6 +16017,13 @@ @@ -15205,6 +16017,13 @@
15205 "url": "https://github.com/sponsors/ljharb" 16017 "url": "https://github.com/sponsors/ljharb"
15206 } 16018 }
15207 }, 16019 },
  16020 + "node_modules/siginfo": {
  16021 + "version": "2.0.0",
  16022 + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
  16023 + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
  16024 + "dev": true,
  16025 + "license": "ISC"
  16026 + },
15208 "node_modules/signal-exit": { 16027 "node_modules/signal-exit": {
15209 "version": "4.1.0", 16028 "version": "4.1.0",
15210 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 16029 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -15425,6 +16244,13 @@ @@ -15425,6 +16244,13 @@
15425 "node": "*" 16244 "node": "*"
15426 } 16245 }
15427 }, 16246 },
  16247 + "node_modules/stackback": {
  16248 + "version": "0.0.2",
  16249 + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
  16250 + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
  16251 + "dev": true,
  16252 + "license": "MIT"
  16253 + },
15428 "node_modules/standard-as-callback": { 16254 "node_modules/standard-as-callback": {
15429 "version": "2.1.0", 16255 "version": "2.1.0",
15430 "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", 16256 "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
@@ -15789,6 +16615,13 @@ @@ -15789,6 +16615,13 @@
15789 "node": ">= 10" 16615 "node": ">= 10"
15790 } 16616 }
15791 }, 16617 },
  16618 + "node_modules/symbol-tree": {
  16619 + "version": "3.2.4",
  16620 + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
  16621 + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
  16622 + "dev": true,
  16623 + "license": "MIT"
  16624 + },
15792 "node_modules/synckit": { 16625 "node_modules/synckit": {
15793 "version": "0.9.2", 16626 "version": "0.9.2",
15794 "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 16627 "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
@@ -16195,6 +17028,13 @@ @@ -16195,6 +17028,13 @@
16195 "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", 17028 "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
16196 "license": "MIT" 17029 "license": "MIT"
16197 }, 17030 },
  17031 + "node_modules/tinybench": {
  17032 + "version": "2.9.0",
  17033 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
  17034 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
  17035 + "dev": true,
  17036 + "license": "MIT"
  17037 + },
16198 "node_modules/tinyexec": { 17038 "node_modules/tinyexec": {
16199 "version": "1.0.1", 17039 "version": "1.0.1",
16200 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", 17040 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
@@ -16223,6 +17063,56 @@ @@ -16223,6 +17063,56 @@
16223 "integrity": "sha512-qAL/FxL7cwZHj4BfaF818zeJJizK9jU5IQzTcSLL4Rj5MaJdiVblEj7aDr80VCV1w9h4Lak9hlnALhq/kVtN1g==", 17063 "integrity": "sha512-qAL/FxL7cwZHj4BfaF818zeJJizK9jU5IQzTcSLL4Rj5MaJdiVblEj7aDr80VCV1w9h4Lak9hlnALhq/kVtN1g==",
16224 "license": "MIT" 17064 "license": "MIT"
16225 }, 17065 },
  17066 + "node_modules/tinypool": {
  17067 + "version": "1.0.2",
  17068 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
  17069 + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
  17070 + "dev": true,
  17071 + "license": "MIT",
  17072 + "engines": {
  17073 + "node": "^18.0.0 || >=20.0.0"
  17074 + }
  17075 + },
  17076 + "node_modules/tinyrainbow": {
  17077 + "version": "2.0.0",
  17078 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
  17079 + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
  17080 + "dev": true,
  17081 + "license": "MIT",
  17082 + "engines": {
  17083 + "node": ">=14.0.0"
  17084 + }
  17085 + },
  17086 + "node_modules/tinyspy": {
  17087 + "version": "3.0.2",
  17088 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
  17089 + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
  17090 + "dev": true,
  17091 + "license": "MIT",
  17092 + "engines": {
  17093 + "node": ">=14.0.0"
  17094 + }
  17095 + },
  17096 + "node_modules/tldts": {
  17097 + "version": "6.1.86",
  17098 + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
  17099 + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
  17100 + "dev": true,
  17101 + "license": "MIT",
  17102 + "dependencies": {
  17103 + "tldts-core": "^6.1.86"
  17104 + },
  17105 + "bin": {
  17106 + "tldts": "bin/cli.js"
  17107 + }
  17108 + },
  17109 + "node_modules/tldts-core": {
  17110 + "version": "6.1.86",
  17111 + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
  17112 + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
  17113 + "dev": true,
  17114 + "license": "MIT"
  17115 + },
16226 "node_modules/tmp": { 17116 "node_modules/tmp": {
16227 "version": "0.2.3", 17117 "version": "0.2.3",
16228 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", 17118 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
@@ -16277,6 +17167,19 @@ @@ -16277,6 +17167,19 @@
16277 "node": ">=6" 17167 "node": ">=6"
16278 } 17168 }
16279 }, 17169 },
  17170 + "node_modules/tough-cookie": {
  17171 + "version": "5.1.2",
  17172 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
  17173 + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
  17174 + "dev": true,
  17175 + "license": "BSD-3-Clause",
  17176 + "dependencies": {
  17177 + "tldts": "^6.1.32"
  17178 + },
  17179 + "engines": {
  17180 + "node": ">=16"
  17181 + }
  17182 + },
16280 "node_modules/tr46": { 17183 "node_modules/tr46": {
16281 "version": "0.0.3", 17184 "version": "0.0.3",
16282 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 17185 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -17312,15 +18215,111 @@ @@ -17312,15 +18215,111 @@
17312 "vuetify": "^3.0.0" 18215 "vuetify": "^3.0.0"
17313 } 18216 }
17314 }, 18217 },
  18218 + "node_modules/vitest": {
  18219 + "version": "3.1.2",
  18220 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz",
  18221 + "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==",
  18222 + "dev": true,
  18223 + "license": "MIT",
  18224 + "dependencies": {
  18225 + "@vitest/expect": "3.1.2",
  18226 + "@vitest/mocker": "3.1.2",
  18227 + "@vitest/pretty-format": "^3.1.2",
  18228 + "@vitest/runner": "3.1.2",
  18229 + "@vitest/snapshot": "3.1.2",
  18230 + "@vitest/spy": "3.1.2",
  18231 + "@vitest/utils": "3.1.2",
  18232 + "chai": "^5.2.0",
  18233 + "debug": "^4.4.0",
  18234 + "expect-type": "^1.2.1",
  18235 + "magic-string": "^0.30.17",
  18236 + "pathe": "^2.0.3",
  18237 + "std-env": "^3.9.0",
  18238 + "tinybench": "^2.9.0",
  18239 + "tinyexec": "^0.3.2",
  18240 + "tinyglobby": "^0.2.13",
  18241 + "tinypool": "^1.0.2",
  18242 + "tinyrainbow": "^2.0.0",
  18243 + "vite": "^5.0.0 || ^6.0.0",
  18244 + "vite-node": "3.1.2",
  18245 + "why-is-node-running": "^2.3.0"
  18246 + },
  18247 + "bin": {
  18248 + "vitest": "vitest.mjs"
  18249 + },
  18250 + "engines": {
  18251 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
  18252 + },
  18253 + "funding": {
  18254 + "url": "https://opencollective.com/vitest"
  18255 + },
  18256 + "peerDependencies": {
  18257 + "@edge-runtime/vm": "*",
  18258 + "@types/debug": "^4.1.12",
  18259 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
  18260 + "@vitest/browser": "3.1.2",
  18261 + "@vitest/ui": "3.1.2",
  18262 + "happy-dom": "*",
  18263 + "jsdom": "*"
  18264 + },
  18265 + "peerDependenciesMeta": {
  18266 + "@edge-runtime/vm": {
  18267 + "optional": true
  18268 + },
  18269 + "@types/debug": {
  18270 + "optional": true
  18271 + },
  18272 + "@types/node": {
  18273 + "optional": true
  18274 + },
  18275 + "@vitest/browser": {
  18276 + "optional": true
  18277 + },
  18278 + "@vitest/ui": {
  18279 + "optional": true
  18280 + },
  18281 + "happy-dom": {
  18282 + "optional": true
  18283 + },
  18284 + "jsdom": {
  18285 + "optional": true
  18286 + }
  18287 + }
  18288 + },
17315 "node_modules/vitest-environment-nuxt": { 18289 "node_modules/vitest-environment-nuxt": {
17316 "version": "1.0.1", 18290 "version": "1.0.1",
17317 "resolved": "https://registry.npmjs.org/vitest-environment-nuxt/-/vitest-environment-nuxt-1.0.1.tgz", 18291 "resolved": "https://registry.npmjs.org/vitest-environment-nuxt/-/vitest-environment-nuxt-1.0.1.tgz",
17318 "integrity": "sha512-eBCwtIQriXW5/M49FjqNKfnlJYlG2LWMSNFsRVKomc8CaMqmhQPBS5LZ9DlgYL9T8xIVsiA6RZn2lk7vxov3Ow==", 18292 "integrity": "sha512-eBCwtIQriXW5/M49FjqNKfnlJYlG2LWMSNFsRVKomc8CaMqmhQPBS5LZ9DlgYL9T8xIVsiA6RZn2lk7vxov3Ow==",
  18293 + "dev": true,
17319 "license": "MIT", 18294 "license": "MIT",
17320 "dependencies": { 18295 "dependencies": {
17321 "@nuxt/test-utils": ">=3.13.1" 18296 "@nuxt/test-utils": ">=3.13.1"
17322 } 18297 }
17323 }, 18298 },
  18299 + "node_modules/vitest/node_modules/tinyexec": {
  18300 + "version": "0.3.2",
  18301 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
  18302 + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
  18303 + "dev": true,
  18304 + "license": "MIT"
  18305 + },
  18306 + "node_modules/vitest/node_modules/tinyglobby": {
  18307 + "version": "0.2.13",
  18308 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
  18309 + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
  18310 + "dev": true,
  18311 + "license": "MIT",
  18312 + "dependencies": {
  18313 + "fdir": "^6.4.4",
  18314 + "picomatch": "^4.0.2"
  18315 + },
  18316 + "engines": {
  18317 + "node": ">=12.0.0"
  18318 + },
  18319 + "funding": {
  18320 + "url": "https://github.com/sponsors/SuperchupuDev"
  18321 + }
  18322 + },
17324 "node_modules/vscode-uri": { 18323 "node_modules/vscode-uri": {
17325 "version": "3.1.0", 18324 "version": "3.1.0",
17326 "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 18325 "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
@@ -17357,6 +18356,13 @@ @@ -17357,6 +18356,13 @@
17357 "ufo": "^1.5.4" 18356 "ufo": "^1.5.4"
17358 } 18357 }
17359 }, 18358 },
  18359 + "node_modules/vue-component-type-helpers": {
  18360 + "version": "2.2.10",
  18361 + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.10.tgz",
  18362 + "integrity": "sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==",
  18363 + "dev": true,
  18364 + "license": "MIT"
  18365 + },
17360 "node_modules/vue-demi": { 18366 "node_modules/vue-demi": {
17361 "version": "0.14.10", 18367 "version": "0.14.10",
17362 "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", 18368 "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
@@ -17534,6 +18540,29 @@ @@ -17534,6 +18540,29 @@
17534 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 18540 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
17535 "license": "MIT" 18541 "license": "MIT"
17536 }, 18542 },
  18543 + "node_modules/w3c-xmlserializer": {
  18544 + "version": "5.0.0",
  18545 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
  18546 + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
  18547 + "dev": true,
  18548 + "license": "MIT",
  18549 + "dependencies": {
  18550 + "xml-name-validator": "^5.0.0"
  18551 + },
  18552 + "engines": {
  18553 + "node": ">=18"
  18554 + }
  18555 + },
  18556 + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": {
  18557 + "version": "5.0.0",
  18558 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
  18559 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
  18560 + "dev": true,
  18561 + "license": "Apache-2.0",
  18562 + "engines": {
  18563 + "node": ">=18"
  18564 + }
  18565 + },
17537 "node_modules/web-streams-polyfill": { 18566 "node_modules/web-streams-polyfill": {
17538 "version": "3.3.3", 18567 "version": "3.3.3",
17539 "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 18568 "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
@@ -17555,6 +18584,29 @@ @@ -17555,6 +18584,29 @@
17555 "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 18584 "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
17556 "license": "MIT" 18585 "license": "MIT"
17557 }, 18586 },
  18587 + "node_modules/whatwg-encoding": {
  18588 + "version": "3.1.1",
  18589 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
  18590 + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
  18591 + "dev": true,
  18592 + "license": "MIT",
  18593 + "dependencies": {
  18594 + "iconv-lite": "0.6.3"
  18595 + },
  18596 + "engines": {
  18597 + "node": ">=18"
  18598 + }
  18599 + },
  18600 + "node_modules/whatwg-mimetype": {
  18601 + "version": "3.0.0",
  18602 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
  18603 + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
  18604 + "dev": true,
  18605 + "license": "MIT",
  18606 + "engines": {
  18607 + "node": ">=12"
  18608 + }
  18609 + },
17558 "node_modules/whatwg-url": { 18610 "node_modules/whatwg-url": {
17559 "version": "5.0.0", 18611 "version": "5.0.0",
17560 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 18612 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
@@ -17580,6 +18632,23 @@ @@ -17580,6 +18632,23 @@
17580 "node": "^18.17.0 || >=20.5.0" 18632 "node": "^18.17.0 || >=20.5.0"
17581 } 18633 }
17582 }, 18634 },
  18635 + "node_modules/why-is-node-running": {
  18636 + "version": "2.3.0",
  18637 + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
  18638 + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
  18639 + "dev": true,
  18640 + "license": "MIT",
  18641 + "dependencies": {
  18642 + "siginfo": "^2.0.0",
  18643 + "stackback": "0.0.2"
  18644 + },
  18645 + "bin": {
  18646 + "why-is-node-running": "cli.js"
  18647 + },
  18648 + "engines": {
  18649 + "node": ">=8"
  18650 + }
  18651 + },
17583 "node_modules/wide-align": { 18652 "node_modules/wide-align": {
17584 "version": "1.1.5", 18653 "version": "1.1.5",
17585 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 18654 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -17800,6 +18869,13 @@ @@ -17800,6 +18869,13 @@
17800 "node": ">=12" 18869 "node": ">=12"
17801 } 18870 }
17802 }, 18871 },
  18872 + "node_modules/xmlchars": {
  18873 + "version": "2.2.0",
  18874 + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
  18875 + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
  18876 + "dev": true,
  18877 + "license": "MIT"
  18878 + },
17803 "node_modules/xss": { 18879 "node_modules/xss": {
17804 "version": "1.0.15", 18880 "version": "1.0.15",
17805 "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", 18881 "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz",
@@ -12,20 +12,21 @@ @@ -12,20 +12,21 @@
12 "lint:js": "eslint --ext \".ts,.vue\" .", 12 "lint:js": "eslint --ext \".ts,.vue\" .",
13 "lint:prettier": "prettier --write .", 13 "lint:prettier": "prettier --write .",
14 "lint": "npm run lint:js && npm run lint:prettier", 14 "lint": "npm run lint:js && npm run lint:prettier",
15 - "format": "prettier --write \"{components,pages,plugins,middleware,layouts,composables,assets}/**/*.{js,jsx,ts,tsx,vue,html,css,scss,json,md}\"" 15 + "format": "prettier --write \"{components,pages,plugins,middleware,layouts,composables,assets}/**/*.{js,jsx,ts,tsx,vue,html,css,scss,json,md}\"",
  16 + "test": "vitest"
16 }, 17 },
17 "dependencies": { 18 "dependencies": {
18 "@nuxt/eslint": "^1.3.0", 19 "@nuxt/eslint": "^1.3.0",
19 "@nuxt/icon": "^1.12.0", 20 "@nuxt/icon": "^1.12.0",
20 "@nuxt/image": "^1.10.0", 21 "@nuxt/image": "^1.10.0",
21 "@nuxt/scripts": "^0.11.6", 22 "@nuxt/scripts": "^0.11.6",
22 - "@nuxt/test-utils": "^3.17.2",  
23 "@nuxt/ui": "^2.22.0", 23 "@nuxt/ui": "^2.22.0",
24 "@pinia-orm/nuxt": "^1.10.2", 24 "@pinia-orm/nuxt": "^1.10.2",
25 "@pinia/nuxt": "^0.9.0", 25 "@pinia/nuxt": "^0.9.0",
26 "@tinymce/tinymce-vue": "^5.1.1", 26 "@tinymce/tinymce-vue": "^5.1.1",
27 "@types/vuelidate": "^0.7.22", 27 "@types/vuelidate": "^0.7.22",
28 "@unhead/vue": "^2.0.8", 28 "@unhead/vue": "^2.0.8",
  29 + "@vitejs/plugin-vue": "^5.2.3",
29 "@vuelidate/core": "^2.0.3", 30 "@vuelidate/core": "^2.0.3",
30 "@vuelidate/validators": "^2.0.4", 31 "@vuelidate/validators": "^2.0.4",
31 "@vueuse/core": "^13.1.0", 32 "@vueuse/core": "^13.1.0",
@@ -40,9 +41,15 @@ @@ -40,9 +41,15 @@
40 "vuetify-nuxt-module": "^0.18.6" 41 "vuetify-nuxt-module": "^0.18.6"
41 }, 42 },
42 "devDependencies": { 43 "devDependencies": {
  44 + "@nuxt/test-utils": "^3.17.2",
43 "@nuxtjs/tailwindcss": "^6.13.2", 45 "@nuxtjs/tailwindcss": "^6.13.2",
  46 + "@vue/test-utils": "^2.4.6",
44 "eslint-config-prettier": "^10.1.2", 47 "eslint-config-prettier": "^10.1.2",
45 "eslint-plugin-prettier": "^5.2.6", 48 "eslint-plugin-prettier": "^5.2.6",
46 - "prettier": "^3.5.3" 49 + "happy-dom": "^17.4.4",
  50 + "jsdom": "^26.1.0",
  51 + "playwright-core": "^1.52.0",
  52 + "prettier": "^3.5.3",
  53 + "vitest": "^3.1.2"
47 } 54 }
48 } 55 }
@@ -200,10 +200,11 @@ onMounted(() => { @@ -200,10 +200,11 @@ onMounted(() => {
200 <span class="font-semibold">Têtes d'affiche:</span> 200 <span class="font-semibold">Têtes d'affiche:</span>
201 {{ 201 {{
202 movie.credit.cast 202 movie.credit.cast
203 - .slice(0, 10) 203 + .slice(0, 15)
204 .map((person) => person.name) 204 .map((person) => person.name)
205 .join(", ") 205 .join(", ")
206 }} 206 }}
  207 + <span v-if="movie.credit.cast.length > 15">..</span>
207 </div> 208 </div>
208 </div> 209 </div>
209 <!-- Comments form. --> 210 <!-- Comments form. -->
  1 +// vite.config.js
  2 +import vue from '@vitejs/plugin-vue'
  3 +
  4 +export default {
  5 + plugins: [vue()],
  6 + test: {
  7 + globals: true,
  8 + environment: "jsdom",
  9 + // Additional test configurations can be added here
  10 + },
  11 +}
  1 +import { defineVitestConfig } from '@nuxt/test-utils/config'
  2 +
  3 +export default defineVitestConfig({
  4 + /**
  5 + * Documentation here : https://nuxt.com/docs/getting-started/testing
  6 + * any custom Vitest config you require
  7 + */
  8 + test: {
  9 + environment: 'nuxt',
  10 + // you can optionally set Nuxt-specific environment options
  11 + // environmentOptions: {
  12 + // nuxt: {
  13 + // rootDir: fileURLToPath(new URL('./playground', import.meta.url)),
  14 + // domEnvironment: 'happy-dom', // 'happy-dom' (default) or 'jsdom'
  15 + // overrides: {
  16 + // // other Nuxt config you want to pass
  17 + // }
  18 + // }
  19 + // }
  20 + }
  21 +})