From ea0a21670cc01a3824390426f922ef8f39766f02 Mon Sep 17 00:00:00 2001
From: Patrick-Ehimen <0xosepatrick@gmail.com>
Date: Wed, 20 Aug 2025 15:10:41 +0100
Subject: [PATCH 1/2] feat: add comprehensive testing infrastructure
---
e2e/blog.spec.ts | 295 +++++++
e2e/error-handling.spec.ts | 237 ++++++
e2e/homepage.spec.ts | 149 ++++
package.json | 14 +-
playwright.config.ts | 63 ++
pnpm-lock.yaml | 975 +++++++++++++++-------
server/api/blog.ts | 18 +-
tests/components/Blog/Card.test.ts | 262 ++++++
tests/components/Blog/Cell.test.ts | 339 ++++++++
tests/error.test.ts | 592 +++++++++++++
tests/server/api/blog.integration.test.ts | 313 +++++++
tests/server/api/blog.test.ts | 308 +++++++
tests/setup.ts | 19 +
vitest.config.ts | 59 ++
14 files changed, 3353 insertions(+), 290 deletions(-)
create mode 100644 e2e/blog.spec.ts
create mode 100644 e2e/error-handling.spec.ts
create mode 100644 e2e/homepage.spec.ts
create mode 100644 playwright.config.ts
create mode 100644 tests/components/Blog/Card.test.ts
create mode 100644 tests/components/Blog/Cell.test.ts
create mode 100644 tests/error.test.ts
create mode 100644 tests/server/api/blog.integration.test.ts
create mode 100644 tests/server/api/blog.test.ts
create mode 100644 tests/setup.ts
create mode 100644 vitest.config.ts
diff --git a/e2e/blog.spec.ts b/e2e/blog.spec.ts
new file mode 100644
index 00000000..66ff5338
--- /dev/null
+++ b/e2e/blog.spec.ts
@@ -0,0 +1,295 @@
+import { test, expect } from '@playwright/test'
+
+test.describe('Blog Functionality', () => {
+ test('should load blog page successfully', async ({ page }) => {
+ await page.goto('/blog')
+
+ // Check that the page loads
+ await expect(page).toHaveTitle(/Blog|Storacha/)
+
+ // Check for main content
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ })
+
+ test('should display blog posts when available', async ({ page }) => {
+ await page.goto('/blog')
+
+ // Wait for API call to complete
+ await page.waitForTimeout(3000)
+
+ // Look for blog post elements
+ const blogPosts = page.locator('[class*="blog"], article, .post')
+
+ // Either posts are displayed or there's an empty state
+ const postsCount = await blogPosts.count()
+
+ if (postsCount > 0) {
+ // If posts exist, verify they have required elements
+ await expect(blogPosts.first()).toBeVisible()
+
+ // Check for typical blog post elements
+ await expect(page.locator('h1, h2, h3').first()).toBeVisible()
+ } else {
+ // If no posts, should still show the page structure
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ }
+ })
+
+ test('should handle blog API errors gracefully', async ({ page }) => {
+ // Intercept the blog API call and return an error
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 500,
+ contentType: 'application/json',
+ body: JSON.stringify({ error: 'Internal Server Error' })
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for the page to handle the error
+ await page.waitForTimeout(2000)
+
+ // Page should still be usable
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+
+ // Should not show error messages to users (graceful degradation)
+ const errorMessages = page.locator('text=error, text=Error, text=ERROR')
+ expect(await errorMessages.count()).toBe(0)
+ })
+
+ test('should handle empty blog feed gracefully', async ({ page }) => {
+ // Intercept the blog API call and return empty data
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify({ items: [] })
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for the page to load
+ await page.waitForTimeout(2000)
+
+ // Page should still be visible
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ })
+
+ test('should display blog posts with proper structure', async ({ page }) => {
+ // Mock successful blog API response
+ const mockBlogData = {
+ items: [
+ {
+ title: 'Test Blog Post 1',
+ snippet: 'This is a test blog post snippet with some content.',
+ link: 'https://example.com/post1',
+ pubDate: '2023-01-01T00:00:00Z',
+ isoDate: '2023-01-01T00:00:00Z',
+ images: ['https://example.com/image1.jpg']
+ },
+ {
+ title: 'Test Blog Post 2',
+ snippet: 'This is another test blog post snippet.',
+ link: 'https://example.com/post2',
+ pubDate: '2023-01-02T00:00:00Z',
+ isoDate: '2023-01-02T00:00:00Z',
+ images: []
+ }
+ ]
+ }
+
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify(mockBlogData)
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Check that blog posts are displayed
+ await expect(page.locator('text=Test Blog Post 1')).toBeVisible()
+ await expect(page.locator('text=Test Blog Post 2')).toBeVisible()
+ })
+
+ test('should have working links to individual blog posts', async ({ page }) => {
+ // Mock blog data with external links
+ const mockBlogData = {
+ items: [
+ {
+ title: 'External Blog Post',
+ snippet: 'This links to an external blog.',
+ link: 'https://medium.com/@storacha/external-post',
+ pubDate: '2023-01-01T00:00:00Z',
+ isoDate: '2023-01-01T00:00:00Z',
+ images: []
+ }
+ ]
+ }
+
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify(mockBlogData)
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Look for links to blog posts
+ const blogLinks = page.locator('a[href*="medium.com"], a[href*="blog"]')
+
+ if (await blogLinks.first().isVisible()) {
+ // External blog links should open in new tab
+ await expect(blogLinks.first()).toHaveAttribute('target', '_blank')
+ }
+ })
+
+ test('should display blog images when available', async ({ page }) => {
+ // Mock blog data with images
+ const mockBlogData = {
+ items: [
+ {
+ title: 'Blog Post with Image',
+ snippet: 'This post has an image.',
+ link: 'https://example.com/post-with-image',
+ pubDate: '2023-01-01T00:00:00Z',
+ isoDate: '2023-01-01T00:00:00Z',
+ images: ['https://example.com/test-image.jpg']
+ }
+ ]
+ }
+
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify(mockBlogData)
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Check for images in blog posts
+ const blogImages = page.locator('img[src*="test-image"]')
+
+ if (await blogImages.first().isVisible()) {
+ await expect(blogImages.first()).toHaveAttribute('alt')
+ await expect(blogImages.first()).toHaveAttribute('loading', 'lazy')
+ }
+ })
+
+ test('should handle missing blog images gracefully', async ({ page }) => {
+ // Mock blog data without images
+ const mockBlogData = {
+ items: [
+ {
+ title: 'Blog Post without Image',
+ snippet: 'This post has no image.',
+ link: 'https://example.com/post-no-image',
+ pubDate: '2023-01-01T00:00:00Z',
+ isoDate: '2023-01-01T00:00:00Z',
+ images: []
+ }
+ ]
+ }
+
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify(mockBlogData)
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Page should still display the post
+ await expect(page.locator('text=Blog Post without Image')).toBeVisible()
+ })
+
+ test('should display proper publication dates', async ({ page }) => {
+ const mockBlogData = {
+ items: [
+ {
+ title: 'Recent Blog Post',
+ snippet: 'Recent content.',
+ link: 'https://example.com/recent',
+ pubDate: '2023-12-01T00:00:00Z',
+ isoDate: '2023-12-01T00:00:00Z',
+ images: []
+ }
+ ]
+ }
+
+ await page.route('/api/blog', (route) => {
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify(mockBlogData)
+ })
+ })
+
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Look for time elements or date displays
+ const timeElements = page.locator('time, [datetime]')
+
+ if (await timeElements.first().isVisible()) {
+ // Check that time element has proper datetime attribute
+ await expect(timeElements.first()).toHaveAttribute('datetime')
+ }
+ })
+
+ test('should be responsive on mobile devices', async ({ page, isMobile }) => {
+ await page.goto('/blog')
+
+ // Wait for content to load
+ await page.waitForTimeout(2000)
+
+ // Check that content is visible on mobile
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+
+ if (isMobile) {
+ // Check that mobile layout is applied
+ const viewport = page.viewportSize()
+ expect(viewport?.width).toBeLessThan(768)
+
+ // Content should still be readable
+ await expect(page.locator('h1, h2, h3').first()).toBeVisible()
+ }
+ })
+
+ test('should have proper SEO for blog page', async ({ page }) => {
+ await page.goto('/blog')
+
+ // Check for blog-specific SEO
+ await expect(page).toHaveTitle(/Blog|Storacha/)
+
+ // Check for meta description
+ await expect(page.locator('meta[name="description"]')).toHaveCount(1)
+
+ // Check for Open Graph tags
+ await expect(page.locator('meta[property="og:title"]')).toHaveCount(1)
+ await expect(page.locator('meta[property="og:type"]')).toHaveCount(1)
+ })
+})
diff --git a/e2e/error-handling.spec.ts b/e2e/error-handling.spec.ts
new file mode 100644
index 00000000..d2d3f47a
--- /dev/null
+++ b/e2e/error-handling.spec.ts
@@ -0,0 +1,237 @@
+import { test, expect } from '@playwright/test'
+
+test.describe('Error Page Handling', () => {
+ test('should display custom 404 page for non-existent routes', async ({ page }) => {
+ await page.goto('/non-existent-page-12345')
+
+ // Should show custom error page, not browser default
+ await expect(page.locator('body')).toBeVisible()
+
+ // Look for custom 404 content
+ await expect(page.locator('text=404, text="Page Not Found", text="not found"')).toBeVisible()
+
+ // Should have navigation options
+ const homeLink = page.locator('a[href="/"], button:has-text("Home"), button:has-text("Homepage")')
+ await expect(homeLink.first()).toBeVisible()
+ })
+
+ test('should handle 404 errors gracefully with proper layout', async ({ page }) => {
+ await page.goto('/this-page-definitely-does-not-exist')
+
+ // Page should still have the site layout
+ await expect(page.locator('nav, header')).toBeVisible()
+
+ // Should have footer as well
+ await expect(page.locator('footer')).toBeVisible()
+
+ // Error content should be in main area
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ })
+
+ test('should provide working navigation from error page', async ({ page }) => {
+ await page.goto('/invalid-route')
+
+ // Wait for error page to load
+ await page.waitForTimeout(1000)
+
+ // Click home/back button if available
+ const homeButton = page.locator('button:has-text("Home"), a:has-text("Home"), button:has-text("Homepage")')
+
+ if (await homeButton.first().isVisible()) {
+ await homeButton.first().click()
+
+ // Should navigate back to homepage
+ await expect(page).toHaveURL('/')
+ }
+ })
+
+ test('should show retry button for appropriate errors', async ({ page }) => {
+ // Mock a server error response
+ await page.route('**/*', (route) => {
+ if (route.request().url().includes('/api/')) {
+ route.fulfill({
+ status: 500,
+ contentType: 'application/json',
+ body: JSON.stringify({ error: 'Server Error' })
+ })
+ } else {
+ route.continue()
+ }
+ })
+
+ await page.goto('/blog')
+
+ // Wait for potential error handling
+ await page.waitForTimeout(3000)
+
+ // Look for retry functionality (this depends on implementation)
+ const retryButton = page.locator('button:has-text("Retry"), button:has-text("Try Again")')
+
+ if (await retryButton.isVisible()) {
+ await expect(retryButton).toBeVisible()
+ }
+ })
+
+ test('should display appropriate error messages for different status codes', async ({ page }) => {
+ // Test different error scenarios by navigating to likely error-producing routes
+ const errorRoutes = [
+ '/admin/secret-area', // Likely 403
+ '/api/nonexistent', // Likely 404
+ '/very/deep/nested/route/that/does/not/exist' // Likely 404
+ ]
+
+ for (const route of errorRoutes) {
+ await page.goto(route)
+
+ // Wait for error page
+ await page.waitForTimeout(1000)
+
+ // Should show some kind of error message
+ const errorContent = page.locator('main, [role="main"]')
+ await expect(errorContent).toBeVisible()
+
+ // Should not show raw error details to users
+ const technicalErrors = page.locator('text=stack trace, text=internal error, text=exception')
+ expect(await technicalErrors.count()).toBe(0)
+ }
+ })
+
+ test('should have proper SEO handling for error pages', async ({ page }) => {
+ await page.goto('/nonexistent-seo-test')
+
+ // Error pages should have proper SEO
+ await expect(page).toHaveTitle(/404|Error|Not Found/)
+
+ // Should have meta description
+ const metaDescription = page.locator('meta[name="description"]')
+ await expect(metaDescription).toHaveCount(1)
+
+ // Should have robots noindex to prevent indexing error pages
+ const robotsMeta = page.locator('meta[name="robots"]')
+ if (await robotsMeta.count() > 0) {
+ const robotsContent = await robotsMeta.getAttribute('content')
+ expect(robotsContent).toContain('noindex')
+ }
+ })
+
+ test('should handle JavaScript errors gracefully', async ({ page }) => {
+ const jsErrors: string[] = []
+
+ page.on('pageerror', (error) => {
+ jsErrors.push(error.message)
+ })
+
+ // Navigate to a page and inject a JavaScript error
+ await page.goto('/')
+
+ await page.evaluate(() => {
+ // Intentionally cause a JS error
+ throw new Error('Test JavaScript Error')
+ })
+
+ // Wait a moment for error handling
+ await page.waitForTimeout(1000)
+
+ // Page should still be functional despite JS error
+ await expect(page.locator('body')).toBeVisible()
+ await expect(page.locator('nav, header')).toBeVisible()
+ })
+
+ test('should provide helpful error context without exposing technical details', async ({ page }) => {
+ await page.goto('/missing-page-test')
+
+ // Should show user-friendly error message
+ const friendlyMessages = page.locator('text="page not found", text="doesn\'t exist", text="can\'t find"')
+ await expect(friendlyMessages.first()).toBeVisible()
+
+ // Should not expose technical details
+ const technicalDetails = page.locator('text=stack, text=trace, text=internal, text=exception, text=debug')
+ expect(await technicalDetails.count()).toBe(0)
+ })
+
+ test('should handle network errors gracefully', async ({ page }) => {
+ // Simulate network failure for API calls
+ await page.route('/api/**', (route) => {
+ route.abort('failed')
+ })
+
+ await page.goto('/blog')
+
+ // Wait for network requests to fail
+ await page.waitForTimeout(3000)
+
+ // Page should still be usable
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+
+ // Should not show technical network error details
+ const networkErrors = page.locator('text=network error, text=connection failed, text=timeout')
+ expect(await networkErrors.count()).toBe(0)
+ })
+
+ test('should maintain accessibility on error pages', async ({ page }) => {
+ await page.goto('/accessibility-error-test')
+
+ // Error page should have proper heading structure
+ const headings = page.locator('h1, h2, h3, h4, h5, h6')
+ await expect(headings.first()).toBeVisible()
+
+ // Should have proper focus management
+ const focusableElements = page.locator('button, a, input, [tabindex="0"]')
+ await expect(focusableElements.first()).toBeVisible()
+
+ // Navigation should still work with keyboard
+ await page.keyboard.press('Tab')
+ // Check that focus moves to a focusable element
+ })
+
+ test('should handle error page on mobile devices', async ({ page, isMobile }) => {
+ await page.goto('/mobile-error-test')
+
+ if (isMobile) {
+ // Error page should be responsive
+ const viewport = page.viewportSize()
+ expect(viewport?.width).toBeLessThan(768)
+
+ // Content should still be readable
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+
+ // Buttons should be touch-friendly
+ const buttons = page.locator('button, a')
+ if (await buttons.first().isVisible()) {
+ const buttonBox = await buttons.first().boundingBox()
+ expect(buttonBox?.height).toBeGreaterThan(40) // Minimum touch target size
+ }
+ }
+ })
+
+ test('should automatically retry for server errors when appropriate', async ({ page }) => {
+ let requestCount = 0
+
+ await page.route('/api/**', (route) => {
+ requestCount++
+ if (requestCount === 1) {
+ // Fail first request
+ route.fulfill({
+ status: 503,
+ contentType: 'application/json',
+ body: JSON.stringify({ error: 'Service Unavailable' })
+ })
+ } else {
+ // Succeed on retry
+ route.fulfill({
+ status: 200,
+ contentType: 'application/json',
+ body: JSON.stringify({ items: [] })
+ })
+ }
+ })
+
+ await page.goto('/blog')
+
+ // Wait for initial request and potential retry
+ await page.waitForTimeout(6000)
+
+ // Should have made multiple requests (original + retry)
+ expect(requestCount).toBeGreaterThan(1)
+ })
+})
diff --git a/e2e/homepage.spec.ts b/e2e/homepage.spec.ts
new file mode 100644
index 00000000..21a92b5d
--- /dev/null
+++ b/e2e/homepage.spec.ts
@@ -0,0 +1,149 @@
+import { test, expect } from '@playwright/test'
+
+test.describe('Homepage Navigation', () => {
+ test('should load homepage successfully', async ({ page }) => {
+ await page.goto('/')
+
+ // Check that the page loads and has expected content
+ await expect(page).toHaveTitle(/Storacha/)
+
+ // Look for main navigation elements
+ await expect(page.locator('nav')).toBeVisible()
+
+ // Check for main content areas
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ })
+
+ test('should display navigation menu', async ({ page }) => {
+ await page.goto('/')
+
+ // Look for main navigation links
+ await expect(page.locator('a[href="/blog"]')).toBeVisible()
+ await expect(page.locator('a[href="/ecosystem"]')).toBeVisible()
+ await expect(page.locator('a[href="/roadmap"]')).toBeVisible()
+ })
+
+ test('should navigate to blog page', async ({ page }) => {
+ await page.goto('/')
+
+ // Click on blog navigation link
+ await page.click('a[href="/blog"]')
+
+ // Wait for navigation and check URL
+ await expect(page).toHaveURL(/\/blog/)
+
+ // Check that blog page content is visible
+ await expect(page.locator('h1, h2')).toBeVisible()
+ })
+
+ test('should navigate to ecosystem page', async ({ page }) => {
+ await page.goto('/')
+
+ // Click on ecosystem navigation link
+ await page.click('a[href="/ecosystem"]')
+
+ // Wait for navigation and check URL
+ await expect(page).toHaveURL(/\/ecosystem/)
+
+ // Check that ecosystem page content is visible
+ await expect(page.locator('h1, h2')).toBeVisible()
+ })
+
+ test('should have working footer links', async ({ page }) => {
+ await page.goto('/')
+
+ // Scroll to footer
+ await page.locator('footer').scrollIntoViewIfNeeded()
+
+ // Check footer is visible
+ await expect(page.locator('footer')).toBeVisible()
+
+ // Look for common footer elements
+ const footerLinks = page.locator('footer a')
+ await expect(footerLinks.first()).toBeVisible()
+ })
+
+ test('should be responsive on mobile', async ({ page, isMobile }) => {
+ await page.goto('/')
+
+ if (isMobile) {
+ // Check that mobile navigation works
+ const mobileMenuButton = page.locator('button[aria-label*="menu"], button[aria-expanded]')
+
+ if (await mobileMenuButton.isVisible()) {
+ await mobileMenuButton.click()
+
+ // Check that mobile menu opens
+ await expect(page.locator('nav [role="menu"], nav .menu')).toBeVisible()
+ }
+ }
+
+ // Check that main content is visible regardless of device
+ await expect(page.locator('main, [role="main"]')).toBeVisible()
+ })
+
+ test('should have proper SEO meta tags', async ({ page }) => {
+ await page.goto('/')
+
+ // Check for essential SEO meta tags
+ await expect(page.locator('meta[name="description"]')).toHaveCount(1)
+ await expect(page.locator('meta[property="og:title"]')).toHaveCount(1)
+ await expect(page.locator('meta[property="og:description"]')).toHaveCount(1)
+ await expect(page.locator('meta[name="twitter:card"]')).toHaveCount(1)
+ })
+
+ test('should have working search functionality if present', async ({ page }) => {
+ await page.goto('/')
+
+ // Look for search input
+ const searchInput = page.locator('input[type="search"], input[placeholder*="search" i]')
+
+ if (await searchInput.isVisible()) {
+ await searchInput.fill('test search')
+ await searchInput.press('Enter')
+
+ // Check that search results or search page loads
+ await page.waitForTimeout(1000)
+ // This is a basic check - specific implementation would depend on search functionality
+ }
+ })
+
+ test('should handle external links correctly', async ({ page }) => {
+ await page.goto('/')
+
+ // Look for external links (those that should open in new tab)
+ const externalLinks = page.locator('a[target="_blank"], a[href^="http"]:not([href*="storacha.network"])')
+
+ if (await externalLinks.first().isVisible()) {
+ const firstExternalLink = externalLinks.first()
+
+ // Check that external links have proper attributes
+ await expect(firstExternalLink).toHaveAttribute('target', '_blank')
+ await expect(firstExternalLink).toHaveAttribute('rel', /noopener/)
+ }
+ })
+
+ test('should load without JavaScript errors', async ({ page }) => {
+ const consoleErrors: string[] = []
+
+ page.on('console', (message) => {
+ if (message.type() === 'error') {
+ consoleErrors.push(message.text())
+ }
+ })
+
+ await page.goto('/')
+
+ // Wait a moment for any lazy-loaded content
+ await page.waitForTimeout(2000)
+
+ // Check that there are no critical JavaScript errors
+ const criticalErrors = consoleErrors.filter(error =>
+ !error.includes('favicon') && // Ignore favicon errors
+ !error.includes('analytics') && // Ignore analytics errors
+ !error.includes('tracking') // Ignore tracking errors
+ )
+
+ expect(criticalErrors).toHaveLength(0)
+ })
+})
diff --git a/package.json b/package.json
index 6a844122..d7957071 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,13 @@
"lint:fix": "eslint . --fix",
"typecheck": "vue-tsc --noEmit",
"clean": "nuxi cleanup --force && pnpm i --force",
- "release": "pnpx bumpp --commit --push --tag"
+ "release": "pnpx bumpp --commit --push --tag",
+ "test": "vitest",
+ "test:ui": "vitest --ui",
+ "test:coverage": "vitest --coverage",
+ "test:run": "vitest run",
+ "test:e2e": "playwright test",
+ "test:all": "pnpm test:run && pnpm test:e2e"
},
"dependencies": {
"@iconify-json/carbon": "^1.2.4",
@@ -41,10 +47,16 @@
"devDependencies": {
"@antfu/eslint-config": "^3.8.0",
"@nuxt/eslint": "^1.4.1",
+ "@nuxt/test-utils": "^3.19.2",
+ "@playwright/test": "^1.54.2",
"@unocss/eslint-config": "^0.63.6",
+ "@vitest/ui": "^3.2.4",
+ "@vue/test-utils": "^2.4.6",
"eslint": "^9.13.0",
+ "happy-dom": "^18.0.1",
"nuxt": "^3.17.5",
"typescript": "^5.6.3",
+ "vitest": "^3.2.4",
"vue-tsc": "^2.1.10",
"wrangler": "^3.84.1"
},
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 00000000..109b0b33
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,63 @@
+import { defineConfig, devices } from '@playwright/test'
+
+export default defineConfig({
+ testDir: './e2e',
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: [
+ ['html'],
+ ['line'],
+ ['json', { outputFile: 'playwright-report/results.json' }]
+ ],
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: 'http://localhost:3000',
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: 'on-first-retry',
+ /* Take screenshot on failure */
+ screenshot: 'only-on-failure',
+ /* Record video on failure */
+ video: 'retain-on-failure'
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+ {
+ name: 'firefox',
+ use: { ...devices['Desktop Firefox'] },
+ },
+ {
+ name: 'webkit',
+ use: { ...devices['Desktop Safari'] },
+ },
+ /* Test against mobile viewports. */
+ {
+ name: 'Mobile Chrome',
+ use: { ...devices['Pixel 5'] },
+ },
+ {
+ name: 'Mobile Safari',
+ use: { ...devices['iPhone 12'] },
+ },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: 'pnpm dev',
+ url: 'http://localhost:3000',
+ reuseExistingServer: !process.env.CI,
+ timeout: 120 * 1000,
+ },
+})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6ad29351..8c6a3f5b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -19,13 +19,13 @@ importers:
version: 2.2.351
'@nuxt/devtools':
specifier: ^1.6.0
- version: 1.6.0(rollup@4.44.0)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3)
+ version: 1.6.0(rollup@4.44.0)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3)
'@nuxt/image':
specifier: ^1.10.0
version: 1.10.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)
'@nuxt/scripts':
specifier: ^0.11.8
- version: 0.11.8(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))
+ version: 0.11.8(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3))
'@nuxtjs/fontaine':
specifier: ^0.5.0
version: 0.5.0(magicast@0.3.5)(webpack-sources@3.3.3)
@@ -34,22 +34,22 @@ importers:
version: 1.2.0(magicast@0.3.5)
'@nuxtjs/seo':
specifier: ^3.0.3
- version: 3.0.3(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(h3@1.15.3)(ioredis@5.6.1)(magicast@0.3.5)(rollup@4.44.0)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3)
+ version: 3.0.3(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(h3@1.15.3)(ioredis@5.6.1)(magicast@0.3.5)(rollup@4.44.0)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3)
'@unhead/vue':
specifier: ^2.0.10
- version: 2.0.10(vue@3.5.12(typescript@5.6.3))
+ version: 2.0.10(vue@3.5.17(typescript@5.6.3))
'@unocss/nuxt':
specifier: ^66.2.3
- version: 66.2.3(magicast@0.3.5)(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack@5.96.1(esbuild@0.17.19))
+ version: 66.2.3(magicast@0.3.5)(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack@5.96.1(esbuild@0.17.19))
'@unocss/preset-icons':
specifier: ^0.63.6
version: 0.63.6
'@vueuse/core':
specifier: ^11.2.0
- version: 11.2.0(vue@3.5.12(typescript@5.6.3))
+ version: 11.2.0(vue@3.5.17(typescript@5.6.3))
'@vueuse/nuxt':
specifier: ^13.4.0
- version: 13.4.0(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ version: 13.4.0(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
defu:
specifier: ^6.1.4
version: 6.1.4
@@ -58,29 +58,47 @@ importers:
version: 4.5.0
radix-vue:
specifier: ^1.9.8
- version: 1.9.8(vue@3.5.12(typescript@5.6.3))
+ version: 1.9.8(vue@3.5.17(typescript@5.6.3))
unocss:
specifier: ^0.63.6
version: 0.63.6(@unocss/webpack@66.2.3(webpack@5.96.1(esbuild@0.17.19)))(postcss@8.5.6)(rollup@4.44.0)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
devDependencies:
'@antfu/eslint-config':
specifier: ^3.8.0
- version: 3.8.0(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@vue/compiler-sfc@3.5.17)(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
+ version: 3.8.0(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@vue/compiler-sfc@3.5.17)(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)(vitest@3.2.4)
'@nuxt/eslint':
specifier: ^1.4.1
version: 1.4.1(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@vue/compiler-sfc@3.5.17)(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@2.4.2))(magicast@0.3.5)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
+ '@nuxt/test-utils':
+ specifier: ^3.19.2
+ version: 3.19.2(@playwright/test@1.54.2)(@vitest/ui@3.2.4)(@vue/test-utils@2.4.6)(happy-dom@18.0.1)(magicast@0.3.5)(playwright-core@1.54.2)(typescript@5.6.3)(vitest@3.2.4)
+ '@playwright/test':
+ specifier: ^1.54.2
+ version: 1.54.2
'@unocss/eslint-config':
specifier: ^0.63.6
version: 0.63.6(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
+ '@vitest/ui':
+ specifier: ^3.2.4
+ version: 3.2.4(vitest@3.2.4)
+ '@vue/test-utils':
+ specifier: ^2.4.6
+ version: 2.4.6
eslint:
specifier: ^9.13.0
version: 9.13.0(jiti@2.4.2)
+ happy-dom:
+ specifier: ^18.0.1
+ version: 18.0.1
nuxt:
specifier: ^3.17.5
version: 3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0)
typescript:
specifier: ^5.6.3
version: 5.6.3
+ vitest:
+ specifier: ^3.2.4
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
vue-tsc:
specifier: ^2.1.10
version: 2.1.10(typescript@5.6.3)
@@ -1309,6 +1327,42 @@ packages:
engines: {node: '>=18.12.0'}
hasBin: true
+ '@nuxt/test-utils@3.19.2':
+ resolution: {integrity: sha512-jvpCbTNd1e8t2vrGAMpVq8j7N25Jao0NpblRiIYwogXgNXOPrH1XBZxgufyLA701g64SeiplUe+pddtnJnQu/g==}
+ engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ peerDependencies:
+ '@cucumber/cucumber': ^10.3.1 || ^11.0.0
+ '@jest/globals': ^29.5.0 || ^30.0.0
+ '@playwright/test': ^1.43.1
+ '@testing-library/vue': ^7.0.0 || ^8.0.1
+ '@vitest/ui': '*'
+ '@vue/test-utils': ^2.4.2
+ happy-dom: ^9.10.9 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ jsdom: ^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0
+ playwright-core: ^1.43.1
+ vitest: ^3.2.0
+ peerDependenciesMeta:
+ '@cucumber/cucumber':
+ optional: true
+ '@jest/globals':
+ optional: true
+ '@playwright/test':
+ optional: true
+ '@testing-library/vue':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ '@vue/test-utils':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ playwright-core:
+ optional: true
+ vitest:
+ optional: true
+
'@nuxt/vite-builder@3.17.5':
resolution: {integrity: sha512-SKlm73FuuPj1ZdVJ1JQfUed/lO5l7iJMbM+9K+CMXnifu7vV2ITaSxu8uZ/ice1FeLYwOZKEsjnJXB0QpqDArQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0}
@@ -1331,6 +1385,9 @@ packages:
resolution: {integrity: sha512-KtJYb8xbsObzDdbide336YMAAa4SsXhd4h+QmvZH4mkcByZadHseICD/A8WsAsOfg/YlQ/EcsMFEI0NAQWDj4g==}
engines: {node: '>=18.0.0'}
+ '@one-ini/wasm@0.1.1':
+ resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+
'@oxc-parser/binding-darwin-arm64@0.72.3':
resolution: {integrity: sha512-g6wgcfL7At4wHNHutl0NmPZTAju+cUSmSX5WGUMyTJmozRzhx8E9a2KL4rTqNJPwEpbCFrgC29qX9f4fpDnUpA==}
engines: {node: '>=14.0.0'}
@@ -1507,8 +1564,10 @@ packages:
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- '@polka/url@1.0.0-next.28':
- resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+ '@playwright/test@1.54.2':
+ resolution: {integrity: sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA==}
+ engines: {node: '>=18'}
+ hasBin: true
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -1845,9 +1904,15 @@ packages:
'@tybys/wasm-util@0.9.0':
resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+ '@types/chai@5.2.2':
+ resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
+
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
'@types/eslint-scope@3.7.7':
resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
@@ -1872,8 +1937,8 @@ packages:
'@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
- '@types/node@22.8.6':
- resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==}
+ '@types/node@20.19.11':
+ resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==}
'@types/node@24.0.3':
resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==}
@@ -1900,6 +1965,9 @@ packages:
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+ '@types/whatwg-mimetype@3.0.2':
+ resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
+
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
@@ -2353,6 +2421,40 @@ packages:
vitest:
optional: true
+ '@vitest/expect@3.2.4':
+ resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
+
+ '@vitest/mocker@3.2.4':
+ resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@3.2.4':
+ resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
+
+ '@vitest/runner@3.2.4':
+ resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
+
+ '@vitest/snapshot@3.2.4':
+ resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
+
+ '@vitest/spy@3.2.4':
+ resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
+
+ '@vitest/ui@3.2.4':
+ resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==}
+ peerDependencies:
+ vitest: 3.2.4
+
+ '@vitest/utils@3.2.4':
+ resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
+
'@volar/language-core@2.4.8':
resolution: {integrity: sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==}
@@ -2463,29 +2565,15 @@ packages:
typescript:
optional: true
- '@vue/reactivity@3.5.12':
- resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==}
-
'@vue/reactivity@3.5.17':
resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==}
- '@vue/runtime-core@3.5.12':
- resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==}
-
'@vue/runtime-core@3.5.17':
resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==}
- '@vue/runtime-dom@3.5.12':
- resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==}
-
'@vue/runtime-dom@3.5.17':
resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==}
- '@vue/server-renderer@3.5.12':
- resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==}
- peerDependencies:
- vue: 3.5.12
-
'@vue/server-renderer@3.5.17':
resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==}
peerDependencies:
@@ -2497,6 +2585,9 @@ packages:
'@vue/shared@3.5.17':
resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==}
+ '@vue/test-utils@2.4.6':
+ resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
+
'@vueuse/core@10.11.1':
resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
@@ -2605,6 +2696,10 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+ abbrev@2.0.0:
+ resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
abbrev@3.0.1:
resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -2718,6 +2813,10 @@ packages:
as-table@1.0.55:
resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
ast-kit@1.4.3:
resolution: {integrity: sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==}
engines: {node: '>=16.14.0'}
@@ -2919,6 +3018,10 @@ packages:
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+ chai@5.3.1:
+ resolution: {integrity: sha512-48af6xm9gQK8rhIcOxWwdGzIervm8BVTin+yRp9HEvU20BtVZ2lBywlIJBzwaDtvo0FvjeL7QdCADoUoqIbV3A==}
+ engines: {node: '>=18'}
+
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -2930,6 +3033,10 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -3065,6 +3172,9 @@ packages:
confbox@0.2.2:
resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
consola@3.2.3:
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
engines: {node: ^14.18.0 || >=16.10.0}
@@ -3301,6 +3411,10 @@ packages:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
deep-extend@0.6.0:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
engines: {node: '>=4.0.0'}
@@ -3453,6 +3567,11 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ editorconfig@1.0.4:
+ resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+ engines: {node: '>=14'}
+ hasBin: true
+
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
@@ -3518,9 +3637,6 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-module-lexer@1.5.4:
- resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
-
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
@@ -3876,6 +3992,10 @@ packages:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
engines: {node: '>=6'}
+ expect-type@1.2.2:
+ resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
+ engines: {node: '>=12.0.0'}
+
exsolve@1.0.7:
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
@@ -3887,6 +4007,10 @@ packages:
engines: {node: '>= 10.17.0'}
hasBin: true
+ fake-indexeddb@6.1.0:
+ resolution: {integrity: sha512-gOzajWIhEug/CQHUIxigKT9Zilh5/I6WvUBez6/UdUtT/YVEHM9r572Os8wfvhp7TkmgBtRNdqSM7YoCXWMzZg==}
+ engines: {node: '>=18'}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -3930,14 +4054,6 @@ packages:
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
- fdir@6.4.2:
- resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
- peerDependencies:
- picomatch: ^3 || ^4
- peerDependenciesMeta:
- picomatch:
- optional: true
-
fdir@6.4.6:
resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
peerDependencies:
@@ -3956,6 +4072,9 @@ packages:
fflate@0.7.4:
resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
+ fflate@0.8.2:
+ resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
+
figures@6.1.0:
resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
engines: {node: '>=18'}
@@ -4002,6 +4121,9 @@ packages:
flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
@@ -4037,6 +4159,11 @@ packages:
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
engines: {node: '>= 8'}
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -4196,6 +4323,10 @@ packages:
h3@1.15.3:
resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==}
+ happy-dom@18.0.1:
+ resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==}
+ engines: {node: '>=20.0.0'}
+
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -4463,10 +4594,6 @@ packages:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
- jiti@1.21.6:
- resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
- hasBin: true
-
jiti@1.21.7:
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
hasBin: true
@@ -4479,6 +4606,15 @@ packages:
resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
hasBin: true
+ js-beautify@1.15.4:
+ resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ js-cookie@3.0.5:
+ resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+ engines: {node: '>=14'}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -4667,6 +4803,9 @@ packages:
longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+ loupe@3.2.0:
+ resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==}
+
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@@ -4691,9 +4830,6 @@ packages:
magic-string@0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
- magic-string@0.30.12:
- resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
-
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
@@ -4926,6 +5062,10 @@ packages:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
engines: {node: '>=10'}
+ minimatch@9.0.1:
+ resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -4969,9 +5109,6 @@ packages:
engines: {node: '>=10'}
hasBin: true
- mlly@1.7.2:
- resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==}
-
mlly@1.7.4:
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
@@ -4987,10 +5124,6 @@ packages:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
- mrmime@2.0.0:
- resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
- engines: {node: '>=10'}
-
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -5104,6 +5237,9 @@ packages:
node-mock-http@1.0.0:
resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==}
+ node-mock-http@1.0.2:
+ resolution: {integrity: sha512-zWaamgDUdo9SSLw47we78+zYw/bDr5gH8pH7oRRs8V3KmBtu8GLgGIbV2p/gRPd3LWpEOpjQj7X1FOU3VFMJ8g==}
+
node-releases@2.0.18:
resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
@@ -5114,6 +5250,11 @@ packages:
resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==}
engines: {node: '>=18'}
+ nopt@7.2.1:
+ resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+
nopt@8.1.0:
resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -5396,6 +5537,10 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ pathval@2.0.1:
+ resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
+ engines: {node: '>= 14.16'}
+
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
@@ -5427,6 +5572,16 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ playwright-core@1.54.2:
+ resolution: {integrity: sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.54.2:
+ resolution: {integrity: sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
pluralize@8.0.0:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
@@ -5610,10 +5765,6 @@ packages:
peerDependencies:
postcss: ^8.2.9
- postcss@8.4.47:
- resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
- engines: {node: ^10 || ^12 || >=14}
-
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
@@ -5654,6 +5805,9 @@ packages:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
protocols@2.0.1:
resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==}
@@ -5965,6 +6119,9 @@ packages:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
@@ -6058,6 +6215,9 @@ packages:
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
stacktracey@2.1.8:
resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
@@ -6262,8 +6422,8 @@ packages:
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- tinyexec@0.3.1:
- resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
@@ -6279,6 +6439,18 @@ packages:
resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
engines: {node: '>=12.0.0'}
+ tinypool@1.1.1:
+ resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@2.0.0:
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@4.0.3:
+ resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==}
+ engines: {node: '>=14.0.0'}
+
tmp-promise@3.0.3:
resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
@@ -6368,9 +6540,6 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- ufo@1.5.4:
- resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
-
ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
@@ -6389,8 +6558,8 @@ packages:
unctx@2.4.1:
resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==}
- undici-types@6.19.8:
- resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
undici-types@7.8.0:
resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
@@ -6746,6 +6915,37 @@ packages:
yaml:
optional: true
+ vitest-environment-nuxt@1.0.1:
+ resolution: {integrity: sha512-eBCwtIQriXW5/M49FjqNKfnlJYlG2LWMSNFsRVKomc8CaMqmhQPBS5LZ9DlgYL9T8xIVsiA6RZn2lk7vxov3Ow==}
+
+ vitest@3.2.4:
+ resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/debug': ^4.1.12
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@vitest/browser': 3.2.4
+ '@vitest/ui': 3.2.4
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/debug':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
@@ -6755,6 +6955,9 @@ packages:
vue-bundle-renderer@2.1.1:
resolution: {integrity: sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==}
+ vue-component-type-helpers@2.2.12:
+ resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==}
+
vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'}
@@ -6800,14 +7003,6 @@ packages:
peerDependencies:
typescript: '>=5.0.0'
- vue@3.5.12:
- resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
vue@3.5.17:
resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==}
peerDependencies:
@@ -6844,6 +7039,10 @@ packages:
webpack-cli:
optional: true
+ whatwg-mimetype@3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
@@ -6862,6 +7061,11 @@ packages:
engines: {node: ^18.17.0 || >=20.5.0}
hasBin: true
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
winston-transport@4.9.0:
resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
engines: {node: '>= 12.0.0'}
@@ -7017,7 +7221,7 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@antfu/eslint-config@3.8.0(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@vue/compiler-sfc@3.5.17)(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)':
+ '@antfu/eslint-config@3.8.0(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@unocss/eslint-plugin@0.63.6(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(@vue/compiler-sfc@3.5.17)(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)(vitest@3.2.4)':
dependencies:
'@antfu/install-pkg': 0.4.1
'@clack/prompts': 0.7.0
@@ -7026,7 +7230,7 @@ snapshots:
'@stylistic/eslint-plugin': 2.10.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
'@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
'@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
- '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
+ '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)(vitest@3.2.4)
eslint: 9.13.0(jiti@2.4.2)
eslint-config-flat-gitignore: 0.3.0(eslint@9.13.0(jiti@2.4.2))
eslint-flat-config-utils: 0.4.0
@@ -7068,7 +7272,7 @@ snapshots:
'@antfu/install-pkg@0.4.1':
dependencies:
package-manager-detector: 0.2.2
- tinyexec: 0.3.1
+ tinyexec: 0.3.2
'@antfu/install-pkg@1.1.0':
dependencies:
@@ -7891,11 +8095,11 @@ snapshots:
'@floating-ui/utils@0.2.8': {}
- '@floating-ui/vue@1.1.5(vue@3.5.12(typescript@5.6.3))':
+ '@floating-ui/vue@1.1.5(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@floating-ui/dom': 1.6.12
'@floating-ui/utils': 0.2.8
- vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
@@ -7931,10 +8135,10 @@ snapshots:
'@antfu/install-pkg': 0.4.1
'@antfu/utils': 0.7.10
'@iconify/types': 2.0.0
- debug: 4.3.7
+ debug: 4.4.1
kolorist: 1.8.0
local-pkg: 0.5.0
- mlly: 1.7.2
+ mlly: 1.7.4
transitivePeerDependencies:
- supports-color
@@ -8225,13 +8429,13 @@ snapshots:
prompts: 2.4.2
semver: 7.7.2
- '@nuxt/devtools@1.6.0(rollup@4.44.0)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3)':
+ '@nuxt/devtools@1.6.0(rollup@4.44.0)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3)':
dependencies:
'@antfu/utils': 0.7.10
'@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.44.0)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(webpack-sources@3.3.3)
'@nuxt/devtools-wizard': 1.6.0
'@nuxt/kit': 3.13.2(magicast@0.3.5)(rollup@4.44.0)(webpack-sources@3.3.3)
- '@vue/devtools-core': 7.4.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ '@vue/devtools-core': 7.4.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
'@vue/devtools-kit': 7.4.4
birpc: 0.2.19
consola: 3.2.3
@@ -8426,7 +8630,7 @@ snapshots:
globby: 14.0.2
hash-sum: 2.0.0
ignore: 5.3.2
- jiti: 1.21.6
+ jiti: 1.21.7
klona: 2.0.6
knitwork: 1.2.0
mlly: 1.7.4
@@ -8498,11 +8702,11 @@ snapshots:
pathe: 2.0.3
std-env: 3.9.0
- '@nuxt/scripts@0.11.8(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))':
+ '@nuxt/scripts@0.11.8(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- '@unhead/vue': 2.0.10(vue@3.5.12(typescript@5.6.3))
- '@vueuse/core': 13.4.0(vue@3.5.12(typescript@5.6.3))
+ '@unhead/vue': 2.0.10(vue@3.5.17(typescript@5.6.3))
+ '@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.6.3))
consola: 3.4.2
defu: 6.1.4
h3: 1.15.3
@@ -8558,6 +8762,43 @@ snapshots:
transitivePeerDependencies:
- magicast
+ '@nuxt/test-utils@3.19.2(@playwright/test@1.54.2)(@vitest/ui@3.2.4)(@vue/test-utils@2.4.6)(happy-dom@18.0.1)(magicast@0.3.5)(playwright-core@1.54.2)(typescript@5.6.3)(vitest@3.2.4)':
+ dependencies:
+ '@nuxt/kit': 3.17.5(magicast@0.3.5)
+ c12: 3.0.4(magicast@0.3.5)
+ consola: 3.4.2
+ defu: 6.1.4
+ destr: 2.0.5
+ estree-walker: 3.0.3
+ fake-indexeddb: 6.1.0
+ get-port-please: 3.1.2
+ h3: 1.15.3
+ local-pkg: 1.1.1
+ magic-string: 0.30.17
+ node-fetch-native: 1.6.6
+ node-mock-http: 1.0.2
+ ofetch: 1.4.1
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ radix3: 1.1.2
+ scule: 1.3.0
+ std-env: 3.9.0
+ tinyexec: 1.0.1
+ ufo: 1.6.1
+ unplugin: 2.3.5
+ vitest-environment-nuxt: 1.0.1(@playwright/test@1.54.2)(@vitest/ui@3.2.4)(@vue/test-utils@2.4.6)(happy-dom@18.0.1)(magicast@0.3.5)(playwright-core@1.54.2)(typescript@5.6.3)(vitest@3.2.4)
+ vue: 3.5.17(typescript@5.6.3)
+ optionalDependencies:
+ '@playwright/test': 1.54.2
+ '@vitest/ui': 3.2.4(vitest@3.2.4)
+ '@vue/test-utils': 2.4.6
+ happy-dom: 18.0.1
+ playwright-core: 1.54.2
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+ transitivePeerDependencies:
+ - magicast
+ - typescript
+
'@nuxt/vite-builder@3.17.5(@types/node@24.0.3)(eslint@9.13.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vue-tsc@2.1.10(typescript@5.6.3))(vue@3.5.17(typescript@5.6.3))(yaml@2.8.0)':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
@@ -8640,12 +8881,12 @@ snapshots:
transitivePeerDependencies:
- magicast
- '@nuxtjs/robots@5.2.11(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))':
+ '@nuxtjs/robots@5.2.11(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
consola: 3.4.2
defu: 6.1.4
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
pathe: 2.0.3
pkg-types: 2.1.0
sirv: 3.0.1
@@ -8655,16 +8896,16 @@ snapshots:
- magicast
- vue
- '@nuxtjs/seo@3.0.3(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(h3@1.15.3)(ioredis@5.6.1)(magicast@0.3.5)(rollup@4.44.0)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3)':
+ '@nuxtjs/seo@3.0.3(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(db0@0.3.2(better-sqlite3@11.10.0))(h3@1.15.3)(ioredis@5.6.1)(magicast@0.3.5)(rollup@4.44.0)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3)':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- '@nuxtjs/robots': 5.2.11(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
- '@nuxtjs/sitemap': 7.4.1(h3@1.15.3)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
- nuxt-link-checker: 4.3.1(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
- nuxt-og-image: 5.1.7(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(magicast@0.3.5)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3)
- nuxt-schema-org: 5.0.5(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
- nuxt-seo-utils: 7.0.12(magicast@0.3.5)(rollup@4.44.0)(vue@3.5.12(typescript@5.6.3))
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ '@nuxtjs/robots': 5.2.11(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
+ '@nuxtjs/sitemap': 7.4.1(h3@1.15.3)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
+ nuxt-link-checker: 4.3.1(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
+ nuxt-og-image: 5.1.7(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(magicast@0.3.5)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3)
+ nuxt-schema-org: 5.0.5(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
+ nuxt-seo-utils: 7.0.12(magicast@0.3.5)(rollup@4.44.0)(vue@3.5.17(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -8697,7 +8938,7 @@ snapshots:
- vue
- webpack-sources
- '@nuxtjs/sitemap@7.4.1(h3@1.15.3)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))':
+ '@nuxtjs/sitemap@7.4.1(h3@1.15.3)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@nuxt/devtools-kit': 2.5.0(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
'@nuxt/kit': 3.17.5(magicast@0.3.5)
@@ -8705,7 +8946,7 @@ snapshots:
defu: 6.1.4
fast-xml-parser: 5.2.5
h3-compression: 0.3.2(h3@1.15.3)
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
ofetch: 1.4.1
pathe: 2.0.3
pkg-types: 2.1.0
@@ -8721,6 +8962,8 @@ snapshots:
- vite
- vue
+ '@one-ini/wasm@0.1.1': {}
+
'@oxc-parser/binding-darwin-arm64@0.72.3':
optional: true
@@ -8833,7 +9076,9 @@ snapshots:
'@pkgr/core@0.1.1': {}
- '@polka/url@1.0.0-next.28': {}
+ '@playwright/test@1.54.2':
+ dependencies:
+ playwright: 1.54.2
'@polka/url@1.0.0-next.29': {}
@@ -8965,7 +9210,7 @@ snapshots:
'@rollup/pluginutils@5.1.3(rollup@4.44.0)':
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
@@ -9084,10 +9329,10 @@ snapshots:
'@tanstack/virtual-core@3.10.8': {}
- '@tanstack/vue-virtual@3.10.8(vue@3.5.12(typescript@5.6.3))':
+ '@tanstack/vue-virtual@3.10.8(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@tanstack/virtual-core': 3.10.8
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
'@trysound/sax@0.2.0': {}
@@ -9096,10 +9341,16 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@types/chai@5.2.2':
+ dependencies:
+ '@types/deep-eql': 4.0.2
+
'@types/debug@4.1.12':
dependencies:
'@types/ms': 0.7.34
+ '@types/deep-eql@4.0.2': {}
+
'@types/eslint-scope@3.7.7':
dependencies:
'@types/eslint': 9.6.1
@@ -9124,11 +9375,11 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 22.8.6
+ '@types/node': 24.0.3
- '@types/node@22.8.6':
+ '@types/node@20.19.11':
dependencies:
- undici-types: 6.19.8
+ undici-types: 6.21.0
'@types/node@24.0.3':
dependencies:
@@ -9150,9 +9401,11 @@ snapshots:
'@types/web-bluetooth@0.0.21': {}
+ '@types/whatwg-mimetype@3.0.2': {}
+
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 22.8.6
+ '@types/node': 24.0.3
optional: true
'@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)':
@@ -9196,7 +9449,7 @@ snapshots:
'@typescript-eslint/types': 8.12.2
'@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3)
'@typescript-eslint/visitor-keys': 8.12.2
- debug: 4.3.7
+ debug: 4.4.1
eslint: 9.13.0(jiti@2.4.2)
optionalDependencies:
typescript: 5.6.3
@@ -9255,7 +9508,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3)
'@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
- debug: 4.3.7
+ debug: 4.4.1
ts-api-utils: 1.4.0(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
@@ -9282,11 +9535,11 @@ snapshots:
dependencies:
'@typescript-eslint/types': 8.12.2
'@typescript-eslint/visitor-keys': 8.12.2
- debug: 4.3.7
+ debug: 4.4.1
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.6.3
+ semver: 7.7.2
ts-api-utils: 1.4.0(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
@@ -9369,20 +9622,14 @@ snapshots:
transitivePeerDependencies:
- rollup
- '@unhead/schema-org@2.0.10(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))':
+ '@unhead/schema-org@2.0.10(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))':
dependencies:
defu: 6.1.4
ohash: 2.0.11
ufo: 1.6.1
unhead: 2.0.10
optionalDependencies:
- '@unhead/vue': 2.0.10(vue@3.5.12(typescript@5.6.3))
-
- '@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3))':
- dependencies:
- hookable: 5.5.3
- unhead: 2.0.10
- vue: 3.5.12(typescript@5.6.3)
+ '@unhead/vue': 2.0.10(vue@3.5.17(typescript@5.6.3))
'@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3))':
dependencies:
@@ -9402,11 +9649,11 @@ snapshots:
- supports-color
- typescript
- '@unocss/astro@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))':
+ '@unocss/astro@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@unocss/core': 66.2.3
'@unocss/reset': 66.2.3
- '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
optionalDependencies:
vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
transitivePeerDependencies:
@@ -9476,7 +9723,7 @@ snapshots:
'@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
'@unocss/config': 0.63.6
'@unocss/core': 0.63.6
- magic-string: 0.30.12
+ magic-string: 0.30.17
synckit: 0.9.2
transitivePeerDependencies:
- eslint
@@ -9501,18 +9748,18 @@ snapshots:
transitivePeerDependencies:
- typescript
- '@unocss/inspector@66.2.3(vue@3.5.12(typescript@5.6.3))':
+ '@unocss/inspector@66.2.3(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@unocss/core': 66.2.3
'@unocss/rule-utils': 66.2.3
colorette: 2.0.20
gzip-size: 6.0.0
sirv: 3.0.1
- vue-flow-layout: 0.1.1(vue@3.5.12(typescript@5.6.3))
+ vue-flow-layout: 0.1.1(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- vue
- '@unocss/nuxt@66.2.3(magicast@0.3.5)(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack@5.96.1(esbuild@0.17.19))':
+ '@unocss/nuxt@66.2.3(magicast@0.3.5)(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack@5.96.1(esbuild@0.17.19))':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
'@unocss/config': 66.2.3
@@ -9525,9 +9772,9 @@ snapshots:
'@unocss/preset-web-fonts': 66.2.3
'@unocss/preset-wind': 66.2.3
'@unocss/reset': 66.2.3
- '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
'@unocss/webpack': 66.2.3(webpack@5.96.1(esbuild@0.17.19))
- unocss: 66.2.3(@unocss/webpack@66.2.3(webpack@5.96.1(esbuild@0.17.19)))(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ unocss: 66.2.3(@unocss/webpack@66.2.3(webpack@5.96.1(esbuild@0.17.19)))(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- magicast
- postcss
@@ -9722,12 +9969,12 @@ snapshots:
- supports-color
- typescript
- '@unocss/vite@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))':
+ '@unocss/vite@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@ampproject/remapping': 2.3.0
'@unocss/config': 66.2.3
'@unocss/core': 66.2.3
- '@unocss/inspector': 66.2.3(vue@3.5.12(typescript@5.6.3))
+ '@unocss/inspector': 66.2.3(vue@3.5.17(typescript@5.6.3))
chokidar: 3.6.0
magic-string: 0.30.17
pathe: 2.0.3
@@ -9845,12 +10092,66 @@ snapshots:
vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
vue: 3.5.17(typescript@5.6.3)
- '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)':
+ '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)(vitest@3.2.4)':
dependencies:
'@typescript-eslint/utils': 8.34.1(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
eslint: 9.13.0(jiti@2.4.2)
optionalDependencies:
typescript: 5.6.3
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+
+ '@vitest/expect@3.2.4':
+ dependencies:
+ '@types/chai': 5.2.2
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.1
+ tinyrainbow: 2.0.0
+
+ '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))':
+ dependencies:
+ '@vitest/spy': 3.2.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.17
+ optionalDependencies:
+ vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+
+ '@vitest/pretty-format@3.2.4':
+ dependencies:
+ tinyrainbow: 2.0.0
+
+ '@vitest/runner@3.2.4':
+ dependencies:
+ '@vitest/utils': 3.2.4
+ pathe: 2.0.3
+ strip-literal: 3.0.0
+
+ '@vitest/snapshot@3.2.4':
+ dependencies:
+ '@vitest/pretty-format': 3.2.4
+ magic-string: 0.30.17
+ pathe: 2.0.3
+
+ '@vitest/spy@3.2.4':
+ dependencies:
+ tinyspy: 4.0.3
+
+ '@vitest/ui@3.2.4(vitest@3.2.4)':
+ dependencies:
+ '@vitest/utils': 3.2.4
+ fflate: 0.8.2
+ flatted: 3.3.3
+ pathe: 2.0.3
+ sirv: 3.0.1
+ tinyglobby: 0.2.14
+ tinyrainbow: 2.0.0
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+
+ '@vitest/utils@3.2.4':
+ dependencies:
+ '@vitest/pretty-format': 3.2.4
+ loupe: 3.2.0
+ tinyrainbow: 2.0.0
'@volar/language-core@2.4.8':
dependencies:
@@ -9969,7 +10270,7 @@ snapshots:
'@vue/shared': 3.5.12
estree-walker: 2.0.2
magic-string: 0.30.17
- postcss: 8.4.47
+ postcss: 8.5.6
source-map-js: 1.2.1
'@vue/compiler-sfc@3.5.17':
@@ -10001,7 +10302,7 @@ snapshots:
'@vue/devtools-api@6.6.4': {}
- '@vue/devtools-core@7.4.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))':
+ '@vue/devtools-core@7.4.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@vue/devtools-kit': 7.4.4
'@vue/devtools-shared': 7.6.2
@@ -10009,7 +10310,7 @@ snapshots:
nanoid: 3.3.7
pathe: 1.1.2
vite-hot-client: 0.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
transitivePeerDependencies:
- vite
@@ -10066,31 +10367,15 @@ snapshots:
optionalDependencies:
typescript: 5.6.3
- '@vue/reactivity@3.5.12':
- dependencies:
- '@vue/shared': 3.5.12
-
'@vue/reactivity@3.5.17':
dependencies:
'@vue/shared': 3.5.17
- '@vue/runtime-core@3.5.12':
- dependencies:
- '@vue/reactivity': 3.5.12
- '@vue/shared': 3.5.12
-
'@vue/runtime-core@3.5.17':
dependencies:
'@vue/reactivity': 3.5.17
'@vue/shared': 3.5.17
- '@vue/runtime-dom@3.5.12':
- dependencies:
- '@vue/reactivity': 3.5.12
- '@vue/runtime-core': 3.5.12
- '@vue/shared': 3.5.12
- csstype: 3.1.3
-
'@vue/runtime-dom@3.5.17':
dependencies:
'@vue/reactivity': 3.5.17
@@ -10098,12 +10383,6 @@ snapshots:
'@vue/shared': 3.5.17
csstype: 3.1.3
- '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.3))':
- dependencies:
- '@vue/compiler-ssr': 3.5.12
- '@vue/shared': 3.5.12
- vue: 3.5.12(typescript@5.6.3)
-
'@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@vue/compiler-ssr': 3.5.17
@@ -10114,32 +10393,37 @@ snapshots:
'@vue/shared@3.5.17': {}
- '@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.3))':
+ '@vue/test-utils@2.4.6':
+ dependencies:
+ js-beautify: 1.15.4
+ vue-component-type-helpers: 2.2.12
+
+ '@vueuse/core@10.11.1(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.11.1
- '@vueuse/shared': 10.11.1(vue@3.5.12(typescript@5.6.3))
- vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
+ '@vueuse/shared': 10.11.1(vue@3.5.17(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/core@11.2.0(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/core@11.2.0(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 11.2.0
- '@vueuse/shared': 11.2.0(vue@3.5.12(typescript@5.6.3))
- vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
+ '@vueuse/shared': 11.2.0(vue@3.5.17(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/core@13.4.0(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/core@13.4.0(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 13.4.0
- '@vueuse/shared': 13.4.0(vue@3.5.12(typescript@5.6.3))
- vue: 3.5.12(typescript@5.6.3)
+ '@vueuse/shared': 13.4.0(vue@3.5.17(typescript@5.6.3))
+ vue: 3.5.17(typescript@5.6.3)
'@vueuse/metadata@10.11.1': {}
@@ -10147,34 +10431,34 @@ snapshots:
'@vueuse/metadata@13.4.0': {}
- '@vueuse/nuxt@13.4.0(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/nuxt@13.4.0(magicast@0.3.5)(nuxt@3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))':
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- '@vueuse/core': 13.4.0(vue@3.5.12(typescript@5.6.3))
+ '@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.6.3))
'@vueuse/metadata': 13.4.0
local-pkg: 1.1.1
nuxt: 3.17.5(@parcel/watcher@2.4.1)(@types/node@24.0.3)(better-sqlite3@11.10.0)(db0@0.3.2(better-sqlite3@11.10.0))(eslint@9.13.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.0)(terser@5.43.1)(tsx@4.19.2)(typescript@5.6.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue-tsc@2.1.10(typescript@5.6.3))(webpack-sources@3.3.3)(yaml@2.8.0)
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
transitivePeerDependencies:
- magicast
- '@vueuse/shared@10.11.1(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/shared@10.11.1(vue@3.5.17(typescript@5.6.3))':
dependencies:
- vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/shared@11.2.0(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/shared@11.2.0(vue@3.5.17(typescript@5.6.3))':
dependencies:
- vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/shared@13.4.0(vue@3.5.12(typescript@5.6.3))':
+ '@vueuse/shared@13.4.0(vue@3.5.17(typescript@5.6.3))':
dependencies:
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
'@webassemblyjs/ast@1.14.1':
dependencies:
@@ -10284,6 +10568,8 @@ snapshots:
'@xtuc/long@4.2.2': {}
+ abbrev@2.0.0: {}
+
abbrev@3.0.1: {}
abort-controller@3.0.0:
@@ -10298,9 +10584,13 @@ snapshots:
dependencies:
acorn: 8.14.0
+ acorn-jsx@5.3.2(acorn@8.15.0):
+ dependencies:
+ acorn: 8.15.0
+
acorn-walk@8.3.4:
dependencies:
- acorn: 8.14.0
+ acorn: 8.15.0
acorn@8.14.0: {}
@@ -10388,6 +10678,8 @@ snapshots:
dependencies:
printable-characters: 1.0.42
+ assertion-error@2.0.1: {}
+
ast-kit@1.4.3:
dependencies:
'@babel/parser': 7.27.5
@@ -10552,9 +10844,9 @@ snapshots:
defu: 6.1.4
dotenv: 16.5.0
giget: 1.2.3
- jiti: 1.21.6
+ jiti: 1.21.7
mlly: 1.7.4
- ohash: 1.1.4
+ ohash: 1.1.6
pathe: 1.1.2
perfect-debounce: 1.0.0
pkg-types: 1.3.1
@@ -10617,6 +10909,14 @@ snapshots:
ccount@2.0.1: {}
+ chai@5.3.1:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.2.0
+ pathval: 2.0.1
+
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -10626,6 +10926,8 @@ snapshots:
character-entities@2.0.2: {}
+ check-error@2.1.1: {}
+
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -10651,7 +10953,7 @@ snapshots:
chrome-launcher@1.2.0:
dependencies:
- '@types/node': 22.8.6
+ '@types/node': 24.0.3
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 2.0.1
@@ -10757,6 +11059,11 @@ snapshots:
confbox@0.2.2: {}
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
consola@3.2.3: {}
consola@3.4.2: {}
@@ -10971,6 +11278,8 @@ snapshots:
mimic-response: 3.1.0
optional: true
+ deep-eql@5.0.2: {}
+
deep-extend@0.6.0:
optional: true
@@ -11111,6 +11420,13 @@ snapshots:
eastasianwidth@0.2.0: {}
+ editorconfig@1.0.4:
+ dependencies:
+ '@one-ini/wasm': 0.1.1
+ commander: 10.0.1
+ minimatch: 9.0.1
+ semver: 7.7.2
+
ee-first@1.1.1: {}
electron-to-chromium@1.5.171: {}
@@ -11159,8 +11475,6 @@ snapshots:
es-errors@1.3.0: {}
- es-module-lexer@1.5.4: {}
-
es-module-lexer@1.7.0: {}
es-object-atoms@1.1.1:
@@ -11268,7 +11582,7 @@ snapshots:
eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@2.4.2)):
dependencies:
eslint: 9.13.0(jiti@2.4.2)
- semver: 7.6.3
+ semver: 7.7.2
eslint-config-flat-gitignore@0.3.0(eslint@9.13.0(jiti@2.4.2)):
dependencies:
@@ -11350,14 +11664,14 @@ snapshots:
eslint-plugin-import-x@4.4.0(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3):
dependencies:
'@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@2.4.2))(typescript@5.6.3)
- debug: 4.3.7
+ debug: 4.4.1
doctrine: 3.0.0
eslint: 9.13.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
get-tsconfig: 4.8.1
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.6.3
+ semver: 7.7.2
stable-hash: 0.0.4
tslib: 2.8.1
transitivePeerDependencies:
@@ -11369,13 +11683,13 @@ snapshots:
'@es-joy/jsdoccomment': 0.49.0
are-docs-informative: 0.0.2
comment-parser: 1.4.1
- debug: 4.3.7
+ debug: 4.4.1
escape-string-regexp: 4.0.0
eslint: 9.13.0(jiti@2.4.2)
espree: 10.3.0
esquery: 1.6.0
parse-imports: 2.2.1
- semver: 7.6.3
+ semver: 7.7.2
spdx-expression-parse: 4.0.0
synckit: 0.9.2
transitivePeerDependencies:
@@ -11418,7 +11732,7 @@ snapshots:
globals: 15.11.0
ignore: 5.3.2
minimatch: 9.0.5
- semver: 7.6.3
+ semver: 7.7.2
eslint-plugin-no-only-tests@3.3.0: {}
@@ -11459,7 +11773,7 @@ snapshots:
eslint-plugin-toml@0.11.1(eslint@9.13.0(jiti@2.4.2)):
dependencies:
- debug: 4.3.7
+ debug: 4.4.1
eslint: 9.13.0(jiti@2.4.2)
eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@2.4.2))
lodash: 4.17.21
@@ -11484,7 +11798,7 @@ snapshots:
read-pkg-up: 7.0.1
regexp-tree: 0.1.27
regjsparser: 0.10.0
- semver: 7.6.3
+ semver: 7.7.2
strip-indent: 3.0.0
eslint-plugin-unicorn@59.0.1(eslint@9.13.0(jiti@2.4.2)):
@@ -11533,7 +11847,7 @@ snapshots:
natural-compare: 1.4.0
nth-check: 2.1.1
postcss-selector-parser: 6.1.2
- semver: 7.6.3
+ semver: 7.7.2
vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@2.4.2))
xml-name-validator: 4.0.0
transitivePeerDependencies:
@@ -11541,7 +11855,7 @@ snapshots:
eslint-plugin-yml@1.15.0(eslint@9.13.0(jiti@2.4.2)):
dependencies:
- debug: 4.3.7
+ debug: 4.4.1
eslint: 9.13.0(jiti@2.4.2)
eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@2.4.2))
lodash: 4.17.21
@@ -11637,8 +11951,8 @@ snapshots:
espree@9.6.1:
dependencies:
- acorn: 8.14.0
- acorn-jsx: 5.3.2(acorn@8.14.0)
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
eslint-visitor-keys: 3.4.3
esprima@4.0.1: {}
@@ -11661,7 +11975,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.8
esutils@2.0.3: {}
@@ -11685,7 +11999,7 @@ snapshots:
execa@8.0.1:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
get-stream: 8.0.1
human-signals: 5.0.0
is-stream: 3.0.0
@@ -11715,6 +12029,8 @@ snapshots:
expand-template@2.0.3:
optional: true
+ expect-type@1.2.2: {}
+
exsolve@1.0.7: {}
externality@1.0.2:
@@ -11734,6 +12050,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ fake-indexeddb@6.1.0: {}
+
fast-deep-equal@3.1.3: {}
fast-fifo@1.3.2: {}
@@ -11780,10 +12098,6 @@ snapshots:
dependencies:
pend: 1.2.0
- fdir@6.4.2(picomatch@4.0.2):
- optionalDependencies:
- picomatch: 4.0.2
-
fdir@6.4.6(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
@@ -11797,6 +12111,8 @@ snapshots:
fflate@0.7.4: {}
+ fflate@0.8.2: {}
+
figures@6.1.0:
dependencies:
is-unicode-supported: 2.1.0
@@ -11840,6 +12156,8 @@ snapshots:
flatted@3.3.1: {}
+ flatted@3.3.3: {}
+
fn.name@1.1.0: {}
fontaine@0.5.0(webpack-sources@3.3.3):
@@ -11869,7 +12187,7 @@ snapshots:
foreground-child@3.3.0:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
signal-exit: 4.1.0
formdata-polyfill@4.0.10:
@@ -11893,6 +12211,9 @@ snapshots:
dependencies:
minipass: 3.3.6
+ fsevents@2.3.2:
+ optional: true
+
fsevents@2.3.3:
optional: true
@@ -12071,11 +12392,17 @@ snapshots:
defu: 6.1.4
destr: 2.0.5
iron-webcrypto: 1.2.1
- node-mock-http: 1.0.0
+ node-mock-http: 1.0.2
radix3: 1.1.2
ufo: 1.6.1
uncrypto: 0.1.3
+ happy-dom@18.0.1:
+ dependencies:
+ '@types/node': 20.19.11
+ '@types/whatwg-mimetype': 3.0.2
+ whatwg-mimetype: 3.0.0
+
has-flag@4.0.0: {}
has-symbols@1.1.0: {}
@@ -12143,7 +12470,7 @@ snapshots:
importx@0.4.4:
dependencies:
bundle-require: 5.0.0(esbuild@0.23.1)
- debug: 4.3.7
+ debug: 4.4.1
esbuild: 0.23.1
jiti: 2.0.0-beta.3
jiti-v1: jiti@1.21.7
@@ -12170,8 +12497,7 @@ snapshots:
inherits@2.0.4: {}
- ini@1.3.8:
- optional: true
+ ini@1.3.8: {}
ini@4.1.1: {}
@@ -12335,14 +12661,22 @@ snapshots:
merge-stream: 2.0.0
supports-color: 8.1.1
- jiti@1.21.6: {}
-
jiti@1.21.7: {}
jiti@2.0.0-beta.3: {}
jiti@2.4.2: {}
+ js-beautify@1.15.4:
+ dependencies:
+ config-chain: 1.1.13
+ editorconfig: 1.0.4
+ glob: 10.4.5
+ js-cookie: 3.0.5
+ nopt: 7.2.1
+
+ js-cookie@3.0.5: {}
+
js-tokens@4.0.0: {}
js-tokens@9.0.0: {}
@@ -12380,10 +12714,10 @@ snapshots:
jsonc-eslint-parser@2.4.0:
dependencies:
- acorn: 8.14.0
+ acorn: 8.15.0
eslint-visitor-keys: 3.4.3
espree: 9.6.1
- semver: 7.6.3
+ semver: 7.7.2
jsonfile@6.1.0:
dependencies:
@@ -12479,8 +12813,8 @@ snapshots:
local-pkg@0.5.0:
dependencies:
- mlly: 1.7.2
- pkg-types: 1.2.1
+ mlly: 1.7.4
+ pkg-types: 1.3.1
local-pkg@1.1.1:
dependencies:
@@ -12527,6 +12861,8 @@ snapshots:
longest-streak@3.1.0: {}
+ loupe@3.2.0: {}
+
lru-cache@10.4.3: {}
lru-cache@5.1.1:
@@ -12559,10 +12895,6 @@ snapshots:
dependencies:
sourcemap-codec: 1.4.8
- magic-string@0.30.12:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
-
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -12941,7 +13273,7 @@ snapshots:
miniflare@3.20241022.0:
dependencies:
'@cspotcode/source-map-support': 0.8.1
- acorn: 8.14.0
+ acorn: 8.15.0
acorn-walk: 8.3.4
capnp-ts: 0.7.0
exit-hook: 2.2.1
@@ -12969,6 +13301,10 @@ snapshots:
dependencies:
brace-expansion: 2.0.1
+ minimatch@9.0.1:
+ dependencies:
+ brace-expansion: 2.0.1
+
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.1
@@ -13001,13 +13337,6 @@ snapshots:
mkdirp@3.0.1: {}
- mlly@1.7.2:
- dependencies:
- acorn: 8.14.0
- pathe: 1.1.2
- pkg-types: 1.2.1
- ufo: 1.5.4
-
mlly@1.7.4:
dependencies:
acorn: 8.15.0
@@ -13024,8 +13353,6 @@ snapshots:
mri@1.2.0: {}
- mrmime@2.0.0: {}
-
mrmime@2.0.1: {}
ms@2.0.0: {}
@@ -13197,6 +13524,8 @@ snapshots:
node-mock-http@1.0.0: {}
+ node-mock-http@1.0.2: {}
+
node-releases@2.0.18: {}
node-releases@2.0.19: {}
@@ -13205,6 +13534,10 @@ snapshots:
dependencies:
'@babel/parser': 7.27.5
+ nopt@7.2.1:
+ dependencies:
+ abbrev: 2.0.0
+
nopt@8.1.0:
dependencies:
abbrev: 3.0.1
@@ -13243,16 +13576,16 @@ snapshots:
dependencies:
boolbase: 1.0.0
- nuxt-link-checker@4.3.1(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3)):
+ nuxt-link-checker@4.3.1(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@nuxt/devtools-kit': 2.5.0(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- '@vueuse/core': 13.4.0(vue@3.5.12(typescript@5.6.3))
+ '@vueuse/core': 13.4.0(vue@3.5.17(typescript@5.6.3))
consola: 3.4.2
diff: 8.0.2
fuse.js: 7.1.0
magic-string: 0.30.17
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
ofetch: 1.4.1
pathe: 2.0.3
pkg-types: 2.1.0
@@ -13285,13 +13618,13 @@ snapshots:
- vite
- vue
- nuxt-og-image@5.1.7(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(magicast@0.3.5)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.3.3):
+ nuxt-og-image@5.1.7(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(magicast@0.3.5)(unstorage@1.16.0(db0@0.3.2(better-sqlite3@11.10.0))(ioredis@5.6.1))(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))(webpack-sources@3.3.3):
dependencies:
'@nuxt/devtools-kit': 2.5.0(magicast@0.3.5)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
'@nuxt/kit': 3.17.5(magicast@0.3.5)
'@resvg/resvg-js': 2.6.2
'@resvg/resvg-wasm': 2.6.2
- '@unhead/vue': 2.0.10(vue@3.5.12(typescript@5.6.3))
+ '@unhead/vue': 2.0.10(vue@3.5.17(typescript@5.6.3))
'@unocss/core': 66.2.3
'@unocss/preset-wind3': 66.2.3
chrome-launcher: 1.2.0
@@ -13301,7 +13634,7 @@ snapshots:
image-size: 2.0.2
magic-string: 0.30.17
mocked-exports: 0.1.1
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
nypm: 0.6.0
ofetch: 1.4.1
ohash: 2.0.11
@@ -13326,17 +13659,17 @@ snapshots:
- vue
- webpack-sources
- nuxt-schema-org@5.0.5(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3)):
+ nuxt-schema-org@5.0.5(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- '@unhead/schema-org': 2.0.10(@unhead/vue@2.0.10(vue@3.5.12(typescript@5.6.3)))
+ '@unhead/schema-org': 2.0.10(@unhead/vue@2.0.10(vue@3.5.17(typescript@5.6.3)))
defu: 6.1.4
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
pathe: 2.0.3
pkg-types: 2.1.0
sirv: 3.0.1
optionalDependencies:
- '@unhead/vue': 2.0.10(vue@3.5.12(typescript@5.6.3))
+ '@unhead/vue': 2.0.10(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- '@unhead/react'
- '@unhead/solid-js'
@@ -13344,7 +13677,7 @@ snapshots:
- magicast
- vue
- nuxt-seo-utils@7.0.12(magicast@0.3.5)(rollup@4.44.0)(vue@3.5.12(typescript@5.6.3)):
+ nuxt-seo-utils@7.0.12(magicast@0.3.5)(rollup@4.44.0)(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
'@unhead/addons': 2.0.10(rollup@4.44.0)
@@ -13352,7 +13685,7 @@ snapshots:
escape-string-regexp: 5.0.0
fast-glob: 3.3.3
image-size: 2.0.2
- nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
pathe: 2.0.3
pkg-types: 2.1.0
scule: 1.3.0
@@ -13363,25 +13696,25 @@ snapshots:
- rollup
- vue
- nuxt-site-config-kit@3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3)):
+ nuxt-site-config-kit@3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
pkg-types: 2.1.0
- site-config-stack: 3.2.1(vue@3.5.12(typescript@5.6.3))
+ site-config-stack: 3.2.1(vue@3.5.17(typescript@5.6.3))
std-env: 3.9.0
ufo: 1.6.1
transitivePeerDependencies:
- magicast
- vue
- nuxt-site-config@3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3)):
+ nuxt-site-config@3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@nuxt/kit': 3.17.5(magicast@0.3.5)
- nuxt-site-config-kit: 3.2.1(magicast@0.3.5)(vue@3.5.12(typescript@5.6.3))
+ nuxt-site-config-kit: 3.2.1(magicast@0.3.5)(vue@3.5.17(typescript@5.6.3))
pathe: 2.0.3
pkg-types: 2.1.0
sirv: 3.0.1
- site-config-stack: 3.2.1(vue@3.5.12(typescript@5.6.3))
+ site-config-stack: 3.2.1(vue@3.5.17(typescript@5.6.3))
ufo: 1.6.1
transitivePeerDependencies:
- magicast
@@ -13449,7 +13782,7 @@ snapshots:
vue: 3.5.17(typescript@5.6.3)
vue-bundle-renderer: 2.1.1
vue-devtools-stub: 0.1.0
- vue-router: 4.5.1(vue@3.5.12(typescript@5.6.3))
+ vue-router: 4.5.1(vue@3.5.17(typescript@5.6.3))
optionalDependencies:
'@parcel/watcher': 2.4.1
'@types/node': 24.0.3
@@ -13667,7 +14000,7 @@ snapshots:
parse-imports@2.2.1:
dependencies:
- es-module-lexer: 1.5.4
+ es-module-lexer: 1.7.0
slashes: 3.0.12
parse-json@5.2.0:
@@ -13725,6 +14058,8 @@ snapshots:
pathe@2.0.3: {}
+ pathval@2.0.1: {}
+
pend@1.2.0: {}
perfect-debounce@1.0.0: {}
@@ -13755,6 +14090,14 @@ snapshots:
playwright-core@1.53.1: {}
+ playwright-core@1.54.2: {}
+
+ playwright@1.54.2:
+ dependencies:
+ playwright-core: 1.54.2
+ optionalDependencies:
+ fsevents: 2.3.2
+
pluralize@8.0.0: {}
postcss-calc@10.1.1(postcss@8.5.6):
@@ -13925,12 +14268,6 @@ snapshots:
postcss: 8.5.6
quote-unquote: 1.0.0
- postcss@8.4.47:
- dependencies:
- nanoid: 3.3.7
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
@@ -13992,6 +14329,8 @@ snapshots:
kleur: 3.0.3
sisteransi: 1.0.5
+ proto-list@1.2.4: {}
+
protocols@2.0.1: {}
pump@3.0.2:
@@ -14013,20 +14352,20 @@ snapshots:
quote-unquote@1.0.0: {}
- radix-vue@1.9.8(vue@3.5.12(typescript@5.6.3)):
+ radix-vue@1.9.8(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@floating-ui/dom': 1.6.12
- '@floating-ui/vue': 1.1.5(vue@3.5.12(typescript@5.6.3))
+ '@floating-ui/vue': 1.1.5(vue@3.5.17(typescript@5.6.3))
'@internationalized/date': 3.5.6
'@internationalized/number': 3.5.4
- '@tanstack/vue-virtual': 3.10.8(vue@3.5.12(typescript@5.6.3))
- '@vueuse/core': 10.11.1(vue@3.5.12(typescript@5.6.3))
- '@vueuse/shared': 10.11.1(vue@3.5.12(typescript@5.6.3))
+ '@tanstack/vue-virtual': 3.10.8(vue@3.5.17(typescript@5.6.3))
+ '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.6.3))
+ '@vueuse/shared': 10.11.1(vue@3.5.17(typescript@5.6.3))
aria-hidden: 1.2.4
defu: 6.1.4
fast-deep-equal: 3.1.3
nanoid: 5.0.8
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
transitivePeerDependencies:
- '@vue/composition-api'
@@ -14376,6 +14715,8 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
+ siginfo@2.0.0: {}
+
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
@@ -14404,8 +14745,8 @@ snapshots:
sirv@2.0.4:
dependencies:
- '@polka/url': 1.0.0-next.28
- mrmime: 2.0.0
+ '@polka/url': 1.0.0-next.29
+ mrmime: 2.0.1
totalist: 3.0.1
sirv@3.0.1:
@@ -14416,10 +14757,10 @@ snapshots:
sisteransi@1.0.5: {}
- site-config-stack@3.2.1(vue@3.5.12(typescript@5.6.3)):
+ site-config-stack@3.2.1(vue@3.5.17(typescript@5.6.3)):
dependencies:
ufo: 1.6.1
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
slash@5.1.0: {}
@@ -14467,6 +14808,8 @@ snapshots:
stack-trace@0.0.10: {}
+ stackback@0.0.2: {}
+
stacktracey@2.1.8:
dependencies:
as-table: 1.0.55
@@ -14687,7 +15030,7 @@ snapshots:
tiny-invariant@1.3.3: {}
- tinyexec@0.3.1: {}
+ tinybench@2.9.0: {}
tinyexec@0.3.2: {}
@@ -14695,7 +15038,7 @@ snapshots:
tinyglobby@0.2.10:
dependencies:
- fdir: 6.4.2(picomatch@4.0.2)
+ fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
tinyglobby@0.2.14:
@@ -14703,6 +15046,12 @@ snapshots:
fdir: 6.4.6(picomatch@4.0.2)
picomatch: 4.0.2
+ tinypool@1.1.1: {}
+
+ tinyrainbow@2.0.0: {}
+
+ tinyspy@4.0.3: {}
+
tmp-promise@3.0.3:
dependencies:
tmp: 0.2.3
@@ -14771,8 +15120,6 @@ snapshots:
typescript@5.8.3: {}
- ufo@1.5.4: {}
-
ufo@1.6.1: {}
ultrahtml@1.6.0: {}
@@ -14801,7 +15148,7 @@ snapshots:
magic-string: 0.30.17
unplugin: 2.3.5
- undici-types@6.19.8: {}
+ undici-types@6.21.0: {}
undici-types@7.8.0: {}
@@ -14845,7 +15192,7 @@ snapshots:
unimport@3.13.1(rollup@4.44.0)(webpack-sources@3.3.3):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.44.0)
- acorn: 8.14.0
+ acorn: 8.15.0
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
fast-glob: 3.3.2
@@ -14931,9 +15278,9 @@ snapshots:
- supports-color
- typescript
- unocss@66.2.3(@unocss/webpack@66.2.3(webpack@5.96.1(esbuild@0.17.19)))(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3)):
+ unocss@66.2.3(@unocss/webpack@66.2.3(webpack@5.96.1(esbuild@0.17.19)))(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3)):
dependencies:
- '@unocss/astro': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ '@unocss/astro': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
'@unocss/cli': 66.2.3
'@unocss/core': 66.2.3
'@unocss/postcss': 66.2.3(postcss@8.5.6)
@@ -14951,7 +15298,7 @@ snapshots:
'@unocss/transformer-compile-class': 66.2.3
'@unocss/transformer-directives': 66.2.3
'@unocss/transformer-variant-group': 66.2.3
- '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.12(typescript@5.6.3))
+ '@unocss/vite': 66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.6.3))
optionalDependencies:
'@unocss/webpack': 66.2.3(webpack@5.96.1(esbuild@0.17.19))
vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
@@ -14990,13 +15337,13 @@ snapshots:
unplugin-utils: 0.2.4
yaml: 2.8.0
optionalDependencies:
- vue-router: 4.5.1(vue@3.5.12(typescript@5.6.3))
+ vue-router: 4.5.1(vue@3.5.17(typescript@5.6.3))
transitivePeerDependencies:
- vue
unplugin@1.15.0(webpack-sources@3.3.3):
dependencies:
- acorn: 8.14.0
+ acorn: 8.15.0
webpack-virtual-modules: 0.6.2
optionalDependencies:
webpack-sources: 3.3.3
@@ -15246,6 +15593,67 @@ snapshots:
tsx: 4.19.2
yaml: 2.8.0
+ vitest-environment-nuxt@1.0.1(@playwright/test@1.54.2)(@vitest/ui@3.2.4)(@vue/test-utils@2.4.6)(happy-dom@18.0.1)(magicast@0.3.5)(playwright-core@1.54.2)(typescript@5.6.3)(vitest@3.2.4):
+ dependencies:
+ '@nuxt/test-utils': 3.19.2(@playwright/test@1.54.2)(@vitest/ui@3.2.4)(@vue/test-utils@2.4.6)(happy-dom@18.0.1)(magicast@0.3.5)(playwright-core@1.54.2)(typescript@5.6.3)(vitest@3.2.4)
+ transitivePeerDependencies:
+ - '@cucumber/cucumber'
+ - '@jest/globals'
+ - '@playwright/test'
+ - '@testing-library/vue'
+ - '@vitest/ui'
+ - '@vue/test-utils'
+ - happy-dom
+ - jsdom
+ - magicast
+ - playwright-core
+ - typescript
+ - vitest
+
+ vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.3)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0):
+ dependencies:
+ '@types/chai': 5.2.2
+ '@vitest/expect': 3.2.4
+ '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0))
+ '@vitest/pretty-format': 3.2.4
+ '@vitest/runner': 3.2.4
+ '@vitest/snapshot': 3.2.4
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.1
+ debug: 4.4.1
+ expect-type: 1.2.2
+ magic-string: 0.30.17
+ pathe: 2.0.3
+ picomatch: 4.0.2
+ std-env: 3.9.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.2
+ tinyglobby: 0.2.14
+ tinypool: 1.1.1
+ tinyrainbow: 2.0.0
+ vite: 6.3.5(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+ vite-node: 3.2.4(@types/node@24.0.3)(jiti@2.4.2)(terser@5.43.1)(tsx@4.19.2)(yaml@2.8.0)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/debug': 4.1.12
+ '@types/node': 24.0.3
+ '@vitest/ui': 3.2.4(vitest@3.2.4)
+ happy-dom: 18.0.1
+ transitivePeerDependencies:
+ - jiti
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
vscode-uri@3.0.8: {}
vscode-uri@3.1.0: {}
@@ -15254,9 +15662,11 @@ snapshots:
dependencies:
ufo: 1.6.1
- vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)):
+ vue-component-type-helpers@2.2.12: {}
+
+ vue-demi@0.14.10(vue@3.5.17(typescript@5.6.3)):
dependencies:
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
vue-devtools-stub@0.1.0: {}
@@ -15275,31 +15685,31 @@ snapshots:
vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@2.4.2)):
dependencies:
- debug: 4.3.7
+ debug: 4.4.1
eslint: 9.13.0(jiti@2.4.2)
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
esquery: 1.6.0
lodash: 4.17.21
- semver: 7.6.3
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color
vue-flow-layout@0.0.5(typescript@5.6.3):
dependencies:
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
transitivePeerDependencies:
- typescript
- vue-flow-layout@0.1.1(vue@3.5.12(typescript@5.6.3)):
+ vue-flow-layout@0.1.1(vue@3.5.17(typescript@5.6.3)):
dependencies:
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
- vue-router@4.5.1(vue@3.5.12(typescript@5.6.3)):
+ vue-router@4.5.1(vue@3.5.17(typescript@5.6.3)):
dependencies:
'@vue/devtools-api': 6.6.4
- vue: 3.5.12(typescript@5.6.3)
+ vue: 3.5.17(typescript@5.6.3)
vue-tsc@2.1.10(typescript@5.6.3):
dependencies:
@@ -15308,16 +15718,6 @@ snapshots:
semver: 7.6.3
typescript: 5.6.3
- vue@3.5.12(typescript@5.6.3):
- dependencies:
- '@vue/compiler-dom': 3.5.12
- '@vue/compiler-sfc': 3.5.12
- '@vue/runtime-dom': 3.5.12
- '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.3))
- '@vue/shared': 3.5.12
- optionalDependencies:
- typescript: 5.6.3
-
vue@3.5.17(typescript@5.6.3):
dependencies:
'@vue/compiler-dom': 3.5.17
@@ -15371,6 +15771,8 @@ snapshots:
- esbuild
- uglify-js
+ whatwg-mimetype@3.0.0: {}
+
whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
@@ -15388,6 +15790,11 @@ snapshots:
dependencies:
isexe: 3.1.1
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
winston-transport@4.9.0:
dependencies:
logform: 2.7.0
diff --git a/server/api/blog.ts b/server/api/blog.ts
index 6925f45d..626b7432 100644
--- a/server/api/blog.ts
+++ b/server/api/blog.ts
@@ -37,21 +37,29 @@ async function fetchPosts(url: string): Promise
'
+}
+
+// Mock Card component
+const MockCard = {
+ name: 'Card',
+ props: ['class'],
+ template: '
an image.
]]>
images.]]>
an image.]]>
+ Some text
+
+ ]]>