diff --git a/app/app.vue b/app/app.vue index b52521e..387e3e5 100644 --- a/app/app.vue +++ b/app/app.vue @@ -20,9 +20,9 @@ const { scrollGnbPosition } = storeToRefs(scrollStore) // favicon 링크 생성 헬퍼 const createStyleLinks = () => { const links = [] - const iconUrl = faviconJson.value[0] - const appleTouchIconUrl = faviconJson.value[1] - const pngIconUrl = faviconJson.value[2] + const iconUrl = faviconJson.value?.[0] + const appleTouchIconUrl = faviconJson.value?.[1] + const pngIconUrl = faviconJson.value?.[2] const fontPath = gameFontJson.value?.font_path if (iconUrl) { @@ -57,7 +57,7 @@ const createStyleLinks = () => { // CSS 변수 생성 헬퍼 const createStyleCss = () => { - const colorVariables = Object.entries(keyColorJson.value) + const colorVariables = Object.entries(keyColorJson.value || {}) .filter(([key, value]) => key && value != null) .map(([key, value]) => `--${key}: ${value};`) .join('\n ') diff --git a/app/error.vue b/app/error.vue index 4f9ee5c..fc244de 100644 --- a/app/error.vue +++ b/app/error.vue @@ -126,7 +126,6 @@ const handleKeydown = (e: KeyboardEvent) => { // 500 에러 발생 시 /error 페이지로 리다이렉트 onMounted(() => { const statusCode = currentError.value?.statusCode - console.log('🚀 ~ statusCode:', nuxtError) if (statusCode === 500) { errorTitle.value = tm('Error_500_Inconvenience') diff --git a/layers/middleware/pageData.global.ts b/layers/middleware/pageData.global.ts index 76ceb03..da8e1e6 100644 --- a/layers/middleware/pageData.global.ts +++ b/layers/middleware/pageData.global.ts @@ -49,7 +49,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { const pageVer = urlParams.get('page_ver') || '' const queryLangCode = urlParams.get('lang_code') || currentLangCode - apiUrl = `${stoveApiBaseUrl}/pub-comm/v1.0/template/page/preview` + apiUrl = `${stoveApiOrigin}/pub-comm/v1.0/template/page/preview` queryParams = { lang_code: queryLangCode, page_seq: pageSeq, @@ -72,7 +72,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { } catch (error) { pageDataStore.clearPageData() console.error(error) - return showError( + return abortNavigation( createError({ statusCode: error.statusCode, statusMessage: error.message, @@ -95,14 +95,12 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { pageDataResponse?.code === 91001 || pageDataResponse?.code === 91003 ) { - return showError( + return abortNavigation( createError({ statusCode: 404, - statusMessage: pageDataResponse?.message, fatal: false, // 즉시 에러 페이지로 - data: { - reason: pageDataResponse?.message, - }, + statusMessage: pageDataResponse?.message, + data: { reason: 'post-not-found' }, }) ) } @@ -110,14 +108,16 @@ export default defineNuxtRouteMiddleware(async (to, _from) => { if (pageDataResponse?.code === 91002) { // 이미 /home 경로에 있으면 무한 리다이렉트 방지 if (pathWithoutLocale === '/home') { - return createError({ - statusCode: 404, - statusMessage: pageDataResponse?.message, - fatal: false, // 즉시 에러 페이지로 - data: { - reason: pageDataResponse?.message, - }, - }) + return abortNavigation( + createError({ + statusCode: 404, + statusMessage: pageDataResponse?.message, + fatal: false, // 즉시 에러 페이지로 + data: { + reason: 'invalid-lang-code', + }, + }) + ) } return navigateTo(`/${currentLangCode}/home`) } diff --git a/layers/plugins/init-game-data.server.ts b/layers/plugins/init-game-data.server.ts index 248d3f1..8a83833 100644 --- a/layers/plugins/init-game-data.server.ts +++ b/layers/plugins/init-game-data.server.ts @@ -3,18 +3,22 @@ import type { GameDataValue } from '#layers/types/api/gameData' export default defineNuxtPlugin({ name: 'hydrate-game-data', dependsOn: ['pinia'], - setup(_nuxtApp) { + async setup(_nuxtApp) { if (!import.meta.server) return const event = useRequestEvent() - const gameData = (event?.context as { gameData?: GameDataValue })?.gameData - const currentLangCode = (event?.context as { currentLangCode?: string }) - ?.currentLangCode + const eventContext = event?.context as { + gameData?: GameDataValue + currentLangCode?: string + } + + const gameData = eventContext?.gameData + const resolvedCurrentLangCode = eventContext?.currentLangCode || null if (!gameData) return const gameDataStore = useGameDataStore() - gameDataStore.setCurrentLangCode(currentLangCode) gameDataStore.setGameData(gameData) + gameDataStore.setCurrentLangCode(resolvedCurrentLangCode) }, }) diff --git a/layers/server/middleware/gameData.ts b/layers/server/middleware/gameData.ts index 3600729..4b79fd0 100644 --- a/layers/server/middleware/gameData.ts +++ b/layers/server/middleware/gameData.ts @@ -115,7 +115,7 @@ function fnLocaleMiddleware( function shouldSkipPath(path: string): boolean { return ( path.startsWith('/_nuxt/') || - path.startsWith('/__nuxt') || + (path.startsWith('/__nuxt') && !path.startsWith('/__nuxt_error')) || path.startsWith('/api/') || path.startsWith('/_i18n/') || path.includes('/assets/') || @@ -128,15 +128,14 @@ function shouldSkipPath(path: string): boolean { export default defineEventHandler(async event => { const runtimeConfig = useRuntimeConfig() - // HMR 요청 필터링 (개발 모드에서 중복 실행 방지) - if (shouldSkipPath(event.path)) { - return - } + // 1-1. 정적 파일 패스 + if (isStaticFile(event.path)) return + + // 1-2. 특정 경로 패스 (API, 리소스) + if (shouldSkipPath(event.path)) return // 이미 응답이 종료되었는지 확인 (리다이렉트 등으로 인한 중복 실행 방지) - if (event.node.res.headersSent || event.node.res.writableEnded) { - return - } + if (event.node.res.headersSent || event.node.res.writableEnded) return const stoveApiServerBaseUrl = runtimeConfig.public.stoveApiUrlServer @@ -179,15 +178,12 @@ export default defineEventHandler(async event => { // ------------------------------------------------------------------------------- const fullPath = event.path - // 1-1. 정적 파일 패스 - if (isStaticFile(event.path)) return + // error 패스 + if (fullPath.startsWith('/__nuxt_error')) return - // 1-2. /inspection 패스 + // inspection 패스 if (fullPath.includes('/inspection')) return - // 1-3. 특정 경로 패스 (API, 리소스) - if (shouldSkipPath(fullPath)) return - // 캐시 키 생성 (게임 ID 포함하여 충돌 방지) const gameId = gameDataValue?.game_id || 'default' const cacheKey = `inspection:${gameId}` diff --git a/layers/utils/commonUtil.ts b/layers/utils/commonUtil.ts index 2e47074..b5906cb 100644 --- a/layers/utils/commonUtil.ts +++ b/layers/utils/commonUtil.ts @@ -147,7 +147,7 @@ const setCookieForDay = (name: string, value: string, exp?: number) => { // 정적 파일인지 확인하는 함수 const isStaticFile = (path: string): boolean => { - return /\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|scss)$/i.test( + return /\.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|eot|scss)$/i.test( path ) } diff --git a/package.json b/package.json index 6ef8aa2..b013a00 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@amplitude/analytics-node": "^1.5.9", "@nuxtjs/device": "^3.2.4", "@nuxtjs/i18n": "^9.0.0", - "@pinia/nuxt": "^0.6.1", + "@pinia/nuxt": "^0.11.3", "@seed-next/date": "^0.0.0", "@splidejs/splide": "^4.1.4", "@splidejs/vue-splide": "^0.6.12", @@ -39,7 +39,7 @@ "motion-v": "^1.8.1", "nuxt": "^4.0.3", "nuxt-gtag": "^4.0.0", - "pinia": "^2.3.1", + "pinia": "^3.0.3", "vue": "^3.5.0", "vue-dompurify-html": "^5.3.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18e45a8..511d60b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^9.0.0 version: 9.5.6(@vue/compiler-dom@3.5.21)(eslint@9.35.0(jiti@2.5.1))(magicast@0.3.5)(rollup@4.50.0)(vue@3.5.21(typescript@5.9.2)) '@pinia/nuxt': - specifier: ^0.6.1 - version: 0.6.1(magicast@0.3.5)(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + specifier: ^0.11.3 + version: 0.11.3(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) '@seed-next/date': specifier: ^0.0.0 version: 0.0.0 @@ -54,8 +54,8 @@ importers: specifier: ^4.0.0 version: 4.0.0(magicast@0.3.5) pinia: - specifier: ^2.3.1 - version: 2.3.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + specifier: 3.0.3 + version: 3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) vue: specifier: ^3.5.0 version: 3.5.21(typescript@5.9.2) @@ -743,6 +743,10 @@ packages: resolution: {integrity: sha512-2MGfOXtbcxdkbUNZDjyEv4xmokicZhTrQBMrmNJQztrePfpKOVBe8AiGf/BfbHelXMKio5PgktiRoiEIyIsX4g==} engines: {node: '>=18.12.0'} + '@nuxt/kit@4.4.2': + resolution: {integrity: sha512-5+IPRNX2CjkBhuWUwz0hBuLqiaJPRoKzQ+SvcdrQDbAyE+VDeFt74VpSFr5/R0ujrK4b+XnSHUJWdS72w6hsog==} + engines: {node: '>=18.12.0'} + '@nuxt/schema@4.1.1': resolution: {integrity: sha512-s4ELQEw6er4kop4e9HkTZ2ByVEvOGic9YJmesr2QI3O+q01CLSZE6aepbRLsq1Hz6bbfq/UrFw8MLuHs7l03aA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1219,8 +1223,10 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@pinia/nuxt@0.6.1': - resolution: {integrity: sha512-eqPaOmPbKQANNVOvMMnJfdHij5alzirYzTeZ5eGcFIet8n/gF+vWOWVJkf0BZXIyaTq8hT79IS1HlZXTIhn+PQ==} + '@pinia/nuxt@0.11.3': + resolution: {integrity: sha512-7WVNHpWx4qAEzOlnyrRC88kYrwnlR/PrThWT0XI1dSNyUAXu/KBv9oR37uCgYkZroqP5jn8DfzbkNF3BtKvE9w==} + peerDependencies: + pinia: ^3.0.4 '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -1728,6 +1734,9 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + '@vue/devtools-core@7.7.7': resolution: {integrity: sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==} peerDependencies: @@ -1736,9 +1745,15 @@ packages: '@vue/devtools-kit@7.7.7': resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + '@vue/devtools-shared@7.7.7': resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + '@vue/language-core@3.0.6': resolution: {integrity: sha512-e2RRzYWm+qGm8apUHW1wA5RQxzNhkqbbKdbKhiDUcmMrNAZGyM8aTiL3UrTqkaFI5s7wJRGGrp4u3jgusuBp2A==} peerDependencies: @@ -1824,6 +1839,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1978,6 +1998,14 @@ packages: magicast: optional: true + c12@3.3.3: + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2023,6 +2051,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -2364,6 +2396,10 @@ packages: resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} engines: {node: '>=12'} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2637,6 +2673,9 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3054,6 +3093,10 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3216,6 +3259,9 @@ packages: magic-string@0.30.18: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -3308,6 +3354,9 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} @@ -3609,8 +3658,8 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pinia@2.3.1: - resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + pinia@3.0.3: + resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==} peerDependencies: typescript: '>=4.4.4' vue: ^2.7.0 || ^3.5.11 @@ -3903,6 +3952,9 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc9@3.0.0: + resolution: {integrity: sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -3924,6 +3976,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -4041,6 +4097,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} @@ -4337,6 +4398,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -4346,6 +4410,9 @@ packages: unctx@2.4.1: resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + unctx@2.5.0: + resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==} + undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} @@ -4403,6 +4470,10 @@ packages: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -4609,17 +4680,6 @@ packages: vue-bundle-renderer@2.1.2: resolution: {integrity: sha512-M4WRBO/O/7G9phGaGH9AOwOnYtY9ZpPoDVpBpRzR2jO5rFL9mgIlQIgums2ljCTC2HL1jDXFQc//CzWcAQHgAw==} - vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} @@ -5587,6 +5647,31 @@ snapshots: transitivePeerDependencies: - magicast + '@nuxt/kit@4.4.2(magicast@0.3.5)': + dependencies: + c12: 3.3.3(magicast@0.3.5) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.8 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + mlly: 1.8.2 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rc9: 3.0.0 + scule: 1.3.0 + semver: 7.7.4 + tinyglobby: 0.2.15 + ufo: 1.6.3 + unctx: 2.5.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + '@nuxt/schema@4.1.1': dependencies: '@vue/shared': 3.5.21 @@ -5993,15 +6078,12 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 - '@pinia/nuxt@0.6.1(magicast@0.3.5)(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))': + '@pinia/nuxt@0.11.3(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@nuxt/kit': 3.19.1(magicast@0.3.5) - pinia: 2.3.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + '@nuxt/kit': 4.4.2(magicast@0.3.5) + pinia: 3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) transitivePeerDependencies: - - '@vue/composition-api' - magicast - - typescript - - vue '@pkgjs/parseargs@0.11.0': optional: true @@ -6508,6 +6590,10 @@ snapshots: '@vue/devtools-api@6.6.4': {} + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + '@vue/devtools-core@7.7.7(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@vue/devtools-kit': 7.7.7 @@ -6530,10 +6616,24 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.5.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + '@vue/devtools-shared@7.7.7': dependencies: rfdc: 1.4.1 + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + '@vue/language-core@3.0.6(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.23 @@ -6634,6 +6734,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.16.0: {} + agent-base@7.1.4: {} ajv@6.12.6: @@ -6797,6 +6899,23 @@ snapshots: optionalDependencies: magicast: 0.3.5 + c12@3.3.3(magicast@0.3.5): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.3.1 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} cache-content-type@1.0.1: @@ -6850,6 +6969,10 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@3.0.0: {} ci-info@4.3.0: {} @@ -7132,6 +7255,8 @@ snapshots: dotenv@17.2.2: {} + dotenv@17.3.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7473,6 +7598,8 @@ snapshots: exsolve@1.0.7: {} + exsolve@1.0.8: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -7881,6 +8008,8 @@ snapshots: jiti@2.5.1: {} + jiti@2.6.1: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -8075,6 +8204,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.4 @@ -8147,6 +8280,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + mocked-exports@0.1.1: {} motion-dom@12.24.11: @@ -8674,15 +8814,12 @@ snapshots: pify@2.3.0: {} - pinia@2.3.1(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)): + pinia@3.0.3(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)): dependencies: - '@vue/devtools-api': 6.6.4 + '@vue/devtools-api': 7.7.9 vue: 3.5.21(typescript@5.9.2) - vue-demi: 0.14.10(vue@3.5.21(typescript@5.9.2)) optionalDependencies: typescript: 5.9.2 - transitivePeerDependencies: - - '@vue/composition-api' pirates@4.0.7: {} @@ -8945,6 +9082,11 @@ snapshots: defu: 6.1.4 destr: 2.0.5 + rc9@3.0.0: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -8977,6 +9119,8 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.0.0: {} + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -9097,6 +9241,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.4: {} + send@1.2.0: dependencies: debug: 4.4.1 @@ -9419,6 +9565,8 @@ snapshots: ufo@1.6.1: {} + ufo@1.6.3: {} + ultrahtml@1.6.0: {} uncrypto@0.1.3: {} @@ -9430,6 +9578,13 @@ snapshots: magic-string: 0.30.18 unplugin: 2.3.10 + unctx@2.5.0: + dependencies: + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + unplugin: 2.3.11 + undici-types@7.10.0: {} unenv@2.0.0-rc.20: @@ -9542,6 +9697,13 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.3 @@ -9716,10 +9878,6 @@ snapshots: dependencies: ufo: 1.6.1 - vue-demi@0.14.10(vue@3.5.21(typescript@5.9.2)): - dependencies: - vue: 3.5.21(typescript@5.9.2) - vue-devtools-stub@0.1.0: {} vue-dompurify-html@5.3.0(vue@3.5.21(typescript@5.9.2)):