diff --git a/.eslintrc.cjs b/.eslintrc.cjs index beab59a2df5ac9..63a8d282ba9b25 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -29,14 +29,7 @@ module.exports = defineConfig({ 'node/no-missing-import': [ 'error', { - allowModules: [ - 'types', - 'estree', - 'testUtils', - 'less', - 'sass', - 'stylus' - ], + allowModules: ['types', 'estree', 'less', 'sass', 'stylus'], tryExtensions: ['.ts', '.js', '.jsx', '.tsx', '.d.ts'] } ], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1c663db40e80f..ce695749544b39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,10 +72,10 @@ jobs: run: pnpm run test-unit - name: Test serve - run: pnpm run test-serve -- --runInBand + run: pnpm run test-serve - name: Test build - run: pnpm run test-build -- --runInBand + run: pnpm run test-build lint: timeout-minutes: 10 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e620377c75408f..334d3cb8b79e8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,11 +30,11 @@ If you want to use break point and explore code execution you can use the ["Run 5. The execution will stop and you'll use the [Debug toolbar](https://code.visualstudio.com/docs/editor/debugging#_debug-actions) to continue, step over, restart the process... -### Debugging errors in Jest tests using Playwright (Chromium) +### Debugging errors in Vitest tests using Playwright (Chromium) -Some errors are masked and hidden away because of the layers of abstraction and sandboxed nature added by Jest, Playwright, and Chromium. In order to see what's actually going wrong and the contents of the devtools console in those instances, follow this setup: +Some errors are masked and hidden away because of the layers of abstraction and sandboxed nature added by Vitest, Playwright, and Chromium. In order to see what's actually going wrong and the contents of the devtools console in those instances, follow this setup: -1. Add a `debugger` statement to the `scripts/jestPerTestSetup.ts` -> `afterAll` hook. This will pause execution before the tests quit and the Playwright browser instance exits. +1. Add a `debugger` statement to the `scripts/vitestSetup.ts` -> `afterAll` hook. This will pause execution before the tests quit and the Playwright browser instance exits. 1. Run the tests with the `debug-serve` script command which will enable remote debugging: `pnpm run debug-serve -- --runInBand resolve`. @@ -69,7 +69,7 @@ And re-run `pnpm install` to link the package. ### Integration Tests -Each package under `playground/` contains a `__tests__` directory. The tests are run using [Jest](https://jestjs.io/) + [Playwright](https://playwright.dev/) with custom integrations to make writing tests simple. The detailed setup is inside `jest.config.js` and `scripts/jest*` files. +Each package under `playground/` contains a `__tests__` directory. The tests are run using [Vitest](https://vitest.dev/) + [Playwright](https://playwright.dev/) with custom integrations to make writing tests simple. The detailed setup is inside `vitest.config.e2e.js` and `scripts/vitest*` files. Before running the tests, make sure that [Vite has been built](#repo-setup). On Windows, you may want to [activate Developer Mode](https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development) to solve [issues with symlink creation for non-admins](https://github.com/vitejs/vite/issues/7390). Also you may want to [set git `core.symlinks` to `true` to solve issues with symlinks in git](https://github.com/vitejs/vite/issues/5242). @@ -77,7 +77,7 @@ Each integration test can be run under either dev server mode or build mode. - `pnpm test` by default runs every integration test in both serve and build mode, and also unit tests. -- `pnpm run test-serve` runs tests only under serve mode. This is just calling `jest` so you can pass any Jest flags to this command. Since Jest will attempt to run tests in parallel, if your machine has many cores this may cause flaky test failures with multiple Playwright instances running at the same time. You can force the tests to run in series with `pnpm run test-serve -- --runInBand`. +- `pnpm run test-serve` runs tests only under serve mode. - `pnpm run test-build` runs tests only under build mode. @@ -105,7 +105,7 @@ test('should work', async () => { Some common test helpers, e.g. `testDir`, `isBuild` or `editFile` are available in `playground/testUtils.ts`. -Note: The test build environment uses a [different default set of Vite config](https://github.com/vitejs/vite/blob/9c6501d9c363eaa3c1e7708d531fb2a92b633db6/scripts/jestPerTestSetup.ts#L102-L122) to skip transpilation during tests to make it faster. This may produce a different result compared to the default production build. +Note: The test build environment uses a [different default set of Vite config](https://github.com/vitejs/vite/blob/9c6501d9c363eaa3c1e7708d531fb2a92b633db6/scripts/vitestSetup.ts#L102-L122) to skip transpilation during tests to make it faster. This may produce a different result compared to the default production build. ### Extending the Test Suite diff --git a/jest.config.ts b/jest.config.ts deleted file mode 100644 index 719d67f39b8bce..00000000000000 --- a/jest.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -// eslint-disable-next-line node/no-extraneous-import -import type { Config } from '@jest/types' - -const config: Config.InitialOptions = { - preset: 'ts-jest', - testMatch: ['**/playground/**/*.spec.[jt]s?(x)'], - testTimeout: process.env.CI ? 50000 : 20000, - globalSetup: './scripts/jestGlobalSetup.cjs', - globalTeardown: './scripts/jestGlobalTeardown.cjs', - testEnvironment: './scripts/jestEnv.cjs', - setupFilesAfterEnv: ['./scripts/jestPerTestSetup.ts'], - watchPathIgnorePatterns: ['/playground-temp'], - modulePathIgnorePatterns: ['/playground-temp'], - moduleNameMapper: { - testUtils: '/playground/testUtils.ts' - }, - globals: { - 'ts-jest': { - tsconfig: './playground/tsconfig.json' - } - } -} - -export default config diff --git a/package.json b/package.json index 1ba4ca2cec68dc..62a66770cb750a 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "format": "prettier --write .", "lint": "eslint packages/*/{src,types}/**", "test": "run-s test-unit test-serve test-build", - "test-serve": "jest", - "test-build": "cross-env VITE_TEST_BUILD=1 jest", + "test-serve": "vitest run -c vitest.config.e2e.ts", + "test-build": "cross-env VITE_TEST_BUILD=1 vitest run -c vitest.config.e2e.ts", "test-unit": "vitest run", - "debug-serve": "cross-env VITE_DEBUG_SERVE=1 node --inspect-brk ./node_modules/.bin/jest", - "debug-build": "cross-env VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 node --inspect-brk ./node_modules/.bin/jest", + "debug-serve": "cross-env VITE_DEBUG_SERVE=1 vitest run -c vitest.config.e2e.ts", + "debug-build": "cross-env VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 vitest run -c vitest.config.e2e.ts", "docs": "vitepress dev docs", "build-docs": "vitepress build docs", "serve-docs": "vitepress serve docs", @@ -36,8 +36,8 @@ }, "devDependencies": { "@microsoft/api-extractor": "^7.23.1", + "@types/babel__core": "^7.1.19", "@types/fs-extra": "^9.0.13", - "@types/jest": "^27.5.0", "@types/node": "^17.0.31", "@types/prompts": "^2.4.0", "@types/semver": "^7.3.9", @@ -51,7 +51,7 @@ "eslint-plugin-node": "^11.1.0", "execa": "^5.1.1", "fs-extra": "^10.1.0", - "jest": "^27.5.1", + "kill-port": "^1.6.1", "lint-staged": "^12.4.1", "minimist": "^1.2.6", "node-fetch": "^2.6.7", @@ -65,12 +65,11 @@ "semver": "^7.3.7", "simple-git-hooks": "^2.7.0", "sirv": "^2.0.2", - "ts-jest": "^27.1.4", "ts-node": "^10.7.0", "typescript": "^4.6.4", "vite": "workspace:*", "vitepress": "^0.22.4", - "vitest": "^0.10.5" + "vitest": "^0.12.4" }, "simple-git-hooks": { "pre-commit": "pnpm exec lint-staged --concurrent false", diff --git a/packages/vite/src/node/__tests__/plugins/css.spec.ts b/packages/vite/src/node/__tests__/plugins/css.spec.ts index eeacaf482b0c31..70ddb640b13218 100644 --- a/packages/vite/src/node/__tests__/plugins/css.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/css.spec.ts @@ -179,31 +179,29 @@ describe('hoist @ rules', () => { test('dont hoist @import and @charset in comments', async () => { const css = ` - .foo{color:red;} - /* - @import "bla"; - */ - @charset "utf-8"; - /* - @charset "utf-8"; - @import "bar"; - */ - @import "baz"; - ` +.foo{color:red;} +/* + @import "bla"; +*/ +@charset "utf-8"; +/* + @charset "utf-8"; + @import "bar"; +*/ +@import "baz";` const result = await hoistAtRules(css) - expect(result).toBe( - `@charset "utf-8";@import "baz"; + expect(result).toMatchInlineSnapshot(` + "@charset \\"utf-8\\";@import \\"baz\\"; .foo{color:red;} /* - @import "bla"; + @import \\"bla\\"; */ - + /* - @charset "utf-8"; - @import "bar"; + @charset \\"utf-8\\"; + @import \\"bar\\"; */ - - ` - ) + " + `) }) }) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 50ca05e17a748e..021fd8c25901b5 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -409,7 +409,7 @@ export async function createServer( try { await server.close() } finally { - process.exit(0) + process.exit() } } diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 9f75641c84e513..ba9589d8bbbf1f 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -286,6 +286,7 @@ async function nodeImport( importer, // Non-external modules can import ESM-only modules, but only outside // of test runs, because we use Node `require` in Jest to avoid segfault. + // @ts-expect-error typeof jest === 'undefined' ? { ...resolveOptions, tryEsmOnly: true } : resolveOptions diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index d84b474b87c33f..41b1073bb5b991 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -743,7 +743,9 @@ export const multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//gm export const singlelineCommentsRE = /\/\/.*/g export const requestQuerySplitRE = /\?(?!.*[\/|\}])/ +// @ts-expect-error export const usingDynamicImport = typeof jest === 'undefined' + /** * Dynamically import files. It will make sure it's not being compiled away by TS/Rollup. * diff --git a/playground/assets/__tests__/assets.spec.ts b/playground/assets/__tests__/assets.spec.ts index d9f1c8ed761773..96b4b4e1e434cf 100644 --- a/playground/assets/__tests__/assets.spec.ts +++ b/playground/assets/__tests__/assets.spec.ts @@ -175,11 +175,9 @@ describe('css url() references', () => { expect(bg).toMatch(assetMatch) }) - if (isBuild) { - test('preserve postfix query/hash', () => { - expect(findAssetFile(/\.css$/, 'foo')).toMatch(`woff2?#iefix`) - }) - } + test.runIf(isBuild)('preserve postfix query/hash', () => { + expect(findAssetFile(/\.css$/, 'foo')).toMatch(`woff2?#iefix`) + }) }) describe('image', () => { @@ -254,17 +252,13 @@ describe('unicode url', () => { }) }) -describe('encodeURI', () => { - if (isBuild) { - test('img src with encodeURI', async () => { - const img = await page.$('.encodeURI') - expect( - await ( - await img.getAttribute('src') - ).startsWith('data:image/png;base64') - ).toBe(true) - }) - } +describe.runIf(isBuild)('encodeURI', () => { + test('img src with encodeURI', async () => { + const img = await page.$('.encodeURI') + expect( + await (await img.getAttribute('src')).startsWith('data:image/png;base64') + ).toBe(true) + }) }) test('new URL(..., import.meta.url)', async () => { @@ -286,51 +280,43 @@ test('new URL(`non-existent`, import.meta.url)', async () => { ) }) -if (isBuild) { - test('manifest', async () => { - const manifest = readManifest('foo') - const entry = manifest['index.html'] - - for (const file of listAssets('foo')) { - if (file.endsWith('.css')) { - expect(entry.css).toContain(`assets/${file}`) - } else if (!file.endsWith('.js')) { - expect(entry.assets).toContain(`assets/${file}`) - } +test.runIf(isBuild)('manifest', async () => { + const manifest = readManifest('foo') + const entry = manifest['index.html'] + + for (const file of listAssets('foo')) { + if (file.endsWith('.css')) { + expect(entry.css).toContain(`assets/${file}`) + } else if (!file.endsWith('.js')) { + expect(entry.assets).toContain(`assets/${file}`) } - }) -} + } +}) -describe('css and assets in css in build watch', () => { - if (isBuild) { - test('css will not be lost and css does not contain undefined', async () => { - editFile('index.html', (code) => code.replace('Assets', 'assets'), true) - await notifyRebuildComplete(watcher) - const cssFile = findAssetFile(/index\.\w+\.css$/, 'foo') - expect(cssFile).not.toBe('') - expect(cssFile).not.toMatch(/undefined/) - }) +describe.runIf(isBuild)('css and assets in css in build watch', () => { + test('css will not be lost and css does not contain undefined', async () => { + editFile('index.html', (code) => code.replace('Assets', 'assets'), true) + await notifyRebuildComplete(watcher) + const cssFile = findAssetFile(/index\.\w+\.css$/, 'foo') + expect(cssFile).not.toBe('') + expect(cssFile).not.toMatch(/undefined/) + }) - test('import module.css', async () => { - expect(await getColor('#foo')).toBe('red') - editFile( - 'css/foo.module.css', - (code) => code.replace('red', 'blue'), - true - ) - await notifyRebuildComplete(watcher) - await page.reload() - expect(await getColor('#foo')).toBe('blue') - }) + test('import module.css', async () => { + expect(await getColor('#foo')).toBe('red') + editFile('css/foo.module.css', (code) => code.replace('red', 'blue'), true) + await notifyRebuildComplete(watcher) + await page.reload() + expect(await getColor('#foo')).toBe('blue') + }) - test('import with raw query', async () => { - expect(await page.textContent('.raw-query')).toBe('foo') - editFile('static/foo.txt', (code) => code.replace('foo', 'zoo'), true) - await notifyRebuildComplete(watcher) - await page.reload() - expect(await page.textContent('.raw-query')).toBe('zoo') - }) - } + test('import with raw query', async () => { + expect(await page.textContent('.raw-query')).toBe('foo') + editFile('static/foo.txt', (code) => code.replace('foo', 'zoo'), true) + await notifyRebuildComplete(watcher) + await page.reload() + expect(await page.textContent('.raw-query')).toBe('zoo') + }) }) test('inline style test', async () => { diff --git a/playground/backend-integration/__tests__/backend-integration.spec.ts b/playground/backend-integration/__tests__/backend-integration.spec.ts index 7eebc9c27ff05a..4677700f6e8c12 100644 --- a/playground/backend-integration/__tests__/backend-integration.spec.ts +++ b/playground/backend-integration/__tests__/backend-integration.spec.ts @@ -2,6 +2,7 @@ import { editFile, getColor, isBuild, + isServe, readManifest, untilUpdated } from '../../testUtils' @@ -24,42 +25,42 @@ describe('asset imports from js', () => { }) }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('manifest', async () => { const manifest = readManifest('dev') const htmlEntry = manifest['index.html'] expect(htmlEntry.css.length).toEqual(1) expect(htmlEntry.assets.length).toEqual(1) }) -} else { +}) + +describe.runIf(isServe)('serve', () => { test('No ReferenceError', async () => { browserErrors.forEach((error) => { expect(error.name).not.toBe('ReferenceError') }) }) - describe('CSS HMR', () => { - test('preserve the base in CSS HMR', async () => { - await untilUpdated(() => getColor('body'), 'black') // sanity check - editFile('frontend/entrypoints/global.css', (code) => - code.replace('black', 'red') - ) - await untilUpdated(() => getColor('body'), 'red') // successful HMR + test('preserve the base in CSS HMR', async () => { + await untilUpdated(() => getColor('body'), 'black') // sanity check + editFile('frontend/entrypoints/global.css', (code) => + code.replace('black', 'red') + ) + await untilUpdated(() => getColor('body'), 'red') // successful HMR - // Verify that the base (/dev/) was added during the css-update - const link = await page.$('link[rel="stylesheet"]') - expect(await link.getAttribute('href')).toContain('/dev/global.css?t=') - }) + // Verify that the base (/dev/) was added during the css-update + const link = await page.$('link[rel="stylesheet"]') + expect(await link.getAttribute('href')).toContain('/dev/global.css?t=') + }) - test('CSS dependencies are tracked for HMR', async () => { - const el = await page.$('h1') - browserLogs.length = 0 + test('CSS dependencies are tracked for HMR', async () => { + const el = await page.$('h1') + browserLogs.length = 0 - editFile('frontend/entrypoints/main.ts', (code) => - code.replace('text-black', 'text-[rgb(204,0,0)]') - ) - await untilUpdated(() => getColor(el), 'rgb(204, 0, 0)') - expect(browserLogs).toContain('[vite] css hot updated: /global.css') - }) + editFile('frontend/entrypoints/main.ts', (code) => + code.replace('text-black', 'text-[rgb(204,0,0)]') + ) + await untilUpdated(() => getColor(el), 'rgb(204, 0, 0)') + expect(browserLogs).toContain('[vite] css hot updated: /global.css') }) -} +}) diff --git a/playground/cli-module/__tests__/serve.js b/playground/cli-module/__tests__/serve.ts similarity index 90% rename from playground/cli-module/__tests__/serve.js rename to playground/cli-module/__tests__/serve.ts index cf873fd481830b..874c81715021d1 100644 --- a/playground/cli-module/__tests__/serve.js +++ b/playground/cli-module/__tests__/serve.ts @@ -1,21 +1,16 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -// eslint-disable-next-line node/no-restricted-require -const execa = require('execa') -const { workspaceRoot, ports } = require('../../testUtils') +import path from 'path' +import execa from 'execa' +import { workspaceRoot, ports } from '../../testUtils' +import kill from 'kill-port' const isWindows = process.platform === 'win32' -const port = (exports.port = ports['cli-module']) +export const port = ports['cli-module'] const viteBin = path.join(workspaceRoot, 'packages', 'vite', 'bin', 'vite.js') -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { // collect stdout and stderr streams from child processes here to avoid interfering with regular jest output const streams = { build: { out: [], err: [] }, @@ -60,6 +55,8 @@ exports.serve = async function serve(root, isProd) { } } + await kill(port) + // run `vite --port x` or `vite preview --port x` to start server const viteServerArgs = ['--port', `${port}`, '--strict-port'] if (isProd) { @@ -113,7 +110,7 @@ exports.serve = async function serve(root, isProd) { // helper to validate that server was started on the correct port async function startedOnPort(serverProcess, port, timeout) { let checkPort - const startedPromise = new Promise((resolve, reject) => { + const startedPromise = new Promise((resolve, reject) => { checkPort = (data) => { const str = data.toString() // hack, console output may contain color code gibberish diff --git a/playground/cli/__tests__/serve.js b/playground/cli/__tests__/serve.ts similarity index 91% rename from playground/cli/__tests__/serve.js rename to playground/cli/__tests__/serve.ts index 3ad375d9d1f543..913a4d5b565c73 100644 --- a/playground/cli/__tests__/serve.js +++ b/playground/cli/__tests__/serve.ts @@ -1,21 +1,16 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -// eslint-disable-next-line node/no-restricted-require -const execa = require('execa') -const { workspaceRoot, ports } = require('../../testUtils') +import path from 'path' +import execa from 'execa' +import { workspaceRoot, ports } from '../../testUtils' +import kill from 'kill-port' const isWindows = process.platform === 'win32' const port = (exports.port = ports.cli) const viteBin = path.join(workspaceRoot, 'packages', 'vite', 'bin', 'vite.js') -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { // collect stdout and stderr streams from child processes here to avoid interfering with regular jest output const streams = { build: { out: [], err: [] }, @@ -60,6 +55,8 @@ exports.serve = async function serve(root, isProd) { } } + await kill(port) + // run `vite --port x` or `vite preview --port x` to start server const viteServerArgs = ['--port', `${port}`, '--strict-port'] if (isProd) { @@ -113,7 +110,7 @@ exports.serve = async function serve(root, isProd) { // helper to validate that server was started on the correct port async function startedOnPort(serverProcess, port, timeout) { let checkPort - const startedPromise = new Promise((resolve, reject) => { + const startedPromise = new Promise((resolve, reject) => { checkPort = (data) => { const str = data.toString() // hack, console output may contain color code gibberish diff --git a/playground/css-codesplit-cjs/__tests__/css-codesplit.spec.ts b/playground/css-codesplit-cjs/__tests__/css-codesplit.spec.ts index 95fe97a1b953ba..dae8d5f4b4ca5e 100644 --- a/playground/css-codesplit-cjs/__tests__/css-codesplit.spec.ts +++ b/playground/css-codesplit-cjs/__tests__/css-codesplit.spec.ts @@ -5,7 +5,7 @@ test('should load both stylesheets', async () => { expect(await getColor('h2')).toBe('blue') }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('should remove empty chunk', async () => { expect(findAssetFile(/style.*\.js$/)).toBe('') expect(findAssetFile('main.*.js$')).toMatch(`/* empty css`) @@ -17,4 +17,4 @@ if (isBuild) { expect(manifest['index.html'].css.length).toBe(2) expect(manifest['other.js'].css.length).toBe(1) }) -} +}) diff --git a/playground/css-codesplit/__tests__/css-codesplit.spec.ts b/playground/css-codesplit/__tests__/css-codesplit.spec.ts index 789adba23ae021..820222e9a964d2 100644 --- a/playground/css-codesplit/__tests__/css-codesplit.spec.ts +++ b/playground/css-codesplit/__tests__/css-codesplit.spec.ts @@ -20,7 +20,7 @@ test('should load dynamic import with module', async () => { expect(await getColor('.mod')).toBe('yellow') }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('should remove empty chunk', async () => { expect(findAssetFile(/style.*\.js$/)).toBe('') expect(findAssetFile('main.*.js$')).toMatch(`/* empty css`) @@ -33,4 +33,4 @@ if (isBuild) { expect(manifest['index.html'].css.length).toBe(2) expect(manifest['other.js'].css.length).toBe(1) }) -} +}) diff --git a/playground/css-sourcemap/__tests__/build.spec.ts b/playground/css-sourcemap/__tests__/build.spec.ts index e36c1f52d2c1f8..50b8814aed9c4e 100644 --- a/playground/css-sourcemap/__tests__/build.spec.ts +++ b/playground/css-sourcemap/__tests__/build.spec.ts @@ -1,13 +1,7 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' -if (isBuild) { - test('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') }) -} else { - test('this file only includes test for build', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/css-sourcemap/__tests__/serve.spec.ts b/playground/css-sourcemap/__tests__/serve.spec.ts index becd792e82293a..34a627b68df736 100644 --- a/playground/css-sourcemap/__tests__/serve.spec.ts +++ b/playground/css-sourcemap/__tests__/serve.spec.ts @@ -2,10 +2,10 @@ import { URL } from 'url' import { extractSourcemap, formatSourcemapForSnapshot, - isBuild -} from 'testUtils' + isServe +} from '../../testUtils' -if (!isBuild) { +describe.runIf(isServe)('serve', () => { const getStyleTagContentIncluding = async (content: string) => { const styles = await page.$$('style') for (const style of styles) { @@ -43,13 +43,13 @@ if (!isBuild) { const css = await res.text() const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/be-imported.css", "/root/linked-with-import.css", ], - "sourcesContent": Array [ + "sourcesContent": [ ".be-imported { color: red; } @@ -70,12 +70,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.imported ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACb,CAAC;", - "sources": Array [ + "sources": [ "/root/imported.css", ], - "sourcesContent": Array [ + "sourcesContent": [ ".imported { color: red; } @@ -90,13 +90,13 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.imported-with-import ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA;EACE,UAAU;AACZ;;ACAA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/be-imported.css", "/root/imported-with-import.css", ], - "sourcesContent": Array [ + "sourcesContent": [ ".be-imported { color: red; } @@ -117,12 +117,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.imported-sass ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AACE;EACE", - "sources": Array [ + "sources": [ "/root/imported.sass", ], - "sourcesContent": Array [ + "sourcesContent": [ ".imported &-sass color: red @@ -137,12 +137,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('._imported-sass-module_') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AACE;EACE", - "sources": Array [ + "sources": [ "/root/imported.module.sass", ], - "sourcesContent": Array [ + "sourcesContent": [ ".imported &-sass-module color: red @@ -157,12 +157,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.imported-less ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AACE;EACE", - "sources": Array [ + "sources": [ "/root/imported.less", ], - "sourcesContent": Array [ + "sourcesContent": [ ".imported { &-less { color: @color; @@ -179,12 +179,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.imported-stylus ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AACE;EACE,cAAM", - "sources": Array [ + "sources": [ "/root/imported.styl", ], - "sourcesContent": Array [ + "sourcesContent": [ ".imported &-stylus color blue-red-mixed @@ -200,8 +200,4 @@ if (!isBuild) { expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) }) }) -} else { - test('this file only includes test for serve', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/css/__tests__/css.spec.ts b/playground/css/__tests__/css.spec.ts index e666ca40517d57..3443597816f2d1 100644 --- a/playground/css/__tests__/css.spec.ts +++ b/playground/css/__tests__/css.spec.ts @@ -251,14 +251,12 @@ test('inline css modules', async () => { expect(css).toMatch(/\.inline-module__apply-color-inline___[\w-]{5}/) }) -if (isBuild) { - test('@charset hoist', async () => { - serverLogs.forEach((log) => { - // no warning from esbuild css minifier - expect(log).not.toMatch('"@charset" must be the first rule in the file') - }) +test.runIf(isBuild)('@charset hoist', async () => { + serverLogs.forEach((log) => { + // no warning from esbuild css minifier + expect(log).not.toMatch('"@charset" must be the first rule in the file') }) -} +}) test('@import dependency w/ style entry', async () => { expect(await getColor('.css-dep')).toBe('purple') diff --git a/playground/data-uri/__tests__/data-uri.spec.ts b/playground/data-uri/__tests__/data-uri.spec.ts index e1d488c931e7c1..bf9d595c813322 100644 --- a/playground/data-uri/__tests__/data-uri.spec.ts +++ b/playground/data-uri/__tests__/data-uri.spec.ts @@ -8,9 +8,7 @@ test('base64', async () => { expect(await page.textContent('.base64')).toBe('hi') }) -if (isBuild) { - test('should compile away the import for build', async () => { - const file = findAssetFile('index') - expect(file).not.toMatch('import') - }) -} +test.runIf(isBuild)('should compile away the import for build', async () => { + const file = findAssetFile('index') + expect(file).not.toMatch('import') +}) diff --git a/playground/define/__tests__/define.spec.ts b/playground/define/__tests__/define.spec.ts index 3a4f34c5bbe7ff..a7a45dcea1b701 100644 --- a/playground/define/__tests__/define.spec.ts +++ b/playground/define/__tests__/define.spec.ts @@ -7,6 +7,7 @@ test('string', async () => { expect(await page.textContent('.string')).toBe(JSON.parse(defines.__STRING__)) expect(await page.textContent('.number')).toBe(String(defines.__NUMBER__)) expect(await page.textContent('.boolean')).toBe(String(defines.__BOOLEAN__)) + expect(await page.textContent('.object')).toBe( JSON.stringify(defines.__OBJ__, null, 2) ) diff --git a/playground/env-nested/__tests__/env-nested.spec.ts b/playground/env-nested/__tests__/env-nested.spec.ts index 1ceebde7a044b7..ed107acb233e02 100644 --- a/playground/env-nested/__tests__/env-nested.spec.ts +++ b/playground/env-nested/__tests__/env-nested.spec.ts @@ -1,4 +1,4 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' const mode = isBuild ? `production` : `development` diff --git a/playground/env/__tests__/env.spec.ts b/playground/env/__tests__/env.spec.ts index 907cebc8037ce9..cbc0aad524001c 100644 --- a/playground/env/__tests__/env.spec.ts +++ b/playground/env/__tests__/env.spec.ts @@ -1,4 +1,4 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' const mode = isBuild ? `production` : `development` diff --git a/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts b/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts index 24f1237efedeec..04ce2e71b00cd8 100644 --- a/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts +++ b/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts @@ -6,8 +6,9 @@ import { isBuild } from '../../testUtils' -if (!isBuild) { - test('should hmr when file is deleted and restored', async () => { +test.runIf(isBuild)( + 'should hmr when file is deleted and restored', + async () => { await untilUpdated(() => page.textContent('p'), 'Child state 1') editFile('Child.jsx', (code) => @@ -39,7 +40,7 @@ if (!isBuild) { (code) => `import { useState } from 'react' import Child from './Child' - + function App() { return (
@@ -47,15 +48,11 @@ if (!isBuild) {
) } - + export default App ` ) await untilUpdated(() => page.textContent('p'), 'Child state 1') - }) -} else { - test('dummy test to make jest happy', async () => { - // Your test suite must contain at least one test. - }) -} + } +) diff --git a/playground/fs-serve/__tests__/fs-serve.spec.ts b/playground/fs-serve/__tests__/fs-serve.spec.ts index eba1e441881710..75c3fc6edfee04 100644 --- a/playground/fs-serve/__tests__/fs-serve.spec.ts +++ b/playground/fs-serve/__tests__/fs-serve.spec.ts @@ -1,73 +1,67 @@ -import { isBuild } from '../../testUtils' +import { isServe } from '../../testUtils' const json = require('../safe.json') const stringified = JSON.stringify(json) -describe('main', () => { +describe.runIf(isServe)('main', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/src/') }) - if (!isBuild) { - test('default import', async () => { - expect(await page.textContent('.full')).toBe(stringified) - }) + test('default import', async () => { + expect(await page.textContent('.full')).toBe(stringified) + }) - test('named import', async () => { - expect(await page.textContent('.named')).toBe(json.msg) - }) + test('named import', async () => { + expect(await page.textContent('.named')).toBe(json.msg) + }) - test('safe fetch', async () => { - expect(await page.textContent('.safe-fetch')).toMatch('KEY=safe') - expect(await page.textContent('.safe-fetch-status')).toBe('200') - }) + test('safe fetch', async () => { + expect(await page.textContent('.safe-fetch')).toMatch('KEY=safe') + expect(await page.textContent('.safe-fetch-status')).toBe('200') + }) - test('safe fetch with special characters', async () => { - expect( - await page.textContent('.safe-fetch-subdir-special-characters') - ).toMatch('KEY=safe') - expect( - await page.textContent('.safe-fetch-subdir-special-characters-status') - ).toBe('200') - }) + test('safe fetch with special characters', async () => { + expect( + await page.textContent('.safe-fetch-subdir-special-characters') + ).toMatch('KEY=safe') + expect( + await page.textContent('.safe-fetch-subdir-special-characters-status') + ).toBe('200') + }) - test('unsafe fetch', async () => { - expect(await page.textContent('.unsafe-fetch')).toMatch('403 Restricted') - expect(await page.textContent('.unsafe-fetch-status')).toBe('403') - }) + test('unsafe fetch', async () => { + expect(await page.textContent('.unsafe-fetch')).toMatch('403 Restricted') + expect(await page.textContent('.unsafe-fetch-status')).toBe('403') + }) - test('safe fs fetch', async () => { - expect(await page.textContent('.safe-fs-fetch')).toBe(stringified) - expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') - }) + test('safe fs fetch', async () => { + expect(await page.textContent('.safe-fs-fetch')).toBe(stringified) + expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') + }) - test('safe fs fetch with special characters', async () => { - expect(await page.textContent('.safe-fs-fetch-special-characters')).toBe( - stringified - ) - expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') - }) + test('safe fs fetch with special characters', async () => { + expect(await page.textContent('.safe-fs-fetch-special-characters')).toBe( + stringified + ) + expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') + }) - test('unsafe fs fetch', async () => { - expect(await page.textContent('.unsafe-fs-fetch')).toBe('') - expect(await page.textContent('.unsafe-fs-fetch-status')).toBe('403') - }) + test('unsafe fs fetch', async () => { + expect(await page.textContent('.unsafe-fs-fetch')).toBe('') + expect(await page.textContent('.unsafe-fs-fetch-status')).toBe('403') + }) - test('nested entry', async () => { - expect(await page.textContent('.nested-entry')).toBe('foobar') - }) + test('nested entry', async () => { + expect(await page.textContent('.nested-entry')).toBe('foobar') + }) - test('nested entry', async () => { - expect(await page.textContent('.nested-entry')).toBe('foobar') - }) + test('nested entry', async () => { + expect(await page.textContent('.nested-entry')).toBe('foobar') + }) - test('denied', async () => { - expect(await page.textContent('.unsafe-dotenv')).toBe('404') - }) - } else { - test('dummy test to make jest happy', async () => { - // Your test suite must contain at least one test. - }) - } + test('denied', async () => { + expect(await page.textContent('.unsafe-dotenv')).toBe('404') + }) }) diff --git a/playground/hmr/tsconfig.json b/playground/hmr/tsconfig.json index 41b16fdc65ec8c..9da745ba51a3e9 100644 --- a/playground/hmr/tsconfig.json +++ b/playground/hmr/tsconfig.json @@ -10,6 +10,6 @@ "moduleResolution": "node", "baseUrl": ".", "jsx": "preserve", - "types": ["vite/client", "jest", "node"] + "types": ["vite/client", "node"] } } diff --git a/playground/html/__tests__/html.spec.ts b/playground/html/__tests__/html.spec.ts index 834db1f6126cad..3041247bc776d4 100644 --- a/playground/html/__tests__/html.spec.ts +++ b/playground/html/__tests__/html.spec.ts @@ -1,4 +1,4 @@ -import { getColor, isBuild, editFile } from '../../testUtils' +import { getColor, isBuild, editFile, isServe } from '../../testUtils' function testPage(isNested: boolean) { test('pre transform', async () => { @@ -79,7 +79,7 @@ describe('main', () => { describe('nested', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/nested/') }) @@ -88,17 +88,17 @@ describe('nested', () => { describe('nested w/ query', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/nested/index.html?v=1') }) testPage(true) }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { describe('scriptAsync', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/scriptAsync.html') }) @@ -110,7 +110,7 @@ if (isBuild) { describe('scriptMixed', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/scriptMixed.html') }) @@ -124,7 +124,7 @@ if (isBuild) { // Ensure that the modulePreload polyfill is discarded in this case beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/zeroJS.html') }) @@ -164,11 +164,11 @@ if (isBuild) { ) }) }) -} +}) describe('noHead', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/noHead.html') }) @@ -183,7 +183,7 @@ describe('noHead', () => { describe('noBody', () => { beforeAll(async () => { - // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + // viteTestUrl is globally injected in scripts/vitestSetup.ts await page.goto(viteTestUrl + '/noBody.html') }) @@ -211,28 +211,26 @@ describe('unicode path', () => { }) }) -if (!isBuild) { - describe('invalid', () => { - test('should be 500 with overlay', async () => { - const response = await page.goto(viteTestUrl + '/invalid.html') - expect(response.status()).toBe(500) +describe.runIf(isServe)('invalid', () => { + test('should be 500 with overlay', async () => { + const response = await page.goto(viteTestUrl + '/invalid.html') + expect(response.status()).toBe(500) - const errorOverlay = await page.waitForSelector('vite-error-overlay') - expect(errorOverlay).toBeTruthy() + const errorOverlay = await page.waitForSelector('vite-error-overlay') + expect(errorOverlay).toBeTruthy() - const message = await errorOverlay.$$eval('.message-body', (m) => { - return m[0].innerHTML - }) - expect(message).toMatch(/^Unable to parse HTML/) + const message = await errorOverlay.$$eval('.message-body', (m) => { + return m[0].innerHTML }) + expect(message).toMatch(/^Unable to parse HTML/) + }) - test('should reload when fixed', async () => { - const response = await page.goto(viteTestUrl + '/invalid.html') - await editFile('invalid.html', (content) => { - return content.replace('
Good') - }) - const content = await page.waitForSelector('text=Good HTML') - expect(content).toBeTruthy() + test('should reload when fixed', async () => { + const response = await page.goto(viteTestUrl + '/invalid.html') + await editFile('invalid.html', (content) => { + return content.replace('
Good') }) + const content = await page.waitForSelector('text=Good HTML') + expect(content).toBeTruthy() }) -} +}) diff --git a/playground/js-sourcemap/__tests__/build.spec.ts b/playground/js-sourcemap/__tests__/build.spec.ts index e36c1f52d2c1f8..50b8814aed9c4e 100644 --- a/playground/js-sourcemap/__tests__/build.spec.ts +++ b/playground/js-sourcemap/__tests__/build.spec.ts @@ -1,13 +1,7 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' -if (isBuild) { - test('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') }) -} else { - test('this file only includes test for build', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/js-sourcemap/__tests__/serve.spec.ts b/playground/js-sourcemap/__tests__/serve.spec.ts index a1ffdddc37ecd5..b3946461dde197 100644 --- a/playground/js-sourcemap/__tests__/serve.spec.ts +++ b/playground/js-sourcemap/__tests__/serve.spec.ts @@ -3,7 +3,7 @@ import { extractSourcemap, formatSourcemapForSnapshot, isBuild -} from 'testUtils' +} from '../../testUtils' if (!isBuild) { test('js', async () => { @@ -18,12 +18,12 @@ if (!isBuild) { const js = await res.text() const map = extractSourcemap(js) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAO,aAAM,MAAM;", - "sources": Array [ + "sources": [ "/root/bar.ts", ], - "sourcesContent": Array [ + "sourcesContent": [ "export const bar = 'bar' ", ], diff --git a/playground/legacy/__tests__/legacy.spec.ts b/playground/legacy/__tests__/legacy.spec.ts index 9fd3419337568d..c0eaa81fbc31d8 100644 --- a/playground/legacy/__tests__/legacy.spec.ts +++ b/playground/legacy/__tests__/legacy.spec.ts @@ -67,7 +67,7 @@ test('should load dynamic import with css', async () => { ) }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('should generate correct manifest', async () => { const manifest = readManifest() expect(manifest['../../vite/legacy-polyfills']).toBeDefined() @@ -98,4 +98,4 @@ if (isBuild) { test('includes structuredClone polyfill which is supported after core-js v3', () => { expect(findAssetFile(/polyfills-legacy/)).toMatch('"structuredClone"') }) -} +}) diff --git a/playground/legacy/__tests__/ssr/legacy-ssr.spec.ts b/playground/legacy/__tests__/ssr/legacy-ssr.spec.ts index dad9b94d83509e..bc232e8af129c6 100644 --- a/playground/legacy/__tests__/ssr/legacy-ssr.spec.ts +++ b/playground/legacy/__tests__/ssr/legacy-ssr.spec.ts @@ -3,7 +3,7 @@ import { port } from './serve' const url = `http://localhost:${port}` -if (isBuild) { +describe.runIf(isBuild)('legacy-ssr', () => { test('should work', async () => { await page.goto(url) expect(await page.textContent('#app')).toMatch('Hello') @@ -13,8 +13,4 @@ if (isBuild) { // SSR build is always modern expect(await page.textContent('#env')).toMatch('false') }) -} else { - // this test doesn't support serve mode - // must contain at least one test - test('should work', () => void 0) -} +}) diff --git a/playground/legacy/__tests__/ssr/serve.js b/playground/legacy/__tests__/ssr/serve.ts similarity index 72% rename from playground/legacy/__tests__/ssr/serve.js rename to playground/legacy/__tests__/ssr/serve.ts index c7ef2ed3520e53..597320c9a58c0f 100644 --- a/playground/legacy/__tests__/ssr/serve.js +++ b/playground/legacy/__tests__/ssr/serve.ts @@ -1,16 +1,11 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../../testUtils') +import path from 'path' +import { ports } from '../../../testUtils' -const port = (exports.port = ports['legacy/ssr']) +export const port = ports['legacy/ssr'] -/** - * @param {string} root - * @param {boolean} _isProd - */ -exports.serve = async function serve(root, _isProd) { +export async function serve(root: string, _isProd: boolean) { const { build } = require('vite') await build({ root, diff --git a/playground/lib/__tests__/lib.spec.ts b/playground/lib/__tests__/lib.spec.ts index cc5887c2777fcb..6d7ca7c5670ea0 100644 --- a/playground/lib/__tests__/lib.spec.ts +++ b/playground/lib/__tests__/lib.spec.ts @@ -1,8 +1,8 @@ -import { isBuild, findAssetFile, testDir } from 'testUtils' +import { isBuild, testDir, isServe } from '../../testUtils' import path from 'path' import fs from 'fs' -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('es', async () => { expect(await page.textContent('.es')).toBe('It works') }) @@ -10,7 +10,7 @@ if (isBuild) { test('umd', async () => { expect(await page.textContent('.umd')).toBe('It works') const code = fs.readFileSync( - path.join(testDir, 'dist/my-lib-custom-filename.umd.js'), + path.join(testDir(), 'dist/my-lib-custom-filename.umd.js'), 'utf-8' ) // esbuild helpers are injected inside of the UMD wrapper @@ -20,7 +20,7 @@ if (isBuild) { test('iife', async () => { expect(await page.textContent('.iife')).toBe('It works') const code = fs.readFileSync( - path.join(testDir, 'dist/my-lib-custom-filename.iife.js'), + path.join(testDir(), 'dist/my-lib-custom-filename.iife.js'), 'utf-8' ) // esbuild helpers are injected inside of the IIFE wrapper @@ -30,7 +30,7 @@ if (isBuild) { test('Library mode does not include `preload`', async () => { expect(await page.textContent('.dynamic-import-message')).toBe('hello vite') const code = fs.readFileSync( - path.join(testDir, 'dist/lib/dynamic-import-message.js'), + path.join(testDir(), 'dist/lib/dynamic-import-message.js'), 'utf-8' ) expect(code).not.toMatch('__vitePreload') @@ -42,8 +42,8 @@ if (isBuild) { expect(log).not.toMatch('All "@import" rules must come first') }) }) -} else { - test('dev', async () => { - expect(await page.textContent('.demo')).toBe('It works') - }) -} +}) + +test.runIf(isServe)('dev', async () => { + expect(await page.textContent('.demo')).toBe('It works') +}) diff --git a/playground/lib/__tests__/serve.js b/playground/lib/__tests__/serve.ts similarity index 81% rename from playground/lib/__tests__/serve.js rename to playground/lib/__tests__/serve.ts index 2534545de5c221..3bde3d35a78dc1 100644 --- a/playground/lib/__tests__/serve.js +++ b/playground/lib/__tests__/serve.ts @@ -1,29 +1,23 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const http = require('http') -const sirv = require('sirv') -const { ports } = require('../../testUtils') +import path from 'path' +import http from 'http' +import sirv from 'sirv' +import { ports } from '../../testUtils' -const port = (exports.port = ports.lib) +export const port = ports.lib -global.serverLogs = [] - -/** - * @param {string} root - * @param {boolean} isBuildTest - */ -exports.serve = async function serve(root, isBuildTest) { - // build first +export async function serve(root, isBuildTest) { + // @ts-expect-error + global.serverLogs = [] setupConsoleWarnCollector() if (!isBuildTest) { const { createServer } = require('vite') process.env.VITE_INLINE = 'inline-serve' - let viteServer = await ( + const viteServer = await ( await createServer({ root: root, logLevel: 'silent', @@ -45,6 +39,7 @@ exports.serve = async function serve(root, isBuildTest) { // use resolved port/base from server const base = viteServer.config.base === '/' ? '' : viteServer.config.base const url = + // @ts-expect-error (global.viteTestUrl = `http://localhost:${viteServer.config.server.port}${base}`) await page.goto(url) @@ -97,6 +92,7 @@ exports.serve = async function serve(root, isBuildTest) { function setupConsoleWarnCollector() { const warn = console.warn console.warn = (...args) => { + // @ts-expect-error global.serverLogs.push(args.join(' ')) return warn.call(console, ...args) } diff --git a/playground/optimize-missing-deps/__test__/optimize-missing-deps.spec.ts b/playground/optimize-missing-deps/__test__/optimize-missing-deps.spec.ts index dd776daeceadbf..9f6934dd25ace8 100644 --- a/playground/optimize-missing-deps/__test__/optimize-missing-deps.spec.ts +++ b/playground/optimize-missing-deps/__test__/optimize-missing-deps.spec.ts @@ -1,10 +1,12 @@ import { port } from './serve' import fetch from 'node-fetch' import { untilUpdated } from '../../testUtils' +import { platform } from 'os' -const url = `http://localhost:${port}` +const url = `http://localhost:${port}/` -test('*', async () => { +// TODO: on macOS this test causing the process exists for some reason +test.skipIf(platform() === 'darwin')('optimize', async () => { await page.goto(url) // reload page to get optimized missing deps await page.reload() @@ -12,5 +14,5 @@ test('*', async () => { // raw http request const aboutHtml = await (await fetch(url)).text() - expect(aboutHtml).toMatch('Server') + expect(aboutHtml).toContain('Server') }) diff --git a/playground/ssr-pug/__tests__/serve.js b/playground/optimize-missing-deps/__test__/serve.ts similarity index 64% rename from playground/ssr-pug/__tests__/serve.js rename to playground/optimize-missing-deps/__test__/serve.ts index 392aa831ebb82d..3b60850905e389 100644 --- a/playground/ssr-pug/__tests__/serve.js +++ b/playground/optimize-missing-deps/__test__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-pug']) +export const port = ports['optimize-missing-deps'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { const { createServer } = require(path.resolve(root, 'server.js')) const { app, vite } = await createServer(root, isProd) diff --git a/playground/preload/__tests__/preload.spec.ts b/playground/preload/__tests__/preload.spec.ts index 27a64930487797..b0ffb58a291bac 100644 --- a/playground/preload/__tests__/preload.spec.ts +++ b/playground/preload/__tests__/preload.spec.ts @@ -6,7 +6,7 @@ test('should have no 404s', () => { }) }) -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('dynamic import', async () => { const appHtml = await page.content() expect(appHtml).toMatch('This is home page.') @@ -22,4 +22,4 @@ if (isBuild) { /link rel="stylesheet".*?href="\/assets\/Hello\.\w{8}\.css"/ ) }) -} +}) diff --git a/playground/preload/vite.config.js b/playground/preload/vite.config.ts similarity index 62% rename from playground/preload/vite.config.js rename to playground/preload/vite.config.ts index 90684f41829953..7fa1eb189818b3 100644 --- a/playground/preload/vite.config.js +++ b/playground/preload/vite.config.ts @@ -1,6 +1,7 @@ -const vuePlugin = require('@vitejs/plugin-vue') +import vuePlugin from '@vitejs/plugin-vue' +import { defineConfig } from 'vite' -module.exports = { +export default defineConfig({ plugins: [vuePlugin()], build: { minify: 'terser', @@ -13,4 +14,4 @@ module.exports = { } } } -} +}) diff --git a/playground/react/__tests__/react.spec.ts b/playground/react/__tests__/react.spec.ts index 46eb752924f801..4b39a304733318 100644 --- a/playground/react/__tests__/react.spec.ts +++ b/playground/react/__tests__/react.spec.ts @@ -1,4 +1,4 @@ -import { editFile, untilUpdated, isBuild } from '../../testUtils' +import { editFile, untilUpdated, isServe } from '../../testUtils' test('should render', async () => { expect(await page.textContent('h1')).toMatch('Hello Vite + React') @@ -17,23 +17,22 @@ test('should hmr', async () => { expect(await page.textContent('button')).toMatch('count is: 1') }) -test('should have annotated jsx with file location metadata', async () => { - // we're not annotating in prod, - // so we skip this test when isBuild is true - if (isBuild) return - - const meta = await page.evaluate(() => { - const button = document.querySelector('button') - const key = Object.keys(button).find( - (key) => key.indexOf('__reactFiber') === 0 - ) - return button[key]._debugSource - }) - // If the evaluate call doesn't crash, and the returned metadata has - // the expected fields, we're good. - expect(Object.keys(meta).sort()).toEqual([ - 'columnNumber', - 'fileName', - 'lineNumber' - ]) -}) +test.runIf(isServe)( + 'should have annotated jsx with file location metadata', + async () => { + const meta = await page.evaluate(() => { + const button = document.querySelector('button') + const key = Object.keys(button).find( + (key) => key.indexOf('__reactFiber') === 0 + ) + return button[key]._debugSource + }) + // If the evaluate call doesn't crash, and the returned metadata has + // the expected fields, we're good. + expect(Object.keys(meta).sort()).toEqual([ + 'columnNumber', + 'fileName', + 'lineNumber' + ]) + } +) diff --git a/playground/resolve-config/__tests__/resolve-config.spec.ts b/playground/resolve-config/__tests__/resolve-config.spec.ts index cde329afde2f50..bd45ad6c95012d 100644 --- a/playground/resolve-config/__tests__/resolve-config.spec.ts +++ b/playground/resolve-config/__tests__/resolve-config.spec.ts @@ -5,7 +5,7 @@ import { isBuild, testDir, workspaceRoot } from '../../testUtils' const viteBin = path.join(workspaceRoot, 'packages', 'vite', 'bin', 'vite.js') -const fromTestDir = (...p: string[]) => path.resolve(testDir, ...p) +const fromTestDir = (...p: string[]) => path.resolve(testDir(), ...p) const build = (configName: string) => { commandSync(`${viteBin} build`, { cwd: fromTestDir(configName) }) @@ -17,7 +17,7 @@ const getDistFile = (configName: string, extension: string) => { ) } -if (isBuild) { +describe.runIf(isBuild)('build', () => { it('loads vite.config.js', () => { build('js') expect(getDistFile('js', 'mjs')).toContain('console.log(true)') @@ -50,8 +50,4 @@ if (isBuild) { build('ts-module') expect(getDistFile('ts-module', 'js')).toContain('console.log(true)') }) -} else { - // this test doesn't support serve mode - // must contain at least one test - test('should work', () => void 0) -} +}) diff --git a/playground/resolve-config/__tests__/serve.js b/playground/resolve-config/__tests__/serve.ts similarity index 71% rename from playground/resolve-config/__tests__/serve.js rename to playground/resolve-config/__tests__/serve.ts index bd451d4cf6f6bc..4c1561264113e8 100644 --- a/playground/resolve-config/__tests__/serve.js +++ b/playground/resolve-config/__tests__/serve.ts @@ -1,19 +1,16 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const fs = require('fs-extra') -const { testDir } = require('../../testUtils') - -const fromTestDir = (/** @type{string[]} */ ...p) => path.resolve(testDir, ...p) +import path from 'path' +import fs from 'fs-extra' const configNames = ['js', 'cjs', 'mjs', 'ts'] -/** @param {string} root @param {boolean} isProd */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { if (!isProd) return + const fromTestDir = (...p: string[]) => path.resolve(root, '..', ...p) + // create separate directories for all config types: // ./{js,cjs,mjs,ts} and ./{js,cjs,mjs,ts}-module (with package#type) for (const configName of configNames) { diff --git a/playground/ssr-deps/__tests__/serve.js b/playground/ssr-deps/__tests__/serve.ts similarity index 64% rename from playground/ssr-deps/__tests__/serve.js rename to playground/ssr-deps/__tests__/serve.ts index 6c2584601c9331..92c73fc50a8629 100644 --- a/playground/ssr-deps/__tests__/serve.js +++ b/playground/ssr-deps/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-deps']) +export const port = ports['ssr-deps'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root, isProd) { const { createServer } = require(path.resolve(root, 'server.js')) const { app, vite } = await createServer(root, isProd) diff --git a/playground/ssr-html/__tests__/serve.js b/playground/ssr-html/__tests__/serve.ts similarity index 64% rename from playground/ssr-html/__tests__/serve.js rename to playground/ssr-html/__tests__/serve.ts index d119397700cf75..804009e92e86d6 100644 --- a/playground/ssr-html/__tests__/serve.js +++ b/playground/ssr-html/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-html']) +export const port = ports['ssr-html'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root, isProd) { const { createServer } = require(path.resolve(root, 'server.js')) const { app, vite } = await createServer(root, isProd) diff --git a/playground/optimize-missing-deps/__test__/serve.js b/playground/ssr-pug/__tests__/serve.ts similarity index 63% rename from playground/optimize-missing-deps/__test__/serve.js rename to playground/ssr-pug/__tests__/serve.ts index 89a6ce3593cd0e..2d687a5a685664 100644 --- a/playground/optimize-missing-deps/__test__/serve.js +++ b/playground/ssr-pug/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['optimize-missing-deps']) +export const port = ports['ssr-pug'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root, isProd) { const { createServer } = require(path.resolve(root, 'server.js')) const { app, vite } = await createServer(root, isProd) diff --git a/playground/ssr-react/__tests__/serve.js b/playground/ssr-react/__tests__/serve.ts similarity index 77% rename from playground/ssr-react/__tests__/serve.js rename to playground/ssr-react/__tests__/serve.ts index 07476e0726e268..2f8479a7463bd7 100644 --- a/playground/ssr-react/__tests__/serve.js +++ b/playground/ssr-react/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-react']) +export const port = ports['ssr-react'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { if (isProd) { // build first const { build } = require('vite') diff --git a/playground/ssr-vue/__tests__/serve.js b/playground/ssr-vue/__tests__/serve.ts similarity index 77% rename from playground/ssr-vue/__tests__/serve.js rename to playground/ssr-vue/__tests__/serve.ts index 5bcd5a4639877a..138729bfdaa01e 100644 --- a/playground/ssr-vue/__tests__/serve.js +++ b/playground/ssr-vue/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-vue']) +export const port = ports['ssr-vue'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root, isProd) { if (isProd) { // build first const { build } = require('vite') diff --git a/playground/ssr-vue/__tests__/ssr-vue.spec.ts b/playground/ssr-vue/__tests__/ssr-vue.spec.ts index baa7b79dd74252..193c95b1f4a1c1 100644 --- a/playground/ssr-vue/__tests__/ssr-vue.spec.ts +++ b/playground/ssr-vue/__tests__/ssr-vue.spec.ts @@ -110,6 +110,7 @@ test('css', async () => { } else { // During dev, the CSS is loaded from async chunk and we may have to wait // when the test runs concurrently. + await page.waitForLoadState('networkidle') await untilUpdated(() => getColor('h1'), 'green') await untilUpdated(() => getColor('.jsx'), 'blue') } @@ -141,11 +142,13 @@ test('nested virtual module', async () => { test('hydration', async () => { expect(await page.textContent('button')).toMatch('0') await page.click('button') + await page.waitForLoadState('networkidle') expect(await page.textContent('button')).toMatch('1') }) test('hmr', async () => { editFile('src/pages/Home.vue', (code) => code.replace('Home', 'changed')) + await page.waitForLoadState('networkidle') await untilUpdated(() => page.textContent('h1'), 'changed') }) @@ -154,6 +157,7 @@ test('client navigation', async () => { await page.click('a[href="/about"]') await untilUpdated(() => page.textContent('h1'), 'About') editFile('src/pages/About.vue', (code) => code.replace('About', 'changed')) + await page.waitForLoadState('networkidle') await untilUpdated(() => page.textContent('h1'), 'changed') await page.click('a[href="/"]') await untilUpdated(() => page.textContent('a[href="/"]'), 'Home') @@ -164,19 +168,17 @@ test('import.meta.url', async () => { expect(await page.textContent('.protocol')).toEqual('file:') }) -test('dynamic css file should be preloaded', async () => { - if (isBuild) { - await page.goto(url) - const homeHtml = await (await fetch(url)).text() - const re = /link rel="modulepreload".*?href="\/assets\/(Home\.\w{8}\.js)"/ - const filename = re.exec(homeHtml)[1] - const manifest = require(resolve( - process.cwd(), - './playground-temp/ssr-vue/dist/client/ssr-manifest.json' - )) - const depFile = manifest[filename] - for (const file of depFile) { - expect(homeHtml).toMatch(file) - } +test.runIf(isBuild)('dynamic css file should be preloaded', async () => { + await page.goto(url) + const homeHtml = await (await fetch(url)).text() + const re = /link rel="modulepreload".*?href="\/assets\/(Home\.\w{8}\.js)"/ + const filename = re.exec(homeHtml)[1] + const manifest = require(resolve( + process.cwd(), + './playground-temp/ssr-vue/dist/client/ssr-manifest.json' + )) + const depFile = manifest[filename] + for (const file of depFile) { + expect(homeHtml).toMatch(file) } }) diff --git a/playground/ssr-webworker/__tests__/serve.js b/playground/ssr-webworker/__tests__/serve.ts similarity index 72% rename from playground/ssr-webworker/__tests__/serve.js rename to playground/ssr-webworker/__tests__/serve.ts index 38a957b0a333ea..382208b3b06d2e 100644 --- a/playground/ssr-webworker/__tests__/serve.js +++ b/playground/ssr-webworker/__tests__/serve.ts @@ -1,17 +1,12 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace +// this is automatically detected by scripts/vitestSetup.ts and will replace // the default e2e test serve behavior -const path = require('path') -const { ports } = require('../../testUtils') +import path from 'path' +import { ports } from '../../testUtils' -const port = (exports.port = ports['ssr-webworker']) +export const port = ports['ssr-webworker'] -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { +export async function serve(root: string, isProd: boolean) { // we build first, regardless of whether it's prod/build mode // because Vite doesn't support the concept of a "webworker server" const { build } = require('vite') diff --git a/playground/ssr-webworker/worker.js b/playground/ssr-webworker/worker.js index 09725aaa9d71bb..e9a51e320c9899 100644 --- a/playground/ssr-webworker/worker.js +++ b/playground/ssr-webworker/worker.js @@ -2,11 +2,11 @@ const path = require('path') const { Miniflare } = require('miniflare') -const isDev = process.env.DEV +const isTest = !!process.env.TEST -async function createServer(root = process.cwd()) { +async function createServer() { const mf = new Miniflare({ - scriptPath: path.resolve(root, 'dist/worker/entry-worker.js') + scriptPath: path.resolve(__dirname, 'dist/worker/entry-worker.js') }) const app = mf.createServer() @@ -14,7 +14,7 @@ async function createServer(root = process.cwd()) { return { app } } -if (isDev) { +if (!isTest) { createServer().then(({ app }) => app.listen(3000, () => { console.log('http://localhost:3000') diff --git a/playground/tailwind-sourcemap/__tests__/build.spec.ts b/playground/tailwind-sourcemap/__tests__/build.spec.ts index e36c1f52d2c1f8..50b8814aed9c4e 100644 --- a/playground/tailwind-sourcemap/__tests__/build.spec.ts +++ b/playground/tailwind-sourcemap/__tests__/build.spec.ts @@ -1,13 +1,7 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' -if (isBuild) { - test('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') }) -} else { - test('this file only includes test for build', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/tailwind-sourcemap/__tests__/serve.spec.ts b/playground/tailwind-sourcemap/__tests__/serve.spec.ts index d961f75e4536e5..8d4613190f02a2 100644 --- a/playground/tailwind-sourcemap/__tests__/serve.spec.ts +++ b/playground/tailwind-sourcemap/__tests__/serve.spec.ts @@ -1,13 +1,7 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' -if (!isBuild) { - test('should not output missing source file warning', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) - }) +test.runIf(isBuild)('should not output missing source file warning', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch(/Sourcemap for .+ points to missing source files/) }) -} else { - test('this file only includes test for serve', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/testUtils.ts b/playground/testUtils.ts index 7abf09eaada081..d423ba942923cb 100644 --- a/playground/testUtils.ts +++ b/playground/testUtils.ts @@ -1,6 +1,5 @@ // test utils used in e2e tests for playgrounds. -// this can be directly imported in any playground tests as 'testUtils', e.g. -// `import { getColor } from 'testUtils'` +// `import { getColor } from '../../testUtils'` import fs from 'fs' import path from 'path' @@ -9,6 +8,7 @@ import type { ElementHandle } from 'playwright-chromium' import type { Manifest } from 'vite' import { normalizePath } from 'vite' import { fromComment } from 'convert-source-map' +import { expect } from 'vitest' // make sure these ports are unique export const ports = { @@ -32,10 +32,13 @@ export function slash(p: string): string { } export const isBuild = !!process.env.VITE_TEST_BUILD +export const isServe = !isBuild -const testPath = expect.getState().testPath -const testName = slash(testPath).match(/playground\/([\w-]+)\//)?.[1] -export const testDir = path.resolve(__dirname, '../playground-temp', testName) +export const testDir = () => { + const testPath = expect.getState().testPath + const testName = slash(testPath).match(/playground\/([\w-]+)\//)?.[1] + return path.resolve(__dirname, '../playground-temp', testName) +} export const workspaceRoot = path.resolve(__dirname, '../') const hexToNameMap: Record = {} @@ -89,7 +92,7 @@ export async function getBgColor(el: string | ElementHandle): Promise { } export function readFile(filename: string): string { - return fs.readFileSync(path.resolve(testDir, filename), 'utf-8') + return fs.readFileSync(path.resolve(testDir(), filename), 'utf-8') } export function editFile( @@ -98,27 +101,27 @@ export function editFile( runInBuild: boolean = false ): void { if (isBuild && !runInBuild) return - filename = path.resolve(testDir, filename) + filename = path.resolve(testDir(), filename) const content = fs.readFileSync(filename, 'utf-8') const modified = replacer(content) fs.writeFileSync(filename, modified) } export function addFile(filename: string, content: string): void { - fs.writeFileSync(path.resolve(testDir, filename), content) + fs.writeFileSync(path.resolve(testDir(), filename), content) } export function removeFile(filename: string): void { - fs.unlinkSync(path.resolve(testDir, filename)) + fs.unlinkSync(path.resolve(testDir(), filename)) } export function listAssets(base = ''): string[] { - const assetsDir = path.join(testDir, 'dist', base, 'assets') + const assetsDir = path.join(testDir(), 'dist', base, 'assets') return fs.readdirSync(assetsDir) } export function findAssetFile(match: string | RegExp, base = ''): string { - const assetsDir = path.join(testDir, 'dist', base, 'assets') + const assetsDir = path.join(testDir(), 'dist', base, 'assets') const files = fs.readdirSync(assetsDir) const file = files.find((file) => { return file.match(match) @@ -128,7 +131,10 @@ export function findAssetFile(match: string | RegExp, base = ''): string { export function readManifest(base = ''): Manifest { return JSON.parse( - fs.readFileSync(path.join(testDir, 'dist', base, 'manifest.json'), 'utf-8') + fs.readFileSync( + path.join(testDir(), 'dist', base, 'manifest.json'), + 'utf-8' + ) ) } @@ -156,7 +162,7 @@ export async function untilUpdated( /** * Send the rebuild complete message in build watch */ -export { notifyRebuildComplete } from '../scripts/jestPerTestSetup' +export { notifyRebuildComplete } from '../scripts/vitestSetup' export const extractSourcemap = (content: string) => { const lines = content.trim().split('\n') @@ -164,7 +170,7 @@ export const extractSourcemap = (content: string) => { } export const formatSourcemapForSnapshot = (map: any) => { - const root = normalizePath(testDir) + const root = normalizePath(testDir()) const m = { ...map } delete m.file delete m.names diff --git a/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts b/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts index 699f658da6a255..30485918ea6e2d 100644 --- a/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts +++ b/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts @@ -1,6 +1,12 @@ -import { editFile, isBuild, readFile, untilUpdated } from '../../testUtils' +import { + editFile, + isBuild, + isServe, + readFile, + untilUpdated +} from '../../testUtils' -if (isBuild) { +describe.runIf(isBuild)('build', () => { test('should throw an error on build', () => { const buildError = beforeAllError expect(buildError).toBeTruthy() @@ -20,7 +26,9 @@ if (isBuild) { expect(err).toBeTruthy() expect(err.code).toBe('ENOENT') }) -} else { +}) + +describe.runIf(isServe)('server', () => { test('should log 500 error in browser for malformed tsconfig', () => { // don't test for actual complete message as this might be locale dependant. chrome does log 500 consistently though expect(browserLogs.find((x) => x.includes('500'))).toBeTruthy() @@ -47,4 +55,4 @@ if (isBuild) { return browserLogs.find((x) => x === 'tsconfig error fixed, file loaded') }, 'tsconfig error fixed, file loaded') }) -} +}) diff --git a/playground/tsconfig.json b/playground/tsconfig.json index d60edb9f78c801..06bea8c1328d7f 100644 --- a/playground/tsconfig.json +++ b/playground/tsconfig.json @@ -9,6 +9,6 @@ "moduleResolution": "node", "baseUrl": ".", "jsx": "preserve", - "types": ["vite/client", "jest", "node"] + "types": ["vite/client", "vitest/globals", "node"] } } diff --git a/playground/vue-jsx/__tests__/vue-jsx.spec.ts b/playground/vue-jsx/__tests__/vue-jsx.spec.ts index 275c918684119d..94c4eb147a0b84 100644 --- a/playground/vue-jsx/__tests__/vue-jsx.spec.ts +++ b/playground/vue-jsx/__tests__/vue-jsx.spec.ts @@ -1,4 +1,4 @@ -import { editFile, isBuild, untilUpdated } from 'testUtils' +import { editFile, isServe, untilUpdated } from '../../testUtils' test('should render', async () => { expect(await page.textContent('.named')).toMatch('0') @@ -29,7 +29,7 @@ test('should update', async () => { expect(await page.textContent('.jsx-with-query')).toMatch('7') }) -if (!isBuild) { +describe.runIf(isServe)('vue-jsx server', () => { test('hmr: named export', async () => { editFile('Comps.jsx', (code) => code.replace('named {count', 'named updated {count') @@ -113,4 +113,4 @@ if (!isBuild) { ) await untilUpdated(() => page.textContent('.setup-jsx'), '1000') }) -} +}) diff --git a/playground/vue-lib/__tests__/serve.js b/playground/vue-lib/__tests__/serve.js deleted file mode 100644 index 73f89eee44ea3e..00000000000000 --- a/playground/vue-lib/__tests__/serve.js +++ /dev/null @@ -1,7 +0,0 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace -// the default e2e test serve behavior - -exports.serve = async function serve() { - // do nothing, skip default behavior -} diff --git a/playground/vue-lib/__tests__/serve.ts b/playground/vue-lib/__tests__/serve.ts new file mode 100644 index 00000000000000..47c122339205eb --- /dev/null +++ b/playground/vue-lib/__tests__/serve.ts @@ -0,0 +1,6 @@ +// this is automatically detected by scripts/vitestSetup.ts and will replace +// the default e2e test serve behavior + +export async function serve() { + // do nothing, skip default behavior +} diff --git a/playground/vue-sourcemap/__tests__/build.spec.ts b/playground/vue-sourcemap/__tests__/build.spec.ts index e36c1f52d2c1f8..50b8814aed9c4e 100644 --- a/playground/vue-sourcemap/__tests__/build.spec.ts +++ b/playground/vue-sourcemap/__tests__/build.spec.ts @@ -1,13 +1,7 @@ -import { isBuild } from 'testUtils' +import { isBuild } from '../../testUtils' -if (isBuild) { - test('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) +test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { + serverLogs.forEach((log) => { + expect(log).not.toMatch('Sourcemap is likely to be incorrect') }) -} else { - test('this file only includes test for build', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/vue-sourcemap/__tests__/serve.spec.ts b/playground/vue-sourcemap/__tests__/serve.spec.ts index 7dfa271deea322..09ba69c03abfa4 100644 --- a/playground/vue-sourcemap/__tests__/serve.spec.ts +++ b/playground/vue-sourcemap/__tests__/serve.spec.ts @@ -1,11 +1,11 @@ import { extractSourcemap, formatSourcemapForSnapshot, - isBuild -} from 'testUtils' + isServe +} from '../../testUtils' import { URL } from 'url' -if (!isBuild) { +describe.runIf(isServe)('serve:vue-sourcemap', () => { const getStyleTagContentIncluding = async (content: string) => { const styles = await page.$$('style') for (const style of styles) { @@ -22,12 +22,12 @@ if (!isBuild) { const js = await res.text() const map = extractSourcemap(js) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAKA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;wBARlB,oBAAiB,WAAd,MAAU", - "sources": Array [ + "sources": [ "/root/Js.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -51,12 +51,12 @@ if (!isBuild) { const js = await res.text() const map = extractSourcemap(js) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": ";AAKA,QAAQ,IAAI,WAAW;;;;AAIvB,YAAQ,IAAI,UAAU;;;;;;;;uBARpB,oBAAiB,WAAd,MAAU", - "sources": Array [ + "sources": [ "/root/Ts.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -79,15 +79,15 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.css ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": ";AAQA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/Css.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -130,15 +130,15 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('._css-module_') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": ";AAcA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/Css.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -181,15 +181,15 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.css-scoped[data-v-') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": ";AAoBA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/Css.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -232,12 +232,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.sass ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAKA;EACE", - "sources": Array [ + "sources": [ "/root/Sass.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -257,13 +257,13 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.sass-with-import ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA;EACE;;ACOF;EACE", - "sources": Array [ + "sources": [ "/root/sassWithImportImported.sass", "/root/SassWithImport.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ ".sass-with-import-imported color: red ", @@ -289,12 +289,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.less ') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAKA;EACE", - "sources": Array [ + "sources": [ "/root/Less.vue", ], - "sourcesContent": Array [ + "sourcesContent": [ " @@ -315,12 +315,12 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.src-import[data-v-') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA;EACE,UAAU;AACZ", - "sources": Array [ + "sources": [ "/root/src-import/src-import.css", ], - "sourcesContent": Array [ + "sourcesContent": [ ".src-import { color: red; } @@ -335,13 +335,13 @@ if (!isBuild) { const css = await getStyleTagContentIncluding('.src-import-sass[data-v-') const map = extractSourcemap(css) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - Object { + { "mappings": "AAAA;EACE;;ACCF;EACE", - "sources": Array [ + "sources": [ "/root/src-import/src-import-imported.sass", "/root/src-import/src-import.sass", ], - "sourcesContent": Array [ + "sourcesContent": [ ".src-import-sass-imported color: red ", @@ -355,8 +355,4 @@ if (!isBuild) { } `) }) -} else { - test('this file only includes test for serve', () => { - expect(true).toBe(true) - }) -} +}) diff --git a/playground/vue-sourcemap/vite.config.js b/playground/vue-sourcemap/vite.config.ts similarity index 62% rename from playground/vue-sourcemap/vite.config.js rename to playground/vue-sourcemap/vite.config.ts index 2a48cad3cb00d4..dbfa81dbeb1144 100644 --- a/playground/vue-sourcemap/vite.config.js +++ b/playground/vue-sourcemap/vite.config.ts @@ -1,9 +1,7 @@ -const vuePlugin = require('@vitejs/plugin-vue') +import vuePlugin from '@vitejs/plugin-vue' +import { defineConfig } from 'vite' -/** - * @type {import('vite').UserConfig} - */ -module.exports = { +export default defineConfig({ css: { devSourcemap: true, preprocessorOptions: { @@ -16,4 +14,4 @@ module.exports = { build: { sourcemap: true } -} +}) diff --git a/playground/vue/__tests__/vue.spec.ts b/playground/vue/__tests__/vue.spec.ts index 0bce5d1e1a03f5..f790bd612bfa9e 100644 --- a/playground/vue/__tests__/vue.spec.ts +++ b/playground/vue/__tests__/vue.spec.ts @@ -1,4 +1,10 @@ -import { editFile, getBg, getColor, isBuild, untilUpdated } from 'testUtils' +import { + editFile, + getBg, + getColor, + isBuild, + untilUpdated +} from '../../testUtils' test('should render', async () => { expect(await page.textContent('h1')).toMatch('Vue SFCs') diff --git a/playground/worker/__tests__/es/es-worker.spec.ts b/playground/worker/__tests__/es/es-worker.spec.ts index 61215f931c77dc..b836b081357e2e 100644 --- a/playground/worker/__tests__/es/es-worker.spec.ts +++ b/playground/worker/__tests__/es/es-worker.spec.ts @@ -44,7 +44,7 @@ const waitSharedWorkerTick = ( } )(0) -test.concurrent.each([[true], [false]])('shared worker', async (doTick) => { +test.each([[true], [false]])('shared worker', async (doTick) => { if (doTick) { await page.click('.tick-shared') } @@ -59,10 +59,10 @@ test('worker emitted and import.meta.url in nested worker (serve)', async () => ) }) -if (isBuild) { - const assetsDir = path.resolve(testDir, 'dist/es/assets') +describe.runIf(isBuild)('build', () => { // assert correct files test('inlined code generation', async () => { + const assetsDir = path.resolve(testDir(), 'dist/es/assets') const files = fs.readdirSync(assetsDir) expect(files.length).toBe(26) const index = files.find((f) => f.includes('main-module')) @@ -92,7 +92,7 @@ if (isBuild) { '"type":"constructor"' ) }) -} +}) test('module worker', async () => { expect(await page.textContent('.shared-worker-import-meta-url')).toMatch( diff --git a/playground/worker/__tests__/iife/worker.spec.ts b/playground/worker/__tests__/iife/worker.spec.ts index f49666e4918a25..cfa7dfe2e4537b 100644 --- a/playground/worker/__tests__/iife/worker.spec.ts +++ b/playground/worker/__tests__/iife/worker.spec.ts @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import { untilUpdated, isBuild, testDir } from '../../../testUtils' import type { Page } from 'playwright-chromium' +import { test } from 'vitest' test('normal', async () => { await page.click('.ping') @@ -44,7 +45,7 @@ const waitSharedWorkerTick = ( } )(0) -test.concurrent.each([[true], [false]])('shared worker', async (doTick) => { +test.each([[true], [false]])('shared worker', async (doTick) => { if (doTick) { await page.click('.tick-shared') } @@ -59,10 +60,10 @@ test('worker emitted and import.meta.url in nested worker (serve)', async () => ) }) -if (isBuild) { - const assetsDir = path.resolve(testDir, 'dist/iife/assets') +describe.runIf(isBuild)('build', () => { // assert correct files test('inlined code generation', async () => { + const assetsDir = path.resolve(testDir(), 'dist/iife/assets') const files = fs.readdirSync(assetsDir) expect(files.length).toBe(13) const index = files.find((f) => f.includes('main-module')) @@ -92,7 +93,7 @@ if (isBuild) { '"type":"constructor"' ) }) -} +}) test('module worker', async () => { expect(await page.textContent('.shared-worker-import-meta-url')).toMatch( diff --git a/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts b/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts index e4cb3318ebd5f5..ce2c52b5c98840 100644 --- a/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts @@ -1,12 +1,15 @@ import fs from 'fs' import path from 'path' -import { untilUpdated, isBuild, testDir } from '../../../testUtils' -import { Page } from 'playwright-chromium' +import { isBuild, testDir } from '../../../testUtils' -if (isBuild) { - const assetsDir = path.resolve(testDir, 'dist/iife-sourcemap-hidden/assets') +describe.runIf(isBuild)('build', () => { // assert correct files test('sourcemap generation for web workers', async () => { + const assetsDir = path.resolve( + testDir(), + 'dist/iife-sourcemap-hidden/assets' + ) + const files = fs.readdirSync(assetsDir) // should have 2 worker chunk expect(files.length).toBe(26) @@ -110,13 +113,7 @@ if (isBuild) { `new Worker("/iife-sourcemap-hidden/assets/sub-worker` ) }) -} else { - // Workaround so that testing serve does not emit - // "Your test suite must contain at least one test" - test('true', () => { - expect(true).toBe(true) - }) -} +}) function getSourceMapUrl(code: string): string { const regex = /\/\/[#@]\s(?:source(?:Mapping)?URL)=\s*(\S+)/g diff --git a/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts b/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts index ceda7dae1fec7c..0fe97386f178df 100644 --- a/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts @@ -1,12 +1,15 @@ import fs from 'fs' import path from 'path' -import { untilUpdated, isBuild, testDir } from '../../../testUtils' -import { Page } from 'playwright-chromium' +import { isBuild, testDir } from '../../../testUtils' -if (isBuild) { - const assetsDir = path.resolve(testDir, 'dist/iife-sourcemap-inline/assets') +describe.runIf(isBuild)('build', () => { // assert correct files test('sourcemap generation for web workers', async () => { + const assetsDir = path.resolve( + testDir(), + 'dist/iife-sourcemap-inline/assets' + ) + const files = fs.readdirSync(assetsDir) // should have 2 worker chunk expect(files.length).toBe(13) @@ -93,13 +96,7 @@ if (isBuild) { `new Worker("/iife-sourcemap-inline/assets/sub-worker` ) }) -} else { - // Workaround so that testing serve does not emit - // "Your test suite must contain at least one test" - test('true', () => { - expect(true).toBe(true) - }) -} +}) function getSourceMapUrl(code: string): string { const regex = /\/\/[#@]\s(?:source(?:Mapping)?URL)=\s*(\S+)/g diff --git a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts index 04cc079b4bc289..3b074f24990f4b 100644 --- a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts @@ -1,12 +1,11 @@ import fs from 'fs' import path from 'path' -import { untilUpdated, isBuild, testDir } from '../../../testUtils' -import { Page } from 'playwright-chromium' +import { isBuild, testDir } from '../../../testUtils' -if (isBuild) { - const assetsDir = path.resolve(testDir, 'dist/iife-sourcemap/assets') +describe.runIf(isBuild)('build', () => { // assert correct files test('sourcemap generation for web workers', async () => { + const assetsDir = path.resolve(testDir(), 'dist/iife-sourcemap/assets') const files = fs.readdirSync(assetsDir) // should have 2 worker chunk expect(files.length).toBe(26) @@ -112,13 +111,7 @@ if (isBuild) { `new Worker("/iife-sourcemap/assets/sub-worker` ) }) -} else { - // Workaround so that testing serve does not emit - // "Your test suite must contain at least one test" - test('true', () => { - expect(true).toBe(true) - }) -} +}) function getSourceMapUrl(code: string): string { const regex = /\/\/[#@]\s(?:source(?:Mapping)?URL)=\s*(\S+)/g diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a06a82b104080..18dbe1e00545ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ importers: .: specifiers: '@microsoft/api-extractor': ^7.23.1 + '@types/babel__core': ^7.1.19 '@types/fs-extra': ^9.0.13 - '@types/jest': ^27.5.0 '@types/node': ^17.0.31 '@types/prompts': ^2.4.0 '@types/semver': ^7.3.9 @@ -26,7 +26,7 @@ importers: eslint-plugin-node: ^11.1.0 execa: ^5.1.1 fs-extra: ^10.1.0 - jest: ^27.5.1 + kill-port: ^1.6.1 lint-staged: ^12.4.1 minimist: ^1.2.6 node-fetch: ^2.6.7 @@ -40,16 +40,15 @@ importers: semver: ^7.3.7 simple-git-hooks: ^2.7.0 sirv: ^2.0.2 - ts-jest: ^27.1.4 ts-node: ^10.7.0 typescript: ^4.6.4 vite: workspace:* vitepress: ^0.22.4 - vitest: ^0.10.5 + vitest: ^0.12.4 devDependencies: '@microsoft/api-extractor': 7.23.1 + '@types/babel__core': 7.1.19 '@types/fs-extra': 9.0.13 - '@types/jest': 27.5.0 '@types/node': 17.0.31 '@types/prompts': 2.4.0 '@types/semver': 7.3.9 @@ -63,7 +62,7 @@ importers: eslint-plugin-node: 11.1.0_eslint@8.15.0 execa: 5.1.1 fs-extra: 10.1.0 - jest: 27.5.1_ts-node@10.7.0 + kill-port: 1.6.1 lint-staged: 12.4.1 minimist: 1.2.6 node-fetch: 2.6.7 @@ -77,12 +76,11 @@ importers: semver: 7.3.7 simple-git-hooks: 2.7.0 sirv: 2.0.2 - ts-jest: 27.1.4_edb1f862ecf73b6f0cc1f906c6266936 ts-node: 10.7.0_5f3e12794cebfbf3197131903b74d233 typescript: 4.6.4 vite: link:packages/vite vitepress: 0.22.4 - vitest: 0.10.5 + vitest: 0.12.4 packages/create-vite: specifiers: @@ -1108,6 +1106,7 @@ packages: /@babel/compat-data/7.17.10: resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} engines: {node: '>=6.9.0'} + dev: false /@babel/core/7.17.10: resolution: {integrity: sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==} @@ -1130,6 +1129,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false /@babel/generator/7.17.10: resolution: {integrity: sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==} @@ -1138,6 +1138,7 @@ packages: '@babel/types': 7.17.10 '@jridgewell/gen-mapping': 0.1.1 jsesc: 2.5.2 + dev: false /@babel/helper-annotate-as-pure/7.16.7: resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} @@ -1157,6 +1158,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.3 semver: 6.3.0 + dev: false /@babel/helper-create-class-features-plugin/7.17.9_@babel+core@7.17.10: resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} @@ -1181,6 +1183,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.10 + dev: false /@babel/helper-function-name/7.17.9: resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} @@ -1188,12 +1191,14 @@ packages: dependencies: '@babel/template': 7.16.7 '@babel/types': 7.17.10 + dev: false /@babel/helper-hoist-variables/7.16.7: resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.10 + dev: false /@babel/helper-member-expression-to-functions/7.17.7: resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} @@ -1222,6 +1227,7 @@ packages: '@babel/types': 7.17.10 transitivePeerDependencies: - supports-color + dev: false /@babel/helper-optimise-call-expression/7.16.7: resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} @@ -1252,12 +1258,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.10 + dev: false /@babel/helper-split-export-declaration/7.16.7: resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.10 + dev: false /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} @@ -1266,6 +1274,7 @@ packages: /@babel/helper-validator-option/7.16.7: resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} engines: {node: '>=6.9.0'} + dev: false /@babel/helpers/7.17.9: resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} @@ -1276,6 +1285,7 @@ packages: '@babel/types': 7.17.10 transitivePeerDependencies: - supports-color + dev: false /@babel/highlight/7.17.9: resolution: {integrity: sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==} @@ -1300,33 +1310,6 @@ packages: '@babel/plugin-syntax-pipeline-operator': 7.17.0 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.10: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.10: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.10: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1334,15 +1317,7 @@ packages: dependencies: '@babel/core': 7.17.10 '@babel/helper-plugin-utils': 7.16.7 - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true + dev: false /@babel/plugin-syntax-jsx/7.16.7: resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} @@ -1362,60 +1337,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: false - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.10: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.10: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.10: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-pipeline-operator/7.17.0: resolution: {integrity: sha512-vNE+4pNAOk2Q0BkyTf+XMwZ53vMDJ7Ic/Z85sruaJfJJ+4O5k/61z2a4Xj3CSl9kKRlXOALbsxWca0vZz7ENbw==} engines: {node: '>=6.9.0'} @@ -1425,16 +1346,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.10: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-typescript/7.17.10_@babel+core@7.17.10: resolution: {integrity: sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==} engines: {node: '>=6.9.0'} @@ -1443,6 +1354,7 @@ packages: dependencies: '@babel/core': 7.17.10 '@babel/helper-plugin-utils': 7.16.7 + dev: false /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -1520,6 +1432,7 @@ packages: '@babel/code-frame': 7.16.7 '@babel/parser': 7.17.10 '@babel/types': 7.17.10 + dev: false /@babel/traverse/7.17.10: resolution: {integrity: sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==} @@ -1537,6 +1450,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false /@babel/types/7.17.10: resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} @@ -1545,10 +1459,6 @@ packages: '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 - /@bcoe/v8-coverage/0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@cloudflare/workers-types/2.2.2: resolution: {integrity: sha512-kaMn2rueJ0PL1TYVGknTCh0X0x0d9G+FNXAFep7/4uqecEZoQb/63o6rOmMuiqI09zLuHV6xhKRXinokV/MY9A==} dev: true @@ -1716,213 +1626,6 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema/0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console/27.5.1: - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - dev: true - - /@jest/core/27.5.1_ts-node@10.7.0: - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 27.5.1 - jest-config: 27.5.1_ts-node@10.7.0 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.5 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /@jest/environment/27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - jest-mock: 27.5.1 - dev: true - - /@jest/fake-timers/27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 17.0.31 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /@jest/globals/27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: true - - /@jest/reporters/27.5.1: - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.0 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/source-map/27.5.1: - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.10 - source-map: 0.6.1 - dev: true - - /@jest/test-result/27.5.1: - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer/27.5.1: - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/transform/27.5.1: - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/core': 7.17.10 - '@jest/types': 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.8.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types/27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.31 - '@types/yargs': 16.0.4 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -2190,23 +1893,6 @@ packages: string-argv: 0.3.1 dev: true - /@sinonjs/commons/1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true - - /@tootallnate/once/1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - /@tsconfig/node10/1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} dev: true @@ -2310,39 +1996,10 @@ packages: '@types/node': 17.0.31 dev: true - /@types/graceful-fs/4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} - dependencies: - '@types/node': 17.0.31 - dev: true - /@types/hash-sum/1.0.0: resolution: {integrity: sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg==} dev: true - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/jest/27.5.0: - resolution: {integrity: sha512-9RBFx7r4k+msyj/arpfaa0WOOEcaAZNmN+j80KFbFCoSqCJGHTz7YMAMGQW9Xmqm5w6l5c25vbSjMwlikJi5+g==} - dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 - dev: true - /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -2388,10 +2045,6 @@ packages: /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/prettier/2.6.0: - resolution: {integrity: sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==} - dev: true - /@types/prompts/2.4.0: resolution: {integrity: sha512-7th8Opn+0XlN0O6qzO7dXOPwL6rigq/EwRS2DntaTHwSw8cLaYKeAPt5dWEKHSL+ffVSUl1itTPUC06+FlsV4Q==} dev: true @@ -2420,10 +2073,6 @@ packages: resolution: {integrity: sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==} dev: true - /@types/stack-utils/2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - /@types/stylus/0.48.37: resolution: {integrity: sha512-IkLnS/GzdDK3rgAmQwLr8LqPvUMa43SHlCnXqsfXNukwaIpiXBNgSHil3ro8aemhF4k4ZiMoa4URE7mwBHPJnQ==} dependencies: @@ -2436,16 +2085,6 @@ packages: '@types/node': 17.0.31 dev: true - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs/16.0.4: - resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - /@types/yauzl/2.10.0: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true @@ -2691,10 +2330,6 @@ packages: through: 2.3.8 dev: true - /abab/2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -2707,13 +2342,6 @@ packages: negotiator: 0.6.3 dev: true - /acorn-globals/6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: true - /acorn-jsx/5.3.2_acorn@8.7.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2733,6 +2361,7 @@ packages: /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} + dev: false /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -2826,11 +2455,6 @@ packages: dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles/6.1.0: resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} engines: {node: '>=12'} @@ -2920,10 +2544,6 @@ packages: engines: {node: '>=8'} dev: true - /asynckit/0.4.0: - resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} - dev: true - /atob/2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} @@ -2953,89 +2573,16 @@ packages: - debug dev: false - /babel-jest/27.5.1_@babel+core@7.17.10: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + /babel-plugin-macros/2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: - '@babel/core': 7.17.10 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.1.19 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.17.10 - chalk: 4.1.2 - graceful-fs: 4.2.10 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/runtime': 7.17.9 + cosmiconfig: 6.0.0 + resolve: 1.22.0 - /babel-plugin-istanbul/6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.16.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.0 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist/27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.10 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.17.1 - dev: true - - /babel-plugin-macros/2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} - dependencies: - '@babel/runtime': 7.17.9 - cosmiconfig: 6.0.0 - resolve: 1.22.0 - - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.10: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.10 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.10 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.17.10: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.10 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.10 - dev: true - - /babel-walk/3.0.0-canary-5: - resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} - engines: {node: '>= 10.0.0'} + /babel-walk/3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} dependencies: '@babel/types': 7.17.10 dev: true @@ -3098,10 +2645,6 @@ packages: dependencies: fill-range: 7.0.1 - /browser-process-hrtime/1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true - /browserslist/4.20.3: resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3112,19 +2655,7 @@ packages: escalade: 3.1.1 node-releases: 2.0.4 picocolors: 1.0.0 - - /bs-logger/0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true + dev: false /buffer-crc32/0.2.13: resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} @@ -3193,9 +2724,11 @@ packages: /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + dev: false /caniuse-lite/1.0.30001338: resolution: {integrity: sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==} + dev: false /chai/4.3.6: resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==} @@ -3225,11 +2758,6 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /char-regex/1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - /character-parser/2.2.0: resolution: {integrity: sha1-x84o821LzZdE5f/CxfzeHHMmH8A=} dependencies: @@ -3259,14 +2787,6 @@ packages: engines: {node: '>=10'} dev: false - /ci-info/3.3.0: - resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} - dev: true - - /cjs-module-lexer/1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true - /cjstoesm/1.1.4_typescript@4.6.4: resolution: {integrity: sha512-cixLJwK2HS8R8J1jJcYwlrLxWUbdNms5EmVQuvP3O0CGvHNv2WVd2gnqTP/tbTEYzbgWiSYQBZDoAakqsSl94Q==} engines: {node: '>=10.0.0'} @@ -3335,15 +2855,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /co/4.6.0: - resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage/1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -3395,13 +2906,6 @@ packages: engines: {node: '>=0.1.90'} dev: true - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -3786,21 +3290,6 @@ packages: engines: {node: '>=4'} hasBin: true - /cssom/0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true - - /cssom/0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: true - - /cssstyle/2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true - /csstype/2.6.20: resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} @@ -3819,15 +3308,6 @@ packages: engines: {node: '>=8'} dev: true - /data-urls/2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: true - /dateformat/3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true @@ -3900,19 +3380,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /decimal.js/10.3.1: - resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} - dev: true - /decode-uri-component/0.2.0: resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} engines: {node: '>=0.10'} dev: true - /dedent/0.7.0: - resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} - dev: true - /deep-eql/3.0.1: resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} engines: {node: '>=0.12'} @@ -3946,11 +3418,6 @@ packages: resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} dev: false - /delayed-stream/1.0.0: - resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} - engines: {node: '>=0.4.0'} - dev: true - /delegate/3.2.0: resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} dev: false @@ -3979,11 +3446,6 @@ packages: engines: {node: '>=8'} dev: false - /detect-newline/3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - /detective/5.2.0: resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} engines: {node: '>=0.8.0'} @@ -4005,11 +3467,6 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false - /diff-sequences/27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -4037,13 +3494,6 @@ packages: resolution: {integrity: sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=} dev: true - /domexception/2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - dependencies: - webidl-conversions: 5.0.0 - dev: true - /dot-prop/5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -4075,11 +3525,7 @@ packages: /electron-to-chromium/1.4.137: resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==} - - /emittery/0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} - dev: true + dev: false /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4391,19 +3837,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen/2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - /eslint-define-config/1.4.0: resolution: {integrity: sha512-DJGEdzX4fkdkhPSzPgOpBbBjhT+b9DcgbAgxfrEUcipVWlSuesQJriKffHz1JF5mhKFm7PGoiZz4D2nb4GslNA==} engines: {node: '>= 14.6.0', npm: '>= 6.0.0', pnpm: '>= 6.32.9'} @@ -4536,12 +3969,6 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esquery/1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} @@ -4607,21 +4034,6 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit/0.1.2: - resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} - engines: {node: '>= 0.8.0'} - dev: true - - /expect/27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - dev: true - /express/4.18.1: resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} engines: {node: '>= 0.10.0'} @@ -4706,12 +4118,6 @@ packages: dependencies: reusify: 1.0.4 - /fb-watchman/2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} - dependencies: - bser: 2.1.1 - dev: true - /fd-slicer/1.1.0: resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} dependencies: @@ -4796,15 +4202,6 @@ packages: debug: optional: true - /form-data/3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /formdata-node/2.5.0: resolution: {integrity: sha512-JFSNLq34u2Tqc6F034x5aaK3ksIfrDBMPie8b4KYx2/pVDLxWFXDly52dsvHjZ+A0LGHTZb/w4HBZVdgN74RTw==} engines: {node: '>= 10.17'} @@ -4905,6 +4302,7 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: false /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -4923,11 +4321,6 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-pkg-repo/4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} engines: {node: '>=6.9.0'} @@ -4959,6 +4352,10 @@ packages: get-intrinsic: 1.1.1 dev: true + /get-them-args/1.3.2: + resolution: {integrity: sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=} + dev: true + /git-raw-commits/2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} @@ -5019,6 +4416,7 @@ packages: /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: false /globals/13.14.0: resolution: {integrity: sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==} @@ -5154,17 +4552,6 @@ packages: resolution: {integrity: sha1-wc56MWjIxmFAM6S194d/OyJfnDg=} dev: false - /html-encoding-sniffer/2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: true - - /html-escaper/2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /html-rewriter-wasm/0.3.2: resolution: {integrity: sha512-b+pOh+bs00uRVNIZoTgGBREjUKN47pchTNwkxKuP4ecQTFcOA6KJIW+jjvjjXrkSRURZsideLxFKqX7hnxdegQ==} dev: true @@ -5189,17 +4576,6 @@ packages: toidentifier: 1.0.1 dev: true - /http-proxy-agent/4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /http-proxy/1.18.1_debug@4.3.4: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} @@ -5229,6 +4605,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -5284,15 +4661,6 @@ packages: engines: {node: '>=8'} dev: true - /import-local/3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} @@ -5434,11 +4802,6 @@ packages: engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -5475,10 +4838,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-potential-custom-element-name/1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-promise/2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: true @@ -5503,576 +4862,59 @@ packages: call-bind: 1.0.2 dev: true - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-string/1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol/1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-text-path/1.0.1: - resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} - engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} - dev: true - - /is-weakref/1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-what/3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true - - /is-wsl/2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray/0.0.1: - resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} - dev: false - - /isarray/1.0.0: - resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} - dev: true - - /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} - dev: true - - /istanbul-lib-coverage/3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument/5.2.0: - resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.17.10 - '@babel/parser': 7.17.10 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps/4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports/3.1.4: - resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jest-changed-files/27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - execa: 5.1.1 - throat: 6.0.1 - dev: true - - /jest-circus/27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli/27.5.1_ts-node@10.7.0: - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.7.0 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.10 - import-local: 3.1.0 - jest-config: 27.5.1_ts-node@10.7.0 - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /jest-config/27.5.1_ts-node@10.7.0: - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.17.10 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.17.10 - chalk: 4.1.2 - ci-info: 3.3.0 - deepmerge: 4.2.2 - glob: 7.2.0 - graceful-fs: 4.2.10 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.7.0_5f3e12794cebfbf3197131903b74d233 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-diff/27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-docblock/27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each/27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-environment-jsdom/27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-environment-node/27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /jest-get-type/27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-haste-map/27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.31 - anymatch: 3.1.2 - fb-watchman: 2.0.1 - graceful-fs: 4.2.10 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-jasmine2/27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-leak-detector/27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-matcher-utils/27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-message-util/27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/code-frame': 7.16.7 - '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-mock/27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - dev: true - - /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 27.5.1 - dev: true - - /jest-regex-util/27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-resolve-dependencies/27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve/27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.0 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-runner/27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - emittery: 0.8.1 - graceful-fs: 4.2.10 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-runtime/27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/globals': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - execa: 5.1.1 - glob: 7.2.0 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} dev: true - /jest-serializer/27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: - '@types/node': 17.0.31 - graceful-fs: 4.2.10 + has-tostringtag: 1.0.0 dev: true - /jest-snapshot/27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: - '@babel/core': 7.17.10 - '@babel/generator': 7.17.10 - '@babel/plugin-syntax-typescript': 7.17.10_@babel+core@7.17.10 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__traverse': 7.17.1 - '@types/prettier': 2.6.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.10 - chalk: 4.1.2 - expect: 27.5.1 - graceful-fs: 4.2.10 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - natural-compare: 1.4.0 - pretty-format: 27.5.1 - semver: 7.3.7 - transitivePeerDependencies: - - supports-color + has-symbols: 1.0.3 dev: true - /jest-util/27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /is-text-path/1.0.1: + resolution: {integrity: sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=} + engines: {node: '>=0.10.0'} dependencies: - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - chalk: 4.1.2 - ci-info: 3.3.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 + text-extensions: 1.9.0 dev: true - /jest-validate/27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - '@jest/types': 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 + call-bind: 1.0.2 dev: true - /jest-watcher/27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 17.0.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 27.5.1 - string-length: 4.0.2 + /is-what/3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} dev: true - /jest-worker/27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: - '@types/node': 17.0.31 - merge-stream: 2.0.0 - supports-color: 8.1.1 + is-docker: 2.2.1 dev: true - /jest/27.5.1_ts-node@10.7.0: - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.7.0 - import-local: 3.1.0 - jest-cli: 27.5.1_ts-node@10.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate + /isarray/0.0.1: + resolution: {integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=} + dev: false + + /isarray/1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true /jju/1.4.0: @@ -6090,14 +4932,6 @@ packages: /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -6105,52 +4939,11 @@ packages: argparse: 2.0.1 dev: true - /jsdom/16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.7.1 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.3.1 - domexception: 2.0.1 - escodegen: 2.0.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.0 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.0.0 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.7 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: false /json-parse-better-errors/1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -6201,6 +4994,14 @@ packages: promise: 7.3.1 dev: true + /kill-port/1.6.1: + resolution: {integrity: sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==} + hasBin: true + dependencies: + get-them-args: 1.3.2 + shell-exec: 1.0.2 + dev: true + /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -6250,19 +5051,6 @@ packages: source-map: 0.6.1 dev: true - /leven/3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn/0.3.0: - resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -6392,10 +5180,6 @@ packages: resolution: {integrity: sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=} dev: true - /lodash.memoize/4.1.2: - resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} - dev: true - /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -6466,17 +5250,12 @@ packages: engines: {node: '>=8'} dependencies: semver: 6.3.0 + dev: false /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /map-obj/1.0.1: resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} engines: {node: '>=0.10.0'} @@ -6784,12 +5563,9 @@ packages: engines: {node: '>= 6.13.0'} dev: true - /node-int64/0.4.0: - resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} - dev: true - /node-releases/2.0.4: resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==} + dev: false /nopt/5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -6863,10 +5639,6 @@ packages: set-blocking: 2.0.0 dev: false - /nwsapi/2.2.0: - resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} - dev: true - /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -6950,18 +5722,6 @@ packages: hasBin: true dev: true - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -7057,10 +5817,6 @@ packages: engines: {node: '>= 0.10'} dev: true - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -7168,11 +5924,6 @@ packages: dev: true optional: true - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - /pixelmatch/5.2.1: resolution: {integrity: sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==} hasBin: true @@ -7180,13 +5931,6 @@ packages: pngjs: 4.0.1 dev: true - /pkg-dir/4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - /playwright-chromium/1.21.1: resolution: {integrity: sha512-bbqFFpcTs+3amiofja/KvTmZ+FZnMNEOuGkRyJk2p6DV9EbgRYVrlzzgLtMnX2DwaX3ZZ23MukGuQ+bVKOdsnw==} engines: {node: '>=12'} @@ -7404,11 +6148,6 @@ packages: resolution: {integrity: sha512-GLjn0I3r6ka+NvxJUppsVFqb4V0qDTEHT/QxHlidPuClGaxF/4AI2Qti4a0cv3XMh5n1+D3hLScW10LRIm5msQ==} dev: true - /prelude-ls/1.1.2: - resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} - engines: {node: '>= 0.8.0'} - dev: true - /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -7420,15 +6159,6 @@ packages: hasBin: true dev: true - /pretty-format/27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /pretty-hrtime/1.0.3: resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} engines: {node: '>= 0.8'} @@ -7494,10 +6224,6 @@ packages: dev: true optional: true - /psl/1.8.0: - resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} - dev: true - /pug-attrs/3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} dependencies: @@ -7687,10 +6413,6 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false - /react-is/17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - /react-refresh/0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} @@ -7877,22 +6599,10 @@ packages: resolution: {integrity: sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=} dev: true - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - /resolve-pathname/3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} dev: false @@ -8024,13 +6734,6 @@ packages: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: true - /saxes/5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: true - /scheduler/0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} dependencies: @@ -8130,6 +6833,10 @@ packages: engines: {node: '>=8'} dev: true + /shell-exec/1.0.2: + resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} + dev: true + /shell-quote/1.7.3: resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} dev: true @@ -8374,14 +7081,6 @@ packages: resolution: {integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=} dev: true - /string-length/4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8453,11 +7152,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom/4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -8510,26 +7204,11 @@ packages: dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - /supports-color/9.2.2: resolution: {integrity: sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==} engines: {node: '>=12'} dev: true - /supports-hyperlinks/2.2.0: - resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -8538,10 +7217,6 @@ packages: resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=} dev: false - /symbol-tree/3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - /systemjs/6.12.1: resolution: {integrity: sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==} dev: false @@ -8690,14 +7365,6 @@ packages: uuid: 3.4.0 dev: true - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 - dev: true - /terser/5.13.1: resolution: {integrity: sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==} engines: {node: '>=10'} @@ -8709,15 +7376,6 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.0 - minimatch: 3.1.2 - dev: true - /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -8727,10 +7385,6 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /throat/6.0.1: - resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} - dev: true - /through/2.3.8: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: true @@ -8781,10 +7435,6 @@ packages: rimraf: 3.0.2 dev: false - /tmpl/1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} engines: {node: '>=4'} @@ -8809,15 +7459,6 @@ packages: engines: {node: '>=6'} dev: true - /tough-cookie/4.0.0: - resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} - engines: {node: '>=6'} - dependencies: - psl: 1.8.0 - punycode: 2.1.1 - universalify: 0.1.2 - dev: true - /tr46/0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} @@ -8845,41 +7486,6 @@ packages: utf8-byte-length: 1.0.4 dev: true - /ts-jest/27.1.4_edb1f862ecf73b6f0cc1f906c6266936: - resolution: {integrity: sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@types/jest': ^27.0.0 - babel-jest: '>=27.0.0 <28' - esbuild: '*' - jest: ^27.0.0 - typescript: '>=3.8 <5.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/jest': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@types/jest': 27.5.0 - bs-logger: 0.2.6 - esbuild: 0.14.38 - fast-json-stable-stringify: 2.1.0 - jest: 27.5.1_ts-node@10.7.0 - jest-util: 27.5.1 - json5: 2.2.1 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.3.7 - typescript: 4.6.4 - yargs-parser: 20.2.9 - dev: true - /ts-node/10.7.0_5f3e12794cebfbf3197131903b74d233: resolution: {integrity: sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==} hasBin: true @@ -8942,13 +7548,6 @@ packages: typescript: 4.6.4 dev: true - /type-check/0.3.2: - resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -9002,12 +7601,6 @@ packages: resolution: {integrity: sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==} dev: false - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - /typescript/4.6.4: resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} engines: {node: '>=4.2.0'} @@ -9106,15 +7699,6 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.8.0 - source-map: 0.7.3 - dev: true - /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -9154,8 +7738,8 @@ packages: - react-dom dev: true - /vitest/0.10.5: - resolution: {integrity: sha512-4qXdNbHwAd9YcsztJoVMWUQGcMATVlY9Xd95I3KQ2JJwDLTL97f/jgfGRotqptvNxdlmme5TBY0Gv+l6+JSYvA==} + /vitest/0.12.4: + resolution: {integrity: sha512-EDxdhlAt6vcu6y4VouAI60z78iCAVFnfBL4VlSQVQnGmOk5altOtIKvp3xfZ+cfo4iVHgqq1QNyf5qOFiL4leg==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: @@ -9214,25 +7798,6 @@ packages: vue: 3.2.33 dev: false - /w3c-hr-time/1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - dependencies: - browser-process-hrtime: 1.0.0 - dev: true - - /w3c-xmlserializer/2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: true - - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /web-streams-polyfill/3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} @@ -9255,26 +7820,11 @@ packages: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true - /webidl-conversions/5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: true - /webidl-conversions/6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} dev: true - /whatwg-encoding/1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: true - - /whatwg-mimetype/2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: true - /whatwg-url/5.0.0: resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} dependencies: @@ -9369,15 +7919,6 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - /write-file-atomic/3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - /ws/7.5.7: resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} engines: {node: '>=8.3.0'} @@ -9417,14 +7958,6 @@ packages: optional: true dev: true - /xml-name-validator/3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: true - - /xmlchars/2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/scripts/jestEnv.cjs b/scripts/jestEnv.cjs deleted file mode 100644 index a053faef1a69a5..00000000000000 --- a/scripts/jestEnv.cjs +++ /dev/null @@ -1,48 +0,0 @@ -const os = require('os') -const fs = require('fs') -const path = require('path') -const NodeEnvironment = require('jest-environment-node') -const { chromium } = require('playwright-chromium') - -const DIR = path.join(os.tmpdir(), 'jest_playwright_global_setup') - -module.exports = class PlaywrightEnvironment extends NodeEnvironment { - constructor(config, context) { - super(config) - this.testPath = context.testPath - } - - async setup() { - await super.setup() - const wsEndpoint = fs.readFileSync(path.join(DIR, 'wsEndpoint'), 'utf-8') - if (!wsEndpoint) { - throw new Error('wsEndpoint not found') - } - - // skip browser setup for non-playground tests - if (!this.testPath.includes('playground')) { - return - } - - const browser = (this.browser = await chromium.connect({ - wsEndpoint - })) - this.global.page = await browser.newPage() - - const console = this.global.console - const warn = console.warn - console.warn = (msg, ...args) => { - // suppress @vue/reactivity-transform warning - if (msg.includes('@vue/reactivity-transform')) return - if (msg.includes('Generated an empty chunk')) return - warn.call(console, msg, ...args) - } - } - - async teardown() { - if (this.browser) { - await this.browser.close() - } - await super.teardown() - } -} diff --git a/scripts/jestGlobalTeardown.cjs b/scripts/jestGlobalTeardown.cjs deleted file mode 100644 index 786b7b95724fa3..00000000000000 --- a/scripts/jestGlobalTeardown.cjs +++ /dev/null @@ -1,9 +0,0 @@ -const fs = require('fs-extra') -const path = require('path') - -module.exports = async () => { - await global.__BROWSER_SERVER__.close() - if (!process.env.VITE_PRESERVE_BUILD_ARTIFACTS) { - fs.removeSync(path.resolve(__dirname, '../playground-temp')) - } -} diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index 5c70fcc7f15823..bb673b6c8e21fb 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -8,6 +8,6 @@ "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "types": ["node", "jest"] + "types": ["node", "vitest/globals"] } } diff --git a/scripts/jestGlobalSetup.cjs b/scripts/vitestGlobalSetup.ts similarity index 62% rename from scripts/jestGlobalSetup.cjs rename to scripts/vitestGlobalSetup.ts index b4098ba3f6f2c1..8a0b7ffad6c6b2 100644 --- a/scripts/jestGlobalSetup.cjs +++ b/scripts/vitestGlobalSetup.ts @@ -1,26 +1,27 @@ -// @ts-check -const os = require('os') -const fs = require('fs-extra') -const path = require('path') -const { chromium } = require('playwright-chromium') +import os from 'os' +import fs from 'fs-extra' +import path from 'path' +import type { BrowserServer } from 'playwright-chromium' +import { chromium } from 'playwright-chromium' -const DIR = path.join(os.tmpdir(), 'jest_playwright_global_setup') +const DIR = path.join(os.tmpdir(), 'vitest_playwright_global_setup') -module.exports = async () => { - const browserServer = await chromium.launchServer({ +let browserServer: BrowserServer | undefined + +export async function setup() { + browserServer = await chromium.launchServer({ headless: !process.env.VITE_DEBUG_SERVE, args: process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] : undefined }) - global.__BROWSER_SERVER__ = browserServer - await fs.mkdirp(DIR) await fs.writeFile(path.join(DIR, 'wsEndpoint'), browserServer.wsEndpoint()) const tempDir = path.resolve(__dirname, '../playground-temp') - await fs.remove(tempDir) + await fs.ensureDir(tempDir) + await fs.emptyDir(tempDir) await fs .copy(path.resolve(__dirname, '../playground'), tempDir, { dereference: false, @@ -39,3 +40,10 @@ module.exports = async () => { } }) } + +export async function teardown() { + browserServer?.close() + if (!process.env.VITE_PRESERVE_BUILD_ARTIFACTS) { + fs.removeSync(path.resolve(__dirname, '../playground-temp')) + } +} diff --git a/scripts/jestPerTestSetup.ts b/scripts/vitestSetup.ts similarity index 80% rename from scripts/jestPerTestSetup.ts rename to scripts/vitestSetup.ts index 8160a04d9df4a9..4275d9d80864a5 100644 --- a/scripts/jestPerTestSetup.ts +++ b/scripts/vitestSetup.ts @@ -2,6 +2,9 @@ import fs from 'fs-extra' import * as http from 'http' import { resolve, dirname } from 'path' import sirv from 'sirv' +import os from 'os' +import path from 'path' +import { chromium } from 'playwright-chromium' import type { ViteDevServer, InlineConfig, @@ -12,6 +15,8 @@ import type { import { createServer, build, mergeConfig } from 'vite' import type { Page, ConsoleMessage } from 'playwright-chromium' import type { RollupError, RollupWatcher, RollupWatcherEvent } from 'rollup' +import type { File } from 'vitest' +import { beforeAll } from 'vitest' const isBuildTest = !!process.env.VITE_TEST_BUILD @@ -26,7 +31,7 @@ declare global { const browserLogs: string[] const browserErrors: Error[] const serverLogs: string[] - const viteTestUrl: string | undefined + let viteTestUrl: string | undefined const watcher: RollupWatcher | undefined let beforeAllError: Error | null // error caught in beforeAll, useful if you want to test error scenarios on build } @@ -63,32 +68,60 @@ const onPageError = (error: Error) => { errors.push(error) } -beforeAll(async () => { - const page = global.page - if (!page) { +const DIR = path.join(os.tmpdir(), 'vitest_playwright_global_setup') + +beforeAll(async (s) => { + const suite = s as File + const wsEndpoint = fs.readFileSync(path.join(DIR, 'wsEndpoint'), 'utf-8') + if (!wsEndpoint) { + throw new Error('wsEndpoint not found') + } + + // skip browser setup for non-playground tests + if (!suite.filepath.includes('playground')) { return } + + const browser = await chromium.connect(wsEndpoint) + const page = await browser.newPage() + // @ts-expect-error + globalThis.page = page + + const globalConsole = globalThis.console + const warn = globalConsole.warn + globalConsole.warn = (msg, ...args) => { + // suppress @vue/reactivity-transform warning + if (msg.includes('@vue/reactivity-transform')) return + if (msg.includes('Generated an empty chunk')) return + warn.call(globalConsole, msg, ...args) + } + try { page.on('console', onConsole) page.on('pageerror', onPageError) - const testPath = expect.getState().testPath + const testPath = suite.filepath! const testName = slash(testPath).match(/playground\/([\w-]+)\//)?.[1] // if this is a test placed under playground/xxx/__tests__ // start a vite server in that directory. if (testName) { - const playgroundRoot = resolve(__dirname, '../playground') tempDir = resolve(__dirname, '../playground-temp/', testName) // when `root` dir is present, use it as vite's root const testCustomRoot = resolve(tempDir, 'root') rootDir = fs.existsSync(testCustomRoot) ? testCustomRoot : tempDir - const testCustomServe = resolve(dirname(testPath), 'serve.js') - if (fs.existsSync(testCustomServe)) { + const testCustomServe = [ + resolve(dirname(testPath), 'serve.ts'), + resolve(dirname(testPath), 'serve.cjs'), + resolve(dirname(testPath), 'serve.js') + ].find((i) => fs.existsSync(i)) + if (testCustomServe) { // test has custom server configuration. - const { serve, preServe } = require(testCustomServe) + const mod = await import(testCustomServe) + const serve = mod.serve || mod.default?.serve + const preServe = mod.preServe || mod.default?.preServe if (preServe) { await preServe(rootDir, isBuildTest) } @@ -167,29 +200,30 @@ beforeAll(async () => { } } } catch (e: any) { - // jest doesn't exit if our setup has error here - // https://github.com/facebook/jest/issues/2713 - setBeforeAllError(e) - // Closing the page since an error in the setup, for example a runtime error // when building the playground should skip further tests. // If the page remains open, a command like `await page.click(...)` produces // a timeout with an exception that hides the real error in the console. await page.close() + + beforeAllError = e } -}, 30000) -afterAll(async () => { - global.page?.off('console', onConsole) - global.serverLogs = [] - await global.page?.close() - await server?.close() - global.watcher?.close() - const beforeAllErr = getBeforeAllError() - if (beforeAllErr) { - throw beforeAllErr + return async () => { + page?.off('console', onConsole) + global.serverLogs = [] + await page?.close() + await server?.close() + global.watcher?.close() + const beforeAllErr = getBeforeAllError() + if (browser) { + await browser.close() + } + if (beforeAllErr) { + throw beforeAllErr + } } -}) +}, 30000) function startStaticServer(config?: InlineConfig): Promise { if (!config) { diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts new file mode 100644 index 00000000000000..a23378c97465b3 --- /dev/null +++ b/vitest.config.e2e.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + include: ['./playground/**/*.spec.[tj]s'], + setupFiles: ['./scripts/vitestSetup.ts'], + globalSetup: ['./scripts/vitestGlobalSetup.ts'], + testTimeout: process.env.CI ? 50000 : 20000, + globals: true, + reporters: 'dot', + onConsoleLog(log) { + if (log.match(/experimental|jit engine|emitted file|tailwind/i)) + return false + }, + maxThreads: process.env.CI ? 1 : undefined, + minThreads: process.env.CI ? 1 : undefined + }, + esbuild: { + target: 'node14' + } +})