From 9929724f452a41bcac769876999b2987505f1f4f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 15:45:10 +0900 Subject: [PATCH 01/16] test: setup vscode-e2e --- .gitignore | 1 + package.json | 3 +++ pnpm-lock.yaml | 46 +++++++++++++++++++++++++++++++++++++++ test-e2e/basic.test.ts | 22 +++++++++++++++++++ test-e2e/tsconfig.json | 11 ++++++++++ test-e2e/vitest.config.ts | 9 ++++++++ 6 files changed, 92 insertions(+) create mode 100644 test-e2e/basic.test.ts create mode 100644 test-e2e/tsconfig.json create mode 100644 test-e2e/vitest.config.ts diff --git a/.gitignore b/.gitignore index 3cc2e4bc..fd0701c8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules *.vsix .DS_Store .eslintcache +test-results diff --git a/package.json b/package.json index cbaab803..cdc72feb 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "watch": "tsup --watch --sourcemap", "test": "vscode-test", "test:watch": "vscode-test --watch-files src/**/*.ts --watch-files test/**/*.test.ts", + "test-e2e": "vitest --root test-e2e", "typecheck": "tsc --noEmit", "lint": "eslint --cache .", "lint:fix": "eslint --cache --fix ." @@ -135,6 +136,7 @@ "@antfu/eslint-config": "^2.6.4", "@babel/parser": "^7.20.15", "@babel/types": "^7.20.7", + "@hiogawa/vscode-e2e": "0.0.1", "@rauschma/stringio": "^1.4.0", "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", @@ -162,6 +164,7 @@ "mighty-promise": "^0.0.8", "mocha": "^10.3.0", "pathe": "^1.1.2", + "playwright": "^1.42.1", "semver": "^7.3.5", "tree-kill": "^1.2.2", "tsup": "^8.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89695645..627c3d89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ devDependencies: '@babel/types': specifier: ^7.20.7 version: 7.23.9 + '@hiogawa/vscode-e2e': + specifier: 0.0.1 + version: 0.0.1(playwright@1.42.1)(vitest@1.3.1) '@rauschma/stringio': specifier: ^1.4.0 version: 1.4.0 @@ -95,6 +98,9 @@ devDependencies: pathe: specifier: ^1.1.2 version: 1.1.2 + playwright: + specifier: ^1.42.1 + version: 1.42.1 semver: specifier: ^7.3.5 version: 7.6.0 @@ -528,6 +534,22 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@hiogawa/vscode-e2e@0.0.1(playwright@1.42.1)(vitest@1.3.1): + resolution: {integrity: sha512-4vTeI3uB0kxYEs1C6p36N41MPB57BkUje7G9qEj4q5kQyfCDp9gBhSXRdWYO6/ZsGbL8YN05idgSMBvM58tBpA==} + peerDependencies: + playwright: '*' + vitest: '*' + peerDependenciesMeta: + vitest: + optional: true + dependencies: + '@vscode/test-electron': 2.3.9 + playwright: 1.42.1 + vitest: 1.3.1(@types/node@18.19.17) + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -2507,6 +2529,14 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3599,6 +3629,22 @@ packages: pathe: 1.1.2 dev: true + /playwright-core@1.42.1: + resolution: {integrity: sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==} + engines: {node: '>=16'} + hasBin: true + dev: true + + /playwright@1.42.1: + resolution: {integrity: sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.42.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts new file mode 100644 index 00000000..e1afaede --- /dev/null +++ b/test-e2e/basic.test.ts @@ -0,0 +1,22 @@ +import { vscodeTest } from '@hiogawa/vscode-e2e/vitest' +import { beforeEach } from 'vitest' + +beforeEach(({ task }) => { + task.meta.vscodeExtensionPath = '.' + task.meta.vscodeWorkspacePath = './samples/basic' + task.meta.vscodeTrace = 'on' +}) + +vscodeTest('basic', async ({ page }) => { + // open test explorer + await page.getByRole('tab', { name: 'Testing' }).locator('a').click() + await page.getByText('No test results yet.').click() + + // run tests + await page.getByRole('button', { name: 'Run Tests' }).click() + + // check results + await page.locator(`[title*="test/add.test.ts (Failed)"]`).click() + await page.locator(`[title*="test/mul.test.ts (Passed)"]`).click() + await page.locator(`[title*="28/43 tests passed"]`).click() +}) diff --git a/test-e2e/tsconfig.json b/test-e2e/tsconfig.json new file mode 100644 index 00000000..30de0c04 --- /dev/null +++ b/test-e2e/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "noEmit": true, + "skipLibCheck": true + } +} diff --git a/test-e2e/vitest.config.ts b/test-e2e/vitest.config.ts new file mode 100644 index 00000000..723ab780 --- /dev/null +++ b/test-e2e/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + // use Infinity on local for `page.pause()` + testTimeout: process.env.CI ? 60_000 : Number.POSITIVE_INFINITY, + fileParallelism: false, + }, +}) From 7117df21138220bb645b848e01c8428bad62aafb Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 15:50:45 +0900 Subject: [PATCH 02/16] ci: add test-e2e --- .github/workflows/build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7bdf08e1..cc6bb643 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,10 +30,15 @@ jobs: - run: pnpm lint # see: https://github.com/microsoft/vscode-test/blob/main/sample/azure-pipelines.yml - - run: | + - name: xvfb + run: | /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & echo ">>> Started xvfb" - run: pnpm test env: DISPLAY: ':99' + + - run: pnpm test-e2e + env: + DISPLAY: ':99' From c54e566032564a8656ef4a840cba77f1f84e567f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 15:52:58 +0900 Subject: [PATCH 03/16] ci: upload-artifact --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc6bb643..e202d87c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,3 +42,8 @@ jobs: - run: pnpm test-e2e env: DISPLAY: ':99' + + - uses: actions/upload-artifact@v3 + if: always() + with: + path: test-results From 4052e7d17764587e0604cdeffb0ab2e714ad1f1c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 16:15:49 +0900 Subject: [PATCH 04/16] test: strip off CI flag --- test-e2e/basic.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index e1afaede..aba15847 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -5,6 +5,10 @@ beforeEach(({ task }) => { task.meta.vscodeExtensionPath = '.' task.meta.vscodeWorkspacePath = './samples/basic' task.meta.vscodeTrace = 'on' + + // Vitst extension doesn't work when CI flag? + delete process.env.CI + delete process.env.GITHUB_ACTIONS }) vscodeTest('basic', async ({ page }) => { From 4d6a072be13cabe7994acb8229caf533799c801e Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 16:18:07 +0900 Subject: [PATCH 05/16] chore: cleanup --- test-e2e/basic.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index aba15847..d0261ed1 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -6,9 +6,8 @@ beforeEach(({ task }) => { task.meta.vscodeWorkspacePath = './samples/basic' task.meta.vscodeTrace = 'on' - // Vitst extension doesn't work when CI flag? + // Vitst extension doesn't work with CI flag delete process.env.CI - delete process.env.GITHUB_ACTIONS }) vscodeTest('basic', async ({ page }) => { From 03f1c2a9349539ff234551529d0fa04e85e4b75c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 16:26:25 +0900 Subject: [PATCH 06/16] test: add samples/e2e --- samples/e2e/package.json | 12 + samples/e2e/pnpm-lock.yaml | 895 ++++++++++++++++++++++++++++++++++ samples/e2e/test/fail.test.ts | 5 + samples/e2e/test/mix.test.ts | 9 + samples/e2e/test/pass.test.ts | 5 + samples/e2e/vitest.config.ts | 3 + test-e2e/basic.test.ts | 9 +- 7 files changed, 934 insertions(+), 4 deletions(-) create mode 100644 samples/e2e/package.json create mode 100644 samples/e2e/pnpm-lock.yaml create mode 100644 samples/e2e/test/fail.test.ts create mode 100644 samples/e2e/test/mix.test.ts create mode 100644 samples/e2e/test/pass.test.ts create mode 100644 samples/e2e/vitest.config.ts diff --git a/samples/e2e/package.json b/samples/e2e/package.json new file mode 100644 index 00000000..4b4a9bac --- /dev/null +++ b/samples/e2e/package.json @@ -0,0 +1,12 @@ +{ + "name": "e2e", + "type": "module", + "private": true, + "version": "1.0.0", + "scripts": { + "test": "vitest run" + }, + "devDependencies": { + "vitest": "^1.3.0" + } +} diff --git a/samples/e2e/pnpm-lock.yaml b/samples/e2e/pnpm-lock.yaml new file mode 100644 index 00000000..901aa466 --- /dev/null +++ b/samples/e2e/pnpm-lock.yaml @@ -0,0 +1,895 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + vitest: + specifier: ^1.3.0 + version: 1.3.0 + +packages: + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@rollup/rollup-android-arm-eabi@4.12.0: + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.12.0: + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.12.0: + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.12.0: + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.12.0: + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.12.0: + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.12.0: + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.12.0: + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.12.0: + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.12.0: + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.12.0: + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.12.0: + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@vitest/expect@1.3.0: + resolution: {integrity: sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==} + dependencies: + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.3.0: + resolution: {integrity: sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==} + dependencies: + '@vitest/utils': 1.3.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.3.0: + resolution: {integrity: sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==} + dependencies: + magic-string: 0.30.7 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.3.0: + resolution: {integrity: sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.3.0: + resolution: {integrity: sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: true + + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.5.0 + pkg-types: 1.0.3 + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mlly@1.5.0: + resolution: {integrity: sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.5.0 + pathe: 1.1.2 + dev: true + + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 + fsevents: 2.3.3 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + dependencies: + js-tokens: 8.0.3 + dev: true + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + dev: true + + /vite-node@1.3.0: + resolution: {integrity: sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.3 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.1.3: + resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.3.0: + resolution: {integrity: sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.3.0 + '@vitest/ui': 1.3.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.3.0 + '@vitest/runner': 1.3.0 + '@vitest/snapshot': 1.3.0 + '@vitest/spy': 1.3.0 + '@vitest/utils': 1.3.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.7 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.3 + vite-node: 1.3.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/samples/e2e/test/fail.test.ts b/samples/e2e/test/fail.test.ts new file mode 100644 index 00000000..353ad6ff --- /dev/null +++ b/samples/e2e/test/fail.test.ts @@ -0,0 +1,5 @@ +import { expect, it } from 'vitest' + +it('all-fail', () => { + expect(0).toBe(1) +}) diff --git a/samples/e2e/test/mix.test.ts b/samples/e2e/test/mix.test.ts new file mode 100644 index 00000000..32c11c8a --- /dev/null +++ b/samples/e2e/test/mix.test.ts @@ -0,0 +1,9 @@ +import { expect, it } from 'vitest' + +it('mix-pass', () => { + expect(0).toBe(0) +}) + +it('mix-fail', () => { + expect(0).toBe(1) +}) diff --git a/samples/e2e/test/pass.test.ts b/samples/e2e/test/pass.test.ts new file mode 100644 index 00000000..44efd036 --- /dev/null +++ b/samples/e2e/test/pass.test.ts @@ -0,0 +1,5 @@ +import { expect, it } from 'vitest' + +it('all-pass', () => { + expect(0).toBe(0) +}) diff --git a/samples/e2e/vitest.config.ts b/samples/e2e/vitest.config.ts new file mode 100644 index 00000000..abed6b21 --- /dev/null +++ b/samples/e2e/vitest.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({}) diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index d0261ed1..cd392627 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -3,7 +3,7 @@ import { beforeEach } from 'vitest' beforeEach(({ task }) => { task.meta.vscodeExtensionPath = '.' - task.meta.vscodeWorkspacePath = './samples/basic' + task.meta.vscodeWorkspacePath = './samples/e2e' task.meta.vscodeTrace = 'on' // Vitst extension doesn't work with CI flag @@ -19,7 +19,8 @@ vscodeTest('basic', async ({ page }) => { await page.getByRole('button', { name: 'Run Tests' }).click() // check results - await page.locator(`[title*="test/add.test.ts (Failed)"]`).click() - await page.locator(`[title*="test/mul.test.ts (Passed)"]`).click() - await page.locator(`[title*="28/43 tests passed"]`).click() + await page.locator(`[title*="pass.test.ts (Passed)"]`).click() + await page.locator(`[title*="fail.test.ts (Failed)"]`).click() + await page.locator(`[title*="mix.test.ts (Failed)"]`).click() + await page.locator(`[title*="2/4 tests passed"]`).click() }) From cbd14854df39fc00ff34137b2bf6747d8a3d6432 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sun, 3 Mar 2024 16:28:25 +0900 Subject: [PATCH 07/16] test: strip ci flag 2 --- test-e2e/basic.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index cd392627..5735e41a 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -8,6 +8,7 @@ beforeEach(({ task }) => { // Vitst extension doesn't work with CI flag delete process.env.CI + delete process.env.GITHUB_ACTIONS }) vscodeTest('basic', async ({ page }) => { From dd5dba56001632c0029b0d2909bd99b8ee57a5fc Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 4 Mar 2024 11:18:32 +0900 Subject: [PATCH 08/16] refactor: add createVscodeTest --- test-e2e/basic.test.ts | 18 ++++++++++-------- test-e2e/helper.ts | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 test-e2e/helper.ts diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index 5735e41a..8b7e3001 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -1,16 +1,18 @@ -import { vscodeTest } from '@hiogawa/vscode-e2e/vitest' -import { beforeEach } from 'vitest' +import { beforeAll } from 'vitest' +import { createVscodeTest } from './helper' -beforeEach(({ task }) => { - task.meta.vscodeExtensionPath = '.' - task.meta.vscodeWorkspacePath = './samples/e2e' - task.meta.vscodeTrace = 'on' - - // Vitst extension doesn't work with CI flag +// Vitst extension doesn't work with CI flag +beforeAll(() => { delete process.env.CI delete process.env.GITHUB_ACTIONS }) +const vscodeTest = createVscodeTest({ + extensionPath: '.', + workspacePath: './samples/e2e', + trace: true, +}) + vscodeTest('basic', async ({ page }) => { // open test explorer await page.getByRole('tab', { name: 'Testing' }).locator('a').click() diff --git a/test-e2e/helper.ts b/test-e2e/helper.ts new file mode 100644 index 00000000..f51ddbae --- /dev/null +++ b/test-e2e/helper.ts @@ -0,0 +1,31 @@ +import { launch } from '@hiogawa/vscode-e2e' +import { test } from 'vitest' +import type { Page } from 'playwright' + +export function createVscodeTest({ + extensionPath, + workspacePath, + trace, +}: { + extensionPath?: string; + workspacePath?: string; + trace?: boolean; +}) { + return test.extend<{ page: Page }>({ + page: async ({ task }, use) => { + const { app } = await launch({ + extensionPath, + workspacePath, + }) + const page = await app.firstWindow() + if (trace) { + await page.context().tracing.start({ screenshots: true, snapshots: true }) + } + await use(page) + if (trace) { + await page.context().tracing.stop({ path: `test-results/${task.id}/basic.zip` }) + } + await app.close() + }, + }) +} From 678874043e09e68cd875c357b62daffd4141778f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 4 Mar 2024 11:18:55 +0900 Subject: [PATCH 09/16] chore: lint --- test-e2e/helper.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test-e2e/helper.ts b/test-e2e/helper.ts index f51ddbae..fb29c872 100644 --- a/test-e2e/helper.ts +++ b/test-e2e/helper.ts @@ -7,9 +7,9 @@ export function createVscodeTest({ workspacePath, trace, }: { - extensionPath?: string; - workspacePath?: string; - trace?: boolean; + extensionPath?: string + workspacePath?: string + trace?: boolean }) { return test.extend<{ page: Page }>({ page: async ({ task }, use) => { @@ -18,13 +18,13 @@ export function createVscodeTest({ workspacePath, }) const page = await app.firstWindow() - if (trace) { + if (trace) await page.context().tracing.start({ screenshots: true, snapshots: true }) - } + await use(page) - if (trace) { + if (trace) await page.context().tracing.stop({ path: `test-results/${task.id}/basic.zip` }) - } + await app.close() }, }) From aea3771c6dd2c9ac542b6a595b8efbc54ef63836 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 4 Mar 2024 11:59:46 +0900 Subject: [PATCH 10/16] refactor: move all code --- test-e2e/helper.ts | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/test-e2e/helper.ts b/test-e2e/helper.ts index fb29c872..020477f8 100644 --- a/test-e2e/helper.ts +++ b/test-e2e/helper.ts @@ -1,31 +1,54 @@ -import { launch } from '@hiogawa/vscode-e2e' -import { test } from 'vitest' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { download } from '@vscode/test-electron' +import { _electron } from 'playwright' import type { Page } from 'playwright' +import { test } from 'vitest' + +// based on +// https://github.com/microsoft/playwright-vscode/blob/1c2f766a3ef4b7633fb19103a3d930ebe385250e/tests-integration/tests/baseTest.ts#L41 +// https://github.com/hi-ogawa/vscode-extension-shell-shortcut/tree/df7ee738f60d76bdf30baf852a4bb5abffd16e13/packages/e2e export function createVscodeTest({ extensionPath, workspacePath, trace, }: { - extensionPath?: string - workspacePath?: string + extensionPath: string + workspacePath: string trace?: boolean }) { return test.extend<{ page: Page }>({ page: async ({ task }, use) => { - const { app } = await launch({ - extensionPath, - workspacePath, + const executablePath = await download() + const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'vscode-e2e-')) + const app = await _electron.launch({ + executablePath, + args: [ + '--no-sandbox', + '--disable-gpu-sandbox', + '--disable-updates', + '--skip-welcome', + '--skip-release-notes', + '--disable-workspace-trust', + `--extensions-dir=${path.join(tempDir, 'extensions')}`, + `--user-data-dir=${path.join(tempDir, 'user-data')}`, + `--extensionDevelopmentPath=${path.resolve(extensionPath)}`, + `--folder-uri=file:${path.resolve(workspacePath)}`, + ], }) const page = await app.firstWindow() if (trace) await page.context().tracing.start({ screenshots: true, snapshots: true }) await use(page) - if (trace) - await page.context().tracing.stop({ path: `test-results/${task.id}/basic.zip` }) - + if (trace) { + const name = `${task.name.replace(/\W/g, '-')}-${task.id}` + await page.context().tracing.stop({ path: `test-results/${name}/basic.zip` }) + } await app.close() + await fs.promises.rm(tempDir, { recursive: true, force: true }) }, }) } From 3bcae9c8eaf5d97ff3a3b67a1b24034d4ac28971 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 4 Mar 2024 12:01:28 +0900 Subject: [PATCH 11/16] chore: remove unused --- package.json | 1 - pnpm-lock.yaml | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/package.json b/package.json index cdc72feb..a26f461e 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,6 @@ "@antfu/eslint-config": "^2.6.4", "@babel/parser": "^7.20.15", "@babel/types": "^7.20.7", - "@hiogawa/vscode-e2e": "0.0.1", "@rauschma/stringio": "^1.4.0", "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 627c3d89..5e955ba4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ devDependencies: '@babel/types': specifier: ^7.20.7 version: 7.23.9 - '@hiogawa/vscode-e2e': - specifier: 0.0.1 - version: 0.0.1(playwright@1.42.1)(vitest@1.3.1) '@rauschma/stringio': specifier: ^1.4.0 version: 1.4.0 @@ -534,22 +531,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@hiogawa/vscode-e2e@0.0.1(playwright@1.42.1)(vitest@1.3.1): - resolution: {integrity: sha512-4vTeI3uB0kxYEs1C6p36N41MPB57BkUje7G9qEj4q5kQyfCDp9gBhSXRdWYO6/ZsGbL8YN05idgSMBvM58tBpA==} - peerDependencies: - playwright: '*' - vitest: '*' - peerDependenciesMeta: - vitest: - optional: true - dependencies: - '@vscode/test-electron': 2.3.9 - playwright: 1.42.1 - vitest: 1.3.1(@types/node@18.19.17) - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} From a0a709db999c403c77b836609046a01cad4f905b Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 4 Mar 2024 20:01:29 +0900 Subject: [PATCH 12/16] refactor: "launch" fixture? --- test-e2e/basic.test.ts | 12 +++---- test-e2e/helper.ts | 70 ++++++++++++++++++++++++--------------- test-e2e/vitest.config.ts | 4 +++ 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/test-e2e/basic.test.ts b/test-e2e/basic.test.ts index 8b7e3001..f4a42c03 100644 --- a/test-e2e/basic.test.ts +++ b/test-e2e/basic.test.ts @@ -1,5 +1,5 @@ import { beforeAll } from 'vitest' -import { createVscodeTest } from './helper' +import { vscodeTest } from './helper' // Vitst extension doesn't work with CI flag beforeAll(() => { @@ -7,13 +7,11 @@ beforeAll(() => { delete process.env.GITHUB_ACTIONS }) -const vscodeTest = createVscodeTest({ - extensionPath: '.', - workspacePath: './samples/e2e', - trace: true, -}) +vscodeTest('basic', async ({ launch }) => { + const { page } = await launch({ + workspacePath: './samples/e2e', + }) -vscodeTest('basic', async ({ page }) => { // open test explorer await page.getByRole('tab', { name: 'Testing' }).locator('a').click() await page.getByText('No test results yet.').click() diff --git a/test-e2e/helper.ts b/test-e2e/helper.ts index 020477f8..abf04344 100644 --- a/test-e2e/helper.ts +++ b/test-e2e/helper.ts @@ -8,20 +8,30 @@ import { test } from 'vitest' // based on // https://github.com/microsoft/playwright-vscode/blob/1c2f766a3ef4b7633fb19103a3d930ebe385250e/tests-integration/tests/baseTest.ts#L41 -// https://github.com/hi-ogawa/vscode-extension-shell-shortcut/tree/df7ee738f60d76bdf30baf852a4bb5abffd16e13/packages/e2e - -export function createVscodeTest({ - extensionPath, - workspacePath, - trace, -}: { - extensionPath: string - workspacePath: string - trace?: boolean -}) { - return test.extend<{ page: Page }>({ - page: async ({ task }, use) => { - const executablePath = await download() + +type LaunchFixture = (options: { + extensionPath?: string + workspacePath?: string + trace?: 'on' | 'off' +}) => Promise<{ page: Page }> + +const defaultConfig = process.env as { + VSCODE_E2E_DOWNLOAD_PATH?: string + VSCODE_E2E_EXTENSION_PATH?: string + VSCODE_E2E_WORKSPACE_PATH?: string + VSCODE_E2E_TRACE?: 'on' | 'off' +} + +export const vscodeTest = test.extend<{ launch: LaunchFixture }>({ + launch: async ({ task }, use) => { + const teardowns: (() => Promise)[] = [] + + await use(async (options) => { + const executablePath = defaultConfig.VSCODE_E2E_DOWNLOAD_PATH ?? await download() + const extensionPath = options.extensionPath ?? defaultConfig.VSCODE_E2E_EXTENSION_PATH + const workspacePath = options.workspacePath ?? defaultConfig.VSCODE_E2E_WORKSPACE_PATH + const trace = (options.trace ?? defaultConfig.VSCODE_E2E_TRACE) === 'on' + const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'vscode-e2e-')) const app = await _electron.launch({ executablePath, @@ -34,21 +44,29 @@ export function createVscodeTest({ '--disable-workspace-trust', `--extensions-dir=${path.join(tempDir, 'extensions')}`, `--user-data-dir=${path.join(tempDir, 'user-data')}`, - `--extensionDevelopmentPath=${path.resolve(extensionPath)}`, - `--folder-uri=file:${path.resolve(workspacePath)}`, - ], + extensionPath && `--extensionDevelopmentPath=${path.resolve(extensionPath)}`, + workspacePath && `--folder-uri=file:${path.resolve(workspacePath)}`, + ].filter((v): v is string => !!v), }) const page = await app.firstWindow() + if (trace) await page.context().tracing.start({ screenshots: true, snapshots: true }) - await use(page) - if (trace) { - const name = `${task.name.replace(/\W/g, '-')}-${task.id}` - await page.context().tracing.stop({ path: `test-results/${name}/basic.zip` }) + const teardown = async () => { + if (trace) { + const name = `${task.name.replace(/\W/g, '-')}-${task.id}` + await page.context().tracing.stop({ path: `test-results/${name}/basic.zip` }) + } + await app.close() + await fs.promises.rm(tempDir, { recursive: true, force: true }) } - await app.close() - await fs.promises.rm(tempDir, { recursive: true, force: true }) - }, - }) -} + teardowns.push(teardown) + + return { page } + }) + + for (const teardown of teardowns) + await teardown() + }, +}) diff --git a/test-e2e/vitest.config.ts b/test-e2e/vitest.config.ts index 723ab780..2b2d7eae 100644 --- a/test-e2e/vitest.config.ts +++ b/test-e2e/vitest.config.ts @@ -5,5 +5,9 @@ export default defineConfig({ // use Infinity on local for `page.pause()` testTimeout: process.env.CI ? 60_000 : Number.POSITIVE_INFINITY, fileParallelism: false, + env: { + VSCODE_E2E_EXTENSION_PATH: './', + VSCODE_E2E_TRACE: 'on', + }, }, }) From 352f8f090d7e2eb43f91038ffd8052e88aa1ae36 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 5 Mar 2024 10:17:59 +0900 Subject: [PATCH 13/16] ci: retry test-e2e --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e202d87c..f8cc4379 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: env: DISPLAY: ':99' - - run: pnpm test-e2e + - run: pnpm test-e2e --retry 2 env: DISPLAY: ':99' From 8ec36bbce5c33859e54e0c5b01425ad9f9b15909 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 5 Mar 2024 10:18:53 +0900 Subject: [PATCH 14/16] chore: lint --- test/tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tsconfig.json b/test/tsconfig.json index 0b0a1228..072ba601 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,7 +1,7 @@ { "extends": ["../tsconfig.base.json"], - "include": ["."], "compilerOptions": { "types": ["@types/mocha"] - } + }, + "include": ["."] } From 50dc83d88fb925ba6a843405a20210a0a301254c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 5 Mar 2024 10:20:57 +0900 Subject: [PATCH 15/16] chore: simplify tsconfig --- package.json | 2 +- test-e2e/tsconfig.json | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 116b97ab..a1303657 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "test": "vscode-test", "test:watch": "vscode-test --watch-files src/**/*.ts --watch-files test/**/*.test.ts", "test-e2e": "vitest --root test-e2e", - "typecheck": "tsc -b ./ ./test", + "typecheck": "tsc -b ./ ./test ./test-e2e", "lint": "eslint --cache .", "lint:fix": "eslint --cache --fix ." }, diff --git a/test-e2e/tsconfig.json b/test-e2e/tsconfig.json index 30de0c04..8b62c8bd 100644 --- a/test-e2e/tsconfig.json +++ b/test-e2e/tsconfig.json @@ -1,11 +1,3 @@ { - "compilerOptions": { - "target": "ESNext", - "lib": ["ESNext"], - "module": "ESNext", - "moduleResolution": "Bundler", - "strict": true, - "noEmit": true, - "skipLibCheck": true - } + "extends": ["../tsconfig.base.json"] } From 079d2bb14534f3e9c7afcbeeda4a3e2adad53fe3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 5 Mar 2024 10:23:36 +0900 Subject: [PATCH 16/16] chore: minor --- samples/e2e/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/e2e/package.json b/samples/e2e/package.json index 4b4a9bac..fd260bc4 100644 --- a/samples/e2e/package.json +++ b/samples/e2e/package.json @@ -1,10 +1,10 @@ { - "name": "e2e", + "name": "@vitest/vscode-sample-e2e", "type": "module", "private": true, "version": "1.0.0", "scripts": { - "test": "vitest run" + "test": "vitest" }, "devDependencies": { "vitest": "^1.3.0"