From 606c93e81fad5c95a76f6d38f909e5a0e3aa812d Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:23:50 +0100 Subject: [PATCH 01/56] Add action for playwright tests --- .github/workflows/e2e-tests.yml | 167 ++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 .github/workflows/e2e-tests.yml diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml new file mode 100644 index 0000000..213030a --- /dev/null +++ b/.github/workflows/e2e-tests.yml @@ -0,0 +1,167 @@ +name: E2E tests + +on: + push: + branches: [ main, master, next ] + pull_request: + workflow_dispatch: + +jobs: + install: + name: Install + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Bundle library + run: npm run build + + - name: Upload dist folder + uses: actions/upload-artifact@v3 + if: always() + with: + name: dist-folder + path: dist + retention-days: 1 + + test: + name: Run playwright tests (${{ matrix.shard }}) + runs-on: ubuntu-latest + container: + image: mcr.microsoft.com/playwright:v1.38.0 + timeout-minutes: 20 + needs: install + strategy: + fail-fast: false + matrix: + shard: [1/4, 2/4, 3/4, 4/4] + # project: [chromium, firefox, webkit] + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Get playwright version + id: playwright-version + run: echo "version=$(cat ./package-lock.json | jq -re '.packages["node_modules/@playwright/test"].version')" >> $GITHUB_OUTPUT + + - name: Download dist folder + uses: actions/download-artifact@v3 + with: + name: dist-folder + path: dist + + - name: Run tests + run: HOME=/root npx playwright test --config ./tests/config/playwright.config.ts --shard ${{ matrix.shard }} # --workers 1 + + - name: Upload blob report + uses: actions/upload-artifact@v3 + if: always() + with: + name: blob-reports + path: tests/reports/blobs + retention-days: 1 + + report: + name: Create report + if: always() + runs-on: ubuntu-latest + timeout-minutes: 5 + needs: test + permissions: + pull-requests: write + contents: write + steps: + - name: Check out repository + uses: actions/checkout@v3 + + - name: Set up node + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: npm ci + + - name: Download blob reports + uses: actions/download-artifact@v3 + with: + name: blob-reports + path: playwright-blob-reports + + - name: Merge blob reports + run: PLAYWRIGHT_JSON_OUTPUT_NAME=results.json npx playwright merge-reports --reporter html,json ./playwright-blob-reports + + - name: Upload HTML report + uses: actions/upload-artifact@v3 + if: always() + with: + name: html-report # --attempt-${{ github.run_attempt }} + path: playwright-report + retention-days: 14 + + - name: Check out reports branch + uses: actions/checkout@v4 + with: + ref: test-reports + path: test-reports-branch + fetch-depth: 0 + + - name: Generate report name and URL + id: report-id + run: | + name=$(date +"%Y-%m-%d-%H-%M-%S") + echo "name=$name" >> $GITHUB_OUTPUT + echo "path=reports/$name" >> $GITHUB_OUTPUT + echo "url=https://swup.github.io/swup/reports/$name/" >> $GITHUB_OUTPUT + + - name: Copy html report and push reports branch + run: | + mkdir -p test-reports-branch/${{ steps.report-id.outputs.path }} + cp -r playwright-report/. test-reports-branch/${{ steps.report-id.outputs.path }} + cd test-reports-branch + git config user.name github-actions + git config user.email github-actions@github.com + git add reports + git commit -m "Add test report for run ${{ github.run_id }} (attempt: ${{ github.run_attempt }})" + while true; do + git pull --rebase + if [ $? -ne 0 ]; then + echo "Failed to rebase. Please review manually." + exit 1 + fi + git push + if [ $? -eq 0 ]; then + echo "Successfully pushed HTML report to repo." + exit 0 + fi + done + + - name: Output report url + run: | + echo "::notice title=Published Playwright test report::${{ steps.report-id.outputs.url }}" + + - name: Create report comment + id: report-summary + uses: daun/playwright-report-summary@v2.1.2 + with: + report-file: results.json + report-url: ${{ steps.report-id.outputs.url }} + job-summary: true From 5b89575d40c50ecb3f2aa28fd6128fcd0a6e5707 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:25:44 +0100 Subject: [PATCH 02/56] Update package.json for playwright tests --- package-lock.json | 30 +++++++++++++++++++++++------- package.json | 6 +++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84d4b65..af1a093 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@swup/plugin": "^4.0.0" }, "devDependencies": { + "@playwright/test": "^1.39.0", "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", @@ -2649,6 +2650,21 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", + "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", + "dev": true, + "dependencies": { + "playwright": "1.39.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@rollup/plugin-alias": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz", @@ -7285,12 +7301,12 @@ } }, "node_modules/playwright": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.1.tgz", - "integrity": "sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", + "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", "dev": true, "dependencies": { - "playwright-core": "1.38.1" + "playwright-core": "1.39.0" }, "bin": { "playwright": "cli.js" @@ -7303,9 +7319,9 @@ } }, "node_modules/playwright-core": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.1.tgz", - "integrity": "sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", + "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", "dev": true, "bin": { "playwright-core": "cli.js" diff --git a/package.json b/package.json index fdbd795..9b64157 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,10 @@ "format": "swup package:format", "prepublishOnly": "npm run build", "test:unit": "vitest run --config ./tests/config/vitest.config.ts", - "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts" + "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts", + "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", + "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", + "test": "npm run test:unit && npm run test:e2e" }, "license": "MIT", "repository": { @@ -50,6 +53,7 @@ "@swup/plugin": "^4.0.0" }, "devDependencies": { + "@playwright/test": "^1.39.0", "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", From b9e0977bea559e4c68032589ac0e54014e8fd964 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:29:05 +0100 Subject: [PATCH 03/56] Ignore test output --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 4721d58..dc6596b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,12 @@ Thumbs.db dist *.tgz src/packages + +# Testing tools and outputs +/tests/reports/ +/tests/results/ +/tests/fixtures/dist/ +/playwright/.cache/ +/playwright-report/ +/coverage +.nyc_output From 5f76cfe2062eab3d06245f0e53eb67c4654f5da3 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:29:13 +0100 Subject: [PATCH 04/56] Add playwright config file --- tests/config/playwright.config.ts | 72 +++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/config/playwright.config.ts diff --git a/tests/config/playwright.config.ts b/tests/config/playwright.config.ts new file mode 100644 index 0000000..485c756 --- /dev/null +++ b/tests/config/playwright.config.ts @@ -0,0 +1,72 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +const baseURL = 'http://localhost:8274'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + /* Directory containing the test files */ + testDir: '../functional', + /* Folder for test artifacts: screenshots, videos, ... */ + outputDir: '../results', + /* Timeout individual tests after 5 seconds */ + timeout: 10_000, + /* 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 ? 1 : 0, + /* Limit parallel workers on CI, use default locally. */ + workers: process.env.CI ? 1 : undefined, + // Limit the number of failures on CI to save resources + maxFailures: process.env.CI ? 10 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI ? [ + ['dot'], + ['github'], + ['blob', { outputDir: '../reports/blobs' }], + ] : [ + ['list'], + ['html', { outputFolder: '../reports/html', open: 'on-failure' }], + ['json', { outputFile: '../reports/json/report.json' }], + ], + + expect: { + /* Timeout async expect matchers after 2 seconds */ + timeout: 3_000, + }, + + /* 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, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + /* Capture screenshot after each test failure. */ + screenshot: 'only-on-failure', + /* Capture video if failed tests. */ + video: 'retain-on-failure', + }, + + /* Configure projects for major browsers */ + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + { name: 'firefox', use: { ...devices['Desktop Firefox'] } }, + { name: 'webkit', use: { ...devices['Desktop Safari'] } }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + url: baseURL, + command: 'npm run test:e2e:start', + reuseExistingServer: !process.env.CI, + }, +}); From 34a81b826525e68b9e8aeeec1c786877cb234661 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:32:46 +0100 Subject: [PATCH 05/56] tweaks to the playwright config --- tests/config/playwright.config.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/config/playwright.config.ts b/tests/config/playwright.config.ts index 485c756..3c89173 100644 --- a/tests/config/playwright.config.ts +++ b/tests/config/playwright.config.ts @@ -1,11 +1,5 @@ import { defineConfig, devices } from '@playwright/test'; -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - const baseURL = 'http://localhost:8274'; /** @@ -40,7 +34,7 @@ export default defineConfig({ ], expect: { - /* Timeout async expect matchers after 2 seconds */ + /* Timeout async expect matchers after 3 seconds */ timeout: 3_000, }, @@ -66,7 +60,7 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { url: baseURL, - command: 'npm run test:e2e:start', + command: 'npm run test:e2e:serve', reuseExistingServer: !process.env.CI, }, }); From 0558f895d6693c21c80dd4db233ec4e1330e4778 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:33:12 +0100 Subject: [PATCH 06/56] Add serve command --- package.json | 3 ++- tests/config/serve.json | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100755 tests/config/serve.json diff --git a/package.json b/package.json index 9b64157..5735ec3 100644 --- a/package.json +++ b/package.json @@ -38,11 +38,12 @@ "lint": "swup package:lint", "format": "swup package:format", "prepublishOnly": "npm run build", + "test": "npm run test:unit && npm run test:e2e", "test:unit": "vitest run --config ./tests/config/vitest.config.ts", "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts", "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", - "test": "npm run test:unit && npm run test:e2e" + "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json" }, "license": "MIT", "repository": { diff --git a/tests/config/serve.json b/tests/config/serve.json new file mode 100755 index 0000000..3f33ec2 --- /dev/null +++ b/tests/config/serve.json @@ -0,0 +1,7 @@ +{ + "public": "tests/fixtures", + "cleanUrls": false, + "redirects": [ + { "source": "/redirect-2.html", "destination": "/redirect-3.html" } + ] +} From ebea2c8537867992b946f375aa39c6c87859e8a5 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 00:36:34 +0100 Subject: [PATCH 07/56] Add serve package --- package-lock.json | 657 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 658 insertions(+) diff --git a/package-lock.json b/package-lock.json index af1a093..dc382bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", + "serve": "^14.2.1", "vitest": "^0.34.6" }, "peerDependencies": { @@ -3051,12 +3052,31 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -3106,6 +3126,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3151,6 +3180,26 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "dev": true }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3442,6 +3491,158 @@ "integrity": "sha512-f3XqkhYX2xuSxgZNtk/XqT1CHgYLTHK90SVQZjEZqOr+F6ryZA3xEsMQWqWFpRItTbc4X/dnjsE8p+gnr16qgA==", "dev": true }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3526,6 +3727,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3654,6 +3864,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3720,6 +3945,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -3853,6 +4090,23 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3924,6 +4178,57 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3939,6 +4244,15 @@ "source-map": "^0.6.1" } }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4262,6 +4576,15 @@ "node": ">=6" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -4648,6 +4971,29 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4691,6 +5037,21 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -5003,6 +5364,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -5348,6 +5721,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/hyperlinker": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", @@ -5470,6 +5852,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -5668,6 +6056,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -5711,6 +6111,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -6776,6 +7188,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", @@ -6839,6 +7260,15 @@ "node": "*" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -6875,6 +7305,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -6962,6 +7404,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7172,6 +7623,12 @@ "node": ">=0.10.0" } }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8010,6 +8467,30 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -8119,6 +8600,28 @@ "node": ">=4" } }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -8181,6 +8684,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -8665,6 +9177,114 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", + "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", + "dev": true, + "dependencies": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "dev": true + }, + "node_modules/serve/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/serve/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/serve/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -9001,6 +9621,24 @@ "node": ">=8" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-literal": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", @@ -9617,6 +10255,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dev": true, + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -9658,6 +10306,15 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/package.json b/package.json index 5735ec3..cab0c4b 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", + "serve": "^14.2.1", "vitest": "^0.34.6" }, "peerDependencies": { From c39c872fbbdd162c372c54790f94852c248d6402 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 11:16:57 +0100 Subject: [PATCH 08/56] Add playwright scripts, Includes setup and teardown scripts for copying swup and plugin js files to `fixtures/dist` --- package.json | 6 +- tests/config/playwright.config.ts | 114 +++++++++++++++------------- tests/config/playwright.setup.ts | 10 +++ tests/config/playwright.teardown.ts | 5 ++ 4 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 tests/config/playwright.setup.ts create mode 100644 tests/config/playwright.teardown.ts diff --git a/package.json b/package.json index cab0c4b..ea668a6 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,11 @@ "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts", "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", - "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json" + "test:e2e:install": "npx playwright install --with-deps", + "test:e2e:instrument": "nyc instrument --compact=false dist tests/fixtures/dist", + "test:e2e:mkdir": "mkdir -p ./tests/fixtures/dist", + "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json", + "test:e2e:start": "npm run test:e2e:instrument && npm run test:e2e:serve" }, "license": "MIT", "repository": { diff --git a/tests/config/playwright.config.ts b/tests/config/playwright.config.ts index 3c89173..4d09670 100644 --- a/tests/config/playwright.config.ts +++ b/tests/config/playwright.config.ts @@ -1,66 +1,74 @@ import { defineConfig, devices } from '@playwright/test'; +import { fileURLToPath } from 'url'; +import path from 'path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const baseURL = 'http://localhost:8274'; /** * See https://playwright.dev/docs/test-configuration. */ export default defineConfig({ - /* Directory containing the test files */ - testDir: '../functional', - /* Folder for test artifacts: screenshots, videos, ... */ - outputDir: '../results', - /* Timeout individual tests after 5 seconds */ - timeout: 10_000, - /* 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 ? 1 : 0, - /* Limit parallel workers on CI, use default locally. */ - workers: process.env.CI ? 1 : undefined, - // Limit the number of failures on CI to save resources - maxFailures: process.env.CI ? 10 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: process.env.CI ? [ - ['dot'], - ['github'], - ['blob', { outputDir: '../reports/blobs' }], - ] : [ - ['list'], - ['html', { outputFolder: '../reports/html', open: 'on-failure' }], - ['json', { outputFile: '../reports/json/report.json' }], - ], + /* Run this file before starting the tests */ + globalSetup: path.resolve(__dirname, './playwright.setup.ts'), + /* Run this file after all the tests have finished */ + // globalTeardown: path.resolve(__dirname, './playwright.teardown.ts'), + /* Directory containing the test files */ + testDir: '../playwright', + /* Folder for test artifacts: screenshots, videos, ... */ + outputDir: '../results', + /* Timeout individual tests after 5 seconds */ + timeout: 10_000, + /* 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 ? 1 : 0, + /* Limit parallel workers on CI, use default locally. */ + workers: process.env.CI ? 1 : undefined, + // Limit the number of failures on CI to save resources + maxFailures: process.env.CI ? 10 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI + ? [['dot'], ['github'], ['blob', { outputDir: '../reports/blobs' }]] + : [ + ['list'], + ['html', { outputFolder: '../reports/html', open: 'on-failure' }], + ['json', { outputFile: '../reports/json/report.json' }] + ], - expect: { - /* Timeout async expect matchers after 3 seconds */ - timeout: 3_000, - }, + expect: { + /* Timeout async expect matchers after 3 seconds */ + timeout: 3_000 + }, - /* 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, - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - /* Capture screenshot after each test failure. */ - screenshot: 'only-on-failure', - /* Capture video if failed tests. */ - video: 'retain-on-failure', - }, + /* 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, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + /* Capture screenshot after each test failure. */ + screenshot: 'only-on-failure', + /* Capture video if failed tests. */ + video: 'retain-on-failure' + }, - /* Configure projects for major browsers */ - projects: [ - { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, - { name: 'firefox', use: { ...devices['Desktop Firefox'] } }, - { name: 'webkit', use: { ...devices['Desktop Safari'] } }, - ], + /* Configure projects for major browsers */ + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + { name: 'firefox', use: { ...devices['Desktop Firefox'] } }, + { name: 'webkit', use: { ...devices['Desktop Safari'] } } + ], - /* Run your local dev server before starting the tests */ - webServer: { - url: baseURL, - command: 'npm run test:e2e:serve', - reuseExistingServer: !process.env.CI, - }, + /* Run your local dev server before starting the tests */ + webServer: { + url: baseURL, + command: 'npm run test:e2e:start', + reuseExistingServer: !process.env.CI + } }); diff --git a/tests/config/playwright.setup.ts b/tests/config/playwright.setup.ts new file mode 100644 index 0000000..076bc08 --- /dev/null +++ b/tests/config/playwright.setup.ts @@ -0,0 +1,10 @@ +import { cpSync } from 'node:fs'; + +export default () => { + cpSync('./node_modules/swup/dist/Swup.umd.js', './tests/fixtures/dist/swup.umd.js', { + recursive: true + }); + cpSync('./dist/index.umd.js', './tests/fixtures/dist/fragment-plugin.umd.js', { + recursive: true + }); +}; diff --git a/tests/config/playwright.teardown.ts b/tests/config/playwright.teardown.ts new file mode 100644 index 0000000..15740eb --- /dev/null +++ b/tests/config/playwright.teardown.ts @@ -0,0 +1,5 @@ +import { rmSync } from 'node:fs'; + +export default () => { + rmSync('./tests/fixtures/dist', { recursive: true }); +}; From 7d830c47586887bf55a3c69862636f1e3a5be15d Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 15:52:50 +0100 Subject: [PATCH 09/56] install nyc --- package-lock.json | 711 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 712 insertions(+) diff --git a/package-lock.json b/package-lock.json index dc382bf..c77a961 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", + "nyc": "^15.1.0", "serve": "^14.2.1", "vitest": "^0.34.6" }, @@ -2448,6 +2449,49 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3110,6 +3154,28 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3180,6 +3246,18 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "dev": true }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -3200,6 +3278,12 @@ } ] }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3745,6 +3829,21 @@ "node": ">=8" } }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4558,6 +4657,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -4594,6 +4702,21 @@ "node": ">=0.10.0" } }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", @@ -4879,6 +5002,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -5237,6 +5366,26 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -5653,6 +5802,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -5665,6 +5839,12 @@ "node": ">=12" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -5827,6 +6007,15 @@ "node": ">=8" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -6186,6 +6375,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6216,6 +6414,184 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jackspeak": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", @@ -6679,6 +7055,12 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", @@ -7269,6 +7651,18 @@ "node": ">= 0.6" } }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -7341,6 +7735,165 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/nyc/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -7498,6 +8051,18 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -7541,6 +8106,21 @@ "node": ">=6" } }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8399,6 +8979,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/promise.series": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", @@ -8643,6 +9235,18 @@ "jsesc": "bin/jsesc" } }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -8693,6 +9297,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9285,6 +9895,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -9437,6 +10053,51 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -9621,6 +10282,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -9891,6 +10561,20 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -10142,6 +10826,15 @@ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.11.0.tgz", "integrity": "sha512-qBs4sfmnLlPOyo2oSdvHbIFHe2CPgU54/1UGfSNceb7LARpIEVxUaeRX0Doje6oKpuySS2stqy90R3YrynR8Kg==" }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -10610,6 +11303,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -10704,6 +11403,18 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/ws": { "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", diff --git a/package.json b/package.json index ea668a6..50b8d90 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", + "nyc": "^15.1.0", "serve": "^14.2.1", "vitest": "^0.34.6" }, From 97604686776f9d138f8ba78f1d6fc4e40b9f3e86 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 15:53:12 +0100 Subject: [PATCH 10/56] Add fixtures --- tests/config/serve.json | 2 +- tests/fixtures/assets/script.js | 16 ++++++ tests/fixtures/assets/style.css | 64 +++++++++++++++++++++ tests/fixtures/index.html | 20 +++++++ tests/fixtures/list/filter/green/index.html | 33 +++++++++++ tests/fixtures/list/filter/red/index.html | 33 +++++++++++ tests/fixtures/list/index.html | 42 ++++++++++++++ 7 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/assets/script.js create mode 100644 tests/fixtures/assets/style.css create mode 100644 tests/fixtures/index.html create mode 100644 tests/fixtures/list/filter/green/index.html create mode 100644 tests/fixtures/list/filter/red/index.html create mode 100644 tests/fixtures/list/index.html diff --git a/tests/config/serve.json b/tests/config/serve.json index 3f33ec2..c9d8c7a 100755 --- a/tests/config/serve.json +++ b/tests/config/serve.json @@ -1,6 +1,6 @@ { "public": "tests/fixtures", - "cleanUrls": false, + "cleanUrls": true, "redirects": [ { "source": "/redirect-2.html", "destination": "/redirect-3.html" } ] diff --git a/tests/fixtures/assets/script.js b/tests/fixtures/assets/script.js new file mode 100644 index 0000000..43e8017 --- /dev/null +++ b/tests/fixtures/assets/script.js @@ -0,0 +1,16 @@ +const rules = [ + { + from: ['/list/', '/list/filter/:filter'], + to: ['/list/', '/list/filter/:filter'], + containers: ['#list'], + name: 'update-list' + } +]; +const swup = new Swup({ + plugins: [new SwupFragmentPlugin({ rules })] +}); +window._swup = swup; + +// swup.hooks.on('visit:start', async (visit) => { +// console.log(visit); +// }); diff --git a/tests/fixtures/assets/style.css b/tests/fixtures/assets/style.css new file mode 100644 index 0000000..ef3a733 --- /dev/null +++ b/tests/fixtures/assets/style.css @@ -0,0 +1,64 @@ +*, *:before, *:after { + box-sizing: border-box; +} + +:root { + --red: hsl(0, 74%, 67%); + --green: hsl(100, 68%, 58%); +} +body { + font-family: system-ui; + padding: 1rem; + max-width: 800px; + margin: 5% auto; +} + +h1, h2, ul { + margin-bottom: 1rem; +} + +/* +* Lists +*/ +:where(ul[class]) { + list-style: none; + padding: 0; +} +:where(ul:not([class])) { + list-style-type: "> "; + padding-left: 1rem; +} + +/* +* List +*/ +.filters { + display: flex; + gap: 1rem; +} +.list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 1rem; +} +.list_item { + border-radius: 100%; + background: black; +} +.list_item--red { + background: var(--red); +} +.list_item--green { + background: var(--green); +} +.list_item_link { + display: flex; + color: white; + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: 100%; + text-decoration: none; + font-size: 2rem; +} diff --git a/tests/fixtures/index.html b/tests/fixtures/index.html new file mode 100644 index 0000000..977d497 --- /dev/null +++ b/tests/fixtures/index.html @@ -0,0 +1,20 @@ + + + + + + Home + + + +
+

Home

+ +
+ + + + + diff --git a/tests/fixtures/list/filter/green/index.html b/tests/fixtures/list/filter/green/index.html new file mode 100644 index 0000000..11016e9 --- /dev/null +++ b/tests/fixtures/list/filter/green/index.html @@ -0,0 +1,33 @@ + + + + + + Items + + + +
+

List

+
+

Green Items

+ +
    +
  • + 2 +
  • +
  • + 4 +
  • +
+
+
+ + + + + diff --git a/tests/fixtures/list/filter/red/index.html b/tests/fixtures/list/filter/red/index.html new file mode 100644 index 0000000..bc6f3d8 --- /dev/null +++ b/tests/fixtures/list/filter/red/index.html @@ -0,0 +1,33 @@ + + + + + + Items + + + +
+

List

+
+

Red Items

+ +
    +
  • + 1 +
  • +
  • + 3 +
  • +
+
+
+ + + + + diff --git a/tests/fixtures/list/index.html b/tests/fixtures/list/index.html new file mode 100644 index 0000000..d25042e --- /dev/null +++ b/tests/fixtures/list/index.html @@ -0,0 +1,42 @@ + + + + + + Items + + + +
+

List

+

+ This paragraph should persist when clicking one of the filters. +

+
+

All Items

+ +
    +
  • + 1 +
  • +
  • + 2 +
  • +
  • + 3 +
  • +
  • + 4 +
  • +
+
+
+ + + + + From 1f3ac6ccd6f4e7354f19b342535ea779e5993211 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 15:53:28 +0100 Subject: [PATCH 11/56] Add helpers for playwright tests --- tests/playwright/inc/commands.ts | 89 ++++++++++++++++++++++++++++++++ tests/playwright/inc/swup.ts | 74 ++++++++++++++++++++++++++ tests/playwright/inc/utils.ts | 12 +++++ 3 files changed, 175 insertions(+) create mode 100644 tests/playwright/inc/commands.ts create mode 100644 tests/playwright/inc/swup.ts create mode 100644 tests/playwright/inc/utils.ts diff --git a/tests/playwright/inc/commands.ts b/tests/playwright/inc/commands.ts new file mode 100644 index 0000000..4eb67fb --- /dev/null +++ b/tests/playwright/inc/commands.ts @@ -0,0 +1,89 @@ +import { expect, Locator, Page, Request } from '@playwright/test'; + +export function sleep(timeout = 0): Promise { + return new Promise((resolve) => setTimeout(() => resolve(undefined), timeout)) +} + +export function clickOnLink(page: Page, url: string, options?: Parameters[1]) { + return page.click(`a[href="${url}"]`, options); +} + +export async function expectToBeAt(page: Page, url: string, title?: string) { + await expect(page).toHaveURL(url); + if (title) { + await expectTitle(page, title); + await expectH1(page, title); + } +} + +export async function expectTitle(page: Page, title: string) { + await expect(page).toHaveTitle(title); +} + +export async function expectH1(page: Page, title: string) { + await expect(page.locator('h1')).toContainText(title); +} + +export async function expectH2(page: Page, title: string) { + await expect(page.locator('h2')).toContainText(title); +} + +export function expectToHaveText(locator: Locator, text: string) { + return expect(locator).toContainText(text); +} + +export function expectToHaveClass(locator: Locator, className: string, not = false) { + const regexp = new RegExp(`\\b${className}\\b`); + return not + ? expect(locator).not.toHaveClass(regexp) + : expect(locator).toHaveClass(regexp); +} + +export function expectNotToHaveClass(locator: Locator, className: string) { + return expectToHaveClass(locator, className, true); +} + +export function expectToHaveClasses(locator: Locator, classNames: string, not = false) { + const classes = classNames.split(' '); + return Promise.all(classes.map(className => expectToHaveClass(locator, className, not))); +} + +export function expectNotToHaveClasses(locator: Locator, classNames: string) { + return expectToHaveClasses(locator, classNames, true); +} + +export async function expectPageReload(page: Page, action: (page: Page) => Promise | void, not: boolean = false) { + const origin = () => page.evaluate(() => Math.floor(window.performance.timeOrigin)); + const before = await origin(); + await action(page); + await expect(async () => expect(await origin()).not.toBe(before)).toPass(); +} + +export function expectNoPageReload(page: Page, action: (page: Page) => Promise | void) { + return expectPageReload(page, action, true); +} + +export async function expectRequestHeaders(request: Request, headers: Record) { + const expected = Object.fromEntries( + Object.entries(headers).map(([header, value]) => [header.toLowerCase(), value]) + ); + expect(request.headers()).toMatchObject(expected); +} + +export async function delayRequest(page: Page, url: string, timeout: number, times: number = 1) { + await page.route(url, async (route) => { + await sleep(timeout); + route.continue(); + }, { times }); +} + +export function scrollToPosition(page: Page,y: number) { + return page.evaluate((y) => window.scrollTo(0, y), y); +} + +export async function expectScrollPosition(page: Page, expected: number) { + const pos = () => page.evaluate(() => window.scrollY); + await expect( + async () => expect(await pos()).toEqual(expected) + ).toPass(); +} diff --git a/tests/playwright/inc/swup.ts b/tests/playwright/inc/swup.ts new file mode 100644 index 0000000..b077d36 --- /dev/null +++ b/tests/playwright/inc/swup.ts @@ -0,0 +1,74 @@ +import { expect } from '@playwright/test'; +import type { Page } from '@playwright/test'; +import type Swup from 'swup'; + +declare global { + interface Window { + _swup: Swup; + data: any; + } +} + +export async function waitForSwup(page: Page) { + await page.waitForSelector('html.swup-enabled'); +} + +export function navigateWithSwup(page: Page, url: string, options?: Parameters[1]) { + return page.evaluate(({ url, options }) => window._swup.navigate(url, options), { url, options }); +} + +export async function pushSwupHistoryState(page: Page, url: string, data: Record = {}) { + const state = { url, random: Math.random(), source: 'swup', ...data }; + await page.evaluate(({ url, state }) => window.history.pushState(state, '', url), { url, state }); +} + +export async function expectSwupToHaveCacheEntry(page: Page, url: string) { + const entry = await page.evaluate((url) => window._swup.cache.get(url), url); + expect(entry).toHaveProperty('url', url); +} + +export async function expectSwupToHaveCacheEntries(page: Page, urls: string[]) { + for (const url of urls) { + await expectSwupToHaveCacheEntry(page, url); + } +} + +export async function expectSwupAnimationDuration(page: Page, duration: number) { + const tolerance = duration ? 0.25 : 0; // 25% plus/minus + const expectedRange: [number, number] = [ + duration * (1 - tolerance), + duration * (1 + tolerance) + ]; + let timing = { start: 0, end: 0, outStart: 0, outEnd: 0, inStart: 0, inEnd: 0 }; + + // Make sure we're ready to animate + await waitForSwup(page); + // Make sure we're not disabling animations + await page.emulateMedia({ reducedMotion: null }); + + await page.evaluate(() => { + window.data = {}; + const measure = (key: string, value?: number) => window.data[key] = value ?? performance.now(); + window._swup.hooks.on('visit:start', () => measure('start')); + window._swup.hooks.on('visit:end', () => measure('end')); + window._swup.hooks.on('animation:out:start', () => measure('outStart')); + window._swup.hooks.on('animation:out:end', () => measure('outEnd')); + window._swup.hooks.on('animation:in:start', () => measure('inStart')); + window._swup.hooks.on('animation:in:end', () => measure('inEnd')); + window._swup.hooks.on('animation:skip', () => measure('inStart', 0)); + window._swup.hooks.on('animation:skip', () => measure('inEnd', 0)); + window._swup.hooks.on('animation:skip', () => measure('outStart', 0)); + window._swup.hooks.on('animation:skip', () => measure('outEnd', 0)); + }); + + await navigateWithSwup(page, page.url()); + await page.waitForFunction(() => window.data.end > 0); + timing = await page.evaluate(() => window.data); + + const outDuration = timing.outEnd - timing.outStart; + const inDuration = timing.inEnd - timing.inStart; + expect(outDuration).toBeGreaterThanOrEqual(expectedRange[0]); + expect(outDuration).toBeLessThanOrEqual(expectedRange[1]); + expect(inDuration).toBeGreaterThanOrEqual(expectedRange[0]); + expect(inDuration).toBeLessThanOrEqual(expectedRange[1]); +} diff --git a/tests/playwright/inc/utils.ts b/tests/playwright/inc/utils.ts new file mode 100644 index 0000000..0b0521c --- /dev/null +++ b/tests/playwright/inc/utils.ts @@ -0,0 +1,12 @@ +/** + * Trim slashes from a string + * @see https://stackoverflow.com/a/3840645/586823 + */ +const trimSlashes = (str: string) => str.replace(/^\/|\/$/g, ''); + +/** + * Create a function to prefix a path + */ +export const prefixed = (prefix: string) => { + return (path: string) => `/${trimSlashes(prefix)}/${trimSlashes(path)}`; +}; From 5ef0cb49061b9c8a3a93345568d002358fc06f87 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sat, 4 Nov 2023 15:53:37 +0100 Subject: [PATCH 12/56] Add first "hello world" test --- tests/playwright/fragment-visit.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/playwright/fragment-visit.test.ts diff --git a/tests/playwright/fragment-visit.test.ts b/tests/playwright/fragment-visit.test.ts new file mode 100644 index 0000000..4c8a5db --- /dev/null +++ b/tests/playwright/fragment-visit.test.ts @@ -0,0 +1,17 @@ +import { test, expect } from '@playwright/test'; + +import { clickOnLink, expectToBeAt } from './inc/commands.js'; +import { expectSwupAnimationDuration, navigateWithSwup } from './inc/swup.js'; +import { prefixed } from './inc/utils.js'; + +const url = prefixed('/'); + +test.describe('replace fragments', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/'); + }); + + test('hello world', async ({ page }) => { + await expectToBeAt(page, '/page-1.html', 'Page 1'); + }); +}); From 0ae2b17cb7b44a8c8c22f5131e8336b705457170 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 10:26:56 +0100 Subject: [PATCH 13/56] Update e2e action --- .github/workflows/e2e-tests.yml | 136 ++------------------------------ 1 file changed, 7 insertions(+), 129 deletions(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 213030a..a9f3a5a 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -7,10 +7,13 @@ on: workflow_dispatch: jobs: - install: - name: Install + test: + name: Run playwright tests runs-on: ubuntu-latest - timeout-minutes: 5 + timeout-minutes: 20 + permissions: + pull-requests: write + contents: write steps: - name: Check out repository uses: actions/checkout@v4 @@ -26,142 +29,17 @@ jobs: - name: Bundle library run: npm run build - - name: Upload dist folder - uses: actions/upload-artifact@v3 - if: always() - with: - name: dist-folder - path: dist - retention-days: 1 - - test: - name: Run playwright tests (${{ matrix.shard }}) - runs-on: ubuntu-latest - container: - image: mcr.microsoft.com/playwright:v1.38.0 - timeout-minutes: 20 - needs: install - strategy: - fail-fast: false - matrix: - shard: [1/4, 2/4, 3/4, 4/4] - # project: [chromium, firefox, webkit] - steps: - - name: Check out repository - uses: actions/checkout@v4 - - - name: Set up node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install dependencies - run: npm ci - - name: Get playwright version id: playwright-version run: echo "version=$(cat ./package-lock.json | jq -re '.packages["node_modules/@playwright/test"].version')" >> $GITHUB_OUTPUT - - name: Download dist folder - uses: actions/download-artifact@v3 - with: - name: dist-folder - path: dist - - name: Run tests - run: HOME=/root npx playwright test --config ./tests/config/playwright.config.ts --shard ${{ matrix.shard }} # --workers 1 - - - name: Upload blob report - uses: actions/upload-artifact@v3 - if: always() - with: - name: blob-reports - path: tests/reports/blobs - retention-days: 1 - - report: - name: Create report - if: always() - runs-on: ubuntu-latest - timeout-minutes: 5 - needs: test - permissions: - pull-requests: write - contents: write - steps: - - name: Check out repository - uses: actions/checkout@v3 - - - name: Set up node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Install dependencies - run: npm ci - - - name: Download blob reports - uses: actions/download-artifact@v3 - with: - name: blob-reports - path: playwright-blob-reports - - - name: Merge blob reports - run: PLAYWRIGHT_JSON_OUTPUT_NAME=results.json npx playwright merge-reports --reporter html,json ./playwright-blob-reports - - - name: Upload HTML report - uses: actions/upload-artifact@v3 - if: always() - with: - name: html-report # --attempt-${{ github.run_attempt }} - path: playwright-report - retention-days: 14 - - - name: Check out reports branch - uses: actions/checkout@v4 - with: - ref: test-reports - path: test-reports-branch - fetch-depth: 0 - - - name: Generate report name and URL - id: report-id - run: | - name=$(date +"%Y-%m-%d-%H-%M-%S") - echo "name=$name" >> $GITHUB_OUTPUT - echo "path=reports/$name" >> $GITHUB_OUTPUT - echo "url=https://swup.github.io/swup/reports/$name/" >> $GITHUB_OUTPUT - - - name: Copy html report and push reports branch - run: | - mkdir -p test-reports-branch/${{ steps.report-id.outputs.path }} - cp -r playwright-report/. test-reports-branch/${{ steps.report-id.outputs.path }} - cd test-reports-branch - git config user.name github-actions - git config user.email github-actions@github.com - git add reports - git commit -m "Add test report for run ${{ github.run_id }} (attempt: ${{ github.run_attempt }})" - while true; do - git pull --rebase - if [ $? -ne 0 ]; then - echo "Failed to rebase. Please review manually." - exit 1 - fi - git push - if [ $? -eq 0 ]; then - echo "Successfully pushed HTML report to repo." - exit 0 - fi - done + run: HOME=/root npx playwright test --config ./tests/config/playwright.config.ts - - name: Output report url - run: | - echo "::notice title=Published Playwright test report::${{ steps.report-id.outputs.url }}" - name: Create report comment id: report-summary uses: daun/playwright-report-summary@v2.1.2 with: report-file: results.json - report-url: ${{ steps.report-id.outputs.url }} job-summary: true From 98f5be01324d66efa60eac57110ccdc02b5df2ef Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 10:27:05 +0100 Subject: [PATCH 14/56] Cleanup reporters --- tests/config/playwright.config.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/config/playwright.config.ts b/tests/config/playwright.config.ts index 4d09670..d14983d 100644 --- a/tests/config/playwright.config.ts +++ b/tests/config/playwright.config.ts @@ -34,12 +34,8 @@ export default defineConfig({ maxFailures: process.env.CI ? 10 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: process.env.CI - ? [['dot'], ['github'], ['blob', { outputDir: '../reports/blobs' }]] - : [ - ['list'], - ['html', { outputFolder: '../reports/html', open: 'on-failure' }], - ['json', { outputFile: '../reports/json/report.json' }] - ], + ? [['dot'], ['github'], ['json', { outputFile: '../reports/json/report.json' }]] + : [['list'], ['html', { outputFolder: '../reports/html', open: 'on-failure' }]], expect: { /* Timeout async expect matchers after 3 seconds */ From ac6fefddab0001db2d7a8de0d82542da7458096f Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 11:24:12 +0100 Subject: [PATCH 15/56] Remove nyc instrument for e2e tests --- package-lock.json | 711 ---------------------------------------------- package.json | 4 +- 2 files changed, 1 insertion(+), 714 deletions(-) diff --git a/package-lock.json b/package-lock.json index c77a961..dc382bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", - "nyc": "^15.1.0", "serve": "^14.2.1", "vitest": "^0.34.6" }, @@ -2449,49 +2448,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3154,28 +3110,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error/node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3246,18 +3180,6 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "dev": true }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -3278,12 +3200,6 @@ } ] }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3829,21 +3745,6 @@ "node": ">=8" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4657,15 +4558,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -4702,21 +4594,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", @@ -5002,12 +4879,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -5366,26 +5237,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -5802,31 +5653,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -5839,12 +5665,6 @@ "node": ">=12" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -6007,15 +5827,6 @@ "node": ">=8" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -6375,15 +6186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6414,184 +6216,6 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jackspeak": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", @@ -7055,12 +6679,6 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", @@ -7651,18 +7269,6 @@ "node": ">= 0.6" } }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -7735,165 +7341,6 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/nyc/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -8051,18 +7498,6 @@ "node": ">=8" } }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -8106,21 +7541,6 @@ "node": ">=6" } }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8979,18 +8399,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/promise.series": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", @@ -9235,18 +8643,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -9297,12 +8693,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9895,12 +9285,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -10053,51 +9437,6 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -10282,15 +9621,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -10561,20 +9891,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -10826,15 +10142,6 @@ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.11.0.tgz", "integrity": "sha512-qBs4sfmnLlPOyo2oSdvHbIFHe2CPgU54/1UGfSNceb7LARpIEVxUaeRX0Doje6oKpuySS2stqy90R3YrynR8Kg==" }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -11303,12 +10610,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -11403,18 +10704,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/ws": { "version": "8.14.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", diff --git a/package.json b/package.json index 50b8d90..523d24f 100644 --- a/package.json +++ b/package.json @@ -44,10 +44,9 @@ "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", "test:e2e:install": "npx playwright install --with-deps", - "test:e2e:instrument": "nyc instrument --compact=false dist tests/fixtures/dist", "test:e2e:mkdir": "mkdir -p ./tests/fixtures/dist", "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json", - "test:e2e:start": "npm run test:e2e:instrument && npm run test:e2e:serve" + "test:e2e:start": "npm run test:e2e:serve" }, "license": "MIT", "repository": { @@ -62,7 +61,6 @@ "@swup/cli": "^5.0.1", "@types/jsdom": "^21.1.4", "jsdom": "^22.1.0", - "nyc": "^15.1.0", "serve": "^14.2.1", "vitest": "^0.34.6" }, From c4e6de48cb4210c60155b9c9eb086647c1c8df7b Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 11:24:28 +0100 Subject: [PATCH 16/56] Remove script `test:e2e:install` --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 523d24f..6a7edd5 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts", "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", - "test:e2e:install": "npx playwright install --with-deps", "test:e2e:mkdir": "mkdir -p ./tests/fixtures/dist", "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json", "test:e2e:start": "npm run test:e2e:serve" From b828ccd3ca8733aa850f15bf09ad703b337b9602 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 11:24:46 +0100 Subject: [PATCH 17/56] remove script `test:e2e:mkdir` --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 6a7edd5..d9a1e17 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "test:unit:watch": "vitest --config ./tests/config/vitest.config.ts", "test:e2e": "npx playwright test --config ./tests/config/playwright.config.ts", "test:e2e:dev": "npx playwright test --ui --config ./tests/config/playwright.config.ts", - "test:e2e:mkdir": "mkdir -p ./tests/fixtures/dist", "test:e2e:serve": "npx serve -n -S -L -p 8274 --config ./tests/config/serve.json", "test:e2e:start": "npm run test:e2e:serve" }, From d0972a24fc3fee4e624b6026042d52b66e7ccde8 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 12:01:17 +0100 Subject: [PATCH 18/56] Add import map for fixtures --- tests/config/playwright.setup.ts | 14 +++++++------- tests/fixtures/assets/importmap.json | 9 +++++++++ tests/fixtures/assets/script.js | 15 ++++++++------- tests/fixtures/index.html | 15 ++++++++++++--- 4 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 tests/fixtures/assets/importmap.json diff --git a/tests/config/playwright.setup.ts b/tests/config/playwright.setup.ts index 076bc08..6f38a62 100644 --- a/tests/config/playwright.setup.ts +++ b/tests/config/playwright.setup.ts @@ -1,10 +1,10 @@ -import { cpSync } from 'node:fs'; +import { cpSync, rmSync } from 'node:fs'; + +const options = { recursive: true }; +const fixturesDir = './tests/fixtures'; export default () => { - cpSync('./node_modules/swup/dist/Swup.umd.js', './tests/fixtures/dist/swup.umd.js', { - recursive: true - }); - cpSync('./dist/index.umd.js', './tests/fixtures/dist/fragment-plugin.umd.js', { - recursive: true - }); + rmSync('./tests/fixtures/dist/', options); + cpSync('./node_modules/', `${fixturesDir}/dist/node_modules/`, options); + cpSync('./dist/', `${fixturesDir}/dist/fragment-plugin/`, options); }; diff --git a/tests/fixtures/assets/importmap.json b/tests/fixtures/assets/importmap.json new file mode 100644 index 0000000..dcf8929 --- /dev/null +++ b/tests/fixtures/assets/importmap.json @@ -0,0 +1,9 @@ +{ + "imports": { + "swup": "/dist/node_modules/swup/dist/Swup.modern.js", + "delegate-it": "/dist/node_modules/delegate-it/index.js", + "path-to-regexp": "/dist/node_modules/path-to-regexp/dist.es2015/index.js", + "@swup/fragment-plugin": "/dist/fragment-plugin/index.modern.js", + "@swup/plugin": "/dist/node_modules/@swup/plugin/dist/index.modern.js" + } +} diff --git a/tests/fixtures/assets/script.js b/tests/fixtures/assets/script.js index 43e8017..50ab4f1 100644 --- a/tests/fixtures/assets/script.js +++ b/tests/fixtures/assets/script.js @@ -1,3 +1,6 @@ +import Swup from 'swup'; +import SwupFragmentPlugin from '@swup/fragment-plugin'; + const rules = [ { from: ['/list/', '/list/filter/:filter'], @@ -6,11 +9,9 @@ const rules = [ name: 'update-list' } ]; -const swup = new Swup({ - plugins: [new SwupFragmentPlugin({ rules })] -}); -window._swup = swup; -// swup.hooks.on('visit:start', async (visit) => { -// console.log(visit); -// }); +const fragmentPlugin = new SwupFragmentPlugin({ rules }); + +const swup = new Swup({ plugins: [fragmentPlugin] }); +window._fragmentPlugin = fragmentPlugin; +window._swup = swup; diff --git a/tests/fixtures/index.html b/tests/fixtures/index.html index 977d497..bee1592 100644 --- a/tests/fixtures/index.html +++ b/tests/fixtures/index.html @@ -13,8 +13,17 @@

Home

  • Go to list
  • - - - + + From b2f0fab9f9de5d5b0ec7799eb073d3b5083db1ab Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Fri, 10 Nov 2023 13:28:49 +0100 Subject: [PATCH 19/56] cleanup github action --- .github/workflows/e2e-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index a9f3a5a..78a69b3 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -36,7 +36,6 @@ jobs: - name: Run tests run: HOME=/root npx playwright test --config ./tests/config/playwright.config.ts - - name: Create report comment id: report-summary uses: daun/playwright-report-summary@v2.1.2 From df5b47bcd285492a9ca5b739d2fbb8342c7bb449 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sun, 12 Nov 2023 16:18:36 +0100 Subject: [PATCH 20/56] WIP playwright fixtures --- tests/config/playwright.setup.ts | 6 +- tests/fixtures/assets/script.js | 15 +++- tests/fixtures/assets/style.css | 4 ++ tests/fixtures/detail/index.html | 70 +++++++++++++++++++ tests/fixtures/index.html | 7 +- tests/fixtures/list/filter/green/index.html | 18 +++-- tests/fixtures/list/filter/red/index.html | 19 +++-- tests/fixtures/list/index.html | 21 +++--- ...t-visit.test.ts => fragment-visit.spec.ts} | 6 +- 9 files changed, 134 insertions(+), 32 deletions(-) create mode 100644 tests/fixtures/detail/index.html rename tests/playwright/{fragment-visit.test.ts => fragment-visit.spec.ts} (74%) diff --git a/tests/config/playwright.setup.ts b/tests/config/playwright.setup.ts index 6f38a62..76979c7 100644 --- a/tests/config/playwright.setup.ts +++ b/tests/config/playwright.setup.ts @@ -5,6 +5,8 @@ const fixturesDir = './tests/fixtures'; export default () => { rmSync('./tests/fixtures/dist/', options); - cpSync('./node_modules/', `${fixturesDir}/dist/node_modules/`, options); - cpSync('./dist/', `${fixturesDir}/dist/fragment-plugin/`, options); + // cpSync('./node_modules/', `${fixturesDir}/dist/node_modules/`, options); + // cpSync('./dist/', `${fixturesDir}/dist/fragment-plugin/`, options); + cpSync('./node_modules/swup/dist/Swup.umd.js', `${fixturesDir}/dist/swup.umd.js`); + cpSync('./dist/index.umd.js', `${fixturesDir}/dist/fragment-plugin.umd.js`); }; diff --git a/tests/fixtures/assets/script.js b/tests/fixtures/assets/script.js index 50ab4f1..5107181 100644 --- a/tests/fixtures/assets/script.js +++ b/tests/fixtures/assets/script.js @@ -1,6 +1,3 @@ -import Swup from 'swup'; -import SwupFragmentPlugin from '@swup/fragment-plugin'; - const rules = [ { from: ['/list/', '/list/filter/:filter'], @@ -15,3 +12,15 @@ const fragmentPlugin = new SwupFragmentPlugin({ rules }); const swup = new Swup({ plugins: [fragmentPlugin] }); window._fragmentPlugin = fragmentPlugin; window._swup = swup; + +const uniqueId = (length = 16) => { + return parseInt( + Math.ceil(Math.random() * Date.now()) + .toPrecision(length) + .toString() + .replace('.', '') + ); +}; +document + .querySelectorAll('[data-uniqueid]') + .forEach((el) => el.setAttribute('data-uniqueid', uniqueId())); diff --git a/tests/fixtures/assets/style.css b/tests/fixtures/assets/style.css index ef3a733..04dcd29 100644 --- a/tests/fixtures/assets/style.css +++ b/tests/fixtures/assets/style.css @@ -62,3 +62,7 @@ h1, h2, ul { text-decoration: none; font-size: 2rem; } + +/* +* Overlay +*/ diff --git a/tests/fixtures/detail/index.html b/tests/fixtures/detail/index.html new file mode 100644 index 0000000..8416306 --- /dev/null +++ b/tests/fixtures/detail/index.html @@ -0,0 +1,70 @@ + + + + + + Detail + + + +
    +

    List

    + + +
    +

    Detail

    +

    + Lorem, ipsum dolor sit amet consectetur adipisicing elit. Eveniet neque at + et sapiente voluptate tempore odit earum quam. Illum quia labore quibusdam + provident accusantium earum fugiat cumque quidem a, ex itaque laudantium at + ad mollitia ab aut quisquam pariatur velit! Est ex iure dolores ducimus + porro? Aliquam distinctio quas porro unde! Omnis, est quisquam. Omnis, + facere repudiandae molestiae quod ratione cum eos soluta dolorum quidem, + asperiores, adipisci officia. Deleniti at delectus corporis. Aliquid, + accusantium rem? Nihil, tempore. Qui exercitationem voluptates ex sit, + provident porro a maiores accusamus modi corporis, omnis et molestiae! + Cupiditate maxime rerum, nulla dolor saepe ipsa, exercitationem modi + similique sint quam, at voluptatibus perferendis facilis illum! Blanditiis + officiis, dignissimos voluptatem unde ipsam in asperiores recusandae + quisquam distinctio possimus deleniti nemo error voluptates voluptatibus cum + consectetur consequuntur quae! Minima sunt esse nulla quia blanditiis + ducimus non corrupti veniam libero ad quaerat delectus officia accusamus + doloremque voluptas, deserunt exercitationem placeat fugiat omnis + praesentium nesciunt tenetur voluptates quae illum? Doloremque hic pariatur + doloribus, voluptatibus nisi cupiditate reiciendis nobis dolorum perferendis + qui veniam eum est necessitatibus error quod eius ratione laudantium sed. + Quisquam amet veniam necessitatibus earum hic porro nostrum tenetur + voluptatum, dolores, modi sit vitae temporibus delectus soluta ratione + maxime. +

    +
    +
    + +
    +

    All Items

    + +
      +
    • + 1 +
    • +
    • + 2 +
    • +
    • + 3 +
    • +
    • + 4 +
    • +
    +
    +
    + + + + + diff --git a/tests/fixtures/index.html b/tests/fixtures/index.html index bee1592..5cfd89d 100644 --- a/tests/fixtures/index.html +++ b/tests/fixtures/index.html @@ -13,7 +13,7 @@

    Home

  • Go to list
  • - + + diff --git a/tests/fixtures/list/filter/green/index.html b/tests/fixtures/list/filter/green/index.html index 11016e9..1106f06 100644 --- a/tests/fixtures/list/filter/green/index.html +++ b/tests/fixtures/list/filter/green/index.html @@ -3,13 +3,17 @@ - Items + List: Green Items -
    -

    List

    -
    +
    + +

    List: Green Items

    + + + +

    Green Items

    • All
    • @@ -18,16 +22,16 @@

      Green Items

    - + diff --git a/tests/fixtures/list/filter/red/index.html b/tests/fixtures/list/filter/red/index.html index bc6f3d8..21e13b4 100644 --- a/tests/fixtures/list/filter/red/index.html +++ b/tests/fixtures/list/filter/red/index.html @@ -3,13 +3,17 @@ - Items + List: Red Items -
    -

    List

    -
    +
    + +

    List: Red Items

    + + + +

    Red Items

    • All
    • @@ -18,16 +22,17 @@

      Red Items

    +
    - + diff --git a/tests/fixtures/list/index.html b/tests/fixtures/list/index.html index d25042e..24af149 100644 --- a/tests/fixtures/list/index.html +++ b/tests/fixtures/list/index.html @@ -3,15 +3,20 @@ - Items + List -
    +
    +

    List

    -

    + +

    This paragraph should persist when clicking one of the filters.

    + + +

    All Items

      @@ -21,22 +26,22 @@

      All Items

    - + diff --git a/tests/playwright/fragment-visit.test.ts b/tests/playwright/fragment-visit.spec.ts similarity index 74% rename from tests/playwright/fragment-visit.test.ts rename to tests/playwright/fragment-visit.spec.ts index 4c8a5db..b8fcdb9 100644 --- a/tests/playwright/fragment-visit.test.ts +++ b/tests/playwright/fragment-visit.spec.ts @@ -8,10 +8,10 @@ const url = prefixed('/'); test.describe('replace fragments', () => { test.beforeEach(async ({ page }) => { - await page.goto('/'); + await page.goto('/list/'); }); - test('hello world', async ({ page }) => { - await expectToBeAt(page, '/page-1.html', 'Page 1'); + test('should be at home', async ({ page }) => { + await expectToBeAt(page, '/list/', 'List'); }); }); From 714845c447c11681554d5c72b350b9b282888085 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sun, 12 Nov 2023 16:41:51 +0100 Subject: [PATCH 21/56] Optimize fixtures --- tests/fixtures/assets/script.js | 31 ++++++++++++++++++++++++++++--- tests/fixtures/assets/style.css | 11 ++++++++++- tests/fixtures/detail/index.html | 24 ++++++++---------------- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/tests/fixtures/assets/script.js b/tests/fixtures/assets/script.js index 5107181..91dec17 100644 --- a/tests/fixtures/assets/script.js +++ b/tests/fixtures/assets/script.js @@ -4,6 +4,18 @@ const rules = [ to: ['/list/', '/list/filter/:filter'], containers: ['#list'], name: 'update-list' + }, + { + from: ['/list/', '/list/filter/:filter'], + to: '/detail/', + containers: ['#detail'], + name: 'open-detail' + }, + { + from: '/detail/', + to: ['/list/', '/list/filter/:filter'], + containers: ['#detail', '#list'], + name: 'close-detail' } ]; @@ -21,6 +33,19 @@ const uniqueId = (length = 16) => { .replace('.', '') ); }; -document - .querySelectorAll('[data-uniqueid]') - .forEach((el) => el.setAttribute('data-uniqueid', uniqueId())); + +const fragmentContainers = rules.reduce((acc, current) => [...acc, ...current.containers], []); +const allContainers = [...new Set([...swup.options.containers, ...fragmentContainers])]; + +/** + * Add a unique id attribute to every provided selector. + * This will help to identify persisted elements more easily + */ +function addUniqueIds(selectors) { + selectors.forEach(selector => { + document.querySelector(selector)?.setAttribute('data-uniqueid', uniqueId()); + }) +} + +addUniqueIds(allContainers); +swup.hooks.on('content:replace', ({ containers }) => addUniqueIds(containers)); diff --git a/tests/fixtures/assets/style.css b/tests/fixtures/assets/style.css index 04dcd29..746d6f6 100644 --- a/tests/fixtures/assets/style.css +++ b/tests/fixtures/assets/style.css @@ -64,5 +64,14 @@ h1, h2, ul { } /* -* Overlay +* Modals */ +.modal { + max-width: 600px; + padding: 1rem; +} +.modal_close { + position: absolute; + inset-block-start: 1rem; + inset-inline-end: 1rem; +} diff --git a/tests/fixtures/detail/index.html b/tests/fixtures/detail/index.html index 8416306..47475cd 100644 --- a/tests/fixtures/detail/index.html +++ b/tests/fixtures/detail/index.html @@ -13,6 +13,7 @@

    List

    Detail

    + close

    Lorem, ipsum dolor sit amet consectetur adipisicing elit. Eveniet neque at et sapiente voluptate tempore odit earum quam. Illum quia labore quibusdam @@ -20,23 +21,14 @@

    Detail

    ad mollitia ab aut quisquam pariatur velit! Est ex iure dolores ducimus porro? Aliquam distinctio quas porro unde! Omnis, est quisquam. Omnis, facere repudiandae molestiae quod ratione cum eos soluta dolorum quidem, - asperiores, adipisci officia. Deleniti at delectus corporis. Aliquid, - accusantium rem? Nihil, tempore. Qui exercitationem voluptates ex sit, - provident porro a maiores accusamus modi corporis, omnis et molestiae! - Cupiditate maxime rerum, nulla dolor saepe ipsa, exercitationem modi - similique sint quam, at voluptatibus perferendis facilis illum! Blanditiis - officiis, dignissimos voluptatem unde ipsam in asperiores recusandae - quisquam distinctio possimus deleniti nemo error voluptates voluptatibus cum - consectetur consequuntur quae! Minima sunt esse nulla quia blanditiis - ducimus non corrupti veniam libero ad quaerat delectus officia accusamus - doloremque voluptas, deserunt exercitationem placeat fugiat omnis - praesentium nesciunt tenetur voluptates quae illum? Doloremque hic pariatur - doloribus, voluptatibus nisi cupiditate reiciendis nobis dolorum perferendis - qui veniam eum est necessitatibus error quod eius ratione laudantium sed. - Quisquam amet veniam necessitatibus earum hic porro nostrum tenetur - voluptatum, dolores, modi sit vitae temporibus delectus soluta ratione - maxime. + asperiores, adipisci officia.

    + + Home
    From 37c56918cbcfec87ba23f3a435ce6be734dbfc7a Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sun, 12 Nov 2023 19:20:13 +0100 Subject: [PATCH 22/56] Add focus styles for fixtures --- tests/fixtures/assets/style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/fixtures/assets/style.css b/tests/fixtures/assets/style.css index 746d6f6..a54c222 100644 --- a/tests/fixtures/assets/style.css +++ b/tests/fixtures/assets/style.css @@ -17,6 +17,10 @@ h1, h2, ul { margin-bottom: 1rem; } +:focus-visible { + box-shadow: 0 0 0 10px gold; +} + /* * Lists */ From 92d957da3e007b9702aec79a7b4e66f910bfbe5c Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Sun, 12 Nov 2023 19:40:07 +0100 Subject: [PATCH 23/56] Optimize fixtures --- tests/fixtures/assets/style.css | 18 ++++++++++++++++++ tests/fixtures/detail/index.html | 2 +- tests/fixtures/index.html | 5 ++++- tests/fixtures/list/filter/green/index.html | 5 +++++ tests/fixtures/list/filter/red/index.html | 4 ++++ tests/fixtures/list/index.html | 5 +++++ 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/assets/style.css b/tests/fixtures/assets/style.css index a54c222..187ce51 100644 --- a/tests/fixtures/assets/style.css +++ b/tests/fixtures/assets/style.css @@ -5,6 +5,7 @@ :root { --red: hsl(0, 74%, 67%); --green: hsl(100, 68%, 58%); + --blue: oklch(59.12% 0.153 230.82); } body { font-family: system-ui; @@ -31,6 +32,13 @@ h1, h2, ul { :where(ul:not([class])) { list-style-type: "> "; padding-left: 1rem; + & li { + padding-block: 0.2em; + } +} +:where(a) { + color: var(--blue); + text-decoration: none; } /* @@ -39,6 +47,16 @@ h1, h2, ul { .filters { display: flex; gap: 1rem; + & a { + padding: 0.2em 0.5em; + border: 1px solid var(--blue); + border-radius: 0.5em; + &.is-active, + &:hover { + background: var(--blue); + color: white; + } + } } .list { display: grid; diff --git a/tests/fixtures/detail/index.html b/tests/fixtures/detail/index.html index 47475cd..c6b6828 100644 --- a/tests/fixtures/detail/index.html +++ b/tests/fixtures/detail/index.html @@ -24,7 +24,7 @@

    Detail

    asperiores, adipisci officia.

    diff --git a/tests/fixtures/index.html b/tests/fixtures/index.html index 5cfd89d..09a13b7 100644 --- a/tests/fixtures/index.html +++ b/tests/fixtures/index.html @@ -10,7 +10,10 @@

    Home

      @@ -370,7 +370,7 @@ If all elements of a visit are `