From 6c5eceeeb8cf5083a64ab4a03ceed890765ab941 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Nov 2022 15:18:35 +0000 Subject: [PATCH 01/97] chore(deps): update dependency @rollup/pluginutils to v5 (#11071) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/vite/package.json | 2 +- pnpm-lock.yaml | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index d55928f0f1ca3d..c14e377f4448fc 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -77,7 +77,7 @@ "@rollup/plugin-json": "^5.0.1", "@rollup/plugin-node-resolve": "15.0.1", "@rollup/plugin-typescript": "^9.0.2", - "@rollup/pluginutils": "^4.2.1", + "@rollup/pluginutils": "^5.0.2", "acorn": "^8.8.1", "cac": "^6.7.14", "chokidar": "^3.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37236d377d430b..1d9560b0b01af2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -223,7 +223,7 @@ importers: '@rollup/plugin-json': ^5.0.1 '@rollup/plugin-node-resolve': 15.0.1 '@rollup/plugin-typescript': ^9.0.2 - '@rollup/pluginutils': ^4.2.1 + '@rollup/pluginutils': ^5.0.2 acorn: ^8.8.1 cac: ^6.7.14 chokidar: ^3.5.3 @@ -290,7 +290,7 @@ importers: '@rollup/plugin-json': 5.0.1_rollup@3.3.0 '@rollup/plugin-node-resolve': 15.0.1_rollup@3.3.0 '@rollup/plugin-typescript': 9.0.2_rollup@3.3.0+tslib@2.4.1 - '@rollup/pluginutils': 4.2.1 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 acorn: 8.8.1 cac: 6.7.14 chokidar: 3.5.3 @@ -2311,7 +2311,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.0.3 @@ -2329,7 +2329,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 estree-walker: 2.0.2 fast-glob: 3.2.12 magic-string: 0.26.7 @@ -2345,7 +2345,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 rollup: 3.3.0 dev: true @@ -2358,7 +2358,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 '@types/resolve': 1.20.2 deepmerge: 4.2.2 is-builtin-module: 3.2.0 @@ -2394,7 +2394,7 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 resolve: 1.22.1 rollup: 3.3.0 tslib: 2.4.1 @@ -2413,7 +2413,7 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 resolve: 1.22.1 rollup: 3.3.0 tslib: 2.4.1 @@ -2428,8 +2428,8 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils/5.0.1_rollup@3.3.0: - resolution: {integrity: sha512-4HaCVEXXuObvcPUaUlLt4faHYHCeQOOWNj8NKFGaRSrw3ZLD0TWeAFZicV9vXjnE2nkNuaVTfTuwAnjR+6uc9A==} + /@rollup/pluginutils/5.0.2_rollup@3.3.0: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0 @@ -8091,6 +8091,7 @@ packages: /slash/4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + dev: true /slash/5.0.0: resolution: {integrity: sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==} @@ -8770,7 +8771,7 @@ packages: '@rollup/plugin-json': 5.0.1_rollup@3.3.0 '@rollup/plugin-node-resolve': 15.0.1_rollup@3.3.0 '@rollup/plugin-replace': 5.0.0_rollup@3.3.0 - '@rollup/pluginutils': 5.0.1_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.3.0 chalk: 5.1.2 consola: 2.15.3 defu: 6.1.0 From e5a2e80b8a0d4f6c5a32b12099622056ec98ebbb Mon Sep 17 00:00:00 2001 From: Ctibor Laky Date: Fri, 25 Nov 2022 16:41:05 +0100 Subject: [PATCH 02/97] docs: adds CLI section in guide (#11025) --- docs/.vitepress/config.ts | 4 ++ docs/guide/cli.md | 126 ++++++++++++++++++++++++++++++++++++++ docs/guide/index.md | 2 + 3 files changed, 132 insertions(+) create mode 100644 docs/guide/cli.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 678ca2790841d1..513378a37488b2 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -185,6 +185,10 @@ export default defineConfig({ text: 'Features', link: '/guide/features' }, + { + text: 'CLI', + link: '/guide/cli' + }, { text: 'Using Plugins', link: '/guide/using-plugins' diff --git a/docs/guide/cli.md b/docs/guide/cli.md new file mode 100644 index 00000000000000..3cf679211af8c2 --- /dev/null +++ b/docs/guide/cli.md @@ -0,0 +1,126 @@ +# Command Line Interface + +## Dev server + +### `vite` + +Start Vite dev server in the current directory. Will enter the watch mode in development environment and run mode in CI automatically. + +#### Usage + +```bash +vite [root] +``` + +#### Options + +| Options | | +| ------------------------ | ----------------------------------------------------------------- | +| `--host [host]` | Specify hostname (`string`) | +| `--port ` | Specify port (`number`) | +| `--https` | Use TLS + HTTP/2 (`boolean`) | +| `--open [path]` | Open browser on startup (`boolean \| string`) | +| `--cors` | Enable CORS (`boolean`) | +| `--strictPort` | Exit if specified port is already in use (`boolean`) | +| `--force` | Force the optimizer to ignore the cache and re-bundle (`boolean`) | +| `-c, --config ` | Use specified config file (`string`) | +| `--base ` | Public base path (default: `/`) (`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | Allow/disable clear screen when logging (`boolean`) | +| `-d, --debug [feat]` | Show debug logs (`string \| boolean`) | +| `-f, --filter ` | Filter debug logs (`string`) | +| `-m, --mode ` | Set env mode (`string`) | +| `-h, --help` | Display available CLI options | +| `-v, --version` | Display version number | + +## Build + +### `vite build` + +Build for production. + +#### Usage + +```bash +vite build [root] +``` + +#### Options + +| Options | | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | +| `--target ` | Transpile target (default: `"modules"`) (`string`) | +| `--outDir ` | Output directory (default: `dist`) (`string`) | +| `--assetsDir ` | Directory under outDir to place assets in (default: `"assets"`) (`string`) | +| `--assetsInlineLimit ` | Static asset base64 inline threshold in bytes (default: `4096`) (`number`) | +| `--ssr [entry]` | Build specified entry for server-side rendering (`string`) | +| `--sourcemap` | Output source maps for build (default: `false`) (`boolean`) | +| `--minify [minifier]` | Enable/disable minification, or specify minifier to use (default: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) | +| `--manifest [name]` | Emit build manifest json (`boolean \| string`) | +| `--ssrManifest [name]` | Emit ssr manifest json (`boolean \| string`) | +| `--force` | Force the optimizer to ignore the cache and re-bundle (experimental)(`boolean`) | +| `--emptyOutDir` | Force empty outDir when it's outside of root (`boolean`) | +| `-w, --watch` | Rebuilds when modules have changed on disk (`boolean`) | +| `-c, --config ` | Use specified config file (`string`) | +| `--base ` | Public base path (default: `/`) (`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | Allow/disable clear screen when logging (`boolean`) | +| `-d, --debug [feat]` | Show debug logs (`string \| boolean`) | +| `-f, --filter ` | Filter debug logs (`string`) | +| `-m, --mode ` | Set env mode (`string`) | +| `-h, --help` | Display available CLI options | + +## Others + +### `vite optimize` + +Pre-bundle dependencies. + +#### Usage + +```bash +vite optimize [root] +``` + +#### Options + +| Options | | +| ------------------------ | ----------------------------------------------------------------- | +| `--force` | Force the optimizer to ignore the cache and re-bundle (`boolean`) | +| `-c, --config ` | Use specified config file (`string`) | +| `--base ` | Public base path (default: `/`) (`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | Allow/disable clear screen when logging (`boolean`) | +| `-d, --debug [feat]` | Show debug logs (`string \| boolean`) | +| `-f, --filter ` | Filter debug logs (`string`) | +| `-m, --mode ` | Set env mode (`string`) | +| `-h, --help` | Display available CLI options | + +### `vite preview` + +Locally preview production build. + +#### Usage + +```bash +vite preview [root] +``` + +#### Options + +| Options | | +| ------------------------ | ---------------------------------------------------- | +| `--host [host]` | Specify hostname (`string`) | +| `--port ` | Specify port (`number`) | +| `--strictPort` | Exit if specified port is already in use (`boolean`) | +| `--https` | Use TLS + HTTP/2 (`boolean`) | +| `--open [path]` | Open browser on startup (`boolean \| string`) | +| `--outDir ` | Output directory (default: `dist`)(`string`) | +| `-c, --config ` | Use specified config file (`string`) | +| `--base ` | Public base path (default: `/`) (`string`) | +| `-l, --logLevel ` | Info \| warn \| error \| silent (`string`) | +| `--clearScreen` | Allow/disable clear screen when logging (`boolean`) | +| `-d, --debug [feat]` | Show debug logs (`string \| boolean`) | +| `-f, --filter ` | Filter debug logs (`string`) | +| `-m, --mode ` | Set env mode (`string`) | +| `-h, --help` | Display available CLI options | diff --git a/docs/guide/index.md b/docs/guide/index.md index e88dbbb045d823..c313dbaebfa29c 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -128,6 +128,8 @@ In a project where Vite is installed, you can use the `vite` binary in your npm You can specify additional CLI options like `--port` or `--https`. For a full list of CLI options, run `npx vite --help` in your project. +Learn more about the [Command Line Interface](./cli.md) + ## Using Unreleased Commits If you can't wait for a new release to test the latest features, you will need to clone the [vite repo](https://github.com/vitejs/vite) to your local machine and then build and link it yourself ([pnpm](https://pnpm.io/) is required): From 615c7689078564445089fdd0e277a11b9149a3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sat, 26 Nov 2022 00:45:22 +0900 Subject: [PATCH 03/97] test: reduce ssr-vue playground flakiness (#11076) --- playground/ssr-vue/__tests__/ssr-vue.spec.ts | 16 +++++++++++----- playground/ssr-vue/src/entry-client.js | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/playground/ssr-vue/__tests__/ssr-vue.spec.ts b/playground/ssr-vue/__tests__/ssr-vue.spec.ts index 3bcb2b3ff07dee..19f684e2ca48d0 100644 --- a/playground/ssr-vue/__tests__/ssr-vue.spec.ts +++ b/playground/ssr-vue/__tests__/ssr-vue.spec.ts @@ -9,6 +9,7 @@ import { getColor, isBuild, page, + untilBrowserLogAfter, untilUpdated, viteServer } from '~utils' @@ -26,7 +27,8 @@ test('vuex can be import succeed by named import', async () => { }) test('/about', async () => { - await page.goto(url + 'about') + await untilBrowserLogAfter(() => page.goto(url + 'about'), 'hydrated') + expect(await page.textContent('h1')).toMatch('About') // should not have hydration mismatch browserLogs.forEach((msg) => { @@ -54,7 +56,8 @@ test('/about', async () => { }) test('/external', async () => { - await page.goto(url + 'external') + await untilBrowserLogAfter(() => page.goto(url + 'external'), 'hydrated') + expect(await page.textContent('div')).toMatch( 'Example external component content' ) @@ -81,7 +84,8 @@ test('/external', async () => { }) test('/', async () => { - await page.goto(url) + await untilBrowserLogAfter(() => page.goto(url), 'hydrated') + expect(await page.textContent('h1')).toMatch('Home') // should not have hydration mismatch browserLogs.forEach((msg) => { @@ -155,7 +159,8 @@ test('nested virtual module', async () => { }) test('hydration', async () => { - await page.goto(url) + await untilBrowserLogAfter(() => page.goto(url), 'hydrated') + expect(await page.textContent('button')).toMatch('0') await page.click('button') expect(await page.textContent('button')).toMatch('1') @@ -175,7 +180,8 @@ test( ) test('client navigation', async () => { - await page.goto(url) + await untilBrowserLogAfter(() => page.goto(url), 'hydrated') + await untilUpdated(() => page.textContent('a[href="/test/about"]'), 'About') await page.click('a[href="/test/about"]') await untilUpdated(() => page.textContent('h1'), 'About') diff --git a/playground/ssr-vue/src/entry-client.js b/playground/ssr-vue/src/entry-client.js index 842acce7dc685b..a99b84f2f69a80 100644 --- a/playground/ssr-vue/src/entry-client.js +++ b/playground/ssr-vue/src/entry-client.js @@ -5,4 +5,6 @@ const { app, router } = createApp() // wait until router is ready before mounting to ensure hydration match router.isReady().then(() => { app.mount('#app') + + console.log('hydrated') }) From c45c984ce88b9f36a61761b4df849b7e8dd8e3ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sat, 26 Nov 2022 00:45:52 +0900 Subject: [PATCH 04/97] test: reduce ssr-react playground flakiness (#11077) --- .../ssr-react/__tests__/ssr-react.spec.ts | 20 ++++++++++++++----- playground/ssr-react/src/entry-client.jsx | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/playground/ssr-react/__tests__/ssr-react.spec.ts b/playground/ssr-react/__tests__/ssr-react.spec.ts index 321c80d67614b0..111a52aa5537ae 100644 --- a/playground/ssr-react/__tests__/ssr-react.spec.ts +++ b/playground/ssr-react/__tests__/ssr-react.spec.ts @@ -1,12 +1,19 @@ import fetch from 'node-fetch' import { expect, test } from 'vitest' import { port } from './serve' -import { browserLogs, editFile, page, untilUpdated } from '~utils' +import { + browserLogs, + editFile, + page, + untilBrowserLogAfter, + untilUpdated +} from '~utils' const url = `http://localhost:${port}` test('/env', async () => { - await page.goto(url + '/env') + await untilBrowserLogAfter(() => page.goto(url + '/env'), 'hydrated') + expect(await page.textContent('h1')).toMatch('default message here') // raw http request @@ -15,7 +22,8 @@ test('/env', async () => { }) test('/about', async () => { - await page.goto(url + '/about') + await untilBrowserLogAfter(() => page.goto(url + '/about'), 'hydrated') + expect(await page.textContent('h1')).toMatch('About') // should not have hydration mismatch browserLogs.forEach((msg) => { @@ -28,7 +36,8 @@ test('/about', async () => { }) test('/', async () => { - await page.goto(url) + await untilBrowserLogAfter(() => page.goto(url), 'hydrated') + expect(await page.textContent('h1')).toMatch('Home') // should not have hydration mismatch browserLogs.forEach((msg) => { @@ -49,7 +58,8 @@ test('hmr', async () => { }) test('client navigation', async () => { - await page.goto(url) + await untilBrowserLogAfter(() => page.goto(url), 'hydrated') + await untilUpdated(() => page.textContent('a[href="/about"]'), 'About') await page.click('a[href="/about"]') await untilUpdated(() => page.textContent('h1'), 'About') diff --git a/playground/ssr-react/src/entry-client.jsx b/playground/ssr-react/src/entry-client.jsx index d2caee5e04cf6f..703199443d9cca 100644 --- a/playground/ssr-react/src/entry-client.jsx +++ b/playground/ssr-react/src/entry-client.jsx @@ -8,3 +8,4 @@ ReactDOM.hydrateRoot( ) +console.log('hydrated') From 72f63c5b51904f0184adee41ece3f2d56b5a9409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sat, 26 Nov 2022 00:49:08 +0900 Subject: [PATCH 05/97] test: reduce hmr test flakiness (#11075) --- .../__tests__/backend-integration.spec.ts | 12 +- playground/hmr/__tests__/hmr.spec.ts | 242 +++++++++--------- playground/hmr/hmr.ts | 2 +- playground/react/__tests__/react.spec.ts | 49 ++-- playground/tailwind/__test__/tailwind.spec.ts | 86 +++---- playground/test-utils.ts | 21 +- 6 files changed, 220 insertions(+), 192 deletions(-) diff --git a/playground/backend-integration/__tests__/backend-integration.spec.ts b/playground/backend-integration/__tests__/backend-integration.spec.ts index d1611d8c8d088c..29b4b903c1d0ed 100644 --- a/playground/backend-integration/__tests__/backend-integration.spec.ts +++ b/playground/backend-integration/__tests__/backend-integration.spec.ts @@ -8,6 +8,7 @@ import { isServe, page, readManifest, + untilBrowserLogAfter, untilUpdated } from '~utils' @@ -71,12 +72,13 @@ describe.runIf(isServe)('serve', () => { test('CSS dependencies are tracked for HMR', async () => { const el = await page.$('h1') - browserLogs.length = 0 - - editFile('frontend/entrypoints/main.ts', (code) => - code.replace('text-black', 'text-[rgb(204,0,0)]') + await untilBrowserLogAfter( + () => + editFile('frontend/entrypoints/main.ts', (code) => + code.replace('text-black', 'text-[rgb(204,0,0)]') + ), + '[vite] css hot updated: /global.css' ) await untilUpdated(() => getColor(el), 'rgb(204, 0, 0)') - expect(browserLogs).toContain('[vite] css hot updated: /global.css') }) }) diff --git a/playground/hmr/__tests__/hmr.spec.ts b/playground/hmr/__tests__/hmr.spec.ts index 7cd70a3d8a4777..f1b2d96584a4a4 100644 --- a/playground/hmr/__tests__/hmr.spec.ts +++ b/playground/hmr/__tests__/hmr.spec.ts @@ -25,135 +25,148 @@ if (!isBuild) { test('self accept', async () => { const el = await page.$('.app') - browserLogs.length = 0 - editFile('hmr.ts', (code) => code.replace('const foo = 1', 'const foo = 2')) + await untilBrowserLogAfter( + () => + editFile('hmr.ts', (code) => + code.replace('const foo = 1', 'const foo = 2') + ), + [ + '>>> vite:beforeUpdate -- update', + 'foo was: 1', + '(self-accepting 1) foo is now: 2', + '(self-accepting 2) foo is now: 2', + '[vite] hot updated: /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true + ) await untilUpdated(() => el.textContent(), '2') - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - 'foo was: 1', - '(self-accepting 1) foo is now: 2', - '(self-accepting 2) foo is now: 2', - '[vite] hot updated: /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 - - editFile('hmr.ts', (code) => code.replace('const foo = 2', 'const foo = 3')) + await untilBrowserLogAfter( + () => + editFile('hmr.ts', (code) => + code.replace('const foo = 2', 'const foo = 3') + ), + [ + '>>> vite:beforeUpdate -- update', + 'foo was: 2', + '(self-accepting 1) foo is now: 3', + '(self-accepting 2) foo is now: 3', + '[vite] hot updated: /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true + ) await untilUpdated(() => el.textContent(), '3') - - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - 'foo was: 2', - '(self-accepting 1) foo is now: 3', - '(self-accepting 2) foo is now: 3', - '[vite] hot updated: /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 }) test('accept dep', async () => { const el = await page.$('.dep') - - editFile('hmrDep.js', (code) => - code.replace('const foo = 1', 'const foo = 2') + await untilBrowserLogAfter( + () => + editFile('hmrDep.js', (code) => + code.replace('const foo = 1', 'const foo = 2') + ), + [ + '>>> vite:beforeUpdate -- update', + '(dep) foo was: 1', + '(dep) foo from dispose: 1', + '(single dep) foo is now: 2', + '(single dep) nested foo is now: 1', + '(multi deps) foo is now: 2', + '(multi deps) nested foo is now: 1', + '[vite] hot updated: /hmrDep.js via /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true ) await untilUpdated(() => el.textContent(), '2') - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - '(dep) foo was: 1', - '(dep) foo from dispose: 1', - '(single dep) foo is now: 2', - '(single dep) nested foo is now: 1', - '(multi deps) foo is now: 2', - '(multi deps) nested foo is now: 1', - '[vite] hot updated: /hmrDep.js via /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 - - editFile('hmrDep.js', (code) => - code.replace('const foo = 2', 'const foo = 3') + await untilBrowserLogAfter( + () => + editFile('hmrDep.js', (code) => + code.replace('const foo = 2', 'const foo = 3') + ), + [ + '>>> vite:beforeUpdate -- update', + '(dep) foo was: 2', + '(dep) foo from dispose: 2', + '(single dep) foo is now: 3', + '(single dep) nested foo is now: 1', + '(multi deps) foo is now: 3', + '(multi deps) nested foo is now: 1', + '[vite] hot updated: /hmrDep.js via /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true ) await untilUpdated(() => el.textContent(), '3') - - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - '(dep) foo was: 2', - '(dep) foo from dispose: 2', - '(single dep) foo is now: 3', - '(single dep) nested foo is now: 1', - '(multi deps) foo is now: 3', - '(multi deps) nested foo is now: 1', - '[vite] hot updated: /hmrDep.js via /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 }) test('nested dep propagation', async () => { const el = await page.$('.nested') - browserLogs.length = 0 - - editFile('hmrNestedDep.js', (code) => - code.replace('const foo = 1', 'const foo = 2') + await untilBrowserLogAfter( + () => + editFile('hmrNestedDep.js', (code) => + code.replace('const foo = 1', 'const foo = 2') + ), + [ + '>>> vite:beforeUpdate -- update', + '(dep) foo was: 3', + '(dep) foo from dispose: 3', + '(single dep) foo is now: 3', + '(single dep) nested foo is now: 2', + '(multi deps) foo is now: 3', + '(multi deps) nested foo is now: 2', + '[vite] hot updated: /hmrDep.js via /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true ) await untilUpdated(() => el.textContent(), '2') - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - '(dep) foo was: 3', - '(dep) foo from dispose: 3', - '(single dep) foo is now: 3', - '(single dep) nested foo is now: 2', - '(multi deps) foo is now: 3', - '(multi deps) nested foo is now: 2', - '[vite] hot updated: /hmrDep.js via /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 - - editFile('hmrNestedDep.js', (code) => - code.replace('const foo = 2', 'const foo = 3') + await untilBrowserLogAfter( + () => + editFile('hmrNestedDep.js', (code) => + code.replace('const foo = 2', 'const foo = 3') + ), + [ + '>>> vite:beforeUpdate -- update', + '(dep) foo was: 3', + '(dep) foo from dispose: 3', + '(single dep) foo is now: 3', + '(single dep) nested foo is now: 3', + '(multi deps) foo is now: 3', + '(multi deps) nested foo is now: 3', + '[vite] hot updated: /hmrDep.js via /hmr.ts', + '>>> vite:afterUpdate -- update' + ], + true ) await untilUpdated(() => el.textContent(), '3') - - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - '(dep) foo was: 3', - '(dep) foo from dispose: 3', - '(single dep) foo is now: 3', - '(single dep) nested foo is now: 3', - '(multi deps) foo is now: 3', - '(multi deps) nested foo is now: 3', - '[vite] hot updated: /hmrDep.js via /hmr.ts', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 }) test('invalidate', async () => { - browserLogs.length = 0 const el = await page.$('.invalidation') - - editFile('invalidation/child.js', (code) => - code.replace('child', 'child updated') + await untilBrowserLogAfter( + () => + editFile('invalidation/child.js', (code) => + code.replace('child', 'child updated') + ), + [ + '>>> vite:beforeUpdate -- update', + '>>> vite:invalidate -- /invalidation/child.js', + '[vite] invalidate /invalidation/child.js', + '[vite] hot updated: /invalidation/child.js', + '>>> vite:afterUpdate -- update', + '>>> vite:beforeUpdate -- update', + '(invalidation) parent is executing', + '[vite] hot updated: /invalidation/parent.js', + '>>> vite:afterUpdate -- update' + ], + true ) await untilUpdated(() => el.textContent(), 'child updated') - expect(browserLogs).toMatchObject([ - '>>> vite:beforeUpdate -- update', - '>>> vite:invalidate -- /invalidation/child.js', - '[vite] invalidate /invalidation/child.js', - '[vite] hot updated: /invalidation/child.js', - '>>> vite:afterUpdate -- update', - '>>> vite:beforeUpdate -- update', - '(invalidation) parent is executing', - '[vite] hot updated: /invalidation/parent.js', - '>>> vite:afterUpdate -- update' - ]) - browserLogs.length = 0 }) test('plugin hmr handler + custom event', async () => { @@ -688,19 +701,16 @@ if (!isBuild) { await page.goto(viteTestUrl + '/missing-import/index.html') - browserLogs.length = 0 - expect(browserLogs).toMatchObject([]) - - editFile(file, (code) => code.replace(importCode, unImportCode)) - - await page.waitForNavigation({ timeout }) - expect(browserLogs.some((msg) => msg.match('missing test'))).toBe(true) - browserLogs.length = 0 - - editFile(file, (code) => code.replace(unImportCode, importCode)) - - await page.waitForNavigation({ timeout }) - expect(browserLogs.some((msg) => msg.includes('500'))).toBe(true) - browserLogs.length = 0 + await untilBrowserLogAfter(async () => { + const navigationPromise = page.waitForNavigation({ timeout }) + editFile(file, (code) => code.replace(importCode, unImportCode)) + await navigationPromise + }, 'missing test') + + await untilBrowserLogAfter(async () => { + const navigationPromise = page.waitForNavigation({ timeout }) + editFile(file, (code) => code.replace(unImportCode, importCode)) + await navigationPromise + }, /500/) }) } diff --git a/playground/hmr/hmr.ts b/playground/hmr/hmr.ts index dcfa7692272187..c0c85035a7b728 100644 --- a/playground/hmr/hmr.ts +++ b/playground/hmr/hmr.ts @@ -96,7 +96,7 @@ if (import.meta.hot) { }) import.meta.hot.on('vite:error', (event) => { - console.log(`>>> vite:error -- ${event.type}`) + console.log(`>>> vite:error -- ${event.err.message}`) }) import.meta.hot.on('vite:invalidate', ({ path }) => { diff --git a/playground/react/__tests__/react.spec.ts b/playground/react/__tests__/react.spec.ts index 6cd9db4f6d8440..26eb59b5d79b7e 100644 --- a/playground/react/__tests__/react.spec.ts +++ b/playground/react/__tests__/react.spec.ts @@ -1,10 +1,10 @@ import { expect, test } from 'vitest' import { - browserLogs, editFile, isBuild, isServe, page, + untilBrowserLogAfter, untilUpdated } from '~utils' @@ -48,23 +48,24 @@ test.runIf(isServe)( if (!isBuild) { // #9869 test('should only hmr files with exported react components', async () => { - browserLogs.length = 0 - editFile('hmr/no-exported-comp.jsx', (code) => - code.replace('An Object', 'Updated') + await untilBrowserLogAfter( + () => + editFile('hmr/no-exported-comp.jsx', (code) => + code.replace('An Object', 'Updated') + ), + [ + '[vite] invalidate /hmr/no-exported-comp.jsx', + '[vite] hot updated: /hmr/no-exported-comp.jsx', + '[vite] hot updated: /hmr/parent.jsx', + 'Parent rendered' + ], + true ) await untilUpdated(() => page.textContent('#parent'), 'Updated') - expect(browserLogs).toMatchObject([ - '[vite] invalidate /hmr/no-exported-comp.jsx', - '[vite] hot updated: /hmr/no-exported-comp.jsx', - '[vite] hot updated: /hmr/parent.jsx', - 'Parent rendered' - ]) - browserLogs.length = 0 }) // #3301 test('should hmr react context', async () => { - browserLogs.length = 0 expect(await page.textContent('#context-button')).toMatch( 'context-based count is: 0' ) @@ -72,20 +73,24 @@ if (!isBuild) { expect(await page.textContent('#context-button')).toMatch( 'context-based count is: 1' ) - editFile('context/CountProvider.jsx', (code) => - code.replace('context provider', 'context provider updated') + + await untilBrowserLogAfter( + () => + editFile('context/CountProvider.jsx', (code) => + code.replace('context provider', 'context provider updated') + ), + [ + '[vite] invalidate /context/CountProvider.jsx', + '[vite] hot updated: /context/CountProvider.jsx', + '[vite] hot updated: /App.jsx', + '[vite] hot updated: /context/ContextButton.jsx', + 'Parent rendered' + ], + true ) await untilUpdated( () => page.textContent('#context-provider'), 'context provider updated' ) - expect(browserLogs).toMatchObject([ - '[vite] invalidate /context/CountProvider.jsx', - '[vite] hot updated: /context/CountProvider.jsx', - '[vite] hot updated: /App.jsx', - '[vite] hot updated: /context/ContextButton.jsx', - 'Parent rendered' - ]) - browserLogs.length = 0 }) } diff --git a/playground/tailwind/__test__/tailwind.spec.ts b/playground/tailwind/__test__/tailwind.spec.ts index 444110de59bd37..64261d630b09d9 100644 --- a/playground/tailwind/__test__/tailwind.spec.ts +++ b/playground/tailwind/__test__/tailwind.spec.ts @@ -1,11 +1,11 @@ import { expect, test } from 'vitest' import { - browserLogs, editFile, getBgColor, getColor, isBuild, page, + untilBrowserLogAfter, untilUpdated } from '~utils' @@ -15,75 +15,69 @@ test('should render', async () => { if (!isBuild) { test('regenerate CSS and HMR (glob pattern)', async () => { - browserLogs.length = 0 const el = await page.$('#pagetitle') const el2 = await page.$('#helloroot') - expect(await getColor(el)).toBe('rgb(11, 22, 33)') - editFile('src/views/Page.vue', (code) => - code.replace('|Page title|', '|Page title updated|') + await untilBrowserLogAfter( + () => + editFile('src/views/Page.vue', (code) => + code.replace('|Page title|', '|Page title updated|') + ), + [ + '[vite] css hot updated: /index.css', + '[vite] hot updated: /src/views/Page.vue' + ], + true ) await untilUpdated(() => el.textContent(), '|Page title updated|') - expect(browserLogs).toMatchObject([ - '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/views/Page.vue' - ]) - - browserLogs.length = 0 - - editFile('src/components/HelloWorld.vue', (code) => - code.replace('text-gray-800', 'text-[rgb(10,20,30)]') + await untilBrowserLogAfter( + () => + editFile('src/components/HelloWorld.vue', (code) => + code.replace('text-gray-800', 'text-[rgb(10,20,30)]') + ), + [ + '[vite] css hot updated: /index.css', + '[vite] hot updated: /src/components/HelloWorld.vue' + ], + true ) - await untilUpdated(() => getColor(el2), 'rgb(10, 20, 30)') - - expect(browserLogs).toMatchObject([ - '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/components/HelloWorld.vue' - ]) - - browserLogs.length = 0 }) test('regenerate CSS and HMR (relative path)', async () => { - browserLogs.length = 0 const el = await page.$('h1') - expect(await getColor(el)).toBe('black') - editFile('src/App.vue', (code) => - code.replace('text-black', 'text-[rgb(11,22,33)]') + await untilBrowserLogAfter( + () => + editFile('src/App.vue', (code) => + code.replace('text-black', 'text-[rgb(11,22,33)]') + ), + [ + '[vite] css hot updated: /index.css', + '[vite] hot updated: /src/App.vue' + ], + true ) - await untilUpdated(() => getColor(el), 'rgb(11, 22, 33)') - - expect(browserLogs).toMatchObject([ - '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/App.vue' - ]) - - browserLogs.length = 0 }) test('regenerate CSS and HMR (pug template)', async () => { - browserLogs.length = 0 const el = await page.$('.pug') - expect(await getBgColor(el)).toBe('rgb(248, 113, 113)') - editFile('src/components/PugTemplate.vue', (code) => - code.replace('bg-red-400', 'bg-red-600') + await untilBrowserLogAfter( + () => + editFile('src/components/PugTemplate.vue', (code) => + code.replace('bg-red-400', 'bg-red-600') + ), + [ + '[vite] css hot updated: /index.css', + '[vite] hot updated: /src/components/PugTemplate.vue?vue&type=template&lang.js' + ] ) - await untilUpdated(() => getBgColor(el), 'rgb(220, 38, 38)') - - expect(browserLogs).toContain('[vite] css hot updated: /index.css') - expect(browserLogs).toContain( - '[vite] hot updated: /src/components/PugTemplate.vue?vue&type=template&lang.js' - ) - - browserLogs.length = 0 }) } diff --git a/playground/test-utils.ts b/playground/test-utils.ts index c27e8ffe8285df..6ebbb46ccd3e7e 100644 --- a/playground/test-utils.ts +++ b/playground/test-utils.ts @@ -187,12 +187,29 @@ export async function withRetry( await func() } +type UntilBrowserLogAfterCallback = (logs: string[]) => PromiseLike | void + +export async function untilBrowserLogAfter( + operation: () => any, + target: string | RegExp | Array, + expectOrder?: boolean, + callback?: UntilBrowserLogAfterCallback +): Promise export async function untilBrowserLogAfter( operation: () => any, target: string | RegExp | Array, - callback?: (logs: string[]) => PromiseLike | void + callback?: UntilBrowserLogAfterCallback +): Promise +export async function untilBrowserLogAfter( + operation: () => any, + target: string | RegExp | Array, + arg3?: boolean | UntilBrowserLogAfterCallback, + arg4?: UntilBrowserLogAfterCallback ): Promise { - const promise = untilBrowserLog(target, false) + const expectOrder = typeof arg3 === 'boolean' ? arg3 : false + const callback = typeof arg3 === 'boolean' ? arg4 : arg3 + + const promise = untilBrowserLog(target, expectOrder) await operation() const logs = await promise if (callback) { From 9d0b9d834bd4fe0b16d18eeb7af10742c278673b Mon Sep 17 00:00:00 2001 From: sun0day Date: Fri, 25 Nov 2022 23:53:50 +0800 Subject: [PATCH 06/97] fix(plugin-vue): invalidate script module cache when it changed in hot update (#11059) --- packages/plugin-vue/src/handleHotUpdate.ts | 5 +++-- playground/vue/HmrTsx.vue | 17 +++++++++++++++++ playground/vue/Main.vue | 4 ++++ playground/vue/__tests__/vue.spec.ts | 8 ++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 playground/vue/HmrTsx.vue diff --git a/packages/plugin-vue/src/handleHotUpdate.ts b/packages/plugin-vue/src/handleHotUpdate.ts index 5569f0dfbe02ae..d1dde364eb7f10 100644 --- a/packages/plugin-vue/src/handleHotUpdate.ts +++ b/packages/plugin-vue/src/handleHotUpdate.ts @@ -45,7 +45,8 @@ export async function handleHotUpdate( })[0] const templateModule = modules.find((m) => /type=template/.test(m.url)) - if (hasScriptChanged(prevDescriptor, descriptor)) { + const scriptChanged = hasScriptChanged(prevDescriptor, descriptor) + if (scriptChanged) { let scriptModule: ModuleNode | undefined if ( (descriptor.scriptSetup?.lang && !descriptor.scriptSetup.src) || @@ -66,7 +67,7 @@ export async function handleHotUpdate( // binding metadata. However, when reloading the template alone the binding // metadata will not be available since the script part isn't loaded. // in this case, reuse the compiled script from previous descriptor. - if (mainModule && !affectedModules.has(mainModule)) { + if (!scriptChanged) { setResolvedScript( descriptor, getResolvedScript(prevDescriptor, false)!, diff --git a/playground/vue/HmrTsx.vue b/playground/vue/HmrTsx.vue new file mode 100644 index 00000000000000..c1a2331da6a6be --- /dev/null +++ b/playground/vue/HmrTsx.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/playground/vue/Main.vue b/playground/vue/Main.vue index 521bbbff08a3ce..b91d50f9287a31 100644 --- a/playground/vue/Main.vue +++ b/playground/vue/Main.vue @@ -5,6 +5,9 @@
+
+ +
@@ -27,6 +30,7 @@ diff --git a/playground/ssr-vue/src/assets/button.css b/playground/ssr-vue/src/assets/button.css deleted file mode 100644 index 8e1ebc58c0891f..00000000000000 --- a/playground/ssr-vue/src/assets/button.css +++ /dev/null @@ -1,15 +0,0 @@ -.btn { - background-color: #65b587; - border-radius: 8px; - border-style: none; - box-sizing: border-box; - cursor: pointer; - display: inline-block; - font-size: 14px; - font-weight: 500; - height: 40px; - line-height: 20px; - list-style: none; - outline: none; - padding: 10px 16px; -} diff --git a/playground/ssr-vue/src/assets/fonts/Inter-Italic.woff b/playground/ssr-vue/src/assets/fonts/Inter-Italic.woff deleted file mode 100644 index e7da6663fe5e471d7e102099deb33ac6328f3e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143476 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%0A|!KM#T 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
BG1BMm;7kTaw2Bzh?{}Q(Izl1$62m^){4;&`G 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

)Rtkd4h-?W^PY_|2Cglu31zC|(I%iT1c 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 BCN}^8 diff --git a/playground/ssr-vue/src/assets/fonts/Inter-Italic.woff2 b/playground/ssr-vue/src/assets/fonts/Inter-Italic.woff2 deleted file mode 100644 index 8559dfde38986e6959897151f8b6f01127f2d0a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108172 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

- } -}) diff --git a/playground/ssr-vue/src/components/ImportType.vue b/playground/ssr-vue/src/components/ImportType.vue deleted file mode 100644 index 144d36bc34e7ec..00000000000000 --- a/playground/ssr-vue/src/components/ImportType.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/playground/ssr-vue/src/components/button.js b/playground/ssr-vue/src/components/button.js deleted file mode 100644 index 3b39f53fd96c47..00000000000000 --- a/playground/ssr-vue/src/components/button.js +++ /dev/null @@ -1,16 +0,0 @@ -import { createVNode, defineComponent } from 'vue' -import '../assets/button.css' - -export default defineComponent({ - setup() { - return () => { - return createVNode( - 'div', - { - class: 'btn' - }, - 'dynamicBtn' - ) - } - } -}) diff --git a/playground/ssr-vue/src/components/foo.css b/playground/ssr-vue/src/components/foo.css deleted file mode 100644 index f8baa0d15b90d3..00000000000000 --- a/playground/ssr-vue/src/components/foo.css +++ /dev/null @@ -1,3 +0,0 @@ -.jsx { - color: blue; -} diff --git a/playground/ssr-vue/src/entry-client.js b/playground/ssr-vue/src/entry-client.js deleted file mode 100644 index a99b84f2f69a80..00000000000000 --- a/playground/ssr-vue/src/entry-client.js +++ /dev/null @@ -1,10 +0,0 @@ -import { createApp } from './main' - -const { app, router } = createApp() - -// wait until router is ready before mounting to ensure hydration match -router.isReady().then(() => { - app.mount('#app') - - console.log('hydrated') -}) diff --git a/playground/ssr-vue/src/entry-server.js b/playground/ssr-vue/src/entry-server.js deleted file mode 100644 index e44c9abd3eb114..00000000000000 --- a/playground/ssr-vue/src/entry-server.js +++ /dev/null @@ -1,69 +0,0 @@ -import { basename } from 'node:path' -import { renderToString } from 'vue/server-renderer' -import { createApp } from './main' - -export async function render(url, manifest) { - const { app, router } = createApp() - - // set the router to the desired URL before rendering - await router.push(url) - await router.isReady() - - // passing SSR context object which will be available via useSSRContext() - // @vitejs/plugin-vue injects code into a component's setup() that registers - // itself on ctx.modules. After the render, ctx.modules would contain all the - // components that have been instantiated during this render call. - const ctx = {} - const html = await renderToString(app, ctx) - - // the SSR manifest generated by Vite contains module -> chunk/asset mapping - // which we can then use to determine what files need to be preloaded for this - // request. - const preloadLinks = renderPreloadLinks(ctx.modules, manifest) - return [html, preloadLinks] -} - -function renderPreloadLinks(modules, manifest) { - let links = '' - const seen = new Set() - modules.forEach((id) => { - const files = manifest[id] - if (files) { - files.forEach((file) => { - if (!seen.has(file)) { - seen.add(file) - const filename = basename(file) - if (manifest[filename]) { - for (const depFile of manifest[filename]) { - links += renderPreloadLink(depFile) - seen.add(depFile) - } - } - links += renderPreloadLink(file) - } - }) - } - }) - return links -} - -function renderPreloadLink(file) { - if (file.endsWith('.js')) { - return `` - } else if (file.endsWith('.css')) { - return `` - } else if (file.endsWith('.woff')) { - return ` ` - } else if (file.endsWith('.woff2')) { - return ` ` - } else if (file.endsWith('.gif')) { - return ` ` - } else if (file.endsWith('.jpg') || file.endsWith('.jpeg')) { - return ` ` - } else if (file.endsWith('.png')) { - return ` ` - } else { - // TODO - return '' - } -} diff --git a/playground/ssr-vue/src/main.js b/playground/ssr-vue/src/main.js deleted file mode 100644 index d2dd1e002147fe..00000000000000 --- a/playground/ssr-vue/src/main.js +++ /dev/null @@ -1,16 +0,0 @@ -import { createPinia } from 'pinia' -import { createSSRApp } from 'vue' -import App from './App.vue' -import { createRouter } from './router' - -// SSR requires a fresh app instance per request, therefore we export a function -// that creates a fresh app instance. If using Vuex, we'd also be creating a -// fresh store here. -export function createApp() { - const app = createSSRApp(App) - const pinia = createPinia() - app.use(pinia) - const router = createRouter() - app.use(router) - return { app, router } -} diff --git a/playground/ssr-vue/src/pages/About.vue b/playground/ssr-vue/src/pages/About.vue deleted file mode 100644 index ea6510808fd943..00000000000000 --- a/playground/ssr-vue/src/pages/About.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - diff --git a/playground/ssr-vue/src/pages/External.vue b/playground/ssr-vue/src/pages/External.vue deleted file mode 100644 index ffdcd03b85be84..00000000000000 --- a/playground/ssr-vue/src/pages/External.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/playground/ssr-vue/src/pages/Home.vue b/playground/ssr-vue/src/pages/Home.vue deleted file mode 100644 index 7f595e7437e600..00000000000000 --- a/playground/ssr-vue/src/pages/Home.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/playground/ssr-vue/src/pages/Store.vue b/playground/ssr-vue/src/pages/Store.vue deleted file mode 100644 index 60a19217e55645..00000000000000 --- a/playground/ssr-vue/src/pages/Store.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/playground/ssr-vue/src/router.js b/playground/ssr-vue/src/router.js deleted file mode 100644 index 814098102d7899..00000000000000 --- a/playground/ssr-vue/src/router.js +++ /dev/null @@ -1,28 +0,0 @@ -import { - createRouter as _createRouter, - createMemoryHistory, - createWebHistory -} from 'vue-router' - -// Auto generates routes from vue files under ./pages -// https://vitejs.dev/guide/features.html#glob-import -const pages = import.meta.glob('./pages/*.vue') - -const routes = Object.keys(pages).map((path) => { - const name = path.match(/\.\/pages(.*)\.vue$/)[1].toLowerCase() - return { - path: name === '/home' ? '/' : name, - component: pages[path] // () => import('./pages/*.vue') - } -}) - -export function createRouter() { - return _createRouter({ - // use appropriate history implementation for server/client - // import.meta.env.SSR is injected by Vite. - history: import.meta.env.SSR - ? createMemoryHistory('/test/') - : createWebHistory('/test/'), - routes - }) -} diff --git a/playground/ssr-vue/vite.config.js b/playground/ssr-vue/vite.config.js deleted file mode 100644 index c8be7320c8a9b0..00000000000000 --- a/playground/ssr-vue/vite.config.js +++ /dev/null @@ -1,126 +0,0 @@ -import path from 'node:path' -import { defineConfig } from 'vite' -import vuePlugin from '@vitejs/plugin-vue' -import vueJsx from '@vitejs/plugin-vue-jsx' - -const virtualFile = '@virtual-file' -const virtualId = '\0' + virtualFile -const nestedVirtualFile = '@nested-virtual-file' -const nestedVirtualId = '\0' + nestedVirtualFile - -const base = '/test/' - -// preserve this to test loading __filename & __dirname in ESM as Vite polyfills them. -// if Vite incorrectly load this file, node.js would error out. -globalThis.__vite_test_filename = __filename -globalThis.__vite_test_dirname = __dirname - -export default defineConfig(({ command, ssrBuild }) => ({ - base, - plugins: [ - vuePlugin(), - vueJsx(), - { - name: 'virtual', - resolveId(id) { - if (id === '@foo') { - return id - } - }, - load(id, options) { - const ssrFromOptions = options?.ssr ?? false - if (id === '@foo') { - // Force a mismatch error if ssrBuild is different from ssrFromOptions - return `export default { msg: '${ - command === 'build' && !!ssrBuild !== ssrFromOptions - ? `defineConfig ssrBuild !== ssr from load options` - : 'hi' - }' }` - } - } - }, - { - name: 'virtual-module', - resolveId(id) { - if (id === virtualFile) { - return virtualId - } else if (id === nestedVirtualFile) { - return nestedVirtualId - } - }, - load(id) { - if (id === virtualId) { - return `export { msg } from "@nested-virtual-file";` - } else if (id === nestedVirtualId) { - return `export const msg = "[success] from conventional virtual file"` - } - } - }, - // Example of a plugin that injects a helper from a virtual module that can - // be used in renderBuiltUrl - (function () { - const queryRE = /\?.*$/s - const hashRE = /#.*$/s - const cleanUrl = (url) => url.replace(hashRE, '').replace(queryRE, '') - let config - - const virtualId = '\0virtual:ssr-vue-built-url' - return { - name: 'built-url', - enforce: 'post', - configResolved(_config) { - config = _config - }, - resolveId(id) { - if (id === virtualId) { - return id - } - }, - load(id) { - if (id === virtualId) { - return { - code: `export const __ssr_vue_processAssetPath = (url) => '${base}' + url`, - moduleSideEffects: 'no-treeshake' - } - } - }, - transform(code, id) { - const cleanId = cleanUrl(id) - if ( - config.build.ssr && - (cleanId.endsWith('.js') || cleanId.endsWith('.vue')) && - !code.includes('__ssr_vue_processAssetPath') - ) { - return { - code: - `import { __ssr_vue_processAssetPath } from '${virtualId}';__ssr_vue_processAssetPath;` + - code, - sourcemap: null // no sourcemap support to speed up CI - } - } - } - } - })() - ], - experimental: { - renderBuiltUrl(filename, { hostType, type, ssr }) { - if (ssr && type === 'asset' && hostType === 'js') { - return { - runtime: `__ssr_vue_processAssetPath(${JSON.stringify(filename)})` - } - } - } - }, - build: { - minify: false - }, - ssr: { - noExternal: [ - // this package has uncompiled .vue files - 'example-external-component' - ] - }, - optimizeDeps: { - exclude: ['example-external-component'] - } -})) diff --git a/playground/ssr-vue/vite.config.noexternal.js b/playground/ssr-vue/vite.config.noexternal.js deleted file mode 100644 index 48a740c16cb1bf..00000000000000 --- a/playground/ssr-vue/vite.config.noexternal.js +++ /dev/null @@ -1,25 +0,0 @@ -import config from './vite.config.js' -/** - * @type {import('vite').UserConfig} - */ -export default Object.assign(config, { - ssr: { - noExternal: /./ - }, - resolve: { - // necessary because vue.ssrUtils is only exported on cjs modules - alias: [ - { - find: '@vue/runtime-dom', - replacement: '@vue/runtime-dom/dist/runtime-dom.cjs.js' - }, - { - find: '@vue/runtime-core', - replacement: '@vue/runtime-core/dist/runtime-core.cjs.js' - } - ] - }, - optimizeDeps: { - exclude: ['example-external-component'] - } -}) diff --git a/playground/tailwind/package.json b/playground/tailwind/package.json index ec823d2016ef3b..124eb2ccf0fb42 100644 --- a/playground/tailwind/package.json +++ b/playground/tailwind/package.json @@ -15,7 +15,7 @@ "vue-router": "^4.1.6" }, "devDependencies": { - "@vitejs/plugin-vue": "workspace:*", + "@vitejs/plugin-vue": "^4.0.0-alpha.0", "ts-node": "^10.9.1" } } diff --git a/playground/test-utils.ts b/playground/test-utils.ts index a1bb4ad31dc30d..80e04bffb8bd02 100644 --- a/playground/test-utils.ts +++ b/playground/test-utils.ts @@ -26,8 +26,6 @@ export const ports = { 'ssr-html': 9601, 'ssr-noexternal': 9602, 'ssr-pug': 9603, - 'ssr-react': 9604, - 'ssr-vue': 9605, 'ssr-webworker': 9606, 'css/postcss-caching': 5005, 'css/postcss-plugins-different-dir': 5006, @@ -38,9 +36,7 @@ export const hmrPorts = { 'ssr-deps': 24681, 'ssr-html': 24682, 'ssr-noexternal': 24683, - 'ssr-pug': 24684, - 'ssr-react': 24685, - 'ssr-vue': 24686 + 'ssr-pug': 24684 } const hexToNameMap: Record = {} diff --git a/playground/vue-jsx/Comp.tsx b/playground/vue-jsx/Comp.tsx deleted file mode 100644 index fe8add4d428a2c..00000000000000 --- a/playground/vue-jsx/Comp.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { defineComponent, ref } from 'vue' - -const Default = defineComponent(() => { - const count = ref(3) - const inc = () => count.value++ - - return () => ( - - ) -}) - -export default Default diff --git a/playground/vue-jsx/Comps.jsx b/playground/vue-jsx/Comps.jsx deleted file mode 100644 index e5cc405a77581b..00000000000000 --- a/playground/vue-jsx/Comps.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { defineComponent, ref } from 'vue' - -export const Named = defineComponent(() => { - const count = ref(0) - const inc = () => count.value++ - - return () => ( - - ) -}) - -const NamedSpec = defineComponent(() => { - const count = ref(1) - const inc = () => count.value++ - - return () => ( - - ) -}) -export { NamedSpec } - -export default defineComponent(() => { - const count = ref(2) - const inc = () => count.value++ - - return () => ( - - ) -}) diff --git a/playground/vue-jsx/OtherExt.tesx b/playground/vue-jsx/OtherExt.tesx deleted file mode 100644 index 7ae585a014c566..00000000000000 --- a/playground/vue-jsx/OtherExt.tesx +++ /dev/null @@ -1,9 +0,0 @@ -import { defineComponent } from 'vue' - -const Default = defineComponent(() => { - return () => ( -

Other Ext

- ) -}) - -export default Default diff --git a/playground/vue-jsx/Query.jsx b/playground/vue-jsx/Query.jsx deleted file mode 100644 index 60de93eafb7b1c..00000000000000 --- a/playground/vue-jsx/Query.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import { defineComponent, ref } from 'vue' - -export default defineComponent(() => { - const count = ref(6) - const inc = () => count.value++ - - return () => ( - - ) -}) diff --git a/playground/vue-jsx/Script.vue b/playground/vue-jsx/Script.vue deleted file mode 100644 index 2689ed2dfe6ffb..00000000000000 --- a/playground/vue-jsx/Script.vue +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/playground/vue-jsx/SrcImport.jsx b/playground/vue-jsx/SrcImport.jsx deleted file mode 100644 index dc775be205af73..00000000000000 --- a/playground/vue-jsx/SrcImport.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import { defineComponent, ref } from 'vue' - -export default defineComponent(() => { - const count = ref(5) - const inc = () => count.value++ - - return () => ( - - ) -}) diff --git a/playground/vue-jsx/SrcImport.vue b/playground/vue-jsx/SrcImport.vue deleted file mode 100644 index 89f6fb3eb77e2b..00000000000000 --- a/playground/vue-jsx/SrcImport.vue +++ /dev/null @@ -1 +0,0 @@ - diff --git a/playground/vue-jsx/TsImport.vue b/playground/vue-jsx/TsImport.vue deleted file mode 100644 index c63923d51947fa..00000000000000 --- a/playground/vue-jsx/TsImport.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/playground/vue-jsx/TsImportFile.ts b/playground/vue-jsx/TsImportFile.ts deleted file mode 100644 index 62761d5733b432..00000000000000 --- a/playground/vue-jsx/TsImportFile.ts +++ /dev/null @@ -1 +0,0 @@ -export const foo = 'success' diff --git a/playground/vue-jsx/__tests__/vue-jsx.spec.ts b/playground/vue-jsx/__tests__/vue-jsx.spec.ts deleted file mode 100644 index 7518f4bddd7c71..00000000000000 --- a/playground/vue-jsx/__tests__/vue-jsx.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { describe, expect, test } from 'vitest' -import { editFile, isServe, page, untilUpdated } from '~utils' - -test('should render', async () => { - expect(await page.textContent('.named')).toMatch('0') - expect(await page.textContent('.named-specifier')).toMatch('1') - expect(await page.textContent('.default')).toMatch('2') - expect(await page.textContent('.default-tsx')).toMatch('3') - expect(await page.textContent('.script')).toMatch('4') - expect(await page.textContent('.src-import')).toMatch('5') - expect(await page.textContent('.jsx-with-query')).toMatch('6') - expect(await page.textContent('.other-ext')).toMatch('Other Ext') - expect(await page.textContent('.ts-import')).toMatch('success') -}) - -test('should update', async () => { - await page.click('.named') - expect(await page.textContent('.named')).toMatch('1') - await page.click('.named-specifier') - expect(await page.textContent('.named-specifier')).toMatch('2') - await page.click('.default') - expect(await page.textContent('.default')).toMatch('3') - await page.click('.default-tsx') - expect(await page.textContent('.default-tsx')).toMatch('4') - await page.click('.script') - expect(await page.textContent('.script')).toMatch('5') - await page.click('.src-import') - expect(await page.textContent('.src-import')).toMatch('6') - await page.click('.jsx-with-query') - expect(await page.textContent('.jsx-with-query')).toMatch('7') -}) - -describe.runIf(isServe)('vue-jsx server', () => { - test('hmr: named export', async () => { - editFile('Comps.jsx', (code) => - code.replace('named {count', 'named updated {count') - ) - await untilUpdated(() => page.textContent('.named'), 'named updated 0') - - // affect all components in same file - expect(await page.textContent('.named-specifier')).toMatch('1') - expect(await page.textContent('.default')).toMatch('2') - // should not affect other components from different file - expect(await page.textContent('.default-tsx')).toMatch('4') - }) - - test('hmr: named export via specifier', async () => { - editFile('Comps.jsx', (code) => - code.replace('named specifier {count', 'named specifier updated {count') - ) - await untilUpdated( - () => page.textContent('.named-specifier'), - 'named specifier updated 1' - ) - - // affect all components in same file - expect(await page.textContent('.default')).toMatch('2') - // should not affect other components on the page - expect(await page.textContent('.default-tsx')).toMatch('4') - }) - - test('hmr: default export', async () => { - editFile('Comps.jsx', (code) => - code.replace('default {count', 'default updated {count') - ) - await untilUpdated(() => page.textContent('.default'), 'default updated 2') - - // should not affect other components on the page - expect(await page.textContent('.default-tsx')).toMatch('4') - }) - - test('hmr: named export via specifier', async () => { - // update another component - await page.click('.named') - expect(await page.textContent('.named')).toMatch('1') - - editFile('Comp.tsx', (code) => - code.replace('default tsx {count', 'default tsx updated {count') - ) - await untilUpdated( - () => page.textContent('.default-tsx'), - 'default tsx updated 3' - ) - - // should not affect other components on the page - expect(await page.textContent('.named')).toMatch('1') - }) - - test('hmr: script in .vue', async () => { - editFile('Script.vue', (code) => - code.replace('script {count', 'script updated {count') - ) - await untilUpdated(() => page.textContent('.script'), 'script updated 4') - - expect(await page.textContent('.src-import')).toMatch('6') - }) - - test('hmr: src import in .vue', async () => { - await page.click('.script') - editFile('SrcImport.jsx', (code) => - code.replace('src import {count', 'src import updated {count') - ) - await untilUpdated( - () => page.textContent('.src-import'), - 'src import updated 5' - ) - - expect(await page.textContent('.script')).toMatch('5') - }) - - test('hmr: setup jsx in .vue', async () => { - editFile('setup-syntax-jsx.vue', (code) => - code.replace('let count = ref(100)', 'let count = ref(1000)') - ) - await untilUpdated(() => page.textContent('.setup-jsx'), '1000') - }) -}) diff --git a/playground/vue-jsx/index.html b/playground/vue-jsx/index.html deleted file mode 100644 index a285a008c13a9e..00000000000000 --- a/playground/vue-jsx/index.html +++ /dev/null @@ -1,2 +0,0 @@ -
- diff --git a/playground/vue-jsx/main.jsx b/playground/vue-jsx/main.jsx deleted file mode 100644 index f13e60c45367c0..00000000000000 --- a/playground/vue-jsx/main.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { createApp } from 'vue' -import { Named, NamedSpec, default as Default } from './Comps' -import { default as TsxDefault } from './Comp' -import OtherExt from './OtherExt.tesx' -import JsxScript from './Script.vue' -import JsxSrcImport from './SrcImport.vue' -import JsxSetupSyntax from './setup-syntax-jsx.vue' -// eslint-disable-next-line -import JsxWithQuery from './Query.jsx?query=true' -import TsImport from './TsImport.vue' - -function App() { - return ( - <> - - - - - - - - - - - - ) -} - -createApp(App).mount('#app') diff --git a/playground/vue-jsx/package.json b/playground/vue-jsx/package.json deleted file mode 100644 index 93cc7b3ece32d8..00000000000000 --- a/playground/vue-jsx/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "test-vue-jsx", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" - }, - "dependencies": { - "vue": "^3.2.45" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*", - "@vitejs/plugin-vue-jsx": "workspace:*" - } -} diff --git a/playground/vue-jsx/setup-syntax-jsx.vue b/playground/vue-jsx/setup-syntax-jsx.vue deleted file mode 100644 index 0b16be7e773280..00000000000000 --- a/playground/vue-jsx/setup-syntax-jsx.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/playground/vue-jsx/vite.config.js b/playground/vue-jsx/vite.config.js deleted file mode 100644 index 2f4ea255c95094..00000000000000 --- a/playground/vue-jsx/vite.config.js +++ /dev/null @@ -1,42 +0,0 @@ -const vueJsxPlugin = require('@vitejs/plugin-vue-jsx') -const vuePlugin = require('@vitejs/plugin-vue') - -/** - * @type {import('vite').UserConfig} - */ -module.exports = { - plugins: [ - vueJsxPlugin({ - include: [/\.tesx$/, /\.[jt]sx$/] - }), - vuePlugin(), - { - name: 'jsx-query-plugin', - transform(code, id) { - if (id.includes('?query=true')) { - return ` -import { createVNode as _createVNode } from "vue"; -import { defineComponent, ref } from 'vue'; -export default defineComponent(() => { - const count = ref(6); - - const inc = () => count.value++; - - return () => _createVNode("button", { - "class": "jsx-with-query", - "onClick": inc - }, [count.value]); -}); -` - } - } - } - ], - build: { - // to make tests faster - minify: false - }, - optimizeDeps: { - disabled: true - } -} diff --git a/playground/vue-legacy/Main.vue b/playground/vue-legacy/Main.vue deleted file mode 100644 index a582c2e6aa6d62..00000000000000 --- a/playground/vue-legacy/Main.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/playground/vue-legacy/__tests__/vue-legacy.spec.ts b/playground/vue-legacy/__tests__/vue-legacy.spec.ts deleted file mode 100644 index 908e04567ca35b..00000000000000 --- a/playground/vue-legacy/__tests__/vue-legacy.spec.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { test } from 'vitest' -import { getBg, untilUpdated } from '~utils' - -test('vue legacy assets', async () => { - await untilUpdated(() => getBg('.main'), 'assets/asset', true) -}) - -test('async vue legacy assets', async () => { - await untilUpdated(() => getBg('.module'), 'assets/asset', true) -}) diff --git a/playground/vue-legacy/assets/asset.png b/playground/vue-legacy/assets/asset.png deleted file mode 100644 index 1b3356a746b8bb5510aaee51f7df5aea4378ee8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12772 zcmch82T)Ym)-H$&N*olL90vnANET3%3IdXIY@%ek$x$T;2*MyJ*+y~(p$Scr3=&#V zauARp&>%U(zmMb0?|pUet@~cpyH;6pHhZnL_ln2ZQ@20&bcI#; zRb1q(Z0+v)xLIlXsA|D|?BU{;Y%QIg6L0gA+o+ON#9WUkUItw9LoG z@?#6qUW)C{L+PnJV3BinvtkkE73P8S3*2B473UQY7PuiMz|A7aFCfInFT^Jx#3LXm z!7nZ$Ak6af4;zr?W@#;0kvqd6ZB>4C|Jw16ng?OFaZ1@Dk#l`vf1^EO8 zdB6@HgtrsY+>6Hv!TuKqc`F3m&CUgB=j_A+aWuDZc1KFFfs_7u1xFVZmA@G~A$}?f zsEp6c+=Wkom!Hqk5xUop-3X+H)&CyjpYBFzdAnHgX;>kg-QD289@gxC5d+=*dqL1f za2g4DXSlngl@s!wyc8Q);kC50l(;P_D#|Y+&o3r=TUJ0oK}c4VUtU3hUkF;26A%>o zi}s!q0%`69xB83L?r&N-#eYjHA?Idgj&yd@a&~t3%X$xNosrH6TW1#*IXRYVD&}xI zC+PV)q}!iIwQ{rbu(DKib9Q9;p&SXje{uj3VUgPcf}-N0BI1J3;l%~S#Kq*r`DGQw z
- diff --git a/playground/vue-legacy/inline.css b/playground/vue-legacy/inline.css deleted file mode 100644 index 2207a25763ca6d..00000000000000 --- a/playground/vue-legacy/inline.css +++ /dev/null @@ -1,3 +0,0 @@ -.inline-css { - color: #0088ff; -} diff --git a/playground/vue-legacy/module.vue b/playground/vue-legacy/module.vue deleted file mode 100644 index 10c7b42e4c4215..00000000000000 --- a/playground/vue-legacy/module.vue +++ /dev/null @@ -1,13 +0,0 @@ - - diff --git a/playground/vue-legacy/package.json b/playground/vue-legacy/package.json deleted file mode 100644 index 7d102dcbadaea1..00000000000000 --- a/playground/vue-legacy/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "test-vue-legacy", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" - }, - "dependencies": { - "vue": "^3.2.45" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*", - "@vitejs/plugin-legacy": "workspace:*" - } -} diff --git a/playground/vue-legacy/vite.config.ts b/playground/vue-legacy/vite.config.ts deleted file mode 100644 index 5bb2f0efa06f53..00000000000000 --- a/playground/vue-legacy/vite.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -import path from 'node:path' -import fs from 'node:fs' -import { defineConfig } from 'vite' -import vuePlugin from '@vitejs/plugin-vue' -import legacyPlugin from '@vitejs/plugin-legacy' - -export default defineConfig({ - base: '', - resolve: { - alias: { - '@': __dirname - } - }, - plugins: [ - legacyPlugin({ - targets: ['defaults', 'not IE 11', 'chrome > 48'] - }), - vuePlugin() - ], - build: { - minify: false - }, - // special test only hook - // for tests, remove ` - - diff --git a/playground/vue-lib/package.json b/playground/vue-lib/package.json deleted file mode 100644 index 6a96a8cae661ae..00000000000000 --- a/playground/vue-lib/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "test-vue-lib", - "private": true, - "version": "0.0.0", - "scripts": { - "dev-consumer": "vite --config ./vite.config.consumer.ts", - "build-lib": "vite build --config ./vite.config.lib.ts", - "build-lib-css": "vite build --config ./vite.config.lib-css.ts", - "build-consumer": "vite build --config ./vite.config.consumer.ts" - }, - "dependencies": { - "vue": "^3.2.45" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*" - } -} diff --git a/playground/vue-lib/src-consumer/index.ts b/playground/vue-lib/src-consumer/index.ts deleted file mode 100644 index 880acf90238edf..00000000000000 --- a/playground/vue-lib/src-consumer/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createApp } from 'vue' -// @ts-ignore -import { CompA } from '../dist/lib/my-vue-lib' -import '../dist/lib/style.css' - -const app = createApp(CompA) -app.mount('#app') diff --git a/playground/vue-lib/src-lib-css/index.css b/playground/vue-lib/src-lib-css/index.css deleted file mode 100644 index 135f4787b30766..00000000000000 --- a/playground/vue-lib/src-lib-css/index.css +++ /dev/null @@ -1,3 +0,0 @@ -.card { - padding: 4rem; -} diff --git a/playground/vue-lib/src-lib-css/index.ts b/playground/vue-lib/src-lib-css/index.ts deleted file mode 100644 index 0da52ebb0b6115..00000000000000 --- a/playground/vue-lib/src-lib-css/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import './index.css' - -export function setup() {} diff --git a/playground/vue-lib/src-lib/CompA.vue b/playground/vue-lib/src-lib/CompA.vue deleted file mode 100644 index dac9298b3bedf4..00000000000000 --- a/playground/vue-lib/src-lib/CompA.vue +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/playground/vue-lib/src-lib/CompB.vue b/playground/vue-lib/src-lib/CompB.vue deleted file mode 100644 index cca30168fb6753..00000000000000 --- a/playground/vue-lib/src-lib/CompB.vue +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/playground/vue-lib/src-lib/index.ts b/playground/vue-lib/src-lib/index.ts deleted file mode 100644 index f83abd4ec72118..00000000000000 --- a/playground/vue-lib/src-lib/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as CompA } from './CompA.vue' -export { default as CompB } from './CompB.vue' diff --git a/playground/vue-lib/vite.config.consumer.ts b/playground/vue-lib/vite.config.consumer.ts deleted file mode 100644 index 9e75b5cfbeabcb..00000000000000 --- a/playground/vue-lib/vite.config.consumer.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -export default defineConfig({ - root: __dirname, - build: { - outDir: 'dist/consumer' - }, - plugins: [vue()] -}) diff --git a/playground/vue-lib/vite.config.lib-css.ts b/playground/vue-lib/vite.config.lib-css.ts deleted file mode 100644 index e20ec925e05b0e..00000000000000 --- a/playground/vue-lib/vite.config.lib-css.ts +++ /dev/null @@ -1,16 +0,0 @@ -import path from 'node:path' -import { defineConfig } from 'vite' - -export default defineConfig({ - root: __dirname, - build: { - outDir: 'dist/lib', - cssCodeSplit: true, - lib: { - entry: path.resolve(__dirname, 'src-lib-css/index.ts'), - name: 'index', - formats: ['umd'], - fileName: 'index.js' - } - } -}) diff --git a/playground/vue-lib/vite.config.lib.ts b/playground/vue-lib/vite.config.lib.ts deleted file mode 100644 index 5be7ea876e9833..00000000000000 --- a/playground/vue-lib/vite.config.lib.ts +++ /dev/null @@ -1,23 +0,0 @@ -import path from 'node:path' -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -export default defineConfig({ - root: __dirname, - build: { - outDir: 'dist/lib', - lib: { - entry: path.resolve(__dirname, 'src-lib/index.ts'), - name: 'MyVueLib', - formats: ['es'], - fileName: 'my-vue-lib' - }, - rollupOptions: { - external: ['vue'], - output: { - globals: { vue: 'Vue' } - } - } - }, - plugins: [vue()] -}) diff --git a/playground/vue-server-origin/Main.vue b/playground/vue-server-origin/Main.vue deleted file mode 100644 index 20e736542ec9cb..00000000000000 --- a/playground/vue-server-origin/Main.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/playground/vue-server-origin/__tests__/vue-server-origin.spec.ts b/playground/vue-server-origin/__tests__/vue-server-origin.spec.ts deleted file mode 100644 index 2c640709cb3cf5..00000000000000 --- a/playground/vue-server-origin/__tests__/vue-server-origin.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { expect, test } from 'vitest' -import { isBuild, page } from '~utils' - -test('should render', async () => { - const expected = isBuild - ? /assets\/asset-[\da-f]+\.png/ - : 'http://localhost/server-origin/test/assets/asset.png' - - expect(await page.getAttribute('img', 'src')).toMatch(expected) - expect(await page.getAttribute('img:nth-child(2)', 'src')).toMatch(expected) -}) diff --git a/playground/vue-server-origin/assets/asset.png b/playground/vue-server-origin/assets/asset.png deleted file mode 100644 index 1b3356a746b8bb5510aaee51f7df5aea4378ee8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12772 zcmch82T)Ym)-H$&N*olL90vnANET3%3IdXIY@%ek$x$T;2*MyJ*+y~(p$Scr3=&#V zauARp&>%U(zmMb0?|pUet@~cpyH;6pHhZnL_ln2ZQ@20&bcI#; zRb1q(Z0+v)xLIlXsA|D|?BU{;Y%QIg6L0gA+o+ON#9WUkUItw9LoG z@?#6qUW)C{L+PnJV3BinvtkkE73P8S3*2B473UQY7PuiMz|A7aFCfInFT^Jx#3LXm z!7nZ$Ak6af4;zr?W@#;0kvqd6ZB>4C|Jw16ng?OFaZ1@Dk#l`vf1^EO8 zdB6@HgtrsY+>6Hv!TuKqc`F3m&CUgB=j_A+aWuDZc1KFFfs_7u1xFVZmA@G~A$}?f zsEp6c+=Wkom!Hqk5xUop-3X+H)&CyjpYBFzdAnHgX;>kg-QD289@gxC5d+=*dqL1f za2g4DXSlngl@s!wyc8Q);kC50l(;P_D#|Y+&o3r=TUJ0oK}c4VUtU3hUkF;26A%>o zi}s!q0%`69xB83L?r&N-#eYjHA?Idgj&yd@a&~t3%X$xNosrH6TW1#*IXRYVD&}xI zC+PV)q}!iIwQ{rbu(DKib9Q9;p&SXje{uj3VUgPcf}-N0BI1J3;l%~S#Kq*r`DGQw z

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 diff --git a/playground/vue-server-origin/env.d.ts b/playground/vue-server-origin/env.d.ts deleted file mode 100644 index 31dca6bb40c906..00000000000000 --- a/playground/vue-server-origin/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module '*.png' diff --git a/playground/vue-server-origin/index.html b/playground/vue-server-origin/index.html deleted file mode 100644 index 13de0b72c23782..00000000000000 --- a/playground/vue-server-origin/index.html +++ /dev/null @@ -1,7 +0,0 @@ -

- diff --git a/playground/vue-server-origin/package.json b/playground/vue-server-origin/package.json deleted file mode 100644 index b5d1d345828888..00000000000000 --- a/playground/vue-server-origin/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "test-vue-server-origin", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" - }, - "dependencies": { - "vue": "^3.2.45" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*" - } -} diff --git a/playground/vue-server-origin/vite.config.ts b/playground/vue-server-origin/vite.config.ts deleted file mode 100644 index e6e497c2917f6b..00000000000000 --- a/playground/vue-server-origin/vite.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from 'vite' -import vuePlugin from '@vitejs/plugin-vue' - -export default defineConfig({ - base: '', - resolve: { - alias: { - '@': __dirname - } - }, - plugins: [vuePlugin()], - server: { - origin: 'http://localhost/server-origin/test' - }, - build: { - // to make tests faster - minify: false - } -}) diff --git a/playground/vue-sourcemap/Css.vue b/playground/vue-sourcemap/Css.vue deleted file mode 100644 index 4f677c7b84dfbd..00000000000000 --- a/playground/vue-sourcemap/Css.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - diff --git a/playground/vue-sourcemap/Js.vue b/playground/vue-sourcemap/Js.vue deleted file mode 100644 index 3a5577099f67d3..00000000000000 --- a/playground/vue-sourcemap/Js.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/playground/vue-sourcemap/Less.vue b/playground/vue-sourcemap/Less.vue deleted file mode 100644 index f12a3e55f2111c..00000000000000 --- a/playground/vue-sourcemap/Less.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/playground/vue-sourcemap/Main.vue b/playground/vue-sourcemap/Main.vue deleted file mode 100644 index 8b092e88d94aef..00000000000000 --- a/playground/vue-sourcemap/Main.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/playground/vue-sourcemap/NoScript.vue b/playground/vue-sourcemap/NoScript.vue deleted file mode 100644 index 77e2de3414d1ea..00000000000000 --- a/playground/vue-sourcemap/NoScript.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/playground/vue-sourcemap/NoTemplate.vue b/playground/vue-sourcemap/NoTemplate.vue deleted file mode 100644 index 9414a2913d68f4..00000000000000 --- a/playground/vue-sourcemap/NoTemplate.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/playground/vue-sourcemap/Sass.vue b/playground/vue-sourcemap/Sass.vue deleted file mode 100644 index 0fded031a52c72..00000000000000 --- a/playground/vue-sourcemap/Sass.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/playground/vue-sourcemap/SassWithImport.vue b/playground/vue-sourcemap/SassWithImport.vue deleted file mode 100644 index 7a00420a00bb3a..00000000000000 --- a/playground/vue-sourcemap/SassWithImport.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/playground/vue-sourcemap/Ts.vue b/playground/vue-sourcemap/Ts.vue deleted file mode 100644 index e0d96bb4725abd..00000000000000 --- a/playground/vue-sourcemap/Ts.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap b/playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap deleted file mode 100644 index d2600ee6edccce..00000000000000 --- a/playground/vue-sourcemap/__tests__/__snapshots__/vue-sourcemap.spec.ts.snap +++ /dev/null @@ -1,335 +0,0 @@ -// Vitest Snapshot v1 - -exports[`serve:vue-sourcemap > css > serve-css 1`] = ` -{ - "mappings": ";AAQA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > css module > serve-css-module 1`] = ` -{ - "mappings": ";AAcA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > css scoped > serve-css-scoped 1`] = ` -{ - "mappings": ";AAoBA;EACE,UAAU;AACZ", - "sources": [ - "/root/Css.vue", - ], - "sourcesContent": [ - " - - - - - - - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > js > serve-js 1`] = ` -{ - "mappings": "AAKA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;wBARlB,oBAAiB,WAAd,MAAU", - "sources": [ - "/root/Js.vue", - ], - "sourcesContent": [ - " - - - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > less with additionalData > serve-less-with-additionalData 1`] = ` -{ - "mappings": "AAKA;EACE", - "sources": [ - "/root/Less.vue", - ], - "sourcesContent": [ - " - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > no script > serve-no-script 1`] = ` -{ - "mappings": ";;;wBACE,oBAAwB,WAArB,aAAiB", - "sourceRoot": "", - "sources": [ - "/root/NoScript.vue", - ], - "sourcesContent": [ - " -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > no template > serve-no-template 1`] = ` -{ - "mappings": "AACA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;AAGP;AACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;;;;;", - "sources": [ - "/root/NoTemplate.vue", - ], - "sourcesContent": [ - " - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > sass > serve-sass 1`] = ` -{ - "mappings": "AAKA;EACE", - "sources": [ - "/root/Sass.vue", - ], - "sourcesContent": [ - " - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > sass with import > serve-sass-with-import 1`] = ` -{ - "mappings": "AAAA;EACE;;ACOF;EACE", - "sources": [ - "/root/sassWithImportImported.sass", - "/root/SassWithImport.vue", - ], - "sourcesContent": [ - ".sass-with-import-imported - color: red -", - " - - -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > src imported > serve-src-imported 1`] = ` -{ - "mappings": "AAAA;EACE,UAAU;AACZ", - "sources": [ - "/root/src-import/src-import.css", - ], - "sourcesContent": [ - ".src-import { - color: red; -} -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > src imported sass > serve-src-imported-sass 1`] = ` -{ - "mappings": "AAAA;EACE;;ACCF;EACE", - "sources": [ - "/root/src-import/src-import-imported.sass", - "/root/src-import/src-import.sass", - ], - "sourcesContent": [ - ".src-import-sass-imported - color: red -", - "@import './src-import-imported' - -.src-import-sass - color: red -", - ], - "version": 3, -} -`; - -exports[`serve:vue-sourcemap > ts > serve-ts 1`] = ` -{ - "mappings": ";AAKA,QAAQ,IAAI,WAAW;;;;;AAIvB,YAAQ,IAAI,UAAU;;;;;;;;uBARpB,oBAAiB,WAAd,MAAU", - "sources": [ - "/root/Ts.vue", - ], - "sourcesContent": [ - " - - - - -", - ], - "version": 3, -} -`; diff --git a/playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts b/playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts deleted file mode 100644 index ee6473c6304e4e..00000000000000 --- a/playground/vue-sourcemap/__tests__/vue-sourcemap.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { URL } from 'node:url' -import { describe, expect, test } from 'vitest' -import { - extractSourcemap, - formatSourcemapForSnapshot, - isBuild, - isServe, - page, - serverLogs -} from '~utils' - -describe.runIf(isServe)('serve:vue-sourcemap', () => { - const getStyleTagContentIncluding = async (content: string) => { - const styles = await page.$$('style') - for (const style of styles) { - const text = await style.textContent() - if (text.includes(content)) { - return text - } - } - throw new Error('Style not found: ' + content) - } - - test('js', async () => { - const res = await page.request.get(new URL('./Js.vue', page.url()).href) - const js = await res.text() - const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-js') - }) - - test('ts', async () => { - const res = await page.request.get(new URL('./Ts.vue', page.url()).href) - const js = await res.text() - const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-ts') - }) - - test('css', async () => { - const css = await getStyleTagContentIncluding('.css ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css') - }) - - test('css module', async () => { - const css = await getStyleTagContentIncluding('._css-module_') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css-module') - }) - - test('css scoped', async () => { - const css = await getStyleTagContentIncluding('.css-scoped[data-v-') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-css-scoped') - }) - - test('sass', async () => { - const css = await getStyleTagContentIncluding('.sass ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-sass') - }) - - test('sass with import', async () => { - const css = await getStyleTagContentIncluding('.sass-with-import ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( - 'serve-sass-with-import' - ) - }) - - test('less with additionalData', async () => { - const css = await getStyleTagContentIncluding('.less ') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( - 'serve-less-with-additionalData' - ) - }) - - test('src imported', async () => { - const css = await getStyleTagContentIncluding('.src-import[data-v-') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( - 'serve-src-imported' - ) - }) - - test('src imported sass', async () => { - const css = await getStyleTagContentIncluding('.src-import-sass[data-v-') - const map = extractSourcemap(css) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot( - 'serve-src-imported-sass' - ) - }) - - test('no script', async () => { - const res = await page.request.get( - new URL('./NoScript.vue', page.url()).href - ) - const js = await res.text() - const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-no-script') - }) - - test('no template', async () => { - const res = await page.request.get( - new URL('./NoTemplate.vue', page.url()).href - ) - const js = await res.text() - const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchSnapshot('serve-no-template') - }) -}) - -test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { - serverLogs.forEach((log) => { - expect(log).not.toMatch('Sourcemap is likely to be incorrect') - }) -}) diff --git a/playground/vue-sourcemap/index.html b/playground/vue-sourcemap/index.html deleted file mode 100644 index 57f325518a2c25..00000000000000 --- a/playground/vue-sourcemap/index.html +++ /dev/null @@ -1,7 +0,0 @@ -
- diff --git a/playground/vue-sourcemap/package.json b/playground/vue-sourcemap/package.json deleted file mode 100644 index 5d1f164595dc2f..00000000000000 --- a/playground/vue-sourcemap/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "test-vue-sourcemap", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*", - "less": "^4.1.3", - "postcss-nested": "^5.0.6", - "sass": "^1.56.1" - }, - "dependencies": { - "vue": "^3.2.45" - } -} diff --git a/playground/vue-sourcemap/postcss.config.js b/playground/vue-sourcemap/postcss.config.js deleted file mode 100644 index 9ea26b495d91b5..00000000000000 --- a/playground/vue-sourcemap/postcss.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - plugins: [require('postcss-nested')] -} diff --git a/playground/vue-sourcemap/sassWithImportImported.sass b/playground/vue-sourcemap/sassWithImportImported.sass deleted file mode 100644 index 8092b37048cbdd..00000000000000 --- a/playground/vue-sourcemap/sassWithImportImported.sass +++ /dev/null @@ -1,2 +0,0 @@ -.sass-with-import-imported - color: red diff --git a/playground/vue-sourcemap/src-import/SrcImport.vue b/playground/vue-sourcemap/src-import/SrcImport.vue deleted file mode 100644 index 406c6a6b45382d..00000000000000 --- a/playground/vue-sourcemap/src-import/SrcImport.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/playground/vue-sourcemap/src-import/src-import-imported.sass b/playground/vue-sourcemap/src-import/src-import-imported.sass deleted file mode 100644 index 2ed87d933e58a6..00000000000000 --- a/playground/vue-sourcemap/src-import/src-import-imported.sass +++ /dev/null @@ -1,2 +0,0 @@ -.src-import-sass-imported - color: red diff --git a/playground/vue-sourcemap/src-import/src-import.css b/playground/vue-sourcemap/src-import/src-import.css deleted file mode 100644 index da61ff0fb6cb27..00000000000000 --- a/playground/vue-sourcemap/src-import/src-import.css +++ /dev/null @@ -1,3 +0,0 @@ -.src-import { - color: red; -} diff --git a/playground/vue-sourcemap/src-import/src-import.sass b/playground/vue-sourcemap/src-import/src-import.sass deleted file mode 100644 index c7e0314fda541c..00000000000000 --- a/playground/vue-sourcemap/src-import/src-import.sass +++ /dev/null @@ -1,4 +0,0 @@ -@import './src-import-imported' - -.src-import-sass - color: red diff --git a/playground/vue-sourcemap/vite.config.ts b/playground/vue-sourcemap/vite.config.ts deleted file mode 100644 index dbfa81dbeb1144..00000000000000 --- a/playground/vue-sourcemap/vite.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import vuePlugin from '@vitejs/plugin-vue' -import { defineConfig } from 'vite' - -export default defineConfig({ - css: { - devSourcemap: true, - preprocessorOptions: { - less: { - additionalData: '@color: red;' - } - } - }, - plugins: [vuePlugin()], - build: { - sourcemap: true - } -}) diff --git a/playground/vue/Assets.vue b/playground/vue/Assets.vue deleted file mode 100644 index 875ac1b243b393..00000000000000 --- a/playground/vue/Assets.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/playground/vue/AsyncComponent.vue b/playground/vue/AsyncComponent.vue deleted file mode 100644 index 4e66630c4d2edd..00000000000000 --- a/playground/vue/AsyncComponent.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/playground/vue/CssModules.vue b/playground/vue/CssModules.vue deleted file mode 100644 index f7897e2e57f652..00000000000000 --- a/playground/vue/CssModules.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/playground/vue/CustomBlock.vue b/playground/vue/CustomBlock.vue deleted file mode 100644 index 0a7b3901693154..00000000000000 --- a/playground/vue/CustomBlock.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -en: - hello: 'hello,vite!' -ja: - hello: 'こんにちは、vite!' - diff --git a/playground/vue/CustomBlockPlugin.ts b/playground/vue/CustomBlockPlugin.ts deleted file mode 100644 index bfa3f2342881ca..00000000000000 --- a/playground/vue/CustomBlockPlugin.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Plugin } from 'vite' - -export const vueI18nPlugin: Plugin = { - name: 'vue-i18n', - async transform(code, id) { - if (!/vue&type=i18n/.test(id)) { - return - } - if (/\.ya?ml$/.test(id)) { - const { load } = await import('js-yaml') - code = JSON.stringify(load(code.trim())) - } - return { - code: `export default Comp => { - Comp.i18n = ${code} - }`, - map: { mappings: '' } - } - } -} diff --git a/playground/vue/CustomElement.ce.vue b/playground/vue/CustomElement.ce.vue deleted file mode 100644 index 58d94650d1a74a..00000000000000 --- a/playground/vue/CustomElement.ce.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/playground/vue/Hmr.vue b/playground/vue/Hmr.vue deleted file mode 100644 index 5535467af3858f..00000000000000 --- a/playground/vue/Hmr.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/playground/vue/HmrTsx.vue b/playground/vue/HmrTsx.vue deleted file mode 100644 index c1a2331da6a6be..00000000000000 --- a/playground/vue/HmrTsx.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/playground/vue/Main.vue b/playground/vue/Main.vue deleted file mode 100644 index b91d50f9287a31..00000000000000 --- a/playground/vue/Main.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - diff --git a/playground/vue/Node.vue b/playground/vue/Node.vue deleted file mode 100644 index 246442d29f522c..00000000000000 --- a/playground/vue/Node.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/playground/vue/Null.vue b/playground/vue/Null.vue deleted file mode 100644 index edec53c4b13264..00000000000000 --- a/playground/vue/Null.vue +++ /dev/null @@ -1 +0,0 @@ - diff --git a/playground/vue/PreProcessors.vue b/playground/vue/PreProcessors.vue deleted file mode 100644 index c210448d332456..00000000000000 --- a/playground/vue/PreProcessors.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - diff --git a/playground/vue/ReactivityTransform.vue b/playground/vue/ReactivityTransform.vue deleted file mode 100644 index 0dc2b09343d641..00000000000000 --- a/playground/vue/ReactivityTransform.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/playground/vue/ScanDep.vue b/playground/vue/ScanDep.vue deleted file mode 100644 index 17b398beab1cd2..00000000000000 --- a/playground/vue/ScanDep.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/playground/vue/Slotted.vue b/playground/vue/Slotted.vue deleted file mode 100644 index fb25a9c5100215..00000000000000 --- a/playground/vue/Slotted.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/playground/vue/Syntax.vue b/playground/vue/Syntax.vue deleted file mode 100644 index de100226922c55..00000000000000 --- a/playground/vue/Syntax.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/playground/vue/TsImport.vue b/playground/vue/TsImport.vue deleted file mode 100644 index 7858c8cfa674d2..00000000000000 --- a/playground/vue/TsImport.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/playground/vue/TsImportFile.ts b/playground/vue/TsImportFile.ts deleted file mode 100644 index 62761d5733b432..00000000000000 --- a/playground/vue/TsImportFile.ts +++ /dev/null @@ -1 +0,0 @@ -export const foo = 'success' diff --git a/playground/vue/Url.vue b/playground/vue/Url.vue deleted file mode 100644 index c65d1f418cfd7d..00000000000000 --- a/playground/vue/Url.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/playground/vue/__tests__/vue.spec.ts b/playground/vue/__tests__/vue.spec.ts deleted file mode 100644 index feaeb42b8f7a6c..00000000000000 --- a/playground/vue/__tests__/vue.spec.ts +++ /dev/null @@ -1,281 +0,0 @@ -import { describe, expect, test } from 'vitest' -import { - browserLogs, - editFile, - getBg, - getColor, - isBuild, - page, - serverLogs, - untilUpdated -} from '~utils' - -test('should render', async () => { - expect(await page.textContent('h1')).toMatch('Vue SFCs') -}) - -test('should update', async () => { - expect(await page.textContent('.hmr-inc')).toMatch('count is 0') - await page.click('.hmr-inc') - expect(await page.textContent('.hmr-inc')).toMatch('count is 1') -}) - -test('template/script latest syntax support', async () => { - expect(await page.textContent('.syntax')).toBe('baz') -}) - -test('import ts with .js extension with lang="ts"', async () => { - expect(await page.textContent('.ts-import')).toBe('success') - expect(await page.textContent('.ts-import2')).toBe('success') -}) - -test('should remove comments in prod', async () => { - expect(await page.innerHTML('.comments')).toBe(isBuild ? `` : ``) -}) - -test(':slotted', async () => { - expect(await getColor('.slotted')).toBe('red') -}) - -describe('dep scan', () => { - test('scan deps from - diff --git a/playground/vue/package.json b/playground/vue/package.json deleted file mode 100644 index 958904b79f448d..00000000000000 --- a/playground/vue/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "test-vue", - "private": true, - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" - }, - "dependencies": { - "lodash-es": "^4.17.21", - "vue": "^3.2.45" - }, - "devDependencies": { - "@vitejs/plugin-vue": "workspace:*", - "js-yaml": "^4.1.0", - "less": "^4.1.3", - "pug": "^3.0.2", - "sass": "^1.56.1", - "stylus": "^0.59.0" - } -} diff --git a/playground/vue/public/favicon.ico b/playground/vue/public/favicon.ico deleted file mode 100644 index df36fcfb72584e00488330b560ebcf34a41c64c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/playground/vue/public/icon.png b/playground/vue/public/icon.png deleted file mode 100644 index 4388bfdca3d4d778d2f25a5861599f8f19a1177c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3395 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 diff --git a/playground/vue/setup-import-template/SetupImportTemplate.vue b/playground/vue/setup-import-template/SetupImportTemplate.vue deleted file mode 100644 index d7fb119e3cfdc0..00000000000000 --- a/playground/vue/setup-import-template/SetupImportTemplate.vue +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/playground/vue/setup-import-template/template.html b/playground/vue/setup-import-template/template.html deleted file mode 100644 index 414069f2e9e929..00000000000000 --- a/playground/vue/setup-import-template/template.html +++ /dev/null @@ -1,2 +0,0 @@ -

Setup Import Template

- diff --git a/playground/vue/src-import/SrcImport.vue b/playground/vue/src-import/SrcImport.vue deleted file mode 100644 index d70e1f48a84331..00000000000000 --- a/playground/vue/src-import/SrcImport.vue +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/playground/vue/src-import/css.module.css b/playground/vue/src-import/css.module.css deleted file mode 100644 index 09b5c09fb637e2..00000000000000 --- a/playground/vue/src-import/css.module.css +++ /dev/null @@ -1,7 +0,0 @@ -.one { - background: yellow; -} - -.two { - border: solid 1px red; -} diff --git a/playground/vue/src-import/script.ts b/playground/vue/src-import/script.ts deleted file mode 100644 index d20c098a7af289..00000000000000 --- a/playground/vue/src-import/script.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineComponent } from 'vue' -import SrcImportStyle from './srcImportStyle.vue' -import SrcImportStyle2 from './srcImportStyle2.vue' -import SrcImportModuleStyle from './srcImportModuleStyle.vue' -import SrcImportModuleStyle2 from './srcImportModuleStyle2.vue' - -export default defineComponent({ - components: { - SrcImportStyle, - SrcImportStyle2, - SrcImportModuleStyle, - SrcImportModuleStyle2 - }, - setup() { - return { - msg: 'hello from script src!' - } - } -}) diff --git a/playground/vue/src-import/srcImportModuleStyle.vue b/playground/vue/src-import/srcImportModuleStyle.vue deleted file mode 100644 index f1e85abb6d2b12..00000000000000 --- a/playground/vue/src-import/srcImportModuleStyle.vue +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/playground/vue/src-import/srcImportStyle2.vue b/playground/vue/src-import/srcImportStyle2.vue deleted file mode 100644 index 1e0f327413103e..00000000000000 --- a/playground/vue/src-import/srcImportStyle2.vue +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/playground/vue/src-import/style.css b/playground/vue/src-import/style.css deleted file mode 100644 index 49ab2d93176f4f..00000000000000 --- a/playground/vue/src-import/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.src-imports-style { - color: tan; -} diff --git a/playground/vue/src-import/style2.css b/playground/vue/src-import/style2.css deleted file mode 100644 index 8c93cb983cc09d..00000000000000 --- a/playground/vue/src-import/style2.css +++ /dev/null @@ -1,3 +0,0 @@ -.src-imports-script { - color: #0088ff; -} diff --git a/playground/vue/src-import/template.html b/playground/vue/src-import/template.html deleted file mode 100644 index af94a480e7e357..00000000000000 --- a/playground/vue/src-import/template.html +++ /dev/null @@ -1,7 +0,0 @@ -

SFC Src Imports

-
{{ msg }}
-
This should be tan
- - - - diff --git a/playground/vue/tsconfig.json b/playground/vue/tsconfig.json deleted file mode 100644 index bdc0eedc2244af..00000000000000 --- a/playground/vue/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "compilerOptions": { - // esbuild transpile should ignore this - "target": "ES5" - }, - "include": ["."] -} diff --git a/playground/vue/vite-env.d.ts b/playground/vue/vite-env.d.ts deleted file mode 100644 index 11f02fe2a0061d..00000000000000 --- a/playground/vue/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/playground/vue/vite.config.ts b/playground/vue/vite.config.ts deleted file mode 100644 index c1561ce2c2bd47..00000000000000 --- a/playground/vue/vite.config.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { defineConfig, splitVendorChunkPlugin } from 'vite' -import vuePlugin from '@vitejs/plugin-vue' -import { vueI18nPlugin } from './CustomBlockPlugin' - -export default defineConfig({ - resolve: { - alias: { - '/@': __dirname, - '@': __dirname - } - }, - plugins: [ - vuePlugin({ - reactivityTransform: true - }), - splitVendorChunkPlugin(), - vueI18nPlugin - ], - build: { - // to make tests faster - minify: false, - rollupOptions: { - output: { - // Test splitVendorChunkPlugin composition - manualChunks(id) { - if (id.includes('src-import')) { - return 'src-import' - } - } - } - } - }, - css: { - modules: { - localsConvention: 'camelCaseOnly' - } - } -}) diff --git a/playground/vue/worker.vue b/playground/vue/worker.vue deleted file mode 100644 index c5369fda742348..00000000000000 --- a/playground/vue/worker.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/playground/vue/workerTest.js b/playground/vue/workerTest.js deleted file mode 100644 index fcde5e19b30677..00000000000000 --- a/playground/vue/workerTest.js +++ /dev/null @@ -1 +0,0 @@ -self.postMessage('worker load!') diff --git a/playground/worker/package.json b/playground/worker/package.json index e3fe8121a49d46..56432e12115d97 100644 --- a/playground/worker/package.json +++ b/playground/worker/package.json @@ -27,6 +27,6 @@ "dep-to-optimize": "file:./dep-to-optimize" }, "devDependencies": { - "@vitejs/plugin-vue-jsx": "workspace:*" + "@vitejs/plugin-vue-jsx": "^3.0.0-alpha.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 630cec2dd51ed1..0e0888d3bd82af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,7 +2,6 @@ lockfileVersion: 5.4 overrides: vite: workspace:* - '@vitejs/plugin-vue': workspace:* packageExtensionsChecksum: 2a87e01b470616d3b7def19cc0830231 @@ -157,60 +156,6 @@ importers: picocolors: 1.0.0 vite: link:../vite - packages/plugin-react: - specifiers: - '@babel/core': ^7.20.5 - '@babel/plugin-transform-react-jsx': ^7.19.0 - '@babel/plugin-transform-react-jsx-development': ^7.18.6 - '@babel/plugin-transform-react-jsx-self': ^7.18.6 - '@babel/plugin-transform-react-jsx-source': ^7.19.6 - magic-string: ^0.26.7 - react-refresh: ^0.14.0 - vite: workspace:* - dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.5 - magic-string: 0.26.7 - react-refresh: 0.14.0 - devDependencies: - vite: link:../vite - - packages/plugin-vue: - specifiers: - '@jridgewell/gen-mapping': ^0.3.2 - '@jridgewell/trace-mapping': ^0.3.17 - debug: ^4.3.4 - rollup: ~3.3.0 - slash: ^5.0.0 - source-map: ^0.6.1 - vite: workspace:* - vue: ^3.2.45 - devDependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 - debug: 4.3.4 - rollup: 3.3.0 - slash: 5.0.0 - source-map: 0.6.1 - vite: link:../vite - vue: 3.2.45 - - packages/plugin-vue-jsx: - specifiers: - '@babel/core': ^7.20.5 - '@babel/plugin-transform-typescript': ^7.20.2 - '@vue/babel-plugin-jsx': ^1.1.1 - vite: workspace:* - dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 - '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5 - devDependencies: - vite: link:../vite - packages/vite: specifiers: '@ampproject/remapping': ^2.2.0 @@ -537,14 +482,14 @@ importers: playground/file-delete-restore: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/fs-serve: specifiers: {} @@ -664,7 +609,7 @@ importers: playground/optimize-deps: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 added-in-entries: file:./added-in-entries axios: ^0.27.2 clipboard: ^2.0.11 @@ -725,7 +670,7 @@ importers: vue: 3.2.45 vuex: 4.1.0_vue@3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 playground/optimize-deps/added-in-entries: specifiers: {} @@ -813,7 +758,7 @@ importers: playground/preload: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 dep-a: file:./dep-a dep-including-a: file:./dep-including-a terser: ^5.16.0 @@ -823,7 +768,7 @@ importers: vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 dep-a: file:playground/preload/dep-a dep-including-a: file:playground/preload/dep-including-a terser: 5.16.0 @@ -848,7 +793,7 @@ importers: playground/react: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 jsx-entry: file:./jsx-entry react: ^18.2.0 react-dom: ^18.2.0 @@ -857,25 +802,25 @@ importers: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/react-classic: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/react-emotion: specifiers: '@babel/plugin-proposal-pipeline-operator': ^7.18.9 '@emotion/babel-plugin': ^11.10.5 '@emotion/react': ^11.10.5 - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 react: ^18.2.0 react-dom: ^18.2.0 react-switch: ^7.0.0 @@ -887,29 +832,29 @@ importers: devDependencies: '@babel/plugin-proposal-pipeline-operator': 7.18.9 '@emotion/babel-plugin': 11.10.5 - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/react-env: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/react-sourcemap: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 react: ^18.2.0 react-dom: ^18.2.0 dependencies: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 playground/react/jsx-entry: specifiers: {} @@ -1153,7 +1098,7 @@ importers: playground/ssr-react: specifiers: - '@vitejs/plugin-react': workspace:* + '@vitejs/plugin-react': ^3.0.0-alpha.0 compression: ^1.7.4 express: ^4.18.2 react: ^18.2.0 @@ -1165,7 +1110,7 @@ importers: react-dom: 18.2.0_react@18.2.0 react-router-dom: 6.4.3_biqbaboplfbrettd7655fr4n2y devDependencies: - '@vitejs/plugin-react': link:../../packages/plugin-react + '@vitejs/plugin-react': 3.0.0-alpha.2 compression: 1.7.4 express: 4.18.2 serve-static: 1.15.0 @@ -1186,8 +1131,8 @@ importers: playground/ssr-vue: specifiers: - '@vitejs/plugin-vue': workspace:* - '@vitejs/plugin-vue-jsx': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 + '@vitejs/plugin-vue-jsx': ^3.0.0-alpha.0 compression: ^1.7.4 dep-import-type: link:./dep-import-type example-external-component: file:example-external-component @@ -1202,8 +1147,8 @@ importers: vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue - '@vitejs/plugin-vue-jsx': link:../../packages/plugin-vue-jsx + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 + '@vitejs/plugin-vue-jsx': 3.0.0-alpha.0_vue@3.2.45 compression: 1.7.4 dep-import-type: link:dep-import-type express: 4.18.2 @@ -1228,7 +1173,7 @@ importers: playground/tailwind: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 autoprefixer: ^10.4.13 tailwindcss: ^3.2.4 ts-node: ^10.9.1 @@ -1240,7 +1185,7 @@ importers: vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 ts-node: 10.9.1 playground/tailwind-sourcemap: @@ -1260,7 +1205,7 @@ importers: playground/vue: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 js-yaml: ^4.1.0 less: ^4.1.3 lodash-es: ^4.17.21 @@ -1272,7 +1217,7 @@ importers: lodash-es: 4.17.21 vue: 3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 js-yaml: 4.1.0 less: 4.1.3 pug: 3.0.2 @@ -1281,47 +1226,47 @@ importers: playground/vue-jsx: specifiers: - '@vitejs/plugin-vue': workspace:* - '@vitejs/plugin-vue-jsx': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 + '@vitejs/plugin-vue-jsx': ^3.0.0-alpha.0 vue: ^3.2.45 dependencies: vue: 3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue - '@vitejs/plugin-vue-jsx': link:../../packages/plugin-vue-jsx + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 + '@vitejs/plugin-vue-jsx': 3.0.0-alpha.0_vue@3.2.45 playground/vue-legacy: specifiers: '@vitejs/plugin-legacy': workspace:* - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 vue: ^3.2.45 dependencies: vue: 3.2.45 devDependencies: '@vitejs/plugin-legacy': link:../../packages/plugin-legacy - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 playground/vue-lib: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 vue: ^3.2.45 dependencies: vue: 3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 playground/vue-server-origin: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 vue: ^3.2.45 dependencies: vue: 3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 playground/vue-sourcemap: specifiers: - '@vitejs/plugin-vue': workspace:* + '@vitejs/plugin-vue': ^4.0.0-alpha.0 less: ^4.1.3 postcss-nested: ^5.0.6 sass: ^1.56.1 @@ -1329,7 +1274,7 @@ importers: dependencies: vue: 3.2.45 devDependencies: - '@vitejs/plugin-vue': link:../../packages/plugin-vue + '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 less: 4.1.3 postcss-nested: 5.0.6 sass: 1.56.1 @@ -1339,12 +1284,12 @@ importers: playground/worker: specifiers: - '@vitejs/plugin-vue-jsx': workspace:* + '@vitejs/plugin-vue-jsx': ^3.0.0-alpha.0 dep-to-optimize: file:./dep-to-optimize dependencies: dep-to-optimize: file:playground/worker/dep-to-optimize devDependencies: - '@vitejs/plugin-vue-jsx': link:../../packages/plugin-vue-jsx + '@vitejs/plugin-vue-jsx': 3.0.0-alpha.0 playground/worker/dep-to-optimize: specifiers: {} @@ -1471,6 +1416,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + dev: true /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} @@ -1481,6 +1427,7 @@ packages: /@babel/compat-data/7.20.1: resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/core/7.20.5: resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} @@ -1503,6 +1450,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /@babel/generator/7.20.5: resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} @@ -1511,13 +1459,14 @@ packages: '@babel/types': 7.20.5 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 - dev: false + dev: true /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} @@ -1530,6 +1479,7 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 + dev: true /@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5: resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} @@ -1547,11 +1497,12 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color - dev: false + dev: true /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-function-name/7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} @@ -1559,26 +1510,21 @@ packages: dependencies: '@babel/template': 7.18.10 '@babel/types': 7.20.5 + dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 + dev: true /@babel/helper-member-expression-to-functions/7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 - dev: false - - /@babel/helper-module-imports/7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.5 - dev: false + dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -1600,29 +1546,20 @@ packages: '@babel/types': 7.20.5 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-optimise-call-expression/7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 - dev: false - - /@babel/helper-plugin-utils/7.18.6: - resolution: {integrity: sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==} - engines: {node: '>=6.9.0'} - dev: false + dev: true /@babel/helper-plugin-utils/7.18.9: resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-plugin-utils/7.19.0: - resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} @@ -1638,19 +1575,21 @@ packages: '@babel/types': 7.20.5 transitivePeerDependencies: - supports-color - dev: false + dev: true /@babel/helper-simple-access/7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 + dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 + dev: true /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -1663,6 +1602,7 @@ packages: /@babel/helper-validator-option/7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helpers/7.20.6: resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} @@ -1673,6 +1613,7 @@ packages: '@babel/types': 7.20.5 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} @@ -1699,16 +1640,6 @@ packages: '@babel/plugin-syntax-pipeline-operator': 7.18.6 dev: true - /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.20.5: - resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.20.2 - dev: false - /@babel/plugin-syntax-jsx/7.18.6: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} @@ -1725,7 +1656,7 @@ packages: dependencies: '@babel/core': 7.20.5 '@babel/helper-plugin-utils': 7.20.2 - dev: false + dev: true /@babel/plugin-syntax-pipeline-operator/7.18.6: resolution: {integrity: sha512-pFtIdQomJtkTHWcNsGXhjJ5YUkL+AxJnP4G+Ol85UO6uT2fpHTPYLLE5bBeRA9cxf25qa/VKsJ3Fi67Gyqe3rA==} @@ -1744,7 +1675,7 @@ packages: dependencies: '@babel/core': 7.20.5 '@babel/helper-plugin-utils': 7.20.2 - dev: false + dev: true /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} @@ -1754,7 +1685,7 @@ packages: dependencies: '@babel/core': 7.20.5 '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 - dev: false + dev: true /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} @@ -1763,8 +1694,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.18.6 - dev: false + '@babel/helper-plugin-utils': 7.20.2 + dev: true /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.5: resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} @@ -1773,8 +1704,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 - dev: false + '@babel/helper-plugin-utils': 7.20.2 + dev: true /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.5: resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} @@ -1785,10 +1716,10 @@ packages: '@babel/core': 7.20.5 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.19.3 - dev: false + '@babel/types': 7.20.5 + dev: true /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5: resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==} @@ -1802,7 +1733,7 @@ packages: '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 transitivePeerDependencies: - supports-color - dev: false + dev: true /@babel/runtime/7.20.0: resolution: {integrity: sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==} @@ -1820,15 +1751,6 @@ packages: resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==} engines: {node: '>=6.9.0'} - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 - dev: false - /@babel/template/7.18.10: resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} @@ -1836,24 +1758,7 @@ packages: '@babel/code-frame': 7.18.6 '@babel/parser': 7.20.5 '@babel/types': 7.20.5 - - /@babel/traverse/7.17.10: - resolution: {integrity: sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false + dev: true /@babel/traverse/7.20.5: resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} @@ -1871,15 +1776,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - - /@babel/types/7.19.3: - resolution: {integrity: sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: false + dev: true /@babel/types/7.20.5: resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} @@ -2134,6 +2031,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.1 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/gen-mapping/0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} @@ -2142,6 +2040,7 @@ packages: '@jridgewell/set-array': 1.1.1 '@jridgewell/sourcemap-codec': 1.4.13 '@jridgewell/trace-mapping': 0.3.17 + dev: true /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} @@ -2150,6 +2049,7 @@ packages: /@jridgewell/set-array/1.1.1: resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/source-map/0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} @@ -2160,6 +2060,7 @@ packages: /@jridgewell/sourcemap-codec/1.4.13: resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + dev: true /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -2169,6 +2070,7 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2809,18 +2711,85 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@vitejs/plugin-react/3.0.0-alpha.2: + resolution: {integrity: sha512-VObQvgDSWuEyxsCm/7gnMAzO82v7/JW1Yki6gvgFishqY4TMVHtm+3k7m6ci5zEBI22d+vfXh54mOpVHE+VgKA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.5 + magic-string: 0.26.7 + react-refresh: 0.14.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue-jsx/3.0.0-alpha.0: + resolution: {integrity: sha512-301Bbw+Ap+1EPYB/e8uDYAFAE/MNGb2TPf7zHLxVUagVkG9hkjFU4raUFucXtQ/cB8NkWBqcP66luS7rHgBCxQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 + '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue-jsx/3.0.0-alpha.0_vue@3.2.45: + resolution: {integrity: sha512-301Bbw+Ap+1EPYB/e8uDYAFAE/MNGb2TPf7zHLxVUagVkG9hkjFU4raUFucXtQ/cB8NkWBqcP66luS7rHgBCxQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 + '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5 + vue: 3.2.45 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue/3.2.0_vp6yl3plkfvihwzjgzhs7aemmy: + resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.2.25 + dependencies: + vite: link:packages/vite + vue: 3.2.45 + dev: true + + /@vitejs/plugin-vue/4.0.0-alpha.2_vue@3.2.45: + resolution: {integrity: sha512-9HFfWQUIgthEardZqF/p1dK9bF5vvt5r9syNA0BpUPC00UFZHEcJ9CvgXHrzH2oOHcA2MErD4N++n0Ngufat+w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^3.0.0 + vue: ^3.2.25 + dependencies: + vue: 3.2.45 + dev: true + /@vue/babel-helper-vue-transform-on/1.0.2: resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} - dev: false + dev: true /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5: resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} dependencies: - '@babel/helper-module-imports': 7.16.7 - '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.20.5 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.19.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 '@vue/babel-helper-vue-transform-on': 1.0.2 camelcase: 6.3.0 html-tags: 3.2.0 @@ -2828,7 +2797,7 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false + dev: true /@vue/compiler-core/3.2.45: resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} @@ -3368,7 +3337,7 @@ packages: /camelcase/6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: false + dev: true /caniuse-lite/1.0.30001427: resolution: {integrity: sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ==} @@ -5435,6 +5404,7 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: true /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -5555,6 +5525,7 @@ packages: /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globals/13.15.0: resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} @@ -5691,7 +5662,7 @@ packages: /html-tags/3.2.0: resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} engines: {node: '>=8'} - dev: false + dev: true /http-cache-semantics/4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} @@ -6072,6 +6043,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /json-parse-better-errors/1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -6103,6 +6075,7 @@ packages: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true + dev: true /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -7588,7 +7561,7 @@ packages: /react-refresh/0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} - dev: false + dev: true /react-router-dom/6.4.3_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==} @@ -8356,8 +8329,8 @@ packages: engines: {node: '>= 0.4'} /svg-tags/1.0.0: - resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=} - dev: false + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true /systemjs/6.13.0: resolution: {integrity: sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==} @@ -8859,7 +8832,7 @@ packages: dependencies: '@docsearch/css': 3.3.0 '@docsearch/js': 3.3.0 - '@vitejs/plugin-vue': link:packages/plugin-vue + '@vitejs/plugin-vue': 3.2.0_vp6yl3plkfvihwzjgzhs7aemmy '@vue/devtools-api': 6.4.5 '@vueuse/core': 9.4.0_vue@3.2.45 body-scroll-lock: 4.0.0-beta.0 diff --git a/scripts/releaseUtils.ts b/scripts/releaseUtils.ts index daf51fc9180304..48dff6bde229b1 100644 --- a/scripts/releaseUtils.ts +++ b/scripts/releaseUtils.ts @@ -20,14 +20,7 @@ if (isDryRun) { console.log() } -export const packages = [ - 'vite', - 'create-vite', - 'plugin-legacy', - 'plugin-react', - 'plugin-vue', - 'plugin-vue-jsx' -] +export const packages = ['vite', 'create-vite', 'plugin-legacy'] export const versionIncrements: ReleaseType[] = [ 'patch', From 75dbca2789b0aca0729f74b0e69ed5a9c08eb1df Mon Sep 17 00:00:00 2001 From: Shigma Date: Sat, 3 Dec 2022 19:02:39 +0800 Subject: [PATCH 39/97] fix: cacheDir should be ignored from watch (#10242) Co-authored-by: sapphi-red --- packages/vite/src/node/build.ts | 1 + packages/vite/src/node/config.ts | 12 +++++++----- packages/vite/src/node/server/index.ts | 2 +- packages/vite/src/node/watch.ts | 4 ++++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 872b984f59b2e6..fe56a3b5f6fb60 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -620,6 +620,7 @@ async function doBuild( config.logger.info(colors.cyan(`\nwatching for file changes...`)) const resolvedChokidarOptions = resolveChokidarOptions( + config, config.build.watch.chokidar ) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 780c43bfadca2c..2f088b6f5fa2e4 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -530,11 +530,13 @@ export async function resolveConfig( // resolve cache directory const pkgPath = lookupFile(resolvedRoot, [`package.json`], { pathOnly: true }) - const cacheDir = config.cacheDir - ? path.resolve(resolvedRoot, config.cacheDir) - : pkgPath - ? path.join(path.dirname(pkgPath), `node_modules/.vite`) - : path.join(resolvedRoot, `.vite`) + const cacheDir = normalizePath( + config.cacheDir + ? path.resolve(resolvedRoot, config.cacheDir) + : pkgPath + ? path.join(path.dirname(pkgPath), `node_modules/.vite`) + : path.join(resolvedRoot, `.vite`) + ) const assetsFilter = config.assetsInclude && diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index db76f2852678d5..dfb78a4b38503c 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -315,7 +315,7 @@ export async function createServer( const httpsOptions = await resolveHttpsConfig(config.server.https) const { middlewareMode } = serverConfig - const resolvedWatchOptions = resolveChokidarOptions({ + const resolvedWatchOptions = resolveChokidarOptions(config, { disableGlobbing: true, ...serverConfig.watch }) diff --git a/packages/vite/src/node/watch.ts b/packages/vite/src/node/watch.ts index 47a455a0cd0e76..5b3332da2d3d1f 100644 --- a/packages/vite/src/node/watch.ts +++ b/packages/vite/src/node/watch.ts @@ -1,6 +1,9 @@ +import { escapePath } from 'fast-glob' import type { WatchOptions } from 'dep-types/chokidar' +import type { ResolvedConfig } from '.' export function resolveChokidarOptions( + config: ResolvedConfig, options: WatchOptions | undefined ): WatchOptions { const { ignored = [], ...otherOptions } = options ?? {} @@ -10,6 +13,7 @@ export function resolveChokidarOptions( '**/.git/**', '**/node_modules/**', '**/test-results/**', // Playwright + escapePath(config.cacheDir) + '/**', ...(Array.isArray(ignored) ? ignored : [ignored]) ], ignoreInitial: true, From c9274b4184528f1cfb250f9928a4d5bdbb25bb10 Mon Sep 17 00:00:00 2001 From: Andre Wiggins <459878+andrewiggins@users.noreply.github.com> Date: Sat, 3 Dec 2022 04:43:52 -0800 Subject: [PATCH 40/97] fix: add type for function localsConvention value (#11152) --- packages/vite/src/node/plugins/css.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 0277a6594a3445..7761249bfb524a 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -103,7 +103,16 @@ export interface CSSModulesOptions { /** * default: undefined */ - localsConvention?: 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly' + localsConvention?: + | 'camelCase' + | 'camelCaseOnly' + | 'dashes' + | 'dashesOnly' + | (( + originalClassName: string, + generatedClassName: string, + inputFile: string + ) => string) } const cssModuleRE = new RegExp(`\\.module${CSS_LANGS_RE.source}`) From 1682dccb907476cbe7c581b008faaed92a47bd47 Mon Sep 17 00:00:00 2001 From: patak Date: Sat, 3 Dec 2022 13:53:16 +0100 Subject: [PATCH 41/97] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 513 +++---------------------------------------------- 1 file changed, 26 insertions(+), 487 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e0888d3bd82af..83778031411770 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -791,74 +791,6 @@ importers: playground/preserve-symlinks/moduleA: specifiers: {} - playground/react: - specifiers: - '@vitejs/plugin-react': ^3.0.0-alpha.0 - jsx-entry: file:./jsx-entry - react: ^18.2.0 - react-dom: ^18.2.0 - dependencies: - jsx-entry: file:playground/react/jsx-entry - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - devDependencies: - '@vitejs/plugin-react': 3.0.0-alpha.2 - - playground/react-classic: - specifiers: - '@vitejs/plugin-react': ^3.0.0-alpha.0 - react: ^18.2.0 - react-dom: ^18.2.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - devDependencies: - '@vitejs/plugin-react': 3.0.0-alpha.2 - - playground/react-emotion: - specifiers: - '@babel/plugin-proposal-pipeline-operator': ^7.18.9 - '@emotion/babel-plugin': ^11.10.5 - '@emotion/react': ^11.10.5 - '@vitejs/plugin-react': ^3.0.0-alpha.0 - react: ^18.2.0 - react-dom: ^18.2.0 - react-switch: ^7.0.0 - dependencies: - '@emotion/react': 11.10.5_react@18.2.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-switch: 7.0.0_biqbaboplfbrettd7655fr4n2y - devDependencies: - '@babel/plugin-proposal-pipeline-operator': 7.18.9 - '@emotion/babel-plugin': 11.10.5 - '@vitejs/plugin-react': 3.0.0-alpha.2 - - playground/react-env: - specifiers: - '@vitejs/plugin-react': ^3.0.0-alpha.0 - react: ^18.2.0 - react-dom: ^18.2.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - devDependencies: - '@vitejs/plugin-react': 3.0.0-alpha.2 - - playground/react-sourcemap: - specifiers: - '@vitejs/plugin-react': ^3.0.0-alpha.0 - react: ^18.2.0 - react-dom: ^18.2.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - devDependencies: - '@vitejs/plugin-react': 3.0.0-alpha.2 - - playground/react/jsx-entry: - specifiers: {} - playground/resolve: specifiers: '@babel/runtime': ^7.20.6 @@ -1096,25 +1028,6 @@ importers: express: 4.18.2 pug: 3.0.2 - playground/ssr-react: - specifiers: - '@vitejs/plugin-react': ^3.0.0-alpha.0 - compression: ^1.7.4 - express: ^4.18.2 - react: ^18.2.0 - react-dom: ^18.2.0 - react-router-dom: ^6.4.3 - serve-static: ^1.15.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-router-dom: 6.4.3_biqbaboplfbrettd7655fr4n2y - devDependencies: - '@vitejs/plugin-react': 3.0.0-alpha.2 - compression: 1.7.4 - express: 4.18.2 - serve-static: 1.15.0 - playground/ssr-resolve: specifiers: entries: file:./entries @@ -1129,37 +1042,6 @@ importers: playground/ssr-resolve/pkg-exports: specifiers: {} - playground/ssr-vue: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - '@vitejs/plugin-vue-jsx': ^3.0.0-alpha.0 - compression: ^1.7.4 - dep-import-type: link:./dep-import-type - example-external-component: file:example-external-component - express: ^4.18.2 - pinia: ^2.0.27 - serve-static: ^1.15.0 - vue: ^3.2.45 - vue-router: ^4.1.6 - dependencies: - example-external-component: file:playground/ssr-vue/example-external-component - pinia: 2.0.27_vue@3.2.45 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - '@vitejs/plugin-vue-jsx': 3.0.0-alpha.0_vue@3.2.45 - compression: 1.7.4 - dep-import-type: link:dep-import-type - express: 4.18.2 - serve-static: 1.15.0 - - playground/ssr-vue/dep-import-type: - specifiers: {} - - playground/ssr-vue/example-external-component: - specifiers: {} - playground/ssr-webworker: specifiers: miniflare: ^1.4.1 @@ -1203,82 +1085,6 @@ importers: playground/tsconfig-json-load-error: specifiers: {} - playground/vue: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - js-yaml: ^4.1.0 - less: ^4.1.3 - lodash-es: ^4.17.21 - pug: ^3.0.2 - sass: ^1.56.1 - stylus: ^0.59.0 - vue: ^3.2.45 - dependencies: - lodash-es: 4.17.21 - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - js-yaml: 4.1.0 - less: 4.1.3 - pug: 3.0.2 - sass: 1.56.1 - stylus: 0.59.0 - - playground/vue-jsx: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - '@vitejs/plugin-vue-jsx': ^3.0.0-alpha.0 - vue: ^3.2.45 - dependencies: - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - '@vitejs/plugin-vue-jsx': 3.0.0-alpha.0_vue@3.2.45 - - playground/vue-legacy: - specifiers: - '@vitejs/plugin-legacy': workspace:* - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - vue: ^3.2.45 - dependencies: - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-legacy': link:../../packages/plugin-legacy - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - - playground/vue-lib: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - vue: ^3.2.45 - dependencies: - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - - playground/vue-server-origin: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - vue: ^3.2.45 - dependencies: - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - - playground/vue-sourcemap: - specifiers: - '@vitejs/plugin-vue': ^4.0.0-alpha.0 - less: ^4.1.3 - postcss-nested: ^5.0.6 - sass: ^1.56.1 - vue: ^3.2.45 - dependencies: - vue: 3.2.45 - devDependencies: - '@vitejs/plugin-vue': 4.0.0-alpha.2_vue@3.2.45 - less: 4.1.3 - postcss-nested: 5.0.6 - sass: 1.56.1 - playground/wasm: specifiers: {} @@ -1423,6 +1229,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 + dev: true /@babel/compat-data/7.20.1: resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} @@ -1531,6 +1338,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.5 + dev: true /@babel/helper-module-transforms/7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} @@ -1555,14 +1363,10 @@ packages: '@babel/types': 7.20.5 dev: true - /@babel/helper-plugin-utils/7.18.9: - resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-replace-supers/7.19.1: resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} @@ -1622,6 +1426,7 @@ packages: '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 + dev: true /@babel/parser/7.20.5: resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} @@ -1630,24 +1435,6 @@ packages: dependencies: '@babel/types': 7.20.5 - /@babel/plugin-proposal-pipeline-operator/7.18.9: - resolution: {integrity: sha512-Pc33e6m8f4MJhRXVCUwiKZNtEm+W2CUPHIL0lyJNtkp+w6d75CLw3gsBKQ81VAMUgT9jVPIEU8gwJ5nJgmJ1Ag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-pipeline-operator': 7.18.6 - dev: true - - /@babel/plugin-syntax-jsx/7.18.6: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} @@ -1658,15 +1445,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-pipeline-operator/7.18.6: - resolution: {integrity: sha512-pFtIdQomJtkTHWcNsGXhjJ5YUkL+AxJnP4G+Ol85UO6uT2fpHTPYLLE5bBeRA9cxf25qa/VKsJ3Fi67Gyqe3rA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} @@ -1735,17 +1513,12 @@ packages: - supports-color dev: true - /@babel/runtime/7.20.0: - resolution: {integrity: sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - /@babel/runtime/7.20.6: resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 + dev: false /@babel/standalone/7.20.6: resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==} @@ -1834,94 +1607,6 @@ packages: - '@algolia/client-search' dev: true - /@emotion/babel-plugin/11.10.5: - resolution: {integrity: sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.18.6 - '@babel/runtime': 7.20.0 - '@emotion/hash': 0.9.0 - '@emotion/memoize': 0.8.0 - '@emotion/serialize': 1.1.1 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.1.3 - - /@emotion/cache/11.10.5: - resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} - dependencies: - '@emotion/memoize': 0.8.0 - '@emotion/sheet': 1.2.1 - '@emotion/utils': 1.2.0 - '@emotion/weak-memoize': 0.3.0 - stylis: 4.1.3 - dev: false - - /@emotion/hash/0.9.0: - resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} - - /@emotion/memoize/0.8.0: - resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} - - /@emotion/react/11.10.5_react@18.2.0: - resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.20.0 - '@emotion/babel-plugin': 11.10.5 - '@emotion/cache': 11.10.5 - '@emotion/serialize': 1.1.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 - '@emotion/utils': 1.2.0 - '@emotion/weak-memoize': 0.3.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: false - - /@emotion/serialize/1.1.1: - resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} - dependencies: - '@emotion/hash': 0.9.0 - '@emotion/memoize': 0.8.0 - '@emotion/unitless': 0.8.0 - '@emotion/utils': 1.2.0 - csstype: 3.0.11 - - /@emotion/sheet/1.2.1: - resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} - dev: false - - /@emotion/unitless/0.8.0: - resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} - - /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@18.2.0: - resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - dev: false - - /@emotion/utils/1.2.0: - resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} - - /@emotion/weak-memoize/0.3.0: - resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} - dev: false - /@esbuild-kit/cjs-loader/2.4.0: resolution: {integrity: sha512-DBBCiHPgL2B/elUpvCDhNHXnlZQ9sfO2uyt1OJyAXKT41beQEFY4OxZ6gwS+ZesRCbZ6JV8M7GEyOPkjv8kdIw==} dependencies: @@ -2198,11 +1883,6 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@remix-run/router/1.0.3: - resolution: {integrity: sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q==} - engines: {node: '>=14'} - dev: false - /@rollup/plugin-alias/4.0.2_rollup@3.3.0: resolution: {integrity: sha512-1hv7dBOZZwo3SEupxn4UA2N0EDThqSSS+wI1St1TNTBtOZvUchyIClyHcnDcjjrReTPZ47Faedrhblv4n+T5UQ==} engines: {node: '>=14.0.0'} @@ -2535,9 +2215,6 @@ packages: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json/4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/picomatch/2.3.0: resolution: {integrity: sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==} dev: true @@ -2742,21 +2419,6 @@ packages: - supports-color dev: true - /@vitejs/plugin-vue-jsx/3.0.0-alpha.0_vue@3.2.45: - resolution: {integrity: sha512-301Bbw+Ap+1EPYB/e8uDYAFAE/MNGb2TPf7zHLxVUagVkG9hkjFU4raUFucXtQ/cB8NkWBqcP66luS7rHgBCxQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^3.0.0 - vue: ^3.0.0 - dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 - '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5 - vue: 3.2.45 - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-vue/3.2.0_vp6yl3plkfvihwzjgzhs7aemmy: resolution: {integrity: sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3039,6 +2701,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: true /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -3182,14 +2845,6 @@ packages: - debug dev: false - /babel-plugin-macros/3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.20.6 - cosmiconfig: 7.0.1 - resolve: 1.22.1 - /babel-walk/3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -3292,11 +2947,6 @@ packages: dicer: 0.3.0 dev: true - /bytes/3.0.0: - resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} - engines: {node: '>= 0.8'} - dev: true - /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -3315,6 +2965,7 @@ packages: /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + dev: true /camelcase-css/2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} @@ -3362,6 +3013,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -3477,6 +3129,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: true /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3487,6 +3140,7 @@ packages: /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3557,28 +3211,6 @@ packages: typescript: 4.6.4 dev: true - /compressible/2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression/1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3784,6 +3416,7 @@ packages: /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true /cookie-signature/1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} @@ -3820,16 +3453,6 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig/7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -3872,9 +3495,6 @@ packages: /csstype/2.6.20: resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} - /csstype/3.0.11: - resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} - /d/1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -4125,6 +3745,7 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: true /es-abstract/1.20.0: resolution: {integrity: sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==} @@ -4837,10 +4458,12 @@ packages: /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + dev: true /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + dev: true /eslint-define-config/1.12.0: resolution: {integrity: sha512-Kt9TcMbgsY9VRt7jIuw76KE/2RuD31eWB4Ubv6btXgU8NTSsbT6gZ8qzeiU+rAih/8sOl8Kt89spAZBMElu6qQ==} @@ -5246,9 +4869,6 @@ packages: transitivePeerDependencies: - supports-color - /find-root/1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - /find-up/2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -5596,6 +5216,7 @@ packages: /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -5634,12 +5255,6 @@ packages: engines: {node: '>=10.0.0'} dev: true - /hoist-non-react-statics/3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false - /hookable/5.4.1: resolution: {integrity: sha512-i808BglQ1OuSIcgPSZoWsDapCMLXKe5wLS6XZvIXpaBWdWLUZARM8vOLayu6cXewj5TSbaZaMzKnq+pRnfscEQ==} dev: true @@ -5750,6 +5365,7 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true /import-lazy/4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -5813,6 +5429,7 @@ packages: /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -6051,6 +5668,7 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -6186,6 +5804,7 @@ packages: /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true /lint-staged/13.0.4: resolution: {integrity: sha512-HxlHCXoYRsq9QCby5wFozmZW00hMs/9e3l+/dz6Qr8Kle4UH0kJTdABAbqhzG+3pcG6QjL9kz7NgGBfph+a5dw==} @@ -6841,11 +6460,6 @@ packages: dependencies: ee-first: 1.1.1 - /on-headers/1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -6965,6 +6579,7 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true /parse-json/4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} @@ -6982,6 +6597,7 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: true /parse-node-version/1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} @@ -7043,6 +6659,7 @@ packages: /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + dev: true /pathe/0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} @@ -7105,23 +6722,6 @@ packages: dev: true optional: true - /pinia/2.0.27_vue@3.2.45: - resolution: {integrity: sha512-nOnXP0OFeL8R4WjAHsterU+11vptda643gH02xKNtSCDPiRzVfRYodOLihLDoa0gL1KKuQKV+KOzEgdt3YvqEw==} - peerDependencies: - '@vue/composition-api': ^1.4.0 - typescript: '>=4.4.4' - vue: ^2.6.14 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - typescript: - optional: true - dependencies: - '@vue/devtools-api': 6.4.5 - vue: 3.2.45 - vue-demi: 0.13.1_vue@3.2.45 - dev: false - /pkg-types/0.3.5: resolution: {integrity: sha512-VkxCBFVgQhNHYk9subx+HOhZ4jzynH11ah63LZsprTKwPCWG9pfWBlkElWFbvkP9BVR0dP1jS9xPdhaHQNK74Q==} dependencies: @@ -7373,14 +6973,6 @@ packages: sisteransi: 1.0.5 dev: true - /prop-types/15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - dev: false - /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7554,49 +7146,11 @@ packages: scheduler: 0.23.0 dev: false - /react-is/16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - /react-refresh/0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} dev: true - /react-router-dom/6.4.3_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.0.3 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-router: 6.4.3_react@18.2.0 - dev: false - - /react-router/6.4.3_react@18.2.0: - resolution: {integrity: sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.0.3 - react: 18.2.0 - dev: false - - /react-switch/7.0.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==} - peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - dev: false - /react/18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -7703,6 +7257,7 @@ packages: /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false /regexp-ast-analysis/0.2.4: resolution: {integrity: sha512-8L7kOZQaKPxKKAwGuUZxTQtlO3WZ+tiXy4s6G6PKL6trbOXcZoumwC3AOHHFtI/xoSbNxt7jgLvCnP1UADLWqg==} @@ -7748,6 +7303,7 @@ packages: /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + dev: true /resolve.exports/1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} @@ -8083,10 +7639,6 @@ packages: source-map: 0.6.1 dev: true - /source-map/0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -8288,9 +7840,6 @@ packages: acorn: 8.8.1 dev: true - /stylis/4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - /stylus/0.59.0: resolution: {integrity: sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==} hasBin: true @@ -8316,6 +7865,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -8913,6 +8463,7 @@ packages: optional: true dependencies: vue: 3.2.45 + dev: true /vue-router/4.1.6_vue@3.2.45: resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} @@ -9338,12 +8889,6 @@ packages: dep-a: file:playground/preload/dep-a dev: true - file:playground/react/jsx-entry: - resolution: {directory: playground/react/jsx-entry, type: directory} - name: jsx-entry - version: 0.0.0 - dev: false - file:playground/ssr-deps/css-lib: resolution: {directory: playground/ssr-deps/css-lib, type: directory} name: '@vitejs/css-lib' @@ -9492,12 +9037,6 @@ packages: version: 0.0.0 dev: false - file:playground/ssr-vue/example-external-component: - resolution: {directory: playground/ssr-vue/example-external-component, type: directory} - name: example-external-component - version: 0.0.0 - dev: false - file:playground/worker/dep-to-optimize: resolution: {directory: playground/worker/dep-to-optimize, type: directory} name: dep-to-optimize From 3cd86be632f981a26e05e91b9ae4ff49c3d6842c Mon Sep 17 00:00:00 2001 From: Mehdi Achour Date: Sat, 3 Dec 2022 14:52:06 +0100 Subject: [PATCH 42/97] docs(guide/ssr): Fix link to react plugin repo (#11164) --- docs/guide/ssr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/ssr.md b/docs/guide/ssr.md index 0e50dcb2358dd5..b4826d6a45ccfd 100644 --- a/docs/guide/ssr.md +++ b/docs/guide/ssr.md @@ -19,7 +19,7 @@ If you have questions, the community is usually helpful at [Vite Discord's #ssr Vite provides built-in support for server-side rendering (SSR). The Vite playground contains example SSR setups for Vue 3 and React, which can be used as references for this guide: - [Vue 3](https://github.com/vitejs/vite-plugin-vue/tree/main/playground/ssr-vue) -- [React](https://github.com/vitejs/vite-plugin-vue/tree/main/playground/ssr-react) +- [React](https://github.com/vitejs/vite-plugin-react/tree/main/playground/ssr-react) ## Source Structure From fdc6f3ac008b9f9c2fa99cc104a767fa51e4f95d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 3 Dec 2022 05:56:18 -0800 Subject: [PATCH 43/97] fix: Revert "fix: missing js sourcemaps with rewritten imports broke debugging (#7767) (#9476)" (#11144) --- .../vite/src/node/server/transformRequest.ts | 20 +--------------- .../__tests__/js-sourcemap.spec.ts | 23 +------------------ playground/js-sourcemap/qux.js | 3 --- 3 files changed, 2 insertions(+), 44 deletions(-) delete mode 100644 playground/js-sourcemap/qux.js diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index db9909fcadc273..b7bed216348504 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -5,7 +5,6 @@ import getEtag from 'etag' import convertSourceMap from 'convert-source-map' import type { SourceDescription, SourceMap } from 'rollup' import colors from 'picocolors' -import MagicString from 'magic-string' import type { ViteDevServer } from '..' import { blankReplacer, @@ -19,8 +18,6 @@ import { } from '../utils' import { checkPublicFile } from '../plugins/asset' import { getDepsOptimizer } from '../optimizer' -import { isCSSRequest } from '../plugins/css' -import { SPECIAL_QUERY_RE } from '../constants' import { injectSourcesContent } from './sourcemap' import { isFileServingAllowed } from './middlewares/static' @@ -257,26 +254,11 @@ async function loadAndTransform( isDebug && debugTransform(`${timeFrom(transformStart)} ${prettyUrl}`) code = transformResult.code! map = transformResult.map - - // To enable IDE debugging, add a minimal sourcemap for modified JS files without one - if ( - !map && - mod.file && - mod.type === 'js' && - code !== originalCode && - !(isCSSRequest(id) && !SPECIAL_QUERY_RE.test(id)) // skip CSS : #9914 - ) { - map = new MagicString(code).generateMap({ source: mod.file }) - } } if (map && mod.file) { map = (typeof map === 'string' ? JSON.parse(map) : map) as SourceMap - if ( - map.mappings && - (!map.sourcesContent || - (map.sourcesContent as Array).includes(null)) - ) { + if (map.mappings && !map.sourcesContent) { await injectSourcesContent(map, mod.file, logger) } } diff --git a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts index 7f1a0004619599..a54bd761f13592 100644 --- a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts +++ b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts @@ -9,34 +9,13 @@ import { } from '~utils' if (!isBuild) { - test('js without import', async () => { + test('js', async () => { const res = await page.request.get(new URL('./foo.js', page.url()).href) const js = await res.text() const lines = js.split('\n') expect(lines[lines.length - 1].includes('//')).toBe(false) // expect no sourcemap }) - test('js', async () => { - const res = await page.request.get(new URL('./qux.js', page.url()).href) - const js = await res.text() - const map = extractSourcemap(js) - expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` - { - "mappings": "AAAA;AACA;AACA;", - "sources": [ - "/root/qux.js", - ], - "sourcesContent": [ - "import { foo } from './foo' - -export const qux = 'qux' -", - ], - "version": 3, - } - `) - }) - test('ts', async () => { const res = await page.request.get(new URL('./bar.ts', page.url()).href) const js = await res.text() diff --git a/playground/js-sourcemap/qux.js b/playground/js-sourcemap/qux.js deleted file mode 100644 index 1536173b2f96d0..00000000000000 --- a/playground/js-sourcemap/qux.js +++ /dev/null @@ -1,3 +0,0 @@ -import { foo } from './foo' - -export const qux = 'qux' From 1c1b3d58160d6aafb297f2f28ba77f3777d534bf Mon Sep 17 00:00:00 2001 From: patak Date: Sat, 3 Dec 2022 15:05:59 +0100 Subject: [PATCH 44/97] chore: redirect to new repositories when creating issues (#11163) --- .github/ISSUE_TEMPLATE/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c504c325f08040..f85f41ebbd3809 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,11 @@ blank_issues_enabled: false contact_links: + - name: Vite Plugin React Issues + url: https://github.com/vitejs/vite-plugin-react/issues/new/choose + about: React related issues should be reported on the vite-plugin-react repository. + - name: Vite Plugin Vue Issues + url: https://github.com/vitejs/vite-plugin-vue/issues/new/choose + about: Vue related issues should be reported on the vite-plugin-vue repository. - name: Discord Chat url: https://chat.vitejs.dev about: Ask questions and discuss with other Vite users in real time. From 859fe05fe31b5116a2caeb01fc5bd26ee3cfb15a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 3 Dec 2022 08:59:50 -0800 Subject: [PATCH 45/97] chore(deps): update to rollup 3.5 (#11165) --- package.json | 2 +- packages/vite/package.json | 2 +- pnpm-lock.yaml | 104 ++++++++++++++++++------------------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 91710cda3a3c80..d2c87177ef40b5 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "prompts": "^2.4.2", "resolve": "^1.22.1", "rimraf": "^3.0.2", - "rollup": "~3.3.0", + "rollup": "~3.5.1", "rollup-plugin-license": "^2.9.1", "semver": "^7.3.8", "simple-git-hooks": "^2.8.1", diff --git a/packages/vite/package.json b/packages/vite/package.json index f4cd6994fc57fe..19ede3dc8de006 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -61,7 +61,7 @@ "esbuild": "^0.15.9", "postcss": "^8.4.19", "resolve": "^1.22.1", - "rollup": "~3.3.0" + "rollup": "~3.5.1" }, "optionalDependencies": { "fsevents": "~2.3.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83778031411770..b1df91c095527c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: prompts: ^2.4.2 resolve: ^1.22.1 rimraf: ^3.0.2 - rollup: ~3.3.0 + rollup: ~3.5.1 rollup-plugin-license: ^2.9.1 semver: ^7.3.8 simple-git-hooks: ^2.8.1 @@ -68,7 +68,7 @@ importers: devDependencies: '@babel/types': 7.20.5 '@microsoft/api-extractor': 7.33.6 - '@rollup/plugin-typescript': 10.0.1_yqostt2xxzqa34b3zsesexa75y + '@rollup/plugin-typescript': 10.0.1_3yjxxnwzma6aagterhfmoy2fsm '@types/babel__core': 7.1.20 '@types/babel__standalone': 7.1.4 '@types/convert-source-map': 1.5.2 @@ -110,8 +110,8 @@ importers: prompts: 2.4.2 resolve: 1.22.1 rimraf: 3.0.2 - rollup: 3.3.0 - rollup-plugin-license: 2.9.1_rollup@3.3.0 + rollup: 3.5.1 + rollup-plugin-license: 2.9.1_rollup@3.5.1 semver: 7.3.8 simple-git-hooks: 2.8.1 tslib: 2.4.1 @@ -206,7 +206,7 @@ importers: postcss-modules: ^6.0.0 resolve: ^1.22.1 resolve.exports: ^1.1.0 - rollup: ~3.3.0 + rollup: ~3.5.1 sirv: ^2.0.2 source-map-js: ^1.0.2 source-map-support: ^0.5.21 @@ -221,7 +221,7 @@ importers: esbuild: 0.15.9 postcss: 8.4.19 resolve: 1.22.1 - rollup: 3.3.0 + rollup: 3.5.1 optionalDependencies: fsevents: 2.3.2 devDependencies: @@ -229,13 +229,13 @@ importers: '@babel/parser': 7.20.5 '@babel/types': 7.20.5 '@jridgewell/trace-mapping': 0.3.17 - '@rollup/plugin-alias': 4.0.2_rollup@3.3.0 - '@rollup/plugin-commonjs': 23.0.3_rollup@3.3.0 - '@rollup/plugin-dynamic-import-vars': 2.0.1_rollup@3.3.0 - '@rollup/plugin-json': 5.0.2_rollup@3.3.0 - '@rollup/plugin-node-resolve': 15.0.1_rollup@3.3.0 - '@rollup/plugin-typescript': 10.0.1_rollup@3.3.0+tslib@2.4.1 - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/plugin-alias': 4.0.2_rollup@3.5.1 + '@rollup/plugin-commonjs': 23.0.3_rollup@3.5.1 + '@rollup/plugin-dynamic-import-vars': 2.0.1_rollup@3.5.1 + '@rollup/plugin-json': 5.0.2_rollup@3.5.1 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.5.1 + '@rollup/plugin-typescript': 10.0.1_rollup@3.5.1+tslib@2.4.1 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 acorn: 8.8.1 acorn-walk: 8.2.0_acorn@8.8.1 cac: 6.7.14 @@ -1883,7 +1883,7 @@ packages: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@rollup/plugin-alias/4.0.2_rollup@3.3.0: + /@rollup/plugin-alias/4.0.2_rollup@3.5.1: resolution: {integrity: sha512-1hv7dBOZZwo3SEupxn4UA2N0EDThqSSS+wI1St1TNTBtOZvUchyIClyHcnDcjjrReTPZ47Faedrhblv4n+T5UQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1892,11 +1892,11 @@ packages: rollup: optional: true dependencies: - rollup: 3.3.0 + rollup: 3.5.1 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs/23.0.3_rollup@3.3.0: + /@rollup/plugin-commonjs/23.0.3_rollup@3.5.1: resolution: {integrity: sha512-31HxrT5emGfTyIfAs1lDQHj6EfYxTXcwtX5pIIhq+B/xZBNIqQ179d/CkYxlpYmFCxT78AeU4M8aL8Iv/IBxFA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1905,16 +1905,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.0.3 is-reference: 1.2.1 magic-string: 0.26.7 - rollup: 3.3.0 + rollup: 3.5.1 dev: true - /@rollup/plugin-dynamic-import-vars/2.0.1_rollup@3.3.0: + /@rollup/plugin-dynamic-import-vars/2.0.1_rollup@3.5.1: resolution: {integrity: sha512-//rFVnJhZqR1Bje7n9ZMlmX9M62AExcLVXmbTcq80CqFx97C6CXaghLYsPzcZ7w8JhbVdjBIRADyLNel0HHorg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1923,14 +1923,14 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 estree-walker: 2.0.2 fast-glob: 3.2.12 magic-string: 0.26.7 - rollup: 3.3.0 + rollup: 3.5.1 dev: true - /@rollup/plugin-json/5.0.2_rollup@3.3.0: + /@rollup/plugin-json/5.0.2_rollup@3.5.1: resolution: {integrity: sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1939,11 +1939,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 - rollup: 3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 + rollup: 3.5.1 dev: true - /@rollup/plugin-node-resolve/15.0.1_rollup@3.3.0: + /@rollup/plugin-node-resolve/15.0.1_rollup@3.5.1: resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1952,16 +1952,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 '@types/resolve': 1.20.2 deepmerge: 4.2.2 is-builtin-module: 3.2.0 is-module: 1.0.0 resolve: 1.22.1 - rollup: 3.3.0 + rollup: 3.5.1 dev: true - /@rollup/plugin-replace/5.0.0_rollup@3.3.0: + /@rollup/plugin-replace/5.0.0_rollup@3.5.1: resolution: {integrity: sha512-TiPmjMuBjQM+KLWK16O5TAM/eW4yXBYyQ17FbfeNzBC1t2kzX2aXoa8AlS9XTSmg6/2TNvkER1lMEEeN4Lhavw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1972,10 +1972,10 @@ packages: dependencies: '@rollup/pluginutils': 4.2.1 magic-string: 0.26.7 - rollup: 3.3.0 + rollup: 3.5.1 dev: true - /@rollup/plugin-typescript/10.0.1_rollup@3.3.0+tslib@2.4.1: + /@rollup/plugin-typescript/10.0.1_3yjxxnwzma6aagterhfmoy2fsm: resolution: {integrity: sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1988,13 +1988,14 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 resolve: 1.22.1 - rollup: 3.3.0 + rollup: 3.5.1 tslib: 2.4.1 + typescript: 4.6.4 dev: true - /@rollup/plugin-typescript/10.0.1_yqostt2xxzqa34b3zsesexa75y: + /@rollup/plugin-typescript/10.0.1_rollup@3.5.1+tslib@2.4.1: resolution: {integrity: sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2007,11 +2008,10 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 resolve: 1.22.1 - rollup: 3.3.0 + rollup: 3.5.1 tslib: 2.4.1 - typescript: 4.6.4 dev: true /@rollup/pluginutils/4.2.1: @@ -2022,7 +2022,7 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.3.0: + /@rollup/pluginutils/5.0.2_rollup@3.5.1: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2034,7 +2034,7 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.3.0 + rollup: 3.5.1 dev: true /@rushstack/node-core-library/3.53.2: @@ -7353,7 +7353,7 @@ packages: dependencies: glob: 7.2.0 - /rollup-plugin-dts/5.0.0_aoc4guvlpr5bfeyf2nus4ubkpu: + /rollup-plugin-dts/5.0.0_xrhsrqgnjc7c2kadwrhiuhiv5m: resolution: {integrity: sha512-OO8ayCvuJCKaQSShyVTARxGurVVk4ulzbuvz+0zFd1f93vlnWFU5pBMT7HFeS6uj7MvvZLx4kUAarGATSU1+Ng==} engines: {node: '>=v14'} peerDependencies: @@ -7361,13 +7361,13 @@ packages: typescript: ^4.1 dependencies: magic-string: 0.26.7 - rollup: 3.3.0 + rollup: 3.5.1 typescript: 4.8.4 optionalDependencies: '@babel/code-frame': 7.18.6 dev: true - /rollup-plugin-license/2.9.1_rollup@3.3.0: + /rollup-plugin-license/2.9.1_rollup@3.5.1: resolution: {integrity: sha512-C26f/bFXR52tzpBMllDnf5m2ETqRuyrrj3m8i3YY4imDwbXtunop+Lj1mO9mn/sZF8gKknOycN1Sm+kMGBd6RA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -7380,13 +7380,13 @@ packages: mkdirp: 1.0.4 moment: 2.29.3 package-name-regex: 2.0.6 - rollup: 3.3.0 + rollup: 3.5.1 spdx-expression-validate: 2.0.0 spdx-satisfies: 5.0.1 dev: true - /rollup/3.3.0: - resolution: {integrity: sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==} + /rollup/3.5.1: + resolution: {integrity: sha512-hdQWTvPeiAbM6SUkxV70HdGUVxsgsc+CLy5fuh4KdgUBJ0SowXiix8gANgXoG3wEuLwfoJhCT2V+WwxfWq9Ikw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -8262,12 +8262,12 @@ packages: resolution: {integrity: sha512-IkKPqzazcCNfwTSs5bDRS2bOvg1Zh9gPYQq/ruVarCoM4f7KXclSrcb0jyJiSU/5qhakZ8K5B2CzwX4ZaaVKdQ==} hasBin: true dependencies: - '@rollup/plugin-alias': 4.0.2_rollup@3.3.0 - '@rollup/plugin-commonjs': 23.0.3_rollup@3.3.0 - '@rollup/plugin-json': 5.0.2_rollup@3.3.0 - '@rollup/plugin-node-resolve': 15.0.1_rollup@3.3.0 - '@rollup/plugin-replace': 5.0.0_rollup@3.3.0 - '@rollup/pluginutils': 5.0.2_rollup@3.3.0 + '@rollup/plugin-alias': 4.0.2_rollup@3.5.1 + '@rollup/plugin-commonjs': 23.0.3_rollup@3.5.1 + '@rollup/plugin-json': 5.0.2_rollup@3.5.1 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.5.1 + '@rollup/plugin-replace': 5.0.0_rollup@3.5.1 + '@rollup/pluginutils': 5.0.2_rollup@3.5.1 chalk: 5.1.2 consola: 2.15.3 defu: 6.1.0 @@ -8284,8 +8284,8 @@ packages: pkg-types: 0.3.5 pretty-bytes: 6.0.0 rimraf: 3.0.2 - rollup: 3.3.0 - rollup-plugin-dts: 5.0.0_aoc4guvlpr5bfeyf2nus4ubkpu + rollup: 3.5.1 + rollup-plugin-dts: 5.0.0_xrhsrqgnjc7c2kadwrhiuhiv5m scule: 0.3.2 typescript: 4.8.4 untyped: 0.5.0 From e257e3b7fa48427aa30450d5a9b0e13151df5f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Sat, 3 Dec 2022 21:10:24 +0100 Subject: [PATCH 46/97] chore(client)!: remove never implemented hot.decline (#11036) --- docs/guide/api-hmr.md | 3 +-- packages/vite/src/client/client.ts | 3 ++- packages/vite/types/hot.d.ts | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/guide/api-hmr.md b/docs/guide/api-hmr.md index 59a689c6ca2223..e160810301dcf8 100644 --- a/docs/guide/api-hmr.md +++ b/docs/guide/api-hmr.md @@ -30,7 +30,6 @@ interface ViteHotContext { dispose(cb: (data: any) => void): void prune(cb: (data: any) => void): void - decline(): void invalidate(message?: string): void // `InferCustomEventPayload` provides types for built-in Vite events @@ -139,7 +138,7 @@ The `import.meta.hot.data` object is persisted across different instances of the ## `hot.decline()` -Calling `import.meta.hot.decline()` indicates this module is not hot-updatable, and the browser should perform a full reload if this module is encountered while propagating HMR updates. +This is currently a noop and is there for backward compatibility. This could change in the future if there is a new usage for it. To indicate that the module is not hot-updatable, use `hot.invalidate()`. ## `hot.invalidate(message?: string)` diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 18ee738f36d4e1..479f49fea53c98 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -550,7 +550,8 @@ export function createHotContext(ownerPath: string): ViteHotContext { pruneMap.set(ownerPath, cb) }, - // TODO + // Kept for backward compatibility (#11036) + // @ts-expect-error untyped // eslint-disable-next-line @typescript-eslint/no-empty-function decline() {}, diff --git a/packages/vite/types/hot.d.ts b/packages/vite/types/hot.d.ts index 76d054c3125651..03f96d196e2099 100644 --- a/packages/vite/types/hot.d.ts +++ b/packages/vite/types/hot.d.ts @@ -22,7 +22,6 @@ export interface ViteHotContext { dispose(cb: (data: any) => void): void prune(cb: (data: any) => void): void - decline(): void invalidate(message?: string): void on( From 134ce6817984bad0f5fb043481502531fee9b1db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Sun, 4 Dec 2022 08:19:06 +0100 Subject: [PATCH 47/97] chore: enable prettier trailing commas (#11167) --- .eslintrc.cjs | 97 ++++--- .github/renovate.json5 | 8 +- .prettierrc.json | 2 +- docs/.vitepress/config.ts | 134 ++++----- .../theme/components/AsideSponsors.vue | 2 +- docs/.vitepress/theme/composables/sponsor.ts | 10 +- docs/.vitepress/theme/index.ts | 4 +- docs/_data/team.js | 54 ++-- docs/config/build-options.md | 2 +- docs/config/dep-optimization-options.md | 4 +- docs/config/index.md | 4 +- docs/config/preview-options.md | 6 +- docs/config/server-options.md | 46 +-- docs/config/shared-options.md | 22 +- docs/guide/api-hmr.md | 6 +- docs/guide/api-javascript.md | 30 +- docs/guide/api-plugin.md | 56 ++-- docs/guide/backend-integration.md | 6 +- docs/guide/build.md | 30 +- docs/guide/dep-pre-bundling.md | 8 +- docs/guide/features.md | 34 +-- docs/guide/migration.md | 2 +- docs/guide/ssr.md | 4 +- docs/guide/using-plugins.md | 18 +- packages/create-vite/__tests__/cli.spec.ts | 8 +- packages/create-vite/build.config.ts | 14 +- packages/create-vite/src/index.ts | 102 +++---- .../template-lit-ts/vite.config.ts | 8 +- .../template-lit/src/my-element.js | 2 +- .../create-vite/template-lit/vite.config.js | 8 +- .../template-preact-ts/vite.config.ts | 2 +- .../template-preact/vite.config.js | 2 +- .../template-react-ts/src/main.tsx | 2 +- .../template-react-ts/vite.config.ts | 2 +- .../create-vite/template-react/src/main.jsx | 2 +- .../create-vite/template-react/vite.config.js | 2 +- .../template-svelte-ts/src/main.ts | 2 +- .../template-svelte-ts/svelte.config.js | 2 +- .../template-svelte-ts/vite.config.ts | 2 +- .../create-vite/template-svelte/src/main.js | 2 +- .../template-svelte/vite.config.js | 2 +- .../template-vue-ts/vite.config.ts | 2 +- .../src/components/HelloWorld.vue | 2 +- .../create-vite/template-vue/vite.config.js | 2 +- packages/plugin-legacy/README.md | 18 +- packages/plugin-legacy/build.config.ts | 4 +- packages/plugin-legacy/src/index.ts | 164 +++++------ packages/vite/bin/vite.js | 2 +- packages/vite/client.d.ts | 2 +- packages/vite/index.cjs | 4 +- packages/vite/rollup.config.ts | 86 +++--- packages/vite/scripts/prePatchTypes.ts | 2 +- packages/vite/scripts/util.ts | 8 +- packages/vite/src/client/client.ts | 42 +-- .../vite/src/node/__tests__/build.spec.ts | 138 ++++----- .../vite/src/node/__tests__/config.spec.ts | 124 ++++---- packages/vite/src/node/__tests__/dev.spec.ts | 8 +- .../src/node/__tests__/plugins/css.spec.ts | 50 ++-- .../src/node/__tests__/plugins/define.spec.ts | 12 +- .../plugins/dynamicImportVar/parse.test.ts | 4 +- .../node/__tests__/plugins/esbuild.spec.ts | 104 +++---- .../src/node/__tests__/plugins/import.spec.ts | 52 ++-- .../plugins/importGlob/fixture-a/index.ts | 24 +- .../plugins/importGlob/fixture.test.ts | 18 +- .../plugins/importGlob/parse.test.ts | 82 +++--- .../plugins/importGlob/utils.test.ts | 4 +- packages/vite/src/node/__tests__/scan.spec.ts | 14 +- .../vite/src/node/__tests__/utils.spec.ts | 62 ++-- packages/vite/src/node/build.ts | 148 +++++----- packages/vite/src/node/cli.ts | 60 ++-- packages/vite/src/node/config.ts | 164 +++++------ packages/vite/src/node/constants.ts | 20 +- packages/vite/src/node/env.ts | 18 +- packages/vite/src/node/http.ts | 20 +- packages/vite/src/node/index.ts | 30 +- packages/vite/src/node/logger.ts | 10 +- .../src/node/optimizer/esbuildDepPlugin.ts | 70 ++--- packages/vite/src/node/optimizer/index.ts | 168 +++++------ packages/vite/src/node/optimizer/optimizer.ts | 98 +++---- packages/vite/src/node/optimizer/scan.ts | 92 +++--- packages/vite/src/node/packages.ts | 12 +- packages/vite/src/node/plugin.ts | 12 +- packages/vite/src/node/plugins/asset.ts | 36 +-- .../src/node/plugins/assetImportMetaUrl.ts | 12 +- .../vite/src/node/plugins/clientInjections.ts | 4 +- .../src/node/plugins/completeSystemWrap.ts | 6 +- packages/vite/src/node/plugins/css.ts | 270 +++++++++--------- packages/vite/src/node/plugins/dataUri.ts | 4 +- packages/vite/src/node/plugins/define.ts | 16 +- .../src/node/plugins/dynamicImportVars.ts | 34 +-- packages/vite/src/node/plugins/ensureWatch.ts | 2 +- packages/vite/src/node/plugins/esbuild.ts | 60 ++-- packages/vite/src/node/plugins/html.ts | 188 ++++++------ .../vite/src/node/plugins/importAnalysis.ts | 108 +++---- .../src/node/plugins/importAnalysisBuild.ts | 54 ++-- .../vite/src/node/plugins/importMetaGlob.ts | 92 +++--- packages/vite/src/node/plugins/index.ts | 20 +- packages/vite/src/node/plugins/json.ts | 12 +- .../vite/src/node/plugins/loadFallback.ts | 2 +- packages/vite/src/node/plugins/manifest.ts | 12 +- packages/vite/src/node/plugins/metadata.ts | 4 +- .../src/node/plugins/modulePreloadPolyfill.ts | 2 +- .../vite/src/node/plugins/optimizedDeps.ts | 8 +- packages/vite/src/node/plugins/preAlias.ts | 16 +- packages/vite/src/node/plugins/reporter.ts | 42 +-- packages/vite/src/node/plugins/resolve.ts | 104 +++---- .../vite/src/node/plugins/splitVendorChunk.ts | 20 +- packages/vite/src/node/plugins/terser.ts | 12 +- packages/vite/src/node/plugins/wasm.ts | 8 +- packages/vite/src/node/plugins/worker.ts | 52 ++-- .../src/node/plugins/workerImportMetaUrl.ts | 18 +- packages/vite/src/node/preview.ts | 24 +- packages/vite/src/node/publicUtils.ts | 2 +- .../server/__tests__/pluginContainer.spec.ts | 26 +- .../node/server/__tests__/search-root.spec.ts | 8 +- packages/vite/src/node/server/hmr.ts | 62 ++-- packages/vite/src/node/server/index.ts | 80 +++--- .../vite/src/node/server/middlewares/base.ts | 8 +- .../node/server/middlewares/compression.ts | 8 +- .../vite/src/node/server/middlewares/error.ts | 14 +- .../node/server/middlewares/htmlFallback.ts | 8 +- .../src/node/server/middlewares/indexHtml.ts | 48 ++-- .../vite/src/node/server/middlewares/proxy.ts | 12 +- .../src/node/server/middlewares/static.ts | 16 +- .../src/node/server/middlewares/transform.ts | 34 +-- packages/vite/src/node/server/moduleGraph.ts | 16 +- packages/vite/src/node/server/openBrowser.ts | 18 +- .../vite/src/node/server/pluginContainer.ts | 96 +++---- packages/vite/src/node/server/searchRoot.ts | 4 +- packages/vite/src/node/server/send.ts | 8 +- packages/vite/src/node/server/sourcemap.ts | 10 +- .../vite/src/node/server/transformRequest.ts | 20 +- packages/vite/src/node/server/ws.ts | 24 +- .../node/ssr/__tests__/ssrLoadModule.spec.ts | 2 +- .../node/ssr/__tests__/ssrTransform.spec.ts | 117 ++++---- packages/vite/src/node/ssr/index.ts | 8 +- packages/vite/src/node/ssr/ssrExternal.ts | 34 +-- .../vite/src/node/ssr/ssrManifestPlugin.ts | 6 +- packages/vite/src/node/ssr/ssrModuleLoader.ts | 38 +-- packages/vite/src/node/ssr/ssrStacktrace.ts | 10 +- packages/vite/src/node/ssr/ssrTransform.ts | 50 ++-- packages/vite/src/node/utils.ts | 112 ++++---- packages/vite/src/node/watch.ts | 6 +- packages/vite/src/types/chokidar.d.ts | 10 +- packages/vite/src/types/connect.d.ts | 10 +- packages/vite/src/types/http-proxy.d.ts | 34 +-- packages/vite/src/types/shims.d.ts | 2 +- packages/vite/src/types/terser.d.ts | 6 +- packages/vite/src/types/ws.d.ts | 140 ++++----- packages/vite/types/customEvent.d.ts | 2 +- packages/vite/types/hot.d.ts | 6 +- packages/vite/types/importGlob.d.ts | 16 +- playground/alias/__tests__/alias.spec.ts | 12 +- playground/alias/index.html | 4 +- playground/alias/vite.config.js | 16 +- .../__tests__/assets-sanitize.spec.ts | 2 +- playground/assets-sanitize/vite.config.js | 4 +- playground/assets/__tests__/assets.spec.ts | 46 +-- .../relative-base-assets.spec.ts | 24 +- .../runtime-base/runtime-base-assets.spec.ts | 24 +- playground/assets/index.html | 2 +- .../assets/vite.config-relative-base.js | 10 +- playground/assets/vite.config-runtime-base.js | 22 +- playground/assets/vite.config.js | 8 +- .../__tests__/backend-integration.spec.ts | 10 +- .../backend-integration/postcss.config.js | 4 +- .../backend-integration/tailwind.config.js | 6 +- playground/backend-integration/vite.config.js | 14 +- playground/build-old/vite.config.js | 4 +- .../cli-module/__tests__/cli-module.spec.ts | 6 +- playground/cli-module/__tests__/serve.ts | 18 +- playground/cli-module/vite.config.js | 6 +- playground/cli/__tests__/serve.ts | 18 +- playground/cli/vite.config.js | 8 +- playground/config/__tests__/load.spec.ts | 2 +- .../config/packages/entry/vite.config.ts | 2 +- playground/css-codesplit-cjs/main.js | 2 +- playground/css-codesplit-cjs/vite.config.js | 10 +- playground/css-codesplit/main.js | 2 +- playground/css-codesplit/vite.config.js | 8 +- .../__tests__/css-dynamic-import.spec.ts | 30 +- .../css-dynamic-import/__tests__/serve.ts | 2 +- .../__tests__/css-sourcemap.spec.ts | 18 +- playground/css-sourcemap/vite.config.js | 24 +- playground/css/__tests__/css.spec.ts | 75 ++--- .../postcss-plugins-different-dir.spec.ts | 6 +- .../postcss-plugins-different-dir/serve.ts | 2 +- playground/css/main.js | 6 +- .../blue-app/postcss.config.js | 4 +- playground/css/postcss-caching/css.spec.ts | 6 +- .../green-app/postcss.config.js | 4 +- playground/css/postcss-caching/serve.ts | 2 +- playground/css/postcss.config.js | 16 +- playground/css/vite.config-relative-base.js | 10 +- playground/css/vite.config.js | 26 +- playground/define/__tests__/define.spec.ts | 24 +- playground/define/commonjs-dep/index.js | 2 +- playground/define/index.html | 4 +- playground/define/vite.config.js | 12 +- .../__tests__/dynamic-import.spec.ts | 20 +- playground/dynamic-import/alias/worker.js | 2 +- playground/dynamic-import/nested/index.js | 2 +- playground/dynamic-import/vite.config.js | 18 +- playground/env-nested/vite.config.js | 2 +- playground/env/__tests__/env.spec.ts | 4 +- playground/env/vite.config.js | 6 +- playground/extensions/vite.config.js | 4 +- .../external/__tests__/external.spec.ts | 2 +- playground/external/vite.config.js | 10 +- .../__tests__/file-delete-restore.spec.ts | 12 +- playground/file-delete-restore/index.html | 2 +- playground/file-delete-restore/vite.config.js | 4 +- .../fs-serve/__tests__/fs-serve.spec.ts | 8 +- playground/fs-serve/root/src/index.html | 4 +- playground/fs-serve/root/vite.config.js | 22 +- .../glob-import/__tests__/glob-import.spec.ts | 86 +++--- .../glob-import/escape/(parenthesis)/glob.js | 2 +- .../glob-import/escape/[brackets]/glob.js | 2 +- playground/glob-import/index.html | 20 +- playground/glob-import/vite.config.ts | 10 +- playground/hmr/__tests__/hmr.spec.ts | 130 ++++----- playground/hmr/hmr.ts | 8 +- playground/hmr/vite.config.ts | 10 +- playground/html/__tests__/html.spec.ts | 22 +- playground/html/valid.js | 2 +- playground/html/vite.config.js | 66 ++--- .../__tests__/js-sourcemap.spec.ts | 2 +- playground/js-sourcemap/vite.config.js | 4 +- playground/json/__tests__/json.spec.ts | 8 +- playground/json/server.js | 14 +- .../legacy/__tests__/client-and-ssr/serve.ts | 10 +- playground/legacy/__tests__/legacy.spec.ts | 18 +- playground/legacy/__tests__/ssr/serve.ts | 6 +- playground/legacy/immutable-chunk.js | 4 +- playground/legacy/main.js | 4 +- .../legacy/vite.config-custom-filename.js | 8 +- .../legacy/vite.config-multiple-output.js | 12 +- playground/legacy/vite.config.js | 14 +- playground/lib/__tests__/lib.spec.ts | 4 +- playground/lib/__tests__/serve.ts | 18 +- playground/lib/index.dist.html | 4 +- playground/lib/vite.config.js | 22 +- playground/lib/vite.dyimport.config.js | 6 +- playground/minify/vite.config.js | 4 +- .../multiple-entrypoints/vite.config.js | 8 +- playground/nested-deps/vite.config.js | 6 +- playground/object-hooks/vite.config.ts | 28 +- .../__tests__/optimize-deps.spec.ts | 34 +-- playground/optimize-deps/cjs-dynamic.js | 6 +- playground/optimize-deps/cjs.js | 6 +- playground/optimize-deps/dedupe.js | 6 +- .../dep-cjs-browser-field-bare/events-shim.js | 2 +- playground/optimize-deps/index.html | 2 +- playground/optimize-deps/vite.config.js | 44 +-- .../optimize-missing-deps/__test__/serve.ts | 4 +- playground/optimize-missing-deps/server.js | 8 +- playground/preload/__tests__/preload.spec.ts | 4 +- .../resolve-deps/preload-resolve-deps.spec.ts | 4 +- playground/preload/router.js | 8 +- .../preload/vite.config-preload-disabled.ts | 10 +- .../preload/vite.config-resolve-deps.ts | 14 +- playground/preload/vite.config.ts | 10 +- .../preserve-symlinks/moduleA/src/data.js | 2 +- .../__tests__/resolve-config.spec.ts | 2 +- playground/resolve-config/__tests__/serve.ts | 4 +- playground/resolve-config/root/vite.config.ts | 4 +- playground/resolve/__tests__/resolve.spec.ts | 14 +- playground/resolve/config-dep.js | 2 +- playground/resolve/vite.config.js | 28 +- playground/ssr-deps/__tests__/serve.ts | 2 +- .../ssr-deps/__tests__/ssr-deps.spec.ts | 26 +- .../ssr-deps/define-property-exports/index.js | 2 +- .../external-using-external-entry/index.js | 2 +- .../ssr-deps/object-assigned-exports/index.js | 2 +- .../only-object-assigned-exports/index.js | 2 +- .../index.js | 2 +- playground/ssr-deps/server.js | 20 +- playground/ssr-html/__tests__/serve.ts | 2 +- .../ssr-html/__tests__/ssr-html.spec.ts | 8 +- playground/ssr-html/server.js | 16 +- playground/ssr-noexternal/__tests__/serve.ts | 8 +- playground/ssr-noexternal/server.js | 12 +- playground/ssr-noexternal/vite.config.js | 12 +- playground/ssr-pug/__tests__/serve.ts | 2 +- playground/ssr-pug/__tests__/ssr-pug.spec.ts | 6 +- playground/ssr-pug/server.js | 10 +- playground/ssr-resolve/vite.config.js | 4 +- playground/ssr-webworker/__tests__/serve.ts | 6 +- playground/ssr-webworker/src/entry-worker.jsx | 8 +- playground/ssr-webworker/vite.config.js | 22 +- playground/ssr-webworker/worker.js | 4 +- .../tailwind-sourcemap/postcss.config.js | 4 +- .../tailwind-sourcemap/tailwind.config.js | 4 +- playground/tailwind-sourcemap/vite.config.js | 6 +- playground/tailwind/__test__/tailwind.spec.ts | 26 +- playground/tailwind/postcss.config.ts | 4 +- playground/tailwind/src/router.ts | 6 +- playground/tailwind/src/views/Page.vue | 4 +- playground/tailwind/tailwind.config.js | 8 +- playground/tailwind/vite.config.ts | 10 +- playground/test-utils.ts | 26 +- playground/transform-plugin/vite.config.js | 4 +- .../tsconfig-json-load-error.spec.ts | 6 +- .../__tests__/tsconfig-json.spec.ts | 16 +- playground/vitestGlobalSetup.ts | 6 +- playground/vitestSetup.ts | 28 +- playground/wasm/__tests__/wasm.spec.ts | 4 +- playground/wasm/index.html | 14 +- playground/wasm/vite.config.ts | 4 +- .../worker/__tests__/es/es-worker.spec.ts | 38 +-- .../worker/__tests__/iife/iife-worker.spec.ts | 26 +- .../relative-base-worker.spec.ts | 34 +-- .../sourcemap-hidden-worker.spec.ts | 38 +-- .../sourcemap-inline-worker.spec.ts | 28 +- .../sourcemap/sourcemap-worker.spec.ts | 40 +-- playground/worker/emit-chunk-nested-worker.js | 8 +- playground/worker/emit-chunk-sub-worker.js | 2 +- playground/worker/vite.config-es.js | 24 +- playground/worker/vite.config-iife.js | 30 +- .../worker/vite.config-relative-base.js | 26 +- playground/worker/vite.config-sourcemap.js | 18 +- playground/worker/worker-nested-worker.js | 8 +- playground/worker/worker/main-classic.js | 2 +- playground/worker/worker/main-format-es.js | 12 +- playground/worker/worker/main-module.js | 14 +- scripts/publishCI.ts | 4 +- scripts/release.ts | 16 +- scripts/releaseUtils.ts | 54 ++-- scripts/rollupLicensePlugin.mjs | 18 +- scripts/verifyCommit.ts | 6 +- vitest.config.e2e.ts | 10 +- vitest.config.ts | 8 +- 332 files changed, 3703 insertions(+), 3670 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 59a3579c80fc2e..bfdcd3d4f71cb8 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -8,13 +8,13 @@ module.exports = defineConfig({ 'eslint:recommended', 'plugin:node/recommended', 'plugin:@typescript-eslint/recommended', - 'plugin:regexp/recommended' + 'plugin:regexp/recommended', ], plugins: ['import', 'regexp'], parser: '@typescript-eslint/parser', parserOptions: { sourceType: 'module', - ecmaVersion: 2021 + ecmaVersion: 2021, }, rules: { eqeqeq: ['warn', 'always', { null: 'never' }], @@ -25,36 +25,36 @@ module.exports = defineConfig({ 'prefer-const': [ 'warn', { - destructuring: 'all' - } + destructuring: 'all', + }, ], 'node/no-missing-import': [ 'error', { allowModules: ['types', 'estree', 'less', 'sass', 'stylus'], - tryExtensions: ['.ts', '.js', '.jsx', '.tsx', '.d.ts'] - } + tryExtensions: ['.ts', '.js', '.jsx', '.tsx', '.d.ts'], + }, ], 'node/no-missing-require': [ 'error', { // for try-catching yarn pnp allowModules: ['pnpapi', 'vite'], - tryExtensions: ['.ts', '.js', '.jsx', '.tsx', '.d.ts'] - } + tryExtensions: ['.ts', '.js', '.jsx', '.tsx', '.d.ts'], + }, ], 'node/no-extraneous-import': [ 'error', { - allowModules: ['vite', 'less', 'sass', 'vitest'] - } + allowModules: ['vite', 'less', 'sass', 'vitest'], + }, ], 'node/no-extraneous-require': [ 'error', { - allowModules: ['vite'] - } + allowModules: ['vite'], + }, ], 'node/no-deprecated-api': 'off', 'node/no-unpublished-import': 'off', @@ -65,11 +65,11 @@ module.exports = defineConfig({ '@typescript-eslint/ban-types': 'off', // TODO: we should turn this on in a new PR '@typescript-eslint/explicit-module-boundary-types': [ 'error', - { allowArgumentsExplicitlyTypedAsAny: true } + { allowArgumentsExplicitlyTypedAsAny: true }, ], '@typescript-eslint/no-empty-function': [ 'error', - { allow: ['arrowFunctions'] } + { allow: ['arrowFunctions'] }, ], '@typescript-eslint/no-empty-interface': 'off', '@typescript-eslint/no-explicit-any': 'off', // maybe we should turn this on in a new PR @@ -80,12 +80,12 @@ module.exports = defineConfig({ '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/consistent-type-imports': [ 'error', - { prefer: 'type-imports' } + { prefer: 'type-imports' }, ], 'import/no-nodejs-modules': [ 'error', - { allow: builtinModules.map((mod) => `node:${mod}`) } + { allow: builtinModules.map((mod) => `node:${mod}`) }, ], 'import/no-duplicates': 'error', 'import/order': 'error', @@ -96,19 +96,24 @@ module.exports = defineConfig({ ignoreDeclarationSort: true, ignoreMemberSort: false, memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], - allowSeparatedGroups: false - } + allowSeparatedGroups: false, + }, ], - 'regexp/no-contradiction-with-assertion': 'error' + 'regexp/no-contradiction-with-assertion': 'error', }, overrides: [ { files: ['packages/**'], excludedFiles: '**/__tests__/**', rules: { - 'no-restricted-globals': ['error', 'require', '__dirname', '__filename'] - } + 'no-restricted-globals': [ + 'error', + 'require', + '__dirname', + '__filename', + ], + }, }, { files: 'packages/vite/**/*.*', @@ -116,36 +121,36 @@ module.exports = defineConfig({ 'node/no-restricted-require': [ 'error', Object.keys( - require('./packages/vite/package.json').devDependencies + require('./packages/vite/package.json').devDependencies, ).map((d) => ({ name: d, message: `devDependencies can only be imported using ESM syntax so ` + `that they are included in the rollup bundle. If you are trying to ` + - `lazy load a dependency, use (await import('dependency')).default instead.` - })) - ] - } + `lazy load a dependency, use (await import('dependency')).default instead.`, + })), + ], + }, }, { files: ['packages/vite/src/node/**'], rules: { - 'no-console': ['error'] - } + 'no-console': ['error'], + }, }, { files: ['packages/vite/src/types/**', '*.spec.ts'], rules: { - 'node/no-extraneous-import': 'off' - } + 'node/no-extraneous-import': 'off', + }, }, { files: ['packages/create-vite/template-*/**', '**/build.config.ts'], rules: { 'no-undef': 'off', 'node/no-missing-import': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off' - } + '@typescript-eslint/explicit-module-boundary-types': 'off', + }, }, { files: ['playground/**'], @@ -158,17 +163,17 @@ module.exports = defineConfig({ 'node/no-unsupported-features/es-builtins': [ 'error', { - version: '^14.18.0 || >=16.0.0' - } + version: '^14.18.0 || >=16.0.0', + }, ], 'node/no-unsupported-features/node-builtins': [ 'error', { - version: '^14.18.0 || >=16.0.0' - } + version: '^14.18.0 || >=16.0.0', + }, ], - '@typescript-eslint/explicit-module-boundary-types': 'off' - } + '@typescript-eslint/explicit-module-boundary-types': 'off', + }, }, { files: ['playground/**'], @@ -177,21 +182,21 @@ module.exports = defineConfig({ 'no-undef': 'off', 'no-empty': 'off', 'no-constant-condition': 'off', - '@typescript-eslint/no-empty-function': 'off' - } + '@typescript-eslint/no-empty-function': 'off', + }, }, { files: ['*.js', '*.mjs', '*.cjs'], rules: { - '@typescript-eslint/explicit-module-boundary-types': 'off' - } + '@typescript-eslint/explicit-module-boundary-types': 'off', + }, }, { files: ['*.d.ts'], rules: { - '@typescript-eslint/triple-slash-reference': 'off' - } - } + '@typescript-eslint/triple-slash-reference': 'off', + }, + }, ], - reportUnusedDisableDirectives: true + reportUnusedDisableDirectives: true, }) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 0014c768519180..ce03a1811793e8 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -8,8 +8,8 @@ "packageRules": [ { "depTypeList": ["peerDependencies"], - "enabled": false - } + "enabled": false, + }, ], "ignoreDeps": [ // manually bumping @@ -22,6 +22,6 @@ "source-map", // `source-map:v0.7.0+` needs more investigation "dotenv-expand", // `dotenv-expand:6.0.0+` has breaking changes (#6858) "kill-port", // `kill-port:^2.0.0 has perf issues (#8392) - "miniflare" // `miniflare:v2.0.0+` only supports node 16.7 - ] + "miniflare", // `miniflare:v2.0.0+` only supports node 16.7 + ], } diff --git a/.prettierrc.json b/.prettierrc.json index 3a87ddf358fad4..568ce1a24732d8 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -3,7 +3,7 @@ "tabWidth": 2, "singleQuote": true, "printWidth": 80, - "trailingComma": "none", + "trailingComma": "all", "overrides": [ { "files": ["*.json5"], diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 513378a37488b2..19dda3841c7031 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -36,19 +36,19 @@ const versionLinks = ((): DefaultTheme.NavItemWithLink[] => { return [ { text: 'Vite 3 Docs (release)', - link: 'https://vitejs.dev' + link: 'https://vitejs.dev', }, { text: 'Vite 2 Docs', - link: 'https://v2.vitejs.dev' - } + link: 'https://v2.vitejs.dev', + }, ] case 'release': return [ { text: 'Vite 2 Docs', - link: 'https://v2.vitejs.dev' - } + link: 'https://v2.vitejs.dev', + }, ] } })() @@ -73,13 +73,13 @@ export default defineConfig({ src: 'https://cdn.usefathom.com/script.js', 'data-site': 'CBDFBSLI', 'data-spa': 'auto', - defer: '' - } - ] + defer: '', + }, + ], ], vue: { - reactivityTransform: true + reactivityTransform: true, }, themeConfig: { @@ -87,13 +87,13 @@ export default defineConfig({ editLink: { pattern: 'https://github.com/vitejs/vite/edit/main/docs/:path', - text: 'Suggest changes to this page' + text: 'Suggest changes to this page', }, socialLinks: [ { icon: 'twitter', link: 'https://twitter.com/vite_js' }, { icon: 'discord', link: 'https://chat.vitejs.dev' }, - { icon: 'github', link: 'https://github.com/vitejs/vite' } + { icon: 'github', link: 'https://github.com/vitejs/vite' }, ], algolia: { @@ -101,13 +101,13 @@ export default defineConfig({ apiKey: 'deaab78bcdfe96b599497d25acc6460e', indexName: 'vitejs', searchParameters: { - facetFilters: ['tags:en'] - } + facetFilters: ['tags:en'], + }, }, carbonAds: { code: 'CEBIEK3N', - placement: 'vitejsdev' + placement: 'vitejsdev', }, localeLinks: { @@ -115,13 +115,13 @@ export default defineConfig({ items: [ { text: '简体中文', link: 'https://cn.vitejs.dev' }, { text: '日本語', link: 'https://ja.vitejs.dev' }, - { text: 'Español', link: 'https://es.vitejs.dev' } - ] + { text: 'Español', link: 'https://es.vitejs.dev' }, + ], }, footer: { message: `Released under the MIT License. (${commitRef})`, - copyright: 'Copyright © 2019-present Evan You & Vite Contributors' + copyright: 'Copyright © 2019-present Evan You & Vite Contributors', }, nav: [ @@ -136,36 +136,36 @@ export default defineConfig({ items: [ { text: 'Twitter', - link: 'https://twitter.com/vite_js' + link: 'https://twitter.com/vite_js', }, { text: 'Discord Chat', - link: 'https://chat.vitejs.dev' + link: 'https://chat.vitejs.dev', }, { text: 'Awesome Vite', - link: 'https://github.com/vitejs/awesome-vite' + link: 'https://github.com/vitejs/awesome-vite', }, { text: 'DEV Community', - link: 'https://dev.to/t/vite' + link: 'https://dev.to/t/vite', }, { text: 'Rollup Plugins Compat', - link: 'https://vite-rollup-plugins.patak.dev/' + link: 'https://vite-rollup-plugins.patak.dev/', }, { text: 'Changelog', - link: 'https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md' - } - ] - } - ] + link: 'https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md', + }, + ], + }, + ], }, { text: 'Version', - items: versionLinks - } + items: versionLinks, + }, ], sidebar: { @@ -175,87 +175,87 @@ export default defineConfig({ items: [ { text: 'Why Vite', - link: '/guide/why' + link: '/guide/why', }, { text: 'Getting Started', - link: '/guide/' + link: '/guide/', }, { text: 'Features', - link: '/guide/features' + link: '/guide/features', }, { text: 'CLI', - link: '/guide/cli' + link: '/guide/cli', }, { text: 'Using Plugins', - link: '/guide/using-plugins' + link: '/guide/using-plugins', }, { text: 'Dependency Pre-Bundling', - link: '/guide/dep-pre-bundling' + link: '/guide/dep-pre-bundling', }, { text: 'Static Asset Handling', - link: '/guide/assets' + link: '/guide/assets', }, { text: 'Building for Production', - link: '/guide/build' + link: '/guide/build', }, { text: 'Deploying a Static Site', - link: '/guide/static-deploy' + link: '/guide/static-deploy', }, { text: 'Env Variables and Modes', - link: '/guide/env-and-mode' + link: '/guide/env-and-mode', }, { text: 'Server-Side Rendering (SSR)', - link: '/guide/ssr' + link: '/guide/ssr', }, { text: 'Backend Integration', - link: '/guide/backend-integration' + link: '/guide/backend-integration', }, { text: 'Comparisons', - link: '/guide/comparisons' + link: '/guide/comparisons', }, { text: 'Troubleshooting', - link: '/guide/troubleshooting' + link: '/guide/troubleshooting', }, { text: 'Migration from v2', - link: '/guide/migration' - } - ] + link: '/guide/migration', + }, + ], }, { text: 'APIs', items: [ { text: 'Plugin API', - link: '/guide/api-plugin' + link: '/guide/api-plugin', }, { text: 'HMR API', - link: '/guide/api-hmr' + link: '/guide/api-hmr', }, { text: 'JavaScript API', - link: '/guide/api-javascript' + link: '/guide/api-javascript', }, { text: 'Config Reference', - link: '/config/' - } - ] - } + link: '/config/', + }, + ], + }, ], '/config/': [ { @@ -263,39 +263,39 @@ export default defineConfig({ items: [ { text: 'Configuring Vite', - link: '/config/' + link: '/config/', }, { text: 'Shared Options', - link: '/config/shared-options' + link: '/config/shared-options', }, { text: 'Server Options', - link: '/config/server-options' + link: '/config/server-options', }, { text: 'Build Options', - link: '/config/build-options' + link: '/config/build-options', }, { text: 'Preview Options', - link: '/config/preview-options' + link: '/config/preview-options', }, { text: 'Dep Optimization Options', - link: '/config/dep-optimization-options' + link: '/config/dep-optimization-options', }, { text: 'SSR Options', - link: '/config/ssr-options' + link: '/config/ssr-options', }, { text: 'Worker Options', - link: '/config/worker-options' - } - ] - } - ] - } - } + link: '/config/worker-options', + }, + ], + }, + ], + }, + }, }) diff --git a/docs/.vitepress/theme/components/AsideSponsors.vue b/docs/.vitepress/theme/components/AsideSponsors.vue index 789f1e0e8addbf..6e8e9c464a70f3 100644 --- a/docs/.vitepress/theme/components/AsideSponsors.vue +++ b/docs/.vitepress/theme/components/AsideSponsors.vue @@ -10,7 +10,7 @@ const sponsors = computed(() => { data?.value.map((sponsor) => { return { size: sponsor.size === 'big' ? 'mini' : 'xmini', - items: sponsor.items + items: sponsor.items, } }) ?? [] ) diff --git a/docs/.vitepress/theme/composables/sponsor.ts b/docs/.vitepress/theme/composables/sponsor.ts index b6a98ce18622bb..976dbcfb75103e 100644 --- a/docs/.vitepress/theme/composables/sponsor.ts +++ b/docs/.vitepress/theme/composables/sponsor.ts @@ -34,7 +34,7 @@ export function useSponsor() { }) return { - data + data, } } @@ -43,19 +43,19 @@ function mapSponsors(sponsors: Sponsors) { { tier: 'Platinum Sponsor', size: 'big', - items: mapImgPath(sponsors['platinum']) + items: mapImgPath(sponsors['platinum']), }, { tier: 'Gold Sponsors', size: 'medium', - items: mapImgPath(sponsors['gold']) - } + items: mapImgPath(sponsors['gold']), + }, ] } function mapImgPath(sponsors: Sponsor[]) { return sponsors.map((sponsor) => ({ ...sponsor, - img: `${dataHost}/images/${sponsor.img}` + img: `${dataHost}/images/${sponsor.img}`, })) } diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 39f1f2ffcae120..bef729b777e7c3 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -10,10 +10,10 @@ export default { Layout() { return h(Theme.Layout, null, { 'home-features-after': () => h(HomeSponsors), - 'aside-ads-before': () => h(AsideSponsors) + 'aside-ads-before': () => h(AsideSponsors), }) }, enhanceApp({ app }) { app.component('SvgImage', SvgImage) - } + }, } diff --git a/docs/_data/team.js b/docs/_data/team.js index fd386685af6bc1..8c01844f6cdc3f 100644 --- a/docs/_data/team.js +++ b/docs/_data/team.js @@ -8,9 +8,9 @@ export const core = [ desc: 'Independent open source developer, creator of Vue.js and Vite.', links: [ { icon: 'github', link: 'https://github.com/yyx990803' }, - { icon: 'twitter', link: 'https://twitter.com/youyuxi' } + { icon: 'twitter', link: 'https://twitter.com/youyuxi' }, ], - sponsor: 'https://github.com/sponsors/yyx990803' + sponsor: 'https://github.com/sponsors/yyx990803', }, { avatar: 'https://www.github.com/patak-dev.png', @@ -21,9 +21,9 @@ export const core = [ desc: 'Core team member of Vite. Team member of Vue.', links: [ { icon: 'github', link: 'https://github.com/patak-dev' }, - { icon: 'twitter', link: 'https://twitter.com/patak_dev' } + { icon: 'twitter', link: 'https://twitter.com/patak_dev' }, ], - sponsor: 'https://github.com/sponsors/patak-dev' + sponsor: 'https://github.com/sponsors/patak-dev', }, { avatar: 'https://www.github.com/antfu.png', @@ -34,9 +34,9 @@ export const core = [ desc: 'Core team member of Vite & Vue. Working at NuxtLabs.', links: [ { icon: 'github', link: 'https://github.com/antfu' }, - { icon: 'twitter', link: 'https://twitter.com/antfu7' } + { icon: 'twitter', link: 'https://twitter.com/antfu7' }, ], - sponsor: 'https://github.com/sponsors/antfu' + sponsor: 'https://github.com/sponsors/antfu', }, { avatar: 'https://github.com/sodatea.png', @@ -47,9 +47,9 @@ export const core = [ desc: 'Vite/Vite core team member. Full-time open sourcerer.', links: [ { icon: 'github', link: 'https://github.com/sodatea' }, - { icon: 'twitter', link: 'https://twitter.com/haoqunjiang' } + { icon: 'twitter', link: 'https://twitter.com/haoqunjiang' }, ], - sponsor: 'https://github.com/sponsors/sodatea' + sponsor: 'https://github.com/sponsors/sodatea', }, { avatar: 'https://github.com/Shinigami92.png', @@ -60,9 +60,9 @@ export const core = [ desc: 'Passionate TypeScript enthusiast working extensively with Vue SPA and pug.', links: [ { icon: 'github', link: 'https://github.com/Shinigami92' }, - { icon: 'twitter', link: 'https://twitter.com/Shini_92' } + { icon: 'twitter', link: 'https://twitter.com/Shini_92' }, ], - sponsor: 'https://github.com/sponsors/Shinigami92' + sponsor: 'https://github.com/sponsors/Shinigami92', }, { avatar: 'https://i.imgur.com/KMed6rQ.jpeg', @@ -71,9 +71,9 @@ export const core = [ desc: 'Dabbling in social ecommerce, meta frameworks, and board games', links: [ { icon: 'github', link: 'https://github.com/aleclarson' }, - { icon: 'twitter', link: 'https://twitter.com/retropragma' } + { icon: 'twitter', link: 'https://twitter.com/retropragma' }, ], - sponsor: 'https://github.com/sponsors/aleclarson' + sponsor: 'https://github.com/sponsors/aleclarson', }, { avatar: 'https://github.com/bluwy.png', @@ -82,9 +82,9 @@ export const core = [ desc: 'Svelte and Vite team member. Something something opinions.', links: [ { icon: 'github', link: 'https://github.com/bluwy' }, - { icon: 'twitter', link: 'https://twitter.com/bluwyoo' } + { icon: 'twitter', link: 'https://twitter.com/bluwyoo' }, ], - sponsor: 'https://bjornlu.com/sponsor' + sponsor: 'https://bjornlu.com/sponsor', }, { avatar: 'https://github.com/poyoho.png', @@ -93,8 +93,8 @@ export const core = [ desc: 'Frontend. Vite team member.', links: [ { icon: 'github', link: 'https://github.com/poyoho' }, - { icon: 'twitter', link: 'https://twitter.com/yoho_po' } - ] + { icon: 'twitter', link: 'https://twitter.com/yoho_po' }, + ], }, { avatar: 'https://github.com/sapphi-red.png', @@ -103,9 +103,9 @@ export const core = [ desc: 'Vite team member. Call me sapphi or green or midori ;)', links: [ { icon: 'github', link: 'https://github.com/sapphi-red' }, - { icon: 'twitter', link: 'https://twitter.com/sapphi_red' } + { icon: 'twitter', link: 'https://twitter.com/sapphi_red' }, ], - sponsor: 'https://github.com/sponsors/sapphi-red' + sponsor: 'https://github.com/sponsors/sapphi-red', }, { avatar: 'https://github.com/ygj6.png', @@ -114,8 +114,8 @@ export const core = [ desc: 'Web Developer. Vue & Vite team member', links: [ { icon: 'github', link: 'https://github.com/ygj6' }, - { icon: 'twitter', link: 'https://twitter.com/ygj_66' } - ] + { icon: 'twitter', link: 'https://twitter.com/ygj_66' }, + ], }, { avatar: 'https://github.com/Niputi.png', @@ -125,9 +125,9 @@ export const core = [ desc: 'weeb/javascript lover.', links: [ { icon: 'github', link: 'https://github.com/Niputi' }, - { icon: 'twitter', link: 'https://twitter.com/Niputi_' } - ] - } + { icon: 'twitter', link: 'https://twitter.com/Niputi_' }, + ], + }, ] export const emeriti = [ @@ -135,18 +135,18 @@ export const emeriti = [ avatar: 'https://github.com/underfin.png', name: 'underfin', title: 'Developer', - links: [{ icon: 'github', link: 'https://github.com/underfin' }] + links: [{ icon: 'github', link: 'https://github.com/underfin' }], }, { avatar: 'https://github.com/GrygrFlzr.png', name: 'GrygrFlzr', title: 'Developer', - links: [{ icon: 'github', link: 'https://github.com/GrygrFlzr' }] + links: [{ icon: 'github', link: 'https://github.com/GrygrFlzr' }], }, { avatar: 'https://github.com/nihalgonsalves.png', name: 'Nihal Gonsalves', title: 'Senior Software Engineer', - links: [{ icon: 'github', link: 'https://github.com/nihalgonsalves' }] - } + links: [{ icon: 'github', link: 'https://github.com/nihalgonsalves' }], + }, ] diff --git a/docs/config/build-options.md b/docs/config/build-options.md index 2c60c838fa54ee..ce80c6cf1aaf94 100644 --- a/docs/config/build-options.md +++ b/docs/config/build-options.md @@ -42,7 +42,7 @@ type ResolveModulePreloadDependenciesFn = ( deps: string[], context: { importer: string - } + }, ) => (string | { runtime?: string })[] ``` diff --git a/docs/config/dep-optimization-options.md b/docs/config/dep-optimization-options.md index 729b6df7cac3f9..d4b74f26ec327e 100644 --- a/docs/config/dep-optimization-options.md +++ b/docs/config/dep-optimization-options.md @@ -22,8 +22,8 @@ CommonJS dependencies should not be excluded from optimization. If an ESM depend ```js export default defineConfig({ optimizeDeps: { - include: ['esm-dep > cjs-dep'] - } + include: ['esm-dep > cjs-dep'], + }, }) ``` diff --git a/docs/config/index.md b/docs/config/index.md index 965d5bdf60133b..56fbd4be10d853 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -98,8 +98,8 @@ export default defineConfig(({ command, mode }) => { return { // vite config define: { - __APP_ENV__: env.APP_ENV - } + __APP_ENV__: env.APP_ENV, + }, } }) ``` diff --git a/docs/config/preview-options.md b/docs/config/preview-options.md index 3604afb9576d42..2b4b9841b46bda 100644 --- a/docs/config/preview-options.md +++ b/docs/config/preview-options.md @@ -29,11 +29,11 @@ Specify server port. Note if the port is already being used, Vite will automatic ```js export default defineConfig({ server: { - port: 3030 + port: 3030, }, preview: { - port: 8080 - } + port: 8080, + }, }) ``` diff --git a/docs/config/server-options.md b/docs/config/server-options.md index 89287fe53cf98a..ebcbcbe95a3521 100644 --- a/docs/config/server-options.md +++ b/docs/config/server-options.md @@ -68,8 +68,8 @@ Automatically open the app in the browser on server start. When the value is a s ```js export default defineConfig({ server: { - open: '/docs/index.html' - } + open: '/docs/index.html', + }, }) ``` @@ -97,13 +97,13 @@ export default defineConfig({ '/api': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, - rewrite: (path) => path.replace(/^\/api/, '') + rewrite: (path) => path.replace(/^\/api/, ''), }, // with RegEx: http://localhost:5173/fallback/ -> http://jsonplaceholder.typicode.com/ '^/fallback/.*': { target: 'http://jsonplaceholder.typicode.com', changeOrigin: true, - rewrite: (path) => path.replace(/^\/fallback/, '') + rewrite: (path) => path.replace(/^\/fallback/, ''), }, // Using the proxy instance '/api': { @@ -111,15 +111,15 @@ export default defineConfig({ changeOrigin: true, configure: (proxy, options) => { // proxy will be an instance of 'http-proxy' - } + }, }, // Proxying websockets or socket.io: ws://localhost:5173/socket.io -> ws://localhost:5174/socket.io '/socket.io': { target: 'ws://localhost:5174', - ws: true - } - } - } + ws: true, + }, + }, + }, }) ``` @@ -177,14 +177,14 @@ The Vite server watcher skips `.git/` and `node_modules/` directories by default export default defineConfig({ server: { watch: { - ignored: ['!**/node_modules/your-package-name/**'] - } + ignored: ['!**/node_modules/your-package-name/**'], + }, }, // The watched package must be excluded from optimization, // so that it can appear in the dependency graph and trigger hot reload. optimizeDeps: { - exclude: ['your-package-name'] - } + exclude: ['your-package-name'], + }, }) ``` @@ -222,7 +222,7 @@ async function createServer() { // Create Vite server in middleware mode const vite = await createViteServer({ server: { middlewareMode: true }, - appType: 'custom' // don't include Vite's default HTML handling middlewares + appType: 'custom', // don't include Vite's default HTML handling middlewares }) // Use vite's connect instance as middleware app.use(vite.middlewares) @@ -271,9 +271,9 @@ export default defineConfig({ server: { fs: { // Allow serving files from one level up to the project root - allow: ['..'] - } - } + allow: ['..'], + }, + }, }) ``` @@ -289,10 +289,10 @@ export default defineConfig({ // search up for workspace root searchForWorkspaceRoot(process.cwd()), // your custom rules - '/path/to/custom/allow' - ] - } - } + '/path/to/custom/allow', + ], + }, + }, }) ``` @@ -312,7 +312,7 @@ Defines the origin of the generated asset URLs during development. ```js export default defineConfig({ server: { - origin: 'http://127.0.0.1:8080' - } + origin: 'http://127.0.0.1:8080', + }, }) ``` diff --git a/docs/config/shared-options.md b/docs/config/shared-options.md index 671ef6be8f9924..fe04872a8770e4 100644 --- a/docs/config/shared-options.md +++ b/docs/config/shared-options.md @@ -69,7 +69,7 @@ Example: ```js const obj = { __NAME__, // Don't define object shorthand property names - __KEY__: value // Don't define object key + __KEY__: value, // Don't define object key } ``` @@ -233,13 +233,13 @@ export default defineConfig({ css: { preprocessorOptions: { scss: { - additionalData: `$injectedColor: orange;` + additionalData: `$injectedColor: orange;`, }, styl: { - additionalData: `$injectedColor ?= orange` - } - } - } + additionalData: `$injectedColor ?= orange`, + }, + }, + }, }) ``` @@ -277,8 +277,8 @@ Enabling this disables named imports. export default defineConfig({ esbuild: { jsxFactory: 'h', - jsxFragment: 'Fragment' - } + jsxFragment: 'Fragment', + }, }) ``` @@ -289,8 +289,8 @@ In addition, you can also use `esbuild.jsxInject` to automatically inject JSX he ```js export default defineConfig({ esbuild: { - jsxInject: `import React from 'react'` - } + jsxInject: `import React from 'react'`, + }, }) ``` @@ -315,7 +315,7 @@ The built-in asset type list can be found [here](https://github.com/vitejs/vite/ ```js export default defineConfig({ - assetsInclude: ['**/*.gltf'] + assetsInclude: ['**/*.gltf'], }) ``` diff --git a/docs/guide/api-hmr.md b/docs/guide/api-hmr.md index e160810301dcf8..1f23fdf8626a67 100644 --- a/docs/guide/api-hmr.md +++ b/docs/guide/api-hmr.md @@ -25,7 +25,7 @@ interface ViteHotContext { accept(dep: string, cb: (mod: ModuleNamespace | undefined) => void): void accept( deps: readonly string[], - cb: (mods: Array) => void + cb: (mods: Array) => void, ): void dispose(cb: (data: any) => void): void @@ -35,7 +35,7 @@ interface ViteHotContext { // `InferCustomEventPayload` provides types for built-in Vite events on( event: T, - cb: (payload: InferCustomEventPayload) => void + cb: (payload: InferCustomEventPayload) => void, ): void send(event: T, data?: InferCustomEventPayload): void } @@ -95,7 +95,7 @@ if (import.meta.hot) { ([newFooModule, newBarModule]) => { // The callback receives an array where only the updated module is non null // If the update was not succeful (syntax error for ex.), the array is empty - } + }, ) } ``` diff --git a/docs/guide/api-javascript.md b/docs/guide/api-javascript.md index 199507bc85b29e..935f509c5c1062 100644 --- a/docs/guide/api-javascript.md +++ b/docs/guide/api-javascript.md @@ -24,8 +24,8 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url)) configFile: false, root: __dirname, server: { - port: 1337 - } + port: 1337, + }, }) await server.listen() @@ -102,7 +102,7 @@ interface ViteDevServer { */ transformRequest( url: string, - options?: TransformOptions + options?: TransformOptions, ): Promise /** * Apply Vite built-in HTML transforms and any plugin HTML transforms. @@ -113,7 +113,7 @@ interface ViteDevServer { */ ssrLoadModule( url: string, - options?: { fixStacktrace?: boolean } + options?: { fixStacktrace?: boolean }, ): Promise> /** * Fix ssr error stacktrace. @@ -147,7 +147,7 @@ interface ViteDevServer { ```ts async function build( - inlineConfig?: InlineConfig + inlineConfig?: InlineConfig, ): Promise ``` @@ -167,8 +167,8 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url)) build: { rollupOptions: { // ... - } - } + }, + }, }) })() ``` @@ -190,8 +190,8 @@ import { preview } from 'vite' // any valid user config options, plus `mode` and `configFile` preview: { port: 8080, - open: true - } + open: true, + }, }) previewServer.printUrls() @@ -206,7 +206,7 @@ import { preview } from 'vite' async function resolveConfig( inlineConfig: InlineConfig, command: 'build' | 'serve', - defaultMode = 'development' + defaultMode = 'development', ): Promise ``` @@ -220,7 +220,7 @@ The `command` value is `serve` in dev (in the cli `vite`, `vite dev`, and `vite function mergeConfig( defaults: Record, overrides: Record, - isRoot = true + isRoot = true, ): Record ``` @@ -233,7 +233,7 @@ Deeply merge two Vite configs. `isRoot` represents the level within the Vite con ```ts function searchForWorkspaceRoot( current: string, - root = searchForPackageRoot(current) + root = searchForPackageRoot(current), ): string ``` @@ -254,7 +254,7 @@ Search for the root of the potential workspace if it meets the following conditi function loadEnv( mode: string, envDir: string, - prefixes: string | string[] = 'VITE_' + prefixes: string | string[] = 'VITE_', ): Record ``` @@ -283,7 +283,7 @@ async function transformWithEsbuild( code: string, filename: string, options?: EsbuildTransformOptions, - inMap?: object + inMap?: object, ): Promise ``` @@ -298,7 +298,7 @@ async function loadConfigFromFile( configEnv: ConfigEnv, configFile?: string, configRoot: string = process.cwd(), - logLevel?: LogLevel + logLevel?: LogLevel, ): Promise<{ path: string config: UserConfig diff --git a/docs/guide/api-plugin.md b/docs/guide/api-plugin.md index cd43e14c7200b2..2713a557fbc56b 100644 --- a/docs/guide/api-plugin.md +++ b/docs/guide/api-plugin.md @@ -48,7 +48,7 @@ import vitePlugin from 'vite-plugin-feature' import rollupPlugin from 'rollup-plugin-feature' export default defineConfig({ - plugins: [vitePlugin(), rollupPlugin()] + plugins: [vitePlugin(), rollupPlugin()], }) ``` @@ -72,7 +72,7 @@ import { defineConfig } from 'vite' import framework from 'vite-plugin-framework' export default defineConfig({ - plugins: [framework()] + plugins: [framework()], }) ``` @@ -95,10 +95,10 @@ export default function myPlugin() { if (fileRegex.test(id)) { return { code: compileFileToJS(src), - map: null // provide source map if available + map: null, // provide source map if available } } - } + }, } } ``` @@ -127,7 +127,7 @@ export default function myPlugin() { if (id === resolvedVirtualModuleId) { return `export const msg = "from virtual module"` } - } + }, } } ``` @@ -188,10 +188,10 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo config: () => ({ resolve: { alias: { - foo: 'bar' - } - } - }) + foo: 'bar', + }, + }, + }), }) // mutate the config directly (use only when merging doesn't work) @@ -201,7 +201,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo if (command === 'build') { config.root = 'foo' } - } + }, }) ``` @@ -237,7 +237,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo } else { // build: plugin invoked by Rollup } - } + }, } } ``` @@ -259,7 +259,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo server.middlewares.use((req, res, next) => { // custom handle request... }) - } + }, }) ``` @@ -278,7 +278,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo // custom handle request... }) } - } + }, }) ``` @@ -298,7 +298,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo if (server) { // use server... } - } + }, } } ``` @@ -323,7 +323,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo // custom handle request... }) } - } + }, }) ``` @@ -349,9 +349,9 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo transformIndexHtml(html) { return html.replace( /(.*?)<\/title>/, - `<title>Title replaced!` + `Title replaced!`, ) - } + }, } } ``` @@ -367,7 +367,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo server?: ViteDevServer bundle?: import('rollup').OutputBundle chunk?: import('rollup').OutputChunk - } + }, ) => | IndexHtmlTransformResult | void @@ -459,7 +459,7 @@ By default plugins are invoked for both serve and build. In cases where a plugin function myPlugin() { return { name: 'build-only', - apply: 'build' // or 'serve' + apply: 'build', // or 'serve' } } ``` @@ -496,9 +496,9 @@ export default defineConfig({ { ...example(), enforce: 'post', - apply: 'build' - } - ] + apply: 'build', + }, + ], }) ``` @@ -537,9 +537,9 @@ export default defineConfig({ // ... configureServer(server) { server.ws.send('my:greetings', { msg: 'hello' }) - } - } - ] + }, + }, + ], }) ``` @@ -583,9 +583,9 @@ export default defineConfig({ // reply only to the client (if needed) client.send('my:ack', { msg: 'Hi! I got your message!' }) }) - } - } - ] + }, + }, + ], }) ``` diff --git a/docs/guide/backend-integration.md b/docs/guide/backend-integration.md index 535ccbb3e6127b..16ca394ce769a4 100644 --- a/docs/guide/backend-integration.md +++ b/docs/guide/backend-integration.md @@ -16,9 +16,9 @@ If you need a custom integration, you can follow the steps in this guide to conf manifest: true, rollupOptions: { // overwrite default .html entry - input: '/path/to/main.js' - } - } + input: '/path/to/main.js', + }, + }, }) ``` diff --git a/docs/guide/build.md b/docs/guide/build.md index 5b6ac8824c0aa4..3ed66361803fc1 100644 --- a/docs/guide/build.md +++ b/docs/guide/build.md @@ -39,8 +39,8 @@ export default defineConfig({ build: { rollupOptions: { // https://rollupjs.org/guide/en/#big-list-of-options - } - } + }, + }, }) ``` @@ -54,7 +54,7 @@ You can configure how chunks are split using `build.rollupOptions.output.manualC // vite.config.js import { splitVendorChunkPlugin } from 'vite' export default defineConfig({ - plugins: [splitVendorChunkPlugin()] + plugins: [splitVendorChunkPlugin()], }) ``` @@ -70,8 +70,8 @@ export default defineConfig({ build: { watch: { // https://rollupjs.org/guide/en/#watch-options - } - } + }, + }, }) ``` @@ -105,10 +105,10 @@ export default defineConfig({ rollupOptions: { input: { main: resolve(__dirname, 'index.html'), - nested: resolve(__dirname, 'nested/index.html') - } - } - } + nested: resolve(__dirname, 'nested/index.html'), + }, + }, + }, }) ``` @@ -132,7 +132,7 @@ export default defineConfig({ entry: resolve(__dirname, 'lib/main.js'), name: 'MyLib', // the proper extensions will be added - fileName: 'my-lib' + fileName: 'my-lib', }, rollupOptions: { // make sure to externalize deps that shouldn't be bundled @@ -142,11 +142,11 @@ export default defineConfig({ // Provide global variables to use in the UMD build // for externalized deps globals: { - vue: 'Vue' - } - } - } - } + vue: 'Vue', + }, + }, + }, + }, }) ``` diff --git a/docs/guide/dep-pre-bundling.md b/docs/guide/dep-pre-bundling.md index e0cc12ccc41276..5d5d98cac72645 100644 --- a/docs/guide/dep-pre-bundling.md +++ b/docs/guide/dep-pre-bundling.md @@ -47,13 +47,13 @@ However, this requires the linked dep to be exported as ESM. If not, you can add ```js export default defineConfig({ optimizeDeps: { - include: ['linked-dep'] + include: ['linked-dep'], }, build: { commonjsOptions: { - include: [/linked-dep/, /node_modules/] - } - } + include: [/linked-dep/, /node_modules/], + }, + }, }) ``` diff --git a/docs/guide/features.md b/docs/guide/features.md index e0aeff3d9fb86b..60cad69a6ce0be 100644 --- a/docs/guide/features.md +++ b/docs/guide/features.md @@ -140,8 +140,8 @@ import { defineConfig } from 'vite' export default defineConfig({ esbuild: { jsxFactory: 'h', - jsxFragment: 'Fragment' - } + jsxFragment: 'Fragment', + }, }) ``` @@ -155,8 +155,8 @@ import { defineConfig } from 'vite' export default defineConfig({ esbuild: { - jsxInject: `import React from 'react'` - } + jsxInject: `import React from 'react'`, + }, }) ``` @@ -294,7 +294,7 @@ The above will be transformed into the following: // code produced by vite const modules = { './dir/foo.js': () => import('./dir/foo.js'), - './dir/bar.js': () => import('./dir/bar.js') + './dir/bar.js': () => import('./dir/bar.js'), } ``` @@ -322,7 +322,7 @@ import * as __glob__0_0 from './dir/foo.js' import * as __glob__0_1 from './dir/bar.js' const modules = { './dir/foo.js': __glob__0_0, - './dir/bar.js': __glob__0_1 + './dir/bar.js': __glob__0_1, } ``` @@ -340,7 +340,7 @@ The above will be transformed into the following: // code produced by vite const modules = { './dir/foo.js': 'export default "foo"\n', - './dir/bar.js': 'export default "bar"\n' + './dir/bar.js': 'export default "bar"\n', } ``` @@ -365,7 +365,7 @@ const modules = import.meta.glob(['./dir/*.js', '!**/bar.js']) ```js // code produced by vite const modules = { - './dir/foo.js': () => import('./dir/foo.js') + './dir/foo.js': () => import('./dir/foo.js'), } ``` @@ -381,7 +381,7 @@ const modules = import.meta.glob('./dir/*.js', { import: 'setup' }) // code produced by vite const modules = { './dir/foo.js': () => import('./dir/foo.js').then((m) => m.setup), - './dir/bar.js': () => import('./dir/bar.js').then((m) => m.setup) + './dir/bar.js': () => import('./dir/bar.js').then((m) => m.setup), } ``` @@ -397,7 +397,7 @@ import { setup as __glob__0_0 } from './dir/foo.js' import { setup as __glob__0_1 } from './dir/bar.js' const modules = { './dir/foo.js': __glob__0_0, - './dir/bar.js': __glob__0_1 + './dir/bar.js': __glob__0_1, } ``` @@ -406,7 +406,7 @@ Set `import` to `default` to import the default export. ```ts const modules = import.meta.glob('./dir/*.js', { import: 'default', - eager: true + eager: true, }) ``` @@ -416,7 +416,7 @@ import __glob__0_0 from './dir/foo.js' import __glob__0_1 from './dir/bar.js' const modules = { './dir/foo.js': __glob__0_0, - './dir/bar.js': __glob__0_1 + './dir/bar.js': __glob__0_1, } ``` @@ -426,7 +426,7 @@ You can also use the `query` option to provide custom queries to imports for oth ```ts const modules = import.meta.glob('./dir/*.js', { - query: { foo: 'bar', bar: true } + query: { foo: 'bar', bar: true }, }) ``` @@ -436,7 +436,7 @@ const modules = { './dir/foo.js': () => import('./dir/foo.js?foo=bar&bar=true').then((m) => m.setup), './dir/bar.js': () => - import('./dir/bar.js?foo=bar&bar=true').then((m) => m.setup) + import('./dir/bar.js?foo=bar&bar=true').then((m) => m.setup), } ``` @@ -478,8 +478,8 @@ init({ imports: { someFunc: () => { /* ... */ - } - } + }, + }, }).then(() => { /* ... */ }) @@ -506,7 +506,7 @@ The worker constructor also accepts options, which can be used to create "module ```ts const worker = new Worker(new URL('./worker.js', import.meta.url), { - type: 'module' + type: 'module', }) ``` diff --git a/docs/guide/migration.md b/docs/guide/migration.md index c47207686af609..3fa4683a5b4d1f 100644 --- a/docs/guide/migration.md +++ b/docs/guide/migration.md @@ -98,7 +98,7 @@ Since Vite v3, we recommend manually creating your certificates. If you still wa import basicSsl from '@vitejs/plugin-basic-ssl' export default { - plugins: [basicSsl()] + plugins: [basicSsl()], } ``` diff --git a/docs/guide/ssr.md b/docs/guide/ssr.md index b4826d6a45ccfd..b4eee64df7166e 100644 --- a/docs/guide/ssr.md +++ b/docs/guide/ssr.md @@ -107,7 +107,7 @@ app.use('*', async (req, res, next) => { // 1. Read index.html let template = fs.readFileSync( path.resolve(__dirname, 'index.html'), - 'utf-8' + 'utf-8', ) // 2. Apply Vite HTML transforms. This injects the Vite HMR client, and @@ -237,7 +237,7 @@ export function mySSRPlugin() { if (options?.ssr) { // perform ssr-specific transform... } - } + }, } } ``` diff --git a/docs/guide/using-plugins.md b/docs/guide/using-plugins.md index b05c8c9f2223d3..8f6887594a197a 100644 --- a/docs/guide/using-plugins.md +++ b/docs/guide/using-plugins.md @@ -18,9 +18,9 @@ import { defineConfig } from 'vite' export default defineConfig({ plugins: [ legacy({ - targets: ['defaults', 'not IE 11'] - }) - ] + targets: ['defaults', 'not IE 11'], + }), + ], }) ``` @@ -55,9 +55,9 @@ export default defineConfig({ plugins: [ { ...image(), - enforce: 'pre' - } - ] + enforce: 'pre', + }, + ], }) ``` @@ -76,9 +76,9 @@ export default defineConfig({ plugins: [ { ...typescript2(), - apply: 'build' - } - ] + apply: 'build', + }, + ], }) ``` diff --git a/packages/create-vite/__tests__/cli.spec.ts b/packages/create-vite/__tests__/cli.spec.ts index f5d666c3577e28..35239f2707c2c3 100644 --- a/packages/create-vite/__tests__/cli.spec.ts +++ b/packages/create-vite/__tests__/cli.spec.ts @@ -11,7 +11,7 @@ const genPath = join(__dirname, projectName) const run = ( args: string[], - options: SyncOptions = {} + options: SyncOptions = {}, ): ExecaSyncReturnValue => { return execaCommandSync(`node ${CLI_PATH} ${args.join(' ')}`, options) } @@ -59,7 +59,7 @@ test('prompts for the framework on not supplying a value for --template', () => test('prompts for the framework on supplying an invalid template', () => { const { stdout } = run([projectName, '--template', 'unknown']) expect(stdout).toContain( - `"unknown" isn't a valid template. Please choose from below:` + `"unknown" isn't a valid template. Please choose from below:`, ) }) @@ -77,7 +77,7 @@ test('asks to overwrite non-empty current directory', () => { test('successfully scaffolds a project based on vue starter template', () => { const { stdout } = run([projectName, '--template', 'vue'], { - cwd: __dirname + cwd: __dirname, }) const generatedFiles = readdirSync(genPath).sort() @@ -88,7 +88,7 @@ test('successfully scaffolds a project based on vue starter template', () => { test('works with the -t alias', () => { const { stdout } = run([projectName, '-t', 'vue'], { - cwd: __dirname + cwd: __dirname, }) const generatedFiles = readdirSync(genPath).sort() diff --git a/packages/create-vite/build.config.ts b/packages/create-vite/build.config.ts index 2c39d19d427de6..3ec4f99bab2213 100644 --- a/packages/create-vite/build.config.ts +++ b/packages/create-vite/build.config.ts @@ -11,12 +11,12 @@ export default defineBuildConfig({ rollup: { inlineDependencies: true, esbuild: { - minify: true - } + minify: true, + }, }, alias: { // we can always use non-transpiled code since we support 14.18.0+ - prompts: 'prompts/lib/index.js' + prompts: 'prompts/lib/index.js', }, hooks: { 'rollup:options'(ctx, options) { @@ -27,9 +27,9 @@ export default defineBuildConfig({ licensePlugin( path.resolve(__dirname, './LICENSE'), 'create-vite license', - 'create-vite' - ) + 'create-vite', + ), ) - } - } + }, + }, }) diff --git a/packages/create-vite/src/index.ts b/packages/create-vite/src/index.ts index ce800f3eb23a24..f6bae6ebe82407 100755 --- a/packages/create-vite/src/index.ts +++ b/packages/create-vite/src/index.ts @@ -13,7 +13,7 @@ import { magenta, red, reset, - yellow + yellow, } from 'kolorist' // Avoids autoconversion to number of the project name by defining that the args @@ -47,14 +47,14 @@ const FRAMEWORKS: Framework[] = [ { name: 'vanilla', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'vanilla-ts', display: 'TypeScript', - color: blue - } - ] + color: blue, + }, + ], }, { name: 'vue', @@ -64,26 +64,26 @@ const FRAMEWORKS: Framework[] = [ { name: 'vue', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'vue-ts', display: 'TypeScript', - color: blue + color: blue, }, { name: 'custom-create-vue', display: 'Customize with create-vue ↗', color: green, - customCommand: 'npm create vue@latest TARGET_DIR' + customCommand: 'npm create vue@latest TARGET_DIR', }, { name: 'custom-nuxt', display: 'Nuxt ↗', color: lightGreen, - customCommand: 'npm exec nuxi init TARGET_DIR' - } - ] + customCommand: 'npm exec nuxi init TARGET_DIR', + }, + ], }, { name: 'react', @@ -93,14 +93,14 @@ const FRAMEWORKS: Framework[] = [ { name: 'react', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'react-ts', display: 'TypeScript', - color: blue - } - ] + color: blue, + }, + ], }, { name: 'preact', @@ -110,14 +110,14 @@ const FRAMEWORKS: Framework[] = [ { name: 'preact', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'preact-ts', display: 'TypeScript', - color: blue - } - ] + color: blue, + }, + ], }, { name: 'lit', @@ -127,14 +127,14 @@ const FRAMEWORKS: Framework[] = [ { name: 'lit', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'lit-ts', display: 'TypeScript', - color: blue - } - ] + color: blue, + }, + ], }, { name: 'svelte', @@ -144,20 +144,20 @@ const FRAMEWORKS: Framework[] = [ { name: 'svelte', display: 'JavaScript', - color: yellow + color: yellow, }, { name: 'svelte-ts', display: 'TypeScript', - color: blue + color: blue, }, { name: 'custom-svelte-kit', display: 'SvelteKit ↗', color: red, - customCommand: 'npm create svelte@latest TARGET_DIR' - } - ] + customCommand: 'npm create svelte@latest TARGET_DIR', + }, + ], }, { name: 'others', @@ -168,18 +168,18 @@ const FRAMEWORKS: Framework[] = [ name: 'create-vite-extra', display: 'create-vite-extra ↗', color: reset, - customCommand: 'npm create vite-extra@latest TARGET_DIR' - } - ] - } + customCommand: 'npm create vite-extra@latest TARGET_DIR', + }, + ], + }, ] const TEMPLATES = FRAMEWORKS.map( - (f) => (f.variants && f.variants.map((v) => v.name)) || [f.name] + (f) => (f.variants && f.variants.map((v) => v.name)) || [f.name], ).reduce((a, b) => a.concat(b), []) const renameFiles: Record = { - _gitignore: '.gitignore' + _gitignore: '.gitignore', } const defaultTargetDir = 'vite-project' @@ -206,7 +206,7 @@ async function init() { initial: defaultTargetDir, onState: (state) => { targetDir = formatTargetDir(state.value) || defaultTargetDir - } + }, }, { type: () => @@ -216,7 +216,7 @@ async function init() { (targetDir === '.' ? 'Current directory' : `Target directory "${targetDir}"`) + - ` is not empty. Remove existing files and continue?` + ` is not empty. Remove existing files and continue?`, }, { type: (_, { overwrite }: { overwrite?: boolean }) => { @@ -225,7 +225,7 @@ async function init() { } return null }, - name: 'overwriteChecker' + name: 'overwriteChecker', }, { type: () => (isValidPackageName(getProjectName()) ? null : 'text'), @@ -233,7 +233,7 @@ async function init() { message: reset('Package name:'), initial: () => toValidPackageName(getProjectName()), validate: (dir) => - isValidPackageName(dir) || 'Invalid package.json name' + isValidPackageName(dir) || 'Invalid package.json name', }, { type: @@ -242,7 +242,7 @@ async function init() { message: typeof argTemplate === 'string' && !TEMPLATES.includes(argTemplate) ? reset( - `"${argTemplate}" isn't a valid template. Please choose from below: ` + `"${argTemplate}" isn't a valid template. Please choose from below: `, ) : reset('Select a framework:'), initial: 0, @@ -250,9 +250,9 @@ async function init() { const frameworkColor = framework.color return { title: frameworkColor(framework.display || framework.name), - value: framework + value: framework, } - }) + }), }, { type: (framework: Framework) => @@ -264,16 +264,16 @@ async function init() { const variantColor = variant.color return { title: variantColor(variant.display || variant.name), - value: variant.name + value: variant.name, } - }) - } + }), + }, ], { onCancel: () => { throw new Error(red('✖') + ' Operation cancelled') - } - } + }, + }, ) } catch (cancelled: any) { console.log(cancelled.message) @@ -322,7 +322,7 @@ async function init() { const [command, ...args] = fullCustomCommand.split(' ') const { status } = spawn.sync(command, args, { - stdio: 'inherit' + stdio: 'inherit', }) process.exit(status ?? 0) } @@ -332,7 +332,7 @@ async function init() { const templateDir = path.resolve( fileURLToPath(import.meta.url), '../..', - `template-${template}` + `template-${template}`, ) const write = (file: string, content?: string) => { @@ -350,7 +350,7 @@ async function init() { } const pkg = JSON.parse( - fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8') + fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8'), ) pkg.name = packageName || getProjectName() @@ -389,7 +389,7 @@ function copy(src: string, dest: string) { function isValidPackageName(projectName: string) { return /^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test( - projectName + projectName, ) } @@ -434,7 +434,7 @@ function pkgFromUserAgent(userAgent: string | undefined) { const pkgSpecArr = pkgSpec.split('/') return { name: pkgSpecArr[0], - version: pkgSpecArr[1] + version: pkgSpecArr[1], } } diff --git a/packages/create-vite/template-lit-ts/vite.config.ts b/packages/create-vite/template-lit-ts/vite.config.ts index 14639f4b1c5178..fe69491e390523 100644 --- a/packages/create-vite/template-lit-ts/vite.config.ts +++ b/packages/create-vite/template-lit-ts/vite.config.ts @@ -5,10 +5,10 @@ export default defineConfig({ build: { lib: { entry: 'src/my-element.ts', - formats: ['es'] + formats: ['es'], }, rollupOptions: { - external: /^lit/ - } - } + external: /^lit/, + }, + }, }) diff --git a/packages/create-vite/template-lit/src/my-element.js b/packages/create-vite/template-lit/src/my-element.js index 7c0c0426e49116..effd159f8b5f2d 100644 --- a/packages/create-vite/template-lit/src/my-element.js +++ b/packages/create-vite/template-lit/src/my-element.js @@ -18,7 +18,7 @@ export class MyElement extends LitElement { /** * The number of times the button has been clicked. */ - count: { type: Number } + count: { type: Number }, } } diff --git a/packages/create-vite/template-lit/vite.config.js b/packages/create-vite/template-lit/vite.config.js index 45cfc00cd01365..3847c1f38466f1 100644 --- a/packages/create-vite/template-lit/vite.config.js +++ b/packages/create-vite/template-lit/vite.config.js @@ -5,10 +5,10 @@ export default defineConfig({ build: { lib: { entry: 'src/my-element.js', - formats: ['es'] + formats: ['es'], }, rollupOptions: { - external: /^lit/ - } - } + external: /^lit/, + }, + }, }) diff --git a/packages/create-vite/template-preact-ts/vite.config.ts b/packages/create-vite/template-preact-ts/vite.config.ts index e3bdaffe854595..29b326faf09c97 100644 --- a/packages/create-vite/template-preact-ts/vite.config.ts +++ b/packages/create-vite/template-preact-ts/vite.config.ts @@ -3,5 +3,5 @@ import preact from '@preact/preset-vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [preact()] + plugins: [preact()], }) diff --git a/packages/create-vite/template-preact/vite.config.js b/packages/create-vite/template-preact/vite.config.js index e3bdaffe854595..29b326faf09c97 100644 --- a/packages/create-vite/template-preact/vite.config.js +++ b/packages/create-vite/template-preact/vite.config.js @@ -3,5 +3,5 @@ import preact from '@preact/preset-vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [preact()] + plugins: [preact()], }) diff --git a/packages/create-vite/template-react-ts/src/main.tsx b/packages/create-vite/template-react-ts/src/main.tsx index 611e848f1a3e9c..791f139e242c70 100644 --- a/packages/create-vite/template-react-ts/src/main.tsx +++ b/packages/create-vite/template-react-ts/src/main.tsx @@ -6,5 +6,5 @@ import './index.css' ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - + , ) diff --git a/packages/create-vite/template-react-ts/vite.config.ts b/packages/create-vite/template-react-ts/vite.config.ts index b1b5f91e5ffd7f..5a33944a9b41b5 100644 --- a/packages/create-vite/template-react-ts/vite.config.ts +++ b/packages/create-vite/template-react-ts/vite.config.ts @@ -3,5 +3,5 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()] + plugins: [react()], }) diff --git a/packages/create-vite/template-react/src/main.jsx b/packages/create-vite/template-react/src/main.jsx index 9af0bb638e42c0..5cc599199a2091 100644 --- a/packages/create-vite/template-react/src/main.jsx +++ b/packages/create-vite/template-react/src/main.jsx @@ -6,5 +6,5 @@ import './index.css' ReactDOM.createRoot(document.getElementById('root')).render( - + , ) diff --git a/packages/create-vite/template-react/vite.config.js b/packages/create-vite/template-react/vite.config.js index b1b5f91e5ffd7f..5a33944a9b41b5 100644 --- a/packages/create-vite/template-react/vite.config.js +++ b/packages/create-vite/template-react/vite.config.js @@ -3,5 +3,5 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()] + plugins: [react()], }) diff --git a/packages/create-vite/template-svelte-ts/src/main.ts b/packages/create-vite/template-svelte-ts/src/main.ts index 5c1f795f9f55a6..8a909a15a0ebff 100644 --- a/packages/create-vite/template-svelte-ts/src/main.ts +++ b/packages/create-vite/template-svelte-ts/src/main.ts @@ -2,7 +2,7 @@ import './app.css' import App from './App.svelte' const app = new App({ - target: document.getElementById('app') + target: document.getElementById('app'), }) export default app diff --git a/packages/create-vite/template-svelte-ts/svelte.config.js b/packages/create-vite/template-svelte-ts/svelte.config.js index 3630bb3963b627..aa911a709460bf 100644 --- a/packages/create-vite/template-svelte-ts/svelte.config.js +++ b/packages/create-vite/template-svelte-ts/svelte.config.js @@ -3,5 +3,5 @@ import sveltePreprocess from 'svelte-preprocess' export default { // Consult https://github.com/sveltejs/svelte-preprocess // for more information about preprocessors - preprocess: sveltePreprocess() + preprocess: sveltePreprocess(), } diff --git a/packages/create-vite/template-svelte-ts/vite.config.ts b/packages/create-vite/template-svelte-ts/vite.config.ts index 401b4d4bd6b143..d70196943d0d24 100644 --- a/packages/create-vite/template-svelte-ts/vite.config.ts +++ b/packages/create-vite/template-svelte-ts/vite.config.ts @@ -3,5 +3,5 @@ import { svelte } from '@sveltejs/vite-plugin-svelte' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [svelte()] + plugins: [svelte()], }) diff --git a/packages/create-vite/template-svelte/src/main.js b/packages/create-vite/template-svelte/src/main.js index 5c1f795f9f55a6..8a909a15a0ebff 100644 --- a/packages/create-vite/template-svelte/src/main.js +++ b/packages/create-vite/template-svelte/src/main.js @@ -2,7 +2,7 @@ import './app.css' import App from './App.svelte' const app = new App({ - target: document.getElementById('app') + target: document.getElementById('app'), }) export default app diff --git a/packages/create-vite/template-svelte/vite.config.js b/packages/create-vite/template-svelte/vite.config.js index 401b4d4bd6b143..d70196943d0d24 100644 --- a/packages/create-vite/template-svelte/vite.config.js +++ b/packages/create-vite/template-svelte/vite.config.js @@ -3,5 +3,5 @@ import { svelte } from '@sveltejs/vite-plugin-svelte' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [svelte()] + plugins: [svelte()], }) diff --git a/packages/create-vite/template-vue-ts/vite.config.ts b/packages/create-vite/template-vue-ts/vite.config.ts index 315212d69a7ba5..05c17402a4a92b 100644 --- a/packages/create-vite/template-vue-ts/vite.config.ts +++ b/packages/create-vite/template-vue-ts/vite.config.ts @@ -3,5 +3,5 @@ import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [vue()] + plugins: [vue()], }) diff --git a/packages/create-vite/template-vue/src/components/HelloWorld.vue b/packages/create-vite/template-vue/src/components/HelloWorld.vue index 91f9bfcbcb305d..d3c3f15cde9911 100644 --- a/packages/create-vite/template-vue/src/components/HelloWorld.vue +++ b/packages/create-vite/template-vue/src/components/HelloWorld.vue @@ -2,7 +2,7 @@ import { ref } from 'vue' defineProps({ - msg: String + msg: String, }) const count = ref(0) diff --git a/packages/create-vite/template-vue/vite.config.js b/packages/create-vite/template-vue/vite.config.js index 315212d69a7ba5..05c17402a4a92b 100644 --- a/packages/create-vite/template-vue/vite.config.js +++ b/packages/create-vite/template-vue/vite.config.js @@ -3,5 +3,5 @@ import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [vue()] + plugins: [vue()], }) diff --git a/packages/plugin-legacy/README.md b/packages/plugin-legacy/README.md index 708ba6059561f1..2b12552632a5d3 100644 --- a/packages/plugin-legacy/README.md +++ b/packages/plugin-legacy/README.md @@ -21,9 +21,9 @@ import legacy from '@vitejs/plugin-legacy' export default { plugins: [ legacy({ - targets: ['defaults', 'not IE 11'] - }) - ] + targets: ['defaults', 'not IE 11'], + }), + ], } ``` @@ -104,9 +104,9 @@ npm add -D terser modernPolyfills: [ /* ... */ ], - renderLegacyChunks: false - }) - ] + renderLegacyChunks: false, + }), + ], } ``` @@ -141,9 +141,9 @@ export default { plugins: [ legacy({ polyfills: ['es.promise.finally', 'es/map', 'es/set'], - modernPolyfills: ['es.promise.finally'] - }) - ] + modernPolyfills: ['es.promise.finally'], + }), + ], } ``` diff --git a/packages/plugin-legacy/build.config.ts b/packages/plugin-legacy/build.config.ts index 12afbbc54d1efd..db325ecfa3b0a8 100644 --- a/packages/plugin-legacy/build.config.ts +++ b/packages/plugin-legacy/build.config.ts @@ -6,6 +6,6 @@ export default defineBuildConfig({ declaration: true, rollup: { emitCJS: true, - inlineDependencies: true - } + inlineDependencies: true, + }, }) diff --git a/packages/plugin-legacy/src/index.ts b/packages/plugin-legacy/src/index.ts index b131727849f1f0..41f76470d0b13a 100644 --- a/packages/plugin-legacy/src/index.ts +++ b/packages/plugin-legacy/src/index.ts @@ -9,14 +9,14 @@ import type { BuildOptions, HtmlTagDescriptor, Plugin, - ResolvedConfig + ResolvedConfig, } from 'vite' import type { NormalizedOutputOptions, OutputBundle, OutputOptions, PreRenderedChunk, - RenderedChunk + RenderedChunk, } from 'rollup' import type { PluginItem as BabelPlugin } from '@babel/core' import colors from 'picocolors' @@ -40,7 +40,7 @@ function toOutputFilePathInHtml( hostId: string, hostType: 'js' | 'css' | 'html', config: ResolvedConfig, - toRelative: (filename: string, importer: string) => string + toRelative: (filename: string, importer: string) => string, ): string { const { renderBuiltUrl } = config.experimental let relative = config.base === '' || config.base === './' @@ -49,12 +49,12 @@ function toOutputFilePathInHtml( hostId, hostType, type, - ssr: !!config.build.ssr + ssr: !!config.build.ssr, }) if (typeof result === 'object') { if (result.runtime) { throw new Error( - `{ runtime: "${result.runtime}" } is not supported for assets in ${hostType} files: ${filename}` + `{ runtime: "${result.runtime}" } is not supported for assets in ${hostType} files: ${filename}`, ) } if (typeof result.relative === 'boolean') { @@ -76,7 +76,7 @@ function getBaseInHTML(urlRelativePath: string, config: ResolvedConfig) { return config.base === './' || config.base === '' ? path.posix.join( path.posix.relative(urlRelativePath, '').slice(0, -2), - './' + './', ) : config.base } @@ -84,7 +84,7 @@ function getBaseInHTML(urlRelativePath: string, config: ResolvedConfig) { function toAssetPathFromHtml( filename: string, htmlPath: string, - config: ResolvedConfig + config: ResolvedConfig, ): string { const relativeUrlPath = normalizePath(path.relative(config.root, htmlPath)) const toRelative = (filename: string, hostId: string) => @@ -95,7 +95,7 @@ function toAssetPathFromHtml( htmlPath, 'html', config, - toRelative + toRelative, ) } @@ -136,7 +136,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { if (Array.isArray(options.modernPolyfills)) { options.modernPolyfills.forEach((i) => { modernPolyfills.add( - i.includes('/') ? `core-js/${i}` : `core-js/modules/${i}.js` + i.includes('/') ? `core-js/${i}` : `core-js/modules/${i}.js`, ) }) } @@ -146,7 +146,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { legacyPolyfills.add(`regenerator-runtime/runtime.js`) } else { legacyPolyfills.add( - i.includes('/') ? `core-js/${i}` : `core-js/modules/${i}.js` + i.includes('/') ? `core-js/${i}` : `core-js/modules/${i}.js`, ) } }) @@ -186,7 +186,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { 'edge79', 'firefox67', 'chrome64', - 'safari11.1' + 'safari11.1', ] } } @@ -196,19 +196,19 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { 'import.meta.env.LEGACY': env.command === 'serve' || config.build?.ssr ? false - : legacyEnvVarMarker - } + : legacyEnvVarMarker, + }, } }, configResolved(config) { if (overriddenBuildTarget) { config.logger.warn( colors.yellow( - `plugin-legacy overrode 'build.target'. You should pass 'targets' as an option to this plugin with the list of legacy browsers to support instead.` - ) + `plugin-legacy overrode 'build.target'. You should pass 'targets' as an option to this plugin with the list of legacy browsers to support instead.`, + ), ) } - } + }, } const legacyGenerateBundlePlugin: Plugin = { @@ -227,7 +227,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { isDebug && console.log( `[@vitejs/plugin-legacy] modern polyfills:`, - modernPolyfills + modernPolyfills, ) await buildPolyfillChunk( config.mode, @@ -237,7 +237,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { config.build, 'es', opts, - true + true, ) return } @@ -253,13 +253,13 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { await detectPolyfills( `Promise.resolve(); Promise.all();`, targets, - legacyPolyfills + legacyPolyfills, ) isDebug && console.log( `[@vitejs/plugin-legacy] legacy polyfills:`, - legacyPolyfills + legacyPolyfills, ) await buildPolyfillChunk( @@ -272,10 +272,10 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { config.build, 'iife', opts, - options.externalSystemJS + options.externalSystemJS, ) } - } + }, } const legacyPostPlugin: Plugin = { @@ -298,7 +298,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { | string | ((chunkInfo: PreRenderedChunk) => string) | undefined, - defaultFileName = '[name]-legacy-[hash].js' + defaultFileName = '[name]-legacy-[hash].js', ): string | ((chunkInfo: PreRenderedChunk) => string) => { if (!fileNames) { return path.posix.join(config.build.assetsDir, defaultFileName) @@ -321,13 +321,13 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { } const createLegacyOutput = ( - options: OutputOptions = {} + options: OutputOptions = {}, ): OutputOptions => { return { ...options, format: 'system', entryFileNames: getLegacyOutputFileName(options.entryFileNames), - chunkFileNames: getLegacyOutputFileName(options.chunkFileNames) + chunkFileNames: getLegacyOutputFileName(options.chunkFileNames), } } @@ -367,7 +367,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { ms.overwrite( match.index, match.index + legacyEnvVarMarker.length, - `false` + `false`, ) } } @@ -375,11 +375,11 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { if (config.build.sourcemap) { return { code: ms.toString(), - map: ms.generateMap({ hires: true }) + map: ms.generateMap({ hires: true }), } } return { - code: ms.toString() + code: ms.toString(), } } @@ -424,18 +424,18 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { plugins: [ recordAndRemovePolyfillBabelPlugin(legacyPolyfills), replaceLegacyEnvBabelPlugin(), - wrapIIFEBabelPlugin() - ] - }) + wrapIIFEBabelPlugin(), + ], + }), ], [ 'env', createBabelPresetEnvOptions(targets, { needPolyfills, - ignoreBrowserslistConfig: options.ignoreBrowserslistConfig - }) - ] - ] + ignoreBrowserslistConfig: options.ignoreBrowserslistConfig, + }), + ], + ], }) if (code) return { code, map } @@ -457,7 +457,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { // 1. inject modern polyfills const modernPolyfillFilename = facadeToModernPolyfillMap.get( - chunk.facadeModuleId + chunk.facadeModuleId, ) if (modernPolyfillFilename) { @@ -469,13 +469,13 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { src: toAssetPathFromHtml( modernPolyfillFilename, chunk.facadeModuleId!, - config - ) - } + config, + ), + }, }) } else if (modernPolyfills.size) { throw new Error( - `No corresponding modern polyfill chunk found for ${htmlFilename}` + `No corresponding modern polyfill chunk found for ${htmlFilename}`, ) } @@ -488,12 +488,12 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { tag: 'script', attrs: { nomodule: true }, children: safari10NoModuleFix, - injectTo: 'body' + injectTo: 'body', }) // 3. inject legacy polyfills const legacyPolyfillFilename = facadeToLegacyPolyfillMap.get( - chunk.facadeModuleId + chunk.facadeModuleId, ) if (legacyPolyfillFilename) { tags.push({ @@ -505,20 +505,20 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { src: toAssetPathFromHtml( legacyPolyfillFilename, chunk.facadeModuleId!, - config - ) + config, + ), }, - injectTo: 'body' + injectTo: 'body', }) } else if (legacyPolyfills.size) { throw new Error( - `No corresponding legacy polyfill chunk found for ${htmlFilename}` + `No corresponding legacy polyfill chunk found for ${htmlFilename}`, ) } // 4. inject legacy entry const legacyEntryFilename = facadeToLegacyChunkMap.get( - chunk.facadeModuleId + chunk.facadeModuleId, ) if (legacyEntryFilename) { // `assets/foo.js` means importing "named register" in SystemJS @@ -534,15 +534,15 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { 'data-src': toAssetPathFromHtml( legacyEntryFilename, chunk.facadeModuleId!, - config - ) + config, + ), }, children: systemJSInlineCode, - injectTo: 'body' + injectTo: 'body', }) } else { throw new Error( - `No corresponding legacy entry chunk found for ${htmlFilename}` + `No corresponding legacy entry chunk found for ${htmlFilename}`, ) } @@ -552,19 +552,19 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { tag: 'script', attrs: { type: 'module' }, children: detectModernBrowserCode, - injectTo: 'head' + injectTo: 'head', }) tags.push({ tag: 'script', attrs: { type: 'module' }, children: dynamicFallbackInlineCode, - injectTo: 'head' + injectTo: 'head', }) } return { html, - tags + tags, } }, @@ -581,7 +581,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { } } } - } + }, } return [legacyConfigPlugin, legacyGenerateBundlePlugin, legacyPostPlugin] @@ -590,7 +590,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] { export async function detectPolyfills( code: string, targets: any, - list: Set + list: Set, ): Promise { const babel = await loadBabel() const { ast } = babel.transform(code, { @@ -600,9 +600,11 @@ export async function detectPolyfills( presets: [ [ 'env', - createBabelPresetEnvOptions(targets, { ignoreBrowserslistConfig: true }) - ] - ] + createBabelPresetEnvOptions(targets, { + ignoreBrowserslistConfig: true, + }), + ], + ], }) for (const node of ast!.program.body) { if (node.type === 'ImportDeclaration') { @@ -621,8 +623,8 @@ function createBabelPresetEnvOptions( targets: any, { needPolyfills = true, - ignoreBrowserslistConfig - }: { needPolyfills?: boolean; ignoreBrowserslistConfig?: boolean } + ignoreBrowserslistConfig, + }: { needPolyfills?: boolean; ignoreBrowserslistConfig?: boolean }, ) { return { targets, @@ -633,11 +635,11 @@ function createBabelPresetEnvOptions( corejs: needPolyfills ? { version: _require('core-js/package.json').version, - proposals: false + proposals: false, } : undefined, shippedProposals: true, - ignoreBrowserslistConfig + ignoreBrowserslistConfig, } } @@ -649,7 +651,7 @@ async function buildPolyfillChunk( buildOptions: BuildOptions, format: 'iife' | 'es', rollupOutputOptions: NormalizedOutputOptions, - excludeSystemJS?: boolean + excludeSystemJS?: boolean, ) { let { minify, assetsDir } = buildOptions minify = minify ? 'terser' : false @@ -666,13 +668,13 @@ async function buildPolyfillChunk( assetsDir, rollupOptions: { input: { - polyfills: polyfillId + polyfills: polyfillId, }, output: { format, - entryFileNames: rollupOutputOptions.entryFileNames - } - } + entryFileNames: rollupOutputOptions.entryFileNames, + }, + }, }, // Don't run esbuild for transpilation or minification // because we don't want to transpile code. @@ -683,9 +685,9 @@ async function buildPolyfillChunk( // This limits the input code not to include es2015+ codes. // But core-js is the only dependency which includes commonjs code // and core-js doesn't include es2015+ codes. - target: 'es5' - } - } + target: 'es5', + }, + }, }) const _polyfillChunk = Array.isArray(res) ? res[0] : res if (!('output' in _polyfillChunk)) return @@ -708,7 +710,7 @@ const polyfillId = '\0vite/legacy-polyfills' function polyfillsPlugin( imports: Set, - excludeSystemJS?: boolean + excludeSystemJS?: boolean, ): Plugin { return { name: 'vite:legacy-polyfills', @@ -724,7 +726,7 @@ function polyfillsPlugin( (excludeSystemJS ? '' : `import "systemjs/dist/s.min.js";`) ) } - } + }, } } @@ -734,11 +736,11 @@ function isLegacyChunk(chunk: RenderedChunk, options: NormalizedOutputOptions) { function isLegacyBundle( bundle: OutputBundle, - options: NormalizedOutputOptions + options: NormalizedOutputOptions, ) { if (options.format === 'system') { const entryChunk = Object.values(bundle).find( - (output) => output.type === 'chunk' && output.isEntry + (output) => output.type === 'chunk' && output.isEntry, ) return !!entryChunk && entryChunk.fileName.includes('-legacy') @@ -748,7 +750,7 @@ function isLegacyBundle( } function recordAndRemovePolyfillBabelPlugin( - polyfills: Set + polyfills: Set, ): BabelPlugin { return ({ types: t }): BabelPlugin => ({ name: 'vite-remove-polyfill-import', @@ -760,7 +762,7 @@ function recordAndRemovePolyfillBabelPlugin( p.remove() } }) - } + }, }) } @@ -772,8 +774,8 @@ function replaceLegacyEnvBabelPlugin(): BabelPlugin { if (path.node.name === legacyEnvVarMarker) { path.replaceWith(t.booleanLiteral(true)) } - } - } + }, + }, }) } @@ -788,7 +790,7 @@ function wrapIIFEBabelPlugin(): BabelPlugin { this.isWrapped = true path.replaceWith(t.program(buildIIFE({ body: path.node.body }))) } - } + }, } } } @@ -797,7 +799,7 @@ export const cspHashes = [ createHash('sha256').update(safari10NoModuleFix).digest('base64'), createHash('sha256').update(systemJSInlineCode).digest('base64'), createHash('sha256').update(detectModernBrowserCode).digest('base64'), - createHash('sha256').update(dynamicFallbackInlineCode).digest('base64') + createHash('sha256').update(dynamicFallbackInlineCode).digest('base64'), ] export default viteLegacyPlugin diff --git a/packages/vite/bin/vite.js b/packages/vite/bin/vite.js index 13e9529510e4a3..a9bbb9c3a54716 100755 --- a/packages/vite/bin/vite.js +++ b/packages/vite/bin/vite.js @@ -13,7 +13,7 @@ global.__vite_start_time = performance.now() // check debug mode first before requiring the CLI. const debugIndex = process.argv.findIndex((arg) => /^(?:-d|--debug)$/.test(arg)) const filterIndex = process.argv.findIndex((arg) => - /^(?:-f|--filter)$/.test(arg) + /^(?:-f|--filter)$/.test(arg), ) const profileIndex = process.argv.indexOf('--profile') diff --git a/packages/vite/client.d.ts b/packages/vite/client.d.ts index f3d7436b3fedf2..a7182c8fd454d9 100644 --- a/packages/vite/client.d.ts +++ b/packages/vite/client.d.ts @@ -212,7 +212,7 @@ declare module '*.txt' { // wasm?init declare module '*.wasm?init' { const initWasm: ( - options: WebAssembly.Imports + options: WebAssembly.Imports, ) => Promise export default initWasm } diff --git a/packages/vite/index.cjs b/packages/vite/index.cjs index 525b1b7e59f84d..6854011bce42a1 100644 --- a/packages/vite/index.cjs +++ b/packages/vite/index.cjs @@ -16,7 +16,7 @@ const asyncFunctions = [ 'optimizeDeps', 'formatPostcssSourceMap', 'loadConfigFromFile', - 'preprocessCSS' + 'preprocessCSS', ] asyncFunctions.forEach((name) => { module.exports[name] = (...args) => @@ -28,7 +28,7 @@ const unsupportedCJS = ['resolvePackageEntry', 'resolvePackageData'] unsupportedCJS.forEach((name) => { module.exports[name] = () => { throw new Error( - `"${name}" is not supported in CJS build of Vite 3.\nPlease use ESM or dynamic imports \`const { ${name} } = await import('vite')\`.` + `"${name}" is not supported in CJS build of Vite 3.\nPlease use ESM or dynamic imports \`const { ${name} } = await import('vite')\`.`, ) } }) diff --git a/packages/vite/rollup.config.ts b/packages/vite/rollup.config.ts index e25beca7b2fd6e..80b00b80822ac4 100644 --- a/packages/vite/rollup.config.ts +++ b/packages/vite/rollup.config.ts @@ -11,7 +11,7 @@ import { defineConfig } from 'rollup' import licensePlugin from '../../scripts/rollupLicensePlugin.mjs' const pkg = JSON.parse( - readFileSync(new URL('./package.json', import.meta.url)).toString() + readFileSync(new URL('./package.json', import.meta.url)).toString(), ) const __dirname = fileURLToPath(new URL('.', import.meta.url)) @@ -20,13 +20,13 @@ const envConfig = defineConfig({ input: path.resolve(__dirname, 'src/client/env.ts'), plugins: [ typescript({ - tsconfig: path.resolve(__dirname, 'src/client/tsconfig.json') - }) + tsconfig: path.resolve(__dirname, 'src/client/tsconfig.json'), + }), ], output: { file: path.resolve(__dirname, 'dist/client', 'env.mjs'), - sourcemap: true - } + sourcemap: true, + }, }) const clientConfig = defineConfig({ @@ -34,20 +34,20 @@ const clientConfig = defineConfig({ external: ['./env', '@vite/env'], plugins: [ typescript({ - tsconfig: path.resolve(__dirname, 'src/client/tsconfig.json') - }) + tsconfig: path.resolve(__dirname, 'src/client/tsconfig.json'), + }), ], output: { file: path.resolve(__dirname, 'dist/client', 'client.mjs'), - sourcemap: true - } + sourcemap: true, + }, }) const sharedNodeOptions = defineConfig({ treeshake: { moduleSideEffects: 'no-external', propertyReadSideEffects: false, - tryCatchDeoptimization: false + tryCatchDeoptimization: false, }, output: { dir: path.resolve(__dirname, 'dist'), @@ -56,7 +56,7 @@ const sharedNodeOptions = defineConfig({ exports: 'named', format: 'esm', externalLiveBindings: false, - freeze: false + freeze: false, }, onwarn(warning, warn) { // node-resolve complains a lot about this but seems to still work? @@ -71,13 +71,13 @@ const sharedNodeOptions = defineConfig({ return } warn(warning) - } + }, }) function createNodePlugins( isProduction: boolean, sourceMap: boolean, - declarationDir: string | false + declarationDir: string | false, ): Plugin[] { return [ nodeResolve({ preferBuiltins: true }), @@ -85,7 +85,7 @@ function createNodePlugins( tsconfig: path.resolve(__dirname, 'src/node/tsconfig.json'), sourceMap, declaration: declarationDir !== false, - declarationDir: declarationDir !== false ? declarationDir : undefined + declarationDir: declarationDir !== false ? declarationDir : undefined, }), // Some deps have try...catch require of optional deps, but rollup will @@ -96,38 +96,38 @@ function createNodePlugins( // chokidar -> fsevents 'fsevents-handler.js': { src: `require('fsevents')`, - replacement: `__require('fsevents')` + replacement: `__require('fsevents')`, }, // postcss-import -> sugarss 'process-content.js': { src: 'require("sugarss")', - replacement: `__require('sugarss')` + replacement: `__require('sugarss')`, }, 'lilconfig/dist/index.js': { pattern: /: require,/g, - replacement: `: __require,` + replacement: `: __require,`, }, // postcss-load-config calls require after register ts-node 'postcss-load-config/src/index.js': { pattern: /require(?=\((configFile|'ts-node')\))/g, - replacement: `eval('require')` - } + replacement: `eval('require')`, + }, }), commonjs({ extensions: ['.js'], // Optional peer deps of ws. Native deps that are mostly for performance. // Since ws is not that perf critical for us, just ignore these deps. - ignore: ['bufferutil', 'utf-8-validate'] + ignore: ['bufferutil', 'utf-8-validate'], }), json(), isProduction && licensePlugin( path.resolve(__dirname, 'LICENSE.md'), 'Vite core license', - 'Vite' + 'Vite', ), - cjsPatchPlugin() + cjsPatchPlugin(), ] } @@ -137,24 +137,24 @@ function createNodeConfig(isProduction: boolean) { input: { index: path.resolve(__dirname, 'src/node/index.ts'), cli: path.resolve(__dirname, 'src/node/cli.ts'), - constants: path.resolve(__dirname, 'src/node/constants.ts') + constants: path.resolve(__dirname, 'src/node/constants.ts'), }, output: { ...sharedNodeOptions.output, - sourcemap: !isProduction + sourcemap: !isProduction, }, external: [ 'fsevents', ...Object.keys(pkg.dependencies), - ...(isProduction ? [] : Object.keys(pkg.devDependencies)) + ...(isProduction ? [] : Object.keys(pkg.devDependencies)), ], plugins: createNodePlugins( isProduction, !isProduction, // in production we use api-extractor for dts generation // in development we need to rely on the rollup ts plugin - isProduction ? false : path.resolve(__dirname, 'dist/node') - ) + isProduction ? false : path.resolve(__dirname, 'dist/node'), + ), }) } @@ -162,7 +162,7 @@ function createCjsConfig(isProduction: boolean) { return defineConfig({ ...sharedNodeOptions, input: { - publicUtils: path.resolve(__dirname, 'src/node/publicUtils.ts') + publicUtils: path.resolve(__dirname, 'src/node/publicUtils.ts'), }, output: { dir: path.resolve(__dirname, 'dist'), @@ -172,14 +172,14 @@ function createCjsConfig(isProduction: boolean) { format: 'cjs', externalLiveBindings: false, freeze: false, - sourcemap: false + sourcemap: false, }, external: [ 'fsevents', ...Object.keys(pkg.dependencies), - ...(isProduction ? [] : Object.keys(pkg.devDependencies)) + ...(isProduction ? [] : Object.keys(pkg.devDependencies)), ], - plugins: [...createNodePlugins(false, false, false), bundleSizeLimit(120)] + plugins: [...createNodePlugins(false, false, false), bundleSizeLimit(120)], }) } @@ -191,7 +191,7 @@ export default (commandLineArgs: any): RollupOptions[] => { envConfig, clientConfig, createNodeConfig(isProduction), - createCjsConfig(isProduction) + createCjsConfig(isProduction), ]) } @@ -218,7 +218,7 @@ function shimDepsPlugin(deps: Record): Plugin { const pos = code.indexOf(src) if (pos < 0) { this.error( - `Could not find expected src "${src}" in file "${file}"` + `Could not find expected src "${src}" in file "${file}"`, ) } transformed[file] = true @@ -236,7 +236,7 @@ function shimDepsPlugin(deps: Record): Plugin { } if (!transformed[file]) { this.error( - `Could not find expected pattern "${pattern}" in file "${file}"` + `Could not find expected pattern "${pattern}" in file "${file}"`, ) } console.log(`shimmed: ${file}`) @@ -244,7 +244,7 @@ function shimDepsPlugin(deps: Record): Plugin { return { code: magicString.toString(), - map: magicString.generateMap({ hires: true }) + map: magicString.generateMap({ hires: true }), } } } @@ -254,12 +254,12 @@ function shimDepsPlugin(deps: Record): Plugin { for (const file in deps) { if (!transformed[file]) { this.error( - `Did not find "${file}" which is supposed to be shimmed, was the file renamed?` + `Did not find "${file}" which is supposed to be shimmed, was the file renamed?`, ) } } } - } + }, } } @@ -292,9 +292,9 @@ const __require = require; return { code: s.toString(), - map: s.generateMap() + map: s.generateMap(), } - } + }, } } @@ -311,15 +311,17 @@ function bundleSizeLimit(limit: number): Plugin { Object.values(bundle) .map((i) => ('code' in i ? i.code : '')) .join(''), - 'utf-8' + 'utf-8', ) const kb = size / 1024 if (kb > limit) { throw new Error( - `Bundle size exceeded ${limit}kb, current size is ${kb.toFixed(2)}kb.` + `Bundle size exceeded ${limit}kb, current size is ${kb.toFixed( + 2, + )}kb.`, ) } - } + }, } } diff --git a/packages/vite/scripts/prePatchTypes.ts b/packages/vite/scripts/prePatchTypes.ts index eda006b476209d..daa7463a619ca9 100644 --- a/packages/vite/scripts/prePatchTypes.ts +++ b/packages/vite/scripts/prePatchTypes.ts @@ -14,7 +14,7 @@ rewriteImports(tempDir, (importPath, currentFile) => { if (importPath.startsWith('dep-types/')) { const absoluteTypePath = resolve( depTypesDir, - importPath.slice('dep-types/'.length) + importPath.slice('dep-types/'.length), ) return slash(relative(dirname(currentFile), absoluteTypePath)) } diff --git a/packages/vite/scripts/util.ts b/packages/vite/scripts/util.ts index 9b1fb3d3586e7d..135c701098fc57 100644 --- a/packages/vite/scripts/util.ts +++ b/packages/vite/scripts/util.ts @@ -8,7 +8,7 @@ import MagicString from 'magic-string' export function rewriteImports( fileOrDir: string, - rewrite: (importPath: string, currentFile: string) => string | void + rewrite: (importPath: string, currentFile: string) => string | void, ): void { walkDir(fileOrDir, (file) => { rewriteFileImports(file, (importPath) => { @@ -35,7 +35,7 @@ export function walkDir(dir: string, handleFile: (file: string) => void): void { function rewriteFileImports( file: string, - rewrite: (importPath: string) => string | void + rewrite: (importPath: string) => string | void, ): void { const content = readFileSync(file, 'utf-8') const str = new MagicString(content) @@ -43,7 +43,7 @@ function rewriteFileImports( try { ast = parse(content, { sourceType: 'module', - plugins: ['typescript', 'classProperties'] + plugins: ['typescript', 'classProperties'], }) } catch (e) { console.log(colors.red(`failed to parse ${file}`)) @@ -62,7 +62,7 @@ function rewriteFileImports( str.overwrite( source.start!, source.end!, - JSON.stringify(newImportPath) + JSON.stringify(newImportPath), ) } } diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 479f49fea53c98..6935b8e5c3dbaf 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -50,17 +50,17 @@ try { 'your current setup:\n' + ` (browser) ${currentScriptHost} <--[HTTP]--> ${serverHost} (server)\n` + ` (browser) ${socketHost} <--[WebSocket (failing)]--> ${directSocketHost} (server)\n` + - 'Check out your Vite / network configuration and https://vitejs.dev/config/server-options.html#server-hmr .' + 'Check out your Vite / network configuration and https://vitejs.dev/config/server-options.html#server-hmr .', ) }) socket.addEventListener( 'open', () => { console.info( - '[vite] Direct websocket connection fallback. Check out https://vitejs.dev/config/server-options.html#server-hmr to remove the previous connection error.' + '[vite] Direct websocket connection fallback. Check out https://vitejs.dev/config/server-options.html#server-hmr to remove the previous connection error.', ) }, - { once: true } + { once: true }, ) } } @@ -73,7 +73,7 @@ try { function setupWebSocket( protocol: string, hostAndPath: string, - onCloseWithoutOpen?: () => void + onCloseWithoutOpen?: () => void, ) { const socket = new WebSocket(`${protocol}://${hostAndPath}`, 'vite-hmr') let isOpened = false @@ -83,7 +83,7 @@ function setupWebSocket( () => { isOpened = true }, - { once: true } + { once: true }, ) // Listen for messages @@ -115,7 +115,7 @@ function warnFailedFetch(err: Error, path: string | string[]) { console.error( `[hmr] Failed to reload ${path}. ` + `This could be due to syntax errors or importing non-existent ` + - `modules. (see errors above)` + `modules. (see errors above)`, ) } @@ -168,10 +168,10 @@ async function handleMessage(payload: HMRPayload) { // using relative paths so we need to use link.href to grab the full // URL for the include check. const el = Array.from( - document.querySelectorAll('link') + document.querySelectorAll('link'), ).find( (e) => - !outdatedLinkTags.has(e) && cleanUrl(e.href).includes(searchUrl) + !outdatedLinkTags.has(e) && cleanUrl(e.href).includes(searchUrl), ) if (!el) { @@ -200,7 +200,7 @@ async function handleMessage(payload: HMRPayload) { outdatedLinkTags.add(el) el.after(newLinkTag) }) - }) + }), ) notifyListeners('vite:afterUpdate', payload) break @@ -247,7 +247,7 @@ async function handleMessage(payload: HMRPayload) { createErrorOverlay(err) } else { console.error( - `[vite] Internal Server Error\n${err.message}\n${err.stack}` + `[vite] Internal Server Error\n${err.message}\n${err.stack}`, ) } break @@ -261,7 +261,7 @@ async function handleMessage(payload: HMRPayload) { function notifyListeners( event: T, - data: InferCustomEventPayload + data: InferCustomEventPayload, ): void function notifyListeners(event: string, data: any): void { const cbs = customListenersMap.get(event) @@ -311,7 +311,7 @@ async function queueUpdate(p: Promise<(() => void) | undefined>) { async function waitForSuccessfulPing( socketProtocol: string, hostAndPath: string, - ms = 1000 + ms = 1000, ) { const pingHostProtocol = socketProtocol === 'wss' ? 'https' : 'http' @@ -322,7 +322,7 @@ async function waitForSuccessfulPing( // but will reject a networking error. // When running on middleware mode, it returns status 426, and an cors error happens if mode is not no-cors await fetch(`${pingHostProtocol}://${hostAndPath}`, { - mode: 'no-cors' + mode: 'no-cors', }) break } catch (e) { @@ -391,7 +391,7 @@ export function removeStyle(id: string): void { if (style instanceof CSSStyleSheet) { // @ts-expect-error: using experimental API document.adoptedStyleSheets = document.adoptedStyleSheets.filter( - (s: CSSStyleSheet) => s !== style + (s: CSSStyleSheet) => s !== style, ) } else { document.head.removeChild(style) @@ -404,7 +404,7 @@ async function fetchUpdate({ path, acceptedPath, timestamp, - explicitImportRequired + explicitImportRequired, }: Update) { const mod = hotModulesMap.get(path) if (!mod) { @@ -419,7 +419,7 @@ async function fetchUpdate({ // determine the qualified callbacks before we re-import the modules const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => - deps.includes(acceptedPath) + deps.includes(acceptedPath), ) if (isSelfUpdate || qualifiedCallbacks.length > 0) { @@ -496,7 +496,7 @@ export function createHotContext(ownerPath: string): ViteHotContext { if (listeners) { customListenersMap.set( event, - listeners.filter((l) => !staleFns.includes(l)) + listeners.filter((l) => !staleFns.includes(l)), ) } } @@ -508,11 +508,11 @@ export function createHotContext(ownerPath: string): ViteHotContext { function acceptDeps(deps: string[], callback: HotCallback['fn'] = () => {}) { const mod: HotModule = hotModulesMap.get(ownerPath) || { id: ownerPath, - callbacks: [] + callbacks: [], } mod.callbacks.push({ deps, - fn: callback + fn: callback, }) hotModulesMap.set(ownerPath, mod) } @@ -560,7 +560,7 @@ export function createHotContext(ownerPath: string): ViteHotContext { notifyListeners('vite:invalidate', { path: ownerPath, message }) this.send('vite:invalidate', { path: ownerPath, message }) console.debug( - `[vite] invalidate ${ownerPath}${message ? `: ${message}` : ''}` + `[vite] invalidate ${ownerPath}${message ? `: ${message}` : ''}`, ) }, @@ -578,7 +578,7 @@ export function createHotContext(ownerPath: string): ViteHotContext { send(event, data) { messageBuffer.push(JSON.stringify({ type: 'custom', event, data })) sendMessageBuffer() - } + }, } return hot diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index b329f91d348959..67cdcdfe60075b 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -13,7 +13,7 @@ const __dirname = resolve(fileURLToPath(import.meta.url), '..') type FormatsToFileNames = [LibraryFormats, string][] const baseLibOptions: LibraryOptions = { fileName: 'my-lib', - entry: 'mylib.js' + entry: 'mylib.js', } describe('resolveBuildOutputs', () => { @@ -25,8 +25,8 @@ describe('resolveBuildOutputs', () => { expect(resolvedOutputs).toEqual([ { - format: 'es' - } + format: 'es', + }, ]) }) @@ -37,11 +37,11 @@ describe('resolveBuildOutputs', () => { expect(resolvedOutputs).toEqual([ { - format: 'es' + format: 'es', }, { - format: 'umd' - } + format: 'umd', + }, ]) }) @@ -58,14 +58,14 @@ describe('resolveBuildOutputs', () => { const loggerSpy = vi.spyOn(logger, 'warn').mockImplementation(() => {}) const libOptions: LibraryOptions = { ...baseLibOptions, - formats: ['iife'] + formats: ['iife'], } const outputs: OutputOptions[] = [{ format: 'es' }] resolveBuildOutputs(outputs, libOptions, logger) expect(loggerSpy).toHaveBeenCalledWith( - expect.stringContaining('"build.lib.formats" will be ignored because') + expect.stringContaining('"build.lib.formats" will be ignored because'), ) }) @@ -73,7 +73,7 @@ describe('resolveBuildOutputs', () => { const logger = createLogger() const libOptions: LibraryOptions = { ...baseLibOptions, - formats: ['iife'] + formats: ['iife'], } const resolveBuild = () => resolveBuildOutputs(void 0, libOptions, logger) @@ -95,7 +95,7 @@ describe('resolveBuildOutputs', () => { const resolveBuild = () => resolveBuildOutputs(outputs, libOptions, logger) expect(resolveBuild).toThrowError( - /Entries in "build\.rollupOptions\.output" must specify "name"/ + /Entries in "build\.rollupOptions\.output" must specify "name"/, ) }) @@ -106,7 +106,7 @@ describe('resolveBuildOutputs', () => { const resolveBuild = () => resolveBuildOutputs(outputs, libOptions, logger) expect(resolveBuild).toThrowError( - /Entries in "build\.rollupOptions\.output" must specify "name"/ + /Entries in "build\.rollupOptions\.output" must specify "name"/, ) }) }) @@ -116,11 +116,11 @@ describe('resolveLibFilename', () => { const filename = resolveLibFilename( { fileName: (format) => `custom-filename-function.${format}.js`, - entry: 'mylib.js' + entry: 'mylib.js', }, 'es', 'myLib', - resolve(__dirname, 'packages/name') + resolve(__dirname, 'packages/name'), ) expect(filename).toBe('custom-filename-function.es.js') @@ -130,11 +130,11 @@ describe('resolveLibFilename', () => { const filename = resolveLibFilename( { fileName: 'custom-filename', - entry: 'mylib.js' + entry: 'mylib.js', }, 'es', 'myLib', - resolve(__dirname, 'packages/name') + resolve(__dirname, 'packages/name'), ) expect(filename).toBe('custom-filename.mjs') @@ -143,11 +143,11 @@ describe('resolveLibFilename', () => { test('package name as filename', () => { const filename = resolveLibFilename( { - entry: 'mylib.js' + entry: 'mylib.js', }, 'es', 'myLib', - resolve(__dirname, 'packages/name') + resolve(__dirname, 'packages/name'), ) expect(filename).toBe('mylib.mjs') @@ -157,11 +157,11 @@ describe('resolveLibFilename', () => { const filename = resolveLibFilename( { fileName: 'custom-filename', - entry: 'mylib.js' + entry: 'mylib.js', }, 'es', 'myLib', - resolve(__dirname, 'packages/noname') + resolve(__dirname, 'packages/noname'), ) expect(filename).toBe('custom-filename.mjs') @@ -171,11 +171,11 @@ describe('resolveLibFilename', () => { expect(() => { resolveLibFilename( { - entry: 'mylib.js' + entry: 'mylib.js', }, 'es', 'myLib', - resolve(__dirname, 'packages/noname') + resolve(__dirname, 'packages/noname'), ) }).toThrow() }) @@ -185,7 +185,7 @@ describe('resolveLibFilename', () => { ['es', 'my-lib.mjs'], ['umd', 'my-lib.umd.js'], ['cjs', 'my-lib.js'], - ['iife', 'my-lib.iife.js'] + ['iife', 'my-lib.iife.js'], ] for (const [format, expectedFilename] of formatsToFilenames) { @@ -193,7 +193,7 @@ describe('resolveLibFilename', () => { baseLibOptions, format, 'myLib', - resolve(__dirname, 'packages/noname') + resolve(__dirname, 'packages/noname'), ) expect(filename).toBe(expectedFilename) @@ -205,7 +205,7 @@ describe('resolveLibFilename', () => { ['es', 'my-lib.js'], ['umd', 'my-lib.umd.cjs'], ['cjs', 'my-lib.cjs'], - ['iife', 'my-lib.iife.js'] + ['iife', 'my-lib.iife.js'], ] for (const [format, expectedFilename] of formatsToFilenames) { @@ -213,7 +213,7 @@ describe('resolveLibFilename', () => { baseLibOptions, format, 'myLib', - resolve(__dirname, 'packages/module') + resolve(__dirname, 'packages/module'), ) expect(expectedFilename).toBe(filename) @@ -224,8 +224,8 @@ describe('resolveLibFilename', () => { const libOptions: LibraryOptions = { entry: { entryA: 'entryA.js', - entryB: 'entryB.js' - } + entryB: 'entryB.js', + }, } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -233,8 +233,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('entryA.mjs') @@ -245,10 +245,10 @@ describe('resolveLibFilename', () => { const libOptions: LibraryOptions = { entry: { entryA: 'entryA.js', - entryB: 'entryB.js' + entryB: 'entryB.js', }, fileName: (format, entryAlias) => - `custom-filename-function.${entryAlias}.${format}.js` + `custom-filename-function.${entryAlias}.${format}.js`, } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -256,8 +256,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('custom-filename-function.entryA.es.js') @@ -268,9 +268,9 @@ describe('resolveLibFilename', () => { const libOptions: LibraryOptions = { entry: { entryA: 'entryA.js', - entryB: 'entryB.js' + entryB: 'entryB.js', }, - fileName: 'custom-filename' + fileName: 'custom-filename', } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -278,8 +278,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('custom-filename.mjs') @@ -288,7 +288,7 @@ describe('resolveLibFilename', () => { test('multiple entries as array', () => { const libOptions: LibraryOptions = { - entry: ['entryA.js', 'entryB.js'] + entry: ['entryA.js', 'entryB.js'], } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -296,8 +296,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('entryA.mjs') @@ -308,7 +308,7 @@ describe('resolveLibFilename', () => { const libOptions: LibraryOptions = { entry: ['entryA.js', 'entryB.js'], fileName: (format, entryAlias) => - `custom-filename-function.${entryAlias}.${format}.js` + `custom-filename-function.${entryAlias}.${format}.js`, } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -316,8 +316,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('custom-filename-function.entryA.es.js') @@ -327,7 +327,7 @@ describe('resolveLibFilename', () => { test('multiple entries as array: custom filename string', () => { const libOptions: LibraryOptions = { entry: ['entryA.js', 'entryB.js'], - fileName: 'custom-filename' + fileName: 'custom-filename', } const [fileName1, fileName2] = ['entryA', 'entryB'].map((entryAlias) => @@ -335,8 +335,8 @@ describe('resolveLibFilename', () => { libOptions, 'es', entryAlias, - resolve(__dirname, 'packages/name') - ) + resolve(__dirname, 'packages/name'), + ), ) expect(fileName1).toBe('custom-filename.mjs') @@ -348,41 +348,41 @@ describe('resolveBuildOutputs', () => { test('default format: one entry', () => { const libOptions: LibraryOptions = { entry: 'entryA.js', - name: 'entryA' + name: 'entryA', } expect(resolveBuildOutputs(undefined, libOptions, {} as Logger)).toEqual([ { format: 'es' }, - { format: 'umd' } + { format: 'umd' }, ]) expect( - resolveBuildOutputs({ name: 'A' }, libOptions, {} as Logger) + resolveBuildOutputs({ name: 'A' }, libOptions, {} as Logger), ).toEqual([ { format: 'es', name: 'A' }, - { format: 'umd', name: 'A' } + { format: 'umd', name: 'A' }, ]) expect( - resolveBuildOutputs([{ name: 'A' }], libOptions, {} as Logger) + resolveBuildOutputs([{ name: 'A' }], libOptions, {} as Logger), ).toEqual([{ name: 'A' }]) }) test('default format: multiple entries', () => { const libOptions: LibraryOptions = { - entry: ['entryA.js', 'entryB.js'] + entry: ['entryA.js', 'entryB.js'], } expect(resolveBuildOutputs(undefined, libOptions, {} as Logger)).toEqual([ { format: 'es' }, - { format: 'cjs' } + { format: 'cjs' }, ]) expect( - resolveBuildOutputs({ name: 'A' }, libOptions, {} as Logger) + resolveBuildOutputs({ name: 'A' }, libOptions, {} as Logger), ).toEqual([ { format: 'es', name: 'A' }, - { format: 'cjs', name: 'A' } + { format: 'cjs', name: 'A' }, ]) expect( - resolveBuildOutputs([{ name: 'A' }], libOptions, {} as Logger) + resolveBuildOutputs([{ name: 'A' }], libOptions, {} as Logger), ).toEqual([{ name: 'A' }]) }) @@ -393,12 +393,12 @@ describe('resolveBuildOutputs', () => { undefined, { entry: ['entryA.js', 'entryB.js'], - formats: [format as LibraryFormats] + formats: [format as LibraryFormats], }, - {} as Logger - ) + {} as Logger, + ), ).toThrow( - `Multiple entry points are not supported when output formats include "umd" or "iife".` + `Multiple entry points are not supported when output formats include "umd" or "iife".`, ) }) }) @@ -410,12 +410,12 @@ describe('resolveBuildOutputs', () => { undefined, { entry: 'entryA.js', - formats: [format as LibraryFormats] + formats: [format as LibraryFormats], }, - {} as Logger - ) + {} as Logger, + ), ).toThrow( - `Option "build.lib.name" is required when output formats include "umd" or "iife".` + `Option "build.lib.name" is required when output formats include "umd" or "iife".`, ) }) }) @@ -428,15 +428,15 @@ describe('resolveBuildOutputs', () => { [{ name: 'A' }], { entry: 'entryA.js', - formats: ['es'] + formats: ['es'], }, - log - ) + log, + ), ).toEqual([{ name: 'A' }]) expect(log.warn).toHaveBeenLastCalledWith( colors.yellow( - `"build.lib.formats" will be ignored because "build.rollupOptions.output" is already an array format.` - ) + `"build.lib.formats" will be ignored because "build.rollupOptions.output" is already an array format.`, + ), ) }) }) diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index 0b8aaf79e6d47c..606b25fa8e148e 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -12,19 +12,19 @@ describe('mergeConfig', () => { alias: [ { find: 'foo', - replacement: 'foo-value' - } - ] - } + replacement: 'foo-value', + }, + ], + }, } const newConfig: UserConfigExport = { resolve: { alias: { bar: 'bar-value', - baz: 'baz-value' - } - } + baz: 'baz-value', + }, + }, } const mergedConfig: UserConfigExport = { @@ -32,18 +32,18 @@ describe('mergeConfig', () => { alias: [ { find: 'bar', - replacement: 'bar-value' + replacement: 'bar-value', }, { find: 'baz', - replacement: 'baz-value' + replacement: 'baz-value', }, { find: 'foo', - replacement: 'foo-value' - } - ] - } + replacement: 'foo-value', + }, + ], + }, } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -54,18 +54,18 @@ describe('mergeConfig', () => { resolve: { alias: { bar: 'bar-value', - baz: 'baz-value' - } - } + baz: 'baz-value', + }, + }, } const newConfig = { resolve: { alias: { bar: 'bar-value-2', - foo: 'foo-value' - } - } + foo: 'foo-value', + }, + }, } const mergedConfig = { @@ -73,9 +73,9 @@ describe('mergeConfig', () => { alias: { bar: 'bar-value-2', baz: 'baz-value', - foo: 'foo-value' - } - } + foo: 'foo-value', + }, + }, } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -83,15 +83,15 @@ describe('mergeConfig', () => { test('handles arrays', () => { const baseConfig: UserConfigExport = { - envPrefix: 'string1' + envPrefix: 'string1', } const newConfig: UserConfigExport = { - envPrefix: ['string2', 'string3'] + envPrefix: ['string2', 'string3'], } const mergedConfig: UserConfigExport = { - envPrefix: ['string1', 'string2', 'string3'] + envPrefix: ['string1', 'string2', 'string3'], } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -99,15 +99,15 @@ describe('mergeConfig', () => { test('handles assetsInclude', () => { const baseConfig: UserConfigExport = { - assetsInclude: 'some-string' + assetsInclude: 'some-string', } const newConfig: UserConfigExport = { - assetsInclude: ['some-other-string', /regexp?/] + assetsInclude: ['some-other-string', /regexp?/], } const mergedConfig: UserConfigExport = { - assetsInclude: ['some-string', 'some-other-string', /regexp?/] + assetsInclude: ['some-string', 'some-other-string', /regexp?/], } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -118,18 +118,18 @@ describe('mergeConfig', () => { custom: { alias: { bar: 'bar-value', - baz: 'baz-value' - } - } + baz: 'baz-value', + }, + }, } const newConfig = { custom: { alias: { bar: 'bar-value-2', - foo: 'foo-value' - } - } + foo: 'foo-value', + }, + }, } const mergedConfig = { @@ -137,9 +137,9 @@ describe('mergeConfig', () => { alias: { bar: 'bar-value-2', baz: 'baz-value', - foo: 'foo-value' - } - } + foo: 'foo-value', + }, + }, } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -147,15 +147,15 @@ describe('mergeConfig', () => { test('merge array correctly', () => { const baseConfig = { - foo: null + foo: null, } const newConfig = { - foo: ['bar'] + foo: ['bar'], } const mergedConfig = { - foo: ['bar'] + foo: ['bar'], } expect(mergeConfig(baseConfig, newConfig)).toEqual(mergedConfig) @@ -164,20 +164,20 @@ describe('mergeConfig', () => { test('handles ssr.noExternal', () => { const baseConfig = { ssr: { - noExternal: true - } + noExternal: true, + }, } const newConfig = { ssr: { - noExternal: ['foo'] - } + noExternal: ['foo'], + }, } const mergedConfig = { ssr: { - noExternal: true - } + noExternal: true, + }, } // merging either ways, `ssr.noExternal: true` should take highest priority @@ -213,21 +213,21 @@ describe('preview config', () => { open: true, https: true, headers: { - 'Cache-Control': 'no-store' + 'Cache-Control': 'no-store', }, proxy: { '/foo': 'http://localhost:4567' }, - cors: false + cors: false, }) test('preview inherits server config with default port', async () => { const config: InlineConfig = { - server: serverConfig() + server: serverConfig(), } expect(await resolveConfig(config, 'serve')).toMatchObject({ preview: { ...serverConfig(), - port: undefined - } + port: undefined, + }, }) }) @@ -235,14 +235,14 @@ describe('preview config', () => { const config: InlineConfig = { server: serverConfig(), preview: { - port: 3006 - } + port: 3006, + }, } expect(await resolveConfig(config, 'serve')).toMatchObject({ preview: { ...serverConfig(), - port: 3006 - } + port: 3006, + }, }) }) @@ -253,16 +253,16 @@ describe('preview config', () => { host: false, https: false, proxy: { '/bar': 'http://localhost:3010' }, - cors: true + cors: true, }) test('preview overrides server config', async () => { const config: InlineConfig = { server: serverConfig(), - preview: previewConfig() + preview: previewConfig(), } expect(await resolveConfig(config, 'serve')).toMatchObject({ - preview: previewConfig() + preview: previewConfig(), }) }) }) @@ -273,7 +273,7 @@ describe('resolveConfig', () => { name: 'vite-plugin-keep-screen-merge', config() { return { clearScreen: false } - } + }, } } @@ -282,7 +282,7 @@ describe('resolveConfig', () => { name: 'vite-plugin-keep-screen-override', config(config) { config.clearScreen = false - } + }, } } @@ -290,7 +290,7 @@ describe('resolveConfig', () => { const config1: InlineConfig = { plugins: [keepScreenMergePlugin()] } const config2: InlineConfig = { plugins: [keepScreenMergePlugin()], - clearScreen: true + clearScreen: true, } const results1 = await resolveConfig(config1, 'build') @@ -304,7 +304,7 @@ describe('resolveConfig', () => { const config1: InlineConfig = { plugins: [keepScreenOverridePlugin()] } const config2: InlineConfig = { plugins: [keepScreenOverridePlugin()], - clearScreen: true + clearScreen: true, } const results1 = await resolveConfig(config1, 'build') diff --git a/packages/vite/src/node/__tests__/dev.spec.ts b/packages/vite/src/node/__tests__/dev.spec.ts index 3b3b3d14553da4..1ade6c0adde9ea 100644 --- a/packages/vite/src/node/__tests__/dev.spec.ts +++ b/packages/vite/src/node/__tests__/dev.spec.ts @@ -7,11 +7,11 @@ describe('resolveBuildOptions in dev', () => { { build: { lib: { - entry: './index.js' - } - } + entry: './index.js', + }, + }, }, - 'serve' + 'serve', ) expect(config.build.rollupOptions).not.toHaveProperty('input') diff --git a/packages/vite/src/node/__tests__/plugins/css.spec.ts b/packages/vite/src/node/__tests__/plugins/css.spec.ts index d951178783073b..9fca203593d310 100644 --- a/packages/vite/src/node/__tests__/plugins/css.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/css.spec.ts @@ -8,13 +8,13 @@ import { cssPlugin, cssUrlRE, hoistAtRules } from '../../plugins/css' describe('search css url function', () => { test('some spaces before it', () => { expect( - cssUrlRE.test("list-style-image: url('../images/bullet.jpg');") + cssUrlRE.test("list-style-image: url('../images/bullet.jpg');"), ).toBe(true) }) test('no space after colon', () => { expect(cssUrlRE.test("list-style-image:url('../images/bullet.jpg');")).toBe( - true + true, ) }) @@ -26,23 +26,23 @@ describe('search css url function', () => { expect( cssUrlRE.test(`@function svg-url($string) { @return ""; - }`) + }`), ).toBe(false) }) test('after parenthesis', () => { expect( cssUrlRE.test( - 'mask-image: image(url(mask.png), skyblue, linear-gradient(rgba(0, 0, 0, 1.0), transparent));' - ) + 'mask-image: image(url(mask.png), skyblue, linear-gradient(rgba(0, 0, 0, 1.0), transparent));', + ), ).toBe(true) }) test('after comma', () => { expect( cssUrlRE.test( - 'mask-image: image(skyblue,url(mask.png), linear-gradient(rgba(0, 0, 0, 1.0), transparent));' - ) + 'mask-image: image(skyblue,url(mask.png), linear-gradient(rgba(0, 0, 0, 1.0), transparent));', + ), ).toBe(true) }) }) @@ -56,18 +56,18 @@ describe('css modules', () => { .bar { display: block; background: #f0f; -}` +}`, }, { resolve: { alias: [ { find: '@', - replacement: mockedProjectPath - } - ] - } - } + replacement: mockedProjectPath, + }, + ], + }, + }, ) const result = await transform( @@ -76,7 +76,7 @@ background: #f0f; position: fixed; composes: bar from '@/css/bar.module.css'; }`, - '/css/foo.module.css' + '/css/foo.module.css', ) expect(result.code).toBe( @@ -87,7 +87,7 @@ background: #f0f; } ._foo_86148_1 { position: fixed; -}` +}`, ) resetMock() @@ -97,9 +97,9 @@ position: fixed; const { transform, resetMock } = await createCssPluginTransform(undefined, { css: { modules: { - generateScopedName: 'custom__[hash:base64:5]' - } - } + generateScopedName: 'custom__[hash:base64:5]', + }, + }, }) const css = `\ .foo { @@ -129,7 +129,7 @@ describe('hoist @ rules', () => { const css = `.foo{color:red;}@import url(data:image/png;base64,iRxVB0);` const result = await hoistAtRules(css) expect(result).toBe( - `@import url(data:image/png;base64,iRxVB0);.foo{color:red;}` + `@import url(data:image/png;base64,iRxVB0);.foo{color:red;}`, ) }) @@ -155,7 +155,7 @@ describe('hoist @ rules', () => { const css = `.foo{color:red;}@import "bla";@charset "utf-8";.bar{color:green;}@import "baz";` const result = await hoistAtRules(css) expect(result).toBe( - `@charset "utf-8";@import "bla";@import "baz";.foo{color:red;}.bar{color:green;}` + `@charset "utf-8";@import "bla";@import "baz";.foo{color:red;}.bar{color:green;}`, ) }) @@ -169,7 +169,7 @@ describe('hoist @ rules', () => { const css = `.foo{color:red;}/* @charset "utf-8"; */@charset "utf-8";` const result = await hoistAtRules(css) expect(result).toBe( - `@charset "utf-8";.foo{color:red;}/* @charset "utf-8"; */` + `@charset "utf-8";.foo{color:red;}/* @charset "utf-8"; */`, ) }) @@ -204,7 +204,7 @@ describe('hoist @ rules', () => { async function createCssPluginTransform( files?: Record, - inlineConfig: InlineConfig = {} + inlineConfig: InlineConfig = {}, ) { const config = await resolveConfig(inlineConfig, 'serve') const { transform, buildStart } = cssPlugin(config) @@ -226,14 +226,14 @@ async function createCssPluginTransform( { addWatchFile() { return - } + }, }, code, - id + id, ) }, resetMock() { mockFs.mockReset() - } + }, } } diff --git a/packages/vite/src/node/__tests__/plugins/define.spec.ts b/packages/vite/src/node/__tests__/plugins/define.spec.ts index 932560a749f24d..b1634ef9adcd1a 100644 --- a/packages/vite/src/node/__tests__/plugins/define.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/define.spec.ts @@ -5,7 +5,7 @@ import { resolveConfig } from '../../config' async function createDefinePluginTransform( define: Record = {}, build = true, - ssr = false + ssr = false, ) { const config = await resolveConfig({ define }, build ? 'build' : 'serve') const instance = definePlugin(config) @@ -18,23 +18,23 @@ async function createDefinePluginTransform( describe('definePlugin', () => { test('replaces custom define', async () => { const transform = await createDefinePluginTransform({ - __APP_VERSION__: JSON.stringify('1.0') + __APP_VERSION__: JSON.stringify('1.0'), }) expect(await transform('const version = __APP_VERSION__ ;')).toBe( - 'const version = "1.0" ;' + 'const version = "1.0" ;', ) expect(await transform('const version = __APP_VERSION__;')).toBe( - 'const version = "1.0";' + 'const version = "1.0";', ) }) test('replaces import.meta.env.SSR with false', async () => { const transform = await createDefinePluginTransform() expect(await transform('const isSSR = import.meta.env.SSR ;')).toBe( - 'const isSSR = false ;' + 'const isSSR = false ;', ) expect(await transform('const isSSR = import.meta.env.SSR;')).toBe( - 'const isSSR = false;' + 'const isSSR = false;', ) }) }) diff --git a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts index cfd816d00fe8b5..71aadd3366c0d7 100644 --- a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts +++ b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts @@ -12,7 +12,7 @@ async function run(input: string) { input, normalizePath(resolve(__dirname, 'index.js')), (id) => id.replace('@', resolve(__dirname, './mods/')), - __dirname + __dirname, )) || {} return `__variableDynamicImportRuntimeHelper(${glob}, \`${rawPattern}\`)` } @@ -52,7 +52,7 @@ describe('parse positives', () => { it('with multi ../ and itself', async () => { expect( - await run('`../../plugins/dynamicImportVar/${name}.js`') + await run('`../../plugins/dynamicImportVar/${name}.js`'), ).toMatchSnapshot() }) }) diff --git a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts index 6591ecee8b9876..2cc8c9304450a8 100644 --- a/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/esbuild.spec.ts @@ -3,7 +3,7 @@ import type { ResolvedConfig, UserConfig } from '../../config' import { ESBuildTransformResult, resolveEsbuildTranspileOptions, - transformWithEsbuild + transformWithEsbuild, } from '../../plugins/esbuild' describe('resolveEsbuildTranspileOptions', () => { @@ -12,13 +12,13 @@ describe('resolveEsbuildTranspileOptions', () => { defineResolvedConfig({ build: { target: 'es2020', - minify: 'esbuild' + minify: 'esbuild', }, esbuild: { - keepNames: true - } + keepNames: true, + }, }), - 'es' + 'es', ) expect(options).toEqual({ charset: 'utf8', @@ -29,8 +29,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -39,13 +39,13 @@ describe('resolveEsbuildTranspileOptions', () => { defineResolvedConfig({ build: { target: 'esnext', - minify: false + minify: false, }, esbuild: { - keepNames: true - } + keepNames: true, + }, }), - 'es' + 'es', ) expect(options).toEqual(null) }) @@ -54,14 +54,14 @@ describe('resolveEsbuildTranspileOptions', () => { const options = resolveEsbuildTranspileOptions( defineResolvedConfig({ build: { - minify: 'esbuild' + minify: 'esbuild', }, esbuild: { keepNames: true, - minifyIdentifiers: false - } + minifyIdentifiers: false, + }, }), - 'es' + 'es', ) expect(options).toEqual({ charset: 'utf8', @@ -75,8 +75,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -85,13 +85,13 @@ describe('resolveEsbuildTranspileOptions', () => { defineResolvedConfig({ build: { target: 'es2020', - minify: false + minify: false, }, esbuild: { - keepNames: true - } + keepNames: true, + }, }), - 'es' + 'es', ) expect(options).toEqual({ charset: 'utf8', @@ -105,8 +105,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: false, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -116,14 +116,14 @@ describe('resolveEsbuildTranspileOptions', () => { build: { minify: 'esbuild', lib: { - entry: './somewhere.js' - } + entry: './somewhere.js', + }, }, esbuild: { - keepNames: true - } + keepNames: true, + }, }), - 'es' + 'es', ) expect(options).toEqual({ charset: 'utf8', @@ -137,8 +137,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -148,14 +148,14 @@ describe('resolveEsbuildTranspileOptions', () => { build: { minify: 'esbuild', lib: { - entry: './somewhere.js' - } + entry: './somewhere.js', + }, }, esbuild: { - keepNames: true - } + keepNames: true, + }, }), - 'cjs' + 'cjs', ) expect(options).toEqual({ charset: 'utf8', @@ -166,8 +166,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -177,16 +177,16 @@ describe('resolveEsbuildTranspileOptions', () => { build: { minify: 'esbuild', lib: { - entry: './somewhere.js' - } + entry: './somewhere.js', + }, }, esbuild: { keepNames: true, minifyIdentifiers: true, - minifyWhitespace: true - } + minifyWhitespace: true, + }, }), - 'es' + 'es', ) expect(options).toEqual({ charset: 'utf8', @@ -200,8 +200,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) @@ -211,17 +211,17 @@ describe('resolveEsbuildTranspileOptions', () => { build: { minify: 'esbuild', lib: { - entry: './somewhere.js' - } + entry: './somewhere.js', + }, }, esbuild: { keepNames: true, minifyIdentifiers: true, minifySyntax: false, - treeShaking: true - } + treeShaking: true, + }, }), - 'cjs' + 'cjs', ) expect(options).toEqual({ charset: 'utf8', @@ -235,8 +235,8 @@ describe('resolveEsbuildTranspileOptions', () => { treeShaking: true, supported: { 'dynamic-import': true, - 'import-meta': true - } + 'import-meta': true, + }, }) }) }) @@ -244,7 +244,7 @@ describe('resolveEsbuildTranspileOptions', () => { describe('transformWithEsbuild', () => { test('not throw on inline sourcemap', async () => { const result = await transformWithEsbuild(`const foo = 'bar'`, '', { - sourcemap: 'inline' + sourcemap: 'inline', }) expect(result?.code).toBeTruthy() expect(result?.map).toBeTruthy() diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts index 6c1f950da4f7f2..792c58515f542e 100644 --- a/packages/vite/src/node/__tests__/plugins/import.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts @@ -11,21 +11,21 @@ describe('transformCjsImport', () => { 'import { useState, Component } from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const useState = __vite__cjsImport0_react["useState"]; ' + - 'const Component = __vite__cjsImport0_react["Component"]' + 'const Component = __vite__cjsImport0_react["Component"]', ) }) test('import default specifier', () => { expect( - transformCjsImport('import React from "react"', url, rawUrl, 0) + transformCjsImport('import React from "react"', url, rawUrl, 0), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react' + 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', ) expect( @@ -33,30 +33,30 @@ describe('transformCjsImport', () => { 'import { default as React } from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react' + 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react', ) }) test('import all specifier', () => { expect( - transformCjsImport('import * as react from "react"', url, rawUrl, 0) + transformCjsImport('import * as react from "react"', url, rawUrl, 0), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const react = __vite__cjsImport0_react' + 'const react = __vite__cjsImport0_react', ) }) test('export all specifier', () => { expect(transformCjsImport('export * from "react"', url, rawUrl, 0)).toBe( - undefined + undefined, ) expect( - transformCjsImport('export * as react from "react"', url, rawUrl, 0) + transformCjsImport('export * as react from "react"', url, rawUrl, 0), ).toBe(undefined) }) @@ -66,13 +66,13 @@ describe('transformCjsImport', () => { 'export { useState, Component } from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const __vite__cjsExport_useState = __vite__cjsImport0_react["useState"]; ' + 'const __vite__cjsExport_Component = __vite__cjsImport0_react["Component"]; ' + - 'export { __vite__cjsExport_useState as useState, __vite__cjsExport_Component as Component }' + 'export { __vite__cjsExport_useState as useState, __vite__cjsExport_Component as Component }', ) expect( @@ -80,23 +80,23 @@ describe('transformCjsImport', () => { 'export { useState as useStateAlias, Component as ComponentAlias } from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const __vite__cjsExport_useStateAlias = __vite__cjsImport0_react["useState"]; ' + 'const __vite__cjsExport_ComponentAlias = __vite__cjsImport0_react["Component"]; ' + - 'export { __vite__cjsExport_useStateAlias as useStateAlias, __vite__cjsExport_ComponentAlias as ComponentAlias }' + 'export { __vite__cjsExport_useStateAlias as useStateAlias, __vite__cjsExport_ComponentAlias as ComponentAlias }', ) }) test('export default specifier', () => { expect( - transformCjsImport('export { default } from "react"', url, rawUrl, 0) + transformCjsImport('export { default } from "react"', url, rawUrl, 0), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + - 'export default __vite__cjsExportDefault_0' + 'export default __vite__cjsExportDefault_0', ) expect( @@ -104,12 +104,12 @@ describe('transformCjsImport', () => { 'export { default as React} from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const __vite__cjsExport_React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' + - 'export { __vite__cjsExport_React as React }' + 'export { __vite__cjsExport_React as React }', ) expect( @@ -117,12 +117,12 @@ describe('transformCjsImport', () => { 'export { Component as default } from "react"', url, rawUrl, - 0 - ) + 0, + ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react["Component"]; ' + - 'export default __vite__cjsExportDefault_0' + 'export default __vite__cjsExportDefault_0', ) }) }) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts index 452336631be666..49b203c3ae093f 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts @@ -7,32 +7,32 @@ export interface ModuleType { export const basic = import.meta.glob('./modules/*.ts') export const basicEager = import.meta.glob('./modules/*.ts', { - eager: true + eager: true, }) export const ignore = import.meta.glob(['./modules/*.ts', '!**/index.ts']) export const namedEager = import.meta.glob('./modules/*.ts', { eager: true, - import: 'name' + import: 'name', }) export const namedDefault = import.meta.glob('./modules/*.ts', { - import: 'default' + import: 'default', }) export const eagerAs = import.meta.glob( ['./modules/*.ts', '!**/index.ts'], - { eager: true, as: 'raw' } + { eager: true, as: 'raw' }, ) export const rawImportModule = import.meta.glob( ['./modules/*.ts', '!**/index.ts'], - { as: 'raw', import: '*' } + { as: 'raw', import: '*' }, ) export const excludeSelf = import.meta.glob( - './*.ts' + './*.ts', // for test: annotation contain ")" /* * for test: annotation contain ")" @@ -44,25 +44,25 @@ export const customQueryString = import.meta.glob('./*.ts', { query: 'custom' }) export const customQueryObject = import.meta.glob('./*.ts', { query: { foo: 'bar', - raw: true - } + raw: true, + }, }) export const parent = import.meta.glob('../../playground/src/*.ts', { - as: 'url' + as: 'url', }) export const rootMixedRelative = import.meta.glob( ['/*.ts', '../fixture-b/*.ts'], - { as: 'url' } + { as: 'url' }, ) export const cleverCwd1 = import.meta.glob( - './node_modules/framework/**/*.page.js' + './node_modules/framework/**/*.page.js', ) export const cleverCwd2 = import.meta.glob([ './modules/*.ts', '../fixture-b/*.ts', - '!**/index.ts' + '!**/index.ts', ]) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/fixture.test.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture.test.ts index cd6dc7c6fc4deb..22bacfa77edf6e 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/fixture.test.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/fixture.test.ts @@ -18,7 +18,9 @@ describe('fixture', async () => { ).code expect( - (await transformGlobImport(code, id, root, resolveId, true))?.s.toString() + ( + await transformGlobImport(code, id, root, resolveId, true) + )?.s.toString(), ).toMatchSnapshot() }) @@ -37,8 +39,8 @@ describe('fixture', async () => { import.meta.glob( './*.js' ) - `.trim() - ) + `.trim(), + ), ).toBe(3) }) @@ -46,12 +48,12 @@ describe('fixture', async () => { const root = resolve(__dirname, './fixture-a') const code = [ "import.meta.glob('/modules/*.ts')", - "import.meta.glob(['/../fixture-b/*.ts'])" + "import.meta.glob(['/../fixture-b/*.ts'])", ].join('\n') expect( ( await transformGlobImport(code, 'virtual:module', root, resolveId, true) - )?.s.toString() + )?.s.toString(), ).toMatchSnapshot() try { @@ -60,12 +62,12 @@ describe('fixture', async () => { 'virtual:module', root, resolveId, - true + true, ) expect('no error').toBe('should throw an error') } catch (err) { expect(err).toMatchInlineSnapshot( - "[Error: In virtual modules, all globs must start with '/']" + "[Error: In virtual modules, all globs must start with '/']", ) } }) @@ -79,7 +81,7 @@ describe('fixture', async () => { expect( ( await transformGlobImport(code, id, root, resolveId, true, true) - )?.s.toString() + )?.s.toString(), ).toMatchSnapshot() }) }) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/parse.test.ts b/packages/vite/src/node/__tests__/plugins/importGlob/parse.test.ts index c6a2a3efa7fa2e..58b357ed357630 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/parse.test.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/parse.test.ts @@ -6,12 +6,12 @@ async function run(input: string) { input, process.cwd(), process.cwd(), - (id) => id + (id) => id, ) return items.map((i) => ({ globs: i.globs, options: i.options, - start: i.start + start: i.start, })) } @@ -28,7 +28,7 @@ describe('parse positives', async () => { expect( await run(` import.meta.glob(\'./modules/*.ts\') - `) + `), ).toMatchInlineSnapshot(` [ { @@ -46,7 +46,7 @@ describe('parse positives', async () => { expect( await run(` import.meta.glob([\'./modules/*.ts\', './dir/*.{js,ts}\']) - `) + `), ).toMatchInlineSnapshot(` [ { @@ -71,7 +71,7 @@ describe('parse positives', async () => { eager: true, import: 'named' }) - `) + `), ).toMatchInlineSnapshot(` [ { @@ -99,7 +99,7 @@ describe('parse positives', async () => { * for test: annotation contain ")" * */ ) - `) + `), ).toMatchInlineSnapshot(` [ { @@ -125,7 +125,7 @@ describe('parse positives', async () => { } } ) - `) + `), ).toMatchInlineSnapshot(` [ { @@ -149,7 +149,7 @@ describe('parse positives', async () => { await run(` export const pageFiles = { '.page': import.meta.glob('/**/*.page.*([a-zA-Z0-9])') -};`) +};`), ).toMatchInlineSnapshot(` [ { @@ -168,7 +168,7 @@ describe('parse positives', async () => { await run(` export const pageFiles = { '.page': import.meta.glob('/**/*.page.*([a-zA-Z0-9])'), -};`) +};`), ).toMatchInlineSnapshot(` [ { @@ -188,7 +188,7 @@ describe('parse positives', async () => { export const pageFiles = { '.page.client': import.meta.glob('/**/*.page.client.*([a-zA-Z0-9])'), '.page.server': import.meta.glob('/**/*.page.server.*([a-zA-Z0-9])'), -};`) +};`), ).toMatchInlineSnapshot(` [ { @@ -215,7 +215,7 @@ describe('parse positives', async () => { export const pageFiles = [ import.meta.glob('/**/*.page.client.*([a-zA-Z0-9])'), import.meta.glob('/**/*.page.server.*([a-zA-Z0-9])'), - ]`) + ]`), ).toMatchInlineSnapshot(` [ { @@ -240,21 +240,21 @@ describe('parse positives', async () => { describe('parse negatives', async () => { it('syntax error', async () => { expect(await runError('import.meta.glob(')).toMatchInlineSnapshot( - '[SyntaxError: Unexpected token (1:17)]' + '[SyntaxError: Unexpected token (1:17)]', ) }) it('empty', async () => { expect(await runError('import.meta.glob()')).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected 1-2 arguments, but got 0]' + '[Error: Invalid glob import syntax: Expected 1-2 arguments, but got 0]', ) }) it('3 args', async () => { expect( - await runError('import.meta.glob("", {}, {})') + await runError('import.meta.glob("", {}, {})'), ).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected 1-2 arguments, but got 3]' + '[Error: Invalid glob import syntax: Expected 1-2 arguments, but got 3]', ) }) @@ -264,15 +264,15 @@ describe('parse negatives', async () => { it('variable', async () => { expect(await runError('import.meta.glob(hey)')).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Could only use literals]' + '[Error: Invalid glob import syntax: Could only use literals]', ) }) it('template', async () => { expect( - await runError('import.meta.glob(`hi ${hey}`)') + await runError('import.meta.glob(`hi ${hey}`)'), ).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected glob to be a string, but got dynamic template literal]' + '[Error: Invalid glob import syntax: Expected glob to be a string, but got dynamic template literal]', ) }) @@ -308,75 +308,75 @@ describe('parse negatives', async () => { it('be string', async () => { expect(await runError('import.meta.glob(1)')).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected glob to be a string, but got "number"]' + '[Error: Invalid glob import syntax: Expected glob to be a string, but got "number"]', ) }) it('be array variable', async () => { expect(await runError('import.meta.glob([hey])')).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Could only use literals]' + '[Error: Invalid glob import syntax: Could only use literals]', ) expect( - await runError('import.meta.glob(["1", hey])') + await runError('import.meta.glob(["1", hey])'), ).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Could only use literals]' + '[Error: Invalid glob import syntax: Could only use literals]', ) }) it('options', async () => { expect( - await runError('import.meta.glob("hey", hey)') + await runError('import.meta.glob("hey", hey)'), ).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected the second argument to be an object literal, but got "Identifier"]' + '[Error: Invalid glob import syntax: Expected the second argument to be an object literal, but got "Identifier"]', ) expect(await runError('import.meta.glob("hey", [])')).toMatchInlineSnapshot( - '[Error: Invalid glob import syntax: Expected the second argument to be an object literal, but got "ArrayExpression"]' + '[Error: Invalid glob import syntax: Expected the second argument to be an object literal, but got "ArrayExpression"]', ) }) it('options props', async () => { expect( - await runError('import.meta.glob("hey", { hey: 1 })') + await runError('import.meta.glob("hey", { hey: 1 })'), ).toMatchInlineSnapshot('[Error: Unknown glob option "hey"]') expect( - await runError('import.meta.glob("hey", { import: hey })') + await runError('import.meta.glob("hey", { import: hey })'), ).toMatchInlineSnapshot( - '[Error: Vite is unable to parse the glob options as the value is not static]' + '[Error: Vite is unable to parse the glob options as the value is not static]', ) expect( - await runError('import.meta.glob("hey", { eager: 123 })') + await runError('import.meta.glob("hey", { eager: 123 })'), ).toMatchInlineSnapshot( - '[Error: Expected glob option "eager" to be of type boolean, but got number]' + '[Error: Expected glob option "eager" to be of type boolean, but got number]', ) }) it('options query', async () => { expect( - await runError('import.meta.glob("./*.js", { as: "raw", query: "hi" })') + await runError('import.meta.glob("./*.js", { as: "raw", query: "hi" })'), ).toMatchInlineSnapshot( - '[Error: Options "as" and "query" cannot be used together]' + '[Error: Options "as" and "query" cannot be used together]', ) expect( - await runError('import.meta.glob("./*.js", { query: 123 })') + await runError('import.meta.glob("./*.js", { query: 123 })'), ).toMatchInlineSnapshot( - '[Error: Expected glob option "query" to be of type object or string, but got number]' + '[Error: Expected glob option "query" to be of type object or string, but got number]', ) expect( - await runError('import.meta.glob("./*.js", { query: { foo: {} } })') + await runError('import.meta.glob("./*.js", { query: { foo: {} } })'), ).toMatchInlineSnapshot( - '[Error: Expected glob option "query.foo" to be of type string, number, or boolean, but got object]' + '[Error: Expected glob option "query.foo" to be of type string, number, or boolean, but got object]', ) expect( - await runError('import.meta.glob("./*.js", { query: { foo: hey } })') + await runError('import.meta.glob("./*.js", { query: { foo: hey } })'), ).toMatchInlineSnapshot( - '[Error: Vite is unable to parse the glob options as the value is not static]' + '[Error: Vite is unable to parse the glob options as the value is not static]', ) expect( await runError( - 'import.meta.glob("./*.js", { query: { foo: 123, ...a } })' - ) + 'import.meta.glob("./*.js", { query: { foo: 123, ...a } })', + ), ).toMatchInlineSnapshot( - '[Error: Vite is unable to parse the glob options as the value is not static]' + '[Error: Vite is unable to parse the glob options as the value is not static]', ) }) }) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/utils.test.ts b/packages/vite/src/node/__tests__/plugins/importGlob/utils.test.ts index 302df97ec92ede..bd91c6165f798e 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/utils.test.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/utils.test.ts @@ -10,10 +10,10 @@ describe('getCommonBase()', async () => { }) it('static file', () => { expect( - getCommonBase(['/a/b/**/*.vue', '/a/b/**/*.jsx', '/a/b/foo.js']) + getCommonBase(['/a/b/**/*.vue', '/a/b/**/*.jsx', '/a/b/foo.js']), ).toBe('/a/b') expect(getCommonBase(['/a/b/**/*.vue', '/a/b/**/*.jsx', '/a/foo.js'])).toBe( - '/a' + '/a', ) }) it('correct `scan()`', () => { diff --git a/packages/vite/src/node/__tests__/scan.spec.ts b/packages/vite/src/node/__tests__/scan.spec.ts index 0f9475562365d5..0a417f37a49b0a 100644 --- a/packages/vite/src/node/__tests__/scan.spec.ts +++ b/packages/vite/src/node/__tests__/scan.spec.ts @@ -14,14 +14,14 @@ describe('optimizer-scan:script-test', () => { test('component return value test', () => { scriptRE.lastIndex = 0 const [, tsOpenTag, tsContent] = scriptRE.exec( - `` + ``, ) expect(tsOpenTag).toEqual('` + ``, ) expect(openTag).toEqual(' const filePath = id.replace(normalizePath(config.root), '') addToHTMLProxyCache(config, filePath, inlineModuleIndex, { - code: contents + code: contents, }) js += `\nimport "${id}?html-proxy&index=${inlineModuleIndex}.js"` shouldRemove = true @@ -389,7 +389,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin { } else if (url && !isPublicFile) { if (!isExcludedUrl(url)) { config.logger.warn( - ` diff --git a/packages/vite/src/node/server/middlewares/htmlFallback.ts b/packages/vite/src/node/server/middlewares/htmlFallback.ts index 7976d24c0b09f0..b646488dddfff4 100644 --- a/packages/vite/src/node/server/middlewares/htmlFallback.ts +++ b/packages/vite/src/node/server/middlewares/htmlFallback.ts @@ -6,7 +6,7 @@ import { createDebugger } from '../../utils' export function htmlFallbackMiddleware( root: string, - spaFallback: boolean + spaFallback: boolean, ): Connect.NextHandleFunction { const historyHtmlFallbackMiddleware = history({ logger: createDebugger('vite:html-fallback'), @@ -23,9 +23,9 @@ export function htmlFallbackMiddleware( } return spaFallback ? `/index.html` : request.url - } - } - ] + }, + }, + ], }) // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` diff --git a/packages/vite/src/node/server/middlewares/indexHtml.ts b/packages/vite/src/node/server/middlewares/indexHtml.ts index 13e4468c3fb291..9701637c0b544a 100644 --- a/packages/vite/src/node/server/middlewares/indexHtml.ts +++ b/packages/vite/src/node/server/middlewares/indexHtml.ts @@ -16,7 +16,7 @@ import { postImportMapHook, preImportMapHook, resolveHtmlTransforms, - traverseHtml + traverseHtml, } from '../../plugins/html' import type { ResolvedConfig, ViteDevServer } from '../..' import { send } from '../send' @@ -29,7 +29,7 @@ import { joinUrlSegments, normalizePath, processSrcSetSync, - wrapId + wrapId, } from '../../utils' import type { ModuleGraph } from '../moduleGraph' @@ -40,10 +40,10 @@ interface AssetNode { } export function createDevHtmlTransformFn( - server: ViteDevServer + server: ViteDevServer, ): (url: string, html: string, originalUrl: string) => Promise { const [preHooks, normalHooks, postHooks] = resolveHtmlTransforms( - server.config.plugins + server.config.plugins, ) return (url: string, html: string, originalUrl: string): Promise => { return applyHtmlTransforms( @@ -54,14 +54,14 @@ export function createDevHtmlTransformFn( devHtmlHook, ...normalHooks, ...postHooks, - postImportMapHook() + postImportMapHook(), ], { path: url, filename: getHtmlFilename(url, server), server, - originalUrl - } + originalUrl, + }, ) } } @@ -71,7 +71,7 @@ function getHtmlFilename(url: string, server: ViteDevServer) { return decodeURIComponent(fsPathFromId(url)) } else { return decodeURIComponent( - normalizePath(path.join(server.config.root, url.slice(1))) + normalizePath(path.join(server.config.root, url.slice(1))), ) } } @@ -84,7 +84,7 @@ const processNodeUrl = ( config: ResolvedConfig, htmlPath: string, originalUrl?: string, - moduleGraph?: ModuleGraph + moduleGraph?: ModuleGraph, ) => { let url = attr.value || '' @@ -122,7 +122,7 @@ const processNodeUrl = ( } const devHtmlHook: IndexHtmlTransformHook = async ( html, - { path: htmlPath, filename, server, originalUrl } + { path: htmlPath, filename, server, originalUrl }, ) => { const { config, moduleGraph, watcher } = server! const base = config.base || '/' @@ -149,13 +149,13 @@ const devHtmlHook: IndexHtmlTransformHook = async ( let inlineModuleIndex = -1 const proxyCacheUrl = cleanUrl(proxyModulePath).replace( normalizePath(config.root), - '' + '', ) const styleUrl: AssetNode[] = [] const addInlineModule = ( node: DefaultTreeAdapterMap['element'], - ext: 'js' + ext: 'js', ) => { inlineModuleIndex++ @@ -168,7 +168,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( map = new MagicString(html) .snip( contentNode.sourceCodeLocation!.startOffset, - contentNode.sourceCodeLocation!.endOffset + contentNode.sourceCodeLocation!.endOffset, ) .generateMap({ hires: true }) map.sources = [filename] @@ -189,7 +189,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( s.update( node.sourceCodeLocation!.startOffset, node.sourceCodeLocation!.endOffset, - `` + ``, ) } @@ -210,7 +210,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( config, htmlPath, originalUrl, - moduleGraph + moduleGraph, ) } else if (isModule && node.childNodes.length) { addInlineModule(node, 'js') @@ -222,7 +222,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( styleUrl.push({ start: children.sourceCodeLocation!.startOffset, end: children.sourceCodeLocation!.endOffset, - code: children.value + code: children.value, }) } @@ -238,7 +238,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( s, config, htmlPath, - originalUrl + originalUrl, ) } } @@ -255,7 +255,7 @@ const devHtmlHook: IndexHtmlTransformHook = async ( const result = await server!.pluginContainer.transform(code, mod.id!) s.overwrite(start, end, result?.code || '') - }) + }), ) html = s.toString() @@ -267,16 +267,16 @@ const devHtmlHook: IndexHtmlTransformHook = async ( tag: 'script', attrs: { type: 'module', - src: path.posix.join(base, CLIENT_PUBLIC_PATH) + src: path.posix.join(base, CLIENT_PUBLIC_PATH), }, - injectTo: 'head-prepend' - } - ] + injectTo: 'head-prepend', + }, + ], } } export function indexHtmlMiddleware( - server: ViteDevServer + server: ViteDevServer, ): Connect.NextHandleFunction { // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` return async function viteIndexHtmlMiddleware(req, res, next) { @@ -293,7 +293,7 @@ export function indexHtmlMiddleware( let html = fs.readFileSync(filename, 'utf-8') html = await server.transformIndexHtml(url, html, req.originalUrl) return send(req, res, html, 'html', { - headers: server.config.server.headers + headers: server.config.server.headers, }) } catch (e) { return next(e) diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 3e08e3c6aca901..43fce52e3befdf 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -25,14 +25,14 @@ export interface ProxyOptions extends HttpProxy.ServerOptions { bypass?: ( req: http.IncomingMessage, res: http.ServerResponse, - options: ProxyOptions + options: ProxyOptions, ) => void | null | undefined | false | string } export function proxyMiddleware( httpServer: http.Server | null, options: NonNullable, - config: ResolvedConfig + config: ResolvedConfig, ): Connect.NextHandleFunction { // lazy require only when proxy is used const proxies: Record = {} @@ -57,20 +57,20 @@ export function proxyMiddleware( }`, { timestamp: true, - error: err - } + error: err, + }, ) if (!res.headersSent && !res.writableEnded) { res .writeHead(500, { - 'Content-Type': 'text/plain' + 'Content-Type': 'text/plain', }) .end() } } else { config.logger.error(`${colors.red(`ws proxy error:`)}\n${err.stack}`, { timestamp: true, - error: err + error: err, }) res.end() } diff --git a/packages/vite/src/node/server/middlewares/static.ts b/packages/vite/src/node/server/middlewares/static.ts index 8f6b47f3a7e4bb..4e54af75d84538 100644 --- a/packages/vite/src/node/server/middlewares/static.ts +++ b/packages/vite/src/node/server/middlewares/static.ts @@ -15,7 +15,7 @@ import { isParentDirectory, isWindows, shouldServe, - slash + slash, } from '../../utils' const sirvOptions = (headers?: OutgoingHttpHeaders): Options => { @@ -37,13 +37,13 @@ const sirvOptions = (headers?: OutgoingHttpHeaders): Options => { res.setHeader(name, headers[name]!) } } - } + }, } } export function servePublicMiddleware( dir: string, - headers?: OutgoingHttpHeaders + headers?: OutgoingHttpHeaders, ): Connect.NextHandleFunction { const serve = sirv(dir, sirvOptions(headers)) @@ -62,7 +62,7 @@ export function servePublicMiddleware( export function serveStaticMiddleware( dir: string, - server: ViteDevServer + server: ViteDevServer, ): Connect.NextHandleFunction { const serve = sirv(dir, sirvOptions(server.config.server.headers)) @@ -122,7 +122,7 @@ export function serveStaticMiddleware( } export function serveRawFsMiddleware( - server: ViteDevServer + server: ViteDevServer, ): Connect.NextHandleFunction { const serveFromRoot = sirv('/', sirvOptions(server.config.server.headers)) @@ -141,7 +141,7 @@ export function serveRawFsMiddleware( slash(path.resolve(fsPathFromId(pathname))), server, res, - next + next, ) ) { return @@ -161,7 +161,7 @@ export function serveRawFsMiddleware( export function isFileServingAllowed( url: string, - server: ViteDevServer + server: ViteDevServer, ): boolean { if (!server.config.server.fs.strict) return true @@ -181,7 +181,7 @@ function ensureServingAccess( url: string, server: ViteDevServer, res: ServerResponse, - next: Connect.NextFunction + next: Connect.NextFunction, ): boolean { if (isFileServingAllowed(url, server)) { return true diff --git a/packages/vite/src/node/server/middlewares/transform.ts b/packages/vite/src/node/server/middlewares/transform.ts index 831ea2c2139a2b..f9ee475451a93b 100644 --- a/packages/vite/src/node/server/middlewares/transform.ts +++ b/packages/vite/src/node/server/middlewares/transform.ts @@ -15,7 +15,7 @@ import { prettifyUrl, removeImportQuery, removeTimestampQuery, - unwrapId + unwrapId, } from '../../utils' import { send } from '../send' import { ERR_LOAD_URL, transformRequest } from '../transformRequest' @@ -23,16 +23,16 @@ import { isHTMLProxy } from '../../plugins/html' import { DEP_VERSION_RE, FS_PREFIX, - NULL_BYTE_PLACEHOLDER + NULL_BYTE_PLACEHOLDER, } from '../../constants' import { isCSSRequest, isDirectCSSRequest, - isDirectRequest + isDirectRequest, } from '../../plugins/css' import { ERR_OPTIMIZE_DEPS_PROCESSING_ERROR, - ERR_OUTDATED_OPTIMIZED_DEP + ERR_OUTDATED_OPTIMIZED_DEP, } from '../../plugins/optimizedDeps' import { getDepsOptimizer } from '../../optimizer' @@ -42,11 +42,11 @@ const isDebug = !!process.env.DEBUG const knownIgnoreList = new Set(['/', '/favicon.ico']) export function transformMiddleware( - server: ViteDevServer + server: ViteDevServer, ): Connect.NextHandleFunction { const { config: { root, logger }, - moduleGraph + moduleGraph, } = server // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` @@ -59,7 +59,7 @@ export function transformMiddleware( try { url = decodeURI(removeTimestampQuery(req.url!)).replace( NULL_BYTE_PLACEHOLDER, - '\0' + '\0', ) } catch (e) { return next(e) @@ -78,12 +78,12 @@ export function transformMiddleware( const mapFile = url.startsWith(FS_PREFIX) ? fsPathFromId(url) : normalizePath( - ensureVolumeInPath(path.resolve(root, url.slice(1))) + ensureVolumeInPath(path.resolve(root, url.slice(1))), ) try { const map = await fs.readFile(mapFile, 'utf-8') return send(req, res, map, 'json', { - headers: server.config.server.headers + headers: server.config.server.headers, }) } catch (e) { // Outdated source map request for optimized deps, this isn't an error @@ -95,11 +95,11 @@ export function transformMiddleware( sources: [], sourcesContent: [], names: [], - mappings: ';;;;;;;;;' + mappings: ';;;;;;;;;', } return send(req, res, JSON.stringify(dummySourceMap), 'json', { cacheControl: 'no-cache', - headers: server.config.server.headers + headers: server.config.server.headers, }) } } else { @@ -108,7 +108,7 @@ export function transformMiddleware( ?.transformResult?.map if (map) { return send(req, res, JSON.stringify(map), 'json', { - headers: server.config.server.headers + headers: server.config.server.headers, }) } else { return next() @@ -131,15 +131,15 @@ export function transformMiddleware( warning = 'Assets in public cannot be imported from JavaScript.\n' + `Instead of ${colors.cyan( - rawUrl + rawUrl, )}, put the file in the src directory, and use ${colors.cyan( - rawUrl.replace(publicPath, '/src/') + rawUrl.replace(publicPath, '/src/'), )} instead.` } else { warning = `files in the public directory are served at the root path.\n` + `Instead of ${colors.cyan(url)}, use ${colors.cyan( - url.replace(publicPath, '/') + url.replace(publicPath, '/'), )}.` } @@ -183,7 +183,7 @@ export function transformMiddleware( // resolve, load and transform using the plugin container const result = await transformRequest(url, server, { - html: req.headers.accept?.includes('text/html') + html: req.headers.accept?.includes('text/html'), }) if (result) { const depsOptimizer = getDepsOptimizer(server.config, false) // non-ssr @@ -195,7 +195,7 @@ export function transformMiddleware( // allow browser to cache npm deps! cacheControl: isDep ? 'max-age=31536000,immutable' : 'no-cache', headers: server.config.server.headers, - map: result.map + map: result.map, }) } } diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index b9d928b589e00b..895ebe02f4960d 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -5,7 +5,7 @@ import { cleanUrl, normalizePath, removeImportQuery, - removeTimestampQuery + removeTimestampQuery, } from '../utils' import { FS_PREFIX } from '../constants' import type { TransformResult } from './transformRequest' @@ -61,7 +61,7 @@ function invalidateSSRModule(mod: ModuleNode, seen: Set) { export type ResolvedUrl = [ url: string, resolvedId: string, - meta: object | null | undefined + meta: object | null | undefined, ] export class ModuleGraph { @@ -74,13 +74,13 @@ export class ModuleGraph { constructor( private resolveId: ( url: string, - ssr: boolean - ) => Promise + ssr: boolean, + ) => Promise, ) {} async getModuleByUrl( rawUrl: string, - ssr?: boolean + ssr?: boolean, ): Promise { const [url] = await this.resolveUrl(rawUrl, ssr) return this.urlToModuleMap.get(url) @@ -107,7 +107,7 @@ export class ModuleGraph { invalidateModule( mod: ModuleNode, seen: Set = new Set(), - timestamp: number = Date.now() + timestamp: number = Date.now(), ): void { // Save the timestamp for this invalidation, so we can avoid caching the result of possible already started // processing being done for this module @@ -139,7 +139,7 @@ export class ModuleGraph { acceptedModules: Set, acceptedExports: Set | null, isSelfAccepting: boolean, - ssr?: boolean + ssr?: boolean, ): Promise | undefined> { mod.isSelfAccepting = isSelfAccepting const prevImports = mod.importedModules @@ -182,7 +182,7 @@ export class ModuleGraph { async ensureEntryFromUrl( rawUrl: string, ssr?: boolean, - setIsSelfAccepting = true + setIsSelfAccepting = true, ): Promise { const [url, resolvedId, meta] = await this.resolveUrl(rawUrl, ssr) let mod = this.idToModuleMap.get(resolvedId) diff --git a/packages/vite/src/node/server/openBrowser.ts b/packages/vite/src/node/server/openBrowser.ts index 72fe339937a624..bf2a383d6b7aba 100644 --- a/packages/vite/src/node/server/openBrowser.ts +++ b/packages/vite/src/node/server/openBrowser.ts @@ -23,7 +23,7 @@ import { VITE_PACKAGE_DIR } from '../constants' export function openBrowser( url: string, opt: string | true, - logger: Logger + logger: Logger, ): boolean { // The browser executable to open. // See https://github.com/sindresorhus/open#app for documentation. @@ -39,17 +39,17 @@ export function openBrowser( function executeNodeScript(scriptPath: string, url: string, logger: Logger) { const extraArgs = process.argv.slice(2) const child = spawn(process.execPath, [scriptPath, ...extraArgs, url], { - stdio: 'inherit' + stdio: 'inherit', }) child.on('close', (code) => { if (code !== 0) { logger.error( colors.red( `\nThe script specified as BROWSER environment variable failed.\n\n${colors.cyan( - scriptPath - )} exited with code ${code}.` + scriptPath, + )} exited with code ${code}.`, ), - { error: null } + { error: null }, ) } }) @@ -64,7 +64,7 @@ const supportedChromiumBrowsers = [ 'Microsoft Edge', 'Brave Browser', 'Vivaldi', - 'Chromium' + 'Chromium', ] function startBrowserProcess(browser: string | undefined, url: string) { @@ -89,12 +89,12 @@ function startBrowserProcess(browser: string | undefined, url: string) { // Try our best to reuse existing tab with AppleScript execSync( `osascript openChrome.applescript "${encodeURI( - url + url, )}" "${openedBrowser}"`, { cwd: join(VITE_PACKAGE_DIR, 'bin'), - stdio: 'ignore' - } + stdio: 'ignore', + }, ) return true } catch (err) { diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index 4c4d7ffb1f1a13..f16498c3bbf50c 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -51,7 +51,7 @@ import type { PluginContext as RollupPluginContext, SourceDescription, SourceMap, - TransformResult + TransformResult, } from 'rollup' import * as acorn from 'acorn' import type { RawSourceMap } from '@ampproject/remapping' @@ -73,7 +73,7 @@ import { normalizePath, numberToPos, prettifyUrl, - timeFrom + timeFrom, } from '../utils' import { FS_PREFIX } from '../constants' import type { ResolvedConfig } from '../config' @@ -105,7 +105,7 @@ export interface PluginContainer { */ scan?: boolean isEntry?: boolean - } + }, ): Promise transform( code: string, @@ -113,13 +113,13 @@ export interface PluginContainer { options?: { inMap?: SourceDescription['map'] ssr?: boolean - } + }, ): Promise load( id: string, options?: { ssr?: boolean - } + }, ): Promise close(): Promise } @@ -139,14 +139,14 @@ export let parser = acorn.Parser export async function createPluginContainer( config: ResolvedConfig, moduleGraph?: ModuleGraph, - watcher?: FSWatcher + watcher?: FSWatcher, ): Promise { const isDebug = process.env.DEBUG const { plugins, logger, root, - build: { rollupOptions } + build: { rollupOptions }, } = config const { getSortedPluginHooks, getSortedPlugins } = createPluginHookUtils(plugins) @@ -154,19 +154,19 @@ export async function createPluginContainer( const seenResolves: Record = {} const debugResolve = createDebugger('vite:resolve') const debugPluginResolve = createDebugger('vite:plugin-resolve', { - onlyWhenFocused: 'vite:plugin' + onlyWhenFocused: 'vite:plugin', }) const debugPluginTransform = createDebugger('vite:plugin-transform', { - onlyWhenFocused: 'vite:plugin' + onlyWhenFocused: 'vite:plugin', }) const debugSourcemapCombineFlag = 'vite:sourcemap-combine' const isDebugSourcemapCombineFocused = process.env.DEBUG?.includes( - debugSourcemapCombineFlag + debugSourcemapCombineFlag, ) const debugSourcemapCombineFilter = process.env.DEBUG_VITE_SOURCEMAP_COMBINE_FILTER const debugSourcemapCombine = createDebugger('vite:sourcemap-combine', { - onlyWhenFocused: true + onlyWhenFocused: true, }) // --------------------------------------------------------------------------- @@ -176,8 +176,8 @@ export async function createPluginContainer( const minimalContext: MinimalPluginContext = { meta: { rollupVersion, - watchMode: true - } + watchMode: true, + }, } function warnIncompatibleMethod(method: string, plugin: string) { @@ -185,9 +185,9 @@ export async function createPluginContainer( colors.cyan(`[plugin:${plugin}] `) + colors.yellow( `context method ${colors.bold( - `${method}()` - )} is not supported in serve mode. This plugin is likely not vite-compatible.` - ) + `${method}()`, + )} is not supported in serve mode. This plugin is likely not vite-compatible.`, + ), ) } @@ -195,7 +195,7 @@ export async function createPluginContainer( async function hookParallel( hookName: H, context: (plugin: Plugin) => ThisType, - args: (plugin: Plugin) => Parameters + args: (plugin: Plugin) => Parameters, ): Promise { const parallelPromises: Promise[] = [] for (const plugin of getSortedPlugins(hookName)) { @@ -221,9 +221,9 @@ export async function createPluginContainer( return info[key] } throw Error( - `[vite] The "${key}" property of ModuleInfo is not supported.` + `[vite] The "${key}" property of ModuleInfo is not supported.`, ) - } + }, } // same default value of "moduleInfo.meta" as in Rollup @@ -237,7 +237,7 @@ export async function createPluginContainer( if (!module.info) { module.info = new Proxy( { id, meta: module.meta || EMPTY_OBJECT } as ModuleInfo, - ModuleInfoProxy + ModuleInfoProxy, ) } return module.info @@ -274,7 +274,7 @@ export async function createPluginContainer( sourceType: 'module', ecmaVersion: 'latest', locations: true, - ...opts + ...opts, }) } @@ -286,7 +286,7 @@ export async function createPluginContainer( custom?: CustomPluginOptions isEntry?: boolean skipSelf?: boolean - } + }, ) { let skip: Set | undefined if (options?.skipSelf && this._activePlugin) { @@ -299,7 +299,7 @@ export async function createPluginContainer( isEntry: !!options?.isEntry, skip, ssr: this.ssr, - scan: this._scan + scan: this._scan, }) if (typeof out === 'string') out = { id: out } return out as ResolvedId | null @@ -341,23 +341,23 @@ export async function createPluginContainer( warn( e: string | RollupError, - position?: number | { column: number; line: number } + position?: number | { column: number; line: number }, ) { const err = formatError(e, position, this) const msg = buildErrorMessage( err, [colors.yellow(`warning: ${err.message}`)], - false + false, ) logger.warn(msg, { clear: true, - timestamp: true + timestamp: true, }) } error( e: string | RollupError, - position?: number | { column: number; line: number } + position?: number | { column: number; line: number }, ): never { // error thrown here is caught by the transform middleware and passed on // the the error middleware. @@ -368,7 +368,7 @@ export async function createPluginContainer( function formatError( e: string | RollupError, position: number | { column: number; line: number } | undefined, - ctx: Context + ctx: Context, ) { const err = ( typeof e === 'string' ? new Error(e) : e @@ -399,16 +399,16 @@ export async function createPluginContainer( } catch (err2) { logger.error( colors.red( - `Error in error handler:\n${err2.stack || err2.message}\n` + `Error in error handler:\n${err2.stack || err2.message}\n`, ), // print extra newline to separate the two errors - { error: err2 } + { error: err2 }, ) throw err } err.loc = err.loc || { file: err.id, - ...errLocation + ...errLocation, } err.frame = err.frame || generateCodeFrame(ctx._activeCode, pos) } else if (err.loc) { @@ -427,7 +427,7 @@ export async function createPluginContainer( err.loc = { file: err.id, line: (err as any).line, - column: (err as any).column + column: (err as any).column, } err.frame = err.frame || generateCodeFrame(err.id!, err.loc) } @@ -438,7 +438,7 @@ export async function createPluginContainer( const traced = new TraceMap(rawSourceMap as any) const { source, line, column } = originalPositionFor(traced, { line: Number(err.loc.line), - column: Number(err.loc.column) + column: Number(err.loc.column), }) if (source && line != null && column != null) { err.loc = { file: source, line, column } @@ -495,9 +495,9 @@ export async function createPluginContainer( combinedMap = combineSourcemaps(cleanUrl(this.filename), [ { ...(m as RawSourceMap), - sourcesContent: combinedMap.sourcesContent + sourcesContent: combinedMap.sourcesContent, }, - combinedMap as RawSourceMap + combinedMap as RawSourceMap, ]) as SourceMap } } @@ -506,7 +506,7 @@ export async function createPluginContainer( ? new MagicString(this.originalCode).generateMap({ includeContent: true, hires: true, - source: cleanUrl(this.filename) + source: cleanUrl(this.filename), }) : null } @@ -532,13 +532,13 @@ export async function createPluginContainer( } if (options.acornInjectPlugins) { parser = acorn.Parser.extend( - ...(arraify(options.acornInjectPlugins) as any) + ...(arraify(options.acornInjectPlugins) as any), ) } return { acorn, acornInjectPlugins: [], - ...options + ...options, } })(), @@ -548,7 +548,7 @@ export async function createPluginContainer( await hookParallel( 'buildStart', (plugin) => new Context(plugin), - () => [container.options as NormalizedInputOptions] + () => [container.options as NormalizedInputOptions], ) }, @@ -580,7 +580,7 @@ export async function createPluginContainer( custom: options?.custom, isEntry: !!options?.isEntry, ssr, - scan + scan, }) if (!result) continue @@ -595,7 +595,7 @@ export async function createPluginContainer( debugPluginResolve( timeFrom(pluginResolveStart), plugin.name, - prettifyUrl(id, root) + prettifyUrl(id, root), ) // resolveId() is hookFirst - first non-null result is returned. @@ -609,8 +609,8 @@ export async function createPluginContainer( seenResolves[key] = true debugResolve( `${timeFrom(resolveStart)} ${colors.cyan(rawId)} -> ${colors.dim( - id - )}` + id, + )}`, ) } } @@ -669,7 +669,7 @@ export async function createPluginContainer( debugPluginTransform( timeFrom(start), plugin.name, - prettifyUrl(id, root) + prettifyUrl(id, root), ) if (isObject(result)) { if (result.code !== undefined) { @@ -689,7 +689,7 @@ export async function createPluginContainer( } return { code, - map: ctx._getCombinedSourcemap() + map: ctx._getCombinedSourcemap(), } }, @@ -699,15 +699,15 @@ export async function createPluginContainer( await hookParallel( 'buildEnd', () => ctx, - () => [] + () => [], ) await hookParallel( 'closeBundle', () => ctx, - () => [] + () => [], ) closed = true - } + }, } return container diff --git a/packages/vite/src/node/server/searchRoot.ts b/packages/vite/src/node/server/searchRoot.ts index b40226f4a53e38..2a2ebd2660a6cb 100644 --- a/packages/vite/src/node/server/searchRoot.ts +++ b/packages/vite/src/node/server/searchRoot.ts @@ -17,7 +17,7 @@ const ROOT_FILES = [ // 'nx.json', // https://github.com/lerna/lerna#lernajson - 'lerna.json' + 'lerna.json', ] // npm: https://docs.npmjs.com/cli/v7/using-npm/workspaces#installing-workspaces @@ -58,7 +58,7 @@ export function searchForPackageRoot(current: string, root = current): string { */ export function searchForWorkspaceRoot( current: string, - root = searchForPackageRoot(current) + root = searchForPackageRoot(current), ): string { if (hasRootFile(current)) return current if (hasWorkspacePackageJSON(current)) return current diff --git a/packages/vite/src/node/server/send.ts b/packages/vite/src/node/server/send.ts index 51f1fa65afed25..aadebd1628885c 100644 --- a/packages/vite/src/node/server/send.ts +++ b/packages/vite/src/node/server/send.ts @@ -1,7 +1,7 @@ import type { IncomingMessage, OutgoingHttpHeaders, - ServerResponse + ServerResponse, } from 'node:http' import getEtag from 'etag' import type { SourceMap } from 'rollup' @@ -11,7 +11,7 @@ const alias: Record = { js: 'application/javascript', css: 'text/css', html: 'text/html', - json: 'application/json' + json: 'application/json', } export interface SendOptions { @@ -26,13 +26,13 @@ export function send( res: ServerResponse, content: string | Buffer, type: string, - options: SendOptions + options: SendOptions, ): void { const { etag = getEtag(content, { weak: true }), cacheControl = 'no-cache', headers, - map + map, } = options if (res.writableEnded) { diff --git a/packages/vite/src/node/server/sourcemap.ts b/packages/vite/src/node/server/sourcemap.ts index 774d74dc8bb398..96c62d590c6fdc 100644 --- a/packages/vite/src/node/server/sourcemap.ts +++ b/packages/vite/src/node/server/sourcemap.ts @@ -6,7 +6,7 @@ import { createDebugger } from '../utils' const isDebug = !!process.env.DEBUG const debug = createDebugger('vite:sourcemap', { - onlyWhenFocused: true + onlyWhenFocused: true, }) // Virtual modules should be prefixed with a null byte to avoid a @@ -23,13 +23,13 @@ interface SourceMapLike { export async function injectSourcesContent( map: SourceMapLike, file: string, - logger: Logger + logger: Logger, ): Promise { let sourceRoot: string | undefined try { // The source root is undefined for virtual modules and permission errors. sourceRoot = await fs.realpath( - path.resolve(path.dirname(file), map.sourceRoot || '') + path.resolve(path.dirname(file), map.sourceRoot || ''), ) } catch {} @@ -47,7 +47,7 @@ export async function injectSourcesContent( }) } return null - }) + }), ) // Use this command… @@ -69,7 +69,7 @@ export function genSourceMapUrl(map: SourceMap | string | undefined): string { export function getCodeWithSourcemap( type: 'js' | 'css', code: string, - map: SourceMap | null + map: SourceMap | null, ): string { if (isDebug) { code += `\n/*${JSON.stringify(map, null, 2).replace(/\*\//g, '*\\/')}*/\n` diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index b7bed216348504..79e94cd04c15c0 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -14,7 +14,7 @@ import { isObject, prettifyUrl, removeTimestampQuery, - timeFrom + timeFrom, } from '../utils' import { checkPublicFile } from '../plugins/asset' import { getDepsOptimizer } from '../optimizer' @@ -45,7 +45,7 @@ export interface TransformOptions { export function transformRequest( url: string, server: ViteDevServer, - options: TransformOptions = {} + options: TransformOptions = {}, ): Promise { const cacheKey = (options.ssr ? 'ssr:' : options.html ? 'html:' : '') + url @@ -107,7 +107,7 @@ export function transformRequest( server._pendingRequests.set(cacheKey, { request, timestamp, - abort: clearCache + abort: clearCache, }) request.then(clearCache, clearCache) @@ -118,7 +118,7 @@ async function doTransform( url: string, server: ViteDevServer, options: TransformOptions, - timestamp: number + timestamp: number, ) { url = removeTimestampQuery(url) @@ -158,7 +158,7 @@ async function loadAndTransform( url: string, server: ViteDevServer, options: TransformOptions, - timestamp: number + timestamp: number, ) { const { config, pluginContainer, moduleGraph, watcher } = server const { root, logger } = config @@ -204,7 +204,7 @@ async function loadAndTransform( code = code.replace(convertSourceMap.mapFileCommentRegex, blankReplacer) } catch (e) { logger.warn(`Failed to load source map for ${url}.`, { - timestamp: true + timestamp: true, }) } } @@ -225,7 +225,7 @@ async function loadAndTransform( `imported from source code. It can only be referenced via HTML tags.` : `Does the file exist?` const err: any = new Error( - `Failed to load url ${url} (resolved id: ${id}). ${msg}` + `Failed to load url ${url} (resolved id: ${id}). ${msg}`, ) err.code = isPublicFile ? ERR_LOAD_PUBLIC_URL : ERR_LOAD_URL throw err @@ -238,7 +238,7 @@ async function loadAndTransform( const transformStart = isDebug ? performance.now() : 0 const transformResult = await pluginContainer.transform(code, id, { inMap: map, - ssr + ssr, }) const originalCode = code if ( @@ -248,7 +248,7 @@ async function loadAndTransform( // no transform applied, keep code as-is isDebug && debugTransform( - timeFrom(transformStart) + colors.dim(` [skipped] ${prettyUrl}`) + timeFrom(transformStart) + colors.dim(` [skipped] ${prettyUrl}`), ) } else { isDebug && debugTransform(`${timeFrom(transformStart)} ${prettyUrl}`) @@ -268,7 +268,7 @@ async function loadAndTransform( : ({ code, map, - etag: getEtag(code, { weak: true }) + etag: getEtag(code, { weak: true }), } as TransformResult) // Only cache the result if the module wasn't invalidated while it was diff --git a/packages/vite/src/node/server/ws.ts b/packages/vite/src/node/server/ws.ts index cb8555122b6840..87170d11df8b39 100644 --- a/packages/vite/src/node/server/ws.ts +++ b/packages/vite/src/node/server/ws.ts @@ -16,7 +16,7 @@ export const HMR_HEADER = 'vite-hmr' export type WebSocketCustomListener = ( data: T, - client: WebSocketClient + client: WebSocketClient, ) => void export interface WebSocketServer { @@ -42,7 +42,7 @@ export interface WebSocketServer { on: WebSocketTypes.Server['on'] & { ( event: T, - listener: WebSocketCustomListener> + listener: WebSocketCustomListener>, ): void } /** @@ -74,13 +74,13 @@ const wsServerEvents = [ 'error', 'headers', 'listening', - 'message' + 'message', ] export function createWebSocketServer( server: Server | null, config: ResolvedConfig, - httpsOptions?: HttpsServerOptions + httpsOptions?: HttpsServerOptions, ): WebSocketServer { let wss: WebSocketServerRaw let httpsServer: Server | undefined = undefined @@ -115,12 +115,12 @@ export function createWebSocketServer( const body = STATUS_CODES[statusCode] if (!body) throw new Error( - `No body text found for the ${statusCode} status code` + `No body text found for the ${statusCode} status code`, ) res.writeHead(statusCode, { 'Content-Length': body.length, - 'Content-Type': 'text/plain' + 'Content-Type': 'text/plain', }) res.end(body) }) @@ -163,12 +163,12 @@ export function createWebSocketServer( if (e.code === 'EADDRINUSE') { config.logger.error( colors.red(`WebSocket server error: Port is already in use`), - { error: e } + { error: e }, ) } else { config.logger.error( colors.red(`WebSocket server error:\n${e.stack || e.message}`), - { error: e } + { error: e }, ) } }) @@ -184,14 +184,14 @@ export function createWebSocketServer( payload = { type: 'custom', event: args[0], - data: args[1] + data: args[1], } } else { payload = args[0] } socket.send(JSON.stringify(payload)) }, - socket + socket, }) } return clientsMap.get(socket)! @@ -231,7 +231,7 @@ export function createWebSocketServer( payload = { type: 'custom', event: args[0], - data: args[1] + data: args[1], } } else { payload = args[0] @@ -274,6 +274,6 @@ export function createWebSocketServer( } }) }) - } + }, } } diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index 1df5f2b128da5d..a21b0673e1f36d 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts @@ -17,7 +17,7 @@ test('ssrLoad', async () => { await server.ssrLoadModule('/fixtures/modules/has-invalid-import.js') } catch (e) { expect(e.message).toBe( - 'Failed to load url ./non-existent.js (resolved id: ./non-existent.js). Does the file exist?' + 'Failed to load url ./non-existent.js (resolved id: ./non-existent.js). Does the file exist?', ) } }) diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index 33d5071a054a99..74ff0e5277c135 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -9,7 +9,7 @@ const ssrTransformSimpleCode = async (code: string, url?: string) => test('default import', async () => { expect( - await ssrTransformSimpleCode(`import foo from 'vue';console.log(foo.bar)`) + await ssrTransformSimpleCode(`import foo from 'vue';console.log(foo.bar)`), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); console.log(__vite_ssr_import_0__.default.bar)" @@ -19,8 +19,8 @@ test('default import', async () => { test('named import', async () => { expect( await ssrTransformSimpleCode( - `import { ref } from 'vue';function foo() { return ref(0) }` - ) + `import { ref } from 'vue';function foo() { return ref(0) }`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); function foo() { return __vite_ssr_import_0__.ref(0) }" @@ -30,8 +30,8 @@ test('named import', async () => { test('namespace import', async () => { expect( await ssrTransformSimpleCode( - `import * as vue from 'vue';function foo() { return vue.ref(0) }` - ) + `import * as vue from 'vue';function foo() { return vue.ref(0) }`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); function foo() { return __vite_ssr_import_0__.ref(0) }" @@ -65,7 +65,7 @@ test('export var declaration', async () => { test('export named', async () => { expect( - await ssrTransformSimpleCode(`const a = 1, b = 2; export { a, b as c }`) + await ssrTransformSimpleCode(`const a = 1, b = 2; export { a, b as c }`), ).toMatchInlineSnapshot(` "const a = 1, b = 2; Object.defineProperty(__vite_ssr_exports__, \\"a\\", { enumerable: true, configurable: true, get(){ return a }}); @@ -75,7 +75,7 @@ test('export named', async () => { test('export named from', async () => { expect( - await ssrTransformSimpleCode(`export { ref, computed as c } from 'vue'`) + await ssrTransformSimpleCode(`export { ref, computed as c } from 'vue'`), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -87,8 +87,8 @@ test('export named from', async () => { test('named exports of imported binding', async () => { expect( await ssrTransformSimpleCode( - `import {createApp} from 'vue';export {createApp}` - ) + `import {createApp} from 'vue';export {createApp}`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -99,8 +99,8 @@ test('named exports of imported binding', async () => { test('export * from', async () => { expect( await ssrTransformSimpleCode( - `export * from 'vue'\n` + `export * from 'react'` - ) + `export * from 'vue'\n` + `export * from 'react'`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); __vite_ssr_exportAll__(__vite_ssr_import_0__); @@ -120,15 +120,15 @@ test('export * as from', async () => { test('export default', async () => { expect( - await ssrTransformSimpleCode(`export default {}`) + await ssrTransformSimpleCode(`export default {}`), ).toMatchInlineSnapshot(`"__vite_ssr_exports__.default = {}"`) }) test('export then import minified', async () => { expect( await ssrTransformSimpleCode( - `export * from 'vue';import {createApp} from 'vue';` - ) + `export * from 'vue';import {createApp} from 'vue';`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_1__ = await __vite_ssr_import__(\\"vue\\"); __vite_ssr_exportAll__(__vite_ssr_import_1__);const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -138,13 +138,13 @@ test('export then import minified', async () => { test('import.meta', async () => { expect( - await ssrTransformSimpleCode(`console.log(import.meta.url)`) + await ssrTransformSimpleCode(`console.log(import.meta.url)`), ).toMatchInlineSnapshot(`"console.log(__vite_ssr_import_meta__.url)"`) }) test('dynamic import', async () => { const result = await ssrTransformSimple( - `export const i = () => import('./foo')` + `export const i = () => import('./foo')`, ) expect(result?.code).toMatchInlineSnapshot(` "const i = () => __vite_ssr_dynamic_import__('./foo') @@ -156,7 +156,7 @@ test('dynamic import', async () => { test('do not rewrite method definition', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';class A { fn() { fn() } }` + `import { fn } from 'vue';class A { fn() { fn() } }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -167,7 +167,7 @@ test('do not rewrite method definition', async () => { test('do not rewrite when variable is in scope', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A(){ const fn = () => {}; return { fn }; }` + `import { fn } from 'vue';function A(){ const fn = () => {}; return { fn }; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -179,7 +179,7 @@ test('do not rewrite when variable is in scope', async () => { // #5472 test('do not rewrite when variable is in scope with object destructuring', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A(){ let {fn, test} = {fn: 'foo', test: 'bar'}; return { fn }; }` + `import { fn } from 'vue';function A(){ let {fn, test} = {fn: 'foo', test: 'bar'}; return { fn }; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -191,7 +191,7 @@ test('do not rewrite when variable is in scope with object destructuring', async // #5472 test('do not rewrite when variable is in scope with array destructuring', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A(){ let [fn, test] = ['foo', 'bar']; return { fn }; }` + `import { fn } from 'vue';function A(){ let [fn, test] = ['foo', 'bar']; return { fn }; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -203,7 +203,7 @@ test('do not rewrite when variable is in scope with array destructuring', async // #5727 test('rewrite variable in string interpolation in function nested arguments', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A({foo = \`test\${fn}\`} = {}){ return {}; }` + `import { fn } from 'vue';function A({foo = \`test\${fn}\`} = {}){ return {}; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -215,7 +215,7 @@ test('rewrite variable in string interpolation in function nested arguments', as // #6520 test('rewrite variables in default value of destructuring params', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A({foo = fn}){ return {}; }` + `import { fn } from 'vue';function A({foo = fn}){ return {}; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -226,7 +226,7 @@ test('rewrite variables in default value of destructuring params', async () => { test('do not rewrite when function declaration is in scope', async () => { const result = await ssrTransformSimple( - `import { fn } from 'vue';function A(){ function fn() {}; return { fn }; }` + `import { fn } from 'vue';function A(){ function fn() {}; return { fn }; }`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -237,7 +237,7 @@ test('do not rewrite when function declaration is in scope', async () => { test('do not rewrite catch clause', async () => { const result = await ssrTransformSimple( - `import {error} from './dependency';try {} catch(error) {}` + `import {error} from './dependency';try {} catch(error) {}`, ) expect(result?.code).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"./dependency\\"); @@ -250,8 +250,8 @@ test('do not rewrite catch clause', async () => { test('should declare variable for imported super class', async () => { expect( await ssrTransformSimpleCode( - `import { Foo } from './dependency';` + `class A extends Foo {}` - ) + `import { Foo } from './dependency';` + `class A extends Foo {}`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"./dependency\\"); const Foo = __vite_ssr_import_0__.Foo; @@ -264,8 +264,8 @@ test('should declare variable for imported super class', async () => { await ssrTransformSimpleCode( `import { Foo } from './dependency';` + `export default class A extends Foo {}\n` + - `export class B extends Foo {}` - ) + `export class B extends Foo {}`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"./dependency\\"); const Foo = __vite_ssr_import_0__.Foo; @@ -293,8 +293,9 @@ test('should handle default export variants', async () => { // default named functions expect( await ssrTransformSimpleCode( - `export default function foo() {}\n` + `foo.prototype = Object.prototype;` - ) + `export default function foo() {}\n` + + `foo.prototype = Object.prototype;`, + ), ).toMatchInlineSnapshot(` "function foo() {} foo.prototype = Object.prototype; @@ -303,8 +304,8 @@ test('should handle default export variants', async () => { // default named classes expect( await ssrTransformSimpleCode( - `export default class A {}\n` + `export class B extends A {}` - ) + `export default class A {}\n` + `export class B extends A {}`, + ), ).toMatchInlineSnapshot(` "class A {} class B extends A {} @@ -319,7 +320,7 @@ test('sourcemap source', async () => { `export const a = 1`, null, 'input.js', - 'export const a = 1 /* */' + 'export const a = 1 /* */', ) )?.map expect(map?.sources).toStrictEqual(['input.js']) @@ -336,8 +337,8 @@ test('overwrite bindings', async () => { `const d = inject\n` + `function f() { console.log(inject) }\n` + `function e() { const { inject } = { inject: true } }\n` + - `function g() { const f = () => { const inject = true }; console.log(inject) }\n` - ) + `function g() { const f = () => { const inject = true }; console.log(inject) }\n`, + ), ).toMatchInlineSnapshot(` "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); const a = { inject: __vite_ssr_import_0__.inject } @@ -353,7 +354,7 @@ test('overwrite bindings', async () => { test('Empty array pattern', async () => { expect( - await ssrTransformSimpleCode(`const [, LHS, RHS] = inMatch;`) + await ssrTransformSimpleCode(`const [, LHS, RHS] = inMatch;`), ).toMatchInlineSnapshot(`"const [, LHS, RHS] = inMatch;"`) }) @@ -365,8 +366,8 @@ import { foo, bar } from 'foo' const a = ({ _ = foo() }) => {} function b({ _ = bar() }) {} function c({ _ = bar() + foo() }) {} -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foo\\"); @@ -387,8 +388,8 @@ const a = () => { const { type: n = 'bar' } = {} console.log(n) } -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foo\\"); @@ -410,8 +411,8 @@ const foo = {} { const { [n]: m } = foo } -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foo\\"); @@ -453,8 +454,8 @@ get() set() rest() objRest() -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -503,8 +504,8 @@ const obj = { [bar]: () => {}, bar(foo) {} } -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foo\\"); @@ -535,8 +536,8 @@ class A { remove = 1 add = null } -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -567,8 +568,8 @@ class A { #foo() {} bar(foo) {} } -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foo\\"); @@ -613,8 +614,8 @@ function foobar() { aaa() bbb() -` - ) +`, + ), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"vue\\"); @@ -679,8 +680,8 @@ test('continuous exports', async () => { export function fn1() { }export function fn2() { } - ` - ) + `, + ), ).toMatchInlineSnapshot(` " function fn1() { @@ -711,7 +712,7 @@ export default (function getRandom() { `) expect( - await ssrTransformSimpleCode(`export default (class A {});`) + await ssrTransformSimpleCode(`export default (class A {});`), ).toMatchInlineSnapshot(`"__vite_ssr_exports__.default = (class A {});"`) }) @@ -720,8 +721,8 @@ test('with hashbang', async () => { expect( await ssrTransformSimpleCode( `#!/usr/bin/env node -console.log("it can parse the hashbang")` - ) +console.log("it can parse the hashbang")`, + ), ).toMatchInlineSnapshot(` "#!/usr/bin/env node console.log(\\"it can parse the hashbang\\")" @@ -798,7 +799,7 @@ function test() { var foo = () => { var why = 'would' }, bar = 'someone' } return [foo, bar] -}`) +}`), ).toMatchInlineSnapshot(` " const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foobar\\"); diff --git a/packages/vite/src/node/ssr/index.ts b/packages/vite/src/node/ssr/index.ts index d23e78b18cae5f..cdd9e9e5dd24b0 100644 --- a/packages/vite/src/node/ssr/index.ts +++ b/packages/vite/src/node/ssr/index.ts @@ -42,7 +42,7 @@ export interface ResolvedSSROptions extends SSROptions { export function resolveSSROptions( ssr: SSROptions | undefined, preserveSymlinks: boolean, - buildSsrCjsExternalHeuristics?: boolean + buildSsrCjsExternalHeuristics?: boolean, ): ResolvedSSROptions { ssr ??= {} const optimizeDeps = ssr.optimizeDeps ?? {} @@ -65,8 +65,8 @@ export function resolveSSROptions( ...optimizeDeps, esbuildOptions: { preserveSymlinks, - ...optimizeDeps.esbuildOptions - } - } + ...optimizeDeps.esbuildOptions, + }, + }, } } diff --git a/packages/vite/src/node/ssr/ssrExternal.ts b/packages/vite/src/node/ssr/ssrExternal.ts index 9281c8ebebc9b8..ce08b020d17fbf 100644 --- a/packages/vite/src/node/ssr/ssrExternal.ts +++ b/packages/vite/src/node/ssr/ssrExternal.ts @@ -11,7 +11,7 @@ import { isDefined, lookupFile, normalizePath, - resolveFrom + resolveFrom, } from '../utils' import type { Logger, ResolvedConfig } from '..' @@ -33,7 +33,7 @@ export function stripNesting(packages: string[]): string[] { */ export function cjsSsrResolveExternals( config: ResolvedConfig, - knownImports: string[] + knownImports: string[], ): string[] { // strip nesting since knownImports may be passed in from optimizeDeps which // supports a "parent > child" syntax @@ -56,7 +56,7 @@ export function cjsSsrResolveExternals( config.resolve, ssrExternals, seen, - config.logger + config.logger, ) const importedDeps = knownImports.map(getNpmPackageName).filter(isDefined) @@ -76,7 +76,7 @@ export function cjsSsrResolveExternals( let externals = [...ssrExternals] if (ssrConfig?.noExternal) { externals = externals.filter( - createFilter(undefined, ssrConfig.noExternal, { resolve: false }) + createFilter(undefined, ssrConfig.noExternal, { resolve: false }), ) } return externals @@ -95,7 +95,7 @@ const isSsrExternalCache = new WeakMap< export function shouldExternalizeForSSR( id: string, - config: ResolvedConfig + config: ResolvedConfig, ): boolean | undefined { let isSsrExternal = isSsrExternalCache.get(config) if (!isSsrExternal) { @@ -106,7 +106,7 @@ export function shouldExternalizeForSSR( } export function createIsConfiguredAsSsrExternal( - config: ResolvedConfig + config: ResolvedConfig, ): (id: string) => boolean { const { ssr, root } = config const noExternal = ssr?.noExternal @@ -119,12 +119,12 @@ export function createIsConfiguredAsSsrExternal( ...config.resolve, root, isProduction: false, - isBuild: true + isBuild: true, } const isExternalizable = ( id: string, - configuredAsExternal?: boolean + configuredAsExternal?: boolean, ): boolean => { if (!bareImportRE.test(id) || id.includes('\0')) { return false @@ -142,11 +142,11 @@ export function createIsConfiguredAsSsrExternal( true, // Allow linked packages to be externalized if they are explicitly // configured as external - !!configuredAsExternal + !!configuredAsExternal, )?.external } catch (e) { debug( - `Failed to node resolve "${id}". Skipping externalizing it by default.` + `Failed to node resolve "${id}". Skipping externalizing it by default.`, ) // may be an invalid import that's resolved by a plugin return false @@ -188,7 +188,7 @@ export function createIsConfiguredAsSsrExternal( } function createIsSsrExternal( - config: ResolvedConfig + config: ResolvedConfig, ): (id: string) => boolean | undefined { const processedIds = new Map() @@ -214,7 +214,7 @@ function cjsSsrCollectExternals( resolveOptions: Required, ssrExternals: Set, seen: Set, - logger: Logger + logger: Logger, ) { const rootPkgContent = lookupFile(root, ['package.json']) if (!rootPkgContent) { @@ -224,14 +224,14 @@ function cjsSsrCollectExternals( const rootPkg = JSON.parse(rootPkgContent) const deps = { ...rootPkg.devDependencies, - ...rootPkg.dependencies + ...rootPkg.dependencies, } const internalResolveOptions: InternalResolveOptions = { ...resolveOptions, root, isProduction: false, - isBuild: true + isBuild: true, } const depsToTrace = new Set() @@ -250,7 +250,7 @@ function cjsSsrCollectExternals( internalResolveOptions, true, // we set `targetWeb` to `true` to get the ESM entry undefined, - true + true, )?.id // normalizePath required for windows. tryNodeResolve uses normalizePath // which returns with '/', require.resolve returns with '\\' @@ -308,7 +308,7 @@ function cjsSsrCollectExternals( } logger.warn( - `${id} doesn't appear to be written in CJS, but also doesn't appear to be a valid ES module (i.e. it doesn't have "type": "module" or an .mjs extension for the entry point). Please contact the package author to fix.` + `${id} doesn't appear to be written in CJS, but also doesn't appear to be a valid ES module (i.e. it doesn't have "type": "module" or an .mjs extension for the entry point). Please contact the package author to fix.`, ) } } @@ -320,7 +320,7 @@ function cjsSsrCollectExternals( export function cjsShouldExternalizeForSSR( id: string, - externals: string[] | null + externals: string[] | null, ): boolean { if (!externals) { return false diff --git a/packages/vite/src/node/ssr/ssrManifestPlugin.ts b/packages/vite/src/node/ssr/ssrManifestPlugin.ts index 9a68b5ea22afe5..182a5eb67b8067 100644 --- a/packages/vite/src/node/ssr/ssrManifestPlugin.ts +++ b/packages/vite/src/node/ssr/ssrManifestPlugin.ts @@ -65,7 +65,7 @@ export function ssrManifestPlugin(config: ResolvedConfig): Plugin { } } const normalizedFile = normalizePath( - join(dirname(chunk.fileName), url.slice(1, -1)) + join(dirname(chunk.fileName), url.slice(1, -1)), ) addDeps(normalizedFile) ssrManifest[basename(name!)] = deps @@ -81,8 +81,8 @@ export function ssrManifestPlugin(config: ResolvedConfig): Plugin { ? config.build.ssrManifest : 'ssr-manifest.json', type: 'asset', - source: JSON.stringify(ssrManifest, null, 2) + source: JSON.stringify(ssrManifest, null, 2), }) - } + }, } } diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 84b05ac7841973..9c9916ca616564 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -5,7 +5,7 @@ import { dynamicImport, isBuiltin, unwrapId, - usingDynamicImport + usingDynamicImport, } from '../utils' import { transformRequest } from '../server/transformRequest' import type { InternalResolveOptions } from '../plugins/resolve' @@ -15,7 +15,7 @@ import { ssrExportAllKey, ssrImportKey, ssrImportMetaKey, - ssrModuleExportsKey + ssrModuleExportsKey, } from './ssrTransform' import { rebindErrorStacktrace, ssrRewriteStacktrace } from './ssrStacktrace' @@ -33,7 +33,7 @@ export async function ssrLoadModule( server: ViteDevServer, context: SSRContext = { global }, urlStack: string[] = [], - fixStacktrace?: boolean + fixStacktrace?: boolean, ): Promise { url = unwrapId(url) @@ -51,7 +51,7 @@ export async function ssrLoadModule( server, context, urlStack, - fixStacktrace + fixStacktrace, ) pendingModules.set(url, modulePromise) modulePromise @@ -69,7 +69,7 @@ async function instantiateModule( server: ViteDevServer, context: SSRContext = { global }, urlStack: string[] = [], - fixStacktrace?: boolean + fixStacktrace?: boolean, ): Promise { const { moduleGraph } = server const mod = await moduleGraph.ensureEntryFromUrl(url, true) @@ -90,7 +90,7 @@ async function instantiateModule( } const ssrModule = { - [Symbol.toStringTag]: 'Module' + [Symbol.toStringTag]: 'Module', } Object.defineProperty(ssrModule, '__esModule', { value: true }) @@ -100,7 +100,7 @@ async function instantiateModule( const ssrImportMeta = { // The filesystem URL, matching native Node.js modules - url: pathToFileURL(mod.file!).toString() + url: pathToFileURL(mod.file!).toString(), } urlStack = urlStack.concat(url) @@ -109,7 +109,7 @@ async function instantiateModule( const { isProduction, resolve: { dedupe, preserveSymlinks }, - root + root, } = server.config const resolveOptions: InternalResolveOptions = { @@ -121,7 +121,7 @@ async function instantiateModule( preserveSymlinks, isBuild: false, isProduction, - root + root, } // Since dynamic imports can happen in parallel, we need to @@ -144,7 +144,7 @@ async function instantiateModule( server, context, urlStack, - fixStacktrace + fixStacktrace, ) if (pendingDeps.length === 1) { pendingImports.delete(url) @@ -174,7 +174,7 @@ async function instantiateModule( configurable: true, get() { return sourceModule[key] - } + }, }) } } @@ -190,7 +190,7 @@ async function instantiateModule( ssrImportKey, ssrDynamicImportKey, ssrExportAllKey, - '"use strict";' + result.code + `\n//# sourceURL=${mod.url}` + '"use strict";' + result.code + `\n//# sourceURL=${mod.url}`, ) await initModule( context.global, @@ -198,7 +198,7 @@ async function instantiateModule( ssrImportMeta, ssrImport, ssrDynamicImport, - ssrExportAll + ssrExportAll, ) } catch (e) { mod.ssrError = e @@ -210,8 +210,8 @@ async function instantiateModule( { timestamp: true, clear: server.config.clearScreen, - error: e - } + error: e, + }, ) } throw e @@ -224,7 +224,7 @@ async function instantiateModule( async function nodeImport( id: string, importer: string, - resolveOptions: InternalResolveOptions + resolveOptions: InternalResolveOptions, ) { let url: string if (id.startsWith('node:') || isBuiltin(id)) { @@ -239,11 +239,11 @@ async function nodeImport( typeof jest === 'undefined' ? { ...resolveOptions, tryEsmOnly: true } : resolveOptions, - false + false, ) if (!resolved) { const err: any = new Error( - `Cannot find module '${id}' imported from '${importer}'` + `Cannot find module '${id}' imported from '${importer}'`, ) err.code = 'ERR_MODULE_NOT_FOUND' throw err @@ -278,7 +278,7 @@ function proxyESM(mod: any) { get(mod, prop) { if (prop === 'default') return defaultExport return mod[prop] ?? defaultExport?.[prop] - } + }, }) } diff --git a/packages/vite/src/node/ssr/ssrStacktrace.ts b/packages/vite/src/node/ssr/ssrStacktrace.ts index 2d71fada82065f..cad1bd17e0422e 100644 --- a/packages/vite/src/node/ssr/ssrStacktrace.ts +++ b/packages/vite/src/node/ssr/ssrStacktrace.ts @@ -14,7 +14,7 @@ try { export function ssrRewriteStacktrace( stack: string, - moduleGraph: ModuleGraph + moduleGraph: ModuleGraph, ): string { return stack .split('\n') @@ -35,7 +35,7 @@ export function ssrRewriteStacktrace( const pos = originalPositionFor(traced, { line: Number(line) - offset, - column: Number(column) + column: Number(column), }) if (!pos.source || pos.line == null || pos.column == null) { @@ -49,7 +49,7 @@ export function ssrRewriteStacktrace( } else { return ` at ${trimedVarName} (${source})` } - } + }, ) }) .join('\n') @@ -58,14 +58,14 @@ export function ssrRewriteStacktrace( export function rebindErrorStacktrace(e: Error, stacktrace: string): void { const { configurable, writable } = Object.getOwnPropertyDescriptor( e, - 'stack' + 'stack', )! if (configurable) { Object.defineProperty(e, 'stack', { value: stacktrace, enumerable: true, configurable: true, - writable: true + writable: true, }) } else if (writable) { e.stack = stacktrace diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index eefdf29f70d7a1..b963494b7ab0b0 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -6,7 +6,7 @@ import type { Pattern, Property, VariableDeclaration, - Node as _Node + Node as _Node, } from 'estree' import { extract_names as extractNames } from 'periscopic' // `eslint-plugin-node` doesn't support package without main @@ -40,7 +40,7 @@ export async function ssrTransform( inMap: SourceMap | null, url: string, originalCode: string, - options?: TransformOptions + options?: TransformOptions, ): Promise { if (options?.json?.stringify && isJSONRequest(url)) { return ssrTransformJSON(code, inMap) @@ -50,13 +50,13 @@ export async function ssrTransform( async function ssrTransformJSON( code: string, - inMap: SourceMap | null + inMap: SourceMap | null, ): Promise { return { code: code.replace('export default', `${ssrModuleExportsKey}.default =`), map: inMap, deps: [], - dynamicDeps: [] + dynamicDeps: [], } } @@ -64,7 +64,7 @@ async function ssrTransformScript( code: string, inMap: SourceMap | null, url: string, - originalCode: string + originalCode: string, ): Promise { const s = new MagicString(code) @@ -74,7 +74,7 @@ async function ssrTransformScript( sourceType: 'module', ecmaVersion: 'latest', locations: true, - allowHashBang: true + allowHashBang: true, }) } catch (err) { if (!err.loc || !err.loc.line) throw err @@ -82,7 +82,7 @@ async function ssrTransformScript( throw new Error( `Parse failure: ${err.message}\nContents of line ${line}: ${ code.split('\n')[line - 1] - }` + }`, ) } @@ -97,7 +97,7 @@ async function ssrTransformScript( const importId = `__vite_ssr_import_${uid++}__` s.appendRight( node.start, - `const ${importId} = await ${ssrImportKey}(${JSON.stringify(source)});\n` + `const ${importId} = await ${ssrImportKey}(${JSON.stringify(source)});\n`, ) return importId } @@ -106,7 +106,7 @@ async function ssrTransformScript( s.appendLeft( position, `\nObject.defineProperty(${ssrModuleExportsKey}, "${name}", ` + - `{ enumerable: true, configurable: true, get(){ return ${local} }});` + `{ enumerable: true, configurable: true, get(){ return ${local} }});`, ) } @@ -122,7 +122,7 @@ async function ssrTransformScript( if (spec.type === 'ImportSpecifier') { idToImportMap.set( spec.local.name, - `${importId}.${spec.imported.name}` + `${importId}.${spec.imported.name}`, ) } else if (spec.type === 'ImportDefaultSpecifier') { idToImportMap.set(spec.local.name, `${importId}.default`) @@ -164,7 +164,7 @@ async function ssrTransformScript( defineExport( node.end, spec.exported.name, - `${importId}.${spec.local.name}` + `${importId}.${spec.local.name}`, ) } } else { @@ -193,14 +193,14 @@ async function ssrTransformScript( s.remove(node.start, node.start + 15 /* 'export default '.length */) s.append( `\nObject.defineProperty(${ssrModuleExportsKey}, "default", ` + - `{ enumerable: true, configurable: true, value: ${name} });` + `{ enumerable: true, configurable: true, value: ${name} });`, ) } else { // anonymous default exports s.update( node.start, node.start + 14 /* 'export default'.length */, - `${ssrModuleExportsKey}.default =` + `${ssrModuleExportsKey}.default =`, ) } } @@ -258,7 +258,7 @@ async function ssrTransformScript( if (node.type === 'ImportExpression' && node.source.type === 'Literal') { dynamicDeps.add(node.source.value as string) } - } + }, }) let map = s.generateMap({ hires: true }) @@ -269,11 +269,11 @@ async function ssrTransformScript( { ...map, sources: inMap.sources, - sourcesContent: inMap.sourcesContent + sourcesContent: inMap.sourcesContent, } as RawSourceMap, - inMap as RawSourceMap + inMap as RawSourceMap, ], - false + false, ) as SourceMap } else { map.sources = [url] @@ -286,7 +286,7 @@ async function ssrTransformScript( code: s.toString(), map, deps: [...deps], - dynamicDeps: [...dynamicDeps] + dynamicDeps: [...dynamicDeps], } } @@ -297,7 +297,7 @@ interface Visitors { end: number }, parent: Node, - parentStack: Node[] + parentStack: Node[], ) => void onImportMeta: (node: Node) => void onDynamicImport: (node: Node) => void @@ -314,7 +314,7 @@ const isNodeInPattern = (node: _Node): node is Property => */ function walk( root: Node, - { onIdentifier, onImportMeta, onDynamicImport }: Visitors + { onIdentifier, onImportMeta, onDynamicImport }: Visitors, ) { const parentStack: Node[] = [] const varKindStack: VariableDeclaration['kind'][] = [] @@ -434,7 +434,7 @@ function walk( return } setScope(node, child.name) - } + }, }) }) } else if (node.type === 'Property' && parent!.type === 'ObjectPattern') { @@ -443,7 +443,7 @@ function walk( } else if (node.type === 'VariableDeclarator') { const parentFunction = findParentScope( parentStack, - varKindStack[0] === 'var' + varKindStack[0] === 'var', ) if (parentFunction) { handlePattern(node.id, parentFunction) @@ -463,7 +463,7 @@ function walk( if (node.type === 'VariableDeclaration') { varKindStack.shift() } - } + }, }) // emit the identifier events in BFS so the hoisted declarations @@ -554,7 +554,7 @@ const scopeNodeTypeRE = /(?:Function|Class)(?:Expression|Declaration)$|Method$|^IfStatement$/ function findParentScope( parentStack: _Node[], - isVar = false + isVar = false, ): _Node | undefined { const regex = isVar ? functionNodeTypeRE : scopeNodeTypeRE return parentStack.find((i) => regex.test(i.type)) @@ -562,7 +562,7 @@ function findParentScope( function isInDestructuringAssignment( parent: _Node, - parentStack: _Node[] + parentStack: _Node[], ): boolean { if ( parent && diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index f288cffd8effac..c500462fd56671 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -29,7 +29,7 @@ import { OPTIMIZABLE_ENTRY_RE, VALID_ID_PREFIX, loopbackHosts, - wildcardHosts + wildcardHosts, } from './constants' import type { DepOptimizationConfig } from './optimizer' import type { ResolvedConfig } from './config' @@ -47,7 +47,7 @@ export type FilterPattern = export const createFilter = _createFilter as ( include?: FilterPattern, exclude?: FilterPattern, - options?: { resolve?: string | false | null } + options?: { resolve?: string | false | null }, ) => (id: string | unknown) => boolean export function slash(p: string): string { @@ -98,7 +98,7 @@ const builtins = new Set([ 'stream/web', 'timers/promises', 'util/types', - 'wasi' + 'wasi', ]) export function isBuiltin(id: string): boolean { @@ -107,14 +107,14 @@ export function isBuiltin(id: string): boolean { export function moduleListContains( moduleList: string[] | undefined, - id: string + id: string, ): boolean | undefined { return moduleList?.some((m) => m === id || id.startsWith(m + '/')) } export function isOptimizable( id: string, - optimizeDeps: DepOptimizationConfig + optimizeDeps: DepOptimizationConfig, ): boolean { const { extensions } = optimizeDeps return ( @@ -141,14 +141,14 @@ export function resolveFrom( id: string, basedir: string, preserveSymlinks = false, - ssr = false + ssr = false, ): string { return resolve.sync(id, { basedir, paths: [], extensions: ssr ? ssrExtensions : DEFAULT_EXTENSIONS, // necessary to work with pnpm - preserveSymlinks: preserveSymlinks || isRunningWithYarnPnp || false + preserveSymlinks: preserveSymlinks || isRunningWithYarnPnp || false, }) } @@ -159,7 +159,7 @@ export function resolveFrom( export function nestedResolveFrom( id: string, basedir: string, - preserveSymlinks = false + preserveSymlinks = false, ): string { const pkgs = id.split('>').map((pkg) => pkg.trim()) try { @@ -183,7 +183,7 @@ export type ViteDebugScope = `vite:${string}` export function createDebugger( namespace: ViteDebugScope, - options: DebuggerOptions = {} + options: DebuggerOptions = {}, ): debug.Debugger['log'] { const log = debug(namespace) const { onlyWhenFocused } = options @@ -203,13 +203,13 @@ export function createDebugger( function testCaseInsensitiveFS() { if (!CLIENT_ENTRY.endsWith('client.mjs')) { throw new Error( - `cannot test case insensitive FS, CLIENT_ENTRY const doesn't contain client.mjs` + `cannot test case insensitive FS, CLIENT_ENTRY const doesn't contain client.mjs`, ) } if (!fs.existsSync(CLIENT_ENTRY)) { throw new Error( 'cannot test case insensitive FS, CLIENT_ENTRY does not point to an existing file: ' + - CLIENT_ENTRY + CLIENT_ENTRY, ) } return fs.existsSync(CLIENT_ENTRY.replace('client.mjs', 'cLiEnT.mjs')) @@ -227,7 +227,7 @@ export function normalizePath(id: string): string { export function fsPathFromId(id: string): string { const fsPath = normalizePath( - id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id + id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id, ) return fsPath.startsWith('/') || fsPath.match(VOLUME_RE) ? fsPath @@ -308,7 +308,7 @@ const internalPrefixes = [ FS_PREFIX, VALID_ID_PREFIX, CLIENT_PUBLIC_PATH, - ENV_PUBLIC_PATH + ENV_PUBLIC_PATH, ] const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`) const trailingSeparatorRE = /[?&]$/ @@ -343,7 +343,7 @@ export function removeTimestampQuery(url: string): string { export async function asyncReplace( input: string, re: RegExp, - replacer: (match: RegExpExecArray) => string | Promise + replacer: (match: RegExpExecArray) => string | Promise, ): Promise { let match: RegExpExecArray | null let remaining = input @@ -410,7 +410,7 @@ interface LookupFileOptions { export function lookupFile( dir: string, formats: string[], - options?: LookupFileOptions + options?: LookupFileOptions, ): string | undefined { for (const format of formats) { const fullPath = path.join(dir, format) @@ -443,7 +443,7 @@ export function pad(source: string, n = 2): string { export function posToNumber( source: string, - pos: number | { line: number; column: number } + pos: number | { line: number; column: number }, ): number { if (typeof pos === 'number') return pos const lines = source.split(splitRE) @@ -457,12 +457,12 @@ export function posToNumber( export function numberToPos( source: string, - offset: number | { line: number; column: number } + offset: number | { line: number; column: number }, ): { line: number; column: number } { if (typeof offset !== 'number') return offset if (offset > source.length) { throw new Error( - `offset is longer than source length! offset ${offset} > length ${source.length}` + `offset is longer than source length! offset ${offset} > length ${source.length}`, ) } const lines = source.split(splitRE) @@ -483,7 +483,7 @@ export function numberToPos( export function generateCodeFrame( source: string, start: number | { line: number; column: number } = 0, - end?: number + end?: number, ): string { start = posToNumber(source, start) end = end || start @@ -499,7 +499,7 @@ export function generateCodeFrame( res.push( `${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${ lines[j] - }` + }`, ) const lineLength = lines[j].length if (j === i) { @@ -507,7 +507,7 @@ export function generateCodeFrame( const pad = Math.max(start - (count - lineLength) + 1, 0) const length = Math.max( 1, - end > count ? lineLength - pad : end - start + end > count ? lineLength - pad : end - start, ) res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length)) } else if (j > i) { @@ -526,7 +526,7 @@ export function generateCodeFrame( export function writeFile( filename: string, - content: string | Uint8Array + content: string | Uint8Array, ): void { const dir = path.dirname(filename) if (!fs.existsSync(dir)) { @@ -613,7 +613,7 @@ export const renameDir = isWindows ? promisify(gracefulRename) : fs.renameSync export function ensureWatchedFile( watcher: FSWatcher, file: string | null, - root: string + root: string, ): void { if ( file && @@ -650,7 +650,7 @@ function splitSrcSetDescriptor(srcs: string): ImageCandidate[] { return { url, - descriptor: src?.slice(url.length).trim() + descriptor: src?.slice(url.length).trim(), } }) .filter(({ url }) => !!url) @@ -658,25 +658,25 @@ function splitSrcSetDescriptor(srcs: string): ImageCandidate[] { export function processSrcSet( srcs: string, - replacer: (arg: ImageCandidate) => Promise + replacer: (arg: ImageCandidate) => Promise, ): Promise { return Promise.all( splitSrcSetDescriptor(srcs).map(async ({ url, descriptor }) => ({ url: await replacer({ url, descriptor }), - descriptor - })) + descriptor, + })), ).then((ret) => reduceSrcset(ret)) } export function processSrcSetSync( srcs: string, - replacer: (arg: ImageCandidate) => string + replacer: (arg: ImageCandidate) => string, ): string { return reduceSrcset( splitSrcSetDescriptor(srcs).map(({ url, descriptor }) => ({ url: replacer({ url, descriptor }), - descriptor - })) + descriptor, + })), ) } @@ -685,14 +685,14 @@ function splitSrcSet(srcs: string) { // There could be a ',' inside of url(data:...), linear-gradient(...) or "data:..." const cleanedSrcs = srcs.replace( /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'/g, - blankReplacer + blankReplacer, ) let startIndex = 0 let splitIndex: number do { splitIndex = cleanedSrcs.indexOf(',', startIndex) parts.push( - srcs.slice(startIndex, splitIndex !== -1 ? splitIndex : undefined) + srcs.slice(startIndex, splitIndex !== -1 ? splitIndex : undefined), ) startIndex = splitIndex + 1 } while (splitIndex !== -1) @@ -724,12 +724,12 @@ const nullSourceMap: RawSourceMap = { names: [], sources: [], mappings: '', - version: 3 + version: 3, } export function combineSourcemaps( filename: string, sourcemapList: Array, - excludeContent = true + excludeContent = true, ): RawSourceMap { if ( sourcemapList.length === 0 || @@ -744,7 +744,7 @@ export function combineSourcemaps( sourcemapList = sourcemapList.map((sourcemap) => { const newSourcemaps = { ...sourcemap } newSourcemaps.sources = sourcemap.sources.map((source) => - source ? escapeToLinuxLikePath(source) : null + source ? escapeToLinuxLikePath(source) : null, ) if (sourcemap.sourceRoot) { newSourcemaps.sourceRoot = escapeToLinuxLikePath(sourcemap.sourceRoot) @@ -770,7 +770,7 @@ export function combineSourcemaps( return null } }, - excludeContent + excludeContent, ) } if (!map.file) { @@ -779,7 +779,7 @@ export function combineSourcemaps( // unescape the previous hack map.sources = map.sources.map((source) => - source ? unescapeToLinuxLikePath(source) : source + source ? unescapeToLinuxLikePath(source) : source, ) map.file = filename @@ -802,7 +802,7 @@ export async function getLocalhostAddressIfDiffersFromDNS(): Promise< > { const [nodeResult, dnsResult] = await Promise.all([ dns.lookup('localhost'), - dns.lookup('localhost', { verbatim: true }) + dns.lookup('localhost', { verbatim: true }), ]) const isSame = nodeResult.family === dnsResult.family && @@ -818,7 +818,7 @@ export interface Hostname { } export async function resolveHostname( - optionsHost: string | boolean | undefined + optionsHost: string | boolean | undefined, ): Promise { let host: string | undefined if (optionsHost === undefined || optionsHost === false) { @@ -848,7 +848,7 @@ export async function resolveHostname( export async function resolveServerUrls( server: Server, options: CommonServerOptions, - config: ResolvedConfig + config: ResolvedConfig, ): Promise { const address = server.address() @@ -884,7 +884,7 @@ export async function resolveServerUrls( // Node < v18 ((typeof detail.family === 'string' && detail.family === 'IPv4') || // Node >= v18 - (typeof detail.family === 'number' && detail.family === 4)) + (typeof detail.family === 'number' && detail.family === 4)), ) .forEach((detail) => { const host = detail.address.replace('127.0.0.1', hostname.name) @@ -944,7 +944,7 @@ export function getHash(text: Buffer | string): string { export const requireResolveFromRootWithFallback = ( root: string, - id: string + id: string, ): string => { const paths = _require.resolve.paths?.(id) || [] // Search in the root directory first, and fallback to the default require paths. @@ -974,7 +974,7 @@ const GRACEFUL_RENAME_TIMEOUT = 5000 function gracefulRename( from: string, to: string, - cb: (error: NodeJS.ErrnoException | null) => void + cb: (error: NodeJS.ErrnoException | null) => void, ) { const start = Date.now() let backoff = 0 @@ -1000,7 +1000,7 @@ function gracefulRename( const GRACEFUL_REMOVE_DIR_TIMEOUT = 5000 function gracefulRemoveDir( dir: string, - cb: (error: NodeJS.ErrnoException | null) => void + cb: (error: NodeJS.ErrnoException | null) => void, ) { const start = Date.now() let backoff = 0 @@ -1039,7 +1039,7 @@ export function removeComments(raw: string): string { function mergeConfigRecursively( defaults: Record, overrides: Record, - rootPath: string + rootPath: string, ) { const merged: Record = { ...defaults } for (const key in overrides) { @@ -1079,7 +1079,7 @@ function mergeConfigRecursively( merged[key] = mergeConfigRecursively( existing, value, - rootPath ? `${rootPath}.${key}` : key + rootPath ? `${rootPath}.${key}` : key, ) continue } @@ -1092,14 +1092,14 @@ function mergeConfigRecursively( export function mergeConfig( defaults: Record, overrides: Record, - isRoot = true + isRoot = true, ): Record { return mergeConfigRecursively(defaults, overrides, isRoot ? '' : '.') } export function mergeAlias( a?: AliasOptions, - b?: AliasOptions + b?: AliasOptions, ): AliasOptions | undefined { if (!a) return b if (!b) return a @@ -1117,8 +1117,8 @@ export function normalizeAlias(o: AliasOptions = []): Alias[] { : Object.keys(o).map((find) => normalizeSingleAlias({ find, - replacement: (o as any)[find] - }) + replacement: (o as any)[find], + }), ) } @@ -1127,7 +1127,7 @@ export function normalizeAlias(o: AliasOptions = []): Alias[] { function normalizeSingleAlias({ find, replacement, - customResolver + customResolver, }: Alias): Alias { if ( typeof find === 'string' && @@ -1140,7 +1140,7 @@ function normalizeSingleAlias({ const alias: Alias = { find, - replacement + replacement, } if (customResolver) { alias.customResolver = customResolver @@ -1155,14 +1155,14 @@ function normalizeSingleAlias({ export function transformStableResult( s: MagicString, id: string, - config: ResolvedConfig + config: ResolvedConfig, ): TransformResult { return { code: s.toString(), map: config.command === 'build' && config.build.sourcemap ? s.generateMap({ hires: true, source: id }) - : null + : null, } } @@ -1204,8 +1204,8 @@ export function shouldServe(url: string, assetsDir: string): boolean { const pathname = decodeURI( new URL( url.startsWith('//') ? url.substring(1) : url, - 'http://example.com' - ).pathname + 'http://example.com', + ).pathname, ) const file = path.join(assetsDir, pathname) if ( diff --git a/packages/vite/src/node/watch.ts b/packages/vite/src/node/watch.ts index 5b3332da2d3d1f..fa2a97fe1abff3 100644 --- a/packages/vite/src/node/watch.ts +++ b/packages/vite/src/node/watch.ts @@ -4,7 +4,7 @@ import type { ResolvedConfig } from '.' export function resolveChokidarOptions( config: ResolvedConfig, - options: WatchOptions | undefined + options: WatchOptions | undefined, ): WatchOptions { const { ignored = [], ...otherOptions } = options ?? {} @@ -14,11 +14,11 @@ export function resolveChokidarOptions( '**/node_modules/**', '**/test-results/**', // Playwright escapePath(config.cacheDir) + '/**', - ...(Array.isArray(ignored) ? ignored : [ignored]) + ...(Array.isArray(ignored) ? ignored : [ignored]), ], ignoreInitial: true, ignorePermissionErrors: true, - ...otherOptions + ...otherOptions, } return resolvedWatchOptions diff --git a/packages/vite/src/types/chokidar.d.ts b/packages/vite/src/types/chokidar.d.ts index 0dc4bec1013643..83f96ed952024f 100644 --- a/packages/vite/src/types/chokidar.d.ts +++ b/packages/vite/src/types/chokidar.d.ts @@ -69,7 +69,7 @@ export class FSWatcher extends EventEmitter implements fs.FSWatcher { on( event: 'add' | 'addDir' | 'change', - listener: (path: string, stats?: fs.Stats) => void + listener: (path: string, stats?: fs.Stats) => void, ): this on( @@ -77,8 +77,8 @@ export class FSWatcher extends EventEmitter implements fs.FSWatcher { listener: ( eventName: 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir', path: string, - stats?: fs.Stats - ) => void + stats?: fs.Stats, + ) => void, ): this /** @@ -91,7 +91,7 @@ export class FSWatcher extends EventEmitter implements fs.FSWatcher { */ on( event: 'raw', - listener: (eventName: string, path: string, details: any) => void + listener: (eventName: string, path: string, details: any) => void, ): this /** @@ -225,5 +225,5 @@ export interface AwaitWriteFinishOptions { */ export function watch( paths: string | ReadonlyArray, - options?: WatchOptions + options?: WatchOptions, ): FSWatcher diff --git a/packages/vite/src/types/connect.d.ts b/packages/vite/src/types/connect.d.ts index 74c559b6a436f5..9589d6a683119d 100644 --- a/packages/vite/src/types/connect.d.ts +++ b/packages/vite/src/types/connect.d.ts @@ -21,18 +21,18 @@ export namespace Connect { export type SimpleHandleFunction = ( req: IncomingMessage, - res: http.ServerResponse + res: http.ServerResponse, ) => void export type NextHandleFunction = ( req: IncomingMessage, res: http.ServerResponse, - next: NextFunction + next: NextFunction, ) => void export type ErrorHandleFunction = ( err: any, req: IncomingMessage, res: http.ServerResponse, - next: NextFunction + next: NextFunction, ) => void export type HandleFunction = | SimpleHandleFunction @@ -73,7 +73,7 @@ export namespace Connect { handle( req: http.IncomingMessage, res: http.ServerResponse, - next: Function + next: Function, ): void /** @@ -102,7 +102,7 @@ export namespace Connect { port: number, hostname?: string, backlog?: number, - callback?: Function + callback?: Function, ): http.Server listen(port: number, hostname?: string, callback?: Function): http.Server listen(path: string, callback?: Function): http.Server diff --git a/packages/vite/src/types/http-proxy.d.ts b/packages/vite/src/types/http-proxy.d.ts index 1cae820dcdfa8f..ad3ae1eec4a3c8 100644 --- a/packages/vite/src/types/http-proxy.d.ts +++ b/packages/vite/src/types/http-proxy.d.ts @@ -43,7 +43,7 @@ export namespace HttpProxy { err: Error, req: http.IncomingMessage, res: http.ServerResponse, - target?: ProxyTargetUrl + target?: ProxyTargetUrl, ) => void export class Server extends events.EventEmitter { @@ -63,7 +63,7 @@ export namespace HttpProxy { req: http.IncomingMessage, res: http.ServerResponse, options?: ServerOptions, - callback?: ErrorCallback + callback?: ErrorCallback, ): void /** @@ -78,7 +78,7 @@ export namespace HttpProxy { socket: unknown, head: unknown, options?: ServerOptions, - callback?: ErrorCallback + callback?: ErrorCallback, ): void /** @@ -121,8 +121,8 @@ export namespace HttpProxy { listener: ( req: http.IncomingMessage, res: http.ServerResponse, - target: ProxyTargetUrl - ) => void + target: ProxyTargetUrl, + ) => void, ): this on( event: 'proxyReq', @@ -130,16 +130,16 @@ export namespace HttpProxy { proxyReq: http.ClientRequest, req: http.IncomingMessage, res: http.ServerResponse, - options: ServerOptions - ) => void + options: ServerOptions, + ) => void, ): this on( event: 'proxyRes', listener: ( proxyRes: http.IncomingMessage, req: http.IncomingMessage, - res: http.ServerResponse - ) => void + res: http.ServerResponse, + ) => void, ): this on( event: 'proxyReqWs', @@ -148,8 +148,8 @@ export namespace HttpProxy { req: http.IncomingMessage, socket: net.Socket, options: ServerOptions, - head: any - ) => void + head: any, + ) => void, ): this on( event: 'econnreset', @@ -157,24 +157,24 @@ export namespace HttpProxy { err: Error, req: http.IncomingMessage, res: http.ServerResponse, - target: ProxyTargetUrl - ) => void + target: ProxyTargetUrl, + ) => void, ): this on( event: 'end', listener: ( req: http.IncomingMessage, res: http.ServerResponse, - proxyRes: http.IncomingMessage - ) => void + proxyRes: http.IncomingMessage, + ) => void, ): this on( event: 'close', listener: ( proxyRes: http.IncomingMessage, proxySocket: net.Socket, - proxyHead: any - ) => void + proxyHead: any, + ) => void, ): this once(event: string, listener: () => void): this diff --git a/packages/vite/src/types/shims.d.ts b/packages/vite/src/types/shims.d.ts index db5ce9bc1dfb37..3540828cc2a14e 100644 --- a/packages/vite/src/types/shims.d.ts +++ b/packages/vite/src/types/shims.d.ts @@ -29,7 +29,7 @@ declare module 'postcss-import' { resolve: ( id: string, basedir: string, - importOptions: any + importOptions: any, ) => string | string[] | Promise nameLayer: (index: number, rootFilename: string) => string }) => Plugin diff --git a/packages/vite/src/types/terser.d.ts b/packages/vite/src/types/terser.d.ts index a704a20cdc71ae..6533da9d8c72de 100644 --- a/packages/vite/src/types/terser.d.ts +++ b/packages/vite/src/types/terser.d.ts @@ -106,7 +106,7 @@ export namespace Terser { Disabled = 0, SimpleFunctions = 1, WithArguments = 2, - WithArgumentsAndVariables = 3 + WithArgumentsAndVariables = 3, } export interface MangleOptions { @@ -182,7 +182,7 @@ export namespace Terser { pos: number line: number col: number - } + }, ) => boolean) ecma?: ECMA ie8?: boolean @@ -211,7 +211,7 @@ export namespace Terser { PreferDouble = 0, AlwaysSingle = 1, AlwaysDouble = 2, - AlwaysOriginal = 3 + AlwaysOriginal = 3, } export interface MinifyOptions { diff --git a/packages/vite/src/types/ws.d.ts b/packages/vite/src/types/ws.d.ts index a06341fca9eeb9..99932f49b19906 100644 --- a/packages/vite/src/types/ws.d.ts +++ b/packages/vite/src/types/ws.d.ts @@ -22,7 +22,7 @@ import type { ClientRequestArgs, Server as HTTPServer, IncomingMessage, - OutgoingHttpHeaders + OutgoingHttpHeaders, } from 'node:http' import type { Server as HTTPSServer } from 'node:https' import type { Duplex, DuplexOptions } from 'node:stream' @@ -72,12 +72,12 @@ declare class WebSocket extends EventEmitter { constructor(address: null) constructor( address: string | URL, - options?: WebSocket.ClientOptions | ClientRequestArgs + options?: WebSocket.ClientOptions | ClientRequestArgs, ) constructor( address: string | URL, protocols?: string | string[], - options?: WebSocket.ClientOptions | ClientRequestArgs + options?: WebSocket.ClientOptions | ClientRequestArgs, ) close(code?: number, data?: string | Buffer): void @@ -92,7 +92,7 @@ declare class WebSocket extends EventEmitter { compress?: boolean | undefined fin?: boolean | undefined }, - cb?: (err?: Error) => void + cb?: (err?: Error) => void, ): void terminate(): void @@ -112,190 +112,190 @@ declare class WebSocket extends EventEmitter { addEventListener( method: 'message', cb: (event: WebSocket.MessageEvent) => void, - options?: WebSocket.EventListenerOptions + options?: WebSocket.EventListenerOptions, ): void addEventListener( method: 'close', cb: (event: WebSocket.CloseEvent) => void, - options?: WebSocket.EventListenerOptions + options?: WebSocket.EventListenerOptions, ): void addEventListener( method: 'error', cb: (event: WebSocket.ErrorEvent) => void, - options?: WebSocket.EventListenerOptions + options?: WebSocket.EventListenerOptions, ): void addEventListener( method: 'open', cb: (event: WebSocket.Event) => void, - options?: WebSocket.EventListenerOptions + options?: WebSocket.EventListenerOptions, ): void removeEventListener( method: 'message', - cb: (event: WebSocket.MessageEvent) => void + cb: (event: WebSocket.MessageEvent) => void, ): void removeEventListener( method: 'close', - cb: (event: WebSocket.CloseEvent) => void + cb: (event: WebSocket.CloseEvent) => void, ): void removeEventListener( method: 'error', - cb: (event: WebSocket.ErrorEvent) => void + cb: (event: WebSocket.ErrorEvent) => void, ): void removeEventListener( method: 'open', - cb: (event: WebSocket.Event) => void + cb: (event: WebSocket.Event) => void, ): void // Events on( event: 'close', - listener: (this: WebSocket, code: number, reason: Buffer) => void + listener: (this: WebSocket, code: number, reason: Buffer) => void, ): this on(event: 'error', listener: (this: WebSocket, err: Error) => void): this on( event: 'upgrade', - listener: (this: WebSocket, request: IncomingMessage) => void + listener: (this: WebSocket, request: IncomingMessage) => void, ): this on( event: 'message', listener: ( this: WebSocket, data: WebSocket.RawData, - isBinary: boolean - ) => void + isBinary: boolean, + ) => void, ): this on(event: 'open', listener: (this: WebSocket) => void): this on( event: 'ping' | 'pong', - listener: (this: WebSocket, data: Buffer) => void + listener: (this: WebSocket, data: Buffer) => void, ): this on( event: 'unexpected-response', listener: ( this: WebSocket, request: ClientRequest, - response: IncomingMessage - ) => void + response: IncomingMessage, + ) => void, ): this on( event: string | symbol, - listener: (this: WebSocket, ...args: any[]) => void + listener: (this: WebSocket, ...args: any[]) => void, ): this once( event: 'close', - listener: (this: WebSocket, code: number, reason: Buffer) => void + listener: (this: WebSocket, code: number, reason: Buffer) => void, ): this once(event: 'error', listener: (this: WebSocket, err: Error) => void): this once( event: 'upgrade', - listener: (this: WebSocket, request: IncomingMessage) => void + listener: (this: WebSocket, request: IncomingMessage) => void, ): this once( event: 'message', listener: ( this: WebSocket, data: WebSocket.RawData, - isBinary: boolean - ) => void + isBinary: boolean, + ) => void, ): this once(event: 'open', listener: (this: WebSocket) => void): this once( event: 'ping' | 'pong', - listener: (this: WebSocket, data: Buffer) => void + listener: (this: WebSocket, data: Buffer) => void, ): this once( event: 'unexpected-response', listener: ( this: WebSocket, request: ClientRequest, - response: IncomingMessage - ) => void + response: IncomingMessage, + ) => void, ): this once( event: string | symbol, - listener: (this: WebSocket, ...args: any[]) => void + listener: (this: WebSocket, ...args: any[]) => void, ): this off( event: 'close', - listener: (this: WebSocket, code: number, reason: Buffer) => void + listener: (this: WebSocket, code: number, reason: Buffer) => void, ): this off(event: 'error', listener: (this: WebSocket, err: Error) => void): this off( event: 'upgrade', - listener: (this: WebSocket, request: IncomingMessage) => void + listener: (this: WebSocket, request: IncomingMessage) => void, ): this off( event: 'message', listener: ( this: WebSocket, data: WebSocket.RawData, - isBinary: boolean - ) => void + isBinary: boolean, + ) => void, ): this off(event: 'open', listener: (this: WebSocket) => void): this off( event: 'ping' | 'pong', - listener: (this: WebSocket, data: Buffer) => void + listener: (this: WebSocket, data: Buffer) => void, ): this off( event: 'unexpected-response', listener: ( this: WebSocket, request: ClientRequest, - response: IncomingMessage - ) => void + response: IncomingMessage, + ) => void, ): this off( event: string | symbol, - listener: (this: WebSocket, ...args: any[]) => void + listener: (this: WebSocket, ...args: any[]) => void, ): this addListener( event: 'close', - listener: (code: number, reason: Buffer) => void + listener: (code: number, reason: Buffer) => void, ): this addListener(event: 'error', listener: (err: Error) => void): this addListener( event: 'upgrade', - listener: (request: IncomingMessage) => void + listener: (request: IncomingMessage) => void, ): this addListener( event: 'message', - listener: (data: WebSocket.RawData, isBinary: boolean) => void + listener: (data: WebSocket.RawData, isBinary: boolean) => void, ): this addListener(event: 'open', listener: () => void): this addListener(event: 'ping' | 'pong', listener: (data: Buffer) => void): this addListener( event: 'unexpected-response', - listener: (request: ClientRequest, response: IncomingMessage) => void + listener: (request: ClientRequest, response: IncomingMessage) => void, ): this addListener(event: string | symbol, listener: (...args: any[]) => void): this removeListener( event: 'close', - listener: (code: number, reason: Buffer) => void + listener: (code: number, reason: Buffer) => void, ): this removeListener(event: 'error', listener: (err: Error) => void): this removeListener( event: 'upgrade', - listener: (request: IncomingMessage) => void + listener: (request: IncomingMessage) => void, ): this removeListener( event: 'message', - listener: (data: WebSocket.RawData, isBinary: boolean) => void + listener: (data: WebSocket.RawData, isBinary: boolean) => void, ): this removeListener(event: 'open', listener: () => void): this removeListener(event: 'ping' | 'pong', listener: (data: Buffer) => void): this removeListener( event: 'unexpected-response', - listener: (request: ClientRequest, response: IncomingMessage) => void + listener: (request: ClientRequest, response: IncomingMessage) => void, ): this removeListener( event: string | symbol, - listener: (...args: any[]) => void + listener: (...args: any[]) => void, ): this } @@ -340,8 +340,8 @@ declare namespace WebSocket { res: boolean, code?: number, message?: string, - headers?: OutgoingHttpHeaders - ) => void + headers?: OutgoingHttpHeaders, + ) => void, ) => void interface ClientOptions extends SecureContextOptions { @@ -428,7 +428,7 @@ declare namespace WebSocket { | undefined handleProtocols?: ( protocols: Set, - request: IncomingMessage + request: IncomingMessage, ) => string | false path?: string | undefined noServer?: boolean | undefined @@ -459,81 +459,93 @@ declare namespace WebSocket { request: IncomingMessage, socket: Duplex, upgradeHead: Buffer, - callback: (client: T, request: IncomingMessage) => void + callback: (client: T, request: IncomingMessage) => void, ): void shouldHandle(request: IncomingMessage): boolean | Promise // Events on( event: 'connection', - cb: (this: Server, socket: T, request: IncomingMessage) => void + cb: (this: Server, socket: T, request: IncomingMessage) => void, ): this on(event: 'error', cb: (this: Server, error: Error) => void): this on( event: 'headers', - cb: (this: Server, headers: string[], request: IncomingMessage) => void + cb: ( + this: Server, + headers: string[], + request: IncomingMessage, + ) => void, ): this on(event: 'close' | 'listening', cb: (this: Server) => void): this on( event: string | symbol, - listener: (this: Server, ...args: any[]) => void + listener: (this: Server, ...args: any[]) => void, ): this once( event: 'connection', - cb: (this: Server, socket: T, request: IncomingMessage) => void + cb: (this: Server, socket: T, request: IncomingMessage) => void, ): this once(event: 'error', cb: (this: Server, error: Error) => void): this once( event: 'headers', - cb: (this: Server, headers: string[], request: IncomingMessage) => void + cb: ( + this: Server, + headers: string[], + request: IncomingMessage, + ) => void, ): this once(event: 'close' | 'listening', cb: (this: Server) => void): this once( event: string | symbol, - listener: (this: Server, ...args: any[]) => void + listener: (this: Server, ...args: any[]) => void, ): this off( event: 'connection', - cb: (this: Server, socket: T, request: IncomingMessage) => void + cb: (this: Server, socket: T, request: IncomingMessage) => void, ): this off(event: 'error', cb: (this: Server, error: Error) => void): this off( event: 'headers', - cb: (this: Server, headers: string[], request: IncomingMessage) => void + cb: ( + this: Server, + headers: string[], + request: IncomingMessage, + ) => void, ): this off(event: 'close' | 'listening', cb: (this: Server) => void): this off( event: string | symbol, - listener: (this: Server, ...args: any[]) => void + listener: (this: Server, ...args: any[]) => void, ): this addListener( event: 'connection', - cb: (client: T, request: IncomingMessage) => void + cb: (client: T, request: IncomingMessage) => void, ): this addListener(event: 'error', cb: (err: Error) => void): this addListener( event: 'headers', - cb: (headers: string[], request: IncomingMessage) => void + cb: (headers: string[], request: IncomingMessage) => void, ): this addListener(event: 'close' | 'listening', cb: () => void): this addListener( event: string | symbol, - listener: (...args: any[]) => void + listener: (...args: any[]) => void, ): this removeListener(event: 'connection', cb: (client: T) => void): this removeListener(event: 'error', cb: (err: Error) => void): this removeListener( event: 'headers', - cb: (headers: string[], request: IncomingMessage) => void + cb: (headers: string[], request: IncomingMessage) => void, ): this removeListener(event: 'close' | 'listening', cb: () => void): this removeListener( event: string | symbol, - listener: (...args: any[]) => void + listener: (...args: any[]) => void, ): this } @@ -545,7 +557,7 @@ declare namespace WebSocket { // WebSocket stream function createWebSocketStream( websocket: WebSocket, - options?: DuplexOptions + options?: DuplexOptions, ): Duplex } diff --git a/packages/vite/types/customEvent.d.ts b/packages/vite/types/customEvent.d.ts index 86d0807e0b9256..c27bde437e97bf 100644 --- a/packages/vite/types/customEvent.d.ts +++ b/packages/vite/types/customEvent.d.ts @@ -2,7 +2,7 @@ import type { ErrorPayload, FullReloadPayload, PrunePayload, - UpdatePayload + UpdatePayload, } from './hmrPayload' export interface CustomEventMap { diff --git a/packages/vite/types/hot.d.ts b/packages/vite/types/hot.d.ts index 03f96d196e2099..5e8a450151606b 100644 --- a/packages/vite/types/hot.d.ts +++ b/packages/vite/types/hot.d.ts @@ -12,12 +12,12 @@ export interface ViteHotContext { accept(dep: string, cb: (mod: ModuleNamespace | undefined) => void): void accept( deps: readonly string[], - cb: (mods: Array) => void + cb: (mods: Array) => void, ): void acceptExports( exportNames: string | readonly string[], - cb?: (mod: ModuleNamespace | undefined) => void + cb?: (mod: ModuleNamespace | undefined) => void, ): void dispose(cb: (data: any) => void): void @@ -26,7 +26,7 @@ export interface ViteHotContext { on( event: T, - cb: (payload: InferCustomEventPayload) => void + cb: (payload: InferCustomEventPayload) => void, ): void send(event: T, data?: InferCustomEventPayload): void } diff --git a/packages/vite/types/importGlob.d.ts b/packages/vite/types/importGlob.d.ts index 321e3804a7e09a..98786bbdd9efa5 100644 --- a/packages/vite/types/importGlob.d.ts +++ b/packages/vite/types/importGlob.d.ts @@ -1,6 +1,6 @@ export interface ImportGlobOptions< Eager extends boolean, - AsType extends string + AsType extends string, > { /** * Import type for the import url. @@ -45,10 +45,10 @@ export interface ImportGlobFunction { < Eager extends boolean, As extends string, - T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown + T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown, >( glob: string | string[], - options?: ImportGlobOptions + options?: ImportGlobOptions, ): (Eager extends true ? true : false) extends true ? Record : Record Promise> @@ -59,7 +59,7 @@ export interface ImportGlobFunction { */ ( glob: string | string[], - options?: ImportGlobOptions + options?: ImportGlobOptions, ): Record Promise> /** * Import a list of files with a glob pattern. @@ -68,7 +68,7 @@ export interface ImportGlobFunction { */ ( glob: string | string[], - options: ImportGlobOptions + options: ImportGlobOptions, ): Record } @@ -80,10 +80,10 @@ export interface ImportGlobEagerFunction { */ < As extends string, - T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown + T = As extends keyof KnownAsTypeMap ? KnownAsTypeMap[As] : unknown, >( glob: string | string[], - options?: Omit, 'eager'> + options?: Omit, 'eager'>, ): Record /** * Eagerly import a list of files with a glob pattern. @@ -92,6 +92,6 @@ export interface ImportGlobEagerFunction { */ ( glob: string | string[], - options?: Omit, 'eager'> + options?: Omit, 'eager'>, ): Record } diff --git a/playground/alias/__tests__/alias.spec.ts b/playground/alias/__tests__/alias.spec.ts index cef34c07c51004..3cc6f8b8ce3315 100644 --- a/playground/alias/__tests__/alias.spec.ts +++ b/playground/alias/__tests__/alias.spec.ts @@ -7,13 +7,13 @@ test('fs', async () => { test('fs directory', async () => { expect(await page.textContent('.fs-dir')).toMatch( - '[success] alias to directory' + '[success] alias to directory', ) }) test('regex', async () => { expect(await page.textContent('.regex')).toMatch( - '[success] alias to directory via regex' + '[success] alias to directory via regex', ) }) @@ -23,7 +23,7 @@ test('dependency', async () => { test('js via script src', async () => { expect(await page.textContent('.from-script-src')).toMatch( - '[success] from script src' + '[success] from script src', ) }) @@ -35,18 +35,18 @@ test('css via link', async () => { test('optimized dep', async () => { expect(await page.textContent('.optimized')).toMatch( - '[success] alias optimized' + '[success] alias optimized', ) }) test('aliased module', async () => { expect(await page.textContent('.aliased-module')).toMatch( - '[success] aliased module' + '[success] aliased module', ) }) test('custom resolver', async () => { expect(await page.textContent('.custom-resolver')).toMatch( - '[success] alias to custom-resolver path' + '[success] alias to custom-resolver path', ) }) diff --git a/playground/alias/index.html b/playground/alias/index.html index 32a2fd171fc2b8..f292ea5c8ad07a 100644 --- a/playground/alias/index.html +++ b/playground/alias/index.html @@ -38,9 +38,9 @@

Alias

template: '[{{ msg }}] alias optimized dep', setup() { return { - msg: ref('success') + msg: ref('success'), } - } + }, }).mount('.optimized') // aliased to an absolute URL in CJS, should be optimized diff --git a/playground/alias/vite.config.js b/playground/alias/vite.config.js index 16c33dd859aa66..97ffcde1adc676 100644 --- a/playground/alias/vite.config.js +++ b/playground/alias/vite.config.js @@ -11,7 +11,7 @@ module.exports = { { find: 'dep', replacement: 'resolve-linked' }, { find: /^regex\/(.*)/, - replacement: `${path.resolve(__dirname, 'dir')}/$1` + replacement: `${path.resolve(__dirname, 'dir')}/$1`, }, { find: '/@', replacement: path.resolve(__dirname, 'dir') }, // aliasing an optimized dep @@ -19,7 +19,7 @@ module.exports = { // aliasing an optimized dep to absolute URL { find: '@vue/shared', - replacement: require.resolve('@vue/shared/dist/shared.cjs.prod.js') + replacement: require.resolve('@vue/shared/dist/shared.cjs.prod.js'), }, // aliasing one unoptimized dep to an optimized dep { find: 'foo', replacement: 'vue' }, @@ -28,15 +28,15 @@ module.exports = { replacement: path.resolve(__dirname, 'test.js'), customResolver(id) { return id.replace('test.js', 'customResolver.js') - } - } - ] + }, + }, + ], }, build: { - minify: false + minify: false, }, define: { __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: true - } + __VUE_PROD_DEVTOOLS__: true, + }, } diff --git a/playground/assets-sanitize/__tests__/assets-sanitize.spec.ts b/playground/assets-sanitize/__tests__/assets-sanitize.spec.ts index fc9c1ad8c81a7c..9fd8b1e988b089 100644 --- a/playground/assets-sanitize/__tests__/assets-sanitize.spec.ts +++ b/playground/assets-sanitize/__tests__/assets-sanitize.spec.ts @@ -17,7 +17,7 @@ if (!isBuild) { expect(await page.textContent('.plus-circle')).toMatch(plusCircleAsset) expect(await getBg('.underscore-circle')).toMatch(underscoreCircleAsset) expect(await page.textContent('.underscore-circle')).toMatch( - underscoreCircleAsset + underscoreCircleAsset, ) expect(plusCircleAsset).toMatch('/_circle') expect(underscoreCircleAsset).toMatch('/_circle') diff --git a/playground/assets-sanitize/vite.config.js b/playground/assets-sanitize/vite.config.js index 0e365a95383833..c259a739d608b0 100644 --- a/playground/assets-sanitize/vite.config.js +++ b/playground/assets-sanitize/vite.config.js @@ -6,6 +6,6 @@ module.exports = defineConfig({ minify: false, target: 'esnext', assetsInlineLimit: 0, - manifest: true - } + manifest: true, + }, }) diff --git a/playground/assets/__tests__/assets.spec.ts b/playground/assets/__tests__/assets.spec.ts index 5ba9437c4e0eab..482cf5a3b8a599 100644 --- a/playground/assets/__tests__/assets.spec.ts +++ b/playground/assets/__tests__/assets.spec.ts @@ -15,7 +15,7 @@ import { readManifest, untilUpdated, viteTestUrl, - watcher + watcher, } from '~utils' const assetMatch = isBuild @@ -32,17 +32,17 @@ test('should have no 404s', () => { test('should get a 404 when using incorrect case', async () => { expect((await fetch(path.posix.join(viteTestUrl, 'icon.png'))).status).toBe( - 200 + 200, ) expect((await fetch(path.posix.join(viteTestUrl, 'ICON.png'))).status).toBe( - 404 + 404, ) }) describe('injected scripts', () => { test('@vite/client', async () => { const hasClient = await page.$( - 'script[type="module"][src="/foo/@vite/client"]' + 'script[type="module"][src="/foo/@vite/client"]', ) if (isBuild) { expect(hasClient).toBeFalsy() @@ -53,7 +53,7 @@ describe('injected scripts', () => { test('html-proxy', async () => { const hasHtmlProxy = await page.$( - 'script[type="module"][src^="/foo/index.html?html-proxy"]' + 'script[type="module"][src^="/foo/index.html?html-proxy"]', ) if (isBuild) { expect(hasHtmlProxy).toBeFalsy() @@ -75,7 +75,7 @@ describe('raw references from /public', () => { test('import-expression from simple script', async () => { expect(await page.textContent('.import-expression')).toMatch( - '[success][success]' + '[success][success]', ) }) @@ -98,7 +98,7 @@ describe('css url() references', () => { expect( await page.evaluate(() => { return (document as any).fonts.check('700 32px Inter') - }) + }), ).toBe(true) }) @@ -137,7 +137,7 @@ describe('css url() references', () => { test('image-set with base64', async () => { const imageSet = await getBg('.css-image-set-base64') expect(imageSet).toMatch( - `-webkit-image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0AgMAAACrwbOMAAADI2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1MDI2QjVGQTg3RUIxMUVBQUFDMkQ3NTM0MUZGNzU3RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1MDI2QjVGOTg3RUIxMUVBQUFDMkQ3NTM0MUZGNzU3RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNzc3MDZDRjg3QUIxMUUzQjcwREVFMDM3NzA2QzEyMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNzc3MDZEMDg3QUIxMUUzQjcwREVFMDM3NzA2QzEyMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqfCcbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAADFBMVEVBuoQ0R10/qn8/qX7FyuqbAAAABHRSTlP9/QGEiU0+GwAAAPtJREFUGBkFwbFNXEEUBdDD/QSWmE7YYAogWNeAaMfaEuiD5HfAk9yIAwqYwIGRRvt8zkNdvckrzzcfjqDccdPIYnH1AJ4ywLs7m53Fhkcw0+DLDxZn0PCHQrrg2xWOCpS7m6bFAj/ZDLFY/AJbDDZ/WUzR4B84BRoURBeAo4Si0CBMFvBEGMBmExYbi0loACcBjQKhC3AUQVGaRjBhMxAsFlwQDLYFBA04EaAVEHSBoxAoPmkITBYDAovNhsAAEwINTggAINCFoyCg0CBgYoCAjQsIACCgcYKABhCgHAUClAYCTAMIsF2AAAACtBMIQAEB+jcggE9AAC+A/zyyZDSXstCbAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAYAAADWr1sfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyNkI1RkE4N0VCMTFFQUFBQzJENzUzNDFGRjc1N0UiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyNkI1Rjk4N0VCMTFFQUFBQzJENzUzNDFGRjc1N0UiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTc3NzA2Q0Y4N0FCMTFFM0I3MERFRTAzNzcwNkMxMjMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTc3NzA2RDA4N0FCMTFFM0I3MERFRTAzNzcwNkMxMjMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6nwnGxAAAJtklEQVR42txZ6W9c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") 2x)` + `-webkit-image-set(url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0AgMAAACrwbOMAAADI2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1MDI2QjVGQTg3RUIxMUVBQUFDMkQ3NTM0MUZGNzU3RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1MDI2QjVGOTg3RUIxMUVBQUFDMkQ3NTM0MUZGNzU3RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNzc3MDZDRjg3QUIxMUUzQjcwREVFMDM3NzA2QzEyMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNzc3MDZEMDg3QUIxMUUzQjcwREVFMDM3NzA2QzEyMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqfCcbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAADFBMVEVBuoQ0R10/qn8/qX7FyuqbAAAABHRSTlP9/QGEiU0+GwAAAPtJREFUGBkFwbFNXEEUBdDD/QSWmE7YYAogWNeAaMfaEuiD5HfAk9yIAwqYwIGRRvt8zkNdvckrzzcfjqDccdPIYnH1AJ4ywLs7m53Fhkcw0+DLDxZn0PCHQrrg2xWOCpS7m6bFAj/ZDLFY/AJbDDZ/WUzR4B84BRoURBeAo4Si0CBMFvBEGMBmExYbi0loACcBjQKhC3AUQVGaRjBhMxAsFlwQDLYFBA04EaAVEHSBoxAoPmkITBYDAovNhsAAEwINTggAINCFoyCg0CBgYoCAjQsIACCgcYKABhCgHAUClAYCTAMIsF2AAAACtBMIQAEB+jcggE9AAC+A/zyyZDSXstCbAAAAAElFTkSuQmCC") 1x, url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA0CAYAAADWr1sfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyNkI1RkE4N0VCMTFFQUFBQzJENzUzNDFGRjc1N0UiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyNkI1Rjk4N0VCMTFFQUFBQzJENzUzNDFGRjc1N0UiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTc3NzA2Q0Y4N0FCMTFFM0I3MERFRTAzNzcwNkMxMjMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTc3NzA2RDA4N0FCMTFFM0I3MERFRTAzNzcwNkMxMjMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6nwnGxAAAJtklEQVR42txZ6W9c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") 2x)`, ) }) @@ -210,7 +210,7 @@ describe('image', () => { expect(s).toMatch( isBuild ? /\/foo\/assets\/asset-\w{8}\.png \dx/ - : /\/foo\/nested\/asset.png \dx/ + : /\/foo\/nested\/asset.png \dx/, ) }) }) @@ -238,7 +238,7 @@ describe('svg fragments', () => { test('Unknown extension assets import', async () => { expect(await page.textContent('.unknown-ext')).toMatch( - isBuild ? 'data:application/octet-stream;' : '/nested/foo.unknown' + isBuild ? 'data:application/octet-stream;' : '/nested/foo.unknown', ) }) @@ -251,9 +251,9 @@ test('?url import', async () => { expect(await page.textContent('.url')).toMatch( isBuild ? `data:application/javascript;base64,${Buffer.from(src).toString( - 'base64' + 'base64', )}` - : `/foo/foo.js` + : `/foo/foo.js`, ) }) @@ -263,7 +263,7 @@ test('?url import on css', async () => { expect(txt).toEqual( isBuild ? `data:text/css;base64,${Buffer.from(src).toString('base64')}` - : '/foo/css/icons.css' + : '/foo/css/icons.css', ) }) @@ -273,9 +273,9 @@ describe('unicode url', () => { expect(await page.textContent('.unicode-url')).toMatch( isBuild ? `data:application/javascript;base64,${Buffer.from(src).toString( - 'base64' + 'base64', )}` - : `/foo/テスト-測試-white space.js` + : `/foo/テスト-測試-white space.js`, ) }) }) @@ -284,7 +284,7 @@ describe.runIf(isBuild)('encodeURI', () => { test('img src with encodeURI', async () => { const img = await page.$('.encodeURI') expect( - (await img.getAttribute('src')).startsWith('data:image/png;base64') + (await img.getAttribute('src')).startsWith('data:image/png;base64'), ).toBe(true) }) }) @@ -299,25 +299,25 @@ test('new URL("@/...", import.meta.url)', async () => { test('new URL("/...", import.meta.url)', async () => { expect(await page.textContent('.import-meta-url-base-path')).toMatch( - iconMatch + iconMatch, ) }) test('new URL(`${dynamic}`, import.meta.url)', async () => { expect(await page.textContent('.dynamic-import-meta-url-1')).toMatch( - isBuild ? 'data:image/png;base64' : '/foo/nested/icon.png' + isBuild ? 'data:image/png;base64' : '/foo/nested/icon.png', ) expect(await page.textContent('.dynamic-import-meta-url-2')).toMatch( - assetMatch + assetMatch, ) expect(await page.textContent('.dynamic-import-meta-url-js')).toMatch( - isBuild ? 'data:application/javascript;base64' : '/foo/nested/test.js' + isBuild ? 'data:application/javascript;base64' : '/foo/nested/test.js', ) }) test('new URL(`non-existent`, import.meta.url)', async () => { expect(await page.textContent('.non-existent-import-meta-url')).toMatch( - new URL('non-existent', page.url()).pathname + new URL('non-existent', page.url()).pathname, ) }) @@ -371,7 +371,7 @@ if (!isBuild) { editFile( './css/import.css', (code) => code.replace('#0088ff', '#00ff88'), - true + true, ) await page.waitForNavigation() await untilUpdated(() => getColor('.import-css'), 'rgb(0, 255, 136)') @@ -380,7 +380,7 @@ if (!isBuild) { test('html import word boundary', async () => { expect(await page.textContent('.obj-import-express')).toMatch( - 'ignore object import prop' + 'ignore object import prop', ) expect(await page.textContent('.string-import-express')).toMatch('no load') }) diff --git a/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts b/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts index 7163b425ecc585..70cb0fef940978 100644 --- a/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts +++ b/playground/assets/__tests__/relative-base/relative-base-assets.spec.ts @@ -6,7 +6,7 @@ import { getColor, isBuild, page, - viteConfig + viteConfig, } from '~utils' const absoluteAssetMatch = isBuild @@ -43,26 +43,26 @@ describe('raw references from /public', () => { test('import-expression from simple script', async () => { expect(await page.textContent('.import-expression')).toMatch( - '[success][success]' + '[success][success]', ) }) describe('asset imports from js', () => { test('relative', async () => { expect(await page.textContent('.asset-import-relative')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) test('absolute', async () => { expect(await page.textContent('.asset-import-absolute')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) test('from /public', async () => { expect(await page.textContent('.public-import')).toMatch( - absolutePublicIconMatch + absolutePublicIconMatch, ) }) }) @@ -72,7 +72,7 @@ describe('css url() references', () => { expect( await page.evaluate(() => { return (document as any).fonts.check('700 32px Inter') - }) + }), ).toBe(true) }) @@ -111,7 +111,7 @@ describe('css url() references', () => { test('relative in @import', async () => { expect(await getBg('.css-url-relative-at-imported')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) @@ -159,7 +159,7 @@ describe('image', () => { expect(s).toMatch( isBuild ? /other-assets\/asset-\w{8}\.png \dx/ - : /\.\/nested\/asset\.png \dx/ + : /\.\/nested\/asset\.png \dx/, ) }) }) @@ -191,14 +191,14 @@ test('?raw import', async () => { test('?url import', async () => { expect(await page.textContent('.url')).toMatch( - isBuild ? /http.*\/other-assets\/foo-\w{8}\.js/ : `/foo.js` + isBuild ? /http.*\/other-assets\/foo-\w{8}\.js/ : `/foo.js`, ) }) test('?url import on css', async () => { const txt = await page.textContent('.url-css') expect(txt).toMatch( - isBuild ? /http.*\/other-assets\/icons-\w{8}\.css/ : '/css/icons.css' + isBuild ? /http.*\/other-assets\/icons-\w{8}\.css/ : '/css/icons.css', ) }) @@ -215,7 +215,7 @@ test('new URL(`${dynamic}`, import.meta.url)', async () => { test('new URL(`non-existent`, import.meta.url)', async () => { expect(await page.textContent('.non-existent-import-meta-url')).toMatch( - '/non-existent' + '/non-existent', ) }) @@ -226,7 +226,7 @@ test('inline style test', async () => { test('html import word boundary', async () => { expect(await page.textContent('.obj-import-express')).toMatch( - 'ignore object import prop' + 'ignore object import prop', ) expect(await page.textContent('.string-import-express')).toMatch('no load') }) diff --git a/playground/assets/__tests__/runtime-base/runtime-base-assets.spec.ts b/playground/assets/__tests__/runtime-base/runtime-base-assets.spec.ts index 0606e8bf8dfa88..12412d00ef4204 100644 --- a/playground/assets/__tests__/runtime-base/runtime-base-assets.spec.ts +++ b/playground/assets/__tests__/runtime-base/runtime-base-assets.spec.ts @@ -5,7 +5,7 @@ import { getBg, getColor, isBuild, - page + page, } from '~utils' const absoluteAssetMatch = isBuild @@ -42,26 +42,26 @@ describe('raw references from /public', () => { test('import-expression from simple script', async () => { expect(await page.textContent('.import-expression')).toMatch( - '[success][success]' + '[success][success]', ) }) describe('asset imports from js', () => { test('relative', async () => { expect(await page.textContent('.asset-import-relative')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) test('absolute', async () => { expect(await page.textContent('.asset-import-absolute')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) test('from /public', async () => { expect(await page.textContent('.public-import')).toMatch( - absolutePublicIconMatch + absolutePublicIconMatch, ) }) }) @@ -71,7 +71,7 @@ describe('css url() references', () => { expect( await page.evaluate(() => { return (document as any).fonts.check('700 32px Inter') - }) + }), ).toBe(true) }) @@ -110,7 +110,7 @@ describe('css url() references', () => { test('relative in @import', async () => { expect(await getBg('.css-url-relative-at-imported')).toMatch( - cssBgAssetMatch + cssBgAssetMatch, ) }) @@ -157,7 +157,7 @@ describe('image', () => { expect(s).toMatch( isBuild ? /other-assets\/asset-\w{8}\.png \dx/ - : /\.\/nested\/asset\.png \dx/ + : /\.\/nested\/asset\.png \dx/, ) }) }) @@ -189,14 +189,14 @@ test('?raw import', async () => { test('?url import', async () => { expect(await page.textContent('.url')).toMatch( - isBuild ? /\/other-assets\/foo-\w{8}\.js/ : `/foo.js` + isBuild ? /\/other-assets\/foo-\w{8}\.js/ : `/foo.js`, ) }) test('?url import on css', async () => { const txt = await page.textContent('.url-css') expect(txt).toMatch( - isBuild ? /\/other-assets\/icons-\w{8}\.css/ : '/css/icons.css' + isBuild ? /\/other-assets\/icons-\w{8}\.css/ : '/css/icons.css', ) }) @@ -213,7 +213,7 @@ test('new URL(`${dynamic}`, import.meta.url)', async () => { test('new URL(`non-existent`, import.meta.url)', async () => { expect(await page.textContent('.non-existent-import-meta-url')).toMatch( - '/non-existent' + '/non-existent', ) }) @@ -224,7 +224,7 @@ test('inline style test', async () => { test('html import word boundary', async () => { expect(await page.textContent('.obj-import-express')).toMatch( - 'ignore object import prop' + 'ignore object import prop', ) expect(await page.textContent('.string-import-express')).toMatch('no load') }) diff --git a/playground/assets/index.html b/playground/assets/index.html index f897d61a355ed0..a8dc818b25daee 100644 --- a/playground/assets/index.html +++ b/playground/assets/index.html @@ -234,7 +234,7 @@

simple script tag import-expression

const obj = { import(t) { text('.obj-import-express', t) - } + }, } const stringImport = "const t = import('package')" function text(el, text) { diff --git a/playground/assets/vite.config-relative-base.js b/playground/assets/vite.config-relative-base.js index 7b54a149bcd987..7edbaf07c95c29 100644 --- a/playground/assets/vite.config-relative-base.js +++ b/playground/assets/vite.config-relative-base.js @@ -16,11 +16,11 @@ module.exports = { output: { entryFileNames: 'entries/[name].js', chunkFileNames: 'chunks/[name]-[hash].js', - assetFileNames: 'other-assets/[name]-[hash][extname]' - } - } + assetFileNames: 'other-assets/[name]-[hash][extname]', + }, + }, }, testConfig: { - baseRoute: '/relative-base/' - } + baseRoute: '/relative-base/', + }, } diff --git a/playground/assets/vite.config-runtime-base.js b/playground/assets/vite.config-runtime-base.js index 12d20e7956e131..7d2c042c9211e5 100644 --- a/playground/assets/vite.config-runtime-base.js +++ b/playground/assets/vite.config-runtime-base.js @@ -23,9 +23,9 @@ module.exports = { output: { entryFileNames: 'entries/[name].js', chunkFileNames: 'chunks/[name]-[hash].js', - assetFileNames: 'other-assets/[name]-[hash][extname]' - } - } + assetFileNames: 'other-assets/[name]-[hash][extname]', + }, + }, }, plugins: [ { @@ -37,28 +37,28 @@ module.exports = { { tag: 'script', attrs: { type: 'module' }, - children: dynamicBaseAssetsCode - } + children: dynamicBaseAssetsCode, + }, ] } - } - } + }, + }, ], experimental: { renderBuiltUrl(filename, { hostType, type }) { if (type === 'asset') { if (hostType === 'js') { return { - runtime: `globalThis.__toAssetUrl(${JSON.stringify(filename)})` + runtime: `globalThis.__toAssetUrl(${JSON.stringify(filename)})`, } } } else if (type === 'public') { if (hostType === 'js') { return { - runtime: `globalThis.__publicBase+${JSON.stringify(filename)}` + runtime: `globalThis.__publicBase+${JSON.stringify(filename)}`, } } } - } - } + }, + }, } diff --git a/playground/assets/vite.config.js b/playground/assets/vite.config.js index ff4789679659d8..e6d2ba3fb460d2 100644 --- a/playground/assets/vite.config.js +++ b/playground/assets/vite.config.js @@ -8,14 +8,14 @@ module.exports = { publicDir: 'static', resolve: { alias: { - '@': path.resolve(__dirname, 'nested') - } + '@': path.resolve(__dirname, 'nested'), + }, }, assetsInclude: ['**/*.unknown'], build: { outDir: 'dist/foo', assetsInlineLimit: 8192, // 8kb manifest: true, - watch: {} - } + watch: {}, + }, } diff --git a/playground/backend-integration/__tests__/backend-integration.spec.ts b/playground/backend-integration/__tests__/backend-integration.spec.ts index 29b4b903c1d0ed..8d067f0616775d 100644 --- a/playground/backend-integration/__tests__/backend-integration.spec.ts +++ b/playground/backend-integration/__tests__/backend-integration.spec.ts @@ -9,7 +9,7 @@ import { page, readManifest, untilBrowserLogAfter, - untilUpdated + untilUpdated, } from '~utils' const outerAssetMatch = isBuild @@ -25,7 +25,7 @@ test('should have no 404s', () => { describe('asset imports from js', () => { test('file outside root', async () => { expect( - await page.textContent('.asset-reference.outside-root .asset-url') + await page.textContent('.asset-reference.outside-root .asset-url'), ).toMatch(outerAssetMatch) }) }) @@ -61,7 +61,7 @@ describe.runIf(isServe)('serve', () => { test('preserve the base in CSS HMR', async () => { await untilUpdated(() => getColor('body'), 'black') // sanity check editFile('frontend/entrypoints/global.css', (code) => - code.replace('black', 'red') + code.replace('black', 'red'), ) await untilUpdated(() => getColor('body'), 'red') // successful HMR @@ -75,9 +75,9 @@ describe.runIf(isServe)('serve', () => { await untilBrowserLogAfter( () => editFile('frontend/entrypoints/main.ts', (code) => - code.replace('text-black', 'text-[rgb(204,0,0)]') + code.replace('text-black', 'text-[rgb(204,0,0)]'), ), - '[vite] css hot updated: /global.css' + '[vite] css hot updated: /global.css', ) await untilUpdated(() => getColor(el), 'rgb(204, 0, 0)') }) diff --git a/playground/backend-integration/postcss.config.js b/playground/backend-integration/postcss.config.js index 9c7a1787315279..f2f538422a839e 100644 --- a/playground/backend-integration/postcss.config.js +++ b/playground/backend-integration/postcss.config.js @@ -1,6 +1,6 @@ // postcss.config.js module.exports = { plugins: { - tailwindcss: { config: __dirname + '/tailwind.config.js' } - } + tailwindcss: { config: __dirname + '/tailwind.config.js' }, + }, } diff --git a/playground/backend-integration/tailwind.config.js b/playground/backend-integration/tailwind.config.js index 0c3ae11de7565e..a91db5247f6553 100644 --- a/playground/backend-integration/tailwind.config.js +++ b/playground/backend-integration/tailwind.config.js @@ -1,10 +1,10 @@ module.exports = { content: [__dirname + '/frontend/**/*.{css,html,ts,js}'], theme: { - extend: {} + extend: {}, }, variants: { - extend: {} + extend: {}, }, - plugins: [] + plugins: [], } diff --git a/playground/backend-integration/vite.config.js b/playground/backend-integration/vite.config.js index ff5d2c43c3ed04..245f1324ded5ed 100644 --- a/playground/backend-integration/vite.config.js +++ b/playground/backend-integration/vite.config.js @@ -26,17 +26,17 @@ function BackendIntegrationExample() { manifest: true, outDir, rollupOptions: { - input: Object.fromEntries(entrypoints) - } + input: Object.fromEntries(entrypoints), + }, }, root, resolve: { alias: { - '~': sourceCodeDir - } - } + '~': sourceCodeDir, + }, + }, } - } + }, } } @@ -45,5 +45,5 @@ function BackendIntegrationExample() { */ module.exports = { base: '/dev/', - plugins: [BackendIntegrationExample()] + plugins: [BackendIntegrationExample()], } diff --git a/playground/build-old/vite.config.js b/playground/build-old/vite.config.js index aa85af55972eb1..6c5d26db8c0ee7 100644 --- a/playground/build-old/vite.config.js +++ b/playground/build-old/vite.config.js @@ -3,6 +3,6 @@ import { defineConfig } from 'vite' export default defineConfig({ build: { // old browsers only - target: ['chrome60'] - } + target: ['chrome60'], + }, }) diff --git a/playground/cli-module/__tests__/cli-module.spec.ts b/playground/cli-module/__tests__/cli-module.spec.ts index ef109e75cc77cc..7eccaaa74b8578 100644 --- a/playground/cli-module/__tests__/cli-module.spec.ts +++ b/playground/cli-module/__tests__/cli-module.spec.ts @@ -13,12 +13,12 @@ test('cli should work in "type":"module" package', async () => { page.on('console', onConsole) await page.goto(`http://localhost:${port}/`) expect(await page.textContent('.app')).toBe( - 'vite cli in "type":"module" package works!' + 'vite cli in "type":"module" package works!', ) expect( logs.some((msg) => - msg.match('vite cli in "type":"module" package works!') - ) + msg.match('vite cli in "type":"module" package works!'), + ), ).toBe(true) } finally { page.off('console', onConsole) diff --git a/playground/cli-module/__tests__/serve.ts b/playground/cli-module/__tests__/serve.ts index 545d3732844b6b..4a76a6f810b3a9 100644 --- a/playground/cli-module/__tests__/serve.ts +++ b/playground/cli-module/__tests__/serve.ts @@ -9,7 +9,7 @@ import { killProcess, ports, rootDir, - viteBinPath + viteBinPath, } from '~utils' export const port = ports['cli-module'] @@ -18,7 +18,7 @@ export async function serve() { // collect stdout and stderr streams from child processes here to avoid interfering with regular vitest output const streams = { build: { out: [], err: [] }, - server: { out: [], err: [] } + server: { out: [], err: [] }, } // helpers to collect streams const collectStreams = (name, process) => { @@ -47,7 +47,7 @@ export async function serve() { try { const buildProcess = execaCommand(buildCommand, { cwd: rootDir, - stdio: 'pipe' + stdio: 'pipe', }) collectStreams('build', buildProcess) await buildProcess @@ -69,7 +69,7 @@ export async function serve() { const serverCommand = `${viteBinPath} ${viteServerArgs.join(' ')}` const serverProcess = execaCommand(serverCommand, { cwd: rootDir, - stdio: 'pipe' + stdio: 'pipe', }) collectStreams('server', serverProcess) @@ -85,7 +85,7 @@ export async function serve() { collectErrorStreams('server', e) console.error( `error while killing cli command "${serverCommand}":`, - e + e, ) await printStreamsToConsole('server') } @@ -105,7 +105,7 @@ export async function serve() { } catch (e1) { console.error( `error while killing cli command after failed execute "${serverCommand}":`, - e1 + e1, ) } } @@ -120,7 +120,7 @@ async function startedOnPort(serverProcess, port, timeout) { // hack, console output may contain color code gibberish // skip gibberish between localhost: and port number const match = str.match( - /(http:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):).*(\d{4})/ + /(http:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):).*(\d{4})/, ) if (match) { const startedPort = parseInt(match[2], 10) @@ -137,7 +137,7 @@ async function startedOnPort(serverProcess, port, timeout) { return resolvedOrTimeout( startedPromise, timeout, - `failed to start within ${timeout}ms` + `failed to start within ${timeout}ms`, ).finally(() => serverProcess.stdout.off('data', checkPort)) } @@ -148,7 +148,7 @@ async function resolvedOrTimeout(promise, ms, errorMessage) { promise, new Promise((_, reject) => { timer = setTimeout(() => reject(errorMessage), ms) - }) + }), ]).finally(() => { clearTimeout(timer) timer = null diff --git a/playground/cli-module/vite.config.js b/playground/cli-module/vite.config.js index 4020d4627917bb..ed7ac01c2d6612 100644 --- a/playground/cli-module/vite.config.js +++ b/playground/cli-module/vite.config.js @@ -8,11 +8,11 @@ globalThis.__test_url = URL export default defineConfig({ server: { - host: 'localhost' + host: 'localhost', }, build: { //speed up build minify: false, - target: 'esnext' - } + target: 'esnext', + }, }) diff --git a/playground/cli/__tests__/serve.ts b/playground/cli/__tests__/serve.ts index ec4f80a79d4593..3597e236bdd806 100644 --- a/playground/cli/__tests__/serve.ts +++ b/playground/cli/__tests__/serve.ts @@ -9,7 +9,7 @@ import { killProcess, ports, rootDir, - viteBinPath + viteBinPath, } from '~utils' export const port = ports.cli @@ -18,7 +18,7 @@ export async function serve() { // collect stdout and stderr streams from child processes here to avoid interfering with regular vitest output const streams = { build: { out: [], err: [] }, - server: { out: [], err: [] } + server: { out: [], err: [] }, } // helpers to collect streams const collectStreams = (name, process) => { @@ -47,7 +47,7 @@ export async function serve() { try { const buildProcess = execaCommand(buildCommand, { cwd: rootDir, - stdio: 'pipe' + stdio: 'pipe', }) collectStreams('build', buildProcess) await buildProcess @@ -69,7 +69,7 @@ export async function serve() { const serverCommand = `${viteBinPath} ${viteServerArgs.join(' ')}` const serverProcess = execaCommand(serverCommand, { cwd: rootDir, - stdio: 'pipe' + stdio: 'pipe', }) collectStreams('server', serverProcess) @@ -85,7 +85,7 @@ export async function serve() { collectErrorStreams('server', e) console.error( `error while killing cli command "${serverCommand}":`, - e + e, ) await printStreamsToConsole('server') } @@ -105,7 +105,7 @@ export async function serve() { } catch (e1) { console.error( `error while killing cli command after failed execute "${serverCommand}":`, - e1 + e1, ) } } @@ -120,7 +120,7 @@ async function startedOnPort(serverProcess, port, timeout) { // hack, console output may contain color code gibberish // skip gibberish between localhost: and port number const match = str.match( - /(http:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):).*(\d{4})/ + /(http:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):).*(\d{4})/, ) if (match) { const startedPort = parseInt(match[2], 10) @@ -137,7 +137,7 @@ async function startedOnPort(serverProcess, port, timeout) { return resolvedOrTimeout( startedPromise, timeout, - `failed to start within ${timeout}ms` + `failed to start within ${timeout}ms`, ).finally(() => serverProcess.stdout.off('data', checkPort)) } @@ -148,7 +148,7 @@ async function resolvedOrTimeout(promise, ms, errorMessage) { promise, new Promise((_, reject) => { timer = setTimeout(() => reject(errorMessage), ms) - }) + }), ]).finally(() => { clearTimeout(timer) timer = null diff --git a/playground/cli/vite.config.js b/playground/cli/vite.config.js index f7b25d32ecc312..5a5d90cdd8d570 100644 --- a/playground/cli/vite.config.js +++ b/playground/cli/vite.config.js @@ -4,12 +4,12 @@ module.exports = defineConfig({ server: { host: 'localhost', headers: { - 'Cache-Control': 'no-store' - } + 'Cache-Control': 'no-store', + }, }, build: { //speed up build minify: false, - target: 'esnext' - } + target: 'esnext', + }, }) diff --git a/playground/config/__tests__/load.spec.ts b/playground/config/__tests__/load.spec.ts index 3205912b8156c3..6236fff91b9272 100644 --- a/playground/config/__tests__/load.spec.ts +++ b/playground/config/__tests__/load.spec.ts @@ -6,7 +6,7 @@ it('loadConfigFromFile', async () => { const { config } = await loadConfigFromFile( {} as any, resolve(__dirname, '../packages/entry/vite.config.ts'), - resolve(__dirname, '../packages/entry') + resolve(__dirname, '../packages/entry'), ) expect(config).toMatchInlineSnapshot(` { diff --git a/playground/config/packages/entry/vite.config.ts b/playground/config/packages/entry/vite.config.ts index 9b865e5fa3d66a..7a4e9a682ae040 100644 --- a/playground/config/packages/entry/vite.config.ts +++ b/playground/config/packages/entry/vite.config.ts @@ -3,5 +3,5 @@ import { array } from '../siblings/foo' export default { array, - moduleCondition + moduleCondition, } diff --git a/playground/css-codesplit-cjs/main.js b/playground/css-codesplit-cjs/main.js index 8c80df2c181511..4234674de9dee5 100644 --- a/playground/css-codesplit-cjs/main.js +++ b/playground/css-codesplit-cjs/main.js @@ -2,5 +2,5 @@ import './style.css' import './main.css' document.getElementById( - 'app' + 'app', ).innerHTML = `

This should be red

This should be blue

` diff --git a/playground/css-codesplit-cjs/vite.config.js b/playground/css-codesplit-cjs/vite.config.js index 85a7a0f07eff14..7646d17279e514 100644 --- a/playground/css-codesplit-cjs/vite.config.js +++ b/playground/css-codesplit-cjs/vite.config.js @@ -7,14 +7,14 @@ module.exports = { rollupOptions: { input: { main: resolve(__dirname, './index.html'), - other: resolve(__dirname, './other.js') + other: resolve(__dirname, './other.js'), }, treeshake: false, output: { format: 'cjs', freeze: false, - externalLiveBindings: false - } - } - } + externalLiveBindings: false, + }, + }, + }, } diff --git a/playground/css-codesplit/main.js b/playground/css-codesplit/main.js index eb6e703f79e718..6b9e3344c15033 100644 --- a/playground/css-codesplit/main.js +++ b/playground/css-codesplit/main.js @@ -9,7 +9,7 @@ import('./inline.css?inline').then((css) => { import('./mod.module.css').then((css) => { document.querySelector('.dynamic-module').textContent = JSON.stringify( - css.default + css.default, ) document.querySelector('.mod').classList.add(css.default.mod) }) diff --git a/playground/css-codesplit/vite.config.js b/playground/css-codesplit/vite.config.js index 0bc9cab5d025df..7f493850ff10d5 100644 --- a/playground/css-codesplit/vite.config.js +++ b/playground/css-codesplit/vite.config.js @@ -6,8 +6,8 @@ module.exports = { rollupOptions: { input: { main: resolve(__dirname, './index.html'), - other: resolve(__dirname, './other.js') - } - } - } + other: resolve(__dirname, './other.js'), + }, + }, + }, } diff --git a/playground/css-dynamic-import/__tests__/css-dynamic-import.spec.ts b/playground/css-dynamic-import/__tests__/css-dynamic-import.spec.ts index 0dbd34742d53df..c4c79291469050 100644 --- a/playground/css-dynamic-import/__tests__/css-dynamic-import.spec.ts +++ b/playground/css-dynamic-import/__tests__/css-dynamic-import.spec.ts @@ -5,7 +5,7 @@ import { getColor, isBuild, isServe, page, ports, rootDir } from '~utils' const baseOptions = [ { base: '', label: 'relative' }, - { base: '/', label: 'absolute' } + { base: '/', label: 'absolute' }, ] const getConfig = (base: string): InlineConfig => ({ @@ -13,7 +13,7 @@ const getConfig = (base: string): InlineConfig => ({ root: rootDir, logLevel: 'silent', preview: { port: ports['css/dynamic-import'] }, - build: { assetsInlineLimit: 0 } + build: { assetsInlineLimit: 0 }, }) async function withBuild(base: string, fn: () => Promise) { @@ -50,9 +50,9 @@ async function getLinks() { return handle.evaluate((link) => ({ pathname: new URL(link.href).pathname, rel: link.rel, - as: link.as + as: link.as, })) - }) + }), ) } @@ -68,37 +68,37 @@ baseOptions.forEach(({ base, label }) => { { pathname: expect.stringMatching(/^\/assets\/index-.+\.css$/), rel: 'stylesheet', - as: '' + as: '', }, { pathname: expect.stringMatching(/^\/assets\/dynamic-.+\.css$/), rel: 'preload', - as: 'style' + as: 'style', }, { pathname: expect.stringMatching(/^\/assets\/dynamic-.+\.js$/), rel: 'modulepreload', - as: 'script' + as: 'script', }, { pathname: expect.stringMatching(/^\/assets\/dynamic-.+\.css$/), rel: 'stylesheet', - as: '' + as: '', }, { pathname: expect.stringMatching(/^\/assets\/static-.+\.js$/), rel: 'modulepreload', - as: 'script' + as: 'script', }, { pathname: expect.stringMatching(/^\/assets\/index-.+\.js$/), rel: 'modulepreload', - as: 'script' - } + as: 'script', + }, ]) }) }, - { retry: 3 } + { retry: 3 }, ) test.runIf(isServe)( @@ -113,11 +113,11 @@ baseOptions.forEach(({ base, label }) => { { pathname: '/dynamic.css', rel: 'preload', - as: 'style' - } + as: 'style', + }, ]) }) }, - { retry: 3 } + { retry: 3 }, ) }) diff --git a/playground/css-dynamic-import/__tests__/serve.ts b/playground/css-dynamic-import/__tests__/serve.ts index ae33c33a5db107..48f55eee4f48ec 100644 --- a/playground/css-dynamic-import/__tests__/serve.ts +++ b/playground/css-dynamic-import/__tests__/serve.ts @@ -5,6 +5,6 @@ // function or a default server will be created export async function serve() { return { - close: () => Promise.resolve() + close: () => Promise.resolve(), } } diff --git a/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts b/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts index 4b2331e8836d4c..a6f89f8457dc96 100644 --- a/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts +++ b/playground/css-sourcemap/__tests__/css-sourcemap.spec.ts @@ -6,7 +6,7 @@ import { isBuild, isServe, page, - serverLogs + serverLogs, } from '~utils' test.runIf(isBuild)('should not output sourcemap warning (#4939)', () => { @@ -32,9 +32,9 @@ describe.runIf(isServe)('serve', () => { new URL('./linked.css', page.url()).href, { headers: { - accept: 'text/css' - } - } + accept: 'text/css', + }, + }, ) const css = await res.text() const map = extractSourcemap(css) @@ -60,9 +60,9 @@ describe.runIf(isServe)('serve', () => { new URL('./linked-with-import.css', page.url()).href, { headers: { - accept: 'text/css' - } - } + accept: 'text/css', + }, + }, ) const css = await res.text() const map = extractSourcemap(css) @@ -94,12 +94,12 @@ describe.runIf(isServe)('serve', () => { 'js .css request does not include sourcemap', async () => { const res = await page.request.get( - new URL('./linked-with-import.css', page.url()).href + new URL('./linked-with-import.css', page.url()).href, ) const content = await res.text() const lines = content.trim().split('\n') expect(lines[lines.length - 1]).not.toMatch(/^\/\/#/) - } + }, ) test('imported css', async () => { diff --git a/playground/css-sourcemap/vite.config.js b/playground/css-sourcemap/vite.config.js index 4fbeaa9a13aeb0..64067165873701 100644 --- a/playground/css-sourcemap/vite.config.js +++ b/playground/css-sourcemap/vite.config.js @@ -6,14 +6,14 @@ const MagicString = require('magic-string') module.exports = { resolve: { alias: { - '@': __dirname - } + '@': __dirname, + }, }, css: { devSourcemap: true, preprocessorOptions: { less: { - additionalData: '@color: red;' + additionalData: '@color: red;', }, styl: { additionalData: (content, filename) => { @@ -29,14 +29,14 @@ module.exports = { return { content: ms.toString(), - map + map, } - } - } - } + }, + }, + }, }, build: { - sourcemap: true + sourcemap: true, }, plugins: [ { @@ -46,7 +46,7 @@ module.exports = { if (req.url === '/virtual.html') { const t = await server.transformIndexHtml( '/virtual.html', - '

virtual html

' + '

virtual html

', ) res.setHeader('Content-Type', 'text/html') res.statusCode = 200 @@ -55,7 +55,7 @@ module.exports = { } next() }) - } - } - ] + }, + }, + ], } diff --git a/playground/css/__tests__/css.spec.ts b/playground/css/__tests__/css.spec.ts index 7f87c0b73aa606..77878820eab415 100644 --- a/playground/css/__tests__/css.spec.ts +++ b/playground/css/__tests__/css.spec.ts @@ -11,7 +11,7 @@ import { serverLogs, untilUpdated, viteTestUrl, - withRetry + withRetry, } from '~utils' // note: tests should retrieve the element at the beginning of test and reuse it @@ -42,7 +42,7 @@ test('linked css', async () => { await untilUpdated(() => getColor(linked), 'red') editFile('linked-at-import.css', (code) => - code.replace('color: red', 'color: blue') + code.replace('color: red', 'color: blue'), ) await untilUpdated(() => getColor(atImport), 'blue') }) @@ -58,7 +58,7 @@ test('css import from js', async () => { await untilUpdated(() => getColor(imported), 'red') editFile('imported-at-import.css', (code) => - code.replace('color: purple', 'color: blue') + code.replace('color: purple', 'color: blue'), ) await untilUpdated(() => getColor(atImport), 'blue') }) @@ -89,25 +89,25 @@ test('sass', async () => { expect(await getBg(atImport)).toMatch(isBuild ? /base64/ : '/nested/icon.png') expect(await getColor(atImportAlias)).toBe('olive') expect(await getBg(atImportAlias)).toMatch( - isBuild ? /base64/ : '/nested/icon.png' + isBuild ? /base64/ : '/nested/icon.png', ) expect(await getBg(urlStartsWithVariable)).toMatch( - isBuild ? /ok-\w+\.png/ : `${viteTestUrl}/ok.png` + isBuild ? /ok-\w+\.png/ : `${viteTestUrl}/ok.png`, ) expect(await getColor(partialImport)).toBe('orchid') editFile('sass.scss', (code) => - code.replace('color: $injectedColor', 'color: red') + code.replace('color: $injectedColor', 'color: red'), ) await untilUpdated(() => getColor(imported), 'red') editFile('nested/_index.scss', (code) => - code.replace('color: olive', 'color: blue') + code.replace('color: olive', 'color: blue'), ) await untilUpdated(() => getColor(atImport), 'blue') editFile('nested/_partial.scss', (code) => - code.replace('color: orchid', 'color: green') + code.replace('color: orchid', 'color: green'), ) await untilUpdated(() => getColor(partialImport), 'green') }) @@ -123,17 +123,17 @@ test('less', async () => { expect(await getBg(atImport)).toMatch(isBuild ? /base64/ : '/nested/icon.png') expect(await getColor(atImportAlias)).toBe('darkslateblue') expect(await getBg(atImportAlias)).toMatch( - isBuild ? /base64/ : '/nested/icon.png' + isBuild ? /base64/ : '/nested/icon.png', ) expect(await getBg(urlStartsWithVariable)).toMatch( - isBuild ? /ok-\w+\.png/ : `${viteTestUrl}/ok.png` + isBuild ? /ok-\w+\.png/ : `${viteTestUrl}/ok.png`, ) editFile('less.less', (code) => code.replace('@color: blue', '@color: red')) await untilUpdated(() => getColor(imported), 'red') editFile('nested/nested.less', (code) => - code.replace('color: darkslateblue', 'color: blue') + code.replace('color: darkslateblue', 'color: blue'), ) await untilUpdated(() => getColor(atImport), 'blue') }) @@ -151,18 +151,18 @@ test('stylus', async () => { expect(await getColor(relativeImport)).toBe('darkslateblue') expect(await getColor(relativeImportAlias)).toBe('darkslateblue') expect(await getBg(relativeImportAlias)).toMatch( - isBuild ? /base64/ : '/nested/icon.png' + isBuild ? /base64/ : '/nested/icon.png', ) expect(await getColor(optionsRelativeImport)).toBe('green') expect(await getColor(optionsAbsoluteImport)).toBe('red') editFile('stylus.styl', (code) => - code.replace('$color ?= blue', '$color ?= red') + code.replace('$color ?= blue', '$color ?= red'), ) await untilUpdated(() => getColor(imported), 'red') editFile('nested/nested.styl', (code) => - code.replace('color: darkslateblue', 'color: blue') + code.replace('color: darkslateblue', 'color: blue'), ) await untilUpdated(() => getColor(relativeImport), 'blue') }) @@ -174,11 +174,11 @@ test('css modules', async () => { // check if the generated CSS module class name is indeed using the // format specified in vite.config.js expect(await imported.getAttribute('class')).toMatch( - /.mod-module__apply-color___[\w-]{5}/ + /.mod-module__apply-color___[\w-]{5}/, ) editFile('mod.module.css', (code) => - code.replace('color: turquoise', 'color: red') + code.replace('color: turquoise', 'color: red'), ) await untilUpdated(() => getColor(imported), 'red') }) @@ -190,11 +190,11 @@ test('css modules composes/from path resolving', async () => { // check if the generated CSS module class name is indeed using the // format specified in vite.config.js expect(await imported.getAttribute('class')).toMatch( - /.composed-module__apply-color___[\w-]{5}/ + /.composed-module__apply-color___[\w-]{5}/, ) expect(await imported.getAttribute('class')).toMatch( - /.composes-path-resolving-module__path-resolving-css___[\w-]{5}/ + /.composes-path-resolving-module__path-resolving-css___[\w-]{5}/, ) // @todo HMR is not working on this situation. @@ -211,11 +211,11 @@ test('sass modules composes/from path resolving', async () => { // check if the generated CSS module class name is indeed using the // format specified in vite.config.js expect(await imported.getAttribute('class')).toMatch( - /.composed-module__apply-color___[\w-]{5}/ + /.composed-module__apply-color___[\w-]{5}/, ) expect(await imported.getAttribute('class')).toMatch( - /.composes-path-resolving-module__path-resolving-sass___[\w-]{5}/ + /.composes-path-resolving-module__path-resolving-sass___[\w-]{5}/, ) // @todo HMR is not working on this situation. @@ -232,11 +232,11 @@ test('less modules composes/from path resolving', async () => { // check if the generated CSS module class name is indeed using the // format specified in vite.config.js expect(await imported.getAttribute('class')).toMatch( - /.composed-module__apply-color___[\w-]{5}/ + /.composed-module__apply-color___[\w-]{5}/, ) expect(await imported.getAttribute('class')).toMatch( - /.composes-path-resolving-module__path-resolving-less___[\w-]{5}/ + /.composes-path-resolving-module__path-resolving-less___[\w-]{5}/, ) // @todo HMR is not working on this situation. @@ -250,11 +250,11 @@ test('css modules w/ sass', async () => { const imported = await page.$('.modules-sass') expect(await getColor(imported)).toBe('orangered') expect(await imported.getAttribute('class')).toMatch( - /.mod-module__apply-color___[\w-]{5}/ + /.mod-module__apply-color___[\w-]{5}/, ) editFile('mod.module.scss', (code) => - code.replace('color: orangered', 'color: blue') + code.replace('color: orangered', 'color: blue'), ) await untilUpdated(() => getColor(imported), 'blue') }) @@ -314,7 +314,7 @@ test('treeshaken async chunk', async () => { expect( await page.evaluate(() => { return document.querySelector('.async-treeshaken') - }) + }), ).toBeNull() // assert that the css is not present anywhere expect(findAssetFile(/\.css$/)).not.toMatch('plum') @@ -326,7 +326,7 @@ test('treeshaken async chunk', async () => { // should be present in dev const el = await page.$('.async-treeshaken') editFile('async-treeshaken.css', (code) => - code.replace('color: plum', 'color: blue') + code.replace('color: plum', 'color: blue'), ) await untilUpdated(() => getColor(el), 'blue') } @@ -343,19 +343,19 @@ test('PostCSS dir-dependency', async () => { if (!isBuild) { editFile('glob-dep/foo.css', (code) => - code.replace('color: grey', 'color: blue') + code.replace('color: grey', 'color: blue'), ) await untilUpdated(() => getColor(el1), 'blue') expect(await getColor(el2)).toBe('grey') editFile('glob-dep/bar.css', (code) => - code.replace('color: grey', 'color: red') + code.replace('color: grey', 'color: red'), ) await untilUpdated(() => getColor(el2), 'red') expect(await getColor(el1)).toBe('blue') editFile('glob-dep/nested (dir)/baz.css', (code) => - code.replace('color: grey', 'color: green') + code.replace('color: grey', 'color: green'), ) await untilUpdated(() => getColor(el3), 'green') expect(await getColor(el1)).toBe('blue') @@ -379,8 +379,9 @@ test('URL separation', async () => { .fill('') .flatMap((_, i) => [',', ' ,', ', ', ' , '].map( - (sep) => `background-image:${new Array(i + 1).fill(baseUrl).join(sep)};` - ) + (sep) => + `background-image:${new Array(i + 1).fill(baseUrl).join(sep)};`, + ), ) // Insert the base case @@ -391,7 +392,7 @@ test('URL separation', async () => { if (i > 0) editFile('imported.css', (code) => code.replace(cases[i - 1], c)) expect(await getBg(urlSeparated)).toMatch( - /^url\(.+\)(?:\s*,\s*url\(.+\))*$/ + /^url\(.+\)(?:\s*,\s*url\(.+\))*$/, ) } }) @@ -427,7 +428,7 @@ test('?raw', async () => { const rawImportCss = await page.$('.raw-imported-css') expect(await rawImportCss.textContent()).toBe( - readFileSync(require.resolve('../raw-imported.css'), 'utf-8') + readFileSync(require.resolve('../raw-imported.css'), 'utf-8'), ) }) @@ -440,7 +441,7 @@ test("relative path rewritten in Less's data-uri", async () => { // relative path passed to Less's data-uri is rewritten to absolute, // the Less inlines it expect(await getBg('.form-box-data-uri')).toMatch( - /^url\("data:image\/svg\+xml,%3Csvg/ + /^url\("data:image\/svg\+xml,%3Csvg/, ) }) @@ -450,7 +451,7 @@ test('PostCSS source.input.from includes query', async () => { expect(code).toContain( isBuild ? '/postcss-source-input.css?used&query=foo' - : '/postcss-source-input.css?query=foo' + : '/postcss-source-input.css?query=foo', ) }) @@ -478,14 +479,14 @@ test('sugarss', async () => { expect(await getBg(atImport)).toMatch(isBuild ? /base64/ : '/nested/icon.png') expect(await getColor(atImportAlias)).toBe('darkslateblue') expect(await getBg(atImportAlias)).toMatch( - isBuild ? /base64/ : '/nested/icon.png' + isBuild ? /base64/ : '/nested/icon.png', ) editFile('sugarss.sss', (code) => code.replace('color: blue', 'color: coral')) await untilUpdated(() => getColor(imported), 'coral') editFile('nested/nested.sss', (code) => - code.replace('color: darkslateblue', 'color: blue') + code.replace('color: darkslateblue', 'color: blue'), ) await untilUpdated(() => getColor(atImport), 'blue') }) diff --git a/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts b/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts index fabf24da3dae99..f897d0fad2e234 100644 --- a/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts +++ b/playground/css/__tests__/postcss-plugins-different-dir/postcss-plugins-different-dir.spec.ts @@ -11,12 +11,12 @@ test('postcss plugins in different dir', async () => { logLevel: 'silent', server: { port, - strictPort: true + strictPort: true, }, build: { // skip transpilation during tests to make it faster - target: 'esnext' - } + target: 'esnext', + }, }) await server.listen() try { diff --git a/playground/css/__tests__/postcss-plugins-different-dir/serve.ts b/playground/css/__tests__/postcss-plugins-different-dir/serve.ts index 16e7d655f5ec15..195bb47d8520c7 100644 --- a/playground/css/__tests__/postcss-plugins-different-dir/serve.ts +++ b/playground/css/__tests__/postcss-plugins-different-dir/serve.ts @@ -5,6 +5,6 @@ // function or a default server will be created export async function serve(): Promise<{ close(): Promise }> { return { - close: () => Promise.resolve() + close: () => Promise.resolve(), } } diff --git a/playground/css/main.js b/playground/css/main.js index 8af0e8355db719..5a2b726c1b7e92 100644 --- a/playground/css/main.js +++ b/playground/css/main.js @@ -31,7 +31,7 @@ document .classList.add(...composesPathResolvingMod['path-resolving-less'].split(' ')) text( '.path-resolved-modules-code', - JSON.stringify(composesPathResolvingMod, null, 2) + JSON.stringify(composesPathResolvingMod, null, 2), ) import inlineMod from './inline.module.css?inline' @@ -85,7 +85,7 @@ text('.inlined-code', inlined) // glob const glob = import.meta.glob('./glob-import/*.css', { query: '?inline' }) Promise.all( - Object.keys(glob).map((key) => glob[key]().then((i) => i.default)) + Object.keys(glob).map((key) => glob[key]().then((i) => i.default)), ).then((res) => { text('.imported-css-glob', JSON.stringify(res, null, 2)) }) @@ -93,7 +93,7 @@ Promise.all( // globEager const globEager = import.meta.glob('./glob-import/*.css', { eager: true, - query: '?inline' + query: '?inline', }) text('.imported-css-globEager', JSON.stringify(globEager, null, 2)) diff --git a/playground/css/postcss-caching/blue-app/postcss.config.js b/playground/css/postcss-caching/blue-app/postcss.config.js index 2506cd535feef7..50764f3ff8f21a 100644 --- a/playground/css/postcss-caching/blue-app/postcss.config.js +++ b/playground/css/postcss-caching/blue-app/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { - plugins: [replacePinkWithBlue] + plugins: [replacePinkWithBlue], } function replacePinkWithBlue() { @@ -9,7 +9,7 @@ function replacePinkWithBlue() { if (decl.value === 'pink') { decl.value = 'blue' } - } + }, } } replacePinkWithBlue.postcss = true diff --git a/playground/css/postcss-caching/css.spec.ts b/playground/css/postcss-caching/css.spec.ts index c32bf6b6251d2d..101b9691bef45f 100644 --- a/playground/css/postcss-caching/css.spec.ts +++ b/playground/css/postcss-caching/css.spec.ts @@ -11,12 +11,12 @@ test('postcss config', async () => { logLevel: 'silent', server: { port, - strictPort: true + strictPort: true, }, build: { // skip transpilation during tests to make it faster - target: 'esnext' - } + target: 'esnext', + }, }) await server.listen() return server diff --git a/playground/css/postcss-caching/green-app/postcss.config.js b/playground/css/postcss-caching/green-app/postcss.config.js index 1367dfc1d27c7b..7d9d8818540e09 100644 --- a/playground/css/postcss-caching/green-app/postcss.config.js +++ b/playground/css/postcss-caching/green-app/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { - plugins: [replacePinkWithGreen] + plugins: [replacePinkWithGreen], } function replacePinkWithGreen() { @@ -9,7 +9,7 @@ function replacePinkWithGreen() { if (decl.value === 'pink') { decl.value = 'green' } - } + }, } } replacePinkWithGreen.postcss = true diff --git a/playground/css/postcss-caching/serve.ts b/playground/css/postcss-caching/serve.ts index 16e7d655f5ec15..195bb47d8520c7 100644 --- a/playground/css/postcss-caching/serve.ts +++ b/playground/css/postcss-caching/serve.ts @@ -5,6 +5,6 @@ // function or a default server will be created export async function serve(): Promise<{ close(): Promise }> { return { - close: () => Promise.resolve() + close: () => Promise.resolve(), } } diff --git a/playground/css/postcss.config.js b/playground/css/postcss.config.js index a9bbd0f2b4e09e..955878ac216f53 100644 --- a/playground/css/postcss.config.js +++ b/playground/css/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { - plugins: [require('postcss-nested'), testDirDep, testSourceInput] + plugins: [require('postcss-nested'), testDirDep, testSourceInput], } const fs = require('node:fs') @@ -16,7 +16,7 @@ function testDirDep() { AtRule(atRule, { result, Comment }) { if (atRule.name === 'test') { const pattern = normalizePath( - path.resolve(path.dirname(result.opts.from), './glob-dep/**/*.css') + path.resolve(path.dirname(result.opts.from), './glob-dep/**/*.css'), ) const files = glob.sync(pattern) const text = files.map((f) => fs.readFileSync(f, 'utf-8')).join('\n') @@ -28,7 +28,7 @@ function testDirDep() { plugin: 'dir-dep', dir: './glob-dep', glob: '*.css', - parent: result.opts.from + parent: result.opts.from, }) result.messages.push({ @@ -36,10 +36,10 @@ function testDirDep() { plugin: 'dir-dep', dir: './glob-dep/nested (dir)', // includes special characters in glob glob: '*.css', - parent: result.opts.from + parent: result.opts.from, }) } - } + }, } } testDirDep.postcss = true @@ -51,12 +51,12 @@ function testSourceInput() { if (atRule.name === 'source-input') { atRule.after( `.source-input::before { content: ${JSON.stringify( - atRule.source.input.from - )}; }` + atRule.source.input.from, + )}; }`, ) atRule.remove() } - } + }, } } testSourceInput.postcss = true diff --git a/playground/css/vite.config-relative-base.js b/playground/css/vite.config-relative-base.js index 7b54a149bcd987..7edbaf07c95c29 100644 --- a/playground/css/vite.config-relative-base.js +++ b/playground/css/vite.config-relative-base.js @@ -16,11 +16,11 @@ module.exports = { output: { entryFileNames: 'entries/[name].js', chunkFileNames: 'chunks/[name]-[hash].js', - assetFileNames: 'other-assets/[name]-[hash][extname]' - } - } + assetFileNames: 'other-assets/[name]-[hash][extname]', + }, + }, }, testConfig: { - baseRoute: '/relative-base/' - } + baseRoute: '/relative-base/', + }, } diff --git a/playground/css/vite.config.js b/playground/css/vite.config.js index 2435f7c0772bcd..489752655c828f 100644 --- a/playground/css/vite.config.js +++ b/playground/css/vite.config.js @@ -10,24 +10,24 @@ globalThis.location = new URL('http://localhost/') */ module.exports = { build: { - cssTarget: 'chrome61' + cssTarget: 'chrome61', }, esbuild: { logOverride: { - 'unsupported-css-property': 'silent' - } + 'unsupported-css-property': 'silent', + }, }, resolve: { alias: { '=': __dirname, spacefolder: __dirname + '/folder with space', '#alias': __dirname + '/aliased/foo.css', - '#alias-module': __dirname + '/aliased/bar.module.css' - } + '#alias-module': __dirname + '/aliased/bar.module.css', + }, }, css: { modules: { - generateScopedName: '[name]__[local]___[hash:base64:5]' + generateScopedName: '[name]__[local]___[hash:base64:5]', // example of how getJSON can be used to generate // typescript typings for css modules class names @@ -56,16 +56,16 @@ module.exports = { }, function (url) { return url.endsWith('.wxss') ? { contents: '' } : null - } - ] + }, + ], }, styl: { additionalData: `$injectedColor ?= orange`, imports: [ './options/relative-import.styl', - path.join(__dirname, 'options/absolute-import.styl') - ] - } - } - } + path.join(__dirname, 'options/absolute-import.styl'), + ], + }, + }, + }, } diff --git a/playground/define/__tests__/define.spec.ts b/playground/define/__tests__/define.spec.ts index 8c27686bce1703..7b1e306d973341 100644 --- a/playground/define/__tests__/define.spec.ts +++ b/playground/define/__tests__/define.spec.ts @@ -6,35 +6,35 @@ test('string', async () => { const defines = viteConfig.define expect(await page.textContent('.exp')).toBe( - String(typeof eval(defines.__EXP__)) + String(typeof eval(defines.__EXP__)), ) expect(await page.textContent('.string')).toBe(JSON.parse(defines.__STRING__)) expect(await page.textContent('.number')).toBe(String(defines.__NUMBER__)) expect(await page.textContent('.boolean')).toBe(String(defines.__BOOLEAN__)) expect(await page.textContent('.object')).toBe( - JSON.stringify(defines.__OBJ__, null, 2) + JSON.stringify(defines.__OBJ__, null, 2), ) expect(await page.textContent('.process-node-env')).toBe( - JSON.parse(defines['process.env.NODE_ENV']) + JSON.parse(defines['process.env.NODE_ENV']), ) expect(await page.textContent('.env-var')).toBe( - JSON.parse(defines['process.env.SOMEVAR']) + JSON.parse(defines['process.env.SOMEVAR']), ) expect(await page.textContent('.process-as-property')).toBe( - defines.__OBJ__.process.env.SOMEVAR + defines.__OBJ__.process.env.SOMEVAR, ) expect(await page.textContent('.spread-object')).toBe( - JSON.stringify({ SOMEVAR: defines['process.env.SOMEVAR'] }) + JSON.stringify({ SOMEVAR: defines['process.env.SOMEVAR'] }), ) expect(await page.textContent('.spread-array')).toBe( - JSON.stringify([...defines.__STRING__]) + JSON.stringify([...defines.__STRING__]), ) expect(await page.textContent('.dollar-identifier')).toBe( - String(defines.$DOLLAR) + String(defines.$DOLLAR), ) expect(await page.textContent('.unicode-identifier')).toBe( - String(defines.ÖUNICODE_LETTERɵ) + String(defines.ÖUNICODE_LETTERɵ), ) expect(await page.textContent('.no-identifier-substring')).toBe(String(true)) expect(await page.textContent('.no-property')).toBe(String(true)) @@ -42,12 +42,12 @@ test('string', async () => { expect(await page.textContent('.exp-define')).toBe('__EXP__') expect(await page.textContent('.import-json')).toBe('__EXP__') expect(await page.textContent('.define-in-dep')).toBe( - defines.__STRINGIFIED_OBJ__ + defines.__STRINGIFIED_OBJ__, ) expect(await page.textContent('.import-meta-env-undefined')).toBe( - isBuild ? '({}).UNDEFINED' : 'import.meta.env.UNDEFINED' + isBuild ? '({}).UNDEFINED' : 'import.meta.env.UNDEFINED', ) expect(await page.textContent('.process-env-undefined')).toBe( - isBuild ? '({}).UNDEFINED' : 'process.env.UNDEFINED' + isBuild ? '({}).UNDEFINED' : 'process.env.UNDEFINED', ) }) diff --git a/playground/define/commonjs-dep/index.js b/playground/define/commonjs-dep/index.js index 9be5641e04b844..ba630bf28ff6d5 100644 --- a/playground/define/commonjs-dep/index.js +++ b/playground/define/commonjs-dep/index.js @@ -1,5 +1,5 @@ module.exports = { defined: __STRINGIFIED_OBJ__, importMetaEnvUndefined: 'import.meta.env.UNDEFINED', - processEnvUndefined: 'process.env.UNDEFINED' + processEnvUndefined: 'process.env.UNDEFINED', } diff --git a/playground/define/index.html b/playground/define/index.html index 06b2f4f9479d38..7d81d42d8966a1 100644 --- a/playground/define/index.html +++ b/playground/define/index.html @@ -35,8 +35,8 @@

Define

text( '.spread-object', JSON.stringify({ - ...(process.env.SOMEVAR ? { SOMEVAR: `"${process.env.SOMEVAR}"` } : {}) - }) + ...(process.env.SOMEVAR ? { SOMEVAR: `"${process.env.SOMEVAR}"` } : {}), + }), ) text('.spread-array', JSON.stringify([...`"${__STRING__}"`])) text('.dollar-identifier', $DOLLAR) diff --git a/playground/define/vite.config.js b/playground/define/vite.config.js index 7650603e046419..41cb419d03b38f 100644 --- a/playground/define/vite.config.js +++ b/playground/define/vite.config.js @@ -7,19 +7,19 @@ module.exports = { __OBJ__: { foo: 1, bar: { - baz: 2 + baz: 2, }, process: { env: { - SOMEVAR: '"PROCESS MAY BE PROPERTY"' - } - } + SOMEVAR: '"PROCESS MAY BE PROPERTY"', + }, + }, }, 'process.env.NODE_ENV': '"dev"', 'process.env.SOMEVAR': '"SOMEVAR"', $DOLLAR: 456, ÖUNICODE_LETTERɵ: 789, __VAR_NAME__: false, - __STRINGIFIED_OBJ__: JSON.stringify({ foo: true }) - } + __STRINGIFIED_OBJ__: JSON.stringify({ foo: true }), + }, } diff --git a/playground/dynamic-import/__tests__/dynamic-import.spec.ts b/playground/dynamic-import/__tests__/dynamic-import.spec.ts index 8b599462470d18..6748c9078ec627 100644 --- a/playground/dynamic-import/__tests__/dynamic-import.spec.ts +++ b/playground/dynamic-import/__tests__/dynamic-import.spec.ts @@ -11,7 +11,7 @@ test('should load full dynamic import from public', async () => { await untilUpdated(() => page.textContent('.view'), 'Qux view', true) // No warning should be logged as we are using @vite-ignore expect( - serverLogs.some((log) => log.includes('cannot be analyzed by vite')) + serverLogs.some((log) => log.includes('cannot be analyzed by vite')), ).toBe(false) }) @@ -57,7 +57,7 @@ test('should load dynamic import with css', async () => { await untilUpdated( () => page.$eval('.view', (node) => window.getComputedStyle(node).color), 'rgb(255, 0, 0)', - true + true, ) }) @@ -65,7 +65,7 @@ test('should load dynamic import with vars', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars'), 'hello', - true + true, ) }) @@ -73,7 +73,7 @@ test('should load dynamic import with vars multiline', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars'), 'hello', - true + true, ) }) @@ -81,7 +81,7 @@ test('should load dynamic import with vars alias', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars-alias'), 'hi', - true + true, ) }) @@ -89,7 +89,7 @@ test('should load dynamic import with vars raw', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars-raw'), 'export function hello()', - true + true, ) }) @@ -97,7 +97,7 @@ test('should load dynamic import with vars url', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars-url'), isBuild ? 'data:application/javascript' : '/alias/url.js', - true + true, ) }) @@ -105,7 +105,7 @@ test('should load dynamic import with vars worker', async () => { await untilUpdated( () => page.textContent('.dynamic-import-with-vars-worker'), 'load worker', - true + true, ) }) @@ -118,7 +118,7 @@ test('should work with load ../ and itself directory', async () => { await untilUpdated( () => page.textContent('.dynamic-import-self'), 'dynamic-import-self-content', - true + true, ) }) @@ -126,6 +126,6 @@ test('should work with load ../ and contain itself directory', async () => { await untilUpdated( () => page.textContent('.dynamic-import-nested-self'), 'dynamic-import-nested-self-content', - true + true, ) }) diff --git a/playground/dynamic-import/alias/worker.js b/playground/dynamic-import/alias/worker.js index 6206a6536b8064..2a8fc242aab315 100644 --- a/playground/dynamic-import/alias/worker.js +++ b/playground/dynamic-import/alias/worker.js @@ -1,5 +1,5 @@ self.onmessage = (event) => { self.postMessage({ - msg: 'load worker' + msg: 'load worker', }) } diff --git a/playground/dynamic-import/nested/index.js b/playground/dynamic-import/nested/index.js index dc4992abc85021..054801f451a85f 100644 --- a/playground/dynamic-import/nested/index.js +++ b/playground/dynamic-import/nested/index.js @@ -57,7 +57,7 @@ document.querySelector('.issue-2658-1').addEventListener('click', async () => { // data URLs (`data:`) const code2 = 'export const msg = "data";' const dataURL = `data:text/javascript;charset=utf-8,${encodeURIComponent( - code2 + code2, )}` document.querySelector('.issue-2658-2').addEventListener('click', async () => { const { msg } = await import(/*@vite-ignore*/ dataURL) diff --git a/playground/dynamic-import/vite.config.js b/playground/dynamic-import/vite.config.js index f3b7cb1dd049ce..f9f231a1a335cb 100644 --- a/playground/dynamic-import/vite.config.js +++ b/playground/dynamic-import/vite.config.js @@ -11,25 +11,25 @@ module.exports = vite.defineConfig({ fs.mkdirSync(path.resolve(__dirname, 'dist/files')) fs.copyFileSync( path.resolve(__dirname, 'views/qux.js'), - path.resolve(__dirname, 'dist/views/qux.js') + path.resolve(__dirname, 'dist/views/qux.js'), ) fs.copyFileSync( path.resolve(__dirname, 'files/mxd.js'), - path.resolve(__dirname, 'dist/files/mxd.js') + path.resolve(__dirname, 'dist/files/mxd.js'), ) fs.copyFileSync( path.resolve(__dirname, 'files/mxd.json'), - path.resolve(__dirname, 'dist/files/mxd.json') + path.resolve(__dirname, 'dist/files/mxd.json'), ) - } - } + }, + }, ], resolve: { alias: { - '@': path.resolve(__dirname, 'alias') - } + '@': path.resolve(__dirname, 'alias'), + }, }, build: { - sourcemap: true - } + sourcemap: true, + }, }) diff --git a/playground/env-nested/vite.config.js b/playground/env-nested/vite.config.js index 0e46100698650d..8f85449e41e4de 100644 --- a/playground/env-nested/vite.config.js +++ b/playground/env-nested/vite.config.js @@ -1,5 +1,5 @@ const { defineConfig } = require('vite') module.exports = defineConfig({ - envDir: './envs' + envDir: './envs', }) diff --git a/playground/env/__tests__/env.spec.ts b/playground/env/__tests__/env.spec.ts index ee05fff1d3736c..227f6b5c09ccfe 100644 --- a/playground/env/__tests__/env.spec.ts +++ b/playground/env/__tests__/env.spec.ts @@ -33,7 +33,7 @@ test('mode file override', async () => { test('inline variables', async () => { expect(await page.textContent('.inline')).toBe( - isBuild ? `inline-build` : `inline-serve` + isBuild ? `inline-build` : `inline-serve`, ) }) @@ -58,7 +58,7 @@ test('env object', async () => { BASE_URL: '/env/', MODE: mode, DEV: !isBuild, - PROD: isBuild + PROD: isBuild, }) }) diff --git a/playground/env/vite.config.js b/playground/env/vite.config.js index 51be87cbec43f5..3b2d5e3e7674ab 100644 --- a/playground/env/vite.config.js +++ b/playground/env/vite.config.js @@ -6,9 +6,9 @@ module.exports = defineConfig({ base: '/env/', envPrefix: ['VITE_', 'CUSTOM_PREFIX_'], build: { - outDir: 'dist/env' + outDir: 'dist/env', }, define: { - 'import.meta.env.VITE_BOOL': true - } + 'import.meta.env.VITE_BOOL': true, + }, }) diff --git a/playground/extensions/vite.config.js b/playground/extensions/vite.config.js index 53c744b71d3637..4ed3195b219bff 100644 --- a/playground/extensions/vite.config.js +++ b/playground/extensions/vite.config.js @@ -1,6 +1,6 @@ module.exports = { resolve: { alias: [{ find: 'vue', replacement: 'vue/dist/vue.esm-bundler.js' }], - extensions: ['.js'] - } + extensions: ['.js'], + }, } diff --git a/playground/external/__tests__/external.spec.ts b/playground/external/__tests__/external.spec.ts index 7504b6ae1c293c..30f87291fd31a1 100644 --- a/playground/external/__tests__/external.spec.ts +++ b/playground/external/__tests__/external.spec.ts @@ -3,7 +3,7 @@ import { browserLogs, isBuild, page } from '~utils' test('importmap', () => { expect(browserLogs).not.toContain( - 'An import map is added after module script load was triggered.' + 'An import map is added after module script load was triggered.', ) }) diff --git a/playground/external/vite.config.js b/playground/external/vite.config.js index 1e38f9f65a18b5..14259ecde860b0 100644 --- a/playground/external/vite.config.js +++ b/playground/external/vite.config.js @@ -3,15 +3,15 @@ import { defineConfig } from 'vite' export default defineConfig({ optimizeDeps: { include: ['dep-that-imports', 'dep-that-requires'], - exclude: ['vue', 'slash5'] + exclude: ['vue', 'slash5'], }, build: { minify: false, rollupOptions: { - external: ['vue', 'slash3', 'slash5'] + external: ['vue', 'slash3', 'slash5'], }, commonjsOptions: { - esmExternals: ['vue', 'slash5'] - } - } + esmExternals: ['vue', 'slash5'], + }, + }, }) diff --git a/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts b/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts index 943cabb35da2c2..90887f93461770 100644 --- a/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts +++ b/playground/file-delete-restore/__tests__/file-delete-restore.spec.ts @@ -5,7 +5,7 @@ import { isBuild, page, removeFile, - untilUpdated + untilUpdated, } from '~utils' test.runIf(isBuild)( @@ -14,7 +14,7 @@ test.runIf(isBuild)( await untilUpdated(() => page.textContent('p'), 'Child state 1') editFile('Child.jsx', (code) => - code.replace('Child state 1', 'Child state 2') + code.replace('Child state 1', 'Child state 2'), ) await untilUpdated(() => page.textContent('p'), 'Child state 2') @@ -22,7 +22,7 @@ test.runIf(isBuild)( editFile('App.jsx', (code) => code .replace(`import Child from './Child'`, '') - .replace(``, '

Child deleted

') + .replace(``, '

Child deleted

'), ) removeFile('Child.jsx') await untilUpdated(() => page.textContent('p'), 'Child deleted') @@ -33,7 +33,7 @@ test.runIf(isBuild)( ` export default function Child() { return

Child state 1

} - ` + `, ) // restore App.jsx @@ -52,9 +52,9 @@ test.runIf(isBuild)( } export default App - ` + `, ) await untilUpdated(() => page.textContent('p'), 'Child state 1') - } + }, ) diff --git a/playground/file-delete-restore/index.html b/playground/file-delete-restore/index.html index f0015ceb9829a3..7417c442dfbf36 100644 --- a/playground/file-delete-restore/index.html +++ b/playground/file-delete-restore/index.html @@ -5,6 +5,6 @@ import App from './App.jsx' ReactDOM.createRoot(document.getElementById('app')).render( - React.createElement(App) + React.createElement(App), ) diff --git a/playground/file-delete-restore/vite.config.js b/playground/file-delete-restore/vite.config.js index 51cb5c54bd6821..d47f7cfc6704c5 100644 --- a/playground/file-delete-restore/vite.config.js +++ b/playground/file-delete-restore/vite.config.js @@ -7,6 +7,6 @@ module.exports = { plugins: [react()], build: { // to make tests faster - minify: false - } + minify: false, + }, } diff --git a/playground/fs-serve/__tests__/fs-serve.spec.ts b/playground/fs-serve/__tests__/fs-serve.spec.ts index 90d35d21b04773..eb3475f565b773 100644 --- a/playground/fs-serve/__tests__/fs-serve.spec.ts +++ b/playground/fs-serve/__tests__/fs-serve.spec.ts @@ -30,10 +30,10 @@ describe.runIf(isServe)('main', () => { test('safe fetch with special characters', async () => { expect( - await page.textContent('.safe-fetch-subdir-special-characters') + await page.textContent('.safe-fetch-subdir-special-characters'), ).toMatch('KEY=safe') expect( - await page.textContent('.safe-fetch-subdir-special-characters-status') + await page.textContent('.safe-fetch-subdir-special-characters-status'), ).toBe('200') }) @@ -44,7 +44,7 @@ describe.runIf(isServe)('main', () => { test('unsafe fetch with special characters (#8498)', async () => { expect(await page.textContent('.unsafe-fetch-8498')).toMatch( - '403 Restricted' + '403 Restricted', ) expect(await page.textContent('.unsafe-fetch-8498-status')).toBe('403') }) @@ -66,7 +66,7 @@ describe.runIf(isServe)('main', () => { test('safe fs fetch with special characters', async () => { expect(await page.textContent('.safe-fs-fetch-special-characters')).toBe( - stringified + stringified, ) expect(await page.textContent('.safe-fs-fetch-status')).toBe('200') }) diff --git a/playground/fs-serve/root/src/index.html b/playground/fs-serve/root/src/index.html index 95b31e73d72ea6..9e9cfe501d10fe 100644 --- a/playground/fs-serve/root/src/index.html +++ b/playground/fs-serve/root/src/index.html @@ -177,7 +177,7 @@

Denied

// outside root with special characters 2 #8498 fetch( - '/@fs/' + ROOT + '/root/src/%252e%252e%252f%252e%252e%252funsafe%252ejson' + '/@fs/' + ROOT + '/root/src/%252e%252e%252f%252e%252e%252funsafe%252ejson', ) .then((r) => { text('.unsafe-fs-fetch-8498-2-status', r.status) @@ -191,7 +191,7 @@

Denied

fetch( '/@fs/' + ROOT + - '/root/src/special%20characters%20%C3%A5%C3%A4%C3%B6/safe.json' + '/root/src/special%20characters%20%C3%A5%C3%A4%C3%B6/safe.json', ) .then((r) => { text('.safe-fs-fetch-special-characters-status', r.status) diff --git a/playground/fs-serve/root/vite.config.js b/playground/fs-serve/root/vite.config.js index 12d07754cbf10d..ca7fefd0108870 100644 --- a/playground/fs-serve/root/vite.config.js +++ b/playground/fs-serve/root/vite.config.js @@ -7,28 +7,28 @@ module.exports = { build: { rollupOptions: { input: { - main: path.resolve(__dirname, 'src/index.html') - } - } + main: path.resolve(__dirname, 'src/index.html'), + }, + }, }, server: { fs: { strict: true, - allow: [path.resolve(__dirname, 'src')] + allow: [path.resolve(__dirname, 'src')], }, hmr: { - overlay: false + overlay: false, }, headers: { - 'x-served-by': 'vite' - } + 'x-served-by': 'vite', + }, }, preview: { headers: { - 'x-served-by': 'vite' - } + 'x-served-by': 'vite', + }, }, define: { - ROOT: JSON.stringify(path.dirname(__dirname).replace(/\\/g, '/')) - } + ROOT: JSON.stringify(path.dirname(__dirname).replace(/\\/g, '/')), + }, } diff --git a/playground/glob-import/__tests__/glob-import.spec.ts b/playground/glob-import/__tests__/glob-import.spec.ts index 9a10b2b7bf6892..34b77127cdb1e0 100644 --- a/playground/glob-import/__tests__/glob-import.spec.ts +++ b/playground/glob-import/__tests__/glob-import.spec.ts @@ -12,84 +12,84 @@ import { removeFile, untilBrowserLogAfter, viteTestUrl, - withRetry + withRetry, } from '~utils' const filteredResult = { './alias.js': { - default: 'hi' + default: 'hi', }, './foo.js': { - msg: 'foo' + msg: 'foo', }, "./quote'.js": { - msg: 'single-quote' - } + msg: 'single-quote', + }, } const json = { msg: 'baz', default: { - msg: 'baz' - } + msg: 'baz', + }, } const globWithAlias = { '/dir/alias.js': { - default: 'hi' - } + default: 'hi', + }, } const allResult = { // JSON file should be properly transformed '/dir/alias.js': { - default: 'hi' + default: 'hi', }, '/dir/baz.json': json, '/dir/foo.css': isBuild ? { - default: '.foo{color:#00f}\n' + default: '.foo{color:#00f}\n', } : { - default: '.foo {\n color: blue;\n}\n' + default: '.foo {\n color: blue;\n}\n', }, '/dir/foo.js': { - msg: 'foo' + msg: 'foo', }, '/dir/index.js': isBuild ? { modules: filteredResult, - globWithAlias + globWithAlias, } : { globWithAlias, - modules: filteredResult + modules: filteredResult, }, '/dir/nested/bar.js': { modules: { - '../baz.json': json + '../baz.json': json, }, - msg: 'bar' + msg: 'bar', }, "/dir/quote'.js": { - msg: 'single-quote' - } + msg: 'single-quote', + }, } const nodeModulesResult = { - '/dir/node_modules/hoge.js': { msg: 'hoge' } + '/dir/node_modules/hoge.js': { msg: 'hoge' }, } const rawResult = { '/dir/baz.json': { - msg: 'baz' - } + msg: 'baz', + }, } const relativeRawResult = { './dir/baz.json': { - msg: 'baz' - } + msg: 'baz', + }, } test('should work', async () => { @@ -109,25 +109,25 @@ test('should work', async () => { test('import glob raw', async () => { expect(await page.textContent('.globraw')).toBe( - JSON.stringify(rawResult, null, 2) + JSON.stringify(rawResult, null, 2), ) }) test('import property access', async () => { expect(await page.textContent('.property-access')).toBe( - JSON.stringify(rawResult['/dir/baz.json'], null, 2) + JSON.stringify(rawResult['/dir/baz.json'], null, 2), ) }) test('import relative glob raw', async () => { expect(await page.textContent('.relative-glob-raw')).toBe( - JSON.stringify(relativeRawResult, null, 2) + JSON.stringify(relativeRawResult, null, 2), ) }) test('unassigned import processes', async () => { expect(await page.textContent('.side-effect-result')).toBe( - 'Hello from side effect' + 'Hello from side effect', ) }) @@ -145,9 +145,9 @@ if (!isBuild) { ...allResult['/dir/index.js'], modules: { './a.js': {}, - ...allResult['/dir/index.js'].modules - } - } + ...allResult['/dir/index.js'].modules, + }, + }, }) }) @@ -157,18 +157,18 @@ if (!isBuild) { const actualEdit = await resultElement.textContent() expect(JSON.parse(actualEdit)).toStrictEqual({ '/dir/a.js': { - msg: 'a' + msg: 'a', }, ...allResult, '/dir/index.js': { ...allResult['/dir/index.js'], modules: { './a.js': { - msg: 'a' + msg: 'a', }, - ...allResult['/dir/index.js'].modules - } - } + ...allResult['/dir/index.js'].modules, + }, + }, }) }) @@ -184,7 +184,7 @@ test('tree-shake eager css', async () => { expect(await getColor('.tree-shake-eager-css')).toBe('orange') expect(await getColor('.no-tree-shake-eager-css')).toBe('orange') expect(await page.textContent('.no-tree-shake-eager-css-result')).toMatch( - '.no-tree-shake-eager-css' + '.no-tree-shake-eager-css', ) if (isBuild) { @@ -196,7 +196,7 @@ test('tree-shake eager css', async () => { test('warn CSS default import', async () => { const logs = await untilBrowserLogAfter( () => page.goto(viteTestUrl), - 'Ran scripts' + 'Ran scripts', ) const noTreeshakeCSSMessage = 'For example: `import.meta.glob("/no-tree-shake.css", { "eager": true, "query": "?inline" })`' @@ -206,14 +206,14 @@ test('warn CSS default import', async () => { expect( logs.some((log) => log.includes(noTreeshakeCSSMessage)), `expected logs to include a message including ${JSON.stringify( - noTreeshakeCSSMessage - )}` + noTreeshakeCSSMessage, + )}`, ).toBe(isServe) expect( logs.every((log) => !log.includes(treeshakeCSSMessage)), `expected logs not to include a message including ${JSON.stringify( - treeshakeCSSMessage - )}` + treeshakeCSSMessage, + )}`, ).toBe(true) }) @@ -225,7 +225,7 @@ test('escapes special chars in globs without mangling user supplied glob suffix' // this test finally compares the printed output of index.js with the list of directories with special chars, // expecting that they all work const files = await readdir(path.join(__dirname, '..', 'escape'), { - withFileTypes: true + withFileTypes: true, }) const expectedNames = files .filter((f) => f.isDirectory()) diff --git a/playground/glob-import/escape/(parenthesis)/glob.js b/playground/glob-import/escape/(parenthesis)/glob.js index e97de892c30e2b..9e0d925c4d1026 100644 --- a/playground/glob-import/escape/(parenthesis)/glob.js +++ b/playground/glob-import/escape/(parenthesis)/glob.js @@ -1,5 +1,5 @@ const relative = import.meta.glob('./**/*.js', { eager: true }) const alias = import.meta.glob('@escape_(parenthesis)_mod/**/*.js', { - eager: true + eager: true, }) export { relative, alias } diff --git a/playground/glob-import/escape/[brackets]/glob.js b/playground/glob-import/escape/[brackets]/glob.js index 7cc656bfe97464..320cf021f9db77 100644 --- a/playground/glob-import/escape/[brackets]/glob.js +++ b/playground/glob-import/escape/[brackets]/glob.js @@ -1,5 +1,5 @@ const relative = import.meta.glob('./**/*.js', { eager: true }) const alias = import.meta.glob('@escape_[brackets]_mod/**/*.js', { - eager: true + eager: true, }) export { relative, alias } diff --git a/playground/glob-import/index.html b/playground/glob-import/index.html index 5c07bd11690281..a899d244326f68 100644 --- a/playground/glob-import/index.html +++ b/playground/glob-import/index.html @@ -40,13 +40,13 @@

Escape alias glob

document.querySelector(selector).textContent = JSON.stringify( res, null, - 2 + 2, ) }) } const modules = import.meta.glob( - '/dir/**' + '/dir/**', // for test: annotation contain ")" /* * for test: annotation contain ")" @@ -57,7 +57,7 @@

Escape alias glob

document.querySelector('.result-eager').textContent = JSON.stringify( eagerModules, null, - 2 + 2, ) const nodeModules = import.meta.glob('/dir/node_modules/**') @@ -67,7 +67,7 @@

Escape alias glob

@@ -125,7 +125,7 @@

Escape alias glob

diff --git a/playground/lib/vite.config.js b/playground/lib/vite.config.js index 3e5187b68c55ee..ec46c6c5a12249 100644 --- a/playground/lib/vite.config.js +++ b/playground/lib/vite.config.js @@ -8,21 +8,21 @@ module.exports = { esbuild: { supported: { // Force esbuild inject helpers to test regex - 'object-rest-spread': false - } + 'object-rest-spread': false, + }, }, build: { rollupOptions: { output: { - banner: `/*!\nMayLib\n*/` - } + banner: `/*!\nMayLib\n*/`, + }, }, lib: { entry: path.resolve(__dirname, 'src/main.js'), name: 'MyLib', formats: ['es', 'umd', 'iife'], - fileName: 'my-lib-custom-filename' - } + fileName: 'my-lib-custom-filename', + }, }, plugins: [ { @@ -33,10 +33,10 @@ module.exports = { fileName: 'index.html', source: fs.readFileSync( path.resolve(__dirname, 'index.dist.html'), - 'utf-8' - ) + 'utf-8', + ), }) - } - } - ] + }, + }, + ], } diff --git a/playground/lib/vite.dyimport.config.js b/playground/lib/vite.dyimport.config.js index c621c90fb2ed8a..a808475f386980 100644 --- a/playground/lib/vite.dyimport.config.js +++ b/playground/lib/vite.dyimport.config.js @@ -10,8 +10,8 @@ module.exports = { entry: path.resolve(__dirname, 'src/main2.js'), formats: ['es', 'iife'], name: 'message', - fileName: (format) => `dynamic-import-message.${format}.mjs` + fileName: (format) => `dynamic-import-message.${format}.mjs`, }, - outDir: 'dist/lib' - } + outDir: 'dist/lib', + }, } diff --git a/playground/minify/vite.config.js b/playground/minify/vite.config.js index 43eca91a5c0f30..0f9accb248290a 100644 --- a/playground/minify/vite.config.js +++ b/playground/minify/vite.config.js @@ -2,6 +2,6 @@ import { defineConfig } from 'vite' export default defineConfig({ esbuild: { - minifySyntax: false - } + minifySyntax: false, + }, }) diff --git a/playground/multiple-entrypoints/vite.config.js b/playground/multiple-entrypoints/vite.config.js index e1289dbf5a0078..f0e2ea0ea12779 100644 --- a/playground/multiple-entrypoints/vite.config.js +++ b/playground/multiple-entrypoints/vite.config.js @@ -33,8 +33,8 @@ module.exports = { a22: resolve(__dirname, 'entrypoints/a22.js'), a23: resolve(__dirname, 'entrypoints/a23.js'), a24: resolve(__dirname, 'entrypoints/a24.js'), - index: resolve(__dirname, './index.html') - } - } - } + index: resolve(__dirname, './index.html'), + }, + }, + }, } diff --git a/playground/nested-deps/vite.config.js b/playground/nested-deps/vite.config.js index 85980c5dcfe807..982d97397de55a 100644 --- a/playground/nested-deps/vite.config.js +++ b/playground/nested-deps/vite.config.js @@ -9,8 +9,8 @@ module.exports = { 'test-package-c', 'test-package-c/side', 'test-package-d > test-package-d-nested', - 'test-package-e > test-package-e-included' + 'test-package-e > test-package-e-included', ], - exclude: ['test-package-d', 'test-package-e-excluded'] - } + exclude: ['test-package-d', 'test-package-e-excluded'], + }, } diff --git a/playground/object-hooks/vite.config.ts b/playground/object-hooks/vite.config.ts index 554462dc730df3..1024ce7c0be140 100644 --- a/playground/object-hooks/vite.config.ts +++ b/playground/object-hooks/vite.config.ts @@ -11,14 +11,14 @@ export default defineConfig({ async handler() { await new Promise((r) => setTimeout(r, 100)) count += 1 - } + }, }, transform: { order: 'post', handler(code) { return code.replace('__TRANSFORM3__', 'ok') - } - } + }, + }, }, { name: 'plugin2', @@ -28,13 +28,13 @@ export default defineConfig({ assert(count === 1) await new Promise((r) => setTimeout(r, 100)) count += 1 - } + }, }, transform: { handler(code) { return code.replace('__TRANSFORM1__', '__TRANSFORM2__') - } - } + }, + }, }, { name: 'plugin3', @@ -43,27 +43,27 @@ export default defineConfig({ assert(count === 2) await new Promise((r) => setTimeout(r, 100)) count += 1 - } + }, }, transform: { order: 'pre', handler(code) { return code.replace('__TRANSFORM__', '__TRANSFORM1__') - } - } + }, + }, }, { name: 'plugin4', buildStart: { async handler() { assert(count === 2) - } + }, }, transform: { handler(code) { return code.replace('__TRANSFORM2__', '__TRANSFORM3__') - } - } - } - ] + }, + }, + }, + ], }) diff --git a/playground/optimize-deps/__tests__/optimize-deps.spec.ts b/playground/optimize-deps/__tests__/optimize-deps.spec.ts index 8d109205855555..ad55be500aa5c1 100644 --- a/playground/optimize-deps/__tests__/optimize-deps.spec.ts +++ b/playground/optimize-deps/__tests__/optimize-deps.spec.ts @@ -5,7 +5,7 @@ import { getColor, isBuild, isServe, - page + page, } from '~utils' test('default + named imports from cjs dep (react)', async () => { @@ -38,13 +38,13 @@ test('dynamic default import from webpacked cjs (clipboard)', async () => { test('dynamic default import from cjs (cjs-dynamic-dep-cjs-compiled-from-esm)', async () => { expect(await page.textContent('.cjs-dynamic-dep-cjs-compiled-from-esm')).toBe( - 'ok' + 'ok', ) }) test('dynamic default import from cjs (cjs-dynamic-dep-cjs-compiled-from-cjs)', async () => { expect(await page.textContent('.cjs-dynamic-dep-cjs-compiled-from-cjs')).toBe( - 'ok' + 'ok', ) }) @@ -88,19 +88,19 @@ test('Import from dependency which uses relative path which needs to be resolved test('dep with dynamic import', async () => { expect(await page.textContent('.dep-with-dynamic-import')).toMatch( - `[success]` + `[success]`, ) }) test('dep with optional peer dep', async () => { expect(await page.textContent('.dep-with-optional-peer-dep')).toMatch( - `[success]` + `[success]`, ) if (isServe) { expect(browserErrors.map((error) => error.message)).toEqual( expect.arrayContaining([ - 'Could not resolve "foobar" imported by "dep-with-optional-peer-dep". Is it installed?' - ]) + 'Could not resolve "foobar" imported by "dep-with-optional-peer-dep". Is it installed?', + ]), ) } }) @@ -125,7 +125,7 @@ test('vue + vuex', async () => { // the esbuild plugins won't apply to dependencies test('esbuild-plugin', async () => { expect(await page.textContent('.esbuild-plugin')).toMatch( - `Hello from an esbuild plugin` + `Hello from an esbuild plugin`, ) }) @@ -152,7 +152,7 @@ test('flatten id should generate correctly', async () => { test('non optimized module is not duplicated', async () => { expect( - await page.textContent('.non-optimized-module-is-not-duplicated') + await page.textContent('.non-optimized-module-is-not-duplicated'), ).toBe('from-absolute-path, from-relative-path') }) @@ -163,28 +163,28 @@ test.runIf(isServe)('error on builtin modules usage', () => { expect.stringMatching(/dep-with-builtin-module-esm.*is not a function/), // dep-with-builtin-module-esm warnings expect.stringContaining( - 'Module "fs" has been externalized for browser compatibility. Cannot access "fs.readFileSync" in client code.' + 'Module "fs" has been externalized for browser compatibility. Cannot access "fs.readFileSync" in client code.', ), expect.stringContaining( - 'Module "path" has been externalized for browser compatibility. Cannot access "path.join" in client code.' + 'Module "path" has been externalized for browser compatibility. Cannot access "path.join" in client code.', ), // from dep-with-builtin-module-cjs expect.stringMatching(/dep-with-builtin-module-cjs.*is not a function/), // dep-with-builtin-module-cjs warnings expect.stringContaining( - 'Module "fs" has been externalized for browser compatibility. Cannot access "fs.readFileSync" in client code.' + 'Module "fs" has been externalized for browser compatibility. Cannot access "fs.readFileSync" in client code.', ), expect.stringContaining( - 'Module "path" has been externalized for browser compatibility. Cannot access "path.join" in client code.' - ) - ]) + 'Module "path" has been externalized for browser compatibility. Cannot access "path.join" in client code.', + ), + ]), ) expect(browserErrors.map((error) => error.message)).toEqual( expect.arrayContaining([ // from user source code 'Module "buffer" has been externalized for browser compatibility. Cannot access "buffer.Buffer" in client code.', - 'Module "child_process" has been externalized for browser compatibility. Cannot access "child_process.execSync" in client code.' - ]) + 'Module "child_process" has been externalized for browser compatibility. Cannot access "child_process.execSync" in client code.', + ]), ) }) diff --git a/playground/optimize-deps/cjs-dynamic.js b/playground/optimize-deps/cjs-dynamic.js index 21aec63fe27098..6b74bff96b38f3 100644 --- a/playground/optimize-deps/cjs-dynamic.js +++ b/playground/optimize-deps/cjs-dynamic.js @@ -36,14 +36,14 @@ { onClick() { setCount(count + 1) - } + }, }, - `count is ${count}` + `count is ${count}`, ) } ReactDOM.createRoot(document.querySelector('.cjs-dynamic')).render( - React.createElement(App) + React.createElement(App), ) function text(el, text) { diff --git a/playground/optimize-deps/cjs.js b/playground/optimize-deps/cjs.js index 9a4651d6ad4008..ba3e0aa783e69c 100644 --- a/playground/optimize-deps/cjs.js +++ b/playground/optimize-deps/cjs.js @@ -27,14 +27,14 @@ function App() { { onClick() { setCount(count + 1) - } + }, }, - `count is ${count}` + `count is ${count}`, ) } ReactDOM.createRoot(document.querySelector('.cjs')).render( - React.createElement(App) + React.createElement(App), ) function text(el, text) { diff --git a/playground/optimize-deps/dedupe.js b/playground/optimize-deps/dedupe.js index 7299fb9d3bb6c8..8429b719884d43 100644 --- a/playground/optimize-deps/dedupe.js +++ b/playground/optimize-deps/dedupe.js @@ -14,12 +14,12 @@ function App() { { onClick() { setCount(count + 1) - } + }, }, - `count is ${count}` + `count is ${count}`, ) } ReactDOM.createRoot(document.querySelector('.dedupe')).render( - React.createElement(App) + React.createElement(App), ) diff --git a/playground/optimize-deps/dep-cjs-browser-field-bare/events-shim.js b/playground/optimize-deps/dep-cjs-browser-field-bare/events-shim.js index fb5ce844858a55..964e815b7a7bcf 100644 --- a/playground/optimize-deps/dep-cjs-browser-field-bare/events-shim.js +++ b/playground/optimize-deps/dep-cjs-browser-field-bare/events-shim.js @@ -1,3 +1,3 @@ module.exports = { - foo: 'foo' + foo: 'foo', } diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html index 3ca86a5359781a..f6bafd8b1eb825 100644 --- a/playground/optimize-deps/index.html +++ b/playground/optimize-deps/index.html @@ -164,7 +164,7 @@

Non Optimized Module isn't duplicated

addFromDirectRelativePath('from-relative-path') text( '.non-optimized-module-is-not-duplicated', - getFromBareImport().join(', ') + getFromBareImport().join(', '), ) diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js index d8e575271f2572..8bd56a721d6666 100644 --- a/playground/optimize-deps/vite.config.js +++ b/playground/optimize-deps/vite.config.js @@ -11,8 +11,8 @@ module.exports = { resolve: { dedupe: ['react'], alias: { - 'node:url': 'url' - } + 'node:url': 'url', + }, }, optimizeDeps: { disabled: false, @@ -20,7 +20,7 @@ module.exports = { 'dep-linked-include', 'nested-exclude > nested-include', // will throw if optimized (should log warning instead) - 'non-optimizable-include' + 'non-optimizable-include', ], exclude: ['nested-exclude', 'dep-non-optimized'], esbuildOptions: { @@ -32,14 +32,14 @@ module.exports = { { filter: /dep-esbuild-plugin-transform(\\|\/)index\.js$/ }, () => ({ contents: `export const hello = () => 'Hello from an esbuild plugin'`, - loader: 'js' - }) + loader: 'js', + }), ) - } - } - ] + }, + }, + ], }, - entries: ['entry.js'] + entries: ['entry.js'], }, build: { @@ -47,8 +47,8 @@ module.exports = { minify: false, // Avoid @rollup/plugin-commonjs commonjsOptions: { - include: [] - } + include: [], + }, }, plugins: [ @@ -68,7 +68,7 @@ module.exports = { res.statusCode = 200 res.end('pong') }) - } + }, }, { name: 'test-astro', @@ -77,7 +77,7 @@ module.exports = { code = `export default {}` return { code } } - } + }, }, // TODO: Remove this one support for prebundling in build lands. // It is expected that named importing in build doesn't work @@ -90,9 +90,9 @@ module.exports = { if (id === '__vite-browser-external') { return `export default {}; export function readFileSync() {}` } - } - } - ] + }, + }, + ], } // Handles .notjs file, basically remove wrapping and tags @@ -115,11 +115,11 @@ function notjs() { .replace('', '') return { contents, loader: 'js' } }) - } - } - ] - } - } + }, + }, + ], + }, + }, } }, transform(code, id) { @@ -127,6 +127,6 @@ function notjs() { code = code.replace('', '').replace('', '') return { code } } - } + }, } } diff --git a/playground/optimize-missing-deps/__test__/serve.ts b/playground/optimize-missing-deps/__test__/serve.ts index 750d57075c2452..ed9ad41a7c90a1 100644 --- a/playground/optimize-missing-deps/__test__/serve.ts +++ b/playground/optimize-missing-deps/__test__/serve.ts @@ -10,7 +10,7 @@ export async function serve(): Promise<{ close(): Promise }> { const { createServer } = require(path.resolve(rootDir, 'server.js')) const { app, vite } = await createServer( rootDir, - hmrPorts['optimize-missing-deps'] + hmrPorts['optimize-missing-deps'], ) return new Promise((resolve, reject) => { @@ -25,7 +25,7 @@ export async function serve(): Promise<{ close(): Promise }> { if (vite) { await vite.close() } - } + }, }) }) } catch (e) { diff --git a/playground/optimize-missing-deps/server.js b/playground/optimize-missing-deps/server.js index 0685d0148eff43..1940d76fa7e0cd 100644 --- a/playground/optimize-missing-deps/server.js +++ b/playground/optimize-missing-deps/server.js @@ -19,10 +19,10 @@ async function createServer(root = process.cwd(), hmrPort) { server: { middlewareMode: true, hmr: { - port: hmrPort - } + port: hmrPort, + }, }, - appType: 'custom' + appType: 'custom', }) app.use(vite.middlewares) @@ -59,7 +59,7 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/preload/__tests__/preload.spec.ts b/playground/preload/__tests__/preload.spec.ts index dc93f51ba2b700..9407d26942456a 100644 --- a/playground/preload/__tests__/preload.spec.ts +++ b/playground/preload/__tests__/preload.spec.ts @@ -17,10 +17,10 @@ describe.runIf(isBuild)('build', () => { await page.goto(viteTestUrl + '/#/hello') const html = await page.content() expect(html).toMatch( - /link rel="modulepreload".*?href=".*?\/assets\/Hello-\w{8}\.js"/ + /link rel="modulepreload".*?href=".*?\/assets\/Hello-\w{8}\.js"/, ) expect(html).toMatch( - /link rel="stylesheet".*?href=".*?\/assets\/Hello-\w{8}\.css"/ + /link rel="stylesheet".*?href=".*?\/assets\/Hello-\w{8}\.css"/, ) }) }) diff --git a/playground/preload/__tests__/resolve-deps/preload-resolve-deps.spec.ts b/playground/preload/__tests__/resolve-deps/preload-resolve-deps.spec.ts index b587f78b08c207..78a19d7c09cb35 100644 --- a/playground/preload/__tests__/resolve-deps/preload-resolve-deps.spec.ts +++ b/playground/preload/__tests__/resolve-deps/preload-resolve-deps.spec.ts @@ -17,11 +17,11 @@ describe.runIf(isBuild)('build', () => { await page.goto(viteTestUrl + '/#/hello') const html = await page.content() expect(html).toMatch( - /link rel="modulepreload".*?href="http.*?\/Hello-\w{8}\.js"/ + /link rel="modulepreload".*?href="http.*?\/Hello-\w{8}\.js"/, ) expect(html).toMatch(/link rel="modulepreload".*?href="\/preloaded.js"/) expect(html).toMatch( - /link rel="stylesheet".*?href="http.*?\/Hello-\w{8}\.css"/ + /link rel="stylesheet".*?href="http.*?\/Hello-\w{8}\.css"/, ) }) }) diff --git a/playground/preload/router.js b/playground/preload/router.js index d3d5afdc99f6a3..2e4388967838ae 100644 --- a/playground/preload/router.js +++ b/playground/preload/router.js @@ -6,16 +6,16 @@ const routes = [ { path: '/hello', name: 'Hello', - component: () => import(/* a comment */ './src/components/Hello.vue') + component: () => import(/* a comment */ './src/components/Hello.vue'), }, { path: '/about', name: 'About', - component: () => import('./src/components/About.vue') - } // Lazy load route component + component: () => import('./src/components/About.vue'), + }, // Lazy load route component ] export default createRouter({ routes, - history: createWebHashHistory() + history: createWebHashHistory(), }) diff --git a/playground/preload/vite.config-preload-disabled.ts b/playground/preload/vite.config-preload-disabled.ts index 27735976335365..47f8a7ee5e1ac1 100644 --- a/playground/preload/vite.config-preload-disabled.ts +++ b/playground/preload/vite.config-preload-disabled.ts @@ -7,12 +7,12 @@ export default defineConfig({ minify: 'terser', terserOptions: { format: { - beautify: true + beautify: true, }, compress: { - passes: 3 - } + passes: 3, + }, }, - modulePreload: false - } + modulePreload: false, + }, }) diff --git a/playground/preload/vite.config-resolve-deps.ts b/playground/preload/vite.config-resolve-deps.ts index d556f2a843c6d4..951544634b19de 100644 --- a/playground/preload/vite.config-resolve-deps.ts +++ b/playground/preload/vite.config-resolve-deps.ts @@ -7,11 +7,11 @@ export default defineConfig({ minify: 'terser', terserOptions: { format: { - beautify: true + beautify: true, }, compress: { - passes: 3 - } + passes: 3, + }, }, modulePreload: { resolveDependencies(filename, deps, { hostId, hostType }) { @@ -19,8 +19,8 @@ export default defineConfig({ return [...deps, 'preloaded.js'] } return deps - } - } + }, + }, }, experimental: { renderBuiltUrl(filename, { hostId, hostType }) { @@ -28,6 +28,6 @@ export default defineConfig({ return { runtime: `""+${JSON.stringify('/' + filename)}` } } return { relative: true } - } - } + }, + }, }) diff --git a/playground/preload/vite.config.ts b/playground/preload/vite.config.ts index 7fa1eb189818b3..29e81c358c866c 100644 --- a/playground/preload/vite.config.ts +++ b/playground/preload/vite.config.ts @@ -7,11 +7,11 @@ export default defineConfig({ minify: 'terser', terserOptions: { format: { - beautify: true + beautify: true, }, compress: { - passes: 3 - } - } - } + passes: 3, + }, + }, + }, }) diff --git a/playground/preserve-symlinks/moduleA/src/data.js b/playground/preserve-symlinks/moduleA/src/data.js index e1bc98ec67da12..5e21c75a71d952 100644 --- a/playground/preserve-symlinks/moduleA/src/data.js +++ b/playground/preserve-symlinks/moduleA/src/data.js @@ -1,3 +1,3 @@ export const data = { - msg: 'hello vite' + msg: 'hello vite', } diff --git a/playground/resolve-config/__tests__/resolve-config.spec.ts b/playground/resolve-config/__tests__/resolve-config.spec.ts index 7c9d003791b4d9..eeb4f2c79edcbb 100644 --- a/playground/resolve-config/__tests__/resolve-config.spec.ts +++ b/playground/resolve-config/__tests__/resolve-config.spec.ts @@ -13,7 +13,7 @@ const build = (configName: string) => { const getDistFile = (configName: string, extension: string) => { return fs.readFileSync( fromTestDir(`${configName}/dist/index.${extension}`), - 'utf8' + 'utf8', ) } diff --git a/playground/resolve-config/__tests__/serve.ts b/playground/resolve-config/__tests__/serve.ts index b2cc1ccc1e1e77..39e84860cfadfb 100644 --- a/playground/resolve-config/__tests__/serve.ts +++ b/playground/resolve-config/__tests__/serve.ts @@ -24,7 +24,7 @@ export async function serve() { const conf = await fs.readFile(pathToConf, 'utf8') await fs.writeFile( pathToConf, - conf.replace('export default', 'module.exports = ') + conf.replace('export default', 'module.exports = '), ) } @@ -37,7 +37,7 @@ export async function serve() { // copy directory and add package.json with "type": "module" await fs.copy(fromTestDir(configName), fromTestDir(`${configName}-module`)) await fs.writeJSON(fromTestDir(`${configName}-module`, 'package.json'), { - type: 'module' + type: 'module', }) } } diff --git a/playground/resolve-config/root/vite.config.ts b/playground/resolve-config/root/vite.config.ts index a6ad03b2122361..016564355261d8 100644 --- a/playground/resolve-config/root/vite.config.ts +++ b/playground/resolve-config/root/vite.config.ts @@ -5,6 +5,6 @@ export default { build: { minify: false, sourcemap: false, - lib: { entry: 'index.js', fileName: 'index', formats: ['es'] } - } + lib: { entry: 'index.js', fileName: 'index', formats: ['es'] }, + }, } diff --git a/playground/resolve/__tests__/resolve.spec.ts b/playground/resolve/__tests__/resolve.spec.ts index 8f910f4989bfaa..2181f6d3c8433e 100644 --- a/playground/resolve/__tests__/resolve.spec.ts +++ b/playground/resolve/__tests__/resolve.spec.ts @@ -20,26 +20,26 @@ test('deep import with exports field', async () => { test('deep import with query with exports field', async () => { // since it is imported with `?url` it should return a URL expect(await page.textContent('.exports-deep-query')).toMatch( - isBuild ? /base64/ : '/exports-path/deep.json' + isBuild ? /base64/ : '/exports-path/deep.json', ) }) test('deep import with exports field + exposed dir', async () => { expect(await page.textContent('.exports-deep-exposed-dir')).toMatch( - '[success]' + '[success]', ) }) test('deep import with exports field + mapped dir', async () => { expect(await page.textContent('.exports-deep-mapped-dir')).toMatch( - '[success]' + '[success]', ) }) // this is how Svelte 3 is packaged test('deep import with exports and legacy fallback', async () => { expect(await page.textContent('.exports-legacy-fallback')).toMatch( - '[success]' + '[success]', ) }) @@ -49,7 +49,7 @@ test('Respect exports field env key priority', async () => { test('Respect production/development conditionals', async () => { expect(await page.textContent('.exports-env')).toMatch( - isBuild ? `browser.prod.mjs` : `browser.mjs` + isBuild ? `browser.prod.mjs` : `browser.mjs`, ) }) @@ -71,7 +71,7 @@ test('dont add extension to directory name (./dir-with-ext.js/index.js)', async test('do not resolve to the `module` field if the importer is a `require` call', async () => { expect(await page.textContent('.require-pkg-with-module-field')).toMatch( - '[success]' + '[success]', ) }) @@ -141,6 +141,6 @@ test('resolve.conditions', async () => { test('resolve package that contains # in path', async () => { expect(await page.textContent('.path-contains-sharp-symbol')).toMatch( - '[success]' + '[success]', ) }) diff --git a/playground/resolve/config-dep.js b/playground/resolve/config-dep.js index 8bc3563c743bcd..167d270797e4c2 100644 --- a/playground/resolve/config-dep.js +++ b/playground/resolve/config-dep.js @@ -1,3 +1,3 @@ module.exports = { - a: 1 + a: 1, } diff --git a/playground/resolve/vite.config.js b/playground/resolve/vite.config.js index b27613eb6bc2ad..54f2ccf839f70c 100644 --- a/playground/resolve/vite.config.js +++ b/playground/resolve/vite.config.js @@ -14,24 +14,24 @@ const generatedContentVirtualFile = '@generated-content-virtual-file' const generatedContentImports = [ { specifier: normalizePath( - path.resolve(__dirname, './drive-relative.js').replace(/^[a-zA-Z]:/, '') + path.resolve(__dirname, './drive-relative.js').replace(/^[a-zA-Z]:/, ''), ), - elementQuery: '.drive-relative' + elementQuery: '.drive-relative', }, { specifier: normalizePath(path.resolve(__dirname, './absolute.js')), - elementQuery: '.absolute' - } + elementQuery: '.absolute', + }, ] module.exports = { resolve: { extensions: ['.mjs', '.js', '.es', '.ts'], mainFields: ['custom', 'module'], - conditions: ['custom'] + conditions: ['custom'], }, define: { - VITE_CONFIG_DEP_TEST: a + VITE_CONFIG_DEP_TEST: a, }, plugins: [ { @@ -45,7 +45,7 @@ module.exports = { if (id === virtualId) { return `export const msg = "[success] from conventional virtual file"` } - } + }, }, { name: 'virtual-module-9036', @@ -58,7 +58,7 @@ module.exports = { if (id === virtualId9036) { return `export const msg = "[success] from virtual file #9036"` } - } + }, }, { name: 'custom-resolve', @@ -71,7 +71,7 @@ module.exports = { if (id === customVirtualFile) { return `export const msg = "[success] from custom virtual file"` } - } + }, }, { name: 'generated-content', @@ -86,7 +86,7 @@ module.exports = { .map( ({ specifier, elementQuery }, i) => `import content${i} from ${JSON.stringify(specifier)}\n` + - `text(${JSON.stringify(elementQuery)}, content${i})` + `text(${JSON.stringify(elementQuery)}, content${i})`, ) .join('\n') @@ -97,10 +97,10 @@ module.exports = { tests ) } - } - } + }, + }, ], optimizeDeps: { - include: ['require-pkg-with-module-field'] - } + include: ['require-pkg-with-module-field'], + }, } diff --git a/playground/ssr-deps/__tests__/serve.ts b/playground/ssr-deps/__tests__/serve.ts index c9475c76441773..d7502f5542a356 100644 --- a/playground/ssr-deps/__tests__/serve.ts +++ b/playground/ssr-deps/__tests__/serve.ts @@ -25,7 +25,7 @@ export async function serve(): Promise<{ close(): Promise }> { if (vite) { await vite.close() } - } + }, }) }) } catch (e) { diff --git a/playground/ssr-deps/__tests__/ssr-deps.spec.ts b/playground/ssr-deps/__tests__/ssr-deps.spec.ts index a98bf5bcd76299..5a45d047ee86a0 100644 --- a/playground/ssr-deps/__tests__/ssr-deps.spec.ts +++ b/playground/ssr-deps/__tests__/ssr-deps.spec.ts @@ -13,7 +13,7 @@ const url = `http://localhost:${port}` test('msg should be encrypted', async () => { await page.goto(url) expect(await page.textContent('.encrypted-msg')).not.toMatch( - 'Secret Message!' + 'Secret Message!', ) }) @@ -25,52 +25,52 @@ test('msg read by fs/promises', async () => { test('msg from primitive export', async () => { await page.goto(url) expect(await page.textContent('.primitive-export-message')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from TS transpiled exports', async () => { await page.goto(url) expect(await page.textContent('.ts-default-export-message')).toMatch( - 'Hello World!' + 'Hello World!', ) expect(await page.textContent('.ts-named-export-message')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from Object.assign exports', async () => { await page.goto(url) expect(await page.textContent('.object-assigned-exports-message')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from forwarded exports', async () => { await page.goto(url) expect(await page.textContent('.forwarded-export-message')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from define properties exports', async () => { await page.goto(url) expect(await page.textContent('.define-properties-exports-msg')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from define property exports', async () => { await page.goto(url) expect(await page.textContent('.define-property-exports-msg')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from only object assigned exports', async () => { await page.goto(url) expect(await page.textContent('.only-object-assigned-exports-msg')).toMatch( - 'Hello World!' + 'Hello World!', ) }) @@ -82,28 +82,28 @@ test('msg from no external cjs', async () => { test('msg from optimized with nested external', async () => { await page.goto(url) expect(await page.textContent('.optimized-with-nested-external')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from optimized cjs with nested external', async () => { await page.goto(url) expect(await page.textContent('.optimized-cjs-with-nested-external')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from external using external entry', async () => { await page.goto(url) expect(await page.textContent('.external-using-external-entry')).toMatch( - 'Hello World!' + 'Hello World!', ) }) test('msg from linked no external', async () => { await page.goto(url) expect(await page.textContent('.linked-no-external')).toMatch( - `Hello World from ${process.env.NODE_ENV}!` + `Hello World from ${process.env.NODE_ENV}!`, ) }) diff --git a/playground/ssr-deps/define-property-exports/index.js b/playground/ssr-deps/define-property-exports/index.js index 4506dd6200051e..d9708c8a5fed60 100644 --- a/playground/ssr-deps/define-property-exports/index.js +++ b/playground/ssr-deps/define-property-exports/index.js @@ -1,5 +1,5 @@ Object.defineProperty(exports, 'hello', { value() { return 'Hello World!' - } + }, }) diff --git a/playground/ssr-deps/external-using-external-entry/index.js b/playground/ssr-deps/external-using-external-entry/index.js index 8d0e6e15200dc6..e8160fcd36d176 100644 --- a/playground/ssr-deps/external-using-external-entry/index.js +++ b/playground/ssr-deps/external-using-external-entry/index.js @@ -3,5 +3,5 @@ import getMessage from 'external-entry/entry' export default { hello() { return getMessage() - } + }, } diff --git a/playground/ssr-deps/object-assigned-exports/index.js b/playground/ssr-deps/object-assigned-exports/index.js index d6510e38f3a36f..e0e61fcd260e4e 100644 --- a/playground/ssr-deps/object-assigned-exports/index.js +++ b/playground/ssr-deps/object-assigned-exports/index.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, '__esModule', { value: true }) const obj = { hello() { return 'Hello World!' - } + }, } Object.assign(exports, obj) diff --git a/playground/ssr-deps/only-object-assigned-exports/index.js b/playground/ssr-deps/only-object-assigned-exports/index.js index b6a4ab368b133d..8d268027ec7f0c 100644 --- a/playground/ssr-deps/only-object-assigned-exports/index.js +++ b/playground/ssr-deps/only-object-assigned-exports/index.js @@ -1,5 +1,5 @@ Object.assign(exports, { hello() { return 'Hello World!' - } + }, }) diff --git a/playground/ssr-deps/optimized-cjs-with-nested-external/index.js b/playground/ssr-deps/optimized-cjs-with-nested-external/index.js index adbbb819ed31ea..6fc7c0c31a8324 100644 --- a/playground/ssr-deps/optimized-cjs-with-nested-external/index.js +++ b/playground/ssr-deps/optimized-cjs-with-nested-external/index.js @@ -1,5 +1,5 @@ const getMessage = require('nested-external') module.exports = { - hello: getMessage + hello: getMessage, } diff --git a/playground/ssr-deps/server.js b/playground/ssr-deps/server.js index 08a8b331495882..9cda0482aa1469 100644 --- a/playground/ssr-deps/server.js +++ b/playground/ssr-deps/server.js @@ -27,11 +27,11 @@ export async function createServer(root = process.cwd(), hmrPort) { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, - interval: 100 + interval: 100, }, hmr: { - port: hmrPort - } + port: hmrPort, + }, }, appType: 'custom', ssr: { @@ -39,12 +39,12 @@ export async function createServer(root = process.cwd(), hmrPort) { 'no-external-cjs', 'import-builtin-cjs', 'no-external-css', - 'external-entry' + 'external-entry', ], external: ['nested-external', 'external-entry/entry'], optimizeDeps: { - disabled: 'build' - } + disabled: 'build', + }, }, plugins: [ { @@ -59,9 +59,9 @@ export async function createServer(root = process.cwd(), hmrPort) { if (id === 'pkg-exports/virtual') { return 'export default "[success]"' } - } - } - ] + }, + }, + ], }) // use vite's connect instance as middleware app.use(vite.middlewares) @@ -94,6 +94,6 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/ssr-html/__tests__/serve.ts b/playground/ssr-html/__tests__/serve.ts index 47076edcb40550..4886414606b6b6 100644 --- a/playground/ssr-html/__tests__/serve.ts +++ b/playground/ssr-html/__tests__/serve.ts @@ -25,7 +25,7 @@ export async function serve(): Promise<{ close(): Promise }> { if (vite) { await vite.close() } - } + }, }) }) } catch (e) { diff --git a/playground/ssr-html/__tests__/ssr-html.spec.ts b/playground/ssr-html/__tests__/ssr-html.spec.ts index 94e64bdb5d8b8b..fa871fce04efb8 100644 --- a/playground/ssr-html/__tests__/ssr-html.spec.ts +++ b/playground/ssr-html/__tests__/ssr-html.spec.ts @@ -9,7 +9,7 @@ describe('injected inline scripts', () => { test('no injected inline scripts are present', async () => { await page.goto(url) const inlineScripts = await page.$$eval('script', (nodes) => - nodes.filter((n) => !n.getAttribute('src') && n.innerHTML) + nodes.filter((n) => !n.getAttribute('src') && n.innerHTML), ) expect(inlineScripts).toHaveLength(0) }) @@ -23,14 +23,14 @@ describe('injected inline scripts', () => { if (!src) return false return src.includes('?html-proxy&index') }) - .map((n) => n.getAttribute('src')) + .map((n) => n.getAttribute('src')), ) // assert at least 1 proxied script exists expect(proxiedScripts).not.toHaveLength(0) const scriptContents = await Promise.all( - proxiedScripts.map((src) => fetch(url + src).then((res) => res.text())) + proxiedScripts.map((src) => fetch(url + src).then((res) => res.text())), ) // all proxied scripts return code @@ -46,7 +46,7 @@ describe.runIf(isServe)('hmr', () => { const el = await page.$('.virtual') expect(await el.textContent()).toBe('[success]') editFile('src/importedVirtual.js', (code) => - code.replace('[success]', '[wow]') + code.replace('[success]', '[wow]'), ) await page.waitForNavigation() await untilUpdated(async () => { diff --git a/playground/ssr-html/server.js b/playground/ssr-html/server.js index 02d613ed49004f..0c4deacfc64f2e 100644 --- a/playground/ssr-html/server.js +++ b/playground/ssr-html/server.js @@ -42,11 +42,11 @@ export async function createServer(root = process.cwd(), hmrPort) { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, - interval: 100 + interval: 100, }, hmr: { - port: hmrPort - } + port: hmrPort, + }, }, appType: 'custom', plugins: [ @@ -61,9 +61,9 @@ export async function createServer(root = process.cwd(), hmrPort) { if (id === '\0virtual:file') { return 'import { virtual } from "/src/importedVirtual.js"; export { virtual };' } - } - } - ] + }, + }, + ], }) // use vite's connect instance as middleware app.use(vite.middlewares) @@ -85,7 +85,7 @@ export async function createServer(root = process.cwd(), hmrPort) { template = template.replace( '', - `${DYNAMIC_SCRIPTS}${DYNAMIC_STYLES}` + `${DYNAMIC_SCRIPTS}${DYNAMIC_STYLES}`, ) // Force calling transformIndexHtml with url === '/', to simulate @@ -108,6 +108,6 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/ssr-noexternal/__tests__/serve.ts b/playground/ssr-noexternal/__tests__/serve.ts index 5878da8f5ce439..47bb4c5236294f 100644 --- a/playground/ssr-noexternal/__tests__/serve.ts +++ b/playground/ssr-noexternal/__tests__/serve.ts @@ -16,8 +16,8 @@ export async function serve(): Promise<{ close(): Promise }> { root: rootDir, logLevel: 'silent', build: { - ssr: 'src/entry-server.js' - } + ssr: 'src/entry-server.js', + }, }) } @@ -27,7 +27,7 @@ export async function serve(): Promise<{ close(): Promise }> { const { app, vite } = await createServer( rootDir, isBuild, - hmrPorts['ssr-noexternal'] + hmrPorts['ssr-noexternal'], ) return new Promise((resolve, reject) => { @@ -42,7 +42,7 @@ export async function serve(): Promise<{ close(): Promise }> { if (vite) { await vite.close() } - } + }, }) }) } catch (e) { diff --git a/playground/ssr-noexternal/server.js b/playground/ssr-noexternal/server.js index 5ee318f4093952..b11f161f70d2e6 100644 --- a/playground/ssr-noexternal/server.js +++ b/playground/ssr-noexternal/server.js @@ -10,7 +10,7 @@ const isTest = process.env.VITEST export async function createServer( root = process.cwd(), isProd = process.env.NODE_ENV === 'production', - hmrPort + hmrPort, ) { const resolve = (p) => path.resolve(__dirname, p) @@ -36,13 +36,13 @@ export async function createServer( // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, - interval: 100 + interval: 100, }, hmr: { - port: hmrPort - } + port: hmrPort, + }, }, - appType: 'custom' + appType: 'custom', }) app.use(vite.middlewares) } @@ -82,6 +82,6 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/ssr-noexternal/vite.config.js b/playground/ssr-noexternal/vite.config.js index 848179b85a24e7..124939d4cde737 100644 --- a/playground/ssr-noexternal/vite.config.js +++ b/playground/ssr-noexternal/vite.config.js @@ -6,17 +6,17 @@ export default defineConfig({ noExternal: ['@vitejs/require-external-cjs'], external: ['@vitejs/external-cjs'], optimizeDeps: { - disabled: false - } + disabled: false, + }, }, build: { target: 'esnext', minify: false, rollupOptions: { - external: ['@vitejs/external-cjs'] + external: ['@vitejs/external-cjs'], }, commonjsOptions: { - include: [] - } - } + include: [], + }, + }, }) diff --git a/playground/ssr-pug/__tests__/serve.ts b/playground/ssr-pug/__tests__/serve.ts index 35ae326964b486..715c38e99801ad 100644 --- a/playground/ssr-pug/__tests__/serve.ts +++ b/playground/ssr-pug/__tests__/serve.ts @@ -25,7 +25,7 @@ export async function serve(): Promise<{ close(): Promise }> { if (vite) { await vite.close() } - } + }, }) }) } catch (e) { diff --git a/playground/ssr-pug/__tests__/ssr-pug.spec.ts b/playground/ssr-pug/__tests__/ssr-pug.spec.ts index f29b0ac33cf5d8..06074172f7ed1d 100644 --- a/playground/ssr-pug/__tests__/ssr-pug.spec.ts +++ b/playground/ssr-pug/__tests__/ssr-pug.spec.ts @@ -9,7 +9,7 @@ describe('injected inline scripts', () => { test('no injected inline scripts are present', async () => { await page.goto(url) const inlineScripts = await page.$$eval('script', (nodes) => - nodes.filter((n) => !n.getAttribute('src') && n.innerHTML) + nodes.filter((n) => !n.getAttribute('src') && n.innerHTML), ) expect(inlineScripts).toHaveLength(0) }) @@ -23,14 +23,14 @@ describe('injected inline scripts', () => { if (!src) return false return src.includes('?html-proxy&index') }) - .map((n) => n.getAttribute('src')) + .map((n) => n.getAttribute('src')), ) // assert at least 1 proxied script exists expect(proxiedScripts).not.toHaveLength(0) const scriptContents = await Promise.all( - proxiedScripts.map((src) => fetch(url + src).then((res) => res.text())) + proxiedScripts.map((src) => fetch(url + src).then((res) => res.text())), ) // all proxied scripts return code diff --git a/playground/ssr-pug/server.js b/playground/ssr-pug/server.js index 64fc87dc95589f..222b51ae216638 100644 --- a/playground/ssr-pug/server.js +++ b/playground/ssr-pug/server.js @@ -36,13 +36,13 @@ export async function createServer(root = process.cwd(), hmrPort) { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, - interval: 100 + interval: 100, }, hmr: { - port: hmrPort - } + port: hmrPort, + }, }, - appType: 'custom' + appType: 'custom', }) // use vite's connect instance as middleware app.use(vite.middlewares) @@ -73,6 +73,6 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/ssr-resolve/vite.config.js b/playground/ssr-resolve/vite.config.js index 430c2331977703..206485d1088b8c 100644 --- a/playground/ssr-resolve/vite.config.js +++ b/playground/ssr-resolve/vite.config.js @@ -2,6 +2,6 @@ import { defineConfig } from 'vite' export default defineConfig({ build: { - ssr: './main.js' - } + ssr: './main.js', + }, }) diff --git a/playground/ssr-webworker/__tests__/serve.ts b/playground/ssr-webworker/__tests__/serve.ts index 0013d19769c299..8159cf39734510 100644 --- a/playground/ssr-webworker/__tests__/serve.ts +++ b/playground/ssr-webworker/__tests__/serve.ts @@ -21,8 +21,8 @@ export async function serve(): Promise<{ close(): Promise }> { build: { target: 'esnext', ssr: 'src/entry-worker.jsx', - outDir: 'dist/worker' - } + outDir: 'dist/worker', + }, }) const { createServer } = await import(path.resolve(rootDir, 'worker.js')) @@ -37,7 +37,7 @@ export async function serve(): Promise<{ close(): Promise }> { await new Promise((resolve) => { server.close(resolve) }) - } + }, }) }) } catch (e) { diff --git a/playground/ssr-webworker/src/entry-worker.jsx b/playground/ssr-webworker/src/entry-worker.jsx index 750926653f9e31..c5868fc229a137 100644 --- a/playground/ssr-webworker/src/entry-worker.jsx +++ b/playground/ssr-webworker/src/entry-worker.jsx @@ -17,9 +17,9 @@ addEventListener('fetch', function (event) { `, { headers: { - 'content-type': 'text/html' - } - } - ) + 'content-type': 'text/html', + }, + }, + ), ) }) diff --git a/playground/ssr-webworker/vite.config.js b/playground/ssr-webworker/vite.config.js index 3a476198813c35..af2b208bd4f3c2 100644 --- a/playground/ssr-webworker/vite.config.js +++ b/playground/ssr-webworker/vite.config.js @@ -2,33 +2,33 @@ import { defineConfig } from 'vite' export default defineConfig({ build: { - minify: false + minify: false, }, resolve: { - dedupe: ['react'] + dedupe: ['react'], }, ssr: { target: 'webworker', - noExternal: ['this-should-be-replaced-by-the-boolean'] + noExternal: ['this-should-be-replaced-by-the-boolean'], }, plugins: [ { config() { return { ssr: { - noExternal: true - } + noExternal: true, + }, } - } + }, }, { config() { return { ssr: { - noExternal: ['this-should-not-replace-the-boolean'] - } + noExternal: ['this-should-not-replace-the-boolean'], + }, } - } - } - ] + }, + }, + ], }) diff --git a/playground/ssr-webworker/worker.js b/playground/ssr-webworker/worker.js index d353688b0575eb..0f4d723a32c454 100644 --- a/playground/ssr-webworker/worker.js +++ b/playground/ssr-webworker/worker.js @@ -8,7 +8,7 @@ const isTest = !!process.env.TEST export async function createServer() { const mf = new Miniflare({ - scriptPath: path.resolve(__dirname, 'dist/worker/entry-worker.js') + scriptPath: path.resolve(__dirname, 'dist/worker/entry-worker.js'), }) const app = mf.createServer() @@ -20,6 +20,6 @@ if (!isTest) { createServer().then(({ app }) => app.listen(5173, () => { console.log('http://localhost:5173') - }) + }), ) } diff --git a/playground/tailwind-sourcemap/postcss.config.js b/playground/tailwind-sourcemap/postcss.config.js index ad6adc688915c1..1f45e3e358ac0b 100644 --- a/playground/tailwind-sourcemap/postcss.config.js +++ b/playground/tailwind-sourcemap/postcss.config.js @@ -2,6 +2,6 @@ console.log(__dirname + '/tailwind.config.js') module.exports = { plugins: { - tailwindcss: { config: __dirname + '/tailwind.config.js' } - } + tailwindcss: { config: __dirname + '/tailwind.config.js' }, + }, } diff --git a/playground/tailwind-sourcemap/tailwind.config.js b/playground/tailwind-sourcemap/tailwind.config.js index f89a536ccd742f..dd95de6c830d45 100644 --- a/playground/tailwind-sourcemap/tailwind.config.js +++ b/playground/tailwind-sourcemap/tailwind.config.js @@ -1,7 +1,7 @@ module.exports = { content: ['./index.html'], theme: { - extend: {} + extend: {}, }, - plugins: [] + plugins: [], } diff --git a/playground/tailwind-sourcemap/vite.config.js b/playground/tailwind-sourcemap/vite.config.js index 70fea77247bcd4..36815996e19f3d 100644 --- a/playground/tailwind-sourcemap/vite.config.js +++ b/playground/tailwind-sourcemap/vite.config.js @@ -3,9 +3,9 @@ */ module.exports = { css: { - devSourcemap: true + devSourcemap: true, }, build: { - sourcemap: true - } + sourcemap: true, + }, } diff --git a/playground/tailwind/__test__/tailwind.spec.ts b/playground/tailwind/__test__/tailwind.spec.ts index 64261d630b09d9..a95fd347cd75eb 100644 --- a/playground/tailwind/__test__/tailwind.spec.ts +++ b/playground/tailwind/__test__/tailwind.spec.ts @@ -6,7 +6,7 @@ import { isBuild, page, untilBrowserLogAfter, - untilUpdated + untilUpdated, } from '~utils' test('should render', async () => { @@ -22,26 +22,26 @@ if (!isBuild) { await untilBrowserLogAfter( () => editFile('src/views/Page.vue', (code) => - code.replace('|Page title|', '|Page title updated|') + code.replace('|Page title|', '|Page title updated|'), ), [ '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/views/Page.vue' + '[vite] hot updated: /src/views/Page.vue', ], - true + true, ) await untilUpdated(() => el.textContent(), '|Page title updated|') await untilBrowserLogAfter( () => editFile('src/components/HelloWorld.vue', (code) => - code.replace('text-gray-800', 'text-[rgb(10,20,30)]') + code.replace('text-gray-800', 'text-[rgb(10,20,30)]'), ), [ '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/components/HelloWorld.vue' + '[vite] hot updated: /src/components/HelloWorld.vue', ], - true + true, ) await untilUpdated(() => getColor(el2), 'rgb(10, 20, 30)') }) @@ -53,13 +53,13 @@ if (!isBuild) { await untilBrowserLogAfter( () => editFile('src/App.vue', (code) => - code.replace('text-black', 'text-[rgb(11,22,33)]') + code.replace('text-black', 'text-[rgb(11,22,33)]'), ), [ '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/App.vue' + '[vite] hot updated: /src/App.vue', ], - true + true, ) await untilUpdated(() => getColor(el), 'rgb(11, 22, 33)') }) @@ -71,12 +71,12 @@ if (!isBuild) { await untilBrowserLogAfter( () => editFile('src/components/PugTemplate.vue', (code) => - code.replace('bg-red-400', 'bg-red-600') + code.replace('bg-red-400', 'bg-red-600'), ), [ '[vite] css hot updated: /index.css', - '[vite] hot updated: /src/components/PugTemplate.vue?vue&type=template&lang.js' - ] + '[vite] hot updated: /src/components/PugTemplate.vue?vue&type=template&lang.js', + ], ) await untilUpdated(() => getBgColor(el), 'rgb(220, 38, 38)') }) diff --git a/playground/tailwind/postcss.config.ts b/playground/tailwind/postcss.config.ts index 381d8cbd107f81..065645ac26db0c 100644 --- a/playground/tailwind/postcss.config.ts +++ b/playground/tailwind/postcss.config.ts @@ -2,6 +2,6 @@ module.exports = { plugins: { tailwindcss: { config: __dirname + '/tailwind.config.js' }, - autoprefixer: {} - } + autoprefixer: {}, + }, } diff --git a/playground/tailwind/src/router.ts b/playground/tailwind/src/router.ts index 2a8c3cd0dd966f..10e3980cb07cb8 100644 --- a/playground/tailwind/src/router.ts +++ b/playground/tailwind/src/router.ts @@ -8,9 +8,9 @@ const router = createRouter({ routes: [ { path: '/', - component: Page - } - ] + component: Page, + }, + ], }) export default router diff --git a/playground/tailwind/src/views/Page.vue b/playground/tailwind/src/views/Page.vue index 12fc2605339f1d..76f8aabf13d7d3 100644 --- a/playground/tailwind/src/views/Page.vue +++ b/playground/tailwind/src/views/Page.vue @@ -26,8 +26,8 @@ export default defineComponent({ return { name, - val + val, } - } + }, }) diff --git a/playground/tailwind/tailwind.config.js b/playground/tailwind/tailwind.config.js index d346b0549e2b35..5b9644f4f646d5 100644 --- a/playground/tailwind/tailwind.config.js +++ b/playground/tailwind/tailwind.config.js @@ -3,13 +3,13 @@ module.exports = { // Before editing this section, make sure no paths are matching with `/src/App.vue` // Look https://github.com/vitejs/vite/pull/6959 for more details __dirname + '/src/{components,views}/**/*.vue', - __dirname + '/src/App.vue' + __dirname + '/src/App.vue', ], theme: { - extend: {} + extend: {}, }, variants: { - extend: {} + extend: {}, }, - plugins: [] + plugins: [], } diff --git a/playground/tailwind/vite.config.ts b/playground/tailwind/vite.config.ts index ea895225460d48..d3680f6c39c3e3 100644 --- a/playground/tailwind/vite.config.ts +++ b/playground/tailwind/vite.config.ts @@ -4,17 +4,17 @@ import vue from '@vitejs/plugin-vue' export default defineConfig({ resolve: { alias: { - '/@': __dirname - } + '/@': __dirname, + }, }, plugins: [vue()], build: { // to make tests faster - minify: false + minify: false, }, server: { // This option caused issues with HMR, // although it should not affect the build - origin: 'http://localhost:8080' - } + origin: 'http://localhost:8080', + }, }) diff --git a/playground/test-utils.ts b/playground/test-utils.ts index 80e04bffb8bd02..d2aafaff4b2aca 100644 --- a/playground/test-utils.ts +++ b/playground/test-utils.ts @@ -29,14 +29,14 @@ export const ports = { 'ssr-webworker': 9606, 'css/postcss-caching': 5005, 'css/postcss-plugins-different-dir': 5006, - 'css/dynamic-import': 5007 + 'css/dynamic-import': 5007, } export const hmrPorts = { 'optimize-missing-deps': 24680, 'ssr-deps': 24681, 'ssr-html': 24682, 'ssr-noexternal': 24683, - 'ssr-pug': 24684 + 'ssr-pug': 24684, } const hexToNameMap: Record = {} @@ -96,7 +96,7 @@ export function readFile(filename: string): string { export function editFile( filename: string, replacer: (str: string) => string, - runInBuild: boolean = false + runInBuild: boolean = false, ): void { if (isBuild && !runInBuild) return filename = path.resolve(testDir, filename) @@ -121,7 +121,7 @@ export function listAssets(base = ''): string[] { export function findAssetFile( match: string | RegExp, base = '', - assets = 'assets' + assets = 'assets', ): string { const assetsDir = path.join(testDir, 'dist', base, assets) let files: string[] @@ -141,7 +141,7 @@ export function findAssetFile( export function readManifest(base = ''): Manifest { return JSON.parse( - fs.readFileSync(path.join(testDir, 'dist', base, 'manifest.json'), 'utf-8') + fs.readFileSync(path.join(testDir, 'dist', base, 'manifest.json'), 'utf-8'), ) } @@ -151,7 +151,7 @@ export function readManifest(base = ''): Manifest { export async function untilUpdated( poll: () => string | Promise, expected: string, - runInBuild = false + runInBuild = false, ): Promise { if (isBuild && !runInBuild) return const maxTries = process.env.CI ? 200 : 50 @@ -171,7 +171,7 @@ export async function untilUpdated( */ export async function withRetry( func: () => Promise, - runInBuild = false + runInBuild = false, ): Promise { if (isBuild && !runInBuild) return const maxTries = process.env.CI ? 200 : 50 @@ -191,18 +191,18 @@ export async function untilBrowserLogAfter( operation: () => any, target: string | RegExp | Array, expectOrder?: boolean, - callback?: UntilBrowserLogAfterCallback + callback?: UntilBrowserLogAfterCallback, ): Promise export async function untilBrowserLogAfter( operation: () => any, target: string | RegExp | Array, - callback?: UntilBrowserLogAfterCallback + callback?: UntilBrowserLogAfterCallback, ): Promise export async function untilBrowserLogAfter( operation: () => any, target: string | RegExp | Array, arg3?: boolean | UntilBrowserLogAfterCallback, - arg4?: UntilBrowserLogAfterCallback + arg4?: UntilBrowserLogAfterCallback, ): Promise { const expectOrder = typeof arg3 === 'boolean' ? arg3 : false const callback = typeof arg3 === 'boolean' ? arg4 : arg3 @@ -218,7 +218,7 @@ export async function untilBrowserLogAfter( async function untilBrowserLog( target?: string | RegExp | Array, - expectOrder = true + expectOrder = true, ): Promise { let resolve: () => void let reject: (reason: any) => void @@ -249,7 +249,7 @@ async function untilBrowserLog( const remainingMatchers = target.map(isMatch) processMsg = (text: string) => { const nextIndex = remainingMatchers.findIndex((matcher) => - matcher(text) + matcher(text), ) if (nextIndex >= 0) { remainingMatchers.splice(nextIndex, 1) @@ -300,7 +300,7 @@ export const formatSourcemapForSnapshot = (map: any): any => { // helper function to kill process, uses taskkill on windows to ensure child process is killed too export async function killProcess( - serverProcess: ExecaChildProcess + serverProcess: ExecaChildProcess, ): Promise { if (isWindows) { try { diff --git a/playground/transform-plugin/vite.config.js b/playground/transform-plugin/vite.config.js index 0b9ddb97c34304..b451ca77d6a398 100644 --- a/playground/transform-plugin/vite.config.js +++ b/playground/transform-plugin/vite.config.js @@ -17,9 +17,9 @@ const transformPlugin = { ${code} ` } - } + }, } module.exports = { - plugins: [transformPlugin] + plugins: [transformPlugin], } diff --git a/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts b/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts index 3ccc857c1f8a5b..5b3a0dfcd98138 100644 --- a/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts +++ b/playground/tsconfig-json-load-error/__tests__/tsconfig-json-load-error.spec.ts @@ -7,14 +7,14 @@ import { isServe, page, readFile, - untilUpdated + untilUpdated, } from '~utils' describe.runIf(isBuild)('build', () => { test('should throw an error on build', () => { expect(serveError).toBeTruthy() expect(serveError.message).toMatch( - /^parsing .* failed: SyntaxError: Unexpected token \} in JSON at position \d+$/ + /^parsing .* failed: SyntaxError: Unexpected token \} in JSON at position \d+$/, ) clearServeError() // got expected error, null it here so testsuite does not fail from rethrow in afterAll }) @@ -46,7 +46,7 @@ describe.runIf(isServe)('server', () => { }) // use regex with variable filename and position values because they are different on win expect(message).toMatch( - /^parsing .* failed: SyntaxError: Unexpected token \} in JSON at position \d+$/ + /^parsing .* failed: SyntaxError: Unexpected token \} in JSON at position \d+$/, ) }) diff --git a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts index f447174cf43f23..a5e2dd47d191cd 100644 --- a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts +++ b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts @@ -28,9 +28,9 @@ describe('transformWithEsbuild', () => { const result = await transformWithEsbuild(mainContent, main, { tsconfigRaw: { compilerOptions: { - useDefineForClassFields: false - } - } + useDefineForClassFields: false, + }, + }, }) // "importsNotUsedAsValues": "preserve" from tsconfig.json should still work expect(result.code).toContain('import "./not-used-type";') @@ -44,7 +44,7 @@ describe('transformWithEsbuild', () => { "compilerOptions": { "useDefineForClassFields": false } - }` + }`, }) // "importsNotUsedAsValues": "preserve" from tsconfig.json should not be read // and defaults to "remove" @@ -58,13 +58,13 @@ describe('transformWithEsbuild', () => { tsconfigRaw: { compilerOptions: { useDefineForClassFields: false, - preserveValueImports: true - } - } + preserveValueImports: true, + }, + }, }) // "importsNotUsedAsValues": "preserve" from tsconfig.json should still work expect(result.code).toContain( - 'import { MainTypeOnlyClass } from "./not-used-type";' + 'import { MainTypeOnlyClass } from "./not-used-type";', ) }) }) diff --git a/playground/vitestGlobalSetup.ts b/playground/vitestGlobalSetup.ts index 69430aaf3c3b38..7a63d6d12cc7ee 100644 --- a/playground/vitestGlobalSetup.ts +++ b/playground/vitestGlobalSetup.ts @@ -17,7 +17,7 @@ export async function setup(): Promise { headless: !process.env.VITE_DEBUG_SERVE, args: process.env.CI ? ['--no-sandbox', '--disable-setuid-sandbox'] - : undefined + : undefined, }) await fs.mkdirp(DIR) @@ -32,12 +32,12 @@ export async function setup(): Promise { filter(file) { file = file.replace(/\\/g, '/') return !file.includes('__tests__') && !file.match(/dist(\/|$)/) - } + }, }) .catch(async (error) => { if (error.code === 'EPERM' && error.syscall === 'symlink') { throw new Error( - 'Could not create symlinks. On Windows, consider activating Developer Mode to allow non-admin users to create symlinks by following the instructions at https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development.' + 'Could not create symlinks. On Windows, consider activating Developer Mode to allow non-admin users to create symlinks by following the instructions at https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development.', ) } else { throw error diff --git a/playground/vitestSetup.ts b/playground/vitestSetup.ts index e768f898caf58e..4a43252a0e251b 100644 --- a/playground/vitestSetup.ts +++ b/playground/vitestSetup.ts @@ -9,14 +9,14 @@ import type { PluginOption, ResolvedConfig, UserConfig, - ViteDevServer + ViteDevServer, } from 'vite' import { build, createServer, loadConfigFromFile, mergeConfig, - preview + preview, } from 'vite' import type { Browser, Page } from 'playwright-chromium' import type { RollupError, RollupWatcher, RollupWatcherEvent } from 'rollup' @@ -32,7 +32,7 @@ export const isServe = !isBuild export const isWindows = process.platform === 'win32' export const viteBinPath = path.posix.join( workspaceRoot, - 'packages/vite/bin/vite.js' + 'packages/vite/bin/vite.js', ) // #endregion @@ -151,7 +151,7 @@ beforeAll(async (s) => { const testCustomServe = [ resolve(dirname(testPath), 'serve.ts'), - resolve(dirname(testPath), 'serve.js') + resolve(dirname(testPath), 'serve.js'), ].find((i) => fs.existsSync(i)) if (testCustomServe) { @@ -196,10 +196,10 @@ function loadConfigFromDir(dir: string) { return loadConfigFromFile( { command: isBuild ? 'build' : 'serve', - mode: isBuild ? 'production' : 'development' + mode: isBuild ? 'production' : 'development', }, undefined, - dir + dir, ) } @@ -227,21 +227,21 @@ export async function startDefaultServe(): Promise { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, - interval: 100 + interval: 100, }, host: true, fs: { - strict: !isBuild - } + strict: !isBuild, + }, }, build: { // esbuild do not minify ES lib output since that would remove pure annotations and break tree-shaking // skip transpilation during tests to make it faster target: 'esnext', // tests are flaky when `emptyOutDir` is `true` - emptyOutDir: false + emptyOutDir: false, }, - customLogger: createInMemoryLogger(serverLogs) + customLogger: createInMemoryLogger(serverLogs), } setupConsoleWarnCollector(serverLogs) @@ -264,7 +264,7 @@ export async function startDefaultServe(): Promise { name: 'vite-plugin-watcher', configResolved(config) { resolvedConfig = config - } + }, }) options.plugins = [resolvedPlugin()] const testConfig = mergeConfig(options, config || {}) @@ -294,7 +294,7 @@ export async function startDefaultServe(): Promise { * Send the rebuild complete message in build watch */ export async function notifyRebuildComplete( - watcher: RollupWatcher + watcher: RollupWatcher, ): Promise { let resolveFn: undefined | (() => void) const callback = (event: RollupWatcherEvent): void => { @@ -335,7 +335,7 @@ function createInMemoryLogger(logs: string[]): Logger { if (opts?.error) { loggedErrors.add(opts.error) } - } + }, } return logger diff --git a/playground/wasm/__tests__/wasm.spec.ts b/playground/wasm/__tests__/wasm.spec.ts index 07f383d2eb8b48..49df35d35c7652 100644 --- a/playground/wasm/__tests__/wasm.spec.ts +++ b/playground/wasm/__tests__/wasm.spec.ts @@ -15,13 +15,13 @@ test('init function returns WebAssembly.Instance', async () => { await page.click('.init-returns-instance .run') await untilUpdated( () => page.textContent('.init-returns-instance .result'), - 'true' + 'true', ) }) test('?url', async () => { expect(await page.textContent('.url')).toMatch( - isBuild ? 'data:application/wasm' : '/light.wasm' + isBuild ? 'data:application/wasm' : '/light.wasm', ) }) diff --git a/playground/wasm/index.html b/playground/wasm/index.html index 2af0fda6847f2f..5eb5f9b532183e 100644 --- a/playground/wasm/index.html +++ b/playground/wasm/index.html @@ -41,8 +41,8 @@

worker wasm

async function testWasm(init, resultElement) { const { exported_func } = await init({ imports: { - imported_func: (res) => (resultElement.textContent = res) - } + imported_func: (res) => (resultElement.textContent = res), + }, }).then((i) => i.exports) exported_func() } @@ -54,13 +54,13 @@

worker wasm

document .querySelector('.inline-wasm .run') .addEventListener('click', async () => - testWasm(light, document.querySelector('.inline-wasm .result')) + testWasm(light, document.querySelector('.inline-wasm .result')), ) document .querySelector('.output-wasm .run') .addEventListener('click', async () => - testWasm(heavy, document.querySelector('.output-wasm .result')) + testWasm(heavy, document.querySelector('.output-wasm .result')), ) document @@ -68,12 +68,12 @@

worker wasm

.addEventListener('click', async () => { const res = await light({ imports: { - imported_func: (res) => (resultElement.textContent = res) - } + imported_func: (res) => (resultElement.textContent = res), + }, }) text( '.init-returns-instance .result', - res instanceof WebAssembly.Instance + res instanceof WebAssembly.Instance, ) }) diff --git a/playground/wasm/vite.config.ts b/playground/wasm/vite.config.ts index e52df8dc66c386..8c07ac5fd8bd34 100644 --- a/playground/wasm/vite.config.ts +++ b/playground/wasm/vite.config.ts @@ -3,6 +3,6 @@ export default defineConfig({ build: { // make cannot emit light.wasm // and emit add.wasm - assetsInlineLimit: 80 - } + assetsInlineLimit: 80, + }, }) diff --git a/playground/worker/__tests__/es/es-worker.spec.ts b/playground/worker/__tests__/es/es-worker.spec.ts index 8a890a3cd81332..39b4baddc61d31 100644 --- a/playground/worker/__tests__/es/es-worker.spec.ts +++ b/playground/worker/__tests__/es/es-worker.spec.ts @@ -8,17 +8,17 @@ test('normal', async () => { await untilUpdated( () => page.textContent('.mode'), process.env.NODE_ENV, - true + true, ) await untilUpdated( () => page.textContent('.bundle-with-plugin'), 'worker bundle with plugin success!', - true + true, ) await untilUpdated( () => page.textContent('.asset-url'), isBuild ? '/es/assets/worker_asset-vite.svg' : '/es/vite.svg', - true + true, ) }) @@ -38,17 +38,17 @@ test('worker emitted and import.meta.url in nested worker (serve)', async () => await untilUpdated( () => page.textContent('.nested-worker'), 'worker-nested-worker', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-module'), 'sub-worker', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), '"type":"constructor"', - true + true, ) }) @@ -63,7 +63,7 @@ describe.runIf(isBuild)('build', () => { const worker = files.find((f) => f.includes('my-worker')) const workerContent = fs.readFileSync( path.resolve(assetsDir, worker), - 'utf-8' + 'utf-8', ) // worker should have all imports resolved and no exports @@ -81,12 +81,12 @@ describe.runIf(isBuild)('build', () => { await untilUpdated( () => page.textContent('.nested-worker-module'), '"type":"module"', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), '"type":"constructor"', - true + true, ) }) }) @@ -95,17 +95,17 @@ test('module worker', async () => { await untilUpdated( () => page.textContent('.worker-import-meta-url'), 'A string', - true + true, ) await untilUpdated( () => page.textContent('.worker-import-meta-url-resolve'), 'A string', - true + true, ) await untilUpdated( () => page.textContent('.shared-worker-import-meta-url'), 'A string', - true + true, ) }) @@ -113,12 +113,12 @@ test('classic worker', async () => { await untilUpdated( () => page.textContent('.classic-worker'), 'A classic', - true + true, ) await untilUpdated( () => page.textContent('.classic-shared-worker'), 'A classic', - true + true, ) }) @@ -126,12 +126,12 @@ test('emit chunk', async () => { await untilUpdated( () => page.textContent('.emit-chunk-worker'), '["A string",{"type":"emit-chunk-sub-worker","data":"A string"},{"type":"module-and-worker:worker","data":"A string"},{"type":"module-and-worker:module","data":"module and worker"},{"type":"emit-chunk-sub-worker","data":{"module":"module and worker","msg1":"module1","msg2":"module2","msg3":"module3"}}]', - true + true, ) await untilUpdated( () => page.textContent('.emit-chunk-dynamic-import-worker'), '"A string/es/"', - true + true, ) }) @@ -139,7 +139,7 @@ test('url query worker', async () => { await untilUpdated( () => page.textContent('.simple-worker-url'), 'Hello from simple worker!', - true + true, ) }) @@ -147,7 +147,7 @@ test('import.meta.glob in worker', async () => { await untilUpdated( () => page.textContent('.importMetaGlob-worker'), '["', - true + true, ) }) @@ -155,6 +155,6 @@ test('import.meta.glob with eager in worker', async () => { await untilUpdated( () => page.textContent('.importMetaGlobEager-worker'), '["', - true + true, ) }) diff --git a/playground/worker/__tests__/iife/iife-worker.spec.ts b/playground/worker/__tests__/iife/iife-worker.spec.ts index 269f491eced410..5e81c84a777985 100644 --- a/playground/worker/__tests__/iife/iife-worker.spec.ts +++ b/playground/worker/__tests__/iife/iife-worker.spec.ts @@ -8,12 +8,12 @@ test('normal', async () => { await untilUpdated(() => page.textContent('.mode'), process.env.NODE_ENV) await untilUpdated( () => page.textContent('.bundle-with-plugin'), - 'worker bundle with plugin success!' + 'worker bundle with plugin success!', ) await untilUpdated( () => page.textContent('.asset-url'), isBuild ? '/iife/assets/worker_asset-vite.svg' : '/iife/vite.svg', - true + true, ) }) @@ -33,11 +33,11 @@ test('worker emitted and import.meta.url in nested worker (serve)', async () => await untilUpdated(() => page.textContent('.nested-worker'), '/worker-nested') await untilUpdated( () => page.textContent('.nested-worker-module'), - '/sub-worker' + '/sub-worker', ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), - '"type":"constructor"' + '"type":"constructor"', ) }) @@ -52,7 +52,7 @@ describe.runIf(isBuild)('build', () => { const worker = files.find((f) => f.includes('my-worker')) const workerContent = fs.readFileSync( path.resolve(assetsDir, worker), - 'utf-8' + 'utf-8', ) // worker should have all imports resolved and no exports @@ -69,11 +69,11 @@ describe.runIf(isBuild)('build', () => { test('worker emitted and import.meta.url in nested worker (build)', async () => { await untilUpdated( () => page.textContent('.nested-worker-module'), - '"type":"module"' + '"type":"module"', ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), - '"type":"constructor"' + '"type":"constructor"', ) }) }) @@ -81,15 +81,15 @@ describe.runIf(isBuild)('build', () => { test('module worker', async () => { await untilUpdated( () => page.textContent('.worker-import-meta-url'), - 'A string' + 'A string', ) await untilUpdated( () => page.textContent('.worker-import-meta-url-resolve'), - 'A string' + 'A string', ) await untilUpdated( () => page.textContent('.shared-worker-import-meta-url'), - 'A string' + 'A string', ) }) @@ -97,20 +97,20 @@ test('classic worker', async () => { await untilUpdated(() => page.textContent('.classic-worker'), 'A classic') await untilUpdated( () => page.textContent('.classic-shared-worker'), - 'A classic' + 'A classic', ) }) test('url query worker', async () => { await untilUpdated( () => page.textContent('.simple-worker-url'), - 'Hello from simple worker!' + 'Hello from simple worker!', ) }) test('import.meta.glob eager in worker', async () => { await untilUpdated( () => page.textContent('.importMetaGlobEager-worker'), - '["' + '["', ) }) diff --git a/playground/worker/__tests__/relative-base/relative-base-worker.spec.ts b/playground/worker/__tests__/relative-base/relative-base-worker.spec.ts index d38ced41d3c6e9..db8284a46b2863 100644 --- a/playground/worker/__tests__/relative-base/relative-base-worker.spec.ts +++ b/playground/worker/__tests__/relative-base/relative-base-worker.spec.ts @@ -8,17 +8,17 @@ test('normal', async () => { await untilUpdated( () => page.textContent('.mode'), process.env.NODE_ENV, - true + true, ) await untilUpdated( () => page.textContent('.bundle-with-plugin'), 'worker bundle with plugin success!', - true + true, ) await untilUpdated( () => page.textContent('.asset-url'), isBuild ? '/worker-assets/worker_asset-vite' : '/vite.svg', - true + true, ) }) @@ -39,17 +39,17 @@ test('worker emitted and import.meta.url in nested worker (serve)', async () => await untilUpdated( () => page.textContent('.nested-worker'), 'worker-nested-worker', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-module'), 'sub-worker', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), '"type":"constructor"', - true + true, ) }) @@ -62,13 +62,13 @@ describe.runIf(isBuild)('build', () => { const content = fs.readFileSync(path.resolve(chunksDir, index), 'utf-8') const workerEntriesDir = path.resolve( testDir, - 'dist/relative-base/worker-entries' + 'dist/relative-base/worker-entries', ) const workerFiles = fs.readdirSync(workerEntriesDir) const worker = workerFiles.find((f) => f.includes('worker_entry-my-worker')) const workerContent = fs.readFileSync( path.resolve(workerEntriesDir, worker), - 'utf-8' + 'utf-8', ) // worker should have all imports resolved and no exports @@ -86,12 +86,12 @@ describe.runIf(isBuild)('build', () => { await untilUpdated( () => page.textContent('.nested-worker-module'), '"type":"module"', - true + true, ) await untilUpdated( () => page.textContent('.nested-worker-constructor'), '"type":"constructor"', - true + true, ) }) }) @@ -100,7 +100,7 @@ test('module worker', async () => { await untilUpdated( () => page.textContent('.shared-worker-import-meta-url'), 'A string', - true + true, ) }) @@ -108,12 +108,12 @@ test.runIf(isBuild)('classic worker', async () => { await untilUpdated( () => page.textContent('.classic-worker'), 'A classic', - true + true, ) await untilUpdated( () => page.textContent('.classic-shared-worker'), 'A classic', - true + true, ) }) @@ -121,12 +121,12 @@ test.runIf(isBuild)('emit chunk', async () => { await untilUpdated( () => page.textContent('.emit-chunk-worker'), '["A string",{"type":"emit-chunk-sub-worker","data":"A string"},{"type":"module-and-worker:worker","data":"A string"},{"type":"module-and-worker:module","data":"module and worker"},{"type":"emit-chunk-sub-worker","data":{"module":"module and worker","msg1":"module1","msg2":"module2","msg3":"module3"}}]', - true + true, ) await untilUpdated( () => page.textContent('.emit-chunk-dynamic-import-worker'), '"A string./"', - true + true, ) }) @@ -134,7 +134,7 @@ test('import.meta.glob in worker', async () => { await untilUpdated( () => page.textContent('.importMetaGlob-worker'), '["', - true + true, ) }) @@ -142,6 +142,6 @@ test('import.meta.glob with eager in worker', async () => { await untilUpdated( () => page.textContent('.importMetaGlobEager-worker'), '["', - true + true, ) }) diff --git a/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts b/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts index 38e55199121489..afcb51af117729 100644 --- a/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap-hidden/sourcemap-hidden-worker.spec.ts @@ -17,57 +17,57 @@ describe.runIf(isBuild)('build', () => { const worker = files.find((f) => /^my-worker-\w+\.js$/.test(f)) const workerContent = fs.readFileSync( path.resolve(assetsDir, worker), - 'utf-8' + 'utf-8', ) const workerSourcemap = getSourceMapUrl(workerContent) const sharedWorker = files.find((f) => /^my-shared-worker-\w+\.js$/.test(f)) const sharedWorkerContent = fs.readFileSync( path.resolve(assetsDir, sharedWorker), - 'utf-8' + 'utf-8', ) const sharedWorkerSourcemap = getSourceMapUrl(sharedWorkerContent) const possibleTsOutputWorker = files.find((f) => - /^possible-ts-output-worker-\w+\.js$/.test(f) + /^possible-ts-output-worker-\w+\.js$/.test(f), ) const possibleTsOutputWorkerContent = fs.readFileSync( path.resolve(assetsDir, possibleTsOutputWorker), - 'utf-8' + 'utf-8', ) const possibleTsOutputWorkerSourcemap = getSourceMapUrl( - possibleTsOutputWorkerContent + possibleTsOutputWorkerContent, ) const workerNestedWorker = files.find((f) => - /^worker-nested-worker-\w+\.js$/.test(f) + /^worker-nested-worker-\w+\.js$/.test(f), ) const workerNestedWorkerContent = fs.readFileSync( path.resolve(assetsDir, workerNestedWorker), - 'utf-8' + 'utf-8', ) const workerNestedWorkerSourcemap = getSourceMapUrl( - workerNestedWorkerContent + workerNestedWorkerContent, ) const subWorker = files.find((f) => /^sub-worker-\w+\.js$/.test(f)) const subWorkerContent = fs.readFileSync( path.resolve(assetsDir, subWorker), - 'utf-8' + 'utf-8', ) const subWorkerSourcemap = getSourceMapUrl(subWorkerContent) expect(files).toContainEqual(expect.stringMatching(/^index-\w+\.js\.map$/)) expect(files).toContainEqual( - expect.stringMatching(/^my-worker-\w+\.js\.map$/) + expect.stringMatching(/^my-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^my-shared-worker-\w+\.js\.map$/) + expect.stringMatching(/^my-shared-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^possible-ts-output-worker-\w+\.js\.map$/) + expect.stringMatching(/^possible-ts-output-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^worker-nested-worker-\w+\.js\.map$/) + expect.stringMatching(/^worker-nested-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^sub-worker-\w+\.js\.map$/) + expect.stringMatching(/^sub-worker-\w+\.js\.map$/), ) // sourcemap should exist and have a data URL @@ -88,17 +88,17 @@ describe.runIf(isBuild)('build', () => { // chunk expect(content).toMatch( - `new Worker("/iife-sourcemap-hidden/assets/my-worker` + `new Worker("/iife-sourcemap-hidden/assets/my-worker`, ) expect(content).toMatch(`new Worker("data:application/javascript;base64`) expect(content).toMatch( - `new Worker("/iife-sourcemap-hidden/assets/possible-ts-output-worker` + `new Worker("/iife-sourcemap-hidden/assets/possible-ts-output-worker`, ) expect(content).toMatch( - `new Worker("/iife-sourcemap-hidden/assets/worker-nested-worker` + `new Worker("/iife-sourcemap-hidden/assets/worker-nested-worker`, ) expect(content).toMatch( - `new SharedWorker("/iife-sourcemap-hidden/assets/my-shared-worker` + `new SharedWorker("/iife-sourcemap-hidden/assets/my-shared-worker`, ) // inlined @@ -106,7 +106,7 @@ describe.runIf(isBuild)('build', () => { expect(content).toMatch(`window.Blob`) expect(workerNestedWorkerContent).toMatch( - `new Worker("/iife-sourcemap-hidden/assets/sub-worker` + `new Worker("/iife-sourcemap-hidden/assets/sub-worker`, ) }) }) diff --git a/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts b/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts index 5f6aebd5917119..34c2498d8f72cc 100644 --- a/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap-inline/sourcemap-inline-worker.spec.ts @@ -17,39 +17,39 @@ describe.runIf(isBuild)('build', () => { const worker = files.find((f) => /^my-worker-\w+\.js$/.test(f)) const workerContent = fs.readFileSync( path.resolve(assetsDir, worker), - 'utf-8' + 'utf-8', ) const workerSourcemap = getSourceMapUrl(workerContent) const sharedWorker = files.find((f) => /^my-shared-worker-\w+\.js$/.test(f)) const sharedWorkerContent = fs.readFileSync( path.resolve(assetsDir, sharedWorker), - 'utf-8' + 'utf-8', ) const sharedWorkerSourcemap = getSourceMapUrl(sharedWorkerContent) const possibleTsOutputWorker = files.find((f) => - /^possible-ts-output-worker-\w+\.js$/.test(f) + /^possible-ts-output-worker-\w+\.js$/.test(f), ) const possibleTsOutputWorkerContent = fs.readFileSync( path.resolve(assetsDir, possibleTsOutputWorker), - 'utf-8' + 'utf-8', ) const possibleTsOutputWorkerSourcemap = getSourceMapUrl( - possibleTsOutputWorkerContent + possibleTsOutputWorkerContent, ) const workerNestedWorker = files.find((f) => - /^worker-nested-worker-\w+\.js$/.test(f) + /^worker-nested-worker-\w+\.js$/.test(f), ) const workerNestedWorkerContent = fs.readFileSync( path.resolve(assetsDir, workerNestedWorker), - 'utf-8' + 'utf-8', ) const workerNestedWorkerSourcemap = getSourceMapUrl( - workerNestedWorkerContent + workerNestedWorkerContent, ) const subWorker = files.find((f) => /^sub-worker-\w+\.js$/.test(f)) const subWorkerContent = fs.readFileSync( path.resolve(assetsDir, subWorker), - 'utf-8' + 'utf-8', ) const subWorkerSourcemap = getSourceMapUrl(subWorkerContent) @@ -71,17 +71,17 @@ describe.runIf(isBuild)('build', () => { // chunk expect(content).toMatch( - `new Worker("/iife-sourcemap-inline/assets/my-worker` + `new Worker("/iife-sourcemap-inline/assets/my-worker`, ) expect(content).toMatch(`new Worker("data:application/javascript;base64`) expect(content).toMatch( - `new Worker("/iife-sourcemap-inline/assets/possible-ts-output-worker` + `new Worker("/iife-sourcemap-inline/assets/possible-ts-output-worker`, ) expect(content).toMatch( - `new Worker("/iife-sourcemap-inline/assets/worker-nested-worker` + `new Worker("/iife-sourcemap-inline/assets/worker-nested-worker`, ) expect(content).toMatch( - `new SharedWorker("/iife-sourcemap-inline/assets/my-shared-worker` + `new SharedWorker("/iife-sourcemap-inline/assets/my-shared-worker`, ) // inlined @@ -89,7 +89,7 @@ describe.runIf(isBuild)('build', () => { expect(content).toMatch(`window.Blob`) expect(workerNestedWorkerContent).toMatch( - `new Worker("/iife-sourcemap-inline/assets/sub-worker` + `new Worker("/iife-sourcemap-inline/assets/sub-worker`, ) }) }) diff --git a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts index 89fb5064612ac7..04f272b1487a8c 100644 --- a/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts +++ b/playground/worker/__tests__/sourcemap/sourcemap-worker.spec.ts @@ -16,57 +16,57 @@ describe.runIf(isBuild)('build', () => { const worker = files.find((f) => /^my-worker-\w+\.js$/.test(f)) const workerContent = fs.readFileSync( path.resolve(assetsDir, worker), - 'utf-8' + 'utf-8', ) const workerSourcemap = getSourceMapUrl(workerContent) const sharedWorker = files.find((f) => /^my-shared-worker-\w+\.js$/.test(f)) const sharedWorkerContent = fs.readFileSync( path.resolve(assetsDir, sharedWorker), - 'utf-8' + 'utf-8', ) const sharedWorkerSourcemap = getSourceMapUrl(sharedWorkerContent) const possibleTsOutputWorker = files.find((f) => - /^possible-ts-output-worker-\w+\.js$/.test(f) + /^possible-ts-output-worker-\w+\.js$/.test(f), ) const possibleTsOutputWorkerContent = fs.readFileSync( path.resolve(assetsDir, possibleTsOutputWorker), - 'utf-8' + 'utf-8', ) const possibleTsOutputWorkerSourcemap = getSourceMapUrl( - possibleTsOutputWorkerContent + possibleTsOutputWorkerContent, ) const workerNestedWorker = files.find((f) => - /^worker-nested-worker-\w+\.js$/.test(f) + /^worker-nested-worker-\w+\.js$/.test(f), ) const workerNestedWorkerContent = fs.readFileSync( path.resolve(assetsDir, workerNestedWorker), - 'utf-8' + 'utf-8', ) const workerNestedWorkerSourcemap = getSourceMapUrl( - workerNestedWorkerContent + workerNestedWorkerContent, ) const subWorker = files.find((f) => /^sub-worker-\w+\.js$/.test(f)) const subWorkerContent = fs.readFileSync( path.resolve(assetsDir, subWorker), - 'utf-8' + 'utf-8', ) const subWorkerSourcemap = getSourceMapUrl(subWorkerContent) expect(files).toContainEqual(expect.stringMatching(/^index-\w+\.js\.map$/)) expect(files).toContainEqual( - expect.stringMatching(/^my-worker-\w+\.js\.map$/) + expect.stringMatching(/^my-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^my-shared-worker-\w+\.js\.map$/) + expect.stringMatching(/^my-shared-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^possible-ts-output-worker-\w+\.js\.map$/) + expect.stringMatching(/^possible-ts-output-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^worker-nested-worker-\w+\.js\.map$/) + expect.stringMatching(/^worker-nested-worker-\w+\.js\.map$/), ) expect(files).toContainEqual( - expect.stringMatching(/^sub-worker-\w+\.js\.map$/) + expect.stringMatching(/^sub-worker-\w+\.js\.map$/), ) // sourcemap should exist and have a data URL @@ -74,10 +74,10 @@ describe.runIf(isBuild)('build', () => { expect(workerSourcemap).toMatch(/^my-worker-\w+\.js\.map$/) expect(sharedWorkerSourcemap).toMatch(/^my-shared-worker-\w+\.js\.map$/) expect(possibleTsOutputWorkerSourcemap).toMatch( - /^possible-ts-output-worker-\w+\.js\.map$/ + /^possible-ts-output-worker-\w+\.js\.map$/, ) expect(workerNestedWorkerSourcemap).toMatch( - /^worker-nested-worker-\w+\.js\.map$/ + /^worker-nested-worker-\w+\.js\.map$/, ) expect(subWorkerSourcemap).toMatch(/^sub-worker-\w+\.js\.map$/) @@ -93,13 +93,13 @@ describe.runIf(isBuild)('build', () => { expect(content).toMatch(`new Worker("/iife-sourcemap/assets/my-worker`) expect(content).toMatch(`new Worker("data:application/javascript;base64`) expect(content).toMatch( - `new Worker("/iife-sourcemap/assets/possible-ts-output-worker` + `new Worker("/iife-sourcemap/assets/possible-ts-output-worker`, ) expect(content).toMatch( - `new Worker("/iife-sourcemap/assets/worker-nested-worker` + `new Worker("/iife-sourcemap/assets/worker-nested-worker`, ) expect(content).toMatch( - `new SharedWorker("/iife-sourcemap/assets/my-shared-worker` + `new SharedWorker("/iife-sourcemap/assets/my-shared-worker`, ) // inlined @@ -107,7 +107,7 @@ describe.runIf(isBuild)('build', () => { expect(content).toMatch(`window.Blob`) expect(workerNestedWorkerContent).toMatch( - `new Worker("/iife-sourcemap/assets/sub-worker` + `new Worker("/iife-sourcemap/assets/sub-worker`, ) }) }) diff --git a/playground/worker/emit-chunk-nested-worker.js b/playground/worker/emit-chunk-nested-worker.js index 629322033f3d9b..4f23af6e913b29 100644 --- a/playground/worker/emit-chunk-nested-worker.js +++ b/playground/worker/emit-chunk-nested-worker.js @@ -4,26 +4,26 @@ const subWorker = new SubWorker() subWorker.onmessage = (event) => { self.postMessage({ type: 'emit-chunk-sub-worker', - data: event.data + data: event.data, }) } const moduleWorker = new Worker( new URL('./module-and-worker.js', import.meta.url), - { type: 'module' } + { type: 'module' }, ) moduleWorker.onmessage = (event) => { self.postMessage({ type: 'module-and-worker:worker', - data: event.data + data: event.data, }) } import('./module-and-worker').then((res) => { self.postMessage({ type: 'module-and-worker:module', - data: res.module + data: res.module, }) }) diff --git a/playground/worker/emit-chunk-sub-worker.js b/playground/worker/emit-chunk-sub-worker.js index 60d302e20bbb8a..16391db42dc3e0 100644 --- a/playground/worker/emit-chunk-sub-worker.js +++ b/playground/worker/emit-chunk-sub-worker.js @@ -1,7 +1,7 @@ Promise.all([ import('./module-and-worker'), import('./modules/module2'), - import('./modules/module3') + import('./modules/module3'), ]).then((data) => { const _data = { ...data[0], ...data[1], ...data[2] } self.postMessage(_data) diff --git a/playground/worker/vite.config-es.js b/playground/worker/vite.config-es.js index 16eaefe41d28d4..9ec9f2c540bef6 100644 --- a/playground/worker/vite.config-es.js +++ b/playground/worker/vite.config-es.js @@ -6,8 +6,8 @@ module.exports = vite.defineConfig({ enforce: 'pre', resolve: { alias: { - '@': __dirname - } + '@': __dirname, + }, }, worker: { format: 'es', @@ -16,9 +16,9 @@ module.exports = vite.defineConfig({ output: { assetFileNames: 'assets/worker_asset-[name].[ext]', chunkFileNames: 'assets/worker_chunk-[name].js', - entryFileNames: 'assets/worker_entry-[name].js' - } - } + entryFileNames: 'assets/worker_entry-[name].js', + }, + }, }, build: { outDir: 'dist/es', @@ -26,9 +26,9 @@ module.exports = vite.defineConfig({ output: { assetFileNames: 'assets/[name].[ext]', chunkFileNames: 'assets/[name].js', - entryFileNames: 'assets/[name].js' - } - } + entryFileNames: 'assets/[name].js', + }, + }, }, plugins: [ { @@ -38,10 +38,10 @@ module.exports = vite.defineConfig({ if (id.includes('main.js')) { return code.replace( `/* flag: will replace in vite config import("./format-es.js") */`, - `import("./main-format-es")` + `import("./main-format-es")`, ) } - } - } - ] + }, + }, + ], }) diff --git a/playground/worker/vite.config-iife.js b/playground/worker/vite.config-iife.js index cf05e278d2a1f7..80a8fb4d005418 100644 --- a/playground/worker/vite.config-iife.js +++ b/playground/worker/vite.config-iife.js @@ -5,8 +5,8 @@ module.exports = vite.defineConfig({ base: '/iife/', resolve: { alias: { - '@': __dirname - } + '@': __dirname, + }, }, worker: { format: 'iife', @@ -19,22 +19,22 @@ module.exports = vite.defineConfig({ worker: { rollupOptions: { output: { - entryFileNames: 'assets/worker_entry-[name].js' - } - } - } + entryFileNames: 'assets/worker_entry-[name].js', + }, + }, + }, } - } - } + }, + }, ], rollupOptions: { output: { assetFileNames: 'assets/worker_asset-[name].[ext]', chunkFileNames: 'assets/worker_chunk-[name].js', // should fix by config-test plugin - entryFileNames: 'assets/worker_-[name].js' - } - } + entryFileNames: 'assets/worker_-[name].js', + }, + }, }, build: { outDir: 'dist/iife', @@ -42,8 +42,8 @@ module.exports = vite.defineConfig({ output: { assetFileNames: 'assets/[name].[ext]', chunkFileNames: 'assets/[name].js', - entryFileNames: 'assets/[name].js' - } - } - } + entryFileNames: 'assets/[name].js', + }, + }, + }, }) diff --git a/playground/worker/vite.config-relative-base.js b/playground/worker/vite.config-relative-base.js index 019194e7441c95..d1750034910a5d 100644 --- a/playground/worker/vite.config-relative-base.js +++ b/playground/worker/vite.config-relative-base.js @@ -6,8 +6,8 @@ module.exports = vite.defineConfig({ base: './', resolve: { alias: { - '@': __dirname - } + '@': __dirname, + }, }, worker: { format: 'es', @@ -16,9 +16,9 @@ module.exports = vite.defineConfig({ output: { assetFileNames: 'worker-assets/worker_asset-[name]-[hash].[ext]', chunkFileNames: 'worker-chunks/worker_chunk-[name]-[hash].js', - entryFileNames: 'worker-entries/worker_entry-[name]-[hash].js' - } - } + entryFileNames: 'worker-entries/worker_entry-[name]-[hash].js', + }, + }, }, build: { outDir: 'dist/relative-base', @@ -26,12 +26,12 @@ module.exports = vite.defineConfig({ output: { assetFileNames: 'other-assets/[name]-[hash].[ext]', chunkFileNames: 'chunks/[name]-[hash].js', - entryFileNames: 'entries/[name]-[hash].js' - } - } + entryFileNames: 'entries/[name]-[hash].js', + }, + }, }, testConfig: { - baseRoute: '/relative-base/' + baseRoute: '/relative-base/', }, plugins: [ { @@ -40,10 +40,10 @@ module.exports = vite.defineConfig({ if (id.includes('main.js')) { return code.replace( `/* flag: will replace in vite config import("./format-es.js") */`, - `import("./main-format-es")` + `import("./main-format-es")`, ) } - } - } - ] + }, + }, + ], }) diff --git a/playground/worker/vite.config-sourcemap.js b/playground/worker/vite.config-sourcemap.js index e8ea73ca74489d..380e4bcc014d8e 100644 --- a/playground/worker/vite.config-sourcemap.js +++ b/playground/worker/vite.config-sourcemap.js @@ -12,8 +12,8 @@ module.exports = vite.defineConfig((sourcemap) => { }/`, resolve: { alias: { - '@': __dirname - } + '@': __dirname, + }, }, worker: { format: 'iife', @@ -22,9 +22,9 @@ module.exports = vite.defineConfig((sourcemap) => { output: { assetFileNames: 'assets/[name]-worker_asset[hash].[ext]', chunkFileNames: 'assets/[name]-worker_chunk[hash].js', - entryFileNames: 'assets/[name]-worker_entry[hash].js' - } - } + entryFileNames: 'assets/[name]-worker_entry[hash].js', + }, + }, }, build: { outDir: `dist/iife-${ @@ -35,9 +35,9 @@ module.exports = vite.defineConfig((sourcemap) => { output: { assetFileNames: 'assets/[name]-[hash].[ext]', chunkFileNames: 'assets/[name]-[hash].js', - entryFileNames: 'assets/[name]-[hash].js' - } - } - } + entryFileNames: 'assets/[name]-[hash].js', + }, + }, + }, } }) diff --git a/playground/worker/worker-nested-worker.js b/playground/worker/worker-nested-worker.js index f49c020754c957..e451edc608660c 100644 --- a/playground/worker/worker-nested-worker.js +++ b/playground/worker/worker-nested-worker.js @@ -14,17 +14,17 @@ self.postMessage(self.location.href) subWorker.onmessage = (ev) => { self.postMessage({ type: 'module', - data: ev.data + data: ev.data, }) } const classicWorker = new Worker(new URL('./url-worker.js', import.meta.url), { - type: 'module' + type: 'module', }) classicWorker.addEventListener('message', (ev) => { self.postMessage({ type: 'constructor', - data: ev.data + data: ev.data, }) }) @@ -35,7 +35,7 @@ importMetaGlobEagerWorker.postMessage('1') importMetaGlobEagerWorker.addEventListener('message', (ev) => { self.postMessage({ type: 'importMetaGlobEager', - data: ev.data + data: ev.data, }) }) diff --git a/playground/worker/worker/main-classic.js b/playground/worker/worker/main-classic.js index 39b8cbbe560ece..ed1c7392877190 100644 --- a/playground/worker/worker/main-classic.js +++ b/playground/worker/worker/main-classic.js @@ -4,7 +4,7 @@ function text(el, text) { } let classicWorker = new Worker( - new URL('../classic-worker.js', import.meta.url) /* , */ + new URL('../classic-worker.js', import.meta.url) /* , */, // test comment ) diff --git a/playground/worker/worker/main-format-es.js b/playground/worker/worker/main-format-es.js index 2a385556c58684..fc9af128e72b62 100644 --- a/playground/worker/worker/main-format-es.js +++ b/playground/worker/worker/main-format-es.js @@ -16,17 +16,17 @@ nestedWorker.addEventListener('message', (ev) => { '.emit-chunk-worker', JSON.stringify( dataList.sort( - (a, b) => JSON.stringify(a).length - JSON.stringify(b).length - ) - ) + (a, b) => JSON.stringify(a).length - JSON.stringify(b).length, + ), + ), ) }) const dynamicImportWorker = new Worker( new URL('../emit-chunk-dynamic-import-worker.js', import.meta.url), { - type: 'module' - } + type: 'module', + }, ) dynamicImportWorker.addEventListener('message', (ev) => { text('.emit-chunk-dynamic-import-worker', JSON.stringify(ev.data)) @@ -34,7 +34,7 @@ dynamicImportWorker.addEventListener('message', (ev) => { const moduleWorker = new Worker( new URL('../module-and-worker.js', import.meta.url), - { type: 'module' } + { type: 'module' }, ) moduleWorker.addEventListener('message', (ev) => { diff --git a/playground/worker/worker/main-module.js b/playground/worker/worker/main-module.js index 21c1dcadb853a9..1e5242935cdbb8 100644 --- a/playground/worker/worker/main-module.js +++ b/playground/worker/worker/main-module.js @@ -59,19 +59,19 @@ const workerOptions = { type: 'module' } // url import worker const w = new Worker( new URL('../url-worker.js', import.meta.url), - /* @vite-ignore */ workerOptions + /* @vite-ignore */ workerOptions, ) w.addEventListener('message', (ev) => - text('.worker-import-meta-url', JSON.stringify(ev.data)) + text('.worker-import-meta-url', JSON.stringify(ev.data)), ) // url import worker with alias path const wResolve = new Worker( new URL('@/url-worker.js', import.meta.url), - /* @vite-ignore */ workerOptions + /* @vite-ignore */ workerOptions, ) wResolve.addEventListener('message', (ev) => - text('.worker-import-meta-url-resolve', JSON.stringify(ev.data)) + text('.worker-import-meta-url-resolve', JSON.stringify(ev.data)), ) const genWorkerName = () => 'module' @@ -80,8 +80,8 @@ const w2 = new SharedWorker( { /* @vite-ignore */ name: genWorkerName(), - type: 'module' - } + type: 'module', + }, ) w2.port.addEventListener('message', (ev) => { text('.shared-worker-import-meta-url', JSON.stringify(ev.data)) @@ -90,7 +90,7 @@ w2.port.start() const workers = import.meta.glob('../importMetaGlobEager.*.js', { as: 'worker', - eager: true + eager: true, }) const importMetaGlobEagerWorker = new workers[ '../importMetaGlobEager.worker.js' diff --git a/scripts/publishCI.ts b/scripts/publishCI.ts index 903eb5f36f8733..02dbef74908032 100644 --- a/scripts/publishCI.ts +++ b/scripts/publishCI.ts @@ -4,7 +4,7 @@ import { getActiveVersion, getPackageInfo, publishPackage, - step + step, } from './releaseUtils' async function main() { @@ -25,7 +25,7 @@ async function main() { const { currentVersion, pkgDir } = getPackageInfo(pkgName) if (currentVersion !== version) throw new Error( - `Package version from tag "${version}" mismatches with current version "${currentVersion}"` + `Package version from tag "${version}" mismatches with current version "${currentVersion}"`, ) const activeVersion = await getActiveVersion(pkgName) diff --git a/scripts/release.ts b/scripts/release.ts index 36d9b22f397726..b17f328518bcf1 100644 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -12,7 +12,7 @@ import { runIfNotDry, step, updateTemplateVersions, - updateVersion + updateVersion, } from './releaseUtils' async function main(): Promise { @@ -22,7 +22,7 @@ async function main(): Promise { type: 'select', name: 'pkg', message: 'Select package', - choices: packages.map((i) => ({ value: i, title: i })) + choices: packages.map((i) => ({ value: i, title: i })), }) if (!pkg) return @@ -36,7 +36,7 @@ async function main(): Promise { type: 'select', name: 'release', message: 'Select release type', - choices: getVersionChoices(currentVersion) + choices: getVersionChoices(currentVersion), }) if (release === 'custom') { @@ -44,7 +44,7 @@ async function main(): Promise { type: 'text', name: 'version', message: 'Input custom version', - initial: currentVersion + initial: currentVersion, }) targetVersion = res.version } else { @@ -69,7 +69,7 @@ async function main(): Promise { const { yes }: { yes: boolean } = await prompts({ type: 'confirm', name: 'yes', - message: `Releasing ${colors.yellow(tag)} Confirm?` + message: `Releasing ${colors.yellow(tag)} Confirm?`, }) if (!yes) { @@ -89,7 +89,7 @@ async function main(): Promise { 'CHANGELOG.md', '-s', '--commit-path', - '.' + '.', ] if (pkgName !== 'vite') changelogArgs.push('--lerna-package', pkgName) await run('npx', changelogArgs, { cwd: pkgDir }) @@ -114,8 +114,8 @@ async function main(): Promise { } else { console.log( colors.green( - '\nPushed, publishing should starts shortly on CI.\nhttps://github.com/vitejs/vite/actions/workflows/publish.yml' - ) + '\nPushed, publishing should starts shortly on CI.\nhttps://github.com/vitejs/vite/actions/workflows/publish.yml', + ), ) } diff --git a/scripts/releaseUtils.ts b/scripts/releaseUtils.ts index 48dff6bde229b1..9a7d18d2d99e8d 100644 --- a/scripts/releaseUtils.ts +++ b/scripts/releaseUtils.ts @@ -25,7 +25,7 @@ export const packages = ['vite', 'create-vite', 'plugin-legacy'] export const versionIncrements: ReleaseType[] = [ 'patch', 'minor', - 'major' + 'major', // 'prepatch', // 'preminor', // 'premajor', @@ -63,14 +63,14 @@ export function getPackageInfo(pkgName: string): { pkgName, pkgDir, pkgPath, - currentVersion + currentVersion, } } export async function run( bin: string, args: string[], - opts: ExecaOptions = {} + opts: ExecaOptions = {}, ): Promise> { return execa(bin, args, { stdio: 'inherit', ...opts }) } @@ -78,11 +78,11 @@ export async function run( export async function dryRun( bin: string, args: string[], - opts?: ExecaOptions + opts?: ExecaOptions, ): Promise { return console.log( colors.blue(`[dryrun] ${bin} ${args.join(' ')}`), - opts || '' + opts || '', ) } @@ -108,46 +108,46 @@ export function getVersionChoices(currentVersion: string): VersionChoice[] { let versionChoices: VersionChoice[] = [ { title: 'next', - value: inc(isStable ? 'patch' : 'prerelease') - } + value: inc(isStable ? 'patch' : 'prerelease'), + }, ] if (isStable) { versionChoices.push( { title: 'beta-minor', - value: inc('preminor') + value: inc('preminor'), }, { title: 'beta-major', - value: inc('premajor') + value: inc('premajor'), }, { title: 'alpha-minor', - value: inc('preminor', 'alpha') + value: inc('preminor', 'alpha'), }, { title: 'alpha-major', - value: inc('premajor', 'alpha') + value: inc('premajor', 'alpha'), }, { title: 'minor', - value: inc('minor') + value: inc('minor'), }, { title: 'major', - value: inc('major') - } + value: inc('major'), + }, ) } else if (currentAlpha) { versionChoices.push({ title: 'beta', - value: inc('patch') + '-beta.0' + value: inc('patch') + '-beta.0', }) } else { versionChoices.push({ title: 'stable', - value: inc('patch') + value: inc('patch'), }) } versionChoices.push({ value: 'custom', title: 'custom' }) @@ -168,14 +168,14 @@ export function updateVersion(pkgPath: string, version: string): void { export async function publishPackage( pkdDir: string, - tag?: string + tag?: string, ): Promise { const publicArgs = ['publish', '--access', 'public'] if (tag) { publicArgs.push(`--tag`, tag) } await runIfNotDry('npm', publicArgs, { - cwd: pkdDir + cwd: pkdDir, }) } @@ -203,14 +203,14 @@ export async function logRecentCommits(pkgName: string): Promise { const tag = await getLatestTag(pkgName) if (!tag) return const sha = await run('git', ['rev-list', '-n', '1', tag], { - stdio: 'pipe' + stdio: 'pipe', }).then((res) => res.stdout.trim()) console.log( colors.bold( `\n${colors.blue(`i`)} Commits of ${colors.green( - pkgName - )} since ${colors.green(tag)} ${colors.gray(`(${sha.slice(0, 5)})`)}` - ) + pkgName, + )} since ${colors.green(tag)} ${colors.gray(`(${sha.slice(0, 5)})`)}`, + ), ) await run( 'git', @@ -220,9 +220,9 @@ export async function logRecentCommits(pkgName: string): Promise { `${sha}..HEAD`, '--oneline', '--', - `packages/${pkgName}` + `packages/${pkgName}`, ], - { stdio: 'inherit' } + { stdio: 'inherit' }, ) console.log() } @@ -236,7 +236,7 @@ export async function updateTemplateVersions(): Promise { const dir = path.resolve(__dirname, '../packages/create-vite') const templates = readdirSync(dir).filter((dir) => - dir.startsWith('template-') + dir.startsWith('template-'), ) for (const template of templates) { const pkgPath = path.join(dir, template, `package.json`) @@ -247,7 +247,7 @@ export async function updateTemplateVersions(): Promise { `^` + ( await fs.readJSON( - path.resolve(__dirname, '../packages/plugin-vue/package.json') + path.resolve(__dirname, '../packages/plugin-vue/package.json'), ) ).version } @@ -256,7 +256,7 @@ export async function updateTemplateVersions(): Promise { `^` + ( await fs.readJSON( - path.resolve(__dirname, '../packages/plugin-react/package.json') + path.resolve(__dirname, '../packages/plugin-react/package.json'), ) ).version } diff --git a/scripts/rollupLicensePlugin.mjs b/scripts/rollupLicensePlugin.mjs index fedbd34b4fd660..3d527afb0129f7 100644 --- a/scripts/rollupLicensePlugin.mjs +++ b/scripts/rollupLicensePlugin.mjs @@ -18,7 +18,7 @@ function licensePlugin(licenseFilePath, licenseTitle, packageName) { // https://github.com/rollup/rollup/blob/master/build-plugins/generate-license-file.js // MIT Licensed https://github.com/rollup/rollup/blob/master/LICENSE-CORE.md const coreLicense = fs.readFileSync( - new URL('../LICENSE', import.meta.url) + new URL('../LICENSE', import.meta.url), ) function sortLicenses(licenses) { let withParenthesis = [] @@ -49,7 +49,7 @@ function licensePlugin(licenseFilePath, licenseTitle, packageName) { author, maintainers, contributors, - repository + repository, }) => { let text = `## ${name}\n` if (license) { @@ -74,11 +74,11 @@ function licensePlugin(licenseFilePath, licenseTitle, packageName) { try { const pkgDir = path.dirname( resolve.sync(path.join(name, 'package.json'), { - preserveSymlinks: false - }) + preserveSymlinks: false, + }), ) const licenseFile = fg.sync(`${pkgDir}/LICENSE*`, { - caseSensitiveMatch: false + caseSensitiveMatch: false, })[0] if (licenseFile) { licenseText = fs.readFileSync(licenseFile, 'utf-8') @@ -98,7 +98,7 @@ function licensePlugin(licenseFilePath, licenseTitle, packageName) { } licenses.add(license) return text - } + }, ) .join('\n---------------------------------------\n\n') const licenseText = @@ -115,11 +115,11 @@ function licensePlugin(licenseFilePath, licenseTitle, packageName) { fs.writeFileSync(licenseFilePath, licenseText) console.warn( colors.yellow( - '\nLICENSE.md updated. You should commit the updated file.\n' - ) + '\nLICENSE.md updated. You should commit the updated file.\n', + ), ) } - } + }, }) } diff --git a/scripts/verifyCommit.ts b/scripts/verifyCommit.ts index 92bf5c46bd7bb6..6a47d4c835076c 100644 --- a/scripts/verifyCommit.ts +++ b/scripts/verifyCommit.ts @@ -15,14 +15,14 @@ if (!releaseRE.test(msg) && !commitRE.test(msg)) { console.log() console.error( ` ${colors.bgRed(colors.white(' ERROR '))} ${colors.red( - `invalid commit message format.` + `invalid commit message format.`, )}\n\n` + colors.red( - ` Proper commit message format is required for automated changelog generation. Examples:\n\n` + ` Proper commit message format is required for automated changelog generation. Examples:\n\n`, ) + ` ${colors.green(`feat: add 'comments' option`)}\n` + ` ${colors.green(`fix: handle events on blur (close #28)`)}\n\n` + - colors.red(` See .github/commit-convention.md for more details.\n`) + colors.red(` See .github/commit-convention.md for more details.\n`), ) process.exit(1) } diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index da47d97de9abea..fe474509ecc210 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -6,8 +6,8 @@ const timeout = process.env.CI ? 50000 : 30000 export default defineConfig({ resolve: { alias: { - '~utils': resolve(__dirname, './playground/test-utils') - } + '~utils': resolve(__dirname, './playground/test-utils'), + }, }, test: { include: ['./playground/**/*.spec.[tj]s'], @@ -19,9 +19,9 @@ export default defineConfig({ onConsoleLog(log) { if (log.match(/experimental|jit engine|emitted file|tailwind/i)) return false - } + }, }, esbuild: { - target: 'node14' - } + target: 'node14', + }, }) diff --git a/vitest.config.ts b/vitest.config.ts index 0a8f8c2ff22648..f86aad8dd8b15b 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -6,11 +6,11 @@ export default defineConfig({ '**/node_modules/**', '**/dist/**', './playground/**/*.*', - './playground-temp/**/*.*' + './playground-temp/**/*.*', ], - testTimeout: 20000 + testTimeout: 20000, }, esbuild: { - target: 'node14' - } + target: 'node14', + }, }) From 5170e44920458090b8b43ee9cfe5010c25dfe22b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sun, 4 Dec 2022 18:20:45 +0900 Subject: [PATCH 48/97] chore: rename test packages (#11172) --- CONTRIBUTING.md | 2 + package.json | 2 +- playground/alias/dir/module/package.json | 2 +- playground/alias/package.json | 4 +- playground/alias/vite.config.js | 2 +- playground/assets-sanitize/package.json | 2 +- playground/assets/package.json | 2 +- playground/backend-integration/package.json | 2 +- playground/build-old/package.json | 2 +- playground/cli-module/package.json | 2 +- playground/cli/package.json | 2 +- playground/css-codesplit-cjs/package.json | 2 +- playground/css-codesplit/package.json | 2 +- playground/css-sourcemap/package.json | 2 +- playground/css/__tests__/css.spec.ts | 4 - playground/css/css-dep/package.json | 2 +- playground/css/css-js-dep/package.json | 2 +- playground/css/dep.css | 2 +- playground/css/index.html | 3 - playground/css/main.js | 2 +- playground/css/package.json | 6 +- playground/css/sass.scss | 2 +- playground/css/stylus.styl | 1 - playground/data-uri/package.json | 2 +- playground/define/commonjs-dep/package.json | 2 +- playground/define/index.html | 6 +- playground/define/package.json | 4 +- playground/dynamic-import/nested/deps.js | 2 +- playground/dynamic-import/package.json | 4 +- playground/dynamic-import/pkg/package.json | 2 +- playground/env-nested/package.json | 2 +- playground/env/package.json | 2 +- playground/extensions/package.json | 2 +- .../external/dep-that-imports/package.json | 2 +- .../external/dep-that-requires/package.json | 2 +- playground/external/package.json | 6 +- playground/external/src/main.js | 4 +- playground/file-delete-restore/package.json | 2 +- playground/fs-serve/package.json | 2 +- playground/glob-import/package.json | 2 +- playground/hmr/package.json | 2 +- playground/html/package.json | 2 +- .../import-assertion-dep/package.json | 2 +- playground/import-assertion/index.html | 2 +- playground/import-assertion/package.json | 4 +- playground/js-sourcemap/package.json | 2 +- playground/json/index.html | 2 +- playground/json/json-module/package.json | 2 +- playground/json/package.json | 4 +- playground/legacy/package.json | 2 +- playground/lib/package.json | 2 +- playground/minify/package.json | 2 +- playground/multiple-entrypoints/package.json | 2 +- playground/nested-deps/index.html | 12 +- playground/nested-deps/package.json | 12 +- .../nested-deps/test-package-a/package.json | 2 +- .../nested-deps/test-package-b/package.json | 2 +- .../nested-deps/test-package-c/package.json | 2 +- playground/nested-deps/test-package-c/side.js | 2 +- .../nested-deps/test-package-d/index.js | 2 +- .../nested-deps/test-package-d/package.json | 4 +- .../test-package-d-nested/package.json | 2 +- .../nested-deps/test-package-e/index.js | 4 +- .../nested-deps/test-package-e/package.json | 6 +- .../test-package-e-excluded/package.json | 2 +- .../test-package-e-included/package.json | 2 +- playground/nested-deps/vite.config.js | 14 +- playground/object-hooks/package.json | 2 +- .../__tests__/optimize-deps.spec.ts | 2 +- .../added-in-entries/package.json | 2 +- playground/optimize-deps/cjs-dynamic.js | 4 +- playground/optimize-deps/dedupe.js | 2 +- .../dep-cjs-browser-field-bare/package.json | 2 +- .../dep-cjs-compiled-from-cjs/package.json | 2 +- .../dep-cjs-compiled-from-esm/package.json | 2 +- .../dep-cjs-with-assets/package.json | 2 +- .../dep-esbuild-plugin-transform/package.json | 2 +- .../dep-linked-include/package.json | 2 +- .../optimize-deps/dep-linked/package.json | 2 +- .../optimize-deps/dep-node-env/package.json | 2 +- .../dep-non-optimized/package.json | 2 +- .../optimize-deps/dep-not-js/package.json | 2 +- .../dep-relative-to-main/package.json | 2 +- .../dep-with-builtin-module-cjs/package.json | 2 +- .../dep-with-builtin-module-esm/package.json | 2 +- .../dep-with-dynamic-import/package.json | 2 +- .../dep-with-optional-peer-dep/package.json | 2 +- playground/optimize-deps/entry.js | 2 +- playground/optimize-deps/index.html | 37 +- .../optimize-deps/nested-exclude/index.js | 2 +- .../optimize-deps/nested-exclude/package.json | 4 +- .../optimize-deps/nested-include/package.json | 2 +- .../non-optimizable-include/package.json | 2 +- playground/optimize-deps/package.json | 38 +- playground/optimize-deps/vite.config.js | 8 +- playground/optimize-missing-deps/main.js | 2 +- .../missing-dep/index.js | 2 +- .../missing-dep/package.json | 4 +- .../multi-entry-dep/package.json | 2 +- playground/optimize-missing-deps/package.json | 4 +- playground/package.json | 2 +- playground/preload/dep-a/package.json | 2 +- playground/preload/dep-including-a/index.js | 2 +- .../preload/dep-including-a/package.json | 4 +- playground/preload/index.html | 2 +- playground/preload/package.json | 6 +- playground/preload/src/components/About.vue | 2 +- .../{moduleA => module-a}/linked.js | 0 .../{moduleA => module-a}/package.json | 2 +- .../{moduleA => module-a}/src/data.js | 0 .../{moduleA => module-a}/src/index.js | 0 playground/preserve-symlinks/package.json | 4 +- playground/preserve-symlinks/src/main.js | 2 +- playground/resolve-config/package.json | 2 +- playground/resolve-linked/package.json | 2 +- playground/resolve/browser-field/package.json | 2 +- .../browser-module-field1/package.json | 2 +- .../browser-module-field2/package.json | 2 +- .../browser-module-field3/package.json | 2 +- .../resolve/custom-condition/package.json | 2 +- .../resolve/custom-main-field/package.json | 2 +- playground/resolve/exports-env/package.json | 2 +- .../exports-legacy-fallback/package.json | 2 +- playground/resolve/exports-path/package.json | 2 +- playground/resolve/index.html | 64 +-- .../resolve/inline-package/package.json | 2 +- playground/resolve/package.json | 24 +- .../package.json | 2 +- playground/resolve/vite.config.js | 2 +- playground/ssr-deps/css-lib/package.json | 2 +- .../define-properties-exports/package.json | 2 +- .../define-property-exports/package.json | 2 +- .../ssr-deps/external-entry/package.json | 2 +- .../package.json | 2 +- .../ssr-deps/forwarded-export/package.json | 2 +- .../ssr-deps/import-builtin-cjs/package.json | 2 +- playground/ssr-deps/index.html | 2 +- .../ssr-deps/linked-no-external/package.json | 2 +- .../ssr-deps/nested-external/package.json | 2 +- .../ssr-deps/no-external-cjs/package.json | 2 +- .../ssr-deps/no-external-css/package.json | 2 +- .../package.json | 2 +- .../object-assigned-exports/package.json | 2 +- .../only-object-assigned-exports/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- playground/ssr-deps/package.json | 42 +- playground/ssr-deps/pkg-exports/package.json | 2 +- .../ssr-deps/primitive-export/package.json | 2 +- .../ssr-deps/read-file-content/package.json | 2 +- .../ssr-deps/require-absolute/package.json | 2 +- playground/ssr-deps/server.js | 19 +- playground/ssr-deps/src/app.js | 40 +- .../ts-transpiled-exports/package.json | 2 +- playground/ssr-html/package.json | 2 +- .../ssr-noexternal/external-cjs/package.json | 2 +- playground/ssr-noexternal/package.json | 4 +- .../require-external-cjs/main.js | 2 +- .../require-external-cjs/package.json | 4 +- playground/ssr-noexternal/src/entry-server.js | 2 +- playground/ssr-noexternal/vite.config.js | 6 +- playground/ssr-pug/package.json | 2 +- .../ssr-resolve/__tests__/ssr-resolve.spec.ts | 12 +- playground/ssr-resolve/entries/package.json | 2 +- playground/ssr-resolve/main.js | 6 +- playground/ssr-resolve/package.json | 6 +- .../ssr-resolve/pkg-exports/package.json | 2 +- playground/ssr-webworker/package.json | 4 +- playground/ssr-webworker/src/entry-worker.jsx | 2 +- playground/tailwind-sourcemap/package.json | 2 +- playground/tailwind/package.json | 2 +- playground/transform-plugin/package.json | 2 +- .../tsconfig-json-load-error/package.json | 2 +- playground/tsconfig-json/package.json | 2 +- playground/wasm/package.json | 2 +- .../worker/dep-to-optimize/package.json | 2 +- playground/worker/my-worker.ts | 2 +- playground/worker/package.json | 4 +- pnpm-lock.yaml | 434 +++++++++--------- 179 files changed, 588 insertions(+), 564 deletions(-) rename playground/preserve-symlinks/{moduleA => module-a}/linked.js (100%) rename playground/preserve-symlinks/{moduleA => module-a}/package.json (65%) rename playground/preserve-symlinks/{moduleA => module-a}/src/data.js (100%) rename playground/preserve-symlinks/{moduleA => module-a}/src/index.js (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3065a63be5fc7a..6123e651a90d2c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -147,6 +147,8 @@ test('?raw import', async () => { In many test cases, we need to mock dependencies using `link:` and `file:` protocols. `pnpm` treats `link:` as symlinks and `file:` as hardlinks. To test dependencies as if they were copied into `node_modules`, use the `file:` protocol. Otherwise, use the `link:` protocol. +For a mock dependency, make sure you add a `@vitejs/test-` prefix to the package name. This will avoid possible issues like false-positive alerts. + ## Debug Logging You can set the `DEBUG` environment variable to turn on debugging logs (e.g. `DEBUG="vite:resolve"`). To see all debug logs, you can set `DEBUG="vite:*"`, but be warned that it will be quite noisy. You can run `grep -r "createDebugger('vite:" packages/vite/src/` to see a list of available debug scopes. diff --git a/package.json b/package.json index d2c87177ef40b5..11c7311c25205c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "vite-monorepo", + "name": "@vitejs/vite-monorepo", "private": true, "engines": { "node": "^14.18.0 || >=16.0.0" diff --git a/playground/alias/dir/module/package.json b/playground/alias/dir/module/package.json index 5065df363f87ee..8d3b7c4c8edc67 100644 --- a/playground/alias/dir/module/package.json +++ b/playground/alias/dir/module/package.json @@ -1,5 +1,5 @@ { - "name": "@vite/aliased-module", + "name": "@vitejs/test-aliased-module", "private": true, "type": "module", "version": "0.0.0" diff --git a/playground/alias/package.json b/playground/alias/package.json index d9f145331777b3..1dfa8d79783bfe 100644 --- a/playground/alias/package.json +++ b/playground/alias/package.json @@ -1,5 +1,5 @@ { - "name": "test-alias", + "name": "@vitejs/test-alias", "private": true, "version": "0.0.0", "scripts": { @@ -14,6 +14,6 @@ "@vue/shared": "^3.2.45" }, "devDependencies": { - "resolve-linked": "workspace:*" + "@vitejs/test-resolve-linked": "workspace:*" } } diff --git a/playground/alias/vite.config.js b/playground/alias/vite.config.js index 97ffcde1adc676..cdabb2594d8367 100644 --- a/playground/alias/vite.config.js +++ b/playground/alias/vite.config.js @@ -8,7 +8,7 @@ module.exports = { alias: [ { find: 'fs', replacement: path.resolve(__dirname, 'test.js') }, { find: 'fs-dir', replacement: path.resolve(__dirname, 'dir') }, - { find: 'dep', replacement: 'resolve-linked' }, + { find: 'dep', replacement: '@vitejs/test-resolve-linked' }, { find: /^regex\/(.*)/, replacement: `${path.resolve(__dirname, 'dir')}/$1`, diff --git a/playground/assets-sanitize/package.json b/playground/assets-sanitize/package.json index 3ade78a2bd33fe..5deedbfaf97f38 100644 --- a/playground/assets-sanitize/package.json +++ b/playground/assets-sanitize/package.json @@ -1,5 +1,5 @@ { - "name": "test-assets-sanitize", + "name": "@vitejs/test-assets-sanitize", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/assets/package.json b/playground/assets/package.json index 6d28ed91719070..beec899e36bd68 100644 --- a/playground/assets/package.json +++ b/playground/assets/package.json @@ -1,5 +1,5 @@ { - "name": "test-assets", + "name": "@vitejs/test-assets", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/backend-integration/package.json b/playground/backend-integration/package.json index 7941502b6a439d..08cc035890143a 100644 --- a/playground/backend-integration/package.json +++ b/playground/backend-integration/package.json @@ -1,5 +1,5 @@ { - "name": "test-backend-integration", + "name": "@vitejs/test-backend-integration", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/build-old/package.json b/playground/build-old/package.json index bb7f1b9b861538..9766699a41d435 100644 --- a/playground/build-old/package.json +++ b/playground/build-old/package.json @@ -1,5 +1,5 @@ { - "name": "test-build-old", + "name": "@vitejs/test-build-old", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/cli-module/package.json b/playground/cli-module/package.json index 30a94d2bb877ad..581a990df95260 100644 --- a/playground/cli-module/package.json +++ b/playground/cli-module/package.json @@ -1,5 +1,5 @@ { - "name": "test-cli-module", + "name": "@vitejs/test-cli-module", "private": true, "version": "0.0.0", "type": "module", diff --git a/playground/cli/package.json b/playground/cli/package.json index d2f8476d409c2e..39b7efc3b24304 100644 --- a/playground/cli/package.json +++ b/playground/cli/package.json @@ -1,5 +1,5 @@ { - "name": "test-cli", + "name": "@vitejs/test-cli", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/css-codesplit-cjs/package.json b/playground/css-codesplit-cjs/package.json index 3504b18053b39b..97f1473d267e46 100644 --- a/playground/css-codesplit-cjs/package.json +++ b/playground/css-codesplit-cjs/package.json @@ -1,5 +1,5 @@ { - "name": "test-css-codesplit-cjs", + "name": "@vitejs/test-css-codesplit-cjs", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/css-codesplit/package.json b/playground/css-codesplit/package.json index b6fe27f6d35759..ac3149030dceaf 100644 --- a/playground/css-codesplit/package.json +++ b/playground/css-codesplit/package.json @@ -1,5 +1,5 @@ { - "name": "test-css-codesplit", + "name": "@vitejs/test-css-codesplit", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/css-sourcemap/package.json b/playground/css-sourcemap/package.json index 8892a42fae1f99..ea3f93f6705565 100644 --- a/playground/css-sourcemap/package.json +++ b/playground/css-sourcemap/package.json @@ -1,5 +1,5 @@ { - "name": "test-css-sourcemap", + "name": "@vitejs/test-css-sourcemap", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/css/__tests__/css.spec.ts b/playground/css/__tests__/css.spec.ts index 77878820eab415..3f058e24768c07 100644 --- a/playground/css/__tests__/css.spec.ts +++ b/playground/css/__tests__/css.spec.ts @@ -284,10 +284,6 @@ test('@import dependency w/ sass entry', async () => { expect(await getColor('.css-dep-sass')).toBe('orange') }) -test('@import dependency w/ stylus entry', async () => { - expect(await getColor('.css-dep-stylus')).toBe('red') -}) - test('@import dependency w/out package scss', async () => { expect(await getColor('.sass-dep')).toBe('lavender') }) diff --git a/playground/css/css-dep/package.json b/playground/css/css-dep/package.json index 451510a672485f..204e8c71b0ebba 100644 --- a/playground/css/css-dep/package.json +++ b/playground/css/css-dep/package.json @@ -1,5 +1,5 @@ { - "name": "css-dep", + "name": "@vitejs/test-css-dep", "private": true, "version": "1.0.0", "main": "index.js", diff --git a/playground/css/css-js-dep/package.json b/playground/css/css-js-dep/package.json index d762f6566fdbdc..ce96e1e3c2b3f9 100644 --- a/playground/css/css-js-dep/package.json +++ b/playground/css/css-js-dep/package.json @@ -1,5 +1,5 @@ { - "name": "css-js-dep", + "name": "@vitejs/test-css-js-dep", "private": true, "type": "module", "version": "1.0.0", diff --git a/playground/css/dep.css b/playground/css/dep.css index 8d5b62847cd70e..ad3e1bcd12480c 100644 --- a/playground/css/dep.css +++ b/playground/css/dep.css @@ -1 +1 @@ -@import 'css-dep'; +@import '@vitejs/test-css-dep'; diff --git a/playground/css/index.html b/playground/css/index.html index 93f77dfa2eb970..486c927832bce8 100644 --- a/playground/css/index.html +++ b/playground/css/index.html @@ -124,9 +124,6 @@

CSS

@import dependency w/ sass entrypoints: this should be orange

-

- @import dependency w/ styl entrypoints: this should be red -

PostCSS dir-dependency: this should be grey

diff --git a/playground/css/main.js b/playground/css/main.js index 5a2b726c1b7e92..e38ff356315879 100644 --- a/playground/css/main.js +++ b/playground/css/main.js @@ -46,7 +46,7 @@ import './dep.css' import './glob-dep.css' // eslint-disable-next-line import/order -import { barModuleClasses } from 'css-js-dep' +import { barModuleClasses } from '@vitejs/test-css-js-dep' document .querySelector('.css-js-dep-module') .classList.add(barModuleClasses.cssJsDepModule) diff --git a/playground/css/package.json b/playground/css/package.json index 14971a77f73166..3504ce9bce2745 100644 --- a/playground/css/package.json +++ b/playground/css/package.json @@ -1,5 +1,5 @@ { - "name": "test-css", + "name": "@vitejs/test-css", "private": true, "version": "0.0.0", "scripts": { @@ -12,8 +12,8 @@ "preview:relative-base": "vite --config ./vite.config-relative-base.js preview" }, "devDependencies": { - "css-dep": "link:./css-dep", - "css-js-dep": "file:./css-js-dep", + "@vitejs/test-css-dep": "link:./css-dep", + "@vitejs/test-css-js-dep": "file:./css-js-dep", "fast-glob": "^3.2.12", "less": "^4.1.3", "postcss-nested": "^5.0.6", diff --git a/playground/css/sass.scss b/playground/css/sass.scss index 721e6b9bfbca6c..796d9ba68b0c05 100644 --- a/playground/css/sass.scss +++ b/playground/css/sass.scss @@ -1,6 +1,6 @@ @import '=/nested'; // alias + custom index resolving -> /nested/_index.scss @import '=/nested/partial'; // sass convention: omitting leading _ for partials -@import 'css-dep'; // package w/ sass entry points +@import '@vitejs/test-css-dep'; // package w/ sass entry points @import 'virtual-dep'; // virtual file added through importer @import '=/pkg-dep'; // package w/out sass field @import '=/weapp.wxss'; // wxss file diff --git a/playground/css/stylus.styl b/playground/css/stylus.styl index 7b77ca36531be8..d43ba92d7a99ce 100644 --- a/playground/css/stylus.styl +++ b/playground/css/stylus.styl @@ -1,5 +1,4 @@ @import './nested/nested' -@import 'css-dep'; // package w/ styl entry points $color ?= blue diff --git a/playground/data-uri/package.json b/playground/data-uri/package.json index 4d30ad97b9acbb..c19befed0bca09 100644 --- a/playground/data-uri/package.json +++ b/playground/data-uri/package.json @@ -1,5 +1,5 @@ { - "name": "test-data-uri", + "name": "@vitejs/test-data-uri", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/define/commonjs-dep/package.json b/playground/define/commonjs-dep/package.json index 3047ae68c9f75a..f8ac503baaf9a9 100644 --- a/playground/define/commonjs-dep/package.json +++ b/playground/define/commonjs-dep/package.json @@ -1,5 +1,5 @@ { - "name": "commonjs-dep", + "name": "@vitejs/test-commonjs-dep", "private": true, "version": "1.0.0", "type": "commonjs" diff --git a/playground/define/index.html b/playground/define/index.html index 7d81d42d8966a1..da1fa0fc5f3a23 100644 --- a/playground/define/index.html +++ b/playground/define/index.html @@ -56,7 +56,11 @@

Define

document.querySelector(el).textContent = text } - import { defined, importMetaEnvUndefined, processEnvUndefined } from 'dep' + import { + defined, + importMetaEnvUndefined, + processEnvUndefined, + } from '@vitejs/test-commonjs-dep' text('.define-in-dep', JSON.stringify(defined)) text('.import-meta-env-undefined', importMetaEnvUndefined) text('.process-env-undefined', processEnvUndefined) diff --git a/playground/define/package.json b/playground/define/package.json index 987330d432c9a9..9a144c76a4dfb0 100644 --- a/playground/define/package.json +++ b/playground/define/package.json @@ -1,5 +1,5 @@ { - "name": "test-define", + "name": "@vitejs/test-define", "private": true, "version": "0.0.0", "scripts": { @@ -9,6 +9,6 @@ "preview": "vite preview" }, "dependencies": { - "dep": "file:./commonjs-dep" + "@vitejs/test-commonjs-dep": "file:./commonjs-dep" } } diff --git a/playground/dynamic-import/nested/deps.js b/playground/dynamic-import/nested/deps.js index 88fd4787941fd0..34668f67263505 100644 --- a/playground/dynamic-import/nested/deps.js +++ b/playground/dynamic-import/nested/deps.js @@ -1,3 +1,3 @@ /* don't include dynamic import inside this file */ -import 'pkg' +import '@vitejs/test-pkg' diff --git a/playground/dynamic-import/package.json b/playground/dynamic-import/package.json index 3b66d0af1873cc..55137ef5fb9375 100644 --- a/playground/dynamic-import/package.json +++ b/playground/dynamic-import/package.json @@ -1,5 +1,5 @@ { - "name": "test-dynamic-import", + "name": "@vitejs/test-dynamic-import", "private": true, "version": "0.0.0", "scripts": { @@ -9,6 +9,6 @@ "preview": "vite preview" }, "dependencies": { - "pkg": "file:./pkg" + "@vitejs/test-pkg": "file:./pkg" } } diff --git a/playground/dynamic-import/pkg/package.json b/playground/dynamic-import/pkg/package.json index 1eab564572e245..fb2e8c8815c8fa 100644 --- a/playground/dynamic-import/pkg/package.json +++ b/playground/dynamic-import/pkg/package.json @@ -1,5 +1,5 @@ { - "name": "pkg", + "name": "@vitejs/test-pkg", "type": "module", "private": true, "version": "1.0.0", diff --git a/playground/env-nested/package.json b/playground/env-nested/package.json index 530b4e621005b0..545eefb2f690d5 100644 --- a/playground/env-nested/package.json +++ b/playground/env-nested/package.json @@ -1,5 +1,5 @@ { - "name": "test-env-nested", + "name": "@vitejs/test-env-nested", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/env/package.json b/playground/env/package.json index 091afe4bd08a88..969f4061114a9d 100644 --- a/playground/env/package.json +++ b/playground/env/package.json @@ -1,5 +1,5 @@ { - "name": "test-env", + "name": "@vitejs/test-env", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/extensions/package.json b/playground/extensions/package.json index d4debfdccd2553..4457686725f4ab 100644 --- a/playground/extensions/package.json +++ b/playground/extensions/package.json @@ -1,5 +1,5 @@ { - "name": "test-extensions", + "name": "@vitejs/test-extensions", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/external/dep-that-imports/package.json b/playground/external/dep-that-imports/package.json index b688165c9fc521..0e4028ec0af878 100644 --- a/playground/external/dep-that-imports/package.json +++ b/playground/external/dep-that-imports/package.json @@ -1,5 +1,5 @@ { - "name": "@vitejs/dep-that-imports", + "name": "@vitejs/test-dep-that-imports", "private": true, "version": "0.0.0", "dependencies": { diff --git a/playground/external/dep-that-requires/package.json b/playground/external/dep-that-requires/package.json index bc1195ccfc6add..2ba1dc8be5d63a 100644 --- a/playground/external/dep-that-requires/package.json +++ b/playground/external/dep-that-requires/package.json @@ -1,5 +1,5 @@ { - "name": "@vitejs/dep-that-requires", + "name": "@vitejs/test-dep-that-requires", "private": true, "version": "0.0.0", "dependencies": { diff --git a/playground/external/package.json b/playground/external/package.json index 19ad4f96430d17..1556e2328bf30d 100644 --- a/playground/external/package.json +++ b/playground/external/package.json @@ -1,5 +1,5 @@ { - "name": "external-test", + "name": "@vitejs/test-external", "private": true, "version": "0.0.0", "scripts": { @@ -9,8 +9,8 @@ "preview": "vite preview" }, "dependencies": { - "@vitejs/dep-that-imports": "file:./dep-that-imports", - "@vitejs/dep-that-requires": "file:./dep-that-requires" + "@vitejs/test-dep-that-imports": "file:./dep-that-imports", + "@vitejs/test-dep-that-requires": "file:./dep-that-requires" }, "devDependencies": { "slash3": "npm:slash@^3.0.0", diff --git a/playground/external/src/main.js b/playground/external/src/main.js index f16b94b75706e5..46d97cebd47915 100644 --- a/playground/external/src/main.js +++ b/playground/external/src/main.js @@ -1,2 +1,2 @@ -import '@vitejs/dep-that-imports' -import '@vitejs/dep-that-requires' +import '@vitejs/test-dep-that-imports' +import '@vitejs/test-dep-that-requires' diff --git a/playground/file-delete-restore/package.json b/playground/file-delete-restore/package.json index 28a934274df169..ce3246877e945f 100644 --- a/playground/file-delete-restore/package.json +++ b/playground/file-delete-restore/package.json @@ -1,5 +1,5 @@ { - "name": "test-file-delete-restore", + "name": "@vitejs/test-file-delete-restore", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/fs-serve/package.json b/playground/fs-serve/package.json index 6a5d18e2303c53..15fdfe3294cd83 100644 --- a/playground/fs-serve/package.json +++ b/playground/fs-serve/package.json @@ -1,5 +1,5 @@ { - "name": "test-fs-serve", + "name": "@vitejs/test-fs-serve", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/glob-import/package.json b/playground/glob-import/package.json index 2dd90e31b73b25..f3ac7ae9313db5 100644 --- a/playground/glob-import/package.json +++ b/playground/glob-import/package.json @@ -1,5 +1,5 @@ { - "name": "test-import-context", + "name": "@vitejs/test-import-context", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/hmr/package.json b/playground/hmr/package.json index b797d181b17ece..8bb1d44d18bbe0 100644 --- a/playground/hmr/package.json +++ b/playground/hmr/package.json @@ -1,5 +1,5 @@ { - "name": "test-hmr", + "name": "@vitejs/test-hmr", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/html/package.json b/playground/html/package.json index 6db0bd91981ce0..9eadef9f1a71a8 100644 --- a/playground/html/package.json +++ b/playground/html/package.json @@ -1,5 +1,5 @@ { - "name": "test-html", + "name": "@vitejs/test-html", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/import-assertion/import-assertion-dep/package.json b/playground/import-assertion/import-assertion-dep/package.json index 6f701dc444bd67..9d03675fb4a5da 100644 --- a/playground/import-assertion/import-assertion-dep/package.json +++ b/playground/import-assertion/import-assertion-dep/package.json @@ -1,5 +1,5 @@ { - "name": "@vitejs/import-assertion-dep", + "name": "@vitejs/test-import-assertion-dep", "private": true, "version": "0.0.0", "type": "module", diff --git a/playground/import-assertion/index.html b/playground/import-assertion/index.html index 54b576a17ba66f..1135de1ff891e0 100644 --- a/playground/import-assertion/index.html +++ b/playground/import-assertion/index.html @@ -10,7 +10,7 @@

From dependency

import * as data from './data.json' assert { type: 'json' } text('.src', data.foo) - import * as depData from '@vitejs/import-assertion-dep' + import * as depData from '@vitejs/test-import-assertion-dep' text('.dep', depData.hello) function text(el, text) { diff --git a/playground/import-assertion/package.json b/playground/import-assertion/package.json index 68128c59993ffb..03248a46ef4dd3 100644 --- a/playground/import-assertion/package.json +++ b/playground/import-assertion/package.json @@ -1,5 +1,5 @@ { - "name": "test-import-assertion", + "name": "@vitejs/test-import-assertion", "private": true, "version": "0.0.0", "scripts": { @@ -9,6 +9,6 @@ "preview": "vite preview" }, "dependencies": { - "@vitejs/import-assertion-dep": "file:./import-assertion-dep" + "@vitejs/test-import-assertion-dep": "file:./import-assertion-dep" } } diff --git a/playground/js-sourcemap/package.json b/playground/js-sourcemap/package.json index 92b166d2f302c2..4b82881a37e473 100644 --- a/playground/js-sourcemap/package.json +++ b/playground/js-sourcemap/package.json @@ -1,5 +1,5 @@ { - "name": "test-js-sourcemap", + "name": "@vitejs/test-js-sourcemap", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/json/index.html b/playground/json/index.html index 46ed94ab0463f7..ee076836f10b53 100644 --- a/playground/json/index.html +++ b/playground/json/index.html @@ -55,7 +55,7 @@

HMR

import raw from './test.json?raw' text('.raw', raw) - import moduleJSON from 'json-module' + import moduleJSON from '@vitejs/test-json-module' text('.module', JSON.stringify(moduleJSON)) import hasBomJson from './json-bom/has-bom.json' diff --git a/playground/json/json-module/package.json b/playground/json/json-module/package.json index 17db87793a74e3..a02c431845033f 100644 --- a/playground/json/json-module/package.json +++ b/playground/json/json-module/package.json @@ -1,4 +1,4 @@ { - "name": "json-module", + "name": "@vitejs/test-json-module", "version": "0.0.0" } diff --git a/playground/json/package.json b/playground/json/package.json index 2347cb2e1ebfb7..cf4584ffd3d451 100644 --- a/playground/json/package.json +++ b/playground/json/package.json @@ -1,5 +1,5 @@ { - "name": "test-json", + "name": "@vitejs/test-json", "private": true, "version": "0.0.0", "scripts": { @@ -13,7 +13,7 @@ }, "devDependencies": { "express": "^4.18.2", - "json-module": "file:./json-module", + "@vitejs/test-json-module": "file:./json-module", "vue": "^3.2.45" } } diff --git a/playground/legacy/package.json b/playground/legacy/package.json index 16cfc66dc1a9a7..7c001f641cb3c1 100644 --- a/playground/legacy/package.json +++ b/playground/legacy/package.json @@ -1,5 +1,5 @@ { - "name": "test-legacy", + "name": "@vitejs/test-legacy", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/lib/package.json b/playground/lib/package.json index 66b827b7c84179..89b3f8fb909c06 100644 --- a/playground/lib/package.json +++ b/playground/lib/package.json @@ -1,5 +1,5 @@ { - "name": "@example/my-lib", + "name": "@vitejs/test-my-lib", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/minify/package.json b/playground/minify/package.json index e46abf8c4b218c..75fbfe7f5e0973 100644 --- a/playground/minify/package.json +++ b/playground/minify/package.json @@ -1,5 +1,5 @@ { - "name": "test-minify", + "name": "@vitejs/test-minify", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/multiple-entrypoints/package.json b/playground/multiple-entrypoints/package.json index a64997aedc5af1..92ea62649ff4f0 100644 --- a/playground/multiple-entrypoints/package.json +++ b/playground/multiple-entrypoints/package.json @@ -1,5 +1,5 @@ { - "name": "multiple-entrypoints", + "name": "@vitejs/test-multiple-entrypoints", "private": true, "version": "0.0.0", "scripts": { diff --git a/playground/nested-deps/index.html b/playground/nested-deps/index.html index b301d32cafc012..2efb4f71044208 100644 --- a/playground/nested-deps/index.html +++ b/playground/nested-deps/index.html @@ -23,12 +23,12 @@

exclude dependency of pre-bundled dependency

nested module instance count:

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 diff --git a/playground/vue-legacy/env.d.ts b/playground/vue-legacy/env.d.ts deleted file mode 100644 index 31dca6bb40c906..00000000000000 --- a/playground/vue-legacy/env.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module '*.png' diff --git a/playground/vue-legacy/index.html b/playground/vue-legacy/index.html deleted file mode 100644 index 0f7b79435ed47d..00000000000000 --- a/playground/vue-legacy/index.html +++ /dev/null @@ -1,7 +0,0 @@ -