From 5100376ef91d5e39ec00222f1043e4fda047678b Mon Sep 17 00:00:00 2001 From: Dominik G Date: Wed, 30 Jun 2021 12:00:30 +0200 Subject: [PATCH] feat: restart server when svelte config file changes (fixes #63) (#72) * feat: restart server when svelte config file changes (fixes #63) * fix: make sure the absolute path of the loaded svelte config file is kept in resolvedOptions * refactor: use package.json scripts and execa to start servers for e2e-tests; add tests for svelte config watching * fix: remove syntax not supported by node12 from e2e script * fix: use writeFileSync instead of fs/promises for node12 * chore: remove debugging screenshots * chore: update dependencies * test: move to lower portrange and archive dist on failure * test: fix e2e-server script. correct error output and don't throw if closing server wasn't graceful * fix: really bad c&p err * test: increase sleep time on windows to account for slower devserver restart * fix invalid doc * chore: update changeset --- .changeset/large-ears-press.md | 7 + .github/workflows/ci.yml | 2 +- package.json | 24 +- .../autoprefixer-browerslist/package.json | 11 +- .../autoprefixer-browerslist/vite.config.js | 15 +- .../e2e-tests/configfile-custom/package.json | 12 +- .../svelte.config.custom.cjs | 4 +- .../svelte.config.custom.mjs | 9 +- .../configfile-custom/vite.config.js | 15 +- ...pec.disabled.ts => configfile-esm.spec.ts} | 0 .../e2e-tests/configfile-esm/package.json | 13 +- .../e2e-tests/configfile-esm/vite.config.js | 13 +- packages/e2e-tests/e2e-server.js | 151 +++ .../hmr-test-dependency/package.json | 2 +- packages/e2e-tests/hmr/__tests__/hmr.spec.ts | 65 +- packages/e2e-tests/hmr/package.json | 7 +- packages/e2e-tests/hmr/vite.config.js | 12 +- .../e2e-tests/kit-node/__tests__/kit.spec.ts | 12 + .../e2e-tests/kit-node/__tests__/serve.js | 59 - packages/e2e-tests/kit-node/package.json | 34 +- .../package-json-svelte-field/package.json | 5 +- .../package-json-svelte-field/vite.config.js | 13 +- .../__tests__/svelte-preprocess.spec.ts | 1 - .../e2e-tests/svelte-preprocess/package.json | 7 +- .../svelte-preprocess/vite.config.js | 13 +- .../test-dependency-svelte-field/package.json | 18 +- .../e2e-tests/ts-type-import/package.json | 4 +- .../e2e-tests/ts-type-import/vite.config.js | 15 +- .../e2e-tests/vite-ssr/__tests__/serve.js | 12 +- packages/e2e-tests/vite-ssr/package.json | 4 +- packages/e2e-tests/vite-ssr/server.js | 1 - packages/playground/big/package.json | 2 +- .../optimizedeps-include/package.json | 2 +- .../preprocess-with-vite/package.json | 2 +- packages/playground/windicss/package.json | 4 +- packages/vite-plugin-svelte/package.json | 6 +- packages/vite-plugin-svelte/src/index.ts | 2 +- .../src/utils/load-svelte-config.ts | 46 +- .../vite-plugin-svelte/src/utils/options.ts | 9 +- .../vite-plugin-svelte/src/utils/watch.ts | 65 +- pnpm-lock.yaml | 1049 ++++++++--------- scripts/jestPerTestSetup.ts | 162 +-- 42 files changed, 1059 insertions(+), 850 deletions(-) create mode 100644 .changeset/large-ears-press.md rename packages/e2e-tests/configfile-esm/__tests__/{configfile-esm.spec.disabled.ts => configfile-esm.spec.ts} (100%) create mode 100644 packages/e2e-tests/e2e-server.js delete mode 100644 packages/e2e-tests/kit-node/__tests__/serve.js diff --git a/.changeset/large-ears-press.md b/.changeset/large-ears-press.md new file mode 100644 index 000000000..29820cd6c --- /dev/null +++ b/.changeset/large-ears-press.md @@ -0,0 +1,7 @@ +--- +'@sveltejs/vite-plugin-svelte': minor +--- + +- Restart dev server when svelte config file changes +- Refactored e2e-tests to use package.json scripts +- Updated dependencies diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 699ad00a4..1bc6eb96e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -168,7 +168,7 @@ jobs: - name: archive tests temp directory if: failure() shell: bash - run: tar -cvf test-temp.tar --exclude="node_modules" --exclude=".yarn" --exclude="dist" --exclude=".pnp.js" temp/ + run: tar -cvf test-temp.tar --exclude="node_modules" temp/ - uses: actions/upload-artifact@v2 if: failure() with: diff --git a/package.json b/package.json index 7d2fc960b..22b070267 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "build": "pnpm --dir packages/vite-plugin-svelte build", "test": "run-s test:serve test:build", "test:serve": "jest", - "test:serve:debug": "cross-env VITE_DEBUG_SERVE=1 node --inspect-brk ./node_modules/.bin/jest", + "test:serve:debug": "cross-env DEBUG=pw:api VITE_DEBUG_SERVE=1 node --inspect-brk ./node_modules/jest/bin/jest --runInBand", "test:build": "cross-env VITE_TEST_BUILD=1 jest", - "test:build:debug": "cross-env VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 node --inspect-brk ./node_modules/.bin/jest", + "test:build:debug": "cross-env DEBUG=pw:api VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 node --inspect-brk ./node_modules/jest/bin/jest --runInBand", "test:ci": "run-s test:ci:serve test:ci:build", "test:ci:serve": "cross-env VITE_PRESERVE_BUILD_ARTIFACTS=1 jest --verbose --no-cache --runInBand --force-exit --ci --json --outputFile=\"temp/serve/jest-results.json\"", "test:ci:build": "cross-env VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 jest --verbose --no-cache --runInBand --force-exit --ci --json --outputFile=\"temp/build/jest-results.json\"", @@ -27,14 +27,14 @@ "@changesets/cli": "^2.16.0", "@types/fs-extra": "^9.0.11", "@types/jest": "^26.0.23", - "@types/node": "^15.12.4", + "@types/node": "^15.12.5", "@types/semver": "^7.3.6", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", + "@typescript-eslint/eslint-plugin": "^4.28.1", + "@typescript-eslint/parser": "^4.28.1", "chalk": "^4.1.1", "cross-env": "^7.0.3", "enquirer": "^2.3.6", - "esbuild": "^0.12.9", + "esbuild": "^0.12.12", "eslint": "^7.29.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-html": "^6.1.2", @@ -46,22 +46,22 @@ "execa": "^5.1.1", "fs-extra": "^10.0.0", "husky": "^6.0.0", - "jest": "^27.0.5", - "jest-environment-node": "^27.0.5", + "jest": "^27.0.6", + "jest-environment-node": "^27.0.6", "jest-junit": "^12.2.0", "lint-staged": "^11.0.0", "minimist": "^1.2.5", "node-fetch": "^2.6.1", "npm-check-updates": "^11.7.1", "npm-run-all": "^4.1.5", - "playwright-core": "^1.12.2", - "pnpm": "^6.8.0", - "prettier": "^2.3.1", + "playwright-core": "^1.12.3", + "pnpm": "^6.9.1", + "prettier": "^2.3.2", "prettier-plugin-svelte": "^2.3.1", "rimraf": "^3.0.2", "semver": "^7.3.5", "sirv": "^1.0.12", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "ts-jest": "^27.0.3", "typescript": "^4.3.4", "vite": "^2.3.8" diff --git a/packages/e2e-tests/autoprefixer-browerslist/package.json b/packages/e2e-tests/autoprefixer-browerslist/package.json index ac09e07c6..3c6f72fdc 100644 --- a/packages/e2e-tests/autoprefixer-browerslist/package.json +++ b/packages/e2e-tests/autoprefixer-browerslist/package.json @@ -3,18 +3,19 @@ "private": true, "version": "1.0.0", "scripts": { + "dev": "vite", "build": "vite build", - "dev": "vite" + "preview": "vite preview" + }, + "dependencies": { + "e2e-tests-hmr-test-dependency": "workspace:*" }, - "dependencies": { - "e2e-tests-hmr-test-dependency": "workspace:*" - }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", "autoprefixer": "^10.2.6", "postcss": "^8.3.5", "postcss-load-config": "^3.1.0", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "svelte-preprocess": "^4.7.3", "vite": "^2.3.8" diff --git a/packages/e2e-tests/autoprefixer-browerslist/vite.config.js b/packages/e2e-tests/autoprefixer-browerslist/vite.config.js index 3f658aba4..f8d6d1b5c 100644 --- a/packages/e2e-tests/autoprefixer-browerslist/vite.config.js +++ b/packages/e2e-tests/autoprefixer-browerslist/vite.config.js @@ -1,12 +1,21 @@ const { svelte } = require('@sveltejs/vite-plugin-svelte'); const { defineConfig } = require('vite'); -module.exports = defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; +module.exports = defineConfig(() => { return { plugins: [svelte()], build: { - minify: isProduction + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/configfile-custom/package.json b/packages/e2e-tests/configfile-custom/package.json index a37dab7f5..3cfdbc1f1 100644 --- a/packages/e2e-tests/configfile-custom/package.json +++ b/packages/e2e-tests/configfile-custom/package.json @@ -3,17 +3,17 @@ "private": true, "version": "1.0.0", "scripts": { + "dev": "vite", "build": "vite build", - "dev": "vite" + "preview": "vite preview" + }, + "dependencies": { + "e2e-tests-hmr-test-dependency": "workspace:*" }, - "dependencies": { - "e2e-tests-hmr-test-dependency": "workspace:*" - }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", - "svelte-preprocess": "^4.7.3", "vite": "^2.3.8" } } diff --git a/packages/e2e-tests/configfile-custom/svelte.config.custom.cjs b/packages/e2e-tests/configfile-custom/svelte.config.custom.cjs index c78d4fe57..65ac2cd1e 100644 --- a/packages/e2e-tests/configfile-custom/svelte.config.custom.cjs +++ b/packages/e2e-tests/configfile-custom/svelte.config.custom.cjs @@ -1,5 +1,3 @@ -const sveltePreprocess = require('svelte-preprocess'); - module.exports = { - preprocess: sveltePreprocess() + emitCss: false }; diff --git a/packages/e2e-tests/configfile-custom/svelte.config.custom.mjs b/packages/e2e-tests/configfile-custom/svelte.config.custom.mjs index eee3c8c05..3cd97ce69 100644 --- a/packages/e2e-tests/configfile-custom/svelte.config.custom.mjs +++ b/packages/e2e-tests/configfile-custom/svelte.config.custom.mjs @@ -1,10 +1,3 @@ -/* -const sveltePreprocess = require('svelte-preprocess'); - -module.exports = { - preprocess: sveltePreprocess() -}; -*/ export default { - emitCss: true + emitCss: false } diff --git a/packages/e2e-tests/configfile-custom/vite.config.js b/packages/e2e-tests/configfile-custom/vite.config.js index 337933b3b..08915291e 100644 --- a/packages/e2e-tests/configfile-custom/vite.config.js +++ b/packages/e2e-tests/configfile-custom/vite.config.js @@ -1,12 +1,21 @@ const { svelte } = require('@sveltejs/vite-plugin-svelte'); const { defineConfig } = require('vite'); -module.exports = defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; +module.exports = defineConfig(() => { return { plugins: [svelte({ configFile: 'svelte.config.custom.cjs' })], build: { - minify: isProduction + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/configfile-esm/__tests__/configfile-esm.spec.disabled.ts b/packages/e2e-tests/configfile-esm/__tests__/configfile-esm.spec.ts similarity index 100% rename from packages/e2e-tests/configfile-esm/__tests__/configfile-esm.spec.disabled.ts rename to packages/e2e-tests/configfile-esm/__tests__/configfile-esm.spec.ts diff --git a/packages/e2e-tests/configfile-esm/package.json b/packages/e2e-tests/configfile-esm/package.json index 56fbbf068..83fbe675d 100644 --- a/packages/e2e-tests/configfile-esm/package.json +++ b/packages/e2e-tests/configfile-esm/package.json @@ -3,18 +3,19 @@ "private": true, "version": "1.0.0", "scripts": { + "dev": "vite", "build": "vite build", - "dev": "vite" + "preview": "vite preview" + }, + "dependencies": { + "e2e-tests-hmr-test-dependency": "workspace:*" }, - "dependencies": { - "e2e-tests-hmr-test-dependency": "workspace:*" - }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "svelte-preprocess": "^4.7.3", "vite": "^2.3.8" }, - "type": "module" + "type": "module" } diff --git a/packages/e2e-tests/configfile-esm/vite.config.js b/packages/e2e-tests/configfile-esm/vite.config.js index d8a969594..20e9a8e57 100644 --- a/packages/e2e-tests/configfile-esm/vite.config.js +++ b/packages/e2e-tests/configfile-esm/vite.config.js @@ -2,11 +2,20 @@ import { svelte } from '@sveltejs/vite-plugin-svelte'; import { defineConfig } from 'vite'; export default defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; return { plugins: [svelte()], build: { - minify: isProduction + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/e2e-server.js b/packages/e2e-tests/e2e-server.js new file mode 100644 index 000000000..6be81168d --- /dev/null +++ b/packages/e2e-tests/e2e-server.js @@ -0,0 +1,151 @@ +// script to start package.json dev/build/preview scripts with execa for e2e tests +const execa = require('execa'); +const treeKill = require('tree-kill'); +const fs = require('fs'); +const path = require('path'); +const isWin = process.platform === 'win32'; +async function startedOnPort(serverProcess, port, timeout) { + let id; + let stdoutListener; + const timerPromise = new Promise( + (_, reject) => + (id = setTimeout(() => { + reject(`timeout for server start after ${timeout}`); + }, timeout)) + ); + const startedPromise = new Promise((resolve, reject) => { + stdoutListener = (data) => { + const str = data.toString(); + // hack, console output may contain color code gibberish + // skip gibberish between localhost: and port number + const match = str.match(/(http:\/\/localhost:)(?:.*)(\d{4})/); + if (match) { + const startedPort = parseInt(match[2], 10); + if (startedPort === port) { + resolve(); + } else { + const msg = `test server started on ${startedPort} instead of ${port}`; + console.log(msg); + reject(msg); + } + } + }; + + serverProcess.stdout.on('data', stdoutListener); + }); + + return Promise.race([timerPromise, startedPromise]).finally(() => { + serverProcess.stdout.off('data', stdoutListener); + clearTimeout(id); + }); +} + +exports.serve = async function serve(root, isBuild, port) { + const logDir = path.join(root, 'logs'); + const logs = { + server: null, + build: null + }; + const writeLogs = async (name, result) => { + try { + if (result.out && result.out.length > 0) { + fs.writeFileSync(path.join(logDir, `${name}.log`), result.out.join(''), 'utf-8'); + } + if (result.err && result.err.length > 0) { + fs.writeFileSync(path.join(logDir, `${name}.err.log`), result.err.join(''), 'utf-8'); + } + } catch (e1) { + console.error(`failed to write ${name} logs in ${logDir}`, e1); + } + }; + + if (isBuild) { + let buildResult; + let hasErr = false; + let out = []; + let err = []; + + try { + const buildProcess = execa('pnpm', ['build'], { + preferLocal: true, + cwd: root, + stdio: 'pipe' + }); + logs.build = { out, err }; + buildProcess.stdout.on('data', (d) => out.push(d.toString())); + buildProcess.stderr.on('data', (d) => err.push(d.toString())); + await buildProcess; + } catch (e) { + buildResult = e; + if (buildResult.stdout) { + out.push(buildResult.stdout); + } + if (buildResult.stderr) { + err.push(buildResult.stderr); + } + hasErr = true; + } + await writeLogs('build', logs.build); + if (hasErr) { + throw buildResult; + } + } + + const serverProcess = execa('pnpm', [isBuild ? 'preview' : 'dev', '--', '--port', port], { + preferLocal: true, + cwd: root, + stdio: 'pipe' + }); + const out = [], + err = []; + logs.server = { out, err }; + serverProcess.stdout.on('data', (d) => out.push(d.toString())); + serverProcess.stderr.on('data', (d) => err.push(d.toString())); + + const closeServer = async () => { + if (serverProcess) { + if (serverProcess.pid) { + await new Promise((resolve) => { + treeKill(serverProcess.pid, (err) => { + if (err) { + console.error(`failed to treekill serverprocess ${serverProcess.pid}`, err); + } + resolve(); + }); + }); + } else { + serverProcess.cancel(); + } + + try { + await serverProcess; + } catch (e) { + if (e.stdout) { + out.push(e.stdout); + } + if (e.stderr) { + err.push(e.stderr); + } + if (!isWin) { + // treekill on windows uses taskkill and that ends up here always + console.error(`server process did not exit gracefully. dir: ${root}`, e); + } + } + } + await writeLogs('server', logs.server); + }; + try { + await startedOnPort(serverProcess, port, 20000); + return { + port, + logs, + close: closeServer + }; + } catch (e) { + try { + await closeServer(); + } catch (e1) { + console.error('failed to close server process', e1); + } + } +}; diff --git a/packages/e2e-tests/hmr-test-dependency/package.json b/packages/e2e-tests/hmr-test-dependency/package.json index ed7c92ba4..eb7c9b010 100644 --- a/packages/e2e-tests/hmr-test-dependency/package.json +++ b/packages/e2e-tests/hmr-test-dependency/package.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "private": true, + "private": true, "name": "e2e-tests-hmr-test-dependency", "main": "index.js" } diff --git a/packages/e2e-tests/hmr/__tests__/hmr.spec.ts b/packages/e2e-tests/hmr/__tests__/hmr.spec.ts index 135ef5d7f..cf217b5d8 100644 --- a/packages/e2e-tests/hmr/__tests__/hmr.spec.ts +++ b/packages/e2e-tests/hmr/__tests__/hmr.spec.ts @@ -1,12 +1,15 @@ import { isBuild, + isWin, getEl, getText, editFileAndWaitForHmrComplete, untilUpdated, sleep, getColor, - editFile + editFile, + addFile, + removeFile } from '../../testUtils'; test('should render App', async () => { @@ -121,7 +124,7 @@ if (!isBuild) { test('should work with emitCss: false', async () => { await editFile('vite.config.js', (c) => c.replace('svelte()', 'svelte({emitCss:false})')); - await sleep(500); // editing vite config restarts server, give it some time + await sleep(isWin ? 1000 : 500); // editing vite config restarts server, give it some time await page.goto(viteTestUrl, { waitUntil: 'networkidle' }); await sleep(50); expect(await getText(`#hmr-test-1 .counter`)).toBe('0'); @@ -133,5 +136,63 @@ if (!isBuild) { expect(await getColor(`#hmr-test-1 .label`)).toBe('red'); expect(await getText(`#hmr-test-1 .counter`)).toBe('1'); }); + + test('should detect changes in svelte config and restart', async () => { + const injectPreprocessor = ({ content, filename }) => { + if (filename && filename.includes('App.svelte')) { + return { + code: content.replace( + '', + '
Injected
\n' + ) + }; + } + }; + await addFile( + 'svelte.config.cjs', + `module.exports = { + preprocess:[{markup:${injectPreprocessor.toString()}}]};` + ); + await sleep(isWin ? 1000 : 500); // adding config restarts server, give it some time + await page.goto(viteTestUrl, { waitUntil: 'networkidle' }); + await sleep(50); + expect(await getText('#preprocess-inject')).toBe('Injected'); + expect(await getText(`#hmr-test-1 .counter`)).toBe('0'); + expect(await getColor(`#hmr-test-1 .label`)).toBe('red'); + await (await getEl(`#hmr-test-1 .increment`)).click(); + await sleep(50); + expect(await getText(`#hmr-test-1 .counter`)).toBe('1'); + await updateHmrTest((content) => content.replace('color: red', 'color: green')); + expect(await getColor(`#hmr-test-1 .label`)).toBe('green'); + expect(await getText(`#hmr-test-1 .counter`)).toBe('1'); + await jest.resetModules(); + await editFile('svelte.config.cjs', (content) => + content + .replace('preprocess-inject', 'preprocess-inject-2') + .replace('Injected', 'Injected 2') + ); + await sleep(isWin ? 1000 : 500); // editing config restarts server, give it some time + await page.goto(viteTestUrl, { waitUntil: 'networkidle' }); + await sleep(50); + expect(await getText('#preprocess-inject-2')).toBe('Injected 2'); + expect(await getEl('#preprocess-inject')).toBe(null); + expect(await getColor(`#hmr-test-1 .label`)).toBe('green'); + expect(await getText(`#hmr-test-1 .counter`)).toBe('0'); + await (await getEl(`#hmr-test-1 .increment`)).click(); + await sleep(50); + expect(await getText(`#hmr-test-1 .counter`)).toBe('1'); + await updateHmrTest((content) => content.replace('color: green', 'color: red')); + expect(await getColor(`#hmr-test-1 .label`)).toBe('red'); + expect(await getText(`#hmr-test-1 .counter`)).toBe('1'); + await jest.resetModules(); + await removeFile('svelte.config.cjs'); + await sleep(isWin ? 1000 : 500); // editing config restarts server, give it some time + await page.goto(viteTestUrl, { waitUntil: 'networkidle' }); + await sleep(50); + expect(await getEl('#preprocess-inject-2')).toBe(null); + expect(await getEl('#preprocess-inject')).toBe(null); + expect(await getColor(`#hmr-test-1 .label`)).toBe('red'); + expect(await getText(`#hmr-test-1 .counter`)).toBe('0'); + }); }); } diff --git a/packages/e2e-tests/hmr/package.json b/packages/e2e-tests/hmr/package.json index c3f97980a..3c7c023f9 100644 --- a/packages/e2e-tests/hmr/package.json +++ b/packages/e2e-tests/hmr/package.json @@ -1,17 +1,18 @@ { "name": "e2e-tests-hmr", - "private": true, + "private": true, "version": "0.0.0", "scripts": { "dev": "vite", - "build": "vite build" + "build": "vite build", + "preview": "vite preview" }, "dependencies": { "e2e-tests-hmr-test-dependency": "workspace:*" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8", "node-fetch": "^2.6.1" diff --git a/packages/e2e-tests/hmr/vite.config.js b/packages/e2e-tests/hmr/vite.config.js index a1eff2945..41d0c40e1 100644 --- a/packages/e2e-tests/hmr/vite.config.js +++ b/packages/e2e-tests/hmr/vite.config.js @@ -2,14 +2,22 @@ const { defineConfig } = require('vite'); const { svelte } = require('@sveltejs/vite-plugin-svelte'); module.exports = defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; return { optimizeDeps: { exclude: ['e2e-tests-hmr-test-dependency'] }, plugins: [svelte()], build: { - minify: isProduction + minify: false, + target: 'esnext' + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts index 207146397..f739dd497 100644 --- a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts +++ b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts @@ -1,4 +1,5 @@ import { + editFile, editFileAndWaitForHmrComplete, getColor, getEl, @@ -170,6 +171,17 @@ describe('kit-node', () => { expect(await getText('button')).toBe('Clicks: 0'); }); }); + describe('config file update', () => { + it('should show an overlay', async () => { + await editFile('svelte.config.js', (config) => config + '\n'); + 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).toContain('Svelte config change detected'); + }); + }); }); } }); diff --git a/packages/e2e-tests/kit-node/__tests__/serve.js b/packages/e2e-tests/kit-node/__tests__/serve.js deleted file mode 100644 index df3f89261..000000000 --- a/packages/e2e-tests/kit-node/__tests__/serve.js +++ /dev/null @@ -1,59 +0,0 @@ -// @ts-check -// this is automtically detected by scripts/jestPerTestSetup.ts and will replace -// the default e2e test serve behavior - -const execa = require('execa'); -const treeKill = require('tree-kill'); -/** - * @param {string} root - * @param {boolean} isProd - */ -exports.serve = async function serve(root, isProd) { - if (isProd) { - await execa('svelte-kit', ['build'], { stdio: 'inherit', preferLocal: true, cwd: root }); - } - - return new Promise((resolve, reject) => { - try { - const serverProcess = execa( - 'svelte-kit', - [isProd ? 'preview' : 'dev', '--port', isProd ? '3200' : '3201'], - { - preferLocal: true, - cwd: root, - cleanup: true - } - ); - serverProcess.stdout.pipe(process.stdout); - serverProcess.stderr.pipe(process.stderr); - - const resolveWhenStarted = (data) => { - const str = data.toString(); - // hack, console output may contain color code gibberish - // skip gibberish between localhost: and port number starting with 3 - const match = str.match(/(http:\/\/localhost:)(?:[^3]*)(\d+)/); - if (match) { - serverProcess.stdout.off('data', resolveWhenStarted); - const customServer = { - port: parseInt(match[2], 10), - async close() { - if (serverProcess) { - // ensure started svelte-kit process is gone including all subprocesses - return new Promise((resolve, reject) => - treeKill(serverProcess.pid, (err) => { - err ? reject(err) : resolve(); - }) - ); - } - } - }; - resolve(customServer); - } - }; - - serverProcess.stdout.on('data', resolveWhenStarted); - } catch (e) { - reject(e); - } - }); -}; diff --git a/packages/e2e-tests/kit-node/package.json b/packages/e2e-tests/kit-node/package.json index 12626e53f..655860cef 100644 --- a/packages/e2e-tests/kit-node/package.json +++ b/packages/e2e-tests/kit-node/package.json @@ -1,19 +1,19 @@ { - "name": "e2e-tests-kit-node", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "svelte-kit dev", - "build": "svelte-kit build", - "preview": "svelte-kit preview" - }, - "devDependencies": { - "@sveltejs/adapter-node": "^1.0.0-next.27", - "@sveltejs/kit": "^1.0.0-next.116", - "svelte": "^3.38.2" - }, - "type": "module", - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - } + "name": "e2e-tests-kit-node", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "svelte-kit dev", + "build": "svelte-kit build", + "preview": "svelte-kit preview" + }, + "devDependencies": { + "@sveltejs/adapter-node": "^1.0.0-next.29", + "@sveltejs/kit": "^1.0.0-next.119", + "svelte": "^3.38.3" + }, + "type": "module", + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + } } diff --git a/packages/e2e-tests/package-json-svelte-field/package.json b/packages/e2e-tests/package-json-svelte-field/package.json index a7338917b..c3f275493 100644 --- a/packages/e2e-tests/package-json-svelte-field/package.json +++ b/packages/e2e-tests/package-json-svelte-field/package.json @@ -3,15 +3,16 @@ "private": true, "version": "1.0.0", "scripts": { + "dev": "vite", "build": "vite build", - "dev": "vite" + "preview": "vite preview" }, "dependencies": { "e2e-tests-test-dependency-svelte-field": "workspace:*" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8" } diff --git a/packages/e2e-tests/package-json-svelte-field/vite.config.js b/packages/e2e-tests/package-json-svelte-field/vite.config.js index 3f658aba4..fc3803ef6 100644 --- a/packages/e2e-tests/package-json-svelte-field/vite.config.js +++ b/packages/e2e-tests/package-json-svelte-field/vite.config.js @@ -2,11 +2,20 @@ const { svelte } = require('@sveltejs/vite-plugin-svelte'); const { defineConfig } = require('vite'); module.exports = defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; return { plugins: [svelte()], build: { - minify: isProduction + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/svelte-preprocess/__tests__/svelte-preprocess.spec.ts b/packages/e2e-tests/svelte-preprocess/__tests__/svelte-preprocess.spec.ts index 8e394dd4c..d2a4092cd 100644 --- a/packages/e2e-tests/svelte-preprocess/__tests__/svelte-preprocess.spec.ts +++ b/packages/e2e-tests/svelte-preprocess/__tests__/svelte-preprocess.spec.ts @@ -3,7 +3,6 @@ import { getEl, getText, editFileAndWaitForHmrComplete, - untilUpdated, sleep, getColor, addFile, diff --git a/packages/e2e-tests/svelte-preprocess/package.json b/packages/e2e-tests/svelte-preprocess/package.json index f3a03a28c..ab653a2c0 100644 --- a/packages/e2e-tests/svelte-preprocess/package.json +++ b/packages/e2e-tests/svelte-preprocess/package.json @@ -1,15 +1,16 @@ { "name": "e2e-tests-svelte-preprocess", - "private": true, + "private": true, "version": "0.0.0", "scripts": { "dev": "vite", "build": "vite build", - "serve": "vite preview" + "preview": "vite preview" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", + "svelte-hmr": "^0.14.4", "svelte-preprocess": "^4.7.3", "typescript": "^4.3.4", "vite": "^2.3.8" diff --git a/packages/e2e-tests/svelte-preprocess/vite.config.js b/packages/e2e-tests/svelte-preprocess/vite.config.js index 41403bdc7..c0467fa53 100644 --- a/packages/e2e-tests/svelte-preprocess/vite.config.js +++ b/packages/e2e-tests/svelte-preprocess/vite.config.js @@ -2,11 +2,20 @@ const { defineConfig } = require('vite'); const { svelte } = require('@sveltejs/vite-plugin-svelte'); module.exports = defineConfig(({ command, mode }) => { - const isProduction = mode === 'production'; return { plugins: [svelte()], build: { - minify: isProduction + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } } }; }); diff --git a/packages/e2e-tests/test-dependency-svelte-field/package.json b/packages/e2e-tests/test-dependency-svelte-field/package.json index 3a83dac24..fd24f6a86 100644 --- a/packages/e2e-tests/test-dependency-svelte-field/package.json +++ b/packages/e2e-tests/test-dependency-svelte-field/package.json @@ -1,13 +1,13 @@ { "version": "1.0.0", - "private": true, + "private": true, "name": "e2e-tests-test-dependency-svelte-field", - "svelte": "src/components/svelte.js", - "files": [ - "src", - "package.json" - ], - "exports": { - "./package.json": "./package.json" - } + "svelte": "src/components/svelte.js", + "files": [ + "src", + "package.json" + ], + "exports": { + "./package.json": "./package.json" + } } diff --git a/packages/e2e-tests/ts-type-import/package.json b/packages/e2e-tests/ts-type-import/package.json index cc8566b70..5f47723d0 100644 --- a/packages/e2e-tests/ts-type-import/package.json +++ b/packages/e2e-tests/ts-type-import/package.json @@ -5,12 +5,12 @@ "scripts": { "dev": "vite", "build": "vite build", - "serve": "vite preview" + "preview": "vite preview" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", "@tsconfig/svelte": "^2.0.1", - "@types/node": "^15.12.4", + "@types/node": "^15.12.5", "svelte-preprocess": "^4.7.3", "vite": "^2.3.8" } diff --git a/packages/e2e-tests/ts-type-import/vite.config.js b/packages/e2e-tests/ts-type-import/vite.config.js index b2c2c2cda..f8d6d1b5c 100644 --- a/packages/e2e-tests/ts-type-import/vite.config.js +++ b/packages/e2e-tests/ts-type-import/vite.config.js @@ -3,6 +3,19 @@ const { defineConfig } = require('vite'); module.exports = defineConfig(() => { return { - plugins: [svelte()] + plugins: [svelte()], + build: { + // make build faster by skipping transforms and minification + target: 'esnext', + minify: false + }, + server: { + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + usePolling: true, + interval: 100 + } + } }; }); diff --git a/packages/e2e-tests/vite-ssr/__tests__/serve.js b/packages/e2e-tests/vite-ssr/__tests__/serve.js index ced5ef4e3..b6d360716 100644 --- a/packages/e2e-tests/vite-ssr/__tests__/serve.js +++ b/packages/e2e-tests/vite-ssr/__tests__/serve.js @@ -4,15 +4,13 @@ const path = require('path'); -// must be unique across all e2e-tests! -const port = 9527; - /** * @param {string} root - * @param {boolean} isProd + * @param {boolean} isBuild + * @param {number} port */ -exports.serve = async function serve(root, isProd) { - if (isProd) { +exports.serve = async function serve(root, isBuild, port) { + if (isBuild) { // build first const { build } = require('vite'); // client build @@ -39,7 +37,7 @@ exports.serve = async function serve(root, isProd) { } const { createServer } = require(path.resolve(root, 'server.js')); - const { app, vite } = await createServer(root, isProd, true); + const { app, vite } = await createServer(root, isBuild, true); return new Promise((resolve, reject) => { try { diff --git a/packages/e2e-tests/vite-ssr/package.json b/packages/e2e-tests/vite-ssr/package.json index faae2afae..1a4f54d6e 100644 --- a/packages/e2e-tests/vite-ssr/package.json +++ b/packages/e2e-tests/vite-ssr/package.json @@ -7,7 +7,7 @@ "build": "pnpm build:client && pnpm build:server", "build:client": "vite build --ssrManifest --outDir dist/client", "build:server": "vite build --ssr src/entry-server.js --outDir dist/server", - "serve": "cross-env NODE_ENV=production node server", + "preview": "cross-env NODE_ENV=production node server", "debug": "node --inspect-brk server" }, "dependencies": { @@ -19,7 +19,7 @@ "cross-env": "^7.0.3", "express": "^4.17.1", "serve-static": "^1.14.1", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8" } diff --git a/packages/e2e-tests/vite-ssr/server.js b/packages/e2e-tests/vite-ssr/server.js index 286e88799..7ba1afc54 100644 --- a/packages/e2e-tests/vite-ssr/server.js +++ b/packages/e2e-tests/vite-ssr/server.js @@ -29,7 +29,6 @@ async function createServer( if (!isProd) { const inlineCfg = { root, - logLevel: _isTest ? 'error' : 'info', server: { middlewareMode: true } diff --git a/packages/playground/big/package.json b/packages/playground/big/package.json index 049e7c550..d5b28d151 100644 --- a/packages/playground/big/package.json +++ b/packages/playground/big/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8" } diff --git a/packages/playground/optimizedeps-include/package.json b/packages/playground/optimizedeps-include/package.json index cb90e53ae..ec986c2e9 100644 --- a/packages/playground/optimizedeps-include/package.json +++ b/packages/playground/optimizedeps-include/package.json @@ -9,7 +9,7 @@ }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.1", + "svelte": "^3.38.3", "vite": "^2.3.8", "tinro": "^0.6.4" } diff --git a/packages/playground/preprocess-with-vite/package.json b/packages/playground/preprocess-with-vite/package.json index fa47a2c3e..92bad1329 100644 --- a/packages/playground/preprocess-with-vite/package.json +++ b/packages/playground/preprocess-with-vite/package.json @@ -11,7 +11,7 @@ "@sveltejs/vite-plugin-svelte": "workspace:*", "sass": "^1.35.1", "stylus": "^0.54.8", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8" } diff --git a/packages/playground/windicss/package.json b/packages/playground/windicss/package.json index 33d92baf1..daad09069 100644 --- a/packages/playground/windicss/package.json +++ b/packages/playground/windicss/package.json @@ -12,9 +12,9 @@ }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:*", - "svelte": "^3.38.2", + "svelte": "^3.38.3", "svelte-hmr": "^0.14.4", "vite": "^2.3.8", - "vite-plugin-windicss": "^1.1.0" + "vite-plugin-windicss": "^1.1.1" } } diff --git a/packages/vite-plugin-svelte/package.json b/packages/vite-plugin-svelte/package.json index e1eed3805..c19ba605f 100644 --- a/packages/vite-plugin-svelte/package.json +++ b/packages/vite-plugin-svelte/package.json @@ -57,10 +57,10 @@ }, "devDependencies": { "@types/debug": "^4.1.5", - "esbuild": "^0.12.9", - "rollup": "^2.52.2", + "esbuild": "^0.12.12", + "rollup": "^2.52.3", "svelte": "^3.38.2", - "tsup": "^4.11.2", + "tsup": "^4.12.0", "vite": "^2.3.8" } } diff --git a/packages/vite-plugin-svelte/src/index.ts b/packages/vite-plugin-svelte/src/index.ts index b89ee3222..162d25d80 100644 --- a/packages/vite-plugin-svelte/src/index.ts +++ b/packages/vite-plugin-svelte/src/index.ts @@ -71,7 +71,7 @@ export function svelte(inlineOptions?: Partial): Plugin { configureServer(server) { // eslint-disable-next-line no-unused-vars options.server = server; - setupWatchers(server, cache, requestParser); + setupWatchers(options, cache, requestParser); }, load(id, ssr) { diff --git a/packages/vite-plugin-svelte/src/utils/load-svelte-config.ts b/packages/vite-plugin-svelte/src/utils/load-svelte-config.ts index 5044c5f49..1705f8153 100644 --- a/packages/vite-plugin-svelte/src/utils/load-svelte-config.ts +++ b/packages/vite-plugin-svelte/src/utils/load-svelte-config.ts @@ -5,11 +5,19 @@ import { log } from './log'; import { Options } from './options'; import { UserConfig } from 'vite'; -const knownSvelteConfigNames = ['svelte.config.js', 'svelte.config.cjs', 'svelte.config.mjs']; +export const knownSvelteConfigNames = [ + 'svelte.config.js', + 'svelte.config.cjs', + 'svelte.config.mjs' +]; // hide dynamic import from ts transform to prevent it turning into a require // see https://github.com/microsoft/TypeScript/issues/43329#issuecomment-811606238 -const dynamicImportDefault = new Function('path', 'return import(path).then(m => m.default)'); +// also use timestamp query to avoid caching on reload +const dynamicImportDefault = new Function( + 'path', + 'return import(path + "?t=" + Date.now()).then(m => m.default)' +); export async function loadSvelteConfig( viteConfig: UserConfig, @@ -21,19 +29,39 @@ export async function loadSvelteConfig( // try to use dynamic import for svelte.config.js first if (configFile.endsWith('.js') || configFile.endsWith('.mjs')) { try { - return await dynamicImportDefault(pathToFileURL(configFile).href); + const result = await dynamicImportDefault(pathToFileURL(configFile).href); + if (result != null) { + return { + ...result, + configFile + }; + } else { + throw new Error(`invalid export in ${configFile}`); + } } catch (e) { log.error(`failed to import config ${configFile}`, e); err = e; } } // cjs or error with dynamic import - try { - return require(configFile); - } catch (e) { - log.error(`failed to require config ${configFile}`, e); - if (!err) { - err = e; + if (!configFile.endsWith('.mjs')) { + try { + // avoid loading cached version on reload + delete require.cache[require.resolve(configFile)]; + const result = require(configFile); + if (result != null) { + return { + ...result, + configFile + }; + } else { + throw new Error(`invalid export in ${configFile}`); + } + } catch (e) { + log.error(`failed to require config ${configFile}`, e); + if (!err) { + err = e; + } } } // failed to load existing config file diff --git a/packages/vite-plugin-svelte/src/utils/options.ts b/packages/vite-plugin-svelte/src/utils/options.ts index ffb8dcd2b..3448afc27 100644 --- a/packages/vite-plugin-svelte/src/utils/options.ts +++ b/packages/vite-plugin-svelte/src/utils/options.ts @@ -115,7 +115,7 @@ function mergeOptions( viteConfig: UserConfig, viteEnv: ConfigEnv ): ResolvedOptions { - return { + const merged = { ...defaultOptions, ...svelteConfig, ...inlineOptions, @@ -129,6 +129,12 @@ function mergeOptions( isBuild: viteEnv.command === 'build', isServe: viteEnv.command === 'serve' }; + // configFile of svelteConfig contains the absolute path it was loaded from, + // prefer it over the possibly relative inline path + if (svelteConfig?.configFile) { + merged.configFile = svelteConfig.configFile; + } + return merged; } export async function resolveOptions( @@ -148,7 +154,6 @@ export async function resolveOptions( enforceOptionsForProduction(resolvedOptions); enforceOptionsForHmr(resolvedOptions); - return resolvedOptions; } diff --git a/packages/vite-plugin-svelte/src/utils/watch.ts b/packages/vite-plugin-svelte/src/utils/watch.ts index 0605dd008..9d5cd7971 100644 --- a/packages/vite-plugin-svelte/src/utils/watch.ts +++ b/packages/vite-plugin-svelte/src/utils/watch.ts @@ -1,15 +1,22 @@ -import { ViteDevServer } from 'vite'; import { VitePluginSvelteCache } from './vite-plugin-svelte-cache'; import fs from 'fs'; import { log } from './log'; import { IdParser } from './id'; +import { ResolvedOptions } from './options'; +import { knownSvelteConfigNames } from './load-svelte-config'; +import path from 'path'; export function setupWatchers( - server: ViteDevServer, + options: ResolvedOptions, cache: VitePluginSvelteCache, requestParser: IdParser ) { - const watcher = server.watcher; + const { server, configFile: svelteConfigFile } = options; + if (!server) { + return; + } + const { watcher, ws } = server; + const { configFile: viteConfigFile, root, server: serverConfig } = server.config; const emitChangeEventOnDependants = (filename: string) => { const dependants = cache.getDependants(filename); @@ -33,9 +40,53 @@ export function setupWatchers( } }; - watcher.on('change', emitChangeEventOnDependants); - watcher.on('unlink', (filename) => { - removeUnlinkedFromCache(filename); - emitChangeEventOnDependants(filename); + const triggerViteRestart = (filename: string) => { + // vite restart is triggered by simulating a change to vite config. This requires that vite config exists + // also we do not restart in middleware-mode as it could be risky + if (!!viteConfigFile && !serverConfig.middlewareMode) { + log.info(`svelte config changed: restarting vite server. - file: ${filename}`); + watcher.emit('change', viteConfigFile); + } else { + const message = + 'Svelte config change detected, restart your dev process to apply the changes.'; + log.info(message, filename); + ws.send({ + type: 'error', + err: { message, stack: '', plugin: 'vite-plugin-svelte', id: filename } + }); + } + }; + + const possibleSvelteConfigs = knownSvelteConfigNames.map((cfg) => path.join(root, cfg)); + const restartOnConfigAdd = (filename: string) => { + if (possibleSvelteConfigs.includes(filename)) { + triggerViteRestart(filename); + } + }; + + const restartOnConfigChange = (filename: string) => { + if (filename === svelteConfigFile) { + triggerViteRestart(filename); + } + }; + + // collection of watcher listeners by event + const listeners = { + add: [], + change: [emitChangeEventOnDependants], + unlink: [removeUnlinkedFromCache, emitChangeEventOnDependants] + }; + if (svelteConfigFile) { + listeners.change.push(restartOnConfigChange); + listeners.unlink.push(restartOnConfigChange); + } else { + // @ts-ignore + listeners.add.push(restartOnConfigAdd); + } + + Object.entries(listeners).forEach(([evt, listeners]) => { + if (listeners.length > 0) { + watcher.on(evt, (filename) => listeners.forEach((listener) => listener(filename))); + } }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 401db4cef..94c605dca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,14 +8,14 @@ importers: '@changesets/cli': ^2.16.0 '@types/fs-extra': ^9.0.11 '@types/jest': ^26.0.23 - '@types/node': ^15.12.4 + '@types/node': ^15.12.5 '@types/semver': ^7.3.6 - '@typescript-eslint/eslint-plugin': ^4.28.0 - '@typescript-eslint/parser': ^4.28.0 + '@typescript-eslint/eslint-plugin': ^4.28.1 + '@typescript-eslint/parser': ^4.28.1 chalk: ^4.1.1 cross-env: ^7.0.3 enquirer: ^2.3.6 - esbuild: ^0.12.9 + esbuild: ^0.12.12 eslint: ^7.29.0 eslint-config-prettier: ^8.3.0 eslint-plugin-html: ^6.1.2 @@ -27,22 +27,22 @@ importers: execa: ^5.1.1 fs-extra: ^10.0.0 husky: ^6.0.0 - jest: ^27.0.5 - jest-environment-node: ^27.0.5 + jest: ^27.0.6 + jest-environment-node: ^27.0.6 jest-junit: ^12.2.0 lint-staged: ^11.0.0 minimist: ^1.2.5 node-fetch: ^2.6.1 npm-check-updates: ^11.7.1 npm-run-all: ^4.1.5 - playwright-core: ^1.12.2 - pnpm: ^6.8.0 - prettier: ^2.3.1 + playwright-core: ^1.12.3 + pnpm: ^6.9.1 + prettier: ^2.3.2 prettier-plugin-svelte: ^2.3.1 rimraf: ^3.0.2 semver: ^7.3.5 sirv: ^1.0.12 - svelte: ^3.38.2 + svelte: ^3.38.3 ts-jest: ^27.0.3 typescript: ^4.3.4 vite: ^2.3.8 @@ -51,42 +51,42 @@ importers: '@changesets/cli': 2.16.0 '@types/fs-extra': 9.0.11 '@types/jest': 26.0.23 - '@types/node': 15.12.4 + '@types/node': 15.12.5 '@types/semver': 7.3.6 - '@typescript-eslint/eslint-plugin': 4.28.0_4ec1e0eca7c6e4115e1e7a13008fdec2 - '@typescript-eslint/parser': 4.28.0_eslint@7.29.0+typescript@4.3.4 + '@typescript-eslint/eslint-plugin': 4.28.1_20a3b80fca6a1319695de43eee7865f8 + '@typescript-eslint/parser': 4.28.1_eslint@7.29.0+typescript@4.3.4 chalk: 4.1.1 cross-env: 7.0.3 enquirer: 2.3.6 - esbuild: 0.12.9 + esbuild: 0.12.12 eslint: 7.29.0 eslint-config-prettier: 8.3.0_eslint@7.29.0 eslint-plugin-html: 6.1.2 - eslint-plugin-jest: 24.3.6_13db132cdcb2886c2bda0976a4d5be56 + eslint-plugin-jest: 24.3.6_815c04256d563f95e4895592597c28aa eslint-plugin-markdown: 2.2.0_eslint@7.29.0 eslint-plugin-node: 11.1.0_eslint@7.29.0 - eslint-plugin-prettier: 3.4.0_de2986b0c29d2faa795004f5443c76d1 - eslint-plugin-svelte3: 3.2.0_eslint@7.29.0+svelte@3.38.2 + eslint-plugin-prettier: 3.4.0_4e72879372edbffcbdaf0fa17b22c203 + eslint-plugin-svelte3: 3.2.0_eslint@7.29.0+svelte@3.38.3 execa: 5.1.1 fs-extra: 10.0.0 husky: 6.0.0 - jest: 27.0.5 - jest-environment-node: 27.0.5 + jest: 27.0.6 + jest-environment-node: 27.0.6 jest-junit: 12.2.0 lint-staged: 11.0.0 minimist: 1.2.5 node-fetch: 2.6.1 npm-check-updates: 11.7.1 npm-run-all: 4.1.5 - playwright-core: 1.12.2 - pnpm: 6.8.0 - prettier: 2.3.1 - prettier-plugin-svelte: 2.3.1_prettier@2.3.1+svelte@3.38.2 + playwright-core: 1.12.3 + pnpm: 6.9.1 + prettier: 2.3.2 + prettier-plugin-svelte: 2.3.1_prettier@2.3.2+svelte@3.38.3 rimraf: 3.0.2 semver: 7.3.5 sirv: 1.0.12 - svelte: 3.38.2 - ts-jest: 27.0.3_jest@27.0.5+typescript@4.3.4 + svelte: 3.38.3 + ts-jest: 27.0.3_jest@27.0.6+typescript@4.3.4 typescript: 4.3.4 vite: 2.3.8 @@ -105,7 +105,7 @@ importers: e2e-tests-hmr-test-dependency: workspace:* postcss: ^8.3.5 postcss-load-config: ^3.1.0 - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 svelte-preprocess: ^4.7.3 vite: ^2.3.8 @@ -116,33 +116,31 @@ importers: autoprefixer: 10.2.6_postcss@8.3.5 postcss: 8.3.5 postcss-load-config: 3.1.0 - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 - svelte-preprocess: 4.7.3_ac0ac1ad252708a4ef69be5a682a516a + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 + svelte-preprocess: 4.7.3_43084f978d25920dd68b5afc479d6e81 vite: 2.3.8 packages/e2e-tests/configfile-custom: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* e2e-tests-hmr-test-dependency: workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 - svelte-preprocess: ^4.7.3 vite: ^2.3.8 dependencies: e2e-tests-hmr-test-dependency: link:../hmr-test-dependency devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 - svelte-preprocess: 4.7.3_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/e2e-tests/configfile-esm: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* e2e-tests-hmr-test-dependency: workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 svelte-preprocess: ^4.7.3 vite: ^2.3.8 @@ -150,9 +148,9 @@ importers: e2e-tests-hmr-test-dependency: link:../hmr-test-dependency devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 - svelte-preprocess: 4.7.3_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 + svelte-preprocess: 4.7.3_svelte@3.38.3+typescript@4.3.4 vite: 2.3.8 packages/e2e-tests/hmr: @@ -160,7 +158,7 @@ importers: '@sveltejs/vite-plugin-svelte': workspace:* e2e-tests-hmr-test-dependency: workspace:* node-fetch: ^2.6.1 - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 dependencies: @@ -168,8 +166,8 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte node-fetch: 2.6.1 - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/e2e-tests/hmr-test-dependency: @@ -177,40 +175,42 @@ importers: packages/e2e-tests/kit-node: specifiers: - '@sveltejs/adapter-node': ^1.0.0-next.27 - '@sveltejs/kit': ^1.0.0-next.116 - svelte: ^3.38.2 + '@sveltejs/adapter-node': ^1.0.0-next.29 + '@sveltejs/kit': ^1.0.0-next.119 + svelte: ^3.38.3 devDependencies: - '@sveltejs/adapter-node': 1.0.0-next.27 - '@sveltejs/kit': 1.0.0-next.116_svelte@3.38.2 - svelte: 3.38.2 + '@sveltejs/adapter-node': 1.0.0-next.29 + '@sveltejs/kit': 1.0.0-next.119_svelte@3.38.3 + svelte: 3.38.3 packages/e2e-tests/package-json-svelte-field: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* e2e-tests-test-dependency-svelte-field: workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 dependencies: e2e-tests-test-dependency-svelte-field: link:../test-dependency-svelte-field devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/e2e-tests/svelte-preprocess: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 + svelte-hmr: ^0.14.4 svelte-preprocess: ^4.7.3 typescript: ^4.3.4 vite: ^2.3.8 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-preprocess: 4.7.3_svelte@3.38.2+typescript@4.3.4 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 + svelte-preprocess: 4.7.3_svelte@3.38.3+typescript@4.3.4 typescript: 4.3.4 vite: 2.3.8 @@ -221,14 +221,14 @@ importers: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* '@tsconfig/svelte': ^2.0.1 - '@types/node': ^15.12.4 + '@types/node': ^15.12.5 svelte-preprocess: ^4.7.3 vite: ^2.3.8 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte '@tsconfig/svelte': 2.0.1 - '@types/node': 15.12.4 - svelte-preprocess: 4.7.3 + '@types/node': 15.12.5 + svelte-preprocess: 4.7.3_svelte@3.38.3+typescript@4.3.4 vite: 2.3.8 packages/e2e-tests/vite-ssr: @@ -238,7 +238,7 @@ importers: cross-env: ^7.0.3 express: ^4.17.1 serve-static: ^1.14.1 - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 devDependencies: @@ -247,8 +247,8 @@ importers: cross-env: 7.0.3 express: 4.17.1 serve-static: 1.14.1 - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/playground: @@ -257,24 +257,24 @@ importers: packages/playground/big: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/playground/optimizedeps-include: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* - svelte: ^3.38.1 + svelte: ^3.38.3 tinro: ^0.6.4 vite: ^2.3.8 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 + svelte: 3.38.3 tinro: 0.6.4 vite: 2.3.8 @@ -283,33 +283,33 @@ importers: '@sveltejs/vite-plugin-svelte': workspace:* sass: ^1.35.1 stylus: ^0.54.8 - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte sass: 1.35.1 stylus: 0.54.8 - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 packages/playground/windicss: specifiers: '@sveltejs/vite-plugin-svelte': workspace:* - svelte: ^3.38.2 + svelte: ^3.38.3 svelte-hmr: ^0.14.4 vite: ^2.3.8 - vite-plugin-windicss: ^1.1.0 + vite-plugin-windicss: ^1.1.1 windicss: ^3.1.3 dependencies: windicss: 3.1.3 devDependencies: '@sveltejs/vite-plugin-svelte': link:../../vite-plugin-svelte - svelte: 3.38.2 - svelte-hmr: 0.14.4_svelte@3.38.2 + svelte: 3.38.3 + svelte-hmr: 0.14.4_svelte@3.38.3 vite: 2.3.8 - vite-plugin-windicss: 1.1.0_vite@2.3.8 + vite-plugin-windicss: 1.1.1_vite@2.3.8 packages/vite-plugin-svelte: specifiers: @@ -317,16 +317,16 @@ importers: '@types/debug': ^4.1.5 chalk: ^4.1.1 debug: ^4.3.2 - esbuild: ^0.12.9 + esbuild: ^0.12.12 magic-string: ^0.25.7 require-relative: ^0.8.7 - rollup: ^2.52.2 + rollup: ^2.52.3 svelte: ^3.38.2 svelte-hmr: ^0.14.4 - tsup: ^4.11.2 + tsup: ^4.12.0 vite: ^2.3.8 dependencies: - '@rollup/pluginutils': 4.1.0_rollup@2.52.2 + '@rollup/pluginutils': 4.1.0_rollup@2.52.3 chalk: 4.1.1 debug: 4.3.2 magic-string: 0.25.7 @@ -334,16 +334,18 @@ importers: svelte-hmr: 0.14.4_svelte@3.38.2 devDependencies: '@types/debug': 4.1.5 - esbuild: 0.12.9 - rollup: 2.52.2 + esbuild: 0.12.12 + rollup: 2.52.3 svelte: 3.38.2 - tsup: 4.11.2 + tsup: 4.12.0_typescript@4.3.4 vite: 2.3.8 packages: - /@antfu/utils/0.2.2: - resolution: {integrity: sha512-8GwVE0j48SpZaLxsHO0BSO0sEpkb+EhFQcABFBFomH4O8AwNVVvGQNRCBKOPUwU4Vxj3ZSVz8PDjUrPGwaYP9A==} + /@antfu/utils/0.2.4: + resolution: {integrity: sha512-2bZNkVfL9IZESmvE26UKi8SzyvSoaIsGXDcnbHFMtmGMqUiB1fXpAJ1ijGf+tSqKRQ5yagck2U1Qk0p+705/kw==} + dependencies: + '@types/throttle-debounce': 2.1.0 dev: true /@babel/code-frame/7.12.11: @@ -886,20 +888,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/27.0.2: - resolution: {integrity: sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==} + /@jest/console/27.0.6: + resolution: {integrity: sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 chalk: 4.1.1 - jest-message-util: 27.0.2 - jest-util: 27.0.2 + jest-message-util: 27.0.6 + jest-util: 27.0.6 slash: 3.0.0 dev: true - /@jest/core/27.0.5: - resolution: {integrity: sha512-g73//jF0VwsOIrWUC9Cqg03lU3QoAMFxVjsm6n6yNmwZcQPN/o8w+gLWODw5VfKNFZT38otXHWxc6b8eGDUpEA==} + /@jest/core/27.0.6: + resolution: {integrity: sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==} 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 @@ -907,30 +909,30 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 27.0.2 - '@jest/reporters': 27.0.5 - '@jest/test-result': 27.0.2 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/console': 27.0.6 + '@jest/reporters': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 ansi-escapes: 4.3.2 chalk: 4.1.1 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.6 - jest-changed-files: 27.0.2 - jest-config: 27.0.5 - jest-haste-map: 27.0.5 - jest-message-util: 27.0.2 - jest-regex-util: 27.0.1 - jest-resolve: 27.0.5 - jest-resolve-dependencies: 27.0.5 - jest-runner: 27.0.5 - jest-runtime: 27.0.5 - jest-snapshot: 27.0.5 - jest-util: 27.0.2 - jest-validate: 27.0.2 - jest-watcher: 27.0.2 + jest-changed-files: 27.0.6 + jest-config: 27.0.6 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-resolve-dependencies: 27.0.6 + jest-runner: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + jest-watcher: 27.0.6 micromatch: 4.0.4 p-each-series: 2.2.0 rimraf: 3.0.2 @@ -944,39 +946,39 @@ packages: - utf-8-validate dev: true - /@jest/environment/27.0.5: - resolution: {integrity: sha512-IAkJPOT7bqn0GiX5LPio6/e1YpcmLbrd8O5EFYpAOZ6V+9xJDsXjdgN2vgv9WOKIs/uA1kf5WeD96HhlBYO+FA==} + /@jest/environment/27.0.6: + resolution: {integrity: sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/fake-timers': 27.0.5 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 - jest-mock: 27.0.3 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 + jest-mock: 27.0.6 dev: true - /@jest/fake-timers/27.0.5: - resolution: {integrity: sha512-d6Tyf7iDoKqeUdwUKrOBV/GvEZRF67m7lpuWI0+SCD9D3aaejiOQZxAOxwH2EH/W18gnfYaBPLi0VeTGBHtQBg==} + /@jest/fake-timers/27.0.6: + resolution: {integrity: sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 '@sinonjs/fake-timers': 7.1.2 - '@types/node': 15.12.4 - jest-message-util: 27.0.2 - jest-mock: 27.0.3 - jest-util: 27.0.2 + '@types/node': 15.12.5 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-util: 27.0.6 dev: true - /@jest/globals/27.0.5: - resolution: {integrity: sha512-qqKyjDXUaZwDuccpbMMKCCMBftvrbXzigtIsikAH/9ca+kaae8InP2MDf+Y/PdCSMuAsSpHS6q6M25irBBUh+Q==} + /@jest/globals/27.0.6: + resolution: {integrity: sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.0.5 - '@jest/types': 27.0.2 - expect: 27.0.2 + '@jest/environment': 27.0.6 + '@jest/types': 27.0.6 + expect: 27.0.6 dev: true - /@jest/reporters/27.0.5: - resolution: {integrity: sha512-4uNg5+0eIfRafnpgu3jCZws3NNcFzhu5JdRd1mKQ4/53+vkIqwB6vfZ4gn5BdGqOaLtYhlOsPaL5ATkKzyBrJw==} + /@jest/reporters/27.0.6: + resolution: {integrity: sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==} 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 @@ -985,10 +987,10 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.0.2 - '@jest/test-result': 27.0.2 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 + '@jest/console': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 chalk: 4.1.1 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -999,10 +1001,10 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.0 istanbul-reports: 3.0.2 - jest-haste-map: 27.0.5 - jest-resolve: 27.0.5 - jest-util: 27.0.2 - jest-worker: 27.0.2 + jest-haste-map: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 slash: 3.0.0 source-map: 0.6.1 string-length: 4.0.2 @@ -1012,8 +1014,8 @@ packages: - supports-color dev: true - /@jest/source-map/27.0.1: - resolution: {integrity: sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==} + /@jest/source-map/27.0.6: + resolution: {integrity: sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: callsites: 3.1.0 @@ -1021,42 +1023,42 @@ packages: source-map: 0.6.1 dev: true - /@jest/test-result/27.0.2: - resolution: {integrity: sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==} + /@jest/test-result/27.0.6: + resolution: {integrity: sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.0.2 - '@jest/types': 27.0.2 + '@jest/console': 27.0.6 + '@jest/types': 27.0.6 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/27.0.5: - resolution: {integrity: sha512-opztnGs+cXzZ5txFG2+omBaV5ge/0yuJNKbhE3DREMiXE0YxBuzyEa6pNv3kk2JuucIlH2Xvgmn9kEEHSNt/SA==} + /@jest/test-sequencer/27.0.6: + resolution: {integrity: sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.0.2 + '@jest/test-result': 27.0.6 graceful-fs: 4.2.6 - jest-haste-map: 27.0.5 - jest-runtime: 27.0.5 + jest-haste-map: 27.0.6 + jest-runtime: 27.0.6 transitivePeerDependencies: - supports-color dev: true - /@jest/transform/27.0.5: - resolution: {integrity: sha512-lBD6OwKXSc6JJECBNk4mVxtSVuJSBsQrJ9WCBisfJs7EZuYq4K6vM9HmoB7hmPiLIDGeyaerw3feBV/bC4z8tg==} + /@jest/transform/27.0.6: + resolution: {integrity: sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.14.3 - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 babel-plugin-istanbul: 6.0.0 chalk: 4.1.1 convert-source-map: 1.7.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.6 - jest-haste-map: 27.0.5 - jest-regex-util: 27.0.1 - jest-util: 27.0.2 + jest-haste-map: 27.0.6 + jest-regex-util: 27.0.6 + jest-util: 27.0.6 micromatch: 4.0.4 pirates: 4.0.1 slash: 3.0.0 @@ -1088,6 +1090,17 @@ packages: chalk: 4.1.1 dev: true + /@jest/types/27.0.6: + resolution: {integrity: sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-reports': 3.0.1 + '@types/node': 15.12.5 + '@types/yargs': 16.0.3 + chalk: 4.1.1 + dev: true + /@manypkg/find-root/1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -1182,7 +1195,7 @@ packages: resolution: {integrity: sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==} dev: true - /@rollup/pluginutils/4.1.0_rollup@2.52.2: + /@rollup/pluginutils/4.1.0_rollup@2.52.3: resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -1190,7 +1203,7 @@ packages: dependencies: estree-walker: 2.0.2 picomatch: 2.3.0 - rollup: 2.52.2 + rollup: 2.52.3 dev: false /@sindresorhus/is/0.14.0: @@ -1210,24 +1223,24 @@ packages: '@sinonjs/commons': 1.8.3 dev: true - /@sveltejs/adapter-node/1.0.0-next.27: - resolution: {integrity: sha512-Ia1GyJ39dZBFRkX20P31pzASOJDtR0DCVV0wvN+znn06H/1P3EW9wbCVvuxHK8zgs3CCyO8NArL3Glcx/R1tgQ==} + /@sveltejs/adapter-node/1.0.0-next.29: + resolution: {integrity: sha512-F773SXfSUGZVtwVvi495uXK71oAZlLF1ZvnLi/R2bcCoDN5y8RA7fSWfrMH78EyM9dLOB5RSdShv8PcE5tpMUg==} dependencies: - esbuild: 0.12.9 + esbuild: 0.12.12 tiny-glob: 0.2.9 dev: true - /@sveltejs/kit/1.0.0-next.116_svelte@3.38.2: - resolution: {integrity: sha512-BpqiZMgCjxZUpDYnRZ3Z2H0PQtj7ak+EHOTJYOCUzDUK4iT4Jd36ljlzTEQgEJKrBTKZJgs0yFH1Zc9AAdftoA==} + /@sveltejs/kit/1.0.0-next.119_svelte@3.38.3: + resolution: {integrity: sha512-Pp971N1m2yKQg01kUxwQAolhUb1y9NNPV7zfQLIHQdvlFwrNI5hvOMlGiHj26mM5AyQSU4pnH8X1YUPSqi57gw==} engines: {node: ^12.20 || >=14.13} hasBin: true peerDependencies: - svelte: ^3.38.2 + svelte: ^3.34.0 dependencies: '@sveltejs/vite-plugin-svelte': link:packages/vite-plugin-svelte cheap-watch: 1.0.3 sade: 1.7.4 - svelte: 3.38.2 + svelte: 3.38.3 vite: 2.3.8 dev: true @@ -1289,7 +1302,7 @@ packages: /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 15.12.4 + '@types/node': 15.12.5 dev: true /@types/istanbul-lib-coverage/2.0.3: @@ -1341,6 +1354,10 @@ packages: resolution: {integrity: sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==} dev: true + /@types/node/15.12.5: + resolution: {integrity: sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==} + dev: true + /@types/node/15.6.2: resolution: {integrity: sha512-dxcOx8801kMo3KlU+C+/ctWrzREAH7YvoF3aoVpRdqgs+Kf7flp+PJDN/EX5bME3suDUZHsxes9hpvBmzYlWbA==} dev: true @@ -1379,6 +1396,10 @@ packages: resolution: {integrity: sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==} dev: true + /@types/throttle-debounce/2.1.0: + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + dev: true + /@types/unist/2.0.3: resolution: {integrity: sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==} dev: true @@ -1402,12 +1423,12 @@ packages: /@types/yauzl/2.9.1: resolution: {integrity: sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==} dependencies: - '@types/node': 15.12.4 + '@types/node': 15.12.5 dev: true optional: true - /@typescript-eslint/eslint-plugin/4.28.0_4ec1e0eca7c6e4115e1e7a13008fdec2: - resolution: {integrity: sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==} + /@typescript-eslint/eslint-plugin/4.28.1_20a3b80fca6a1319695de43eee7865f8: + resolution: {integrity: sha512-9yfcNpDaNGQ6/LQOX/KhUFTR1sCKH+PBr234k6hI9XJ0VP5UqGxap0AnNwBnWFk1MNyWBylJH9ZkzBXC+5akZQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: '@typescript-eslint/parser': ^4.0.0 @@ -1417,9 +1438,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.28.0_eslint@7.29.0+typescript@4.3.4 - '@typescript-eslint/parser': 4.28.0_eslint@7.29.0+typescript@4.3.4 - '@typescript-eslint/scope-manager': 4.28.0 + '@typescript-eslint/experimental-utils': 4.28.1_eslint@7.29.0+typescript@4.3.4 + '@typescript-eslint/parser': 4.28.1_eslint@7.29.0+typescript@4.3.4 + '@typescript-eslint/scope-manager': 4.28.1 debug: 4.3.1 eslint: 7.29.0 functional-red-black-tree: 1.0.1 @@ -1449,16 +1470,16 @@ packages: - typescript dev: true - /@typescript-eslint/experimental-utils/4.28.0_eslint@7.29.0+typescript@4.3.4: - resolution: {integrity: sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==} + /@typescript-eslint/experimental-utils/4.28.1_eslint@7.29.0+typescript@4.3.4: + resolution: {integrity: sha512-n8/ggadrZ+uyrfrSEchx3jgODdmcx7MzVM2sI3cTpI/YlfSm0+9HEUaWw3aQn2urL2KYlWYMDgn45iLfjDYB+Q==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.7 - '@typescript-eslint/scope-manager': 4.28.0 - '@typescript-eslint/types': 4.28.0 - '@typescript-eslint/typescript-estree': 4.28.0_typescript@4.3.4 + '@typescript-eslint/scope-manager': 4.28.1 + '@typescript-eslint/types': 4.28.1 + '@typescript-eslint/typescript-estree': 4.28.1_typescript@4.3.4 eslint: 7.29.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.29.0 @@ -1467,8 +1488,8 @@ packages: - typescript dev: true - /@typescript-eslint/parser/4.28.0_eslint@7.29.0+typescript@4.3.4: - resolution: {integrity: sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==} + /@typescript-eslint/parser/4.28.1_eslint@7.29.0+typescript@4.3.4: + resolution: {integrity: sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -1477,9 +1498,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.28.0 - '@typescript-eslint/types': 4.28.0 - '@typescript-eslint/typescript-estree': 4.28.0_typescript@4.3.4 + '@typescript-eslint/scope-manager': 4.28.1 + '@typescript-eslint/types': 4.28.1 + '@typescript-eslint/typescript-estree': 4.28.1_typescript@4.3.4 debug: 4.3.1 eslint: 7.29.0 typescript: 4.3.4 @@ -1495,12 +1516,12 @@ packages: '@typescript-eslint/visitor-keys': 4.26.0 dev: true - /@typescript-eslint/scope-manager/4.28.0: - resolution: {integrity: sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==} + /@typescript-eslint/scope-manager/4.28.1: + resolution: {integrity: sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.28.0 - '@typescript-eslint/visitor-keys': 4.28.0 + '@typescript-eslint/types': 4.28.1 + '@typescript-eslint/visitor-keys': 4.28.1 dev: true /@typescript-eslint/types/4.26.0: @@ -1508,8 +1529,8 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/types/4.28.0: - resolution: {integrity: sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==} + /@typescript-eslint/types/4.28.1: + resolution: {integrity: sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true @@ -1534,8 +1555,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/4.28.0_typescript@4.3.4: - resolution: {integrity: sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==} + /@typescript-eslint/typescript-estree/4.28.1_typescript@4.3.4: + resolution: {integrity: sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -1543,8 +1564,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.28.0 - '@typescript-eslint/visitor-keys': 4.28.0 + '@typescript-eslint/types': 4.28.1 + '@typescript-eslint/visitor-keys': 4.28.1 debug: 4.3.1 globby: 11.0.4 is-glob: 4.0.1 @@ -1563,18 +1584,18 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /@typescript-eslint/visitor-keys/4.28.0: - resolution: {integrity: sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==} + /@typescript-eslint/visitor-keys/4.28.1: + resolution: {integrity: sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.28.0 + '@typescript-eslint/types': 4.28.1 eslint-visitor-keys: 2.1.0 dev: true - /@windicss/plugin-utils/1.1.0: - resolution: {integrity: sha512-v9WhtcGKRehsbY2Omd9m+Jd0IsjbKJmRSa712BuPLZ+fZuCSomne9twjqtPn29IGqS6T/9lM8aOjW7mRMU1x/g==} + /@windicss/plugin-utils/1.1.1: + resolution: {integrity: sha512-niKEDyUpOfCGemFHopI9fxdWPpJQIZ/jmaU4spQXsGc1oEts164P8LUJPQmXc8C6vjKwkrH7KA+lxYNG5LmlDA==} dependencies: - '@antfu/utils': 0.2.2 + '@antfu/utils': 0.2.4 debug: 4.3.2 fast-glob: 3.2.5 jiti: 1.10.1 @@ -1838,18 +1859,18 @@ packages: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} dev: true - /babel-jest/27.0.5_@babel+core@7.14.3: - resolution: {integrity: sha512-bTMAbpCX7ldtfbca2llYLeSFsDM257aspyAOpsdrdSrBqoLkWCy4HPYTXtXWaSLgFPjrJGACL65rzzr4RFGadw==} + /babel-jest/27.0.6_@babel+core@7.14.3: + resolution: {integrity: sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.14.3 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 '@types/babel__core': 7.1.14 babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 27.0.1_@babel+core@7.14.3 + babel-preset-jest: 27.0.6_@babel+core@7.14.3 chalk: 4.1.1 graceful-fs: 4.2.6 slash: 3.0.0 @@ -1870,8 +1891,8 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/27.0.1: - resolution: {integrity: sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==} + /babel-plugin-jest-hoist/27.0.6: + resolution: {integrity: sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.12.13 @@ -1900,14 +1921,14 @@ packages: '@babel/plugin-syntax-top-level-await': 7.12.13_@babel+core@7.14.3 dev: true - /babel-preset-jest/27.0.1_@babel+core@7.14.3: - resolution: {integrity: sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==} + /babel-preset-jest/27.0.6_@babel+core@7.14.3: + resolution: {integrity: sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.14.3 - babel-plugin-jest-hoist: 27.0.1 + babel-plugin-jest-hoist: 27.0.6 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.3 dev: true @@ -2677,8 +2698,8 @@ packages: engines: {node: '>= 10.14.2'} dev: true - /diff-sequences/27.0.1: - resolution: {integrity: sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==} + /diff-sequences/27.0.6: + resolution: {integrity: sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true @@ -2849,8 +2870,8 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild/0.12.9: - resolution: {integrity: sha512-MWRhAbMOJ9RJygCrt778rz/qNYgA4ZVj6aXnNPxFjs7PmIpb0fuB9Gmg5uWrr6n++XKwwm/RmSz6RR5JL2Ocsw==} + /esbuild/0.12.12: + resolution: {integrity: sha512-fdB/8HRg9u95Zi4/qV+osrfzpvLzubFKUr8SkZf/kUKImLiX61Y7qBzV14FCKphFk7YoXWY85nbPGkI6pq+Zeg==} hasBin: true requiresBuild: true dev: true @@ -2923,7 +2944,7 @@ packages: htmlparser2: 6.1.0 dev: true - /eslint-plugin-jest/24.3.6_13db132cdcb2886c2bda0976a4d5be56: + /eslint-plugin-jest/24.3.6_815c04256d563f95e4895592597c28aa: resolution: {integrity: sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==} engines: {node: '>=10'} peerDependencies: @@ -2933,7 +2954,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 4.28.0_4ec1e0eca7c6e4115e1e7a13008fdec2 + '@typescript-eslint/eslint-plugin': 4.28.1_20a3b80fca6a1319695de43eee7865f8 '@typescript-eslint/experimental-utils': 4.26.0_eslint@7.29.0+typescript@4.3.4 eslint: 7.29.0 transitivePeerDependencies: @@ -2968,7 +2989,7 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-prettier/3.4.0_de2986b0c29d2faa795004f5443c76d1: + /eslint-plugin-prettier/3.4.0_4e72879372edbffcbdaf0fa17b22c203: resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} engines: {node: '>=6.0.0'} peerDependencies: @@ -2981,11 +3002,11 @@ packages: dependencies: eslint: 7.29.0 eslint-config-prettier: 8.3.0_eslint@7.29.0 - prettier: 2.3.1 + prettier: 2.3.2 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-svelte3/3.2.0_eslint@7.29.0+svelte@3.38.2: + /eslint-plugin-svelte3/3.2.0_eslint@7.29.0+svelte@3.38.3: resolution: {integrity: sha512-qdWB1QN21dEozsJFdR8XlEhMnsS6aKHjsXWuNmchYwxoet5I6QdCr1Xcq62++IzRBMCNCeH4waXqSOAdqrZzgA==} engines: {node: '>=10'} peerDependencies: @@ -2993,7 +3014,7 @@ packages: svelte: ^3.2.0 dependencies: eslint: 7.29.0 - svelte: 3.38.2 + svelte: 3.38.3 dev: true /eslint-scope/5.1.1: @@ -3180,16 +3201,16 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect/27.0.2: - resolution: {integrity: sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==} + /expect/27.0.6: + resolution: {integrity: sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 ansi-styles: 5.2.0 - jest-get-type: 27.0.1 - jest-matcher-utils: 27.0.2 - jest-message-util: 27.0.2 - jest-regex-util: 27.0.1 + jest-get-type: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 dev: true /express/4.17.1: @@ -4209,35 +4230,35 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/27.0.2: - resolution: {integrity: sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==} + /jest-changed-files/27.0.6: + resolution: {integrity: sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 execa: 5.1.1 throat: 6.0.1 dev: true - /jest-circus/27.0.5: - resolution: {integrity: sha512-p5rO90o1RTh8LPOG6l0Fc9qgp5YGv+8M5CFixhMh7gGHtGSobD1AxX9cjFZujILgY8t30QZ7WVvxlnuG31r8TA==} + /jest-circus/27.0.6: + resolution: {integrity: sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.0.5 - '@jest/test-result': 27.0.2 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 chalk: 4.1.1 co: 4.6.0 dedent: 0.7.0 - expect: 27.0.2 + expect: 27.0.6 is-generator-fn: 2.1.0 - jest-each: 27.0.2 - jest-matcher-utils: 27.0.2 - jest-message-util: 27.0.2 - jest-runtime: 27.0.5 - jest-snapshot: 27.0.5 - jest-util: 27.0.2 - pretty-format: 27.0.2 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 slash: 3.0.0 stack-utils: 2.0.3 throat: 6.0.1 @@ -4245,8 +4266,8 @@ packages: - supports-color dev: true - /jest-cli/27.0.5: - resolution: {integrity: sha512-kZqY020QFOFQKVE2knFHirTBElw3/Q0kUbDc3nMfy/x+RQ7zUY89SUuzpHHJoSX1kX7Lq569ncvjNqU3Td/FCA==} + /jest-cli/27.0.6: + resolution: {integrity: sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: @@ -4255,16 +4276,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.0.5 - '@jest/test-result': 27.0.2 - '@jest/types': 27.0.2 + '@jest/core': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 chalk: 4.1.1 exit: 0.1.2 graceful-fs: 4.2.6 import-local: 3.0.2 - jest-config: 27.0.5 - jest-util: 27.0.2 - jest-validate: 27.0.2 + jest-config: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 prompts: 2.4.1 yargs: 16.2.0 transitivePeerDependencies: @@ -4275,8 +4296,8 @@ packages: - utf-8-validate dev: true - /jest-config/27.0.5: - resolution: {integrity: sha512-zCUIXag7QIXKEVN4kUKbDBDi9Q53dV5o3eNhGqe+5zAbt1vLs4VE3ceWaYrOub0L4Y7E9pGfM84TX/0ARcE+Qw==} + /jest-config/27.0.6: + resolution: {integrity: sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: ts-node: '>=9.0.0' @@ -4285,26 +4306,26 @@ packages: optional: true dependencies: '@babel/core': 7.14.3 - '@jest/test-sequencer': 27.0.5 - '@jest/types': 27.0.2 - babel-jest: 27.0.5_@babel+core@7.14.3 + '@jest/test-sequencer': 27.0.6 + '@jest/types': 27.0.6 + babel-jest: 27.0.6_@babel+core@7.14.3 chalk: 4.1.1 deepmerge: 4.2.2 glob: 7.1.7 graceful-fs: 4.2.6 is-ci: 3.0.0 - jest-circus: 27.0.5 - jest-environment-jsdom: 27.0.5 - jest-environment-node: 27.0.5 - jest-get-type: 27.0.1 - jest-jasmine2: 27.0.5 - jest-regex-util: 27.0.1 - jest-resolve: 27.0.5 - jest-runner: 27.0.5 - jest-util: 27.0.2 - jest-validate: 27.0.2 + jest-circus: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-get-type: 27.0.6 + jest-jasmine2: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runner: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 micromatch: 4.0.4 - pretty-format: 27.0.2 + pretty-format: 27.0.6 transitivePeerDependencies: - bufferutil - canvas @@ -4322,44 +4343,44 @@ packages: pretty-format: 26.6.2 dev: true - /jest-diff/27.0.2: - resolution: {integrity: sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==} + /jest-diff/27.0.6: + resolution: {integrity: sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.1 - diff-sequences: 27.0.1 - jest-get-type: 27.0.1 - pretty-format: 27.0.2 + diff-sequences: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-docblock/27.0.1: - resolution: {integrity: sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==} + /jest-docblock/27.0.6: + resolution: {integrity: sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==} 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.0.2: - resolution: {integrity: sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==} + /jest-each/27.0.6: + resolution: {integrity: sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 chalk: 4.1.1 - jest-get-type: 27.0.1 - jest-util: 27.0.2 - pretty-format: 27.0.2 + jest-get-type: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-environment-jsdom/27.0.5: - resolution: {integrity: sha512-ToWhViIoTl5738oRaajTMgYhdQL73UWPoV4GqHGk2DPhs+olv8OLq5KoQW8Yf+HtRao52XLqPWvl46dPI88PdA==} + /jest-environment-jsdom/27.0.6: + resolution: {integrity: sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.0.5 - '@jest/fake-timers': 27.0.5 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 - jest-mock: 27.0.3 - jest-util: 27.0.2 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 + jest-mock: 27.0.6 + jest-util: 27.0.6 jsdom: 16.6.0 transitivePeerDependencies: - bufferutil @@ -4368,16 +4389,16 @@ packages: - utf-8-validate dev: true - /jest-environment-node/27.0.5: - resolution: {integrity: sha512-47qqScV/WMVz5OKF5TWpAeQ1neZKqM3ySwNveEnLyd+yaE/KT6lSMx/0SOx60+ZUcVxPiESYS+Kt2JS9y4PpkQ==} + /jest-environment-node/27.0.6: + resolution: {integrity: sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.0.5 - '@jest/fake-timers': 27.0.5 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 - jest-mock: 27.0.3 - jest-util: 27.0.2 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 + jest-mock: 27.0.6 + jest-util: 27.0.6 dev: true /jest-get-type/26.3.0: @@ -4385,52 +4406,52 @@ packages: engines: {node: '>= 10.14.2'} dev: true - /jest-get-type/27.0.1: - resolution: {integrity: sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==} + /jest-get-type/27.0.6: + resolution: {integrity: sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-haste-map/27.0.5: - resolution: {integrity: sha512-3LFryGSHxwPFHzKIs6W0BGA2xr6g1MvzSjR3h3D8K8Uqy4vbRm/grpGHzbPtIbOPLC6wFoViRrNEmd116QWSkw==} + /jest-haste-map/27.0.6: + resolution: {integrity: sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 '@types/graceful-fs': 4.1.5 - '@types/node': 15.12.4 + '@types/node': 15.12.5 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.6 - jest-regex-util: 27.0.1 - jest-serializer: 27.0.1 - jest-util: 27.0.2 - jest-worker: 27.0.2 + jest-regex-util: 27.0.6 + jest-serializer: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 micromatch: 4.0.4 walker: 1.0.7 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-jasmine2/27.0.5: - resolution: {integrity: sha512-m3TojR19sFmTn79QoaGy1nOHBcLvtLso6Zh7u+gYxZWGcza4rRPVqwk1hciA5ZOWWZIJOukAcore8JRX992FaA==} + /jest-jasmine2/27.0.6: + resolution: {integrity: sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/traverse': 7.14.2 - '@jest/environment': 27.0.5 - '@jest/source-map': 27.0.1 - '@jest/test-result': 27.0.2 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/environment': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 chalk: 4.1.1 co: 4.6.0 - expect: 27.0.2 + expect: 27.0.6 is-generator-fn: 2.1.0 - jest-each: 27.0.2 - jest-matcher-utils: 27.0.2 - jest-message-util: 27.0.2 - jest-runtime: 27.0.5 - jest-snapshot: 27.0.5 - jest-util: 27.0.2 - pretty-format: 27.0.2 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 throat: 6.0.1 transitivePeerDependencies: - supports-color @@ -4446,48 +4467,48 @@ packages: xml: 1.0.1 dev: true - /jest-leak-detector/27.0.2: - resolution: {integrity: sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==} + /jest-leak-detector/27.0.6: + resolution: {integrity: sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - jest-get-type: 27.0.1 - pretty-format: 27.0.2 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-matcher-utils/27.0.2: - resolution: {integrity: sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==} + /jest-matcher-utils/27.0.6: + resolution: {integrity: sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.1 - jest-diff: 27.0.2 - jest-get-type: 27.0.1 - pretty-format: 27.0.2 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-message-util/27.0.2: - resolution: {integrity: sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==} + /jest-message-util/27.0.6: + resolution: {integrity: sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/code-frame': 7.12.13 - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 '@types/stack-utils': 2.0.0 chalk: 4.1.1 graceful-fs: 4.2.6 micromatch: 4.0.4 - pretty-format: 27.0.2 + pretty-format: 27.0.6 slash: 3.0.0 stack-utils: 2.0.3 dev: true - /jest-mock/27.0.3: - resolution: {integrity: sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==} + /jest-mock/27.0.6: + resolution: {integrity: sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@27.0.5: + /jest-pnp-resolver/1.2.2_jest-resolve@27.0.6: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -4496,64 +4517,64 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 27.0.5 + jest-resolve: 27.0.6 dev: true - /jest-regex-util/27.0.1: - resolution: {integrity: sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==} + /jest-regex-util/27.0.6: + resolution: {integrity: sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-resolve-dependencies/27.0.5: - resolution: {integrity: sha512-xUj2dPoEEd59P+nuih4XwNa4nJ/zRd/g4rMvjHrZPEBWeWRq/aJnnM6mug+B+Nx+ILXGtfWHzQvh7TqNV/WbuA==} + /jest-resolve-dependencies/27.0.6: + resolution: {integrity: sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 - jest-regex-util: 27.0.1 - jest-snapshot: 27.0.5 + '@jest/types': 27.0.6 + jest-regex-util: 27.0.6 + jest-snapshot: 27.0.6 transitivePeerDependencies: - supports-color dev: true - /jest-resolve/27.0.5: - resolution: {integrity: sha512-Md65pngRh8cRuWVdWznXBB5eDt391OJpdBaJMxfjfuXCvOhM3qQBtLMCMTykhuUKiBMmy5BhqCW7AVOKmPrW+Q==} + /jest-resolve/27.0.6: + resolution: {integrity: sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 chalk: 4.1.1 escalade: 3.1.1 graceful-fs: 4.2.6 - jest-pnp-resolver: 1.2.2_jest-resolve@27.0.5 - jest-util: 27.0.2 - jest-validate: 27.0.2 + jest-pnp-resolver: 1.2.2_jest-resolve@27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 resolve: 1.20.0 slash: 3.0.0 dev: true - /jest-runner/27.0.5: - resolution: {integrity: sha512-HNhOtrhfKPArcECgBTcWOc+8OSL8GoFoa7RsHGnfZR1C1dFohxy9eLtpYBS+koybAHlJLZzNCx2Y/Ic3iEtJpQ==} + /jest-runner/27.0.6: + resolution: {integrity: sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.0.2 - '@jest/environment': 27.0.5 - '@jest/test-result': 27.0.2 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 chalk: 4.1.1 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.6 - jest-docblock: 27.0.1 - jest-environment-jsdom: 27.0.5 - jest-environment-node: 27.0.5 - jest-haste-map: 27.0.5 - jest-leak-detector: 27.0.2 - jest-message-util: 27.0.2 - jest-resolve: 27.0.5 - jest-runtime: 27.0.5 - jest-util: 27.0.2 - jest-worker: 27.0.2 + jest-docblock: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-haste-map: 27.0.6 + jest-leak-detector: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runtime: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 source-map-support: 0.5.19 throat: 6.0.1 transitivePeerDependencies: @@ -4563,18 +4584,18 @@ packages: - utf-8-validate dev: true - /jest-runtime/27.0.5: - resolution: {integrity: sha512-V/w/+VasowPESbmhXn5AsBGPfb35T7jZPGZybYTHxZdP7Gwaa+A0EXE6rx30DshHKA98lVCODbCO8KZpEW3hiQ==} + /jest-runtime/27.0.6: + resolution: {integrity: sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.0.2 - '@jest/environment': 27.0.5 - '@jest/fake-timers': 27.0.5 - '@jest/globals': 27.0.5 - '@jest/source-map': 27.0.1 - '@jest/test-result': 27.0.2 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/globals': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 '@types/yargs': 16.0.3 chalk: 4.1.1 cjs-module-lexer: 1.2.1 @@ -4582,14 +4603,14 @@ packages: exit: 0.1.2 glob: 7.1.7 graceful-fs: 4.2.6 - jest-haste-map: 27.0.5 - jest-message-util: 27.0.2 - jest-mock: 27.0.3 - jest-regex-util: 27.0.1 - jest-resolve: 27.0.5 - jest-snapshot: 27.0.5 - jest-util: 27.0.2 - jest-validate: 27.0.2 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 slash: 3.0.0 strip-bom: 4.0.0 yargs: 16.2.0 @@ -4597,16 +4618,16 @@ packages: - supports-color dev: true - /jest-serializer/27.0.1: - resolution: {integrity: sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==} + /jest-serializer/27.0.6: + resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 15.12.4 + '@types/node': 15.12.5 graceful-fs: 4.2.6 dev: true - /jest-snapshot/27.0.5: - resolution: {integrity: sha512-H1yFYdgnL1vXvDqMrnDStH6yHFdMEuzYQYc71SnC/IJnuuhW6J16w8GWG1P+qGd3Ag3sQHjbRr0TcwEo/vGS+g==} + /jest-snapshot/27.0.6: + resolution: {integrity: sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.14.3 @@ -4615,23 +4636,23 @@ packages: '@babel/plugin-syntax-typescript': 7.12.13_@babel+core@7.14.3 '@babel/traverse': 7.14.2 '@babel/types': 7.14.4 - '@jest/transform': 27.0.5 - '@jest/types': 27.0.2 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 '@types/babel__traverse': 7.11.1 '@types/prettier': 2.2.3 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.3 chalk: 4.1.1 - expect: 27.0.2 + expect: 27.0.6 graceful-fs: 4.2.6 - jest-diff: 27.0.2 - jest-get-type: 27.0.1 - jest-haste-map: 27.0.5 - jest-matcher-utils: 27.0.2 - jest-message-util: 27.0.2 - jest-resolve: 27.0.5 - jest-util: 27.0.2 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + jest-haste-map: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 natural-compare: 1.4.0 - pretty-format: 27.0.2 + pretty-format: 27.0.6 semver: 7.3.5 transitivePeerDependencies: - supports-color @@ -4649,42 +4670,54 @@ packages: picomatch: 2.3.0 dev: true - /jest-validate/27.0.2: - resolution: {integrity: sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==} + /jest-util/27.0.6: + resolution: {integrity: sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 + chalk: 4.1.1 + graceful-fs: 4.2.6 + is-ci: 3.0.0 + picomatch: 2.3.0 + dev: true + + /jest-validate/27.0.6: + resolution: {integrity: sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 camelcase: 6.2.0 chalk: 4.1.1 - jest-get-type: 27.0.1 + jest-get-type: 27.0.6 leven: 3.1.0 - pretty-format: 27.0.2 + pretty-format: 27.0.6 dev: true - /jest-watcher/27.0.2: - resolution: {integrity: sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==} + /jest-watcher/27.0.6: + resolution: {integrity: sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.0.2 - '@jest/types': 27.0.2 - '@types/node': 15.12.4 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 15.12.5 ansi-escapes: 4.3.2 chalk: 4.1.1 - jest-util: 27.0.2 + jest-util: 27.0.6 string-length: 4.0.2 dev: true - /jest-worker/27.0.2: - resolution: {integrity: sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==} + /jest-worker/27.0.6: + resolution: {integrity: sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 15.12.4 + '@types/node': 15.12.5 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/27.0.5: - resolution: {integrity: sha512-4NlVMS29gE+JOZvgmSAsz3eOjkSsHqjTajlIsah/4MVSmKvf3zFP/TvgcLoWe2UVHiE9KF741sReqhF0p4mqbQ==} + /jest/27.0.6: + resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: @@ -4693,9 +4726,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.0.5 + '@jest/core': 27.0.6 import-local: 3.0.2 - jest-cli: 27.0.5 + jest-cli: 27.0.6 transitivePeerDependencies: - bufferutil - canvas @@ -5959,8 +5992,8 @@ packages: find-up: 4.1.0 dev: true - /playwright-core/1.12.2: - resolution: {integrity: sha512-bXRidCBIzdF+GHY/Wk8YLqLWaqnXIr3uJrK3YxnNIE9j9tQQEH/A4N04H6blJmYrAECTetvTjaI8Z4YbX8IZOg==} + /playwright-core/1.12.3: + resolution: {integrity: sha512-7uCxloOH4JRVTdJa+PH0Lp+GqWHL7WjQwMT77TtGtBblgoVFuY7ZzVzXgAXtV0rfqq5xUvwaxFBS36fkgT2bNw==} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -5996,20 +6029,12 @@ packages: engines: {node: '>=10.13.0'} dev: true - /pnpm/6.8.0: - resolution: {integrity: sha512-la/zfhv3FA9K5kwWda58genmRQD0MwWJjLvHhH65EQWOEG3sr9zKSCJxUzckIY9uy//IRhnTTUY0HYqq2D7N6g==} + /pnpm/6.9.1: + resolution: {integrity: sha512-2qlbvmHB+ULAoTCMpJ75oADYoVQnsxD1ipCemdDJA2KW4auGwoTUzyowVYEiAe4DIDOqw3axhHVkNAo7P6goZA==} engines: {node: '>=12.17'} hasBin: true dev: true - /postcss-load-config/3.0.1: - resolution: {integrity: sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==} - engines: {node: '>= 10'} - dependencies: - cosmiconfig: 7.0.0 - import-cwd: 3.0.0 - dev: true - /postcss-load-config/3.1.0: resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==} engines: {node: '>= 10'} @@ -6069,14 +6094,14 @@ packages: fast-diff: 1.2.0 dev: true - /prettier-plugin-svelte/2.3.1_prettier@2.3.1+svelte@3.38.2: + /prettier-plugin-svelte/2.3.1_prettier@2.3.2+svelte@3.38.3: resolution: {integrity: sha512-F1/r6OYoBq8Zgurhs1MN25tdrhPw0JW5JjioPRqpxbYdmrZ3gY/DzHGs0B6zwd4DLyRsfGB2gqhxUCbHt/D1fw==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 dependencies: - prettier: 2.3.1 - svelte: 3.38.2 + prettier: 2.3.2 + svelte: 3.38.3 dev: true /prettier/1.19.1: @@ -6085,8 +6110,8 @@ packages: hasBin: true dev: true - /prettier/2.3.1: - resolution: {integrity: sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==} + /prettier/2.3.2: + resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -6101,11 +6126,11 @@ packages: react-is: 17.0.2 dev: true - /pretty-format/27.0.2: - resolution: {integrity: sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==} + /pretty-format/27.0.6: + resolution: {integrity: sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.0.2 + '@jest/types': 27.0.6 ansi-regex: 5.0.0 ansi-styles: 5.2.0 react-is: 17.0.2 @@ -6452,16 +6477,16 @@ packages: glob: 7.1.7 dev: true - /rollup/2.50.6: - resolution: {integrity: sha512-6c5CJPLVgo0iNaZWWliNu1Kl43tjP9LZcp6D/tkf2eLH2a9/WeHxg9vfTFl8QV/2SOyaJX37CEm9XuGM0rviUg==} + /rollup/2.52.2: + resolution: {integrity: sha512-4RlFC3k2BIHlUsJ9mGd8OO+9Lm2eDF5P7+6DNQOp5sx+7N/1tFM01kELfbxlMX3MxT6owvLB1ln4S3QvvQlbUA==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 dev: true - /rollup/2.52.2: - resolution: {integrity: sha512-4RlFC3k2BIHlUsJ9mGd8OO+9Lm2eDF5P7+6DNQOp5sx+7N/1tFM01kELfbxlMX3MxT6owvLB1ln4S3QvvQlbUA==} + /rollup/2.52.3: + resolution: {integrity: sha512-QF3Sju8Kl2z0osI4unyOLyUudyhOMK6G0AeqJWgfiyigqLAlnNrfBcDWDx+f1cqn+JU2iIYVkDrgQ6/KtwEfrg==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: @@ -7028,55 +7053,17 @@ packages: svelte: '>=3.19.0' dependencies: svelte: 3.38.2 + dev: false - /svelte-preprocess/4.7.3: - resolution: {integrity: sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==} - engines: {node: '>= 9.11.2'} - requiresBuild: true + /svelte-hmr/0.14.4_svelte@3.38.3: + resolution: {integrity: sha512-kItFF7vqzStckSigoFmMnxJpTOdB9TWnQAW6Js+yAB4277tLbJIIE5KBlGHNmJNpA7MguqidsPB27Uw5UzQPCA==} peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 - node-sass: '*' - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.54.7 - sugarss: ^2.0.0 - svelte: ^3.23.0 - typescript: ^3.9.5 || ^4.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - node-sass: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true + svelte: '>=3.19.0' dependencies: - '@types/pug': 2.0.4 - '@types/sass': 1.16.0 - detect-indent: 6.1.0 - strip-indent: 3.0.0 + svelte: 3.38.3 dev: true - /svelte-preprocess/4.7.3_ac0ac1ad252708a4ef69be5a682a516a: + /svelte-preprocess/4.7.3_43084f978d25920dd68b5afc479d6e81: resolution: {integrity: sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -7123,58 +7110,11 @@ packages: postcss: 8.3.5 postcss-load-config: 3.1.0 strip-indent: 3.0.0 - svelte: 3.38.2 - dev: true - - /svelte-preprocess/4.7.3_svelte@3.38.2: - resolution: {integrity: sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==} - engines: {node: '>= 9.11.2'} - requiresBuild: true - peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 - node-sass: '*' - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.54.7 - sugarss: ^2.0.0 - svelte: ^3.23.0 - typescript: ^3.9.5 || ^4.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - node-sass: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true - dependencies: - '@types/pug': 2.0.4 - '@types/sass': 1.16.0 - detect-indent: 6.1.0 - strip-indent: 3.0.0 - svelte: 3.38.2 + svelte: 3.38.3 + typescript: 4.3.4 dev: true - /svelte-preprocess/4.7.3_svelte@3.38.2+typescript@4.3.4: + /svelte-preprocess/4.7.3_svelte@3.38.3+typescript@4.3.4: resolution: {integrity: sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -7219,7 +7159,7 @@ packages: '@types/sass': 1.16.0 detect-indent: 6.1.0 strip-indent: 3.0.0 - svelte: 3.38.2 + svelte: 3.38.3 typescript: 4.3.4 dev: true @@ -7228,6 +7168,11 @@ packages: engines: {node: '>= 8'} dev: true + /svelte/3.38.3: + resolution: {integrity: sha512-N7bBZJH0iF24wsalFZF+fVYMUOigaAUQMIcEKHO3jstK/iL8VmP9xE+P0/a76+FkNcWt+TDv2Gx1taUoUscrvw==} + engines: {node: '>= 8'} + dev: true + /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true @@ -7397,7 +7342,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest/27.0.3_jest@27.0.5+typescript@4.3.4: + /ts-jest/27.0.3_jest@27.0.6+typescript@4.3.4: resolution: {integrity: sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -7408,7 +7353,7 @@ packages: bs-logger: 0.2.6 buffer-from: 1.1.1 fast-json-stable-stringify: 2.1.0 - jest: 27.0.5 + jest: 27.0.6 jest-util: 27.0.2 json5: 2.2.0 lodash: 4.17.21 @@ -7423,8 +7368,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tsup/4.11.2: - resolution: {integrity: sha512-cp+gy0TGzFm/3PkPNeiZ2Fvi4MKI8jj6Xq6gVpSQ+Og+6GPqfws2K4zYo11OJoccuk2LnlJIJt8xwnoYCVGpSA==} + /tsup/4.12.0_typescript@4.3.4: + resolution: {integrity: sha512-TjODlDrJYcMHW8nRVbhf2PBelo2ew3s7zfSdp/17dXlPkMbnYs80ZmITPgR1KRa6cagSqU+9lYZZe/xbRqhWAQ==} hasBin: true peerDependencies: typescript: ^4.2.3 @@ -7435,18 +7380,20 @@ packages: cac: 6.7.3 chalk: 4.1.1 chokidar: 3.5.1 - debug: 4.3.2 - esbuild: 0.12.9 + debug: 4.3.1 + esbuild: 0.12.12 execa: 5.1.1 - globby: 11.0.3 + globby: 11.0.4 joycon: 3.0.1 - postcss-load-config: 3.0.1 + postcss-load-config: 3.1.0 resolve-from: 5.0.0 - rollup: 2.50.6 + rollup: 2.52.3 sucrase: 3.18.1 tree-kill: 1.2.2 + typescript: 4.3.4 transitivePeerDependencies: - supports-color + - ts-node dev: true /tsutils/3.21.0_typescript@4.3.4: @@ -7693,12 +7640,12 @@ packages: extsprintf: 1.3.0 dev: true - /vite-plugin-windicss/1.1.0_vite@2.3.8: - resolution: {integrity: sha512-vb8jwOlLGCzHcAfh7gtBa/+gioTXmcJYqACoHhaDD1MEwMB55qTODJckvi1eeQ74yV4uBTizOCRrucY+gI2xAg==} + /vite-plugin-windicss/1.1.1_vite@2.3.8: + resolution: {integrity: sha512-J1n3DoSg8BkQ42HDNzh+FqPhvBgCRgQ0Nvp2HLvb5FVl8FKEPw26Frc/oLaC1g9ypSlvkSM8011gHi+c+pxsRQ==} peerDependencies: vite: ^2.3.8 dependencies: - '@windicss/plugin-utils': 1.1.0 + '@windicss/plugin-utils': 1.1.1 chalk: 4.1.1 debug: 4.3.2 vite: 2.3.8 @@ -7712,7 +7659,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - esbuild: 0.12.9 + esbuild: 0.12.12 postcss: 8.3.5 resolve: 1.20.0 rollup: 2.52.2 diff --git a/scripts/jestPerTestSetup.ts b/scripts/jestPerTestSetup.ts index e28e945b7..233f87866 100644 --- a/scripts/jestPerTestSetup.ts +++ b/scripts/jestPerTestSetup.ts @@ -1,8 +1,5 @@ import * as fs from 'fs-extra'; -import * as http from 'http'; import * as path from 'path'; -import sirv from 'sirv'; -import { createServer, build, ViteDevServer, UserConfig } from 'vite'; import { Page } from 'playwright-core'; const isBuild = !!process.env.VITE_TEST_BUILD; @@ -26,13 +23,13 @@ declare global { } } -interface CustomServer { +interface E2EServer { port: number; - base?: string; + logs: { server?: { out: string[]; err: string[] }; build?: { out: string[]; err: string[] } }; close: () => {}; } -let server: ViteDevServer | http.Server | CustomServer; +let server: E2EServer; let tempDir: string; let err: Error; @@ -41,27 +38,56 @@ const onConsole = (msg) => { logs.push(msg.text()); }; +/** + * return a unique port for serving this e2e test. + * dev ports 3500+ + * build ports 5500+ + * + * needed to avoid port clashes on parallel + * + * @param testRoot + * @param testName + * @param isBuild + */ +const getUniqueTestPort = async (testRoot, testName, isBuild) => { + const testDirs = await fs.readdir(testRoot, { withFileTypes: true }); + const idx = testDirs + .filter((f) => f.isDirectory()) + .map((d) => d.name) + .indexOf(testName); + if (idx < 0) { + throw new Error(`failed to find ${testName} in ${testRoot}`); + } + return (isBuild ? 5500 : 3500) + idx; +}; + beforeAll(async () => { const page = global.page; if (!page) { return; } + const testPath = expect.getState().testPath; + const segments = testPath.split(path.sep); + const testName = segments.includes('e2e-tests') + ? segments[segments.indexOf('e2e-tests') + 1] + : null; try { - page.on('console', onConsole); - - const testPath = expect.getState().testPath; - const segments = testPath.split(path.sep); - const testName = segments.includes('e2e-tests') - ? segments[segments.indexOf('e2e-tests') + 1] - : null; - // if this is a test placed under e2e-tests/xxx/__tests__ // start a vite server in that directory. if (testName) { + page.on('console', onConsole); const e2eTestsRoot = path.resolve(__dirname, '../packages/e2e-tests'); const srcDir = path.resolve(e2eTestsRoot, testName); + tempDir = path.resolve(__dirname, '../temp', isBuild ? 'build' : 'serve', testName); - const directoriesToIgnore = ['node_modules', '__tests__', 'dist', 'build', '.svelte']; + const directoriesToIgnore = [ + 'node_modules', + '__tests__', + 'dist', + 'build', + '.svelte', + '.svelte-kit' + ]; const isIgnored = (file) => { const segments = file.split(path.sep); return segments.some((segment) => directoriesToIgnore.includes(segment)); @@ -83,57 +109,23 @@ beforeAll(async () => { if (!stat.isSymbolicLink()) { console.error(`failed to symlink ${e2e_tests_node_modules} to ${temp_node_modules}`); } - const testCustomServe = path.resolve(path.dirname(testPath), 'serve.js'); - if (fs.existsSync(testCustomServe)) { - // test has custom server configuration. - const { serve } = require(testCustomServe); - const customServer: CustomServer = await serve(tempDir, isBuild); - server = customServer; - // use resolved port/base from server - const port = customServer.port; - const base = customServer.base && customServer.base !== '/' ? `/${customServer.base}` : ''; - const url = (global.viteTestUrl = `http://localhost:${port}${base}`); - await (isBuild ? page.goto(url) : goToUrlAndWaitForViteWSConnect(page, url)); - return; - } - - const options: UserConfig = { - root: tempDir, - logLevel: 'error', - server: { - watch: { - // During tests we edit the files too fast and sometimes chokidar - // misses change events, so enforce polling for consistency - usePolling: true, - interval: 100 - } - }, - build: { - // skip transpilation and dynamic import polyfills during tests to - // make it faster - target: 'esnext' - } - }; - - if (!isBuild) { - process.env.VITE_INLINE = 'inline-serve'; - server = await (await createServer(options)).listen(); - // use resolved port/base from server - const base = server.config.base === '/' ? '' : server.config.base; - const url = (global.viteTestUrl = `http://localhost:${server.config.server.port}${base}`); - await goToUrlAndWaitForViteWSConnect(page, url); - } else { - process.env.VITE_INLINE = 'inline-build'; - await build(options); - const url = (global.viteTestUrl = await startStaticServer()); - await page.goto(url); - } + await fs.mkdir(path.join(tempDir, 'logs')); + const customServerScript = path.resolve(path.dirname(testPath), 'serve.js'); + const defaultServerScript = path.resolve(e2eTestsRoot, 'e2e-server.js'); + const hasCustomServer = fs.existsSync(customServerScript); + const { serve } = require(hasCustomServer ? customServerScript : defaultServerScript); + const port = await getUniqueTestPort(e2eTestsRoot, testName, isBuild); + server = await serve(tempDir, isBuild, port); + const url = (global.viteTestUrl = `http://localhost:${port}`); + await (isBuild + ? page.goto(url, { waitUntil: 'networkidle' }) + : goToUrlAndWaitForViteWSConnect(page, url)); } } catch (e) { // jest doesn't exit if our setup has error here // https://github.com/facebook/jest/issues/2713 err = e; - console.error('beforeAll failed', e); + console.error(`beforeAll failed for ${testName}.`, e); // tests are still executed so close page to shorten try { await page.close(); @@ -175,7 +167,6 @@ afterAll(async () => { const logDir = path.join(testDir(), 'logs'); const logFile = path.join(logDir, 'browser.log'); try { - await fs.mkdir(logDir); await fs.writeFile(logFile, logs.join('\n')); } catch (e) { console.error(`failed to write browserlogs in ${logFile}`, e); @@ -189,58 +180,15 @@ afterAll(async () => { } }); -function startStaticServer(): Promise { - // check if the test project has base config - const configFile = path.resolve(tempDir, 'vite.config.js'); - let config: UserConfig; - try { - config = require(configFile); - // eslint-disable-next-line no-empty - } catch (e) {} - const base = (config?.base || '/') === '/' ? '' : config.base; - - // @ts-ignore - if (config && config.__test__) { - // @ts-ignore - config.__test__(); - } - - // start static file server - const serve = sirv(path.resolve(tempDir, 'dist')); - const httpServer = (server = http.createServer((req, res) => { - if (req.url === '/ping') { - res.statusCode = 200; - res.end('pong'); - } else { - serve(req, res); - } - })); - let port = 5000; - return new Promise((resolve, reject) => { - const onError = (e: any) => { - if (e.code === 'EADDRINUSE') { - httpServer.close(); - httpServer.listen(++port); - } else { - reject(e); - } - }; - httpServer.on('error', onError); - httpServer.listen(port, () => { - httpServer.removeListener('error', onError); - resolve(`http://localhost:${port}${base}`); - }); - }); -} - async function goToUrlAndWaitForViteWSConnect(page: Page, url: string) { let timerId; let pageConsoleListener; const timeoutMS = 10000; const timeoutPromise = new Promise( + // eslint-disable-next-line no-unused-vars (_, reject) => (timerId = setTimeout(() => { - reject(`timeout after ${timeoutMS}`); + reject(`page under test not ready after ${timeoutMS}ms. url: ${url}`); }, timeoutMS)) ); const connectedPromise = new Promise((resolve) => {