diff --git a/.e2e/augments.d.ts b/.e2e/augments.d.ts index 23c44ae..1662935 100644 --- a/.e2e/augments.d.ts +++ b/.e2e/augments.d.ts @@ -1,4 +1,4 @@ -import { useNuxtApp } from 'nuxt/app' +import type { useNuxtApp } from 'nuxt/app' declare global { interface Window { diff --git a/.e2e/package.json b/.e2e/package.json index e240b59..9a5767e 100644 --- a/.e2e/package.json +++ b/.e2e/package.json @@ -9,6 +9,6 @@ "ui": "playwright test --ui" }, "devDependencies": { - "@playwright/test": "1.47.2" + "@playwright/test": "1.48.0" } } diff --git a/.e2e/playwright.config.ts b/.e2e/playwright.config.ts index b401bc1..1efdd7b 100644 --- a/.e2e/playwright.config.ts +++ b/.e2e/playwright.config.ts @@ -1,19 +1,19 @@ -import { defineConfig, devices } from "@playwright/test" +import { defineConfig, devices } from '@playwright/test' /** * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ - testDir: "./tests", + testDir: './tests', fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 3 : 1, workers: process.env.CI ? 1 : undefined, - reporter: [["html", { open: "never" }]], - snapshotPathTemplate: "{testDir}/../__snapshots__/{testFilePath}/{arg}{ext}", + reporter: [['html', { open: 'never' }]], + snapshotPathTemplate: '{testDir}/../__snapshots__/{testFilePath}/{arg}{ext}', use: { - trace: "on-first-retry", - screenshot: "only-on-failure", + trace: 'on-first-retry', + screenshot: 'only-on-failure', }, expect: { toHaveScreenshot: { @@ -22,8 +22,8 @@ export default defineConfig({ }, projects: [ { - name: "chromium", - use: { ...devices["Desktop Chrome"] }, + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, }, ], }) diff --git a/.e2e/tests/advanced/config-extends.spec.ts b/.e2e/tests/advanced/config-extends.spec.ts index 9a6faa1..ffcfed1 100644 --- a/.e2e/tests/advanced/config-extends.spec.ts +++ b/.e2e/tests/advanced/config-extends.spec.ts @@ -1,78 +1,78 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('config-extends')) -test("App config merged", async ({ page }) => { +test('App config merged', async ({ page }) => { // TODO need a unique locator - await page.goto("/") + await page.goto('/') await expect( page.getByText( - '"bar": "user", "baz": "base", "array": [ "user", "user", "user" ], "arrayNested": { "nested": { "array": [ "base", "base", "base" ] } }, "foo": "user" }' - ) + '"bar": "user", "baz": "base", "array": [ "user", "user", "user" ], "arrayNested": { "nested": { "array": [ "base", "base", "base" ] } }, "foo": "user" }', + ), ).toBeVisible() }) -test.fixme("Runtime config is shown", async ({ page }) => { +test.fixme('Runtime config is shown', async () => { // TODO it is not shown }) -test("Base button is shown", async ({ page }) => { - await page.goto("/") +test('Base button is shown', async ({ page }) => { + await page.goto('/') await expect( - page.getByRole("button", { name: "Base Button" }) - ).toHaveAttribute("role", "button") + page.getByRole('button', { name: 'Base Button' }), + ).toHaveAttribute('role', 'button') }) -test("Fancy button from base layer is overridden", async ({ page }) => { - await page.goto("/") - await expect(page.getByRole("button", { name: "Fancy Button" })).toHaveClass( - "border p-2 fancy-button" +test('Fancy button from base layer is overridden', async ({ page }) => { + await page.goto('/') + await expect(page.getByRole('button', { name: 'Fancy Button' })).toHaveClass( + 'border p-2 fancy-button', ) }) -test("UI button is shown", async ({ page }) => { - await page.goto("/") - await expect(page.getByRole("button", { name: "UI Button" })).toHaveClass( - "ui-button" +test('UI button is shown', async ({ page }) => { + await page.goto('/') + await expect(page.getByRole('button', { name: 'UI Button' })).toHaveClass( + 'ui-button', ) }) test('"useFoo()" composable and "getBar()" util is usable from base layer', async ({ page, }) => { - await page.goto("/") - await expect(page.getByText("foo bar")).toBeVisible() + await page.goto('/') + await expect(page.getByText('foo bar')).toBeVisible() }) -test("Plugin from base layer is registered", async ({ page }) => { - await page.goto("/") +test('Plugin from base layer is registered', async ({ page }) => { + await page.goto('/') await expect( - page.getByText("String generated from my auto-imported plugin!") + page.getByText('String generated from my auto-imported plugin!'), ).toBeVisible() }) test('"api/hello" endpoint works', async ({ page }) => { - await page.goto("/api/hello") - await expect(page.getByText("hello")).toBeVisible() + await page.goto('/api/hello') + await expect(page.getByText('hello')).toBeVisible() }) test('"api/base" endpoint works', async ({ page }) => { - await page.goto("/api/base") - await expect(page.getByText("base")).toBeVisible() + await page.goto('/api/base') + await expect(page.getByText('base')).toBeVisible() }) -test("page inherited from base layer loads", async ({ page }) => { - await page.goto("/foo") - await expect(page.getByText("Hello from extended page !")).toBeVisible() +test('page inherited from base layer loads', async ({ page }) => { + await page.goto('/foo') + await expect(page.getByText('Hello from extended page !')).toBeVisible() }) -test("Middleware for inherited page loads", async ({ page }) => { - const inheritedMiddlewareLoggedPromise = page.waitForEvent("console", { - predicate: (message) => - message.text() === "Hello from extended middleware !", +test('Middleware for inherited page loads', async ({ page }) => { + const inheritedMiddlewareLoggedPromise = page.waitForEvent('console', { + predicate: message => + message.text() === 'Hello from extended middleware !', }) - await page.goto("/foo") + await page.goto('/foo') await inheritedMiddlewareLoggedPromise }) diff --git a/.e2e/tests/advanced/error-handling.spec.ts b/.e2e/tests/advanced/error-handling.spec.ts index 94f5355..285328f 100644 --- a/.e2e/tests/advanced/error-handling.spec.ts +++ b/.e2e/tests/advanced/error-handling.spec.ts @@ -1,126 +1,127 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect, Page } from "@playwright/test" +import type { Page } from '@playwright/test' +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('error-handling')) -test("Home page loads without any errors", async ({ page }) => { - await page.goto("/") - await expect(page.getByText("Current route: /")).toBeVisible() +test('Home page loads without any errors', async ({ page }) => { + await page.goto('/') + await expect(page.getByText('Current route: /')).toBeVisible() }) -test("Error in setup() runs the global error handler and vue:error hook", async ({ +test('Error in setup() runs the global error handler and vue:error hook', async ({ page, }) => { const globalErrorHandlerPromise = waitForGlobalErrorHandlerToRan(page) const vueErrorHookPromise = waitForVueErrorHookToRan(page) - await page.goto("?setup") + await page.goto('?setup') await globalErrorHandlerPromise await vueErrorHookPromise }) -test("Error in mounted() runs the global error handler and vue:error hook", async ({ +test('Error in mounted() runs the global error handler and vue:error hook', async ({ page, }) => { const globalErrorHandlerPromise = waitForGlobalErrorHandlerToRan(page) const vueErrorHookPromise = waitForVueErrorHookToRan(page) - await page.goto("?mounted") + await page.goto('?mounted') await globalErrorHandlerPromise await vueErrorHookPromise }) -test("404 error triggers app:error hook and navigates to the error page", async ({ +test('404 error triggers app:error hook and navigates to the error page', async ({ page, }) => { - await page.goto("/") + await page.goto('/') const appErrorHookPromise = waitForAppErrorHookToRan(page) - await page.getByRole("link", { name: "404" }).click() + await page.getByRole('link', { name: '404' }).click() await appErrorHookPromise await expect( - page.getByRole("heading", { name: "Page not found: /404" }) + page.getByRole('heading', { name: 'Page not found: /404' }), ).toBeVisible() - await expect(page.getByText("There was an error")).toBeVisible() + await expect(page.getByText('There was an error')).toBeVisible() }) -test("Clearing the error on the 404 page navigates home", async ({ page }) => { - await page.goto("/404") +test('Clearing the error on the 404 page navigates home', async ({ page }) => { + await page.goto('/404') - await page.getByRole("button", { name: "Clear error" }).click() + await page.getByRole('button', { name: 'Clear error' }).click() - await expect(page.getByRole("link", { name: "Home" })).toBeVisible() + await expect(page.getByRole('link', { name: 'Home' })).toBeVisible() }) test('Clicking on "Navigate home" on the 404 page navigates home', async ({ page, }) => { - await page.goto("/404") + await page.goto('/404') - await page.getByRole("link", { name: "Navigate home" }).click() + await page.getByRole('link', { name: 'Navigate home' }).click() - await expect(page.getByRole("link", { name: "Home" })).toBeVisible() + await expect(page.getByRole('link', { name: 'Home' })).toBeVisible() }) -test("Error in middleware navigates to the error page and triggers the app:error hook", async ({ +test('Error in middleware navigates to the error page and triggers the app:error hook', async ({ page, }) => { - await page.goto("/") + await page.goto('/') const appErrorHookPromise = waitForAppErrorHookToRan(page) - await page.getByRole("link", { name: "Middleware" }).click() + await page.getByRole('link', { name: 'Middleware' }).click() await appErrorHookPromise await expect( - page.getByRole("heading", { name: "error in middleware" }) + page.getByRole('heading', { name: 'error in middleware' }), ).toBeVisible() - await expect(page.getByText("There was an error")).toBeVisible() + await expect(page.getByText('There was an error')).toBeVisible() }) test('Clicking on the "Trigger fatal error" button navigates to the error page and triggers the app:error hook', async ({ page, }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) const appErrorHookPromise = waitForAppErrorHookToRan(page) - await page.getByRole("button", { name: "Trigger fatal error" }).click() + await page.getByRole('button', { name: 'Trigger fatal error' }).click() await appErrorHookPromise - await expect(page.getByText("There was an error")).toBeVisible() + await expect(page.getByText('There was an error')).toBeVisible() }) -test("Triggering non-fatal error with button runs the global error handler and vue:error hook", async ({ +test('Triggering non-fatal error with button runs the global error handler and vue:error hook', async ({ page, }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) const globalErrorHandlerPromise = waitForGlobalErrorHandlerToRan(page) const vueErrorHookPromise = waitForVueErrorHookToRan(page) - await page.getByRole("button", { name: "Trigger non-fatal error" }).click() + await page.getByRole('button', { name: 'Trigger non-fatal error' }).click() await globalErrorHandlerPromise await vueErrorHookPromise }) function waitForGlobalErrorHandlerToRan(page: Page) { - return page.waitForEvent("console", { - predicate: (message) => message.text() === "global error handler", + return page.waitForEvent('console', { + predicate: message => message.text() === 'global error handler', }) } function waitForVueErrorHookToRan(page: Page) { - return page.waitForEvent("console", { - predicate: (message) => message.text() === "vue:error", + return page.waitForEvent('console', { + predicate: message => message.text() === 'vue:error', }) } function waitForAppErrorHookToRan(page: Page) { - return page.waitForEvent("console", { - predicate: (message) => message.text() === "app:error", + return page.waitForEvent('console', { + predicate: message => message.text() === 'app:error', }) } diff --git a/.e2e/tests/advanced/jsx.spec.ts b/.e2e/tests/advanced/jsx.spec.ts index 11d78c8..83f7d4c 100644 --- a/.e2e/tests/advanced/jsx.spec.ts +++ b/.e2e/tests/advanced/jsx.spec.ts @@ -1,17 +1,17 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('jsx')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Inline components load", async ({ page }) => { - await expect(page.getByText("Nuxt 3")).toBeVisible() +test('Inline components load', async ({ page }) => { + await expect(page.getByText('Nuxt 3')).toBeVisible() }) test('JSX component from "component" folder loads', async ({ page }) => { await expect( - page.getByText("This is an external JSX component") + page.getByText('This is an external JSX component'), ).toBeVisible() }) diff --git a/.e2e/tests/advanced/locale.spec.ts b/.e2e/tests/advanced/locale.spec.ts index 27ff8a6..73e1383 100644 --- a/.e2e/tests/advanced/locale.spec.ts +++ b/.e2e/tests/advanced/locale.spec.ts @@ -1,44 +1,44 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('locale')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) }) -test.describe("British Locale", () => { +test.describe('British Locale', () => { test.use({ - locale: "en-GB", + locale: 'en-GB', }) - test("Date is in british format", async ({ page }) => { - await expect(page.getByText("Wednesday 26 October 2016")).toBeVisible() + test('Date is in british format', async ({ page }) => { + await expect(page.getByText('Wednesday 26 October 2016')).toBeVisible() }) - test("British locale has been selected", async ({ page }) => { - await expect(page.getByRole("combobox")).toHaveValue("en-GB") + test('British locale has been selected', async ({ page }) => { + await expect(page.getByRole('combobox')).toHaveValue('en-GB') }) - test("Changing locales works", async ({ page }) => { - await page.getByRole("combobox").selectOption("ko-KR") - await expect(page.getByText("2016년 10월 26일 수요일")).toBeVisible() + test('Changing locales works', async ({ page }) => { + await page.getByRole('combobox').selectOption('ko-KR') + await expect(page.getByText('2016년 10월 26일 수요일')).toBeVisible() - await page.getByRole("combobox").selectOption("fa-IR") - await expect(page.getByText("۱۳۹۵ آبان ۵, چهارشنبه")).toBeVisible() + await page.getByRole('combobox').selectOption('fa-IR') + await expect(page.getByText('۱۳۹۵ آبان ۵, چهارشنبه')).toBeVisible() }) }) -test.describe("US Locale", () => { +test.describe('US Locale', () => { test.use({ - locale: "en-US", + locale: 'en-US', }) - test("Date is in US format", async ({ page }) => { - await expect(page.getByText("Wednesday, October 26, 2016")).toBeVisible() + test('Date is in US format', async ({ page }) => { + await expect(page.getByText('Wednesday, October 26, 2016')).toBeVisible() }) - test("US locale has been selected", async ({ page }) => { - await expect(page.getByRole("combobox")).toHaveValue("en-US") + test('US locale has been selected', async ({ page }) => { + await expect(page.getByRole('combobox')).toHaveValue('en-US') }) }) diff --git a/.e2e/tests/advanced/module-extend-pages.spec.ts b/.e2e/tests/advanced/module-extend-pages.spec.ts index 5020297..7d4d7dd 100644 --- a/.e2e/tests/advanced/module-extend-pages.spec.ts +++ b/.e2e/tests/advanced/module-extend-pages.spec.ts @@ -1,16 +1,16 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('module-extend-pages')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) }) -test("Page that has been added by a module works", async ({ page }) => { - await page.getByRole("link", { name: "Test Page" }).click() - await expect(page.getByText("Test page added by module")).toBeVisible() +test('Page that has been added by a module works', async ({ page }) => { + await page.getByRole('link', { name: 'Test Page' }).click() + await expect(page.getByText('Test page added by module')).toBeVisible() - await page.getByRole("link", { name: "Homepage" }).click() - await expect(page.getByText("Go to Test Page")).toBeVisible() + await page.getByRole('link', { name: 'Homepage' }).click() + await expect(page.getByText('Go to Test Page')).toBeVisible() }) diff --git a/.e2e/tests/advanced/use-cookie.spec.ts b/.e2e/tests/advanced/use-cookie.spec.ts index 5589ce1..6b73a7c 100644 --- a/.e2e/tests/advanced/use-cookie.spec.ts +++ b/.e2e/tests/advanced/use-cookie.spec.ts @@ -1,71 +1,70 @@ -import { withoutProtocol } from "ufo" -import { addCookies, addForcedCookie, getSettingsForDeployment, wait } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { addCookies, addForcedCookie, getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('use-cookie')) -test("Login screen shows by default", async ({ page }) => { - await page.goto("/") - await expect(page.getByRole("heading", { name: "Login" })).toBeVisible() +test('Login screen shows by default', async ({ page }) => { + await page.goto('/') + await expect(page.getByRole('heading', { name: 'Login' })).toBeVisible() }) -test("Logging in multiple times increases counter", async ({ page }) => { - await page.goto("/") +test('Logging in multiple times increases counter', async ({ page }) => { + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByPlaceholder("Enter your name...").fill("Nuxt") - await page.getByRole("button", { name: "Log in" }).click() + await page.getByPlaceholder('Enter your name...').fill('Nuxt') + await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByText("You have logged in 1 times!")).toBeVisible() - await page.getByRole("button", { name: "Log out" }).click() + await expect(page.getByText('You have logged in 1 times!')).toBeVisible() + await page.getByRole('button', { name: 'Log out' }).click() - await page.getByPlaceholder("Enter your name...").press("Control+a") - await page.getByPlaceholder("Enter your name...").fill("Nuxt") - await page.getByRole("button", { name: "Log in" }).click() + await page.getByPlaceholder('Enter your name...').press('Control+a') + await page.getByPlaceholder('Enter your name...').fill('Nuxt') + await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByText("You have logged in 2 times!")).toBeVisible() - await page.getByRole("button", { name: "Log out" }).click() + await expect(page.getByText('You have logged in 2 times!')).toBeVisible() + await page.getByRole('button', { name: 'Log out' }).click() - await page.getByPlaceholder("Enter your name...").press("Control+a") - await page.getByPlaceholder("Enter your name...").fill("Nuxt") - await page.getByRole("button", { name: "Log in" }).click() + await page.getByPlaceholder('Enter your name...').press('Control+a') + await page.getByPlaceholder('Enter your name...').fill('Nuxt') + await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByText("You have logged in 3 times!")).toBeVisible() + await expect(page.getByText('You have logged in 3 times!')).toBeVisible() }) -test("Automatic login with existing cookies", async ({ context, page }) => { +test('Automatic login with existing cookies', async ({ context, page }) => { await addCookies(context, 'use-cookie', [ { - name: "user", + name: 'user', value: '{"name":"Nuxt"}', }, { - name: "logins", - value: "1", + name: 'logins', + value: '1', }, ]) - await page.goto("/") + await page.goto('/') - await expect(page.getByRole("heading", { name: "Welcome, Nuxt! 👋" })).toBeVisible() - await expect(page.getByText("You have logged in 1 times!")).toBeVisible() + await expect(page.getByRole('heading', { name: 'Welcome, Nuxt! 👋' })).toBeVisible() + await expect(page.getByText('You have logged in 1 times!')).toBeVisible() }) -test("Clearing cookies resets the timer", async ({ context, page }) => { - await page.goto("/") +test('Clearing cookies resets the timer', async ({ context, page }) => { + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByPlaceholder("Enter your name...").fill("Nuxt") - await page.getByRole("button", { name: "Log in" }).click() - await expect(page.getByText("You have logged in 1 times!")).toBeVisible() - await page.getByRole("button", { name: "Log out" }).click() + await page.getByPlaceholder('Enter your name...').fill('Nuxt') + await page.getByRole('button', { name: 'Log in' }).click() + await expect(page.getByText('You have logged in 1 times!')).toBeVisible() + await page.getByRole('button', { name: 'Log out' }).click() await context.clearCookies() - await addForcedCookie(context, "use-cookie") - await page.reload({ waitUntil: "load" }) + await addForcedCookie(context, 'use-cookie') + await page.reload({ waitUntil: 'load' }) await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByPlaceholder("Enter your name...").fill("Nuxt") - await page.getByRole("button", { name: "Log in" }).click() - await expect(page.getByText("You have logged in 1 times!")).toBeVisible() + await page.getByPlaceholder('Enter your name...').fill('Nuxt') + await page.getByRole('button', { name: 'Log in' }).click() + await expect(page.getByText('You have logged in 1 times!')).toBeVisible() }) diff --git a/.e2e/tests/experimental/wasm.spec.ts b/.e2e/tests/experimental/wasm.spec.ts index 2e7b64e..310d5b0 100644 --- a/.e2e/tests/experimental/wasm.spec.ts +++ b/.e2e/tests/experimental/wasm.spec.ts @@ -1,13 +1,13 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('wasm')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Sum is correctly calculated", async ({ page }) => { - await expect(page.getByText("a = 100")).toBeVisible() - await expect(page.getByText("b = 250")).toBeVisible() - await expect(page.getByText("100 + 250 = 350")).toBeVisible() +test('Sum is correctly calculated', async ({ page }) => { + await expect(page.getByText('a = 100')).toBeVisible() + await expect(page.getByText('b = 250')).toBeVisible() + await expect(page.getByText('100 + 250 = 350')).toBeVisible() }) diff --git a/.e2e/tests/features/auto-imports.spec.ts b/.e2e/tests/features/auto-imports.spec.ts index 20444cb..34a5260 100644 --- a/.e2e/tests/features/auto-imports.spec.ts +++ b/.e2e/tests/features/auto-imports.spec.ts @@ -1,35 +1,35 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('auto-imports')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) }) -test("Heading is visible", async ({ page }) => { +test('Heading is visible', async ({ page }) => { await expect( - page.getByRole("heading", { name: "Demo with auto imports" }) + page.getByRole('heading', { name: 'Demo with auto imports' }), ).toBeVisible() }) test('Alert shows "Hello NUXT!" without editing the input', async ({ page, }) => { - page.once("dialog", (dialog) => { - expect(dialog.message()).toBe("Hello NUXT!") + page.once('dialog', (dialog) => { + expect(dialog.message()).toBe('Hello NUXT!') dialog.dismiss() }) - await page.getByRole("button", { name: "Hello" }).click() + await page.getByRole('button', { name: 'Hello' }).click() }) -test("Alert shows the right message when the input has been edited", async ({ +test('Alert shows the right message when the input has been edited', async ({ page, }) => { - await page.getByRole("textbox").fill("Test") - page.once("dialog", (dialog) => { - expect(dialog.message()).toBe("Hello TEST!") + await page.getByRole('textbox').fill('Test') + page.once('dialog', (dialog) => { + expect(dialog.message()).toBe('Hello TEST!') dialog.dismiss() }) - await page.getByRole("button", { name: "Hello" }).click() + await page.getByRole('button', { name: 'Hello' }).click() }) diff --git a/.e2e/tests/features/data-fetching.spec.ts b/.e2e/tests/features/data-fetching.spec.ts index 4149032..cd50a5f 100644 --- a/.e2e/tests/features/data-fetching.spec.ts +++ b/.e2e/tests/features/data-fetching.spec.ts @@ -1,62 +1,62 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('data-fetching')) -test.describe("Index page", () => { - test("Hello world is shown on the index page", async ({ page }) => { - await page.goto("/") - await expect(page.getByText("Result of /api/hello:")).toBeVisible() +test.describe('Index page', () => { + test('Hello world is shown on the index page', async ({ page }) => { + await page.goto('/') + await expect(page.getByText('Result of /api/hello:')).toBeVisible() await expect(page.getByText('{ "hello": "world" }')).toBeVisible() }) }) -test.describe("External page", () => { +test.describe('External page', () => { test('Visiting "External Page" from index shows item with ID: 1', async ({ page, }) => { - await page.goto("/") - await page.getByRole("link", { name: "External" }).click() + await page.goto('/') + await page.getByRole('link', { name: 'External' }).click() - await expect(page.getByRole("spinbutton")).toHaveValue("1") + await expect(page.getByRole('spinbutton')).toHaveValue('1') await expect(page.getByText('"id": 1')).toBeVisible() }) test('Visiting "External Page" directly shows item with ID: 1', async ({ page, }) => { - await page.goto("/external") + await page.goto('/external') - await expect(page.getByRole("spinbutton")).toHaveValue("1") + await expect(page.getByRole('spinbutton')).toHaveValue('1') await expect(page.getByText('"id": 1')).toBeVisible() }) }) -test.describe("Component page", () => { +test.describe('Component page', () => { test('Visiting "Component Page" from index shows the first quote', async ({ page, }) => { - await page.goto("/") - await page.getByRole("link", { name: "Component" }).click() + await page.goto('/') + await page.getByRole('link', { name: 'Component' }).click() await expect( page.getByText( - "Your heart is the size of an ocean. Go find yourself in its hidden depths." - ) + 'Your heart is the size of an ocean. Go find yourself in its hidden depths.', + ), ).toBeVisible() - await expect(page.getByText("Rumi")).toBeVisible() + await expect(page.getByText('Rumi')).toBeVisible() }) test('Visiting "Component Page" directly shows the first quote', async ({ page, }) => { - await page.goto("/component") + await page.goto('/component') await expect( page.getByText( - "Your heart is the size of an ocean. Go find yourself in its hidden depths." - ) + 'Your heart is the size of an ocean. Go find yourself in its hidden depths.', + ), ).toBeVisible() - await expect(page.getByText("Rumi")).toBeVisible() + await expect(page.getByText('Rumi')).toBeVisible() }) }) diff --git a/.e2e/tests/features/meta-tags.spec.ts b/.e2e/tests/features/meta-tags.spec.ts index 64719e1..8e6e664 100644 --- a/.e2e/tests/features/meta-tags.spec.ts +++ b/.e2e/tests/features/meta-tags.spec.ts @@ -1,106 +1,106 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('meta-tags')) -const INDEX_LANG = "en" -const INDEX_DEFAULT_TITLE = "Lucky number: 1 - Meta Tags Example" -const INDEX_DEFAULT_DESCRIPTION = "My page's 1 description" -const ABOUT_PAGE_TITLE = "About page - Meta Tags Example" -const ABOUT_PAGE_DESCRIPTION = "This is the about page" +const INDEX_LANG = 'en' +const INDEX_DEFAULT_TITLE = 'Lucky number: 1 - Meta Tags Example' +const INDEX_DEFAULT_DESCRIPTION = 'My page\'s 1 description' +const ABOUT_PAGE_TITLE = 'About page - Meta Tags Example' +const ABOUT_PAGE_DESCRIPTION = 'This is the about page' -test.describe("Index page", () => { +test.describe('Index page', () => { test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) - test("HTML lang on index page is 'en'", async ({ page }) => { - await expect(page.locator("html")).toHaveAttribute("lang", INDEX_LANG) + test('HTML lang on index page is \'en\'', async ({ page }) => { + await expect(page.locator('html')).toHaveAttribute('lang', INDEX_LANG) }) - test("Index page has 'my-body-class' CSS class", async ({ page }) => { - await expect(page.locator("body.my-body-class")).toBeVisible() + test('Index page has \'my-body-class\' CSS class', async ({ page }) => { + await expect(page.locator('body.my-body-class')).toBeVisible() }) - test("Lucky number is initially 1 in the title and description", async ({ + test('Lucky number is initially 1 in the title and description', async ({ page, }) => { await expect(page.locator('meta[name="description"]')).toHaveAttribute( - "content", - INDEX_DEFAULT_DESCRIPTION + 'content', + INDEX_DEFAULT_DESCRIPTION, ) await expect(page).toHaveTitle(INDEX_DEFAULT_TITLE) }) }) -test.describe("About page", () => { +test.describe('About page', () => { test.beforeEach(async ({ page }) => { - await page.goto("/about") + await page.goto('/about') }) - test("'my-body-class' CSS class is not present on the body", async ({ + test('\'my-body-class\' CSS class is not present on the body', async ({ page, }) => { - await expect(page.locator("body.my-body-class")).not.toBeVisible() - await expect(page.locator("body")).toBeVisible() + await expect(page.locator('body.my-body-class')).not.toBeVisible() + await expect(page.locator('body')).toBeVisible() }) - test("Title and description is set", async ({ page }) => { + test('Title and description is set', async ({ page }) => { await expect(page.locator('meta[name="description"]')).toHaveAttribute( - "content", - ABOUT_PAGE_DESCRIPTION + 'content', + ABOUT_PAGE_DESCRIPTION, ) await expect(page).toHaveTitle(ABOUT_PAGE_TITLE) }) }) -test.describe("Moving from index to about, and back to the index page", () => { - test("HTML lang attribute changes", async ({ page }) => { - await page.goto("/") - await expect(page.locator("html")).toHaveAttribute("lang", INDEX_LANG) +test.describe('Moving from index to about, and back to the index page', () => { + test('HTML lang attribute changes', async ({ page }) => { + await page.goto('/') + await expect(page.locator('html')).toHaveAttribute('lang', INDEX_LANG) - await page.getByRole("link", { name: "About page" }).click() - await expect(page.locator("html")).not.toHaveAttribute("lang", INDEX_LANG) + await page.getByRole('link', { name: 'About page' }).click() + await expect(page.locator('html')).not.toHaveAttribute('lang', INDEX_LANG) - await page.getByRole("link", { name: "Back home" }).click() - await expect(page.locator("html")).toHaveAttribute("lang", INDEX_LANG) + await page.getByRole('link', { name: 'Back home' }).click() + await expect(page.locator('html')).toHaveAttribute('lang', INDEX_LANG) }) - test("'my-body-class' CSS class removed then added back", async ({ + test('\'my-body-class\' CSS class removed then added back', async ({ page, }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await expect(page.locator("body.my-body-class")).toBeVisible() + await expect(page.locator('body.my-body-class')).toBeVisible() - await page.getByRole("link", { name: "About page" }).click() - await expect(page.locator("body.my-body-class")).not.toBeVisible() - await expect(page.locator("body")).toBeVisible() + await page.getByRole('link', { name: 'About page' }).click() + await expect(page.locator('body.my-body-class')).not.toBeVisible() + await expect(page.locator('body')).toBeVisible() - await page.getByRole("link", { name: "Back home" }).click() - await expect(page.locator("body.my-body-class")).toBeVisible() + await page.getByRole('link', { name: 'Back home' }).click() + await expect(page.locator('body.my-body-class')).toBeVisible() }) - test("Title and description changes", async ({ page }) => { - await page.goto("/") + test('Title and description changes', async ({ page }) => { + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) await expect(page.locator('meta[name="description"]')).toHaveAttribute( - "content", - INDEX_DEFAULT_DESCRIPTION + 'content', + INDEX_DEFAULT_DESCRIPTION, ) await expect(page).toHaveTitle(INDEX_DEFAULT_TITLE) - await page.getByRole("link", { name: "About page" }).click() + await page.getByRole('link', { name: 'About page' }).click() await expect(page.locator('meta[name="description"]')).toHaveAttribute( - "content", - ABOUT_PAGE_DESCRIPTION + 'content', + ABOUT_PAGE_DESCRIPTION, ) await expect(page).toHaveTitle(ABOUT_PAGE_TITLE) - await page.getByRole("link", { name: "Back home" }).click() + await page.getByRole('link', { name: 'Back home' }).click() await expect(page.locator('meta[name="description"]')).toHaveAttribute( - "content", - INDEX_DEFAULT_DESCRIPTION + 'content', + INDEX_DEFAULT_DESCRIPTION, ) await expect(page).toHaveTitle(INDEX_DEFAULT_TITLE) }) diff --git a/.e2e/tests/features/state-management.spec.ts b/.e2e/tests/features/state-management.spec.ts index c36a6c5..f636bb3 100644 --- a/.e2e/tests/features/state-management.spec.ts +++ b/.e2e/tests/features/state-management.spec.ts @@ -1,32 +1,32 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect, type Page } from "@playwright/test" +import { test, expect, type Page } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' -test.use(getSettingsForDeployment("state-management")) +test.use(getSettingsForDeployment('state-management')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) }) -test("Same value is displayed on load for both counters", async ({ page }) => { +test('Same value is displayed on load for both counters', async ({ page }) => { const counterValue = await getCounterValue(page) await expect(page.getByText(`Counter: ${counterValue}`)).toHaveCount(2) }) test('Clicking on "-" decrements both counters', async ({ page }) => { const counterValue = await getCounterValue(page) - await page.getByRole("button", { name: "-" }).click() + await page.getByRole('button', { name: '-' }).click() await page.getByText(`Counter: ${counterValue - 1}`).first().isVisible() await expect(page.getByText(`Counter: ${counterValue - 1}`)).toHaveCount(2) }) test('Clicking on "+" increments both counters', async ({ page }) => { const counterValue = await getCounterValue(page) - await page.getByRole("button", { name: "+" }).click() + await page.getByRole('button', { name: '+' }).click() await page.getByText(`Counter: ${counterValue + 1}`).first().isVisible() await expect(page.getByText(`Counter: ${counterValue + 1}`)).toHaveCount(2) }) async function getCounterValue(page: Page) { - const sameCounterText = await page.getByText("Same Counter:").textContent() - return Number(sameCounterText.split(":").at(-1).trim()) + const sameCounterText = await page.getByText('Same Counter:').textContent() + return Number(sameCounterText.split(':').at(-1).trim()) } diff --git a/.e2e/tests/hello-world.spec.ts b/.e2e/tests/hello-world.spec.ts index 91624f5..24515de 100644 --- a/.e2e/tests/hello-world.spec.ts +++ b/.e2e/tests/hello-world.spec.ts @@ -1,11 +1,11 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('hello-world')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) test('"Hello Nuxt 3!" is visible', async ({ page }) => { - await expect(page.getByText("Hello Nuxt 3!")).toBeVisible() + await expect(page.getByText('Hello Nuxt 3!')).toBeVisible() }) diff --git a/.e2e/tests/routing/middleware.spec.ts b/.e2e/tests/routing/middleware.spec.ts index d8a8608..4f4cf9b 100644 --- a/.e2e/tests/routing/middleware.spec.ts +++ b/.e2e/tests/routing/middleware.spec.ts @@ -1,59 +1,59 @@ -import { addForcedCookie, getSettingsForDeployment, wait } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { addForcedCookie, getSettingsForDeployment, wait } from '@/utils' test.use(getSettingsForDeployment('middleware')) -test("Global middleware is being registered", async ({ page }) => { - const globalMiddlewareMessageLoggedPromise = page.waitForEvent("console", { - predicate: (message) => message.text() === "running global middleware", +test('Global middleware is being registered', async ({ page }) => { + const globalMiddlewareMessageLoggedPromise = page.waitForEvent('console', { + predicate: message => message.text() === 'running global middleware', }) - await page.goto("/") + await page.goto('/') await globalMiddlewareMessageLoggedPromise - await expect(page.getByText("Current route: /", { exact: true })).toBeVisible() + await expect(page.getByText('Current route: /', { exact: true })).toBeVisible() }) -test("Global middleware from plugin is being registered", async ({ page }) => { - const globalMiddlewareMessageLoggedPromise = page.waitForEvent("console", { - predicate: (message) => - message.text() === "this global middleware was added in a plugin", +test('Global middleware from plugin is being registered', async ({ page }) => { + const globalMiddlewareMessageLoggedPromise = page.waitForEvent('console', { + predicate: message => + message.text() === 'this global middleware was added in a plugin', }) - await page.goto("/") + await page.goto('/') await globalMiddlewareMessageLoggedPromise - await expect(page.getByText("Current route: /", { exact: true })).toBeVisible() + await expect(page.getByText('Current route: /', { exact: true })).toBeVisible() }) test('Inline middleware on the "forbidden" page cancels navigation', async ({ page, }) => { - await page.goto("/") + await page.goto('/') - const strictlyForbiddenLoggedPromise = page.waitForEvent("console", { - predicate: (message) => message.text() === "Strictly forbidden.", + const strictlyForbiddenLoggedPromise = page.waitForEvent('console', { + predicate: message => message.text() === 'Strictly forbidden.', }) await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByRole("link", { name: "Forbidden" }).click() + await page.getByRole('link', { name: 'Forbidden' }).click() await strictlyForbiddenLoggedPromise await wait(500) - await expect(page.getByText("Current route: /", { exact: true })).toBeVisible() + await expect(page.getByText('Current route: /', { exact: true })).toBeVisible() }) test('Middleware redirects from the "/redirect" page to the "/secret" page', async ({ page, context }) => { - await addForcedCookie(context, "middleware") - await page.goto("/redirect") - await expect(page.getByText("You should never see this page")).toBeHidden() - await expect(page).toHaveURL("/secret") + await addForcedCookie(context, 'middleware') + await page.goto('/redirect') + await expect(page.getByText('You should never see this page')).toBeHidden() + await expect(page).toHaveURL('/secret') }) -test("Named middleware is registered on the secret page", async ({ page }) => { - const namedMiddlewareLoggedPromise = page.waitForEvent("console", { - predicate: (message) => - message.text() === "this named middleware was added in a plugin", +test('Named middleware is registered on the secret page', async ({ page }) => { + const namedMiddlewareLoggedPromise = page.waitForEvent('console', { + predicate: message => + message.text() === 'this named middleware was added in a plugin', }) - await page.goto("/secret") + await page.goto('/secret') await namedMiddlewareLoggedPromise - await expect(page.getByText("You've landed on a page that wasn't in the menu!")).toBeVisible() + await expect(page.getByText('You\'ve landed on a page that wasn\'t in the menu!')).toBeVisible() }) diff --git a/.e2e/tests/routing/pages.spec.ts b/.e2e/tests/routing/pages.spec.ts index 664f666..28fe084 100644 --- a/.e2e/tests/routing/pages.spec.ts +++ b/.e2e/tests/routing/pages.spec.ts @@ -1,72 +1,72 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('pages')) -test.describe("Linked pages", () => { +test.describe('Linked pages', () => { test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) }) - test("Home page is shown", async ({ page }) => { - await expect(page.getByText("Home").nth(1)).toBeVisible() - await expect(page.getByText("Current route: /")).toBeVisible() + test('Home page is shown', async ({ page }) => { + await expect(page.getByText('Home').nth(1)).toBeVisible() + await expect(page.getByText('Current route: /')).toBeVisible() }) test('Navigating to "About" page', async ({ page }) => { - await page.getByRole("link", { name: "About" }).click() - await expect(page.getByText("About").nth(1)).toBeVisible() - await expect(page.getByText("Current route: /about")).toBeVisible() + await page.getByRole('link', { name: 'About' }).click() + await expect(page.getByText('About').nth(1)).toBeVisible() + await expect(page.getByText('Current route: /about')).toBeVisible() }) test('Navigating to "Parent/index" page', async ({ page }) => { - await page.getByRole("link", { name: "Parent (index)" }).click() - await expect(page.getByText("Parent Parent/index")).toBeVisible() - await expect(page.getByText("Current route: /parent")).toBeVisible() + await page.getByRole('link', { name: 'Parent (index)' }).click() + await expect(page.getByText('Parent Parent/index')).toBeVisible() + await expect(page.getByText('Current route: /parent')).toBeVisible() }) test('Navigating to "Parent/b" page', async ({ page }) => { - await page.getByRole("link", { name: "Parent (b)" }).click() - await expect(page.getByText("Parent Parent/b")).toBeVisible() - await expect(page.getByText("Current route: /parent/b")).toBeVisible() + await page.getByRole('link', { name: 'Parent (b)' }).click() + await expect(page.getByText('Parent Parent/b')).toBeVisible() + await expect(page.getByText('Current route: /parent/b')).toBeVisible() }) - test("Navigating to keyed child page", async ({ page }) => { - await page.getByRole("button", { name: "Keyed child", exact: true }).click() - await expect(page.getByText("Child reloaded: 1")).toBeVisible() - await expect(page.getByText("Current route: /parent/reload-")).toBeVisible() + test('Navigating to keyed child page', async ({ page }) => { + await page.getByRole('button', { name: 'Keyed child', exact: true }).click() + await expect(page.getByText('Child reloaded: 1')).toBeVisible() + await expect(page.getByText('Current route: /parent/reload-')).toBeVisible() }) - test("Navigating to keyed child with different path param increases counter", async ({ + test('Navigating to keyed child with different path param increases counter', async ({ page, }) => { - await page.getByRole("button", { name: "Keyed child", exact: true }).click() - await expect(page.getByText("Child reloaded: 1")).toBeVisible() + await page.getByRole('button', { name: 'Keyed child', exact: true }).click() + await expect(page.getByText('Child reloaded: 1')).toBeVisible() - await page.getByRole("button", { name: "Keyed child", exact: true }).click() - await expect(page.getByText("Child reloaded: 2")).toBeVisible() + await page.getByRole('button', { name: 'Keyed child', exact: true }).click() + await expect(page.getByText('Child reloaded: 2')).toBeVisible() }) - test("Navigating to non-keyed child child page", async ({ page }) => { - await page.getByRole("button", { name: "Non-Keyed child" }).click() - await expect(page.getByText("Child reloaded: 1")).toBeVisible() - await expect(page.getByText("Current route: /parent/static-")).toBeVisible() + test('Navigating to non-keyed child child page', async ({ page }) => { + await page.getByRole('button', { name: 'Non-Keyed child' }).click() + await expect(page.getByText('Child reloaded: 1')).toBeVisible() + await expect(page.getByText('Current route: /parent/static-')).toBeVisible() }) - test("Navigating to non-keyed child child with different path param does not increases counter", async ({ + test('Navigating to non-keyed child child with different path param does not increases counter', async ({ page, }) => { - await page.getByRole("button", { name: "Non-Keyed child" }).click() - await expect(page.getByText("Child reloaded: 1")).toBeVisible() + await page.getByRole('button', { name: 'Non-Keyed child' }).click() + await expect(page.getByText('Child reloaded: 1')).toBeVisible() - await page.getByRole("button", { name: "Non-Keyed child" }).click() - await expect(page.getByText("Child reloaded: 1")).toBeVisible() + await page.getByRole('button', { name: 'Non-Keyed child' }).click() + await expect(page.getByText('Child reloaded: 1')).toBeVisible() }) }) -test("Navigating to catchall route", async ({ page }) => { - await page.goto("/catchall/1") +test('Navigating to catchall route', async ({ page }) => { + await page.goto('/catchall/1') await expect(page.getByText('test-[ "1" ]')).toBeVisible() - await expect(page.getByText("Current route: /catchall/1")).toBeVisible() + await expect(page.getByText('Current route: /catchall/1')).toBeVisible() }) diff --git a/.e2e/tests/routing/universal-router.spec.ts b/.e2e/tests/routing/universal-router.spec.ts index 6e28363..10d13d8 100644 --- a/.e2e/tests/routing/universal-router.spec.ts +++ b/.e2e/tests/routing/universal-router.spec.ts @@ -1,38 +1,38 @@ -import { addForcedCookie, getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { addForcedCookie, getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('universal-router')) -test("Global middleware is being registered", async ({ page }) => { - const globalMiddlewareMessageLoggedPromise = page.waitForEvent("console", { - predicate: (message) => message.text() === "running global middleware", +test('Global middleware is being registered', async ({ page }) => { + const globalMiddlewareMessageLoggedPromise = page.waitForEvent('console', { + predicate: message => message.text() === 'running global middleware', }) - await page.goto("/") + await page.goto('/') await globalMiddlewareMessageLoggedPromise - await expect(page.getByText("Current route: /", { exact: true })).toBeVisible() + await expect(page.getByText('Current route: /', { exact: true })).toBeVisible() }) -test("Timer is shows during client-side navigation", async ({ page }) => { - await page.goto("/") +test('Timer is shows during client-side navigation', async ({ page }) => { + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByRole("link", { name: "Home" }).click() - await expect(page.getByText("A page... Processing navigation")).toBeVisible() - await expect(page.getByText("A page... Processing navigation")).toBeHidden() + await page.getByRole('link', { name: 'Home' }).click() + await expect(page.getByText('A page... Processing navigation')).toBeVisible() + await expect(page.getByText('A page... Processing navigation')).toBeHidden() }) test('Middleware redirects from the "/redirect" page to the "/secret" page', async ({ page, context }) => { - await addForcedCookie(context, "middleware") - await page.goto("/redirect") - await expect(page.getByText("You should never see this page")).toBeHidden() - await expect(page).toHaveURL("/secret") + await addForcedCookie(context, 'middleware') + await page.goto('/redirect') + await expect(page.getByText('You should never see this page')).toBeHidden() + await expect(page).toHaveURL('/secret') }) test('Middleware redirects from the "/redirect" page to the "/secret" page using custom NuxtLink', async ({ page, }) => { - await page.goto("/") + await page.goto('/') await page.waitForFunction(() => window.useNuxtApp?.().isHydrating === false) - await page.getByRole("button", { name: "Custom: /redirect" }).click() - await expect(page).toHaveURL("/secret") + await page.getByRole('button', { name: 'Custom: /redirect' }).click() + await expect(page).toHaveURL('/secret') }) diff --git a/.e2e/tests/ui/daisyui.spec.ts b/.e2e/tests/ui/daisyui.spec.ts index 5f1e89a..29879dc 100644 --- a/.e2e/tests/ui/daisyui.spec.ts +++ b/.e2e/tests/ui/daisyui.spec.ts @@ -1,11 +1,11 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('daisyui')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Matches snapshot @visual", async ({ page }) => { +test('Matches snapshot @visual', async ({ page }) => { await expect(page).toHaveScreenshot() }) diff --git a/.e2e/tests/ui/sass.spec.ts b/.e2e/tests/ui/sass.spec.ts index 6c09552..fbde2f3 100644 --- a/.e2e/tests/ui/sass.spec.ts +++ b/.e2e/tests/ui/sass.spec.ts @@ -1,11 +1,11 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('sass')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Matches snapshot @visual", async ({ page }) => { +test('Matches snapshot @visual', async ({ page }) => { await expect(page).toHaveScreenshot() }) diff --git a/.e2e/tests/ui/tailwindcss.spec.ts b/.e2e/tests/ui/tailwindcss.spec.ts index a955b17..9937e4c 100644 --- a/.e2e/tests/ui/tailwindcss.spec.ts +++ b/.e2e/tests/ui/tailwindcss.spec.ts @@ -1,11 +1,11 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('tailwindcss')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Matches snapshot @visual", async ({ page }) => { +test('Matches snapshot @visual', async ({ page }) => { await expect(page).toHaveScreenshot() }) diff --git a/.e2e/tests/ui/vuetify.spec.ts b/.e2e/tests/ui/vuetify.spec.ts index 0e0d504..cc140d2 100644 --- a/.e2e/tests/ui/vuetify.spec.ts +++ b/.e2e/tests/ui/vuetify.spec.ts @@ -1,11 +1,11 @@ -import { getSettingsForDeployment } from "@/utils" -import { test, expect } from "@playwright/test" +import { test, expect } from '@playwright/test' +import { getSettingsForDeployment } from '@/utils' test.use(getSettingsForDeployment('vuetify')) test.beforeEach(async ({ page }) => { - await page.goto("/") + await page.goto('/') }) -test("Matches snapshot @visual", async ({ page }) => { +test('Matches snapshot @visual', async ({ page }) => { await expect(page).toHaveScreenshot() }) diff --git a/.e2e/utils/index.ts b/.e2e/utils/index.ts index 1bbac3c..666a28d 100644 --- a/.e2e/utils/index.ts +++ b/.e2e/utils/index.ts @@ -1,24 +1,25 @@ -import { BrowserContext, Fixtures, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs } from "@playwright/test" -import { withoutProtocol } from "ufo" +import type { BrowserContext, Fixtures, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs } from '@playwright/test' +import { withoutProtocol } from 'ufo' export const wait = (ms: number) => - new Promise((resolve) => setTimeout(resolve, ms)) + new Promise(resolve => setTimeout(resolve, ms)) +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export const getSettingsForDeployment = (slug: string): Fixtures<{}, {}, PlaywrightTestArgs & PlaywrightTestOptions, PlaywrightWorkerArgs> => ({ baseURL: process.env.DEPLOY_URL || `https://${slug}.example.nuxt.space/`, - extraHTTPHeaders: { 'cookie': `forced=${slug}` }, + extraHTTPHeaders: { cookie: `forced=${slug}` }, }) -export async function addForcedCookie (context: BrowserContext, slug: string) { - return addCookies(context, slug, [{ name: "forced", value: slug }]) +export async function addForcedCookie(context: BrowserContext, slug: string) { + return addCookies(context, slug, [{ name: 'forced', value: slug }]) } -export async function addCookies (context: BrowserContext, slug: string, cookies: Array<{ name: string, value: string }>) { +export async function addCookies(context: BrowserContext, slug: string, cookies: Array<{ name: string, value: string }>) { const domain = withoutProtocol(process.env.DEPLOY_URL || `https://${slug}.example.nuxt.space`) await context.addCookies(cookies.map(c => ({ name: c.name, value: c.value, domain, - path: "/", - })).concat([{ name: "forced", value: slug, domain, path: "/" }])) + path: '/', + })).concat([{ name: 'forced', value: slug, domain, path: '/' }])) } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 418b712..eab4767 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,11 +19,28 @@ env: permissions: {} jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - run: corepack enable + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Lint + run: pnpm lint + typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - run: corepack enable - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: diff --git a/.nuxtrc b/.nuxtrc index f5395b0..208336f 100644 --- a/.nuxtrc +++ b/.nuxtrc @@ -1 +1,2 @@ nitro.preset=vercel +sourcemap=false diff --git a/.scripts/build.mjs b/.scripts/build.mjs index 0af138e..f288786 100644 --- a/.scripts/build.mjs +++ b/.scripts/build.mjs @@ -25,7 +25,8 @@ for (const config of packages) { try { const stats = await fsp.stat(output) if (!stats.isDirectory()) continue - } catch { + } + catch { continue } @@ -37,7 +38,7 @@ for (const config of packages) { `.vercel/output/functions/${name}.func`, { recursive: true, - } + }, ) names.add(name) } @@ -73,14 +74,14 @@ export default function middleware(req) { } }) -}` +}`, ) await fsp.writeFile( '.vercel/output/functions/_middleware.func/.vc-config.json', stringify({ runtime: 'edge', entrypoint: 'index.js', - }) + }), ) await fsp.writeFile( '.vercel/output/config.json', @@ -100,7 +101,7 @@ await fsp.writeFile( dest: `/${name}`, })), ], - }) + }), ) console.log('Successfully built nuxt/examples:') diff --git a/.scripts/typecheck.mjs b/.scripts/typecheck.mjs index 9b0ade0..3d01ba5 100755 --- a/.scripts/typecheck.mjs +++ b/.scripts/typecheck.mjs @@ -1,7 +1,7 @@ import { basename } from 'node:path' import { globby } from 'globby' import { exec } from 'tinyexec' -import {consola} from 'consola' +import { consola } from 'consola' const packages = await globby([ 'shared/**/package.json', @@ -22,7 +22,8 @@ for (const pkg of packages) { if (output) { consola.withTag(basename(cwd)).error(output) process.exit(1) - } else { + } + else { consola.success('type checked', basename(cwd)) } } diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..5bc7a62 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,14 @@ +import { createConfigForNuxt } from '@nuxt/eslint-config/flat' + +export default createConfigForNuxt({ + features: { + tooling: true, + stylistic: true, + }, +}, { + rules: { + 'vue/multi-word-component-names': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + }, +}) diff --git a/examples/advanced/config-extends/app.config.ts b/examples/advanced/config-extends/app.config.ts index 6ffbebb..b41d7f8 100644 --- a/examples/advanced/config-extends/app.config.ts +++ b/examples/advanced/config-extends/app.config.ts @@ -5,6 +5,6 @@ export default defineAppConfig({ array: [ 'user', 'user', - 'user' - ] + 'user', + ], }) diff --git a/examples/advanced/config-extends/base/app.config.ts b/examples/advanced/config-extends/base/app.config.ts index e55c376..7c5857d 100644 --- a/examples/advanced/config-extends/base/app.config.ts +++ b/examples/advanced/config-extends/base/app.config.ts @@ -4,15 +4,15 @@ export default defineAppConfig({ array: () => [ 'base', 'base', - 'base' + 'base', ], arrayNested: { nested: { array: [ 'base', 'base', - 'base' - ] - } - } + 'base', + ], + }, + }, }) diff --git a/examples/advanced/config-extends/base/components/BaseButton.vue b/examples/advanced/config-extends/base/components/BaseButton.vue index 0cbf5a0..2aaba61 100644 --- a/examples/advanced/config-extends/base/components/BaseButton.vue +++ b/examples/advanced/config-extends/base/components/BaseButton.vue @@ -1,5 +1,8 @@ diff --git a/examples/advanced/config-extends/base/nuxt.config.ts b/examples/advanced/config-extends/base/nuxt.config.ts index 4e90120..0c606f9 100644 --- a/examples/advanced/config-extends/base/nuxt.config.ts +++ b/examples/advanced/config-extends/base/nuxt.config.ts @@ -1,13 +1,13 @@ export default defineNuxtConfig({ imports: { - dirs: ['utils'] + dirs: ['utils'], }, runtimeConfig: { public: { theme: { primaryColor: 'base_primary', - secondaryColor: 'base_secondary' - } - } - } + secondaryColor: 'base_secondary', + }, + }, + }, }) diff --git a/examples/advanced/config-extends/base/pages/foo.vue b/examples/advanced/config-extends/base/pages/foo.vue index b80089e..37371ad 100644 --- a/examples/advanced/config-extends/base/pages/foo.vue +++ b/examples/advanced/config-extends/base/pages/foo.vue @@ -6,6 +6,6 @@ diff --git a/examples/advanced/config-extends/base/plugins/my-plugin.ts b/examples/advanced/config-extends/base/plugins/my-plugin.ts index df28887..908dfc4 100644 --- a/examples/advanced/config-extends/base/plugins/my-plugin.ts +++ b/examples/advanced/config-extends/base/plugins/my-plugin.ts @@ -1,7 +1,7 @@ export default defineNuxtPlugin((/* nuxtApp */) => { return { provide: { - myPlugin: () => 'String generated from my auto-imported plugin!' - } + myPlugin: () => 'String generated from my auto-imported plugin!', + }, } }) diff --git a/examples/advanced/config-extends/nuxt.config.ts b/examples/advanced/config-extends/nuxt.config.ts index 3408a0a..a23368a 100644 --- a/examples/advanced/config-extends/nuxt.config.ts +++ b/examples/advanced/config-extends/nuxt.config.ts @@ -2,13 +2,13 @@ export default defineNuxtConfig({ extends: [ '@nuxt/examples-ui', './ui', - './base' + './base', ], runtimeConfig: { public: { theme: { - primaryColor: 'user_primary' - } - } + primaryColor: 'user_primary', + }, + }, }, }) diff --git a/examples/advanced/config-extends/package.json b/examples/advanced/config-extends/package.json index b790af3..e3b588d 100644 --- a/examples/advanced/config-extends/package.json +++ b/examples/advanced/config-extends/package.json @@ -8,6 +8,6 @@ }, "devDependencies": { "@nuxt/examples-ui": "latest", - "nuxt": "^3.11.2" + "nuxt": "^3.13.2" } } diff --git a/examples/advanced/config-extends/pages/index.vue b/examples/advanced/config-extends/pages/index.vue index fedd27b..736085b 100644 --- a/examples/advanced/config-extends/pages/index.vue +++ b/examples/advanced/config-extends/pages/index.vue @@ -6,7 +6,10 @@ const bar = getBar()