Compare commits

..

No commits in common. "f6b5266b462f59f16c055403d7605d6422385a10" and "517c33adde5bcc197d420ca5235432ae1d6e9a57" have entirely different histories.

9 changed files with 66 additions and 177 deletions

View file

@ -17,7 +17,6 @@
"arktype": "^2.1.29", "arktype": "^2.1.29",
"axios": "^1.11.0", "axios": "^1.11.0",
"bulma": "^1.0.4", "bulma": "^1.0.4",
"pinia": "^3.0.4",
"tailwindcss": "^4.1.6", "tailwindcss": "^4.1.6",
"vue-i18n": "^11.1.3", "vue-i18n": "^11.1.3",
"vue-router": "^5.0.4" "vue-router": "^5.0.4"

View file

@ -1,8 +1,8 @@
import { computed, type ComputedRef, type Ref, unref, watch } from 'vue' import { computed, type ComputedRef, type Ref, unref, watch } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useMeta, type MetaConfig, type LocaleAwareMeta, type OpenGraphConfig, type TwitterCardConfig } from './useMeta' import { useMeta, type MetaConfig, type LocaleAwareMeta } from './useMeta'
import { useLocale, type LocaleId } from '../i18n' import { useLocale, type LocaleId } from '../i18n'
import type { RouteMetaValue } from '../types/route-meta.d' import type { RouteMeta, RouteMetaValue } from '../types/route-meta.d'
/** /**
* Composable for i18n-aware meta tag management * Composable for i18n-aware meta tag management
@ -49,7 +49,7 @@ export function useI18nMeta(
routeValue: typeof route routeValue: typeof route
): T | undefined => { ): T | undefined => {
if (value === undefined) return undefined if (value === undefined) return undefined
return typeof value === 'function' ? (value as Function)(routeValue) as T : value return typeof value === 'function' ? value(routeValue) : value
} }
/** /**
@ -66,8 +66,8 @@ export function useI18nMeta(
keywords: resolveMetaValue(configValue.keywords, routeValue), keywords: resolveMetaValue(configValue.keywords, routeValue),
author: resolveMetaValue(configValue.author, routeValue), author: resolveMetaValue(configValue.author, routeValue),
canonical: resolveMetaValue(configValue.canonical, routeValue), canonical: resolveMetaValue(configValue.canonical, routeValue),
og: resolveI18nOgTwitter(resolveMetaValue(configValue.og, routeValue), currentLocale), og: resolveMetaValue(configValue.og, routeValue),
twitter: resolveI18nOgTwitter(resolveMetaValue(configValue.twitter, routeValue), currentLocale), twitter: resolveMetaValue(configValue.twitter, routeValue),
custom: resolveI18nCustomTags(resolveMetaValue(configValue.custom, routeValue), currentLocale), custom: resolveI18nCustomTags(resolveMetaValue(configValue.custom, routeValue), currentLocale),
} }
}) })
@ -135,28 +135,6 @@ function resolveI18nContent(
return content['en-US'] || Object.values(content)[0] return content['en-US'] || Object.values(content)[0]
} }
/**
* Resolves locale-aware title/description fields in og/twitter config objects.
* After resolution, title/description are plain strings compatible with MetaConfig.
*/
function resolveI18nOgTwitter(
config: I18nOpenGraphConfig | I18nTwitterCardConfig | undefined,
locale: LocaleId
): OpenGraphConfig | TwitterCardConfig | undefined {
if (!config) return config
const title = config.title
? typeof config.title === 'object'
? resolveI18nContent(config.title as LocaleAwareMeta, locale)
: config.title
: config.title
const description = config.description
? typeof config.description === 'object'
? resolveI18nContent(config.description as LocaleAwareMeta, locale)
: config.description
: config.description
return { ...config, title, description } as OpenGraphConfig | TwitterCardConfig
}
/** /**
* Resolves custom meta tags with i18n support * Resolves custom meta tags with i18n support
*/ */
@ -180,26 +158,14 @@ function resolveI18nCustomTags(
return customTags.map(tag => ({ return customTags.map(tag => ({
...tag, ...tag,
content: typeof tag.content === 'function' content: typeof tag.content === 'string' && typeof tag.content === 'object'
? '' ? resolveI18nContent(tag.content as any, currentLocale) || ''
: typeof tag.content === 'object' : typeof tag.content === 'function'
? resolveI18nContent(tag.content as any, currentLocale) || '' ? tag.content
: tag.content : tag.content
})) }))
} }
/** OpenGraph config with locale-aware title/description */
type I18nOpenGraphConfig = Omit<OpenGraphConfig, 'title' | 'description'> & {
title?: string | LocaleAwareMeta
description?: string | LocaleAwareMeta
}
/** Twitter Card config with locale-aware title/description */
type I18nTwitterCardConfig = Omit<TwitterCardConfig, 'title' | 'description'> & {
title?: string | LocaleAwareMeta
description?: string | LocaleAwareMeta
}
/** /**
* i18n-aware meta configuration interface * i18n-aware meta configuration interface
*/ */
@ -214,14 +180,12 @@ export interface I18nMetaConfig {
author?: string | ((route: any) => string) author?: string | ((route: any) => string)
/** Canonical URL */ /** Canonical URL */
canonical?: string | ((route: any) => string) canonical?: string | ((route: any) => string)
/** OpenGraph configuration (locale-aware title/description) */ /** OpenGraph configuration */
og?: I18nOpenGraphConfig | ((route: any) => I18nOpenGraphConfig) og?: MetaConfig['og']
/** Twitter Card configuration (locale-aware title/description) */ /** Twitter Card configuration */
twitter?: I18nTwitterCardConfig | ((route: any) => I18nTwitterCardConfig) twitter?: MetaConfig['twitter']
/** Custom meta tags */ /** Custom meta tags */
custom?: MetaConfig['custom'] custom?: MetaConfig['custom']
/** Robots meta directive (e.g. 'index, follow') */
robots?: string | ((route: any) => string)
/** Hreflang configuration for international SEO */ /** Hreflang configuration for international SEO */
hreflang?: { hreflang?: {
[locale: string]: string [locale: string]: string

View file

@ -33,8 +33,6 @@ export interface MetaConfig {
appendLocale?: boolean appendLocale?: boolean
/** Title template for formatting */ /** Title template for formatting */
titleTemplate?: (title: string) => string titleTemplate?: (title: string) => string
/** Robots meta directive (e.g. 'index, follow') */
robots?: string | ((route: RouteLocationNormalizedLoaded) => string)
} }
/** /**
@ -237,7 +235,7 @@ export function useMeta(
routeValue: RouteLocationNormalizedLoaded routeValue: RouteLocationNormalizedLoaded
): T | undefined => { ): T | undefined => {
if (value === undefined) return undefined if (value === undefined) return undefined
return typeof value === 'function' ? (value as Function)(routeValue) as T : value return typeof value === 'function' ? value(routeValue) : value
} }
/** /**

View file

@ -1,8 +1,7 @@
import { watch, onMounted, onUnmounted, type Ref, computed, unref } from 'vue' import { watch, onMounted, onUnmounted, type Ref, computed, unref } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useMeta } from './useMeta' import { useMeta } from './useMeta'
import type { RouteMeta } from 'vue-router' import type { RouteMeta, RouteMetaValue, isMetaFunction } from '../types/route-meta.d'
import type { RouteMetaValue } from '../types/route-meta'
/** /**
* Composable for automatic meta tag management based on route configuration * Composable for automatic meta tag management based on route configuration
@ -46,7 +45,7 @@ export function useRouteMeta() {
routeValue: typeof route routeValue: typeof route
): T | undefined => { ): T | undefined => {
if (value === undefined) return undefined if (value === undefined) return undefined
return typeof value === 'function' ? (value as Function)(routeValue) as T : value return typeof value === 'function' ? value(routeValue) : value
} }
/** /**

View file

@ -5,8 +5,7 @@
* in the Viossa application. * in the Viossa application.
*/ */
import type { MetaConfig } from '../composables/useMeta' import type { MetaConfig, I18nMetaConfig } from '../composables/useI18nMeta'
import type { I18nMetaConfig } from '../composables/useI18nMeta'
import { createRouteMeta } from '../composables/useMeta' import { createRouteMeta } from '../composables/useMeta'
/** /**

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { definePage } from 'unplugin-vue-router/runtime' import { definePage } from 'vue-router/auto-routes'
import { useAuth } from '../../composables/useAuth' import { useAuth } from '../../composables/useAuth'
import { usePreviewMode } from '../../composables/usePreviewMode' import { usePreviewMode } from '../../composables/usePreviewMode'
import PreviewModeToggle from '@/components/molecules/PreviewModeToggle.vue' import PreviewModeToggle from '@/components/molecules/PreviewModeToggle.vue'

View file

@ -116,4 +116,29 @@ export type RouteMetaValue<T> = T | ((route: RouteLocationNormalizedLoaded) => T
/** /**
* Helper function type for dynamic meta values * Helper function type for dynamic meta values
*/ */
export type MetaValueFunction<T> = (route: RouteLocationNormalizedLoaded) => T export type MetaValueFunction<T> = (route: RouteLocationNormalizedLoaded) => T
/**
* Type guard for checking if a meta value is a function
*/
export function isMetaFunction<T>(
value: RouteMetaValue<T>
): value is MetaValueFunction<T> {
return typeof value === 'function'
}
/**
* Type for route with extended meta
*/
export interface RouteWithMeta {
meta: RouteMeta
name?: string | symbol
path: string
}
/**
* Type for pages that support meta configuration
*/
export interface PageMetaConfig {
meta?: RouteMeta
}

View file

@ -60,21 +60,19 @@ export function generateDrupalNodeMeta(
} }
// Add sticky/promote as robots meta // Add sticky/promote as robots meta
if (meta.custom && Array.isArray(meta.custom)) { if (attributes.sticky || attributes.promote) {
if (attributes.sticky || attributes.promote) { meta.custom?.push({
meta.custom.push({ name: 'robots',
name: 'robots', content: 'index, follow',
content: 'index, follow', })
}) }
}
// Add status-based robots meta // Add status-based robots meta
if (!attributes.status) { if (!attributes.status) {
meta.custom.push({ meta.custom?.push({
name: 'robots', name: 'robots',
content: 'noindex, nofollow', content: 'noindex, nofollow',
}) })
}
} }
return meta return meta
@ -100,7 +98,7 @@ export function generateArticleContentMeta(
type: 'article', type: 'article',
}, },
custom: [ custom: [
...(Array.isArray(baseMeta.custom) ? baseMeta.custom : []), ...(baseMeta.custom || []),
// Article-specific meta tags // Article-specific meta tags
{ {
property: 'article:section', property: 'article:section',
@ -153,7 +151,7 @@ export function generateLearningResourceMeta(
type: 'article', type: 'article',
}, },
custom: [ custom: [
...(Array.isArray(baseMeta.custom) ? baseMeta.custom : []), ...(baseMeta.custom || []),
// Learning resource-specific meta tags // Learning resource-specific meta tags
{ {
name: 'resource-type', name: 'resource-type',

109
pnpm-lock.yaml generated
View file

@ -96,9 +96,6 @@ importers:
bulma: bulma:
specifier: ^1.0.4 specifier: ^1.0.4
version: 1.0.4 version: 1.0.4
pinia:
specifier: ^3.0.4
version: 3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3))
tailwindcss: tailwindcss:
specifier: ^4.1.6 specifier: ^4.1.6
version: 4.1.10 version: 4.1.10
@ -107,7 +104,7 @@ importers:
version: 11.1.5(vue@3.5.32(typescript@5.8.3)) version: 11.1.5(vue@3.5.32(typescript@5.8.3))
vue-router: vue-router:
specifier: ^5.0.4 specifier: ^5.0.4
version: 5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)) version: 5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.8.3))
devDependencies: devDependencies:
'@eslint/js': '@eslint/js':
specifier: ^9.39.2 specifier: ^9.39.2
@ -144,7 +141,7 @@ importers:
version: 8.55.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3) version: 8.55.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.8.3)
unplugin-vue-router: unplugin-vue-router:
specifier: ^0.19.2 specifier: ^0.19.2
version: 0.19.2(@vue/compiler-sfc@3.5.32)(vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)) version: 0.19.2(@vue/compiler-sfc@3.5.32)(vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3))
vite: vite:
specifier: ^6.3.5 specifier: ^6.3.5
version: 6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.2)(yaml@2.8.3) version: 6.3.5(@types/node@22.15.31)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(tsx@4.20.2)(yaml@2.8.3)
@ -943,21 +940,12 @@ packages:
'@vue/devtools-api@6.6.4': '@vue/devtools-api@6.6.4':
resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
'@vue/devtools-api@7.7.9':
resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==}
'@vue/devtools-api@8.1.1': '@vue/devtools-api@8.1.1':
resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==}
'@vue/devtools-kit@7.7.9':
resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==}
'@vue/devtools-kit@8.1.1': '@vue/devtools-kit@8.1.1':
resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==}
'@vue/devtools-shared@7.7.9':
resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==}
'@vue/devtools-shared@8.1.1': '@vue/devtools-shared@8.1.1':
resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==}
@ -1272,10 +1260,6 @@ packages:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
copy-anything@4.0.5:
resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
engines: {node: '>=18'}
cross-spawn@7.0.6: cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1670,18 +1654,16 @@ packages:
glob@10.4.5: glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true hasBin: true
glob@11.0.2: glob@11.0.2:
resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==}
engines: {node: 20 || >=22} engines: {node: 20 || >=22}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true hasBin: true
glob@7.2.3: glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me deprecated: Glob versions prior to v9 are no longer supported
globals@14.0.0: globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
@ -1855,10 +1837,6 @@ packages:
resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
is-what@5.5.0:
resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
engines: {node: '>=18'}
is-wsl@2.2.0: is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2109,9 +2087,6 @@ packages:
resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
mkdirp-classic@0.5.3: mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
@ -2268,9 +2243,6 @@ packages:
pathe@2.0.3: pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
perfect-debounce@2.1.0: perfect-debounce@2.1.0:
resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
@ -2289,15 +2261,6 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
pinia@3.0.4:
resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==}
peerDependencies:
typescript: '>=4.5.0'
vue: ^3.5.11
peerDependenciesMeta:
typescript:
optional: true
pkg-types@1.3.1: pkg-types@1.3.1:
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
@ -2410,9 +2373,6 @@ packages:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
rimraf@3.0.2: rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
deprecated: Rimraf versions prior to v4 are no longer supported deprecated: Rimraf versions prior to v4 are no longer supported
@ -2535,10 +2495,6 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
sql-highlight@6.1.0: sql-highlight@6.1.0:
resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -2585,10 +2541,6 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'} engines: {node: '>=8'}
superjson@2.2.6:
resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
engines: {node: '>=16'}
supports-color@7.2.0: supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2610,12 +2562,12 @@ packages:
tar@6.2.1: tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'} engines: {node: '>=10'}
deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me
tar@7.4.3: tar@7.4.3:
resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==}
engines: {node: '>=18'} engines: {node: '>=18'}
deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me
tinyglobby@0.2.14: tinyglobby@0.2.14:
resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
@ -2824,7 +2776,6 @@ packages:
uuid@9.0.1: uuid@9.0.1:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
hasBin: true hasBin: true
vary@1.1.2: vary@1.1.2:
@ -3684,24 +3635,10 @@ snapshots:
'@vue/devtools-api@6.6.4': {} '@vue/devtools-api@6.6.4': {}
'@vue/devtools-api@7.7.9':
dependencies:
'@vue/devtools-kit': 7.7.9
'@vue/devtools-api@8.1.1': '@vue/devtools-api@8.1.1':
dependencies: dependencies:
'@vue/devtools-kit': 8.1.1 '@vue/devtools-kit': 8.1.1
'@vue/devtools-kit@7.7.9':
dependencies:
'@vue/devtools-shared': 7.7.9
birpc: 2.9.0
hookable: 5.5.3
mitt: 3.0.1
perfect-debounce: 1.0.0
speakingurl: 14.0.1
superjson: 2.2.6
'@vue/devtools-kit@8.1.1': '@vue/devtools-kit@8.1.1':
dependencies: dependencies:
'@vue/devtools-shared': 8.1.1 '@vue/devtools-shared': 8.1.1
@ -3709,10 +3646,6 @@ snapshots:
hookable: 5.5.3 hookable: 5.5.3
perfect-debounce: 2.1.0 perfect-debounce: 2.1.0
'@vue/devtools-shared@7.7.9':
dependencies:
rfdc: 1.4.1
'@vue/devtools-shared@8.1.1': {} '@vue/devtools-shared@8.1.1': {}
'@vue/language-core@3.2.6': '@vue/language-core@3.2.6':
@ -4056,10 +3989,6 @@ snapshots:
cookie@0.7.2: {} cookie@0.7.2: {}
copy-anything@4.0.5:
dependencies:
is-what: 5.5.0
cross-spawn@7.0.6: cross-spawn@7.0.6:
dependencies: dependencies:
path-key: 3.1.1 path-key: 3.1.1
@ -4693,8 +4622,6 @@ snapshots:
dependencies: dependencies:
which-typed-array: 1.1.19 which-typed-array: 1.1.19
is-what@5.5.0: {}
is-wsl@2.2.0: is-wsl@2.2.0:
dependencies: dependencies:
is-docker: 2.2.1 is-docker: 2.2.1
@ -4940,8 +4867,6 @@ snapshots:
dependencies: dependencies:
minipass: 7.1.2 minipass: 7.1.2
mitt@3.0.1: {}
mkdirp-classic@0.5.3: {} mkdirp-classic@0.5.3: {}
mkdirp@1.0.4: {} mkdirp@1.0.4: {}
@ -5092,8 +5017,6 @@ snapshots:
pathe@2.0.3: {} pathe@2.0.3: {}
perfect-debounce@1.0.0: {}
perfect-debounce@2.1.0: {} perfect-debounce@2.1.0: {}
picocolors@1.1.1: {} picocolors@1.1.1: {}
@ -5105,13 +5028,6 @@ snapshots:
picomatch@4.0.3: {} picomatch@4.0.3: {}
pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)):
dependencies:
'@vue/devtools-api': 7.7.9
vue: 3.5.32(typescript@5.8.3)
optionalDependencies:
typescript: 5.8.3
pkg-types@1.3.1: pkg-types@1.3.1:
dependencies: dependencies:
confbox: 0.1.8 confbox: 0.1.8
@ -5228,8 +5144,6 @@ snapshots:
retry@0.12.0: retry@0.12.0:
optional: true optional: true
rfdc@1.4.1: {}
rimraf@3.0.2: rimraf@3.0.2:
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
@ -5408,8 +5322,6 @@ snapshots:
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
speakingurl@14.0.1: {}
sql-highlight@6.1.0: {} sql-highlight@6.1.0: {}
sqlite3@5.1.7: sqlite3@5.1.7:
@ -5461,10 +5373,6 @@ snapshots:
strip-json-comments@3.1.1: {} strip-json-comments@3.1.1: {}
superjson@2.2.6:
dependencies:
copy-anything: 4.0.5
supports-color@7.2.0: supports-color@7.2.0:
dependencies: dependencies:
has-flag: 4.0.0 has-flag: 4.0.0
@ -5649,7 +5557,7 @@ snapshots:
pathe: 2.0.3 pathe: 2.0.3
picomatch: 4.0.3 picomatch: 4.0.3
unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.32)(vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)): unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.32)(vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)):
dependencies: dependencies:
'@babel/generator': 7.29.1 '@babel/generator': 7.29.1
'@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.8.3)) '@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.8.3))
@ -5670,7 +5578,7 @@ snapshots:
unplugin-utils: 0.3.1 unplugin-utils: 0.3.1
yaml: 2.8.3 yaml: 2.8.3
optionalDependencies: optionalDependencies:
vue-router: 5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)) vue-router: 5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.8.3))
transitivePeerDependencies: transitivePeerDependencies:
- vue - vue
@ -5739,7 +5647,7 @@ snapshots:
'@vue/devtools-api': 6.6.4 '@vue/devtools-api': 6.6.4
vue: 3.5.32(typescript@5.8.3) vue: 3.5.32(typescript@5.8.3)
vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3)))(vue@3.5.32(typescript@5.8.3)): vue-router@5.0.4(@vue/compiler-sfc@3.5.32)(vue@3.5.32(typescript@5.8.3)):
dependencies: dependencies:
'@babel/generator': 7.29.1 '@babel/generator': 7.29.1
'@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.8.3)) '@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.8.3))
@ -5761,7 +5669,6 @@ snapshots:
yaml: 2.8.3 yaml: 2.8.3
optionalDependencies: optionalDependencies:
'@vue/compiler-sfc': 3.5.32 '@vue/compiler-sfc': 3.5.32
pinia: 3.0.4(typescript@5.8.3)(vue@3.5.32(typescript@5.8.3))
vue-tsc@3.2.6(typescript@5.8.3): vue-tsc@3.2.6(typescript@5.8.3):
dependencies: dependencies: