diff --git a/e2e/docs-e2e/.gitignore b/e2e/docs-e2e/.gitignore new file mode 100644 index 00000000000..58786aac756 --- /dev/null +++ b/e2e/docs-e2e/.gitignore @@ -0,0 +1,7 @@ + +# Playwright +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/docs-e2e/package.json b/e2e/docs-e2e/package.json new file mode 100644 index 00000000000..44c6109ea90 --- /dev/null +++ b/e2e/docs-e2e/package.json @@ -0,0 +1,18 @@ +{ + "name": "docs-e2e", + "description": "", + "version": "1.0.0", + "author": "", + "devDependencies": { + "@playwright/test": "^1.50.1", + "@types/node": "^24.0.13" + }, + "keywords": [], + "license": "ISC", + "main": "index.js", + "scripts": { + "test": "pnpm exec playwright test --config=playwright.config.ts --project=chromium", + "test-ui": "pnpm exec playwright test --config=playwright.config.ts --project=chromium --ui" + }, + "type": "commonjs" +} diff --git a/e2e/docs-e2e/playwright.config.ts b/e2e/docs-e2e/playwright.config.ts new file mode 100644 index 00000000000..e51c64c00f6 --- /dev/null +++ b/e2e/docs-e2e/playwright.config.ts @@ -0,0 +1,83 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** Read environment variables from file. https://github.com/motdotla/dotenv */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** See https://playwright.dev/docs/test-configuration. */ + +const TestingURL = 'http://127.0.0.1:3000'; + +export default defineConfig({ + testDir: './tests', + /* Global timeout for each test */ + timeout: 30000, + /* 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', + /* 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: TestingURL, + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + { + name: 'chrome', + 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'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'pnpm -C ../../ run docs.dev', + url: TestingURL, + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/e2e/docs-e2e/tests/Docs/advanced-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/advanced-pages-load.spec.ts new file mode 100644 index 00000000000..cfedb0738f6 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/advanced-pages-load.spec.ts @@ -0,0 +1,93 @@ +import { test, expect } from '@playwright/test'; + +test('Advanced Dollar Function page loads', async ({ page }) => { + await page.goto('/docs/advanced/dollar/'); + + await expect(page).toHaveTitle('The $ dollar sign | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Containers page loads', async ({ page }) => { + await page.goto('/docs/advanced/containers/'); + await expect(page).toHaveTitle('Containers | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced QRL page loads', async ({ page }) => { + await page.goto('/docs/advanced/qrl/'); + await expect(page).toHaveTitle('QRL | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Library page loads', async ({ page }) => { + await page.goto('/docs/advanced/library/'); + await expect(page).toHaveTitle('Component library | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Qwikloader page loads', async ({ page }) => { + await page.goto('/docs/advanced/qwikloader/'); + await expect(page).toHaveTitle('Qwikloader | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Optimizer page loads', async ({ page }) => { + await page.goto('/docs/advanced/optimizer/'); + await expect(page).toHaveTitle('Optimizer Rules | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Prefetching Modules page loads', async ({ page }) => { + await page.goto('/docs/advanced/modules-prefetching/'); + await expect(page).toHaveTitle('Prefetching | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Custom Build Directory page loads', async ({ page }) => { + await page.goto('/docs/advanced/custom-build-dir/'); + await expect(page).toHaveTitle('Custom Build Output Directory | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Vite page loads', async ({ page }) => { + await page.goto('/docs/advanced/vite/'); + await expect(page).toHaveTitle('Vite | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Routing page loads', async ({ page }) => { + await page.goto('/docs/advanced/routing/'); + await expect(page).toHaveTitle('Advanced Routing | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Plugins page loads', async ({ page }) => { + await page.goto('/docs/advanced/plugins/'); + await expect(page).toHaveTitle('Qwik Plugins | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Request Handling page loads', async ({ page }) => { + await page.goto('/docs/advanced/request-handling/'); + await expect(page).toHaveTitle('Request Handling | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Speculative Module Fetching page loads', async ({ page }) => { + await page.goto('/docs/advanced/speculative-module-fetching/'); + await expect(page).toHaveTitle('Speculative Module Fetching | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Menu page loads', async ({ page }) => { + await page.goto('/docs/advanced/menu/'); + await expect(page).toHaveTitle('Menu | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Generating Sitemaps page loads', async ({ page }) => { + await page.goto('/docs/advanced/sitemaps/'); + await expect(page).toHaveTitle('Generating Sitemaps | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced ESLint-Rules page loads', async ({ page }) => { + await page.goto('/docs/advanced/eslint/'); + // currently does not have a custom title + await expect(page).toHaveTitle('Qwik - Framework reimagined for the edge'); +}); + +test('Advanced Content Security Policy page loads', async ({ page }) => { + await page.goto('/docs/advanced/content-security-policy/'); + await expect(page).toHaveTitle('Content Security Policy | Advanced ๐Ÿ“š Qwik Documentation'); +}); + +test('Advanced Complex Forms page loads', async ({ page }) => { + await page.goto('/docs/advanced/complex-forms/'); + await expect(page).toHaveTitle('Complex Forms | Advanced ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/community-pages.load.spec.ts b/e2e/docs-e2e/tests/Docs/community-pages.load.spec.ts new file mode 100644 index 00000000000..328a377c31f --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/community-pages.load.spec.ts @@ -0,0 +1,16 @@ +import { test, expect } from '@playwright/test'; + +test('Community Projects page loads', async ({ page }) => { + await page.goto('/community/projects/'); + await expect(page).toHaveTitle('Projects | Qwik Community ๐Ÿ“š Qwik Documentation'); +}); + +test('Community Groups page loads', async ({ page }) => { + await page.goto('/community/groups/'); + await expect(page).toHaveTitle('Groups | Qwik Community ๐Ÿ“š Qwik Documentation'); +}); + +test('Community Values page loads', async ({ page }) => { + await page.goto('/community/values/'); + await expect(page).toHaveTitle('Values | Qwik Community ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/concepts-pages-laod.spec.ts b/e2e/docs-e2e/tests/Docs/concepts-pages-laod.spec.ts new file mode 100644 index 00000000000..6f5109b8d5e --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/concepts-pages-laod.spec.ts @@ -0,0 +1,21 @@ +import { test, expect } from '@playwright/test'; + +test('Concepts Think Qwik page loads', async ({ page }) => { + await page.goto('/docs/concepts/think-qwik/'); + await expect(page).toHaveTitle('Think Qwik | Concepts ๐Ÿ“š Qwik Documentation'); +}); + +test('Concepts Resumable page loads', async ({ page }) => { + await page.goto('/docs/concepts/resumable/'); + await expect(page).toHaveTitle('Resumable | Concepts ๐Ÿ“š Qwik Documentation'); +}); + +test('Concepts Progressive page loads', async ({ page }) => { + await page.goto('/docs/concepts/progressive/'); + await expect(page).toHaveTitle('Progressive | Concepts ๐Ÿ“š Qwik Documentation'); +}); + +test('Concepts Reactivity page loads', async ({ page }) => { + await page.goto('/docs/concepts/reactivity/'); + await expect(page).toHaveTitle('Reactivity | Concepts ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/cookbook-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/cookbook-pages-load.spec.ts new file mode 100644 index 00000000000..568decd647a --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/cookbook-pages-load.spec.ts @@ -0,0 +1,73 @@ +import { test, expect } from '@playwright/test'; + +test('Cookbook Overview page loads', async ({ page }) => { + await page.goto('/docs/cookbook/'); + await expect(page).toHaveTitle('Cookbook | Overview ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Algolia Search page loads', async ({ page }) => { + await page.goto('/docs/cookbook/algolia-search/'); + await expect(page).toHaveTitle('Cookbook | Algolia Search ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Combine Request Handlers page loads', async ({ page }) => { + await page.goto('/docs/cookbook/combine-request-handlers/'); + await expect(page).toHaveTitle('Cookbook | Combine Request Handlers ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Debouncer page loads', async ({ page }) => { + await page.goto('/docs/cookbook/debouncer/'); + await expect(page).toHaveTitle('Cookbook | Debouncer ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Fonts page loads', async ({ page }) => { + await page.goto('/docs/cookbook/fonts/'); + await expect(page).toHaveTitle('Cookbook | Font optimization ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Glob Import & Dynamic Import page loads', async ({ page }) => { + await page.goto('/docs/cookbook/glob-import/'); + await expect(page).toHaveTitle( + 'Cookbook | Glob Import with import.meta.glob ๐Ÿ“š Qwik Documentation' + ); +}); + +test('Cookbook NavLink Component page loads', async ({ page }) => { + await page.goto('/docs/cookbook/nav-link/'); + await expect(page).toHaveTitle('Cookbook | Navbar link ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Deploy with Node using Docker page loads', async ({ page }) => { + await page.goto('/docs/cookbook/node-docker-deploy/'); + await expect(page).toHaveTitle('Cookbook | Deploy with Node using Docker ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Portals page loads', async ({ page }) => { + await page.goto('/docs/cookbook/portals/'); + await expect(page).toHaveTitle('Cookbook | Portals ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Streaming/deferred loaders page loads', async ({ page }) => { + await page.goto('/docs/cookbook/streaming-deferred-loaders/'); + await expect(page).toHaveTitle('Cookbook | Streaming/deferred loaders ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook sync$ Events page loads', async ({ page }) => { + await page.goto('/docs/cookbook/sync-events/'); + await expect(page).toHaveTitle('Cookbook | Synchronous Events with State ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Theme Management page loads', async ({ page }) => { + await page.goto('/docs/cookbook/theme-management/'); + await expect(page).toHaveTitle('Cookbook | Dark and Light Theme ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook Drag & Drop page loads', async ({ page }) => { + await page.goto('/docs/cookbook/drag&drop/'); + await expect(page).toHaveTitle('Cookbook | Drag & Drop ๐Ÿ“š Qwik Documentation'); +}); + +test('Cookbook View Transition API page loads', async ({ page }) => { + await page.goto('/docs/cookbook/view-transition/'); + await expect(page).toHaveTitle('Cookbook | View Transition API ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/deployments-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/deployments-pages-load.spec.ts new file mode 100644 index 00000000000..79ba8a7394e --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/deployments-pages-load.spec.ts @@ -0,0 +1,67 @@ +import { test, expect } from '@playwright/test'; + +test('Deployments Overview page loads', async ({ page }) => { + await page.goto('/docs/deployments/'); + await expect(page).toHaveTitle('Deployments | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Azure Static Web Apps Middleware page loads', async ({ page }) => { + await page.goto('/docs/deployments/azure-swa/'); + await expect(page).toHaveTitle('Azure Static Web Apps | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments AWS Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/aws-lambda/'); + await expect(page).toHaveTitle('AWS Lambda | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Firebase Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/firebase/'); + await expect(page).toHaveTitle('Firebase | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Google Cloud Run Middleware page loads', async ({ page }) => { + await page.goto('/docs/deployments/gcp-cloud-run/'); + await expect(page).toHaveTitle('Cloud Run Middleware | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Cloudflare Pages Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/cloudflare-pages/'); + await expect(page).toHaveTitle( + 'Cloudflare Pages Adapter and Middleware | Deployments ๐Ÿ“š Qwik Documentation' + ); +}); + +test('Deployments Deno Middleware page loads', async ({ page }) => { + await page.goto('/docs/deployments/deno/'); + await expect(page).toHaveTitle('Deno Middleware | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Bun Middleware page loads', async ({ page }) => { + await page.goto('/docs/deployments/bun/'); + await expect(page).toHaveTitle('Bun Middleware | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Netlify Edge Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/netlify-edge/'); + await expect(page).toHaveTitle( + 'Netlify Edge Adapter and Middleware | Deployments ๐Ÿ“š Qwik Documentation' + ); +}); + +test('Deployments Node Middleware page loads', async ({ page }) => { + await page.goto('/docs/deployments/node/'); + await expect(page).toHaveTitle('Node Middleware | Deployments ๐Ÿ“š Qwik Documentation'); +}); + +test('Deployments Vercel Edge Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/vercel-edge/'); + await expect(page).toHaveTitle( + 'Vercel Edge Adapter and Middleware | Deployments ๐Ÿ“š Qwik Documentation' + ); +}); + +test('Deployments Static Site Adapter page loads', async ({ page }) => { + await page.goto('/docs/deployments/static/'); + await expect(page).toHaveTitle('Static Site ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/docs-components-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/docs-components-pages-load.spec.ts new file mode 100644 index 00000000000..30def72d593 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/docs-components-pages-load.spec.ts @@ -0,0 +1,43 @@ +import { test, expect } from '@playwright/test'; + +test('Components Overview page loads', async ({ page }) => { + await page.goto('/docs/components/overview/'); + await expect(page).toHaveTitle('Overview | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components State page loads', async ({ page }) => { + await page.goto('/docs/components/state/'); + await expect(page).toHaveTitle('State | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components Tasks and Lifecycle page loads', async ({ page }) => { + await page.goto('/docs/components/tasks/'); + await expect(page).toHaveTitle('Tasks and Lifecycle | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components Context page loads', async ({ page }) => { + await page.goto('/docs/components/context/'); + await expect(page).toHaveTitle('Context | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components Slots page loads', async ({ page }) => { + await page.goto('/docs/components/slots/'); + await expect(page).toHaveTitle('Slots | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components Rendering page loads', async ({ page }) => { + await page.goto('/docs/components/rendering/'); + await expect(page).toHaveTitle('Rendering | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components Styles page loads', async ({ page }) => { + await page.goto('/docs/components/styles/'); + await expect(page).toHaveTitle('Styles | Components ๐Ÿ“š Qwik Documentation'); +}); + +test('Components API Reference page loads', async ({ page }) => { + await page.goto('/api/qwik/'); + + // todo V2: change this to @qwik.dev + await expect(page).toHaveTitle('@builder.io/qwik API Reference ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/guides-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/guides-pages-load.spec.ts new file mode 100644 index 00000000000..27b1279129a --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/guides-pages-load.spec.ts @@ -0,0 +1,43 @@ +import { test, expect } from '@playwright/test'; + +test('Guides Qwik in a nutshell page loads', async ({ page }) => { + await page.goto('/docs/guides/qwik-nutshell/'); + await expect(page).toHaveTitle('Qwik in a nutshell | Introduction ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides MDX page loads', async ({ page }) => { + await page.goto('/docs/guides/mdx/'); + await expect(page).toHaveTitle('Markdown and MDX | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides SSG page loads', async ({ page }) => { + await page.goto('/docs/guides/static-site-generation/'); + await expect(page).toHaveTitle( + 'Static Site Generation (SSG) Overview | Guides ๐Ÿ“š Qwik Documentation' + ); +}); + +test('Guides Capacitor page loads', async ({ page }) => { + await page.goto('/docs/guides/capacitor/'); + await expect(page).toHaveTitle('Qwik Hybrid Native App Overview | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides React Cheat Sheet page loads', async ({ page }) => { + await page.goto('/docs/guides/react-cheat-sheet/'); + await expect(page).toHaveTitle('Qwik for React developers ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides Best Practices page loads', async ({ page }) => { + await page.goto('/docs/guides/best-practices/'); + await expect(page).toHaveTitle('Best Practices | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides Bundle Optimization page loads', async ({ page }) => { + await page.goto('/docs/guides/bundle/'); + await expect(page).toHaveTitle('Bundle Optimization | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Guides Environment Variables page loads', async ({ page }) => { + await page.goto('/docs/guides/env-variables/'); + await expect(page).toHaveTitle('Environment variables | Qwik City ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/integrations-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/integrations-pages-load.spec.ts new file mode 100644 index 00000000000..d580c8457b6 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/integrations-pages-load.spec.ts @@ -0,0 +1,141 @@ +import { test, expect } from '@playwright/test'; + +test('Integrations Overview page loads', async ({ page }) => { + await page.goto('/docs/integrations/'); + await expect(page).toHaveTitle('Qwik City Integrations | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Astro page loads', async ({ page }) => { + await page.goto('/docs/integrations/astro/'); + await expect(page).toHaveTitle('Astro | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Auth.js page loads', async ({ page }) => { + await page.goto('/docs/integrations/authjs/'); + await expect(page).toHaveTitle('Auth.js | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Bootstrap page loads', async ({ page }) => { + await page.goto('/docs/integrations/bootstrap/'); + await expect(page).toHaveTitle('Bootstrap | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Builder.io page loads', async ({ page }) => { + await page.goto('/docs/integrations/builderio/'); + await expect(page).toHaveTitle('Builder.io | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Cypress page loads', async ({ page }) => { + await page.goto('/docs/integrations/cypress/'); + await expect(page).toHaveTitle('Cypress | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Drizzle page loads', async ({ page }) => { + await page.goto('/docs/integrations/drizzle/'); + await expect(page).toHaveTitle('Drizzle | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Internationalization page loads', async ({ page }) => { + await page.goto('/docs/integrations/i18n/'); + await expect(page).toHaveTitle('Internationalization | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Icons page loads', async ({ page }) => { + await page.goto('/docs/integrations/icons/'); + await expect(page).toHaveTitle('Icons | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Image Optimization page loads', async ({ page }) => { + await page.goto('/docs/integrations/image-optimization/'); + await expect(page).toHaveTitle('Image Optimization | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations LeafletJS Map page loads', async ({ page }) => { + await page.goto('/docs/integrations/leaflet-map/'); + await expect(page).toHaveTitle('LeafletJS Map | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Modular Forms page loads', async ({ page }) => { + await page.goto('/docs/integrations/modular-forms/'); + await expect(page).toHaveTitle('Modular Forms | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Nx and enterprise scale monorepos page loads', async ({ page }) => { + await page.goto('/docs/integrations/nx/'); + await expect(page).toHaveTitle('Nx Monorepos | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations OG Image / Open Graph Image page loads', async ({ page }) => { + await page.goto('/docs/integrations/og-img/'); + await expect(page).toHaveTitle('OG Image (og-img) | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Orama page loads', async ({ page }) => { + await page.goto('/docs/integrations/orama/'); + await expect(page).toHaveTitle('Qwik City and Orama ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Panda CSS page loads', async ({ page }) => { + await page.goto('/docs/integrations/panda-css/'); + await expect(page).toHaveTitle('Panda CSS | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Partytown page loads', async ({ page }) => { + await page.goto('/docs/integrations/partytown/'); + await expect(page).toHaveTitle('Partytown | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Playwright page loads', async ({ page }) => { + await page.goto('/docs/integrations/playwright/'); + await expect(page).toHaveTitle('Playwright | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations PostCSS page loads', async ({ page }) => { + await page.goto('/docs/integrations/postcss/'); + await expect(page).toHaveTitle('PostCSS | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Prisma page loads', async ({ page }) => { + await page.goto('/docs/integrations/prisma/'); + await expect(page).toHaveTitle('Prisma | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Qwik React page loads', async ({ page }) => { + await page.goto('/docs/integrations/react/'); + await expect(page).toHaveTitle('React | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Storybook page loads', async ({ page }) => { + await page.goto('/docs/integrations/storybook/'); + await expect(page).toHaveTitle('Storybook | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Styled Vanilla Extract page loads', async ({ page }) => { + await page.goto('/docs/integrations/styled-vanilla-extract/'); + await expect(page).toHaveTitle('Styled Vanilla Extract | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Supabase page loads', async ({ page }) => { + await page.goto('/docs/integrations/supabase/'); + await expect(page).toHaveTitle('Supabase | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Tailwind page loads', async ({ page }) => { + await page.goto('/docs/integrations/tailwind/'); + await expect(page).toHaveTitle('Tailwind | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Tauri page loads', async ({ page }) => { + await page.goto('/docs/integrations/tauri/'); + await expect(page).toHaveTitle('Tauri | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Turso page loads', async ({ page }) => { + await page.goto('/docs/integrations/turso/'); + await expect(page).toHaveTitle('Turso | Integrations ๐Ÿ“š Qwik Documentation'); +}); + +test('Integrations Vitest page loads', async ({ page }) => { + await page.goto('/docs/integrations/vitest/'); + await expect(page).toHaveTitle('Vitest | Integrations ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/navBarOnMobile.spec.ts b/e2e/docs-e2e/tests/Docs/navBarOnMobile.spec.ts new file mode 100644 index 00000000000..5975f4c1482 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/navBarOnMobile.spec.ts @@ -0,0 +1,40 @@ +import { test, expect, devices } from '@playwright/test'; + +test.use({ + ...devices['iPhone 13'], +}); + +test('navbar on mobile', async ({ page }) => { + await page.goto('/'); + const openIcon = page.locator('.mobile-menu > .more-icon > svg'); + const closeIcon = page.locator('.mobile-menu > .close-icon > svg'); + const navToolKit = page.locator('.menu-toolkit'); + const body = page.locator('body'); + + expect(body).not.toHaveClass('header-open'); + await expect(openIcon).toBeVisible(); + await openIcon.click(); + expect(body).toHaveClass('header-open'); + await expect(closeIcon).toBeVisible(); + + await expect(navToolKit).toBeVisible(); + const menuItems = await page.locator('.menu-toolkit > li > a').allTextContents(); + const expectedMenuLinks = [ + 'Docs', + 'Ecosystem', + 'Tutorial', + 'Qwik Sandbox', + 'Blog', + 'GitHub', + '@QwikDev', + 'Discord', + ]; + + expect(menuItems).toStrictEqual(expectedMenuLinks); + + await closeIcon.click(); + expect(body).not.toHaveClass('header-open'); + await expect(closeIcon).not.toBeVisible(); + await expect(openIcon).toBeVisible(); + await expect(navToolKit).not.toBeVisible(); +}); diff --git a/e2e/docs-e2e/tests/Docs/pages-load-test.spec.ts b/e2e/docs-e2e/tests/Docs/pages-load-test.spec.ts new file mode 100644 index 00000000000..525ca4c0d90 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/pages-load-test.spec.ts @@ -0,0 +1,255 @@ +import { test, expect } from '@playwright/test'; + +test('home page loads', async ({ page }) => { + await page.goto('/'); + await expect(page).toHaveTitle('Framework reimagined for the edge! ๐Ÿ“š Qwik Documentation'); +}); + +test('docs page loads', async ({ page }) => { + await page.goto('/docs/'); + + await expect(page).toHaveTitle('Overview | Introduction ๐Ÿ“š Qwik Documentation'); + + const introductionLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Introduction")) ul li a') + .allTextContents(); + + const expectedIntroductionLinks = ['Overview', 'Getting Started', 'Project structure', 'FAQ']; + + expect(introductionLinksOnPage).toStrictEqual(expectedIntroductionLinks); + + const componentsLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Components")) ul li a') + .allTextContents(); + + const expectedComponentLinks = [ + 'Overview', + 'State', + 'Events', + 'Tasks & Lifecycle', + 'Context', + 'Slots', + 'Rendering', + 'Styling', + 'API Reference', + ]; + + expect(componentsLinksOnPage).toStrictEqual(expectedComponentLinks); + + const qwikCityLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Qwik City")) ul li a') + .allTextContents(); + + const expectedQwikCityLinks = [ + 'Overview', + 'Routing', + 'Pages', + 'Layouts', + 'Loaders', + 'Actions', + 'Validators', + 'Endpoints', + 'Middleware', + 'server$', + 'Error handling', + 'Re-exporting loaders', + 'Caching', + 'HTML attributes', + 'API reference', + ]; + + expect(qwikCityLinksOnPage).toStrictEqual(expectedQwikCityLinks); + + const cookbookLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Cookbook")) ul li a') + .allTextContents(); + + const expectedCookbookLinks = [ + 'Overview', + 'Algolia Search', + 'Combine Handlers', + 'Debouncer', + 'Fonts', + 'Glob Import', + 'Media Controller', + 'NavLink', + 'Node Docker deploy', + 'Portals', + 'Streaming loaders', + 'Sync events w state', + 'Theme Management', + 'Drag & Drop', + 'View Transition', + ]; + + // if you are adding a new page to the cookbook, please add a new test for the page to load too + expect(cookbookLinksOnPage).toStrictEqual(expectedCookbookLinks); + + const integrationsLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Integrations")) ul li a') + .allTextContents(); + + const expectedIntegrationsLinks = [ + 'Overview', + 'Astro', + 'Auth.js', + 'Bootstrap', + 'Builder.io', + 'Cypress', + 'Drizzle', + 'i18n', + 'Icons', + 'Image Optimization', + 'Leaflet Map', + 'Modular Forms', + 'Nx Monorepos', + 'OG Image', + 'Orama', + 'Panda CSS', + 'Partytown', + 'Playwright', + 'PostCSS', + 'Prisma', + 'React', + 'Storybook', + 'Styled Vanilla Extract', + 'Supabase', + 'Tailwind', + 'Tauri', + 'Turso', + 'Vitest', + ]; + + expect(integrationsLinksOnPage).toStrictEqual(expectedIntegrationsLinks); + + const deploymentsLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Deployments")) ul li a') + .allTextContents(); + + const expectedDeploymentsLinks = [ + 'Overview', + 'Azure SWA', + 'AWS', + 'Firebase', + 'Google Cloud Run', + 'Cloudflare Pages', + 'Deno', + 'Bun', + 'Netlify Edge', + 'Node', + 'Vercel Edge', + 'Static Site', + ]; + + expect(deploymentsLinksOnPage).toStrictEqual(expectedDeploymentsLinks); + + const guidesLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Guides")) ul li a') + .allTextContents(); + + const expectedGuidesLinks = [ + 'Qwik in a nutshell', + 'Markdown & MDX', + 'SSG', + 'Qwik Native Apps', + 'React Cheat Sheet', + 'Best Practices', + 'Bundle Optimization', + 'Env variables', + ]; + + expect(guidesLinksOnPage).toStrictEqual(expectedGuidesLinks); + + const conceptsLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Concepts")) ul li a') + .allTextContents(); + + const expectedConceptsLinks = ['Think Qwik', 'Resumable', 'Progressive', 'Reactivity']; + + expect(conceptsLinksOnPage).toStrictEqual(expectedConceptsLinks); + + const advancedLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Advanced")) ul li a') + .allTextContents(); + + const expectedAdvancedLinks = [ + 'The $ dollar sign', + 'Containers', + 'QRL', + 'Library mode', + 'Qwikloader', + 'Optimizer', + 'Modules Prefetching', + 'Build Directory', + 'Vite', + 'Advanced Routing', + 'Qwik Plugins', + 'Request Handling', + 'Speculative Module Fetching', + 'Menus', + 'Static Assets', + 'Sitemaps', + 'ESLint-Rules', + 'Content Security Policy', + 'Complex Forms', + ]; + + expect(advancedLinksOnPage).toStrictEqual(expectedAdvancedLinks); + + const referenceLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Reference")) ul li a') + .allTextContents(); + + const expectedReferenceLinks = ['API Reference', 'Deprecated Features']; + + expect(referenceLinksOnPage).toStrictEqual(expectedReferenceLinks); + + const qwikLabsLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Qwik Labs ๐Ÿงช")) ul li a') + .allTextContents(); + + const expectedQwikLabsLinks = [ + 'Overview', + 'Insights', + 'Typed Routes', + 'Devtools', + 'usePreventNavigate', + ]; + + expect(qwikLabsLinksOnPage).toStrictEqual(expectedQwikLabsLinks); + + const communityLinksOnPage = await page + .locator('#qwik-sidebar') + .locator('details:has(summary h5:text("Community")) ul li a') + .allTextContents(); + + const expectedCommunityLinks = ['GitHub', '@QwikDev', 'Discord', 'Community Projects', 'Values']; + + expect(communityLinksOnPage).toStrictEqual(expectedCommunityLinks); +}); + +test('getting started page loads', async ({ page }) => { + await page.goto('/docs/getting-started/'); + await expect(page).toHaveTitle('Getting Started | Introduction ๐Ÿ“š Qwik Documentation'); +}); + +test('Project Structure page loads', async ({ page }) => { + await page.goto('/docs/project-structure/'); + await expect(page).toHaveTitle('Project Structure | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('FAQ page loads', async ({ page }) => { + await page.goto('/docs/faq/'); + await expect(page).toHaveTitle('Frequently Asked Questions | Introduction ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/qwik-city-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/qwik-city-pages-load.spec.ts new file mode 100644 index 00000000000..23ad08e0d91 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/qwik-city-pages-load.spec.ts @@ -0,0 +1,68 @@ +// todo V2: rename file to qwik-router-pages-load.spec.ts +// todo V2: replace all instances of Qwik City with Qwik Router +import { test, expect } from '@playwright/test'; + +test('Qwik City Overview page loads', async ({ page }) => { + await page.goto('/docs/qwikcity/'); + await expect(page).toHaveTitle('Overview | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Routing page loads', async ({ page }) => { + await page.goto('/docs/routing/'); + await expect(page).toHaveTitle('Routing | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Pages page loads', async ({ page }) => { + await page.goto('/docs/pages/'); + await expect(page).toHaveTitle('Pages | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Layout page loads', async ({ page }) => { + await page.goto('/docs/layout/'); + await expect(page).toHaveTitle('Layout & Middleware | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Route Loader page loads', async ({ page }) => { + await page.goto('/docs/route-loader/'); + await expect(page).toHaveTitle('RouteLoader$ | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Route Action page loads', async ({ page }) => { + await page.goto('/docs/action/'); + await expect(page).toHaveTitle('RouteAction$ | QwikCity ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Endpoints page loads', async ({ page }) => { + await page.goto('/docs/endpoints/'); + await expect(page).toHaveTitle('Endpoints | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Middleware page loads', async ({ page }) => { + await page.goto('/docs/middleware/'); + await expect(page).toHaveTitle('Middleware | Guides ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City server$ page loads', async ({ page }) => { + await page.goto('/docs/server$/'); + await expect(page).toHaveTitle('server$ | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Error Handling page loads', async ({ page }) => { + await page.goto('/docs/error-handling/'); + await expect(page).toHaveTitle('Error handling | Qwik City ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City Re-exporting Loaders page loads', async ({ page }) => { + await page.goto('/docs/re-exporting-loaders/'); + await expect(page).toHaveTitle('Cookbook | Re-exporting loaders ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City HTML Attributes page loads', async ({ page }) => { + await page.goto('/docs/html-attributes/'); + await expect(page).toHaveTitle('HTML attributes | QwikCity ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik City API Reference page loads', async ({ page }) => { + await page.goto('/docs/api/'); + await expect(page).toHaveTitle('API Reference | Qwik City ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/qwik-labs-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/qwik-labs-pages-load.spec.ts new file mode 100644 index 00000000000..0678a0b83c5 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/qwik-labs-pages-load.spec.ts @@ -0,0 +1,16 @@ +import { test, expect } from '@playwright/test'; + +test('Qwik Labs Overview page loads', async ({ page }) => { + await page.goto('/docs/labs/'); + await expect(page).toHaveTitle('๐Ÿงช Qwik Labs | Overview ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik Labs Insights page loads', async ({ page }) => { + await page.goto('/docs/labs/insights/'); + await expect(page).toHaveTitle('๐Ÿงช Insights | Qwik Labs ๐Ÿ“š Qwik Documentation'); +}); + +test('Qwik Labs usePreventNavigate page loads', async ({ page }) => { + await page.goto('/docs/labs/usePreventNavigate/'); + await expect(page).toHaveTitle('๐Ÿงช usePreventNavigate | Qwik Labs ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/reference-pages-load.spec.ts b/e2e/docs-e2e/tests/Docs/reference-pages-load.spec.ts new file mode 100644 index 00000000000..39522964311 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/reference-pages-load.spec.ts @@ -0,0 +1,11 @@ +import { test, expect } from '@playwright/test'; + +test('API Reference page loads', async ({ page }) => { + await page.goto('/api/'); + await expect(page).toHaveTitle('Qwik - Framework reimagined for the edge'); +}); + +test('API Reference Deprecated Features page loads', async ({ page }) => { + await page.goto('/docs/deprecated-features/'); + await expect(page).toHaveTitle('Deprecated Features | Guides ๐Ÿ“š Qwik Documentation'); +}); diff --git a/e2e/docs-e2e/tests/Docs/searchBar.spec.ts b/e2e/docs-e2e/tests/Docs/searchBar.spec.ts new file mode 100644 index 00000000000..8c00aeaa0e5 --- /dev/null +++ b/e2e/docs-e2e/tests/Docs/searchBar.spec.ts @@ -0,0 +1,29 @@ +import { test, expect } from '@playwright/test'; + +test('search bar with click results', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Search' }).click(); + await page.getByPlaceholder('Search docs').fill('getting started qwikly'); + await page.waitForSelector('.DocSearch-Hit', { timeout: 5000 }); + const countOfSearchResults = await page.locator('.DocSearch-Hit').count(); + expect(countOfSearchResults).toBeGreaterThan(0); + await page.getByRole('link', { name: 'Getting Started Qwikly', exact: true }).click(); + await expect(page).toHaveURL('docs/getting-started/#getting-started-qwikly'); +}); + +test('search with no results', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Search' }).click(); + await page.getByPlaceholder('Search docs').fill('xyz123nonexistentquery'); + await page.waitForTimeout(1000); + const noResults = page.locator('.DocSearch-NoResults, .DocSearch-EmptyState'); + await expect(noResults).toBeVisible(); +}); + +test('search bar opens and closes', async ({ page }) => { + await page.goto('/'); + await page.getByRole('button', { name: 'Search' }).click(); + await expect(page.getByPlaceholder('Search docs')).toBeVisible(); + await page.keyboard.press('Escape'); + await expect(page.getByPlaceholder('Search docs')).not.toBeVisible(); +}); diff --git a/e2e/docs-e2e/tests/Ecosystem/ecosystem-pages-load.spec.ts b/e2e/docs-e2e/tests/Ecosystem/ecosystem-pages-load.spec.ts new file mode 100644 index 00000000000..9f6cf8ea22e --- /dev/null +++ b/e2e/docs-e2e/tests/Ecosystem/ecosystem-pages-load.spec.ts @@ -0,0 +1,13 @@ +import { test, expect } from '@playwright/test'; + +test('Ecosystem page loads', async ({ page }) => { + await page.goto('/ecosystem//'); + await expect(page).toHaveTitle('Qwik Ecosystem ๐Ÿ“š Qwik Documentation'); +}); + +test('Ecosystem Media Blogs Page loads', async ({ page }) => { + await page.goto('/media/'); + await expect(page).toHaveTitle( + 'Qwik Presentations, Talks, Videos and Podcasts ๐Ÿ“š Qwik Documentation' + ); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f9d91f1372..b37866a17b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -243,6 +243,15 @@ importers: e2e/adapters-e2e: {} + e2e/docs-e2e: + devDependencies: + '@playwright/test': + specifier: ^1.50.1 + version: 1.50.1 + '@types/node': + specifier: ^24.0.13 + version: 24.0.14 + e2e/qwik-cli-e2e: dependencies: kleur: @@ -325,7 +334,7 @@ importers: version: 2.49.4 '@tailwindcss/vite': specifier: 4.0.12 - version: 4.0.12(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)) + version: 4.0.12(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)) '@types/leaflet': specifier: 1.9.12 version: 1.9.12 @@ -409,13 +418,13 @@ importers: version: 0.33.3 vite: specifier: 5.3.5 - version: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + version: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) vite-plugin-inspect: specifier: 0.8.5 - version: 0.8.5(rollup@4.39.0)(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)) + version: 0.8.5(rollup@4.39.0)(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)) + version: 4.3.2(typescript@5.4.5)(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)) wrangler: specifier: 3.65.1 version: 3.65.1 @@ -776,7 +785,7 @@ importers: version: 5.4.5 vite: specifier: 5.3.5 - version: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + version: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) packages/qwik-worker: devDependencies: @@ -785,10 +794,10 @@ importers: version: link:../qwik vite: specifier: 5.3.5 - version: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + version: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) vite-plugin-static-copy: specifier: 1.0.6 - version: 1.0.6(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)) + version: 1.0.6(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)) packages/supabase-auth-helpers-qwik: devDependencies: @@ -3627,6 +3636,9 @@ packages: '@types/node@20.14.11': resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + '@types/node@24.0.14': + resolution: {integrity: sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -9657,6 +9669,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -11601,7 +11616,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -12850,6 +12865,14 @@ snapshots: tailwindcss: 4.0.12 vite: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + '@tailwindcss/vite@4.0.12(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3))': + dependencies: + '@tailwindcss/node': 4.0.12 + '@tailwindcss/oxide': 4.0.12 + lightningcss: 1.30.1 + tailwindcss: 4.0.12 + vite: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) + '@tokenizer/token@0.3.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -12876,11 +12899,11 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/brotli@1.3.4': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/bun@1.1.6': dependencies: @@ -12888,13 +12911,13 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/cookie@0.6.0': {} '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/debug@4.1.12': dependencies: @@ -12912,7 +12935,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -12940,7 +12963,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/istanbul-lib-coverage@2.0.6': {} @@ -12970,7 +12993,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/node@12.20.55': {} @@ -12982,6 +13005,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@24.0.14': + dependencies: + undici-types: 7.8.0 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -12994,7 +13021,7 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 kleur: 3.0.3 '@types/prop-types@15.7.14': {} @@ -13027,17 +13054,17 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/send': 0.17.4 '@types/set-cookie-parser@2.4.10': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/tmp@0.2.6': {} @@ -13051,11 +13078,11 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/ws@8.5.14': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 '@types/yargs-parser@21.0.3': {} @@ -13069,7 +13096,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.11 + '@types/node': 24.0.14 optional: true '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.4.5))(eslint@9.25.1(jiti@2.4.2))(typescript@5.4.5)': @@ -20157,6 +20184,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@7.8.0: {} + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -20396,7 +20425,7 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.8.5(rollup@4.39.0)(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)): + vite-plugin-inspect@0.8.5(rollup@4.39.0)(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.4(rollup@4.39.0) @@ -20407,18 +20436,18 @@ snapshots: perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.0.4 - vite: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + vite: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) transitivePeerDependencies: - rollup - supports-color - vite-plugin-static-copy@1.0.6(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)): + vite-plugin-static-copy@1.0.6(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.3 fs-extra: 11.3.0 picocolors: 1.1.1 - vite: 5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3) + vite: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.3.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3)): dependencies: @@ -20431,6 +20460,17 @@ snapshots: - supports-color - typescript + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3)): + dependencies: + debug: 4.4.1(supports-color@9.4.0) + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.4.5) + optionalDependencies: + vite: 5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3) + transitivePeerDependencies: + - supports-color + - typescript + vite@4.5.14(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3): dependencies: esbuild: 0.18.20 @@ -20453,6 +20493,17 @@ snapshots: lightningcss: 1.30.1 terser: 5.31.3 + vite@5.3.5(@types/node@24.0.14)(lightningcss@1.30.1)(terser@5.31.3): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.39.0 + optionalDependencies: + '@types/node': 24.0.14 + fsevents: 2.3.3 + lightningcss: 1.30.1 + terser: 5.31.3 + vitest@2.0.5(@types/node@20.14.11)(lightningcss@1.30.1)(terser@5.31.3): dependencies: '@ampproject/remapping': 2.3.0