From e0a73acad3da5122a0b57adeceb08f6d89b52e44 Mon Sep 17 00:00:00 2001 From: Dinesh Umasankar Date: Sat, 30 Sep 2023 10:37:28 -0400 Subject: [PATCH] Setting up End-To-End Testing (#7) * Setup Playwright with common browsers * Update gitignore to add trace files * chore: update deps [next 13.5] * e2e testing on push/pull playwright - Testing via containers to run Playwright Tests * adding pnpm to install dependencies - Changed install dependencies step to use pnpm actions * fix missing dependencies and change to pnpm - Attempt to fix missing msedge - Change all npm commands to execute via pnpm * fix: nightly cannot be run from root - attempting solution from https://github.com/mxschmitt/firefox-github-actions-container/pull/3/files - thread: https://github.com/microsoft/playwright/issues/6500 * feat: On Deploy Playwright Testing & Modify Push/pull for Main Only - On Deploy (Preview and Production), Run Playwright E2E Tests - Modify Push/Pull to run Playwright E2E Tests only on main/master * fix: Improve Job Names in Worflow Runs - Changed Job Names under each playwright testing environment * fix: Deployment URL is not being hit when Playwright E2E Tests are run - added Deployment URL via env variable in URL attribute of playwright config * improve: Removed Redundant Testing Stage & Switched TO E2E Tests on Preview Deployments - Due to the nature of Vercel Preview, it creates preview deployments for all branches associated to the project. As such, the E2E tests run on all branches for which Vercel releases a deployment for (including preview) which applies to every branch. - We will get stability coverage across all branches on all pushes across the project. As such, it is not necessary to build and execute a web server on a container to E2E test again. As the build and execute process is automatically tested and reported by Vercel. * Removed WebServer from Playwright - Running into an issue where WebServer causes issues on workflow run after deployment with "reuseExistingServer" & URL / Port Already active - Decided to change local E2E Testing policy to run `pnpm run dev` on a separate terminal & run pnpm exec playwright test on a separate terminal * attempt: determining if pnpm commands can execute playwright tests on deploy * attempt: Playwright Package Missing Fix * attempt: fix yaml syntax * fix: Update test to use baseURL * improve: Added Type Documentation for PLAYWRIGHT_TEST_BASE_URL --- .github/workflows/playwright-deploy.yml | 33 +++++ .gitignore | 4 + .vscode/extensions.json | 3 +- e2e/example.spec.ts | 12 ++ environment.d.ts | 15 ++ package.json | 20 +-- playwright.config.ts | 54 ++++++++ pnpm-lock.yaml | 177 ++++++++++++++---------- 8 files changed, 235 insertions(+), 83 deletions(-) create mode 100644 .github/workflows/playwright-deploy.yml create mode 100644 e2e/example.spec.ts create mode 100644 environment.d.ts create mode 100644 playwright.config.ts diff --git a/.github/workflows/playwright-deploy.yml b/.github/workflows/playwright-deploy.yml new file mode 100644 index 00000000..da5f06a9 --- /dev/null +++ b/.github/workflows/playwright-deploy.yml @@ -0,0 +1,33 @@ +name: Playwright Tests (Deploy) +on: + deployment_status: +jobs: + playwright_deploy: + timeout-minutes: 60 + runs-on: ubuntu-latest + if: github.event.deployment_status.state == 'success' + container: + image: mcr.microsoft.com/playwright:v1.38.0-jammy + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 8 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'pnpm' + - name: Install project dependencies + run: pnpm install + - name: Install msedge - playwright dependency + run: pnpm exec playwright install msedge + - name: Run end-to-end tests + run: HOME=/root pnpm exec playwright test + env: + PLAYWRIGHT_TEST_BASE_URL: ${{ github.event.deployment_status.target_url }} + - uses: actions/upload-artifact@v3 + if: failure() + with: + name: playwright-test-results + path: test-results/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 8f322f0d..1032df62 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ yarn-debug.log* yarn-error.log* # local env files +.env .env*.local # vercel @@ -33,3 +34,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# playwright e2e test-results +/test-results/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json index d25dd724..279896fd 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,6 +3,7 @@ "eamodio.gitlens", "bradlc.vscode-tailwindcss", "dbaeumer.vscode-eslint", - "rvest.vs-code-prettier-eslint" + "rvest.vs-code-prettier-eslint", + "ms-playwright.playwright" ] } \ No newline at end of file diff --git a/e2e/example.spec.ts b/e2e/example.spec.ts new file mode 100644 index 00000000..3bf428d8 --- /dev/null +++ b/e2e/example.spec.ts @@ -0,0 +1,12 @@ +import { test, expect } from '@playwright/test' + +test('should navigate to home page', async ({ page }) => { + // Start from the index page (the baseURL is set via playwright.config.ts) + await page.goto('/') + + // Find an element with the text 'Shad CN Test' and click on it + await page.click('text=ShadCN Test') + + // The current page in view should contain a paragraph text with "sample change" + await expect(page.locator('p')).toContainText('sample change') +}) diff --git a/environment.d.ts b/environment.d.ts new file mode 100644 index 00000000..18b2e578 --- /dev/null +++ b/environment.d.ts @@ -0,0 +1,15 @@ +namespace NodeJS { + interface ProcessEnv { + + /** + * + * URL generated by Vercel Preview Deployment + * Triggered by any code push on any branch within repo. + * + * Used in baseURL attribute of `playwright.config.ts` + * to determine endpoint for running E2E Tests. + * @type {string} + */ + PLAYWRIGHT_TEST_BASE_URL: string + } +} diff --git a/package.json b/package.json index d6b5b2ee..5fc6e163 100644 --- a/package.json +++ b/package.json @@ -6,30 +6,32 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "test:e2e": "playwright test" }, "dependencies": { "@radix-ui/react-slot": "^1.0.2", - "@types/node": "20.5.9", - "@types/react": "18.2.21", - "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "eslint": "8.48.0", - "eslint-config-next": "13.4.19", + "eslint-config-next": "^13.5.2", "lucide-react": "^0.274.0", - "next": "13.4.19", + "next": "^13.5.2", "postcss": "8.4.29", "react": "18.2.0", "react-dom": "18.2.0", "tailwind-merge": "^1.14.0", - "tailwindcss": "3.3.3", + "tailwindcss": "^3.3.3", "tailwindcss-animate": "^1.0.7", - "typescript": "5.2.2" + "typescript": "^5.2.2" }, "devDependencies": { + "@types/node": "^20.6.3", + "@types/react": "^18.2.22", + "@types/react-dom": "^18.2.7", + "@playwright/test": "^1.38.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-tailwindcss": "^3.13.0" } -} +} \ No newline at end of file diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..09872cba --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,54 @@ +import { defineConfig, devices } from '@playwright/test' +import path from 'path' + +export default defineConfig({ + // Timeout per test + timeout: 60 * 1000, + // Test Directory + testDir: path.join(__dirname, 'e2e'), + // If a test fails, retry it additional 2 times + retries: 2, + // Artifacts folder where screenshots, videos, and traces are stored. + outputDir: 'test-results/', + + use: { + // Retry a test if its failing with enabled tracing. + // Allows for us to analyze DOM, console logs, network traffic, etc. + trace: 'retry-with-trace', + baseURL: process.env.PLAYWRIGHT_TEST_BASE_URL || 'http://localhost:3000' + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] } + }, + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] } + }, + { + name: 'webkit', + use: { ...devices['Desktop Safari'] } + }, + + /* Test against mobile view ports. */ + { + name: 'Mobile Chrome', + use: { ...devices['Pixel 5'] } + }, + { + name: 'Mobile Safari', + use: { ...devices['iPhone 12'] } + }, + + /* Test against branded browsers. */ + { + name: 'edge', + use: { + ...devices['Desktop Edge'], + channel: 'msedge' + }, + }, + ], + reporter: process.env.CI ? 'github' : 'list' +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9b746c0..22c59606 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,16 +7,7 @@ settings: dependencies: '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/node': - specifier: 20.5.9 - version: 20.5.9 - '@types/react': - specifier: 18.2.21 - version: 18.2.21 - '@types/react-dom': - specifier: 18.2.7 - version: 18.2.7 + version: 1.0.2(@types/react@18.2.22)(react@18.2.0) autoprefixer: specifier: 10.4.15 version: 10.4.15(postcss@8.4.29) @@ -30,14 +21,14 @@ dependencies: specifier: 8.48.0 version: 8.48.0 eslint-config-next: - specifier: 13.4.19 - version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) + specifier: ^13.5.2 + version: 13.5.2(eslint@8.48.0)(typescript@5.2.2) lucide-react: specifier: ^0.274.0 version: 0.274.0(react@18.2.0) next: - specifier: 13.4.19 - version: 13.4.19(react-dom@18.2.0)(react@18.2.0) + specifier: ^13.5.2 + version: 13.5.2(react-dom@18.2.0)(react@18.2.0) postcss: specifier: 8.4.29 version: 8.4.29 @@ -51,16 +42,28 @@ dependencies: specifier: ^1.14.0 version: 1.14.0 tailwindcss: - specifier: 3.3.3 + specifier: ^3.3.3 version: 3.3.3 tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.3.3) typescript: - specifier: 5.2.2 + specifier: ^5.2.2 version: 5.2.2 devDependencies: + '@playwright/test': + specifier: ^1.38.0 + version: 1.38.0 + '@types/node': + specifier: ^20.6.3 + version: 20.6.3 + '@types/react': + specifier: ^18.2.22 + version: 18.2.22 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.7 eslint-config-prettier: specifier: ^9.0.0 version: 9.0.0(eslint@8.48.0) @@ -160,18 +163,18 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@next/env@13.4.19: - resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==} + /@next/env@13.5.2: + resolution: {integrity: sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg==} dev: false - /@next/eslint-plugin-next@13.4.19: - resolution: {integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==} + /@next/eslint-plugin-next@13.5.2: + resolution: {integrity: sha512-Ew8DOUerJYGRo8pI84SVwn9wxxx8sH92AanCXSkkLJM2W0RJEWy+BqWSCfrlA/3ZIczEl4l4o4lOeTGBPYfBJg==} dependencies: glob: 7.1.7 dev: false - /@next/swc-darwin-arm64@13.4.19: - resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==} + /@next/swc-darwin-arm64@13.5.2: + resolution: {integrity: sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -179,8 +182,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.19: - resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==} + /@next/swc-darwin-x64@13.5.2: + resolution: {integrity: sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -188,8 +191,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.19: - resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==} + /@next/swc-linux-arm64-gnu@13.5.2: + resolution: {integrity: sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -197,8 +200,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.19: - resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==} + /@next/swc-linux-arm64-musl@13.5.2: + resolution: {integrity: sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -206,8 +209,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.19: - resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==} + /@next/swc-linux-x64-gnu@13.5.2: + resolution: {integrity: sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -215,8 +218,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.19: - resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==} + /@next/swc-linux-x64-musl@13.5.2: + resolution: {integrity: sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -224,8 +227,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.19: - resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==} + /@next/swc-win32-arm64-msvc@13.5.2: + resolution: {integrity: sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -233,8 +236,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.19: - resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==} + /@next/swc-win32-ia32-msvc@13.5.2: + resolution: {integrity: sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -242,8 +245,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.19: - resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==} + /@next/swc-win32-x64-msvc@13.5.2: + resolution: {integrity: sha512-LfTHt+hTL8w7F9hnB3H4nRasCzLD/fP+h4/GUVBTxrkMJOnh/7OZ0XbYDKO/uuWwryJS9kZjhxcruBiYwc5UDw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -269,7 +272,15 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@playwright/test@1.38.0: + resolution: {integrity: sha512-xis/RXXsLxwThKnlIXouxmIvvT3zvQj1JE39GsNieMUrMpb3/GySHDh2j8itCG22qKVD4MYLBp7xB73cUW/UUw==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: 1.38.0 + dev: true + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.22)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -279,11 +290,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.21 + '@types/react': 18.2.22 react: 18.2.0 dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.22)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -293,8 +304,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.11 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.22)(react@18.2.0) + '@types/react': 18.2.22 react: 18.2.0 dev: false @@ -302,8 +313,8 @@ packages: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} dev: false - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.2 dev: false @@ -312,31 +323,28 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false - /@types/node@20.5.9: - resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} - dev: false + /@types/node@20.6.3: + resolution: {integrity: sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==} + dev: true /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - '@types/react': 18.2.21 - dev: false + '@types/react': 18.2.22 + dev: true - /@types/react@18.2.21: - resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} + /@types/react@18.2.22: + resolution: {integrity: sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - dev: false /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - dev: false /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} @@ -694,7 +702,6 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -877,8 +884,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next@13.4.19(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==} + /eslint-config-next@13.5.2(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-kCF7k7fHBtFtxfP6J6AP6Mo0vW3CrFeoIuoZ7NHGIvLFc/RUaIspJ6inO/R33zE1o9t/lbJgTnsqnRB++sxCUQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -886,7 +893,7 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.4.19 + '@next/eslint-plugin-next': 13.5.2 '@rushstack/eslint-patch': 1.3.3 '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) eslint: 8.48.0 @@ -1230,6 +1237,14 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1745,9 +1760,9 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /next@13.4.19(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} - engines: {node: '>=16.8.0'} + /next@13.5.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA==} + engines: {node: '>=16.14.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -1760,8 +1775,8 @@ packages: sass: optional: true dependencies: - '@next/env': 13.4.19 - '@swc/helpers': 0.5.1 + '@next/env': 13.5.2 + '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001525 postcss: 8.4.14 @@ -1771,15 +1786,15 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.19 - '@next/swc-darwin-x64': 13.4.19 - '@next/swc-linux-arm64-gnu': 13.4.19 - '@next/swc-linux-arm64-musl': 13.4.19 - '@next/swc-linux-x64-gnu': 13.4.19 - '@next/swc-linux-x64-musl': 13.4.19 - '@next/swc-win32-arm64-msvc': 13.4.19 - '@next/swc-win32-ia32-msvc': 13.4.19 - '@next/swc-win32-x64-msvc': 13.4.19 + '@next/swc-darwin-arm64': 13.5.2 + '@next/swc-darwin-x64': 13.5.2 + '@next/swc-linux-arm64-gnu': 13.5.2 + '@next/swc-linux-arm64-musl': 13.5.2 + '@next/swc-linux-x64-gnu': 13.5.2 + '@next/swc-linux-x64-musl': 13.5.2 + '@next/swc-win32-arm64-msvc': 13.5.2 + '@next/swc-win32-ia32-msvc': 13.5.2 + '@next/swc-win32-x64-msvc': 13.5.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -1937,6 +1952,22 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /playwright-core@1.38.0: + resolution: {integrity: sha512-f8z1y8J9zvmHoEhKgspmCvOExF2XdcxMW8jNRuX4vkQFrzV4MlZ55iwb5QeyiFQgOFCUolXiRHgpjSEnqvO48g==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.38.0: + resolution: {integrity: sha512-fJGw+HO0YY+fU/F1N57DMO+TmXHTrmr905J05zwAQE9xkuwP/QLDk63rVhmyxh03dYnEhnRbsdbH9B0UVVRB3A==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.38.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /postcss-import@15.1.0(postcss@8.4.29): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'}