Repository: vitejs/vite Branch: main Commit: d63fb0044a31 Files: 2368 Total size: 4.2 MB Directory structure: gitextract_h4n11kqg/ ├── .editorconfig ├── .git-blame-ignore-revs ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── docs.yml │ │ └── feature_request.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── commit-convention.md │ ├── copilot-instructions.md │ ├── renovate.json5 │ └── workflows/ │ ├── ci.yml │ ├── copilot-setup-steps.yml │ ├── ecosystem-ci-trigger.yml │ ├── issue-close-require.yml │ ├── issue-labeled.yml │ ├── issue-template-check.yml │ ├── lock-closed-issues.yml │ ├── preview-release.yml │ ├── publish.yml │ ├── release-tag.yml │ └── semantic-pull-request.yml ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── docs/ │ ├── .vitepress/ │ │ ├── buildEnd.config.ts │ │ ├── config.ts │ │ ├── inlined-scripts/ │ │ │ ├── banner.d.ts │ │ │ └── banner.js │ │ └── theme/ │ │ ├── components/ │ │ │ ├── AsideSponsors.vue │ │ │ ├── BlogIndex.vue │ │ │ ├── NonInheritBadge.vue │ │ │ ├── ScrimbaLink.vue │ │ │ ├── SponsorBanner.vue │ │ │ ├── SupportedVersions.vue │ │ │ ├── SvgImage.vue │ │ │ └── YouTubeVideo.vue │ │ ├── composables/ │ │ │ └── sponsor.ts │ │ ├── index.ts │ │ ├── landing/ │ │ │ ├── Community.vue │ │ │ ├── FeatureGrid1.vue │ │ │ ├── FeatureGrid2.vue │ │ │ ├── Frameworks.vue │ │ │ ├── Hero.vue │ │ │ └── Layout.vue │ │ ├── live/ │ │ │ ├── Events.vue │ │ │ ├── Hero.vue │ │ │ ├── Layout.vue │ │ │ ├── TimeoutSwitcher.vue │ │ │ ├── Timer.vue │ │ │ ├── VideoIframe.vue │ │ │ └── useYoutubePlayer.ts │ │ └── styles.css │ ├── _data/ │ │ ├── acknowledgements.data.ts │ │ ├── blog.data.ts │ │ └── team.js │ ├── acknowledgements.md │ ├── blog/ │ │ ├── announcing-vite2.md │ │ ├── announcing-vite3.md │ │ ├── announcing-vite4-3.md │ │ ├── announcing-vite4.md │ │ ├── announcing-vite5-1.md │ │ ├── announcing-vite5.md │ │ ├── announcing-vite6.md │ │ ├── announcing-vite7.md │ │ ├── announcing-vite8-beta.md │ │ └── announcing-vite8.md │ ├── blog.md │ ├── changes/ │ │ ├── hotupdate-hook.md │ │ ├── index.md │ │ ├── per-environment-apis.md │ │ ├── shared-plugins-during-build.md │ │ ├── ssr-using-modulerunner.md │ │ └── this-environment-in-hooks.md │ ├── config/ │ │ ├── build-options.md │ │ ├── dep-optimization-options.md │ │ ├── index.md │ │ ├── preview-options.md │ │ ├── server-options.md │ │ ├── shared-options.md │ │ ├── ssr-options.md │ │ └── worker-options.md │ ├── guide/ │ │ ├── api-environment-frameworks.md │ │ ├── api-environment-instances.md │ │ ├── api-environment-plugins.md │ │ ├── api-environment-runtimes.md │ │ ├── api-environment.md │ │ ├── api-hmr.md │ │ ├── api-javascript.md │ │ ├── api-plugin.md │ │ ├── assets.md │ │ ├── backend-integration.md │ │ ├── build.md │ │ ├── cli.md │ │ ├── dep-pre-bundling.md │ │ ├── env-and-mode.md │ │ ├── features.md │ │ ├── index.md │ │ ├── migration.md │ │ ├── performance.md │ │ ├── philosophy.md │ │ ├── ssr.md │ │ ├── static-deploy-github-pages.yaml │ │ ├── static-deploy.md │ │ ├── troubleshooting.md │ │ ├── using-plugins.md │ │ └── why.md │ ├── images/ │ │ └── diagrams.fig │ ├── index.md │ ├── live.md │ ├── package.json │ ├── plugins/ │ │ └── index.md │ ├── public/ │ │ ├── _headers │ │ └── _redirects │ ├── releases.md │ ├── team.md │ └── tsconfig.json ├── eslint.config.js ├── netlify.toml ├── package.json ├── packages/ │ ├── create-vite/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── cli.spec.ts │ │ ├── index.js │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── template-lit/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ └── src/ │ │ │ ├── index.css │ │ │ └── my-element.js │ │ ├── template-lit-ts/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── index.css │ │ │ │ └── my-element.ts │ │ │ └── tsconfig.json │ │ ├── template-preact/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── app.css │ │ │ │ ├── app.jsx │ │ │ │ ├── index.css │ │ │ │ └── main.jsx │ │ │ └── vite.config.js │ │ ├── template-preact-ts/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── app.css │ │ │ │ ├── app.tsx │ │ │ │ ├── index.css │ │ │ │ └── main.tsx │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── template-qwik/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── app.css │ │ │ │ ├── app.jsx │ │ │ │ ├── index.css │ │ │ │ └── main.jsx │ │ │ └── vite.config.js │ │ ├── template-qwik-ts/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── app.css │ │ │ │ ├── app.tsx │ │ │ │ ├── index.css │ │ │ │ └── main.tsx │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── template-react/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── eslint.config.js │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.css │ │ │ │ ├── App.jsx │ │ │ │ ├── index.css │ │ │ │ └── main.jsx │ │ │ └── vite.config.js │ │ ├── template-react-ts/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── eslint.config.js │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.css │ │ │ │ ├── App.tsx │ │ │ │ ├── index.css │ │ │ │ └── main.tsx │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── template-solid/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.css │ │ │ │ ├── App.jsx │ │ │ │ ├── index.css │ │ │ │ └── index.jsx │ │ │ └── vite.config.js │ │ ├── template-solid-ts/ │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.css │ │ │ │ ├── App.tsx │ │ │ │ ├── index.css │ │ │ │ └── index.tsx │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── template-svelte/ │ │ │ ├── .vscode/ │ │ │ │ └── extensions.json │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── jsconfig.json │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.svelte │ │ │ │ ├── app.css │ │ │ │ ├── lib/ │ │ │ │ │ └── Counter.svelte │ │ │ │ └── main.js │ │ │ ├── svelte.config.js │ │ │ └── vite.config.js │ │ ├── template-svelte-ts/ │ │ │ ├── .vscode/ │ │ │ │ └── extensions.json │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.svelte │ │ │ │ ├── app.css │ │ │ │ ├── lib/ │ │ │ │ │ └── Counter.svelte │ │ │ │ └── main.ts │ │ │ ├── svelte.config.js │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── template-vanilla/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ └── src/ │ │ │ ├── counter.js │ │ │ ├── main.js │ │ │ └── style.css │ │ ├── template-vanilla-ts/ │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── counter.ts │ │ │ │ ├── main.ts │ │ │ │ └── style.css │ │ │ └── tsconfig.json │ │ ├── template-vue/ │ │ │ ├── .vscode/ │ │ │ │ └── extensions.json │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── components/ │ │ │ │ │ └── HelloWorld.vue │ │ │ │ ├── main.js │ │ │ │ └── style.css │ │ │ └── vite.config.js │ │ ├── template-vue-ts/ │ │ │ ├── .vscode/ │ │ │ │ └── extensions.json │ │ │ ├── README.md │ │ │ ├── _gitignore │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── components/ │ │ │ │ │ └── HelloWorld.vue │ │ │ │ ├── main.ts │ │ │ │ └── style.css │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.ts │ │ ├── tsconfig.json │ │ └── tsdown.config.ts │ ├── plugin-legacy/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ ├── readme.spec.ts │ │ │ │ └── snippets.spec.ts │ │ │ ├── index.ts │ │ │ ├── shims.d.ts │ │ │ ├── snippets.ts │ │ │ └── types.ts │ │ ├── tsconfig.json │ │ └── tsdown.config.ts │ └── vite/ │ ├── CHANGELOG.md │ ├── LICENSE.md │ ├── README.md │ ├── bin/ │ │ ├── openChrome.js │ │ └── vite.js │ ├── client.d.ts │ ├── misc/ │ │ ├── false.d.ts │ │ ├── false.js │ │ ├── true.d.ts │ │ └── true.js │ ├── package.json │ ├── rolldown.config.ts │ ├── rolldown.dts.config.ts │ ├── rollupLicensePlugin.ts │ ├── scripts/ │ │ ├── benchCircularImport.ts │ │ └── generateTarget.ts │ ├── src/ │ │ ├── client/ │ │ │ ├── client.ts │ │ │ ├── env.ts │ │ │ ├── overlay.ts │ │ │ └── tsconfig.json │ │ ├── module-runner/ │ │ │ ├── __tests_dts__/ │ │ │ │ ├── importMeta.ts │ │ │ │ └── tsconfig.json │ │ │ ├── constants.ts │ │ │ ├── createImportMeta.ts │ │ │ ├── esmEvaluator.ts │ │ │ ├── evaluatedModules.ts │ │ │ ├── hmrHandler.ts │ │ │ ├── hmrLogger.ts │ │ │ ├── importMetaResolver.ts │ │ │ ├── index.ts │ │ │ ├── runner.ts │ │ │ ├── sourcemap/ │ │ │ │ ├── decoder.ts │ │ │ │ ├── index.ts │ │ │ │ └── interceptor.ts │ │ │ ├── tsconfig.json │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── node/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── utils.spec.ts.snap │ │ │ │ ├── assetSource.spec.ts │ │ │ │ ├── build.spec.ts │ │ │ │ ├── config.spec.ts │ │ │ │ ├── constants.spec.ts │ │ │ │ ├── dev.spec.ts │ │ │ │ ├── env.spec.ts │ │ │ │ ├── environment.spec.ts │ │ │ │ ├── external.spec.ts │ │ │ │ ├── filterRegex.spec.ts │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── cjs-ssr-dep/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── entry/ │ │ │ │ │ │ │ ├── imports-field.ts │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ ├── vite.config.import-attributes.ts │ │ │ │ │ │ │ └── vite.config.ts │ │ │ │ │ │ ├── import-meta/ │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ └── vite.config.ts │ │ │ │ │ │ ├── loadConfigFromFile/ │ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ │ ├── native-import/ │ │ │ │ │ │ │ └── basic.js │ │ │ │ │ │ ├── plugin-module-condition/ │ │ │ │ │ │ │ ├── index.cjs │ │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ │ ├── index.mjs │ │ │ │ │ │ │ ├── module.mjs │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ ├── shebang/ │ │ │ │ │ │ │ └── vite.config.ts │ │ │ │ │ │ └── siblings/ │ │ │ │ │ │ ├── foo.ts │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── dynamic-import/ │ │ │ │ │ │ ├── dep.mjs │ │ │ │ │ │ └── entry.mjs │ │ │ │ │ ├── emit-assets/ │ │ │ │ │ │ ├── css-module.module.css │ │ │ │ │ │ ├── css-normal.css │ │ │ │ │ │ └── entry.mjs │ │ │ │ │ ├── environment-alias/ │ │ │ │ │ │ ├── test.client.js │ │ │ │ │ │ ├── test.rsc.js │ │ │ │ │ │ └── test.ssr.js │ │ │ │ │ ├── file-url/ │ │ │ │ │ │ ├── entry.js │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── runner-import/ │ │ │ │ │ │ ├── basic.ts │ │ │ │ │ │ ├── cjs.js │ │ │ │ │ │ ├── dynamic-import-dep.ts │ │ │ │ │ │ ├── dynamic-import.ts │ │ │ │ │ │ ├── plugin.ts │ │ │ │ │ │ ├── vite.config.outside-pkg-import.mts │ │ │ │ │ │ └── vite.config.ts │ │ │ │ │ ├── scan-jsx-runtime/ │ │ │ │ │ │ ├── entry-jsx.tsx │ │ │ │ │ │ ├── entry-no-jsx.js │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ ├── shared-config-build/ │ │ │ │ │ │ └── emitAssets/ │ │ │ │ │ │ ├── entry.js │ │ │ │ │ │ └── test.css │ │ │ │ │ ├── shared-plugins/ │ │ │ │ │ │ └── minify/ │ │ │ │ │ │ └── entry.js │ │ │ │ │ ├── test-dep-conditions/ │ │ │ │ │ │ ├── dir/ │ │ │ │ │ │ │ ├── index.default.js │ │ │ │ │ │ │ └── index.module.js │ │ │ │ │ │ ├── index.browser.js │ │ │ │ │ │ ├── index.css │ │ │ │ │ │ ├── index.custom1.js │ │ │ │ │ │ ├── index.default.js │ │ │ │ │ │ ├── index.worker.js │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── test-dep-conditions-app/ │ │ │ │ │ │ ├── entry-with-module.js │ │ │ │ │ │ ├── entry.css │ │ │ │ │ │ └── entry.js │ │ │ │ │ ├── watch-rebuild-manifest/ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ ├── entry.js │ │ │ │ │ │ └── package.json │ │ │ │ │ └── worker-dynamic/ │ │ │ │ │ ├── dynamic.js │ │ │ │ │ ├── main.js │ │ │ │ │ └── worker.js │ │ │ │ ├── http.spec.ts │ │ │ │ ├── optimizer/ │ │ │ │ │ └── rolldownDepPlugin.spec.ts │ │ │ │ ├── package.json │ │ │ │ ├── packages/ │ │ │ │ │ ├── build-project/ │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── child/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── module/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── name/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── noname/ │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── package.json │ │ │ │ │ └── parent/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── package.json │ │ │ │ ├── plugins/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── license.spec.ts.snap │ │ │ │ │ ├── assetImportMetaUrl.spec.ts │ │ │ │ │ ├── css.spec.ts │ │ │ │ │ ├── define.spec.ts │ │ │ │ │ ├── dynamicImportVar/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── parse.spec.ts.snap │ │ │ │ │ │ ├── mods/ │ │ │ │ │ │ │ ├── hello.js │ │ │ │ │ │ │ └── hi.js │ │ │ │ │ │ └── parse.spec.ts │ │ │ │ │ ├── esbuild.spec.ts │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ ├── css-module-compose/ │ │ │ │ │ │ │ └── css/ │ │ │ │ │ │ │ └── bar.module.css │ │ │ │ │ │ ├── license/ │ │ │ │ │ │ │ ├── dep-licence-cc0/ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── licence │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── dep-license-mit/ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── license │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── dep-nested-license-isc/ │ │ │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── index.html │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ ├── oxc-tsconfigs/ │ │ │ │ │ │ │ ├── decorator-metadata/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── empty/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── jsx-complex-options/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── jsx-preserve/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── jsx-react-jsx/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── target-es2021/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── target-es2022/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── target-esnext/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ ├── use-define-false/ │ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ │ └── use-define-true/ │ │ │ │ │ │ │ └── tsconfig.json │ │ │ │ │ │ └── worker-url/ │ │ │ │ │ │ ├── entry.js │ │ │ │ │ │ └── worker.js │ │ │ │ │ ├── hooks.spec.ts │ │ │ │ │ ├── import.spec.ts │ │ │ │ │ ├── importGlob/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── fixture.spec.ts.snap │ │ │ │ │ │ ├── fixture-a/ │ │ │ │ │ │ │ ├── .foo/ │ │ │ │ │ │ │ │ └── test.ts │ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── modules/ │ │ │ │ │ │ │ │ ├── a.ts │ │ │ │ │ │ │ │ ├── b.ts │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ └── sibling.ts │ │ │ │ │ │ ├── fixture-b/ │ │ │ │ │ │ │ ├── a.ts │ │ │ │ │ │ │ ├── b.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── fixture.spec.ts │ │ │ │ │ │ ├── parse.spec.ts │ │ │ │ │ │ └── utils.spec.ts │ │ │ │ │ ├── index.spec.ts │ │ │ │ │ ├── license.spec.ts │ │ │ │ │ ├── modulePreloadPolyfill/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── modulePreloadPolyfill.spec.ts.snap │ │ │ │ │ │ └── modulePreloadPolyfill.spec.ts │ │ │ │ │ ├── oxc.spec.ts │ │ │ │ │ ├── pluginFilter.spec.ts │ │ │ │ │ ├── terser.spec.ts │ │ │ │ │ ├── wasm.spec.ts │ │ │ │ │ ├── worker.spec.ts │ │ │ │ │ └── workerImportMetaUrl.spec.ts │ │ │ │ ├── resolve.spec.ts │ │ │ │ ├── runnerImport.spec.ts │ │ │ │ ├── scan.spec.ts │ │ │ │ ├── shortcuts.spec.ts │ │ │ │ ├── utils/ │ │ │ │ │ └── isFileReadable/ │ │ │ │ │ └── permission-test-file │ │ │ │ └── utils.spec.ts │ │ │ ├── __tests_dts__/ │ │ │ │ ├── config.ts │ │ │ │ ├── plugin.ts │ │ │ │ ├── tsconfig.json │ │ │ │ ├── typeOptions.ts │ │ │ │ └── utils.ts │ │ │ ├── assetSource.ts │ │ │ ├── baseEnvironment.ts │ │ │ ├── build.ts │ │ │ ├── cli.ts │ │ │ ├── config.ts │ │ │ ├── constants.ts │ │ │ ├── deprecations.ts │ │ │ ├── env.ts │ │ │ ├── environment.ts │ │ │ ├── external.ts │ │ │ ├── http.ts │ │ │ ├── idResolver.ts │ │ │ ├── index.ts │ │ │ ├── internalIndex.ts │ │ │ ├── logger.ts │ │ │ ├── nodeResolve.ts │ │ │ ├── optimizer/ │ │ │ │ ├── index.ts │ │ │ │ ├── optimizer.ts │ │ │ │ ├── pluginConverter.ts │ │ │ │ ├── resolve.ts │ │ │ │ ├── rolldownDepPlugin.ts │ │ │ │ └── scan.ts │ │ │ ├── packages.ts │ │ │ ├── plugin.ts │ │ │ ├── plugins/ │ │ │ │ ├── asset.ts │ │ │ │ ├── assetImportMetaUrl.ts │ │ │ │ ├── clientInjections.ts │ │ │ │ ├── css.ts │ │ │ │ ├── define.ts │ │ │ │ ├── dynamicImportVars.ts │ │ │ │ ├── esbuild.ts │ │ │ │ ├── esbuildBannerFooterCompatPlugin.ts │ │ │ │ ├── forwardConsole.ts │ │ │ │ ├── html.ts │ │ │ │ ├── importAnalysis.ts │ │ │ │ ├── importAnalysisBuild.ts │ │ │ │ ├── importMetaGlob.ts │ │ │ │ ├── index.ts │ │ │ │ ├── json.ts │ │ │ │ ├── license.ts │ │ │ │ ├── manifest.ts │ │ │ │ ├── modulePreloadPolyfill.ts │ │ │ │ ├── optimizedDeps.ts │ │ │ │ ├── oxc.ts │ │ │ │ ├── pluginFilter.ts │ │ │ │ ├── preAlias.ts │ │ │ │ ├── prepareOutDir.ts │ │ │ │ ├── reporter.ts │ │ │ │ ├── resolve.ts │ │ │ │ ├── terser.ts │ │ │ │ ├── wasm.ts │ │ │ │ ├── worker.ts │ │ │ │ └── workerImportMetaUrl.ts │ │ │ ├── preview.ts │ │ │ ├── publicDir.ts │ │ │ ├── server/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ ├── lerna/ │ │ │ │ │ │ │ ├── lerna.json │ │ │ │ │ │ │ └── nested/ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ ├── none/ │ │ │ │ │ │ │ └── nested/ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ ├── pnpm/ │ │ │ │ │ │ │ ├── nested/ │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ └── pnpm-workspace.yaml │ │ │ │ │ │ ├── watcher/ │ │ │ │ │ │ │ ├── config-deps/ │ │ │ │ │ │ │ │ └── foo.js │ │ │ │ │ │ │ ├── custom-public/ │ │ │ │ │ │ │ │ └── foo.txt │ │ │ │ │ │ │ ├── nested-root/ │ │ │ │ │ │ │ │ └── vite.config.js │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ └── yarn/ │ │ │ │ │ │ ├── nested/ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── moduleGraph.spec.ts │ │ │ │ │ ├── pluginContainer.spec.ts │ │ │ │ │ ├── search-root.spec.ts │ │ │ │ │ ├── transformRequest.spec.ts │ │ │ │ │ └── watcher.spec.ts │ │ │ │ ├── environment.ts │ │ │ │ ├── environments/ │ │ │ │ │ ├── fetchableEnvironments.ts │ │ │ │ │ ├── fullBundleEnvironment.ts │ │ │ │ │ └── runnableEnvironment.ts │ │ │ │ ├── hmr.ts │ │ │ │ ├── index.ts │ │ │ │ ├── middlewares/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── hostCheck.spec.ts │ │ │ │ │ │ └── static.spec.ts │ │ │ │ │ ├── base.ts │ │ │ │ │ ├── error.ts │ │ │ │ │ ├── hostCheck.ts │ │ │ │ │ ├── htmlFallback.ts │ │ │ │ │ ├── indexHtml.ts │ │ │ │ │ ├── memoryFiles.ts │ │ │ │ │ ├── notFound.ts │ │ │ │ │ ├── proxy.ts │ │ │ │ │ ├── rejectInvalidRequest.ts │ │ │ │ │ ├── rejectNoCorsRequest.ts │ │ │ │ │ ├── static.ts │ │ │ │ │ ├── time.ts │ │ │ │ │ └── transform.ts │ │ │ │ ├── mixedModuleGraph.ts │ │ │ │ ├── moduleGraph.ts │ │ │ │ ├── openBrowser.ts │ │ │ │ ├── pluginContainer.ts │ │ │ │ ├── searchRoot.ts │ │ │ │ ├── send.ts │ │ │ │ ├── sourcemap.ts │ │ │ │ ├── transformRequest.ts │ │ │ │ ├── warmup.ts │ │ │ │ └── ws.ts │ │ │ ├── shortcuts.ts │ │ │ ├── ssr/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ssrLoadModule.spec.ts.snap │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ ├── bundled-with-sourcemaps/ │ │ │ │ │ │ │ └── bundle.js │ │ │ │ │ │ ├── errors/ │ │ │ │ │ │ │ ├── syntax-error-dep.js │ │ │ │ │ │ │ ├── syntax-error-dep.ts │ │ │ │ │ │ │ ├── syntax-error.js │ │ │ │ │ │ │ └── syntax-error.ts │ │ │ │ │ │ ├── file-url/ │ │ │ │ │ │ │ ├── test space.js │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ ├── global/ │ │ │ │ │ │ │ ├── export.js │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ ├── json/ │ │ │ │ │ │ │ └── test.json │ │ │ │ │ │ ├── modules/ │ │ │ │ │ │ │ ├── has-error.js │ │ │ │ │ │ │ ├── has-invalid-import.js │ │ │ │ │ │ │ └── import-meta.js │ │ │ │ │ │ ├── multi-source-sourcemaps/ │ │ │ │ │ │ │ ├── dist.js │ │ │ │ │ │ │ ├── entrypoint.js │ │ │ │ │ │ │ └── nested-directory/ │ │ │ │ │ │ │ └── nested-file.js │ │ │ │ │ │ └── named-overwrite-all/ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ └── main.js │ │ │ │ │ ├── ssrLoadModule.spec.ts │ │ │ │ │ ├── ssrStacktrace.spec.ts │ │ │ │ │ └── ssrTransform.spec.ts │ │ │ │ ├── fetchModule.ts │ │ │ │ ├── index.ts │ │ │ │ ├── runnerImport.ts │ │ │ │ ├── runtime/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ │ ├── a.ts │ │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ │ └── placeholder.txt │ │ │ │ │ │ │ ├── assets.js │ │ │ │ │ │ │ ├── b.ts │ │ │ │ │ │ │ ├── basic.js │ │ │ │ │ │ │ ├── builtin-import.ts │ │ │ │ │ │ │ ├── c.ts │ │ │ │ │ │ │ ├── circular/ │ │ │ │ │ │ │ │ ├── circular-a.js │ │ │ │ │ │ │ │ ├── circular-b.js │ │ │ │ │ │ │ │ └── circular-index.js │ │ │ │ │ │ │ ├── cjs-external/ │ │ │ │ │ │ │ │ ├── index.cjs │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── cjs-external-existing.js │ │ │ │ │ │ │ ├── cjs-external-non-existing.js │ │ │ │ │ │ │ ├── cyclic/ │ │ │ │ │ │ │ │ ├── action.js │ │ │ │ │ │ │ │ ├── entry-cyclic.js │ │ │ │ │ │ │ │ └── entry.js │ │ │ │ │ │ │ ├── cyclic2/ │ │ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ │ ├── test1/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test2/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test3/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test4/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test5/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test6/ │ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test7/ │ │ │ │ │ │ │ │ │ ├── Ion.js │ │ │ │ │ │ │ │ │ ├── IonTypes.js │ │ │ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ │ │ │ └── dom/ │ │ │ │ │ │ │ │ │ ├── Blob.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── test9/ │ │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── d.ts │ │ │ │ │ │ │ ├── default-string.ts │ │ │ │ │ │ │ ├── dynamic-import.js │ │ │ │ │ │ │ ├── esm-external/ │ │ │ │ │ │ │ │ ├── index.mjs │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ ├── esm-external-existing.js │ │ │ │ │ │ │ ├── esm-external-non-existing.js │ │ │ │ │ │ │ ├── execution-order-re-export/ │ │ │ │ │ │ │ │ ├── dep1.js │ │ │ │ │ │ │ │ ├── dep2.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── has-error-deep.ts │ │ │ │ │ │ │ ├── has-error-first-comment.ts │ │ │ │ │ │ │ ├── has-error-first.js │ │ │ │ │ │ │ ├── has-error.js │ │ │ │ │ │ │ ├── hmr.js │ │ │ │ │ │ │ ├── import-external.ts │ │ │ │ │ │ │ ├── installed.js │ │ │ │ │ │ │ ├── invalid-package/ │ │ │ │ │ │ │ │ ├── deps/ │ │ │ │ │ │ │ │ │ └── test-dep-invalid-exports/ │ │ │ │ │ │ │ │ │ └── package.json │ │ │ │ │ │ │ │ └── test.js │ │ │ │ │ │ │ ├── live-binding/ │ │ │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ │ │ ├── test1/ │ │ │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test2/ │ │ │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ ├── test3/ │ │ │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ │ └── test4/ │ │ │ │ │ │ │ │ ├── dep.js │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── native.js │ │ │ │ │ │ │ ├── no-this/ │ │ │ │ │ │ │ │ ├── importee.js │ │ │ │ │ │ │ │ └── importer.js │ │ │ │ │ │ │ ├── oxc-runtime-helper.ts │ │ │ │ │ │ │ ├── pre-source-mapped-file.js │ │ │ │ │ │ │ ├── simple.js │ │ │ │ │ │ │ ├── string-literal-sourcemap.ts │ │ │ │ │ │ │ ├── test.css │ │ │ │ │ │ │ ├── test.module.css │ │ │ │ │ │ │ ├── throws-error-method.ts │ │ │ │ │ │ │ ├── top-level-object.js │ │ │ │ │ │ │ ├── virtual.js │ │ │ │ │ │ │ ├── worker.invoke.mjs │ │ │ │ │ │ │ └── worker.mjs │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ ├── server-hmr.spec.ts │ │ │ │ │ │ ├── server-no-hmr.spec.ts │ │ │ │ │ │ ├── server-runtime.spec.ts │ │ │ │ │ │ ├── server-source-maps.spec.ts │ │ │ │ │ │ ├── server-worker-runner.invoke.spec.ts │ │ │ │ │ │ ├── server-worker-runner.spec.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ └── serverModuleRunner.ts │ │ │ │ ├── ssrManifestPlugin.ts │ │ │ │ ├── ssrModuleLoader.ts │ │ │ │ ├── ssrStacktrace.ts │ │ │ │ └── ssrTransform.ts │ │ │ ├── tsconfig.json │ │ │ ├── typeUtils.ts │ │ │ ├── utils.ts │ │ │ └── watch.ts │ │ ├── shared/ │ │ │ ├── __tests__/ │ │ │ │ └── forwardConsole.spec.ts │ │ │ ├── builtin.ts │ │ │ ├── constants.ts │ │ │ ├── forwardConsole.ts │ │ │ ├── hmr.ts │ │ │ ├── hmrHandler.ts │ │ │ ├── invokeMethods.ts │ │ │ ├── moduleRunnerTransport.ts │ │ │ ├── ssrTransform.ts │ │ │ ├── tsconfig.json │ │ │ └── utils.ts │ │ └── types/ │ │ ├── alias.d.ts │ │ ├── anymatch.d.ts │ │ ├── chokidar.d.ts │ │ ├── commonjs.d.ts │ │ ├── connect.d.ts │ │ ├── dynamicImportVars.d.ts │ │ ├── package.json │ │ ├── shims.d.ts │ │ └── ws.d.ts │ ├── tsconfig.base.json │ ├── tsconfig.check.json │ ├── tsconfig.json │ └── types/ │ ├── customEvent.d.ts │ ├── hmrPayload.d.ts │ ├── hot.d.ts │ ├── import-meta.d.ts │ ├── importGlob.d.ts │ ├── importMeta.d.ts │ ├── internal/ │ │ ├── cssPreprocessorOptions.d.ts │ │ ├── esbuildOptions.d.ts │ │ ├── lightningcssOptions.d.ts │ │ ├── rollupTypeCompat.d.ts │ │ └── terserOptions.d.ts │ └── metadata.d.ts ├── patches/ │ ├── chokidar@3.6.0.patch │ ├── dotenv-expand@12.0.3.patch │ └── sirv@3.0.2.patch ├── playground/ │ ├── alias/ │ │ ├── __tests__/ │ │ │ └── alias.spec.ts │ │ ├── customResolver.js │ │ ├── dir/ │ │ │ ├── from-script-src.js │ │ │ ├── module/ │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ ├── test.css │ │ │ ├── test.js │ │ │ └── url_conflict.js │ │ ├── index.html │ │ ├── package.json │ │ ├── test.js │ │ └── vite.config.js │ ├── assets/ │ │ ├── __tests__/ │ │ │ ├── assets.spec.ts │ │ │ ├── encoded-base/ │ │ │ │ └── assets-encoded-base.spec.ts │ │ │ ├── relative-base/ │ │ │ │ └── assets-relative-base.spec.ts │ │ │ ├── runtime-base/ │ │ │ │ └── assets-runtime-base.spec.ts │ │ │ └── url-base/ │ │ │ └── assets-url-base.spec.ts │ │ ├── asset/ │ │ │ ├── main.js │ │ │ └── style.css │ │ ├── css/ │ │ │ ├── css-url-url.css │ │ │ ├── css-url.css │ │ │ ├── fonts.css │ │ │ ├── foo.module.css │ │ │ ├── icons.css │ │ │ ├── import.css │ │ │ ├── manual-chunks.css │ │ │ └── nested/ │ │ │ └── at-imported-css-url.css │ │ ├── foo.js │ │ ├── index.html │ │ ├── manifest.json │ │ ├── multiline-import-meta-url.js │ │ ├── nested/ │ │ │ ├── foo.unknown │ │ │ ├── partial.html │ │ │ └── test.js │ │ ├── package.json │ │ ├── static/ │ │ │ ├── bar │ │ │ ├── foo.css │ │ │ ├── foo.json │ │ │ ├── foo.txt │ │ │ ├── import-expression.js │ │ │ ├── raw.css │ │ │ ├── raw.js │ │ │ ├── raw.mts │ │ │ └── raw.ts │ │ ├── vite.config-encoded-base.js │ │ ├── vite.config-relative-base.js │ │ ├── vite.config-runtime-base.js │ │ ├── vite.config-url-base.js │ │ ├── vite.config.js │ │ └── テスト-測試-white space.js │ ├── assets-sanitize/ │ │ ├── __tests__/ │ │ │ └── assets-sanitize.spec.ts │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ └── vite.config.js │ ├── backend-integration/ │ │ ├── __tests__/ │ │ │ └── backend-integration.spec.ts │ │ ├── dir/ │ │ │ ├── custom.css │ │ │ └── foo.css │ │ ├── frontend/ │ │ │ ├── entrypoints/ │ │ │ │ ├── foo.pcss │ │ │ │ ├── global.css │ │ │ │ ├── index.html │ │ │ │ ├── main.ts │ │ │ │ └── nested/ │ │ │ │ ├── blue.scss │ │ │ │ └── sub.ts │ │ │ └── styles/ │ │ │ ├── background.css │ │ │ ├── imported.css │ │ │ ├── tailwind.css │ │ │ └── url.css │ │ ├── package.json │ │ ├── references.css │ │ └── vite.config.js │ ├── base-conflict/ │ │ ├── __tests__/ │ │ │ └── base-conflict.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── importee.ts │ │ │ ├── main.ts │ │ │ └── virtualModules.d.ts │ │ └── vite.config.ts │ ├── build-old/ │ │ ├── __tests__/ │ │ │ └── build-old.spec.ts │ │ ├── dynamic.js │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.js │ ├── cli/ │ │ ├── __tests__/ │ │ │ ├── cli.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ └── vite.config.js │ ├── cli-module/ │ │ ├── __tests__/ │ │ │ ├── cli-module.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ └── vite.config.js │ ├── client-reload/ │ │ ├── __tests__/ │ │ │ ├── client-reload.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.ts │ ├── csp/ │ │ ├── __tests__/ │ │ │ └── csp.spec.ts │ │ ├── dynamic.css │ │ ├── dynamic.js │ │ ├── from-js.css │ │ ├── index.html │ │ ├── index.js │ │ ├── linked.css │ │ ├── package.json │ │ └── vite.config.js │ ├── css/ │ │ ├── __tests__/ │ │ │ ├── css.spec.ts │ │ │ ├── lightningcss/ │ │ │ │ └── lightningcss.spec.ts │ │ │ ├── no-css-minify/ │ │ │ │ └── css-no-css-minify.spec.ts │ │ │ ├── postcss-plugins-different-dir/ │ │ │ │ ├── css-postcss-plugins-different-dir.spec.ts │ │ │ │ └── serve.ts │ │ │ ├── same-file-name/ │ │ │ │ └── css-same-file-name.spec.ts │ │ │ ├── sass-modern-compiler-build/ │ │ │ │ └── sass-modern-compiler.spec.ts │ │ │ ├── sass-tests.ts │ │ │ └── tests.ts │ │ ├── aliased/ │ │ │ ├── bar.module.css │ │ │ └── foo.css │ │ ├── async/ │ │ │ ├── async-1.css │ │ │ ├── async-1.js │ │ │ ├── async-2.css │ │ │ ├── async-2.js │ │ │ ├── async-3.js │ │ │ ├── async-3.module.css │ │ │ ├── base.css │ │ │ ├── base.js │ │ │ └── index.js │ │ ├── async-treeshaken.css │ │ ├── async-treeshaken.js │ │ ├── async.css │ │ ├── async.js │ │ ├── charset.css │ │ ├── composed.module.css │ │ ├── composed.module.less │ │ ├── composed.module.scss │ │ ├── composes-path-resolving.module.css │ │ ├── css-dep/ │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── index.scss │ │ │ ├── index.styl │ │ │ └── package.json │ │ ├── css-dep-exports/ │ │ │ ├── foo1.scss │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ ├── style.css │ │ │ └── style.scss │ │ ├── css-js-dep/ │ │ │ ├── bar.module.css │ │ │ ├── foo.css │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── css-proxy-dep/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── css-proxy-dep-nested/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── dep.css │ │ ├── empty.css │ │ ├── file-absolute.scss │ │ ├── folder with space/ │ │ │ └── space.css │ │ ├── glob-dep/ │ │ │ ├── bar.css │ │ │ ├── foo.css │ │ │ └── nested (dir)/ │ │ │ └── baz.css │ │ ├── glob-dep.css │ │ ├── glob-import/ │ │ │ ├── bar.css │ │ │ └── foo.css │ │ ├── imported-at-import.css │ │ ├── imported.css │ │ ├── imported.scss │ │ ├── imports-field.css │ │ ├── imports-imports-field.css │ │ ├── index.html │ │ ├── inline.module.css │ │ ├── inlined.css │ │ ├── jsfile.css.js │ │ ├── layered/ │ │ │ ├── blue.css │ │ │ ├── green.css │ │ │ └── index.css │ │ ├── less/ │ │ │ ├── components/ │ │ │ │ └── form.less │ │ │ └── ommer.less │ │ ├── less-plugin/ │ │ │ └── test.js │ │ ├── less-plugin.less │ │ ├── less.less │ │ ├── lightningcss-plugins.js │ │ ├── linked-at-import.css │ │ ├── linked.css │ │ ├── main.js │ │ ├── manual-chunk.css │ │ ├── minify.css │ │ ├── mod.module.css │ │ ├── mod.module.scss │ │ ├── nested/ │ │ │ ├── _index.scss │ │ │ ├── _partial.scss │ │ │ ├── css-in-less-2.less │ │ │ ├── css-in-less.css │ │ │ ├── css-in-less.less │ │ │ ├── css-in-scss.css │ │ │ ├── nested.less │ │ │ ├── nested.sss │ │ │ ├── nested.styl │ │ │ ├── relative.scss │ │ │ ├── replacement-alias.scss │ │ │ └── root-relative.scss │ │ ├── options/ │ │ │ ├── absolute-import.styl │ │ │ └── relative-import.styl │ │ ├── package.json │ │ ├── pkg-dep/ │ │ │ ├── _index.scss │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── postcss-caching/ │ │ │ ├── blue-app/ │ │ │ │ ├── imported.css │ │ │ │ ├── index.html │ │ │ │ ├── main.js │ │ │ │ ├── package.json │ │ │ │ └── postcss.config.js │ │ │ ├── css.spec.ts │ │ │ ├── green-app/ │ │ │ │ ├── imported.css │ │ │ │ ├── index.html │ │ │ │ ├── main.js │ │ │ │ ├── package.json │ │ │ │ └── postcss.config.js │ │ │ └── serve.ts │ │ ├── postcss-inject-url.css │ │ ├── postcss-source-input.css │ │ ├── postcss.config.js │ │ ├── raw-imported.css │ │ ├── same-name/ │ │ │ ├── sub1/ │ │ │ │ ├── sub.css │ │ │ │ └── sub.js │ │ │ └── sub2/ │ │ │ ├── sub.css │ │ │ └── sub.js │ │ ├── sass-modern-compiler-build/ │ │ │ ├── entry1.scss │ │ │ └── entry2.scss │ │ ├── sass.scss │ │ ├── scss-dir/ │ │ │ ├── dir/ │ │ │ │ └── index.scss │ │ │ └── main.scss │ │ ├── scss-proxy-dep/ │ │ │ ├── index.scss │ │ │ └── package.json │ │ ├── scss-proxy-dep-nested/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── stylus.styl │ │ ├── sugarss.sss │ │ ├── treeshake-module/ │ │ │ ├── a.js │ │ │ ├── a.module.css │ │ │ ├── b.js │ │ │ ├── b.module.css │ │ │ └── index.js │ │ ├── treeshake-scoped/ │ │ │ ├── a-scoped.css │ │ │ ├── a.js │ │ │ ├── b-scoped.css │ │ │ ├── b.js │ │ │ ├── c-scoped.css │ │ │ ├── c.js │ │ │ ├── d-scoped.css │ │ │ ├── d.js │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── order/ │ │ │ ├── a-scoped.css │ │ │ ├── a.js │ │ │ ├── after.css │ │ │ └── before.css │ │ ├── unsupported.css │ │ ├── url-imported.css │ │ ├── vite.config-lightningcss.js │ │ ├── vite.config-no-css-minify.js │ │ ├── vite.config-relative-base.js │ │ ├── vite.config-same-file-name.js │ │ ├── vite.config-sass-modern-compiler-build.js │ │ ├── vite.config.js │ │ └── weapp.wxss │ ├── css-codesplit/ │ │ ├── __tests__/ │ │ │ ├── css-codesplit-consistent.spec.ts │ │ │ └── css-codesplit.spec.ts │ │ ├── async-js.css │ │ ├── async-js.js │ │ ├── async.css │ │ ├── chunk.css │ │ ├── index.html │ │ ├── inline.css │ │ ├── main.css │ │ ├── main.js │ │ ├── mod.module.css │ │ ├── order/ │ │ │ ├── base.css │ │ │ ├── dynamic.css │ │ │ ├── index.js │ │ │ └── insert.js │ │ ├── other.js │ │ ├── package.json │ │ ├── shared-css-empty-1.js │ │ ├── shared-css-empty-2.js │ │ ├── shared-css-main.js │ │ ├── shared-css-no-js.html │ │ ├── shared-css-theme.css │ │ ├── shared-css-with-js.html │ │ ├── style.css │ │ ├── style2.css │ │ ├── style2.js │ │ └── vite.config.js │ ├── css-codesplit-cjs/ │ │ ├── __tests__/ │ │ │ └── css-codesplit-cjs.spec.ts │ │ ├── index.html │ │ ├── main.css │ │ ├── main.js │ │ ├── other.js │ │ ├── package.json │ │ ├── style.css │ │ └── vite.config.js │ ├── css-dynamic-import/ │ │ ├── __tests__/ │ │ │ ├── css-dynamic-import.spec.ts │ │ │ └── serve.ts │ │ ├── dynamic.css │ │ ├── dynamic.js │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ ├── static.css │ │ └── static.js │ ├── css-lightningcss/ │ │ ├── __tests__/ │ │ │ └── css-lightningcss.spec.ts │ │ ├── composed.module.css │ │ ├── composes-path-resolving.module.css │ │ ├── css-url.css │ │ ├── external-url.css │ │ ├── imported-at-import.css │ │ ├── imported.css │ │ ├── index.html │ │ ├── inline.module.css │ │ ├── inlined.css │ │ ├── linked-at-import.css │ │ ├── linked.css │ │ ├── main.js │ │ ├── minify.css │ │ ├── mod.module.css │ │ ├── nested/ │ │ │ └── nested.css │ │ ├── package.json │ │ └── vite.config.js │ ├── css-lightningcss-proxy/ │ │ ├── __tests__/ │ │ │ ├── css-lightningcss-proxy.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── package.json │ │ └── server.js │ ├── css-lightningcss-root/ │ │ ├── __tests__/ │ │ │ └── css-lightningcss-root.spec.ts │ │ ├── package.json │ │ ├── root/ │ │ │ ├── index.html │ │ │ ├── main.js │ │ │ └── url-dep.css │ │ └── vite.config.js │ ├── css-no-codesplit/ │ │ ├── __tests__/ │ │ │ └── css-no-codesplit.spec.ts │ │ ├── async-js.css │ │ ├── async-js.js │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ ├── shared-linked.css │ │ ├── sub.html │ │ └── vite.config.js │ ├── css-sourcemap/ │ │ ├── __tests__/ │ │ │ ├── css-sourcemap.spec.ts │ │ │ ├── lib-entry/ │ │ │ │ └── css-sourcemap-lib-entry.spec.ts │ │ │ └── lightningcss/ │ │ │ └── lightningcss.spec.ts │ │ ├── be-imported.css │ │ ├── imported-nested.sass │ │ ├── imported-with-import.css │ │ ├── imported.css │ │ ├── imported.less │ │ ├── imported.module.sass │ │ ├── imported.sass │ │ ├── imported.sss │ │ ├── imported.styl │ │ ├── index.html │ │ ├── index.js │ │ ├── input-map.css │ │ ├── input-map.src.css │ │ ├── linked-with-import.css │ │ ├── linked.css │ │ ├── package.json │ │ ├── vite.config-lib-entry.js │ │ ├── vite.config-lightningcss.js │ │ └── vite.config.js │ ├── data-uri/ │ │ ├── __tests__/ │ │ │ └── data-uri.spec.ts │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ └── vite.config.js │ ├── define/ │ │ ├── __tests__/ │ │ │ └── define.spec.ts │ │ ├── commonjs-dep/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── data.json │ │ ├── index.html │ │ ├── optional-env.js │ │ ├── package.json │ │ └── vite.config.js │ ├── devtools/ │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── counter.ts │ │ │ └── main.ts │ │ └── vite.config.ts │ ├── dynamic-import/ │ │ ├── (app)/ │ │ │ ├── main.js │ │ │ └── nest/ │ │ │ └── index.js │ │ ├── __tests__/ │ │ │ └── dynamic-import.spec.ts │ │ ├── alias/ │ │ │ ├── hello.js │ │ │ ├── hi.js │ │ │ ├── url.js │ │ │ └── worker.js │ │ ├── css/ │ │ │ └── index.css │ │ ├── files/ │ │ │ ├── mxd.js │ │ │ └── mxd.json │ │ ├── index.html │ │ ├── nested/ │ │ │ ├── deps.js │ │ │ ├── hello.js │ │ │ ├── index.js │ │ │ ├── nested/ │ │ │ │ └── self.js │ │ │ ├── self.js │ │ │ ├── shared.js │ │ │ ├── static.js │ │ │ └── treeshaken/ │ │ │ ├── syntax.js │ │ │ └── treeshaken.js │ │ ├── package.json │ │ ├── pkg/ │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── pkg.css │ │ ├── views/ │ │ │ ├── bar.js │ │ │ ├── baz.js │ │ │ ├── foo.js │ │ │ └── qux.js │ │ └── vite.config.js │ ├── dynamic-import-inline/ │ │ ├── __tests__/ │ │ │ └── dynamic-import-inline.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── foo.js │ │ │ └── index.js │ │ └── vite.config.js │ ├── env/ │ │ ├── __tests__/ │ │ │ └── env.spec.ts │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ └── vite.config.js │ ├── env-nested/ │ │ ├── __tests__/ │ │ │ └── env-nested.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.js │ ├── environment-react-ssr/ │ │ ├── __tests__/ │ │ │ └── environment-react-ssr.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── entry-client.tsx │ │ │ ├── entry-server.tsx │ │ │ └── root.tsx │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── extensions/ │ │ ├── __tests__/ │ │ │ └── extensions.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.js │ ├── external/ │ │ ├── __tests__/ │ │ │ └── external.spec.ts │ │ ├── dep-that-imports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-that-requires/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── slash@3.0.0.js │ │ ├── src/ │ │ │ ├── main.js │ │ │ └── require-polyfill.js │ │ └── vite.config.js │ ├── forward-console/ │ │ ├── __test__/ │ │ │ └── forward-console.spec.ts │ │ ├── fixtures/ │ │ │ └── throw-dep/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ └── main.ts │ │ └── vite.config.ts │ ├── fs-serve/ │ │ ├── __tests__/ │ │ │ ├── base/ │ │ │ │ └── fs-serve-base.spec.ts │ │ │ ├── commonTests.ts │ │ │ ├── deny/ │ │ │ │ └── fs-serve-deny.spec.ts │ │ │ └── fs-serve.spec.ts │ │ ├── entry.js │ │ ├── nested/ │ │ │ └── foo.js │ │ ├── package.json │ │ ├── root/ │ │ │ ├── src/ │ │ │ │ ├── code.js │ │ │ │ ├── deny/ │ │ │ │ │ ├── .deny │ │ │ │ │ └── deny.txt │ │ │ │ ├── dummy.crt │ │ │ │ ├── index.html │ │ │ │ ├── safe.txt │ │ │ │ ├── special characters åäö/ │ │ │ │ │ ├── safe.json │ │ │ │ │ └── safe.txt │ │ │ │ └── subdir/ │ │ │ │ └── safe.txt │ │ │ ├── svgVirtualModulePlugin.ts │ │ │ ├── unsafe.html │ │ │ ├── unsafe.txt │ │ │ ├── vite.config-base.js │ │ │ ├── vite.config-deny.js │ │ │ └── vite.config.js │ │ ├── safe.json │ │ ├── unsafe.html │ │ └── unsafe.json │ ├── glob-import/ │ │ ├── __tests__/ │ │ │ └── glob-import.spec.ts │ │ ├── array-test-dir/ │ │ │ ├── excluded.js │ │ │ └── included.js │ │ ├── dir/ │ │ │ ├── alias.js │ │ │ ├── baz.json │ │ │ ├── foo.css │ │ │ ├── foo.js │ │ │ ├── index.js │ │ │ ├── nested/ │ │ │ │ └── bar.js │ │ │ └── quote'.js │ │ ├── escape/ │ │ │ ├── (parenthesis)/ │ │ │ │ ├── glob.js │ │ │ │ └── mod/ │ │ │ │ └── index.js │ │ │ ├── [brackets]/ │ │ │ │ ├── glob.js │ │ │ │ └── mod/ │ │ │ │ └── index.js │ │ │ └── {curlies}/ │ │ │ ├── glob.js │ │ │ └── mod/ │ │ │ └── index.js │ │ ├── import-meta-glob-pkg/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── imports-path/ │ │ │ ├── bar.js │ │ │ └── foo.js │ │ ├── index.html │ │ ├── no-tree-shake.css │ │ ├── package.json │ │ ├── pkg-pages/ │ │ │ └── foo.js │ │ ├── side-effect/ │ │ │ ├── writedom.js │ │ │ └── writetodom.js │ │ ├── transform-visibility.js │ │ ├── tree-shake.css │ │ └── vite.config.ts │ ├── hmr/ │ │ ├── __tests__/ │ │ │ └── hmr.spec.ts │ │ ├── accept-exports/ │ │ │ ├── dynamic-imports/ │ │ │ │ ├── deps-all-accepted.ts │ │ │ │ ├── deps-some-accepted.ts │ │ │ │ ├── dynamic-imports.ts │ │ │ │ └── index.html │ │ │ ├── export-from/ │ │ │ │ ├── depA.ts │ │ │ │ ├── export-from.ts │ │ │ │ ├── hub.ts │ │ │ │ └── index.html │ │ │ ├── main-accepted/ │ │ │ │ ├── callback.ts │ │ │ │ ├── dep.ts │ │ │ │ ├── index.html │ │ │ │ ├── main-accepted.ts │ │ │ │ └── target.ts │ │ │ ├── main-non-accepted/ │ │ │ │ ├── default.ts │ │ │ │ ├── dep.ts │ │ │ │ ├── index.html │ │ │ │ ├── main-non-accepted.ts │ │ │ │ └── named.ts │ │ │ ├── reexports.bak/ │ │ │ │ ├── accept-named.ts │ │ │ │ ├── index.html │ │ │ │ ├── reexports.ts │ │ │ │ └── source.ts │ │ │ ├── side-effects/ │ │ │ │ ├── index.html │ │ │ │ └── side-effects.ts │ │ │ ├── star-imports/ │ │ │ │ ├── deps-all-accepted.ts │ │ │ │ ├── deps-some-accepted.ts │ │ │ │ ├── index.html │ │ │ │ └── star-imports.ts │ │ │ └── unused-exports/ │ │ │ ├── index.html │ │ │ ├── index.ts │ │ │ ├── unused.ts │ │ │ └── used.ts │ │ ├── circular/ │ │ │ ├── index.js │ │ │ ├── mod-a.js │ │ │ ├── mod-b.js │ │ │ └── mod-c.js │ │ ├── counter/ │ │ │ ├── dep.ts │ │ │ ├── index.html │ │ │ └── index.ts │ │ ├── css-deps/ │ │ │ ├── dep.js │ │ │ ├── index.html │ │ │ └── main.css │ │ ├── css-link/ │ │ │ ├── index.html │ │ │ ├── main.js │ │ │ ├── plugin.ts │ │ │ └── styles.css │ │ ├── customFile.js │ │ ├── event.d.ts │ │ ├── file-delete-restore/ │ │ │ ├── child.js │ │ │ ├── index.js │ │ │ ├── parent.js │ │ │ └── runtime.js │ │ ├── global.css │ │ ├── hmr.ts │ │ ├── hmrDep.js │ │ ├── hmrNestedDep.js │ │ ├── importedVirtual.js │ │ ├── importing-updated/ │ │ │ ├── a.js │ │ │ ├── b.js │ │ │ └── index.js │ │ ├── index.html │ │ ├── intermediate-file-delete/ │ │ │ ├── display.js │ │ │ ├── index.js │ │ │ └── re-export.js │ │ ├── invalidation/ │ │ │ ├── child.js │ │ │ ├── parent.js │ │ │ └── root.js │ │ ├── invalidation-circular-deps/ │ │ │ ├── circular-invalidate/ │ │ │ │ ├── child.js │ │ │ │ └── parent.js │ │ │ ├── index.js │ │ │ └── invalidate-handled-in-circle/ │ │ │ ├── child.js │ │ │ └── parent.js │ │ ├── missing-file/ │ │ │ ├── index.html │ │ │ └── main.js │ │ ├── missing-import/ │ │ │ ├── a.js │ │ │ ├── index.html │ │ │ └── main.js │ │ ├── modules.d.ts │ │ ├── optional-chaining/ │ │ │ ├── child.js │ │ │ └── parent.js │ │ ├── package.json │ │ ├── prune/ │ │ │ ├── dep1.js │ │ │ ├── dep2.js │ │ │ ├── dep3.js │ │ │ └── index.js │ │ ├── self-accept-within-circular/ │ │ │ ├── a.js │ │ │ ├── b.js │ │ │ ├── c.js │ │ │ ├── index.html │ │ │ └── index.js │ │ ├── soft-invalidation/ │ │ │ ├── child.js │ │ │ └── index.js │ │ ├── unicode-path/ │ │ │ └── 中文-にほんご-한글-🌕🌖🌗/ │ │ │ └── index.html │ │ └── vite.config.ts │ ├── hmr-full-bundle-mode/ │ │ ├── __tests__/ │ │ │ └── hmr-full-bundle-mode.spec.ts │ │ ├── hmr.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── vite.config.ts │ │ ├── worker-query.js │ │ └── worker-url.js │ ├── hmr-root/ │ │ ├── __tests__/ │ │ │ └── hmr-root.spec.ts │ │ ├── foo.js │ │ ├── root/ │ │ │ └── index.html │ │ └── vite.config.ts │ ├── hmr-ssr/ │ │ ├── __tests__/ │ │ │ └── hmr-ssr.spec.ts │ │ ├── accept-exports/ │ │ │ ├── dynamic-imports/ │ │ │ │ ├── deps-all-accepted.ts │ │ │ │ ├── deps-some-accepted.ts │ │ │ │ ├── dynamic-imports.ts │ │ │ │ └── index.ts │ │ │ ├── export-from/ │ │ │ │ ├── depA.ts │ │ │ │ ├── export-from.ts │ │ │ │ ├── hub.ts │ │ │ │ └── index.html │ │ │ ├── main-accepted/ │ │ │ │ ├── callback.ts │ │ │ │ ├── dep.ts │ │ │ │ ├── index.ts │ │ │ │ ├── main-accepted.ts │ │ │ │ └── target.ts │ │ │ ├── main-non-accepted/ │ │ │ │ ├── default.ts │ │ │ │ ├── dep.ts │ │ │ │ ├── index.ts │ │ │ │ ├── main-non-accepted.ts │ │ │ │ └── named.ts │ │ │ ├── reexports.bak/ │ │ │ │ ├── accept-named.ts │ │ │ │ ├── index.html │ │ │ │ ├── reexports.ts │ │ │ │ └── source.ts │ │ │ ├── side-effects/ │ │ │ │ ├── index.ts │ │ │ │ └── side-effects.ts │ │ │ ├── star-imports/ │ │ │ │ ├── deps-all-accepted.ts │ │ │ │ ├── deps-some-accepted.ts │ │ │ │ ├── index.ts │ │ │ │ └── star-imports.ts │ │ │ └── unused-exports/ │ │ │ ├── index.html │ │ │ ├── index.ts │ │ │ ├── unused.ts │ │ │ └── used.ts │ │ ├── circular/ │ │ │ ├── index.js │ │ │ ├── mod-a.js │ │ │ ├── mod-b.js │ │ │ └── mod-c.js │ │ ├── counter/ │ │ │ ├── dep.ts │ │ │ └── index.ts │ │ ├── customFile.js │ │ ├── event.d.ts │ │ ├── file-delete-restore/ │ │ │ ├── child.js │ │ │ ├── index.js │ │ │ ├── parent.js │ │ │ └── runtime.js │ │ ├── hmr.ts │ │ ├── hmrDep.js │ │ ├── hmrNestedDep.js │ │ ├── importedVirtual.js │ │ ├── importing-updated/ │ │ │ ├── a.js │ │ │ ├── b.js │ │ │ └── index.js │ │ ├── intermediate-file-delete/ │ │ │ ├── display.js │ │ │ ├── index.js │ │ │ └── re-export.js │ │ ├── invalidation/ │ │ │ ├── child.js │ │ │ └── parent.js │ │ ├── invalidation-circular-deps/ │ │ │ ├── circular-invalidate/ │ │ │ │ ├── child.js │ │ │ │ └── parent.js │ │ │ ├── index.js │ │ │ └── invalidate-handled-in-circle/ │ │ │ ├── child.js │ │ │ └── parent.js │ │ ├── missing-import/ │ │ │ ├── a.js │ │ │ ├── index.js │ │ │ └── main.js │ │ ├── modules.d.ts │ │ ├── non-tested/ │ │ │ ├── dep.js │ │ │ └── index.js │ │ ├── optional-chaining/ │ │ │ ├── child.js │ │ │ └── parent.js │ │ ├── package.json │ │ ├── queries/ │ │ │ ├── index.js │ │ │ └── multi-query.js │ │ ├── self-accept-within-circular/ │ │ │ ├── a.js │ │ │ ├── b.js │ │ │ ├── c.js │ │ │ └── index.js │ │ ├── soft-invalidation/ │ │ │ ├── child.js │ │ │ └── index.js │ │ ├── unresolved.ts │ │ └── vite.config.ts │ ├── html/ │ │ ├── __tests__/ │ │ │ └── html.spec.ts │ │ ├── a á.html │ │ ├── common.css │ │ ├── emptyAttr.html │ │ ├── env.html │ │ ├── foo.html │ │ ├── importmapOrder.html │ │ ├── index.html │ │ ├── inline/ │ │ │ ├── common.js │ │ │ ├── dep1.js │ │ │ ├── dep2.js │ │ │ ├── dep3.js │ │ │ ├── module-graph.dot │ │ │ ├── shared-1.html │ │ │ ├── shared-2.html │ │ │ ├── shared.js │ │ │ ├── shared_a.html │ │ │ ├── unique.html │ │ │ └── unique.js │ │ ├── invalid.html │ │ ├── invalidClick.html │ │ ├── invalidEscape.html │ │ ├── link-props/ │ │ │ ├── index.html │ │ │ ├── print.css │ │ │ └── screen.css │ │ ├── link.html │ │ ├── main.css │ │ ├── main.js │ │ ├── malformed-url.html │ │ ├── nested/ │ │ │ ├── asset/ │ │ │ │ ├── main.js │ │ │ │ └── style.css │ │ │ ├── index.html │ │ │ ├── nested.css │ │ │ └── nested.js │ │ ├── noBody.html │ │ ├── noHead.html │ │ ├── package.json │ │ ├── relative-input/ │ │ │ └── main.js │ │ ├── relative-input.html │ │ ├── scriptAsync.html │ │ ├── scriptMixed.html │ │ ├── serve/ │ │ │ ├── both/ │ │ │ │ └── index.html │ │ │ ├── both.html │ │ │ ├── file.html │ │ │ └── folder/ │ │ │ └── index.html │ │ ├── shared.js │ │ ├── side-effects/ │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ └── sideEffects.js │ │ ├── test.js │ │ ├── transform-inline-js.html │ │ ├── unicode-path/ │ │ │ └── 中文-にほんご-한글-🌕🌖🌗/ │ │ │ └── index.html │ │ ├── valid.html │ │ ├── valid.js │ │ ├── vite.config.js │ │ ├── warmup/ │ │ │ └── warm.js │ │ ├── write.html │ │ └── zeroJS.html │ ├── import-assertion/ │ │ ├── __tests__/ │ │ │ └── import-assertion.spec.ts │ │ ├── data.json │ │ ├── import-assertion-dep/ │ │ │ ├── data.json │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ └── package.json │ ├── js-sourcemap/ │ │ ├── __tests__/ │ │ │ └── js-sourcemap.spec.ts │ │ ├── after-preload-dynamic-hashbang.js │ │ ├── after-preload-dynamic-no-dep.js │ │ ├── after-preload-dynamic.js │ │ ├── bar.ts │ │ ├── dynamic/ │ │ │ ├── dynamic-foo.css │ │ │ ├── dynamic-foo.js │ │ │ └── dynamic-no-dep.js │ │ ├── foo-with-sourcemap-plugin.ts │ │ ├── foo-with-sourcemap.js │ │ ├── foo.js │ │ ├── importee-pkg/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── package.json │ │ ├── plugin-foo.js │ │ ├── test-ssr-dev.js │ │ ├── vite.config.js │ │ ├── with-define-object-ssr.ts │ │ ├── with-define-object.ts │ │ ├── with-multiline-import.ts │ │ ├── zoo-with-sourcemap-plugin.ts │ │ └── zoo.js │ ├── json/ │ │ ├── __tests__/ │ │ │ └── csr/ │ │ │ └── json-csr.spec.ts │ │ ├── dep-json-require/ │ │ │ ├── content.json │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── hmr.json │ │ ├── index.html │ │ ├── json-bom/ │ │ │ └── has-bom.json │ │ ├── json-module/ │ │ │ ├── index.json │ │ │ └── package.json │ │ ├── package.json │ │ ├── public/ │ │ │ └── public.json │ │ └── test.json │ ├── legacy/ │ │ ├── __tests__/ │ │ │ ├── client-and-ssr/ │ │ │ │ ├── legacy-client-legacy-ssr-sequential-builds.spec.ts │ │ │ │ └── serve.ts │ │ │ ├── legacy.spec.ts │ │ │ ├── no-polyfills/ │ │ │ │ └── legacy-no-polyfills.spec.ts │ │ │ ├── no-polyfills-no-systemjs/ │ │ │ │ └── legacy-no-polyfills-no-systemjs.spec.ts │ │ │ ├── ssr/ │ │ │ │ ├── legacy-ssr.spec.ts │ │ │ │ └── serve.ts │ │ │ └── watch/ │ │ │ └── legacy-styles-only-entry-watch.spec.ts │ │ ├── async.js │ │ ├── custom0.js │ │ ├── custom1.js │ │ ├── custom2.js │ │ ├── dynamic.css │ │ ├── entry-server-sequential.js │ │ ├── entry-server.js │ │ ├── immutable-chunk.js │ │ ├── index.html │ │ ├── main.js │ │ ├── module.js │ │ ├── nested/ │ │ │ └── index.html │ │ ├── no-polyfills-no-systemjs.html │ │ ├── no-polyfills-no-systemjs.js │ │ ├── no-polyfills.html │ │ ├── no-polyfills.js │ │ ├── package.json │ │ ├── style-only-entry.css │ │ ├── style.css │ │ ├── vite.config-custom-filename.js │ │ ├── vite.config-multiple-output.js │ │ ├── vite.config-no-polyfills-no-systemjs.js │ │ ├── vite.config-no-polyfills.js │ │ ├── vite.config-watch.js │ │ ├── vite.config.js │ │ └── worker.js │ ├── lib/ │ │ ├── __tests__/ │ │ │ ├── lib.spec.ts │ │ │ └── serve.ts │ │ ├── index.dist.html │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── css-entry-1.js │ │ │ ├── css-entry-2.js │ │ │ ├── dynamic.css │ │ │ ├── entry-1.css │ │ │ ├── entry-2.css │ │ │ ├── index.css │ │ │ ├── main-helpers-injection.js │ │ │ ├── main-multiple-output.js │ │ │ ├── main-named.js │ │ │ ├── main.js │ │ │ ├── main2.js │ │ │ ├── message.js │ │ │ └── sub-multiple-output.js │ │ ├── vite.config.js │ │ ├── vite.css-code-split.config.js │ │ ├── vite.css-multi-entry.config.js │ │ ├── vite.css-single-entry.config.js │ │ ├── vite.dyimport.config.js │ │ ├── vite.helpers-injection.config.js │ │ ├── vite.multiple-output.config.js │ │ ├── vite.named-exports.config.js │ │ ├── vite.nominify.config.js │ │ └── vite.terser.config.js │ ├── minify/ │ │ ├── __tests__/ │ │ │ └── minify.spec.ts │ │ ├── dir/ │ │ │ └── module/ │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── test.css │ │ └── vite.config.js │ ├── module-graph/ │ │ ├── __tests__/ │ │ │ └── module-graph.spec.ts │ │ ├── empty.js │ │ ├── imported-urls-order.js │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.ts │ ├── multiple-entrypoints/ │ │ ├── __tests__/ │ │ │ └── multiple-entrypoints.spec.ts │ │ ├── deps.json │ │ ├── dynamic-a.js │ │ ├── dynamic-b.js │ │ ├── entrypoints/ │ │ │ ├── a0.js │ │ │ ├── a1.js │ │ │ ├── a10.js │ │ │ ├── a11.js │ │ │ ├── a12.js │ │ │ ├── a13.js │ │ │ ├── a14.js │ │ │ ├── a15.js │ │ │ ├── a16.js │ │ │ ├── a17.js │ │ │ ├── a18.js │ │ │ ├── a19.js │ │ │ ├── a2.js │ │ │ ├── a20.js │ │ │ ├── a21.js │ │ │ ├── a22.js │ │ │ ├── a23.js │ │ │ ├── a24.js │ │ │ ├── a3.js │ │ │ ├── a4.js │ │ │ ├── a5.js │ │ │ ├── a6.js │ │ │ ├── a7.js │ │ │ ├── a8.js │ │ │ └── a9.js │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ ├── reference.js │ │ ├── reference.scss │ │ └── vite.config.js │ ├── nested-deps/ │ │ ├── __tests__/ │ │ │ └── nested-deps.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── test-package-a/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── test-package-b/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── test-package-c/ │ │ │ ├── index-es.js │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── side.js │ │ ├── test-package-d/ │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── test-package-d-nested/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── test-package-e/ │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ ├── test-package-e-excluded/ │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ └── test-package-e-included/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── test-package-f/ │ │ │ ├── index.js │ │ │ └── package.json │ │ └── vite.config.js │ ├── object-hooks/ │ │ ├── __tests__/ │ │ │ └── object-hooks.spec.ts │ │ ├── index.html │ │ ├── main.ts │ │ ├── package.json │ │ └── vite.config.ts │ ├── optimize-deps/ │ │ ├── .hidden-dir/ │ │ │ └── foo.js │ │ ├── __tests__/ │ │ │ └── optimize-deps.spec.ts │ │ ├── added-in-entries/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── cjs-dynamic.js │ │ ├── cjs.js │ │ ├── dedupe.js │ │ ├── dep-alias-using-absolute-path/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-browser-field/ │ │ │ ├── index.js │ │ │ ├── lib/ │ │ │ │ ├── adapters/ │ │ │ │ │ ├── http.js │ │ │ │ │ └── xhr.js │ │ │ │ └── axios.js │ │ │ └── package.json │ │ ├── dep-cjs-browser-field-bare/ │ │ │ ├── events-shim.js │ │ │ ├── index.js │ │ │ ├── internal.js │ │ │ └── package.json │ │ ├── dep-cjs-compiled-from-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-compiled-from-esm/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-css-main-field/ │ │ │ ├── package.json │ │ │ └── style.css │ │ ├── dep-cjs-external-package-omit-js-suffix/ │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ ├── test.astro.js │ │ │ ├── test.okay.js │ │ │ ├── test.scss.js │ │ │ └── test.tsx.js │ │ ├── dep-cjs-require-css-main-field/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-with-assets/ │ │ │ ├── foo.css │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-with-es-module-flag/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-cjs-with-external-deps/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-css-require/ │ │ │ ├── index.cjs │ │ │ ├── mod.cjs │ │ │ ├── mod.module.css │ │ │ ├── package.json │ │ │ └── style.css │ │ ├── dep-esbuild-plugin-transform/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-esm-dummy-node-builtin/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-esm-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-incompatible/ │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── sub.js │ │ ├── dep-linked/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-linked-include/ │ │ │ ├── Test.vue │ │ │ ├── foo.js │ │ │ ├── index.mjs │ │ │ ├── package.json │ │ │ └── test.css │ │ ├── dep-node-env/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-non-optimized/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-not-js/ │ │ │ ├── foo.js │ │ │ ├── index.notjs │ │ │ └── package.json │ │ ├── dep-optimize-exports-with-glob/ │ │ │ ├── glob/ │ │ │ │ ├── bar.js │ │ │ │ ├── foo.js │ │ │ │ └── nested/ │ │ │ │ └── baz.js │ │ │ ├── index.js │ │ │ ├── named.js │ │ │ └── package.json │ │ ├── dep-optimize-exports-with-root-glob/ │ │ │ ├── dir/ │ │ │ │ └── file2.js │ │ │ ├── file1.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-optimize-with-glob/ │ │ │ ├── glob/ │ │ │ │ ├── bar.js │ │ │ │ ├── foo.js │ │ │ │ └── nested/ │ │ │ │ └── baz.js │ │ │ ├── index.js │ │ │ ├── named.js │ │ │ └── package.json │ │ ├── dep-relative-to-main/ │ │ │ ├── entry.js │ │ │ ├── lib/ │ │ │ │ └── main.js │ │ │ └── package.json │ │ ├── dep-source-map-no-sources/ │ │ │ ├── all.js │ │ │ ├── package.json │ │ │ └── sub.js │ │ ├── dep-with-asset-ext/ │ │ │ ├── dep1/ │ │ │ │ ├── index.mjs │ │ │ │ └── package.json │ │ │ └── dep2/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-assets/ │ │ │ ├── index.js │ │ │ ├── nested/ │ │ │ │ └── index.js │ │ │ ├── package.json │ │ │ └── worker.js │ │ ├── dep-with-builtin-module-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-builtin-module-esm/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-dynamic-import/ │ │ │ ├── dynamic.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-optional-peer-dep/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-optional-peer-dep-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-optional-peer-dep-submodule/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-with-plus-subpath/ │ │ │ ├── core+feature.js │ │ │ └── package.json │ │ ├── dynamic-use-dep-alias-using-absolute-path.js │ │ ├── generics.vue │ │ ├── glob/ │ │ │ └── foo.js │ │ ├── index.astro │ │ ├── index.html │ │ ├── long-file-name.js │ │ ├── longfilename/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── nested-exclude/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── nested-include/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── non-optimizable-include/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── package.json │ │ ├── unused-split-entry.js │ │ └── vite.config.js │ ├── optimize-deps-no-discovery/ │ │ ├── __tests__/ │ │ │ └── optimize-deps-no-discovery.spec.ts │ │ ├── dep-no-discovery/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.js │ ├── optimize-missing-deps/ │ │ ├── __test__/ │ │ │ ├── optimize-missing-deps.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── main.js │ │ ├── missing-dep/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── multi-entry-dep/ │ │ │ ├── index.browser.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── package.json │ │ └── server.js │ ├── package.json │ ├── preload/ │ │ ├── __tests__/ │ │ │ ├── preload-disabled/ │ │ │ │ └── preload-disabled.spec.ts │ │ │ ├── preload.spec.ts │ │ │ └── resolve-deps/ │ │ │ └── preload-resolve-deps.spec.ts │ │ ├── dep-a/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dep-including-a/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── preloaded.js │ │ ├── src/ │ │ │ ├── about.js │ │ │ ├── chunk.js │ │ │ ├── hello.js │ │ │ ├── hello.module.css │ │ │ └── main.js │ │ ├── vite.config-preload-disabled.js │ │ ├── vite.config-resolve-deps.js │ │ └── vite.config.ts │ ├── preserve-symlinks/ │ │ ├── __tests__/ │ │ │ └── preserve-symlinks.spec.ts │ │ ├── index.html │ │ ├── module-a/ │ │ │ ├── package.json │ │ │ └── src/ │ │ │ ├── data.js │ │ │ └── index.js │ │ ├── package.json │ │ └── src/ │ │ └── main.js │ ├── proxy-bypass/ │ │ ├── __tests__/ │ │ │ └── proxy-bypass.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ └── vite.config.js │ ├── proxy-hmr/ │ │ ├── __tests__/ │ │ │ ├── proxy-hmr.spec.ts │ │ │ └── serve.ts │ │ ├── index.html │ │ ├── other-app/ │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ └── vite.config.js │ │ ├── package.json │ │ └── vite.config.js │ ├── resolve/ │ │ ├── __tests__/ │ │ │ ├── mainfields-custom-first/ │ │ │ │ └── resolve-mainfields-custom-first.spec.ts │ │ │ └── resolve.spec.ts │ │ ├── absolute.js │ │ ├── browser-field/ │ │ │ ├── bare-import.js │ │ │ ├── multiple.dot.path.js │ │ │ ├── no-ext-index/ │ │ │ │ └── index.js │ │ │ ├── no-ext.js │ │ │ ├── not-browser.js │ │ │ ├── out/ │ │ │ │ ├── cjs.node.js │ │ │ │ └── esm.browser.js │ │ │ ├── package.json │ │ │ └── relative.js │ │ ├── browser-field-bare-import-fail/ │ │ │ ├── main.js │ │ │ ├── module.js │ │ │ └── package.json │ │ ├── browser-field-bare-import-success/ │ │ │ ├── main.js │ │ │ ├── module.js │ │ │ └── package.json │ │ ├── browser-module-field1/ │ │ │ ├── index.js │ │ │ ├── index.web.js │ │ │ └── package.json │ │ ├── config-dep.cjs │ │ ├── custom-browser-main-field/ │ │ │ ├── index.browser.js │ │ │ ├── index.custom.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── custom-condition/ │ │ │ ├── index.custom.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── custom-ext.es │ │ ├── custom-main-field/ │ │ │ ├── index.custom.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── dir/ │ │ │ └── index.js │ │ ├── dir-with-ext/ │ │ │ └── index.js │ │ ├── dir-with-ext.js/ │ │ │ └── empty │ │ ├── dir.js │ │ ├── drive-relative.js │ │ ├── exact-extension/ │ │ │ ├── file.js │ │ │ ├── file.js.js │ │ │ └── file.json.js │ │ ├── exports-and-nested-scope/ │ │ │ ├── index.js │ │ │ ├── nested-scope/ │ │ │ │ ├── file.js │ │ │ │ └── package.json │ │ │ └── package.json │ │ ├── exports-env/ │ │ │ ├── browser.js │ │ │ ├── browser.mjs │ │ │ ├── browser.prod.mjs │ │ │ ├── fallback.umd.js │ │ │ └── package.json │ │ ├── exports-from-root/ │ │ │ ├── file.js │ │ │ ├── index.js │ │ │ ├── nested/ │ │ │ │ ├── file.js │ │ │ │ └── package.json │ │ │ └── package.json │ │ ├── exports-legacy-fallback/ │ │ │ ├── dir/ │ │ │ │ ├── index.js │ │ │ │ ├── index.mjs │ │ │ │ └── package.json │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── exports-path/ │ │ │ ├── cjs.js │ │ │ ├── deep.js │ │ │ ├── deep.json │ │ │ ├── dir/ │ │ │ │ └── dir.js │ │ │ ├── main.js │ │ │ └── package.json │ │ ├── exports-with-module/ │ │ │ ├── import.mjs │ │ │ ├── module.mjs │ │ │ └── package.json │ │ ├── exports-with-module-condition/ │ │ │ ├── index.esm.js │ │ │ ├── index.js │ │ │ ├── index.mjs │ │ │ └── package.json │ │ ├── exports-with-module-condition-required/ │ │ │ ├── index.cjs │ │ │ └── package.json │ │ ├── file-url.js │ │ ├── imports-path/ │ │ │ ├── .dot-prefixed/ │ │ │ │ └── index.js │ │ │ ├── importer.js │ │ │ ├── nested-path.js │ │ │ ├── other-pkg/ │ │ │ │ ├── nest/ │ │ │ │ │ └── index.js │ │ │ │ └── package.json │ │ │ ├── query.json │ │ │ ├── root-slash/ │ │ │ │ └── index.js │ │ │ ├── same-level.js │ │ │ ├── slash/ │ │ │ │ └── index.js │ │ │ ├── star/ │ │ │ │ └── index.js │ │ │ └── top-level.js │ │ ├── index.html │ │ ├── inline-package/ │ │ │ ├── inline.js │ │ │ └── package.json │ │ ├── non-normalized.js │ │ ├── package.json │ │ ├── public/ │ │ │ └── should-not-be-copied │ │ ├── sharp-dir/ │ │ │ ├── index.cjs │ │ │ └── package.json │ │ ├── sharp-dir-nested/ │ │ │ ├── #/ │ │ │ │ └── index.cjs │ │ │ ├── index.cjs │ │ │ └── package.json │ │ ├── side-effects-glob/ │ │ │ ├── effects/ │ │ │ │ └── file.js │ │ │ ├── index.js │ │ │ ├── no-effect.js │ │ │ └── package.json │ │ ├── style.css │ │ ├── ts-extension/ │ │ │ ├── hello.ts │ │ │ ├── hellocjs.cts │ │ │ ├── hellojsx.tsx │ │ │ ├── hellomjs.mts │ │ │ ├── hellotsx.tsx │ │ │ ├── index-js.js │ │ │ └── index.ts │ │ ├── utf8-bom/ │ │ │ └── main.js │ │ ├── utf8-bom-package/ │ │ │ ├── index.mjs │ │ │ └── package.json │ │ ├── util/ │ │ │ ├── bar.util.js │ │ │ └── index.js │ │ ├── vite.config-mainfields-custom-first.js │ │ └── vite.config.js │ ├── resolve-linked/ │ │ ├── dep.js │ │ ├── package.json │ │ └── src/ │ │ └── index.js │ ├── resolve-tsconfig-paths/ │ │ ├── __tests__/ │ │ │ └── resolve.spec.ts │ │ ├── fallback/ │ │ │ └── fallback.js │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── imported.js │ │ │ ├── js.js │ │ │ ├── nested/ │ │ │ │ ├── a-imported.ts │ │ │ │ ├── a.ts │ │ │ │ ├── b-imported.ts │ │ │ │ ├── b.ts │ │ │ │ ├── index.ts │ │ │ │ ├── tsconfig.a.json │ │ │ │ ├── tsconfig.b.json │ │ │ │ └── tsconfig.json │ │ │ └── ts.ts │ │ ├── tsconfig.json │ │ └── vite.config.js │ ├── self-referencing/ │ │ ├── index.js │ │ ├── package.json │ │ └── test/ │ │ └── index.js │ ├── shims.d.ts │ ├── ssr/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── server.js │ │ ├── src/ │ │ │ ├── app.js │ │ │ ├── circular-dep-init/ │ │ │ │ ├── README.md │ │ │ │ ├── circular-dep-init.js │ │ │ │ ├── module-a.js │ │ │ │ └── module-b.js │ │ │ ├── circular-import/ │ │ │ │ ├── a.js │ │ │ │ ├── b.js │ │ │ │ └── index.js │ │ │ ├── circular-import2/ │ │ │ │ ├── a.js │ │ │ │ ├── b.js │ │ │ │ └── index.js │ │ │ ├── forked-deadlock/ │ │ │ │ ├── README.md │ │ │ │ ├── common-module.js │ │ │ │ ├── deadlock-fuse-module.js │ │ │ │ ├── dynamic-imports/ │ │ │ │ │ ├── common-module.js │ │ │ │ │ ├── deadlock-fuse-module.js │ │ │ │ │ ├── fuse-stuck-bridge-module.js │ │ │ │ │ ├── middle-module.js │ │ │ │ │ └── stuck-module.js │ │ │ │ ├── fuse-stuck-bridge-module.js │ │ │ │ ├── middle-module.js │ │ │ │ └── stuck-module.js │ │ │ └── utils.js │ │ └── vite.config.ts │ ├── ssr-alias/ │ │ ├── __tests__/ │ │ │ └── ssr-alias.spec.ts │ │ ├── alias-original/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── alias-process.js │ │ │ ├── alias-replaced.js │ │ │ └── main.js │ │ └── vite.config.js │ ├── ssr-conditions/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-conditions.spec.ts │ │ ├── external/ │ │ │ ├── browser.js │ │ │ ├── default.js │ │ │ ├── edge.js │ │ │ ├── node.js │ │ │ ├── node.unbundled.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── no-external/ │ │ │ ├── browser.js │ │ │ ├── default.js │ │ │ ├── edge.js │ │ │ ├── node.js │ │ │ ├── node.unbundled.js │ │ │ └── package.json │ │ ├── package.json │ │ ├── server.js │ │ ├── src/ │ │ │ └── app.js │ │ └── vite.config.js │ ├── ssr-deps/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-deps.spec.ts │ │ ├── css-lib/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── define-properties-exports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── define-property-exports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── external-entry/ │ │ │ ├── entry.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── external-using-external-entry/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── forwarded-export/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── import-builtin-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── index.html │ │ ├── linked-no-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── message │ │ ├── module-condition/ │ │ │ ├── import.mjs │ │ │ ├── module.js │ │ │ └── package.json │ │ ├── nested-exclude/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── nested-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── nested-external-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── nested-include/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── no-external-cjs/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── no-external-css/ │ │ │ ├── index.css │ │ │ └── package.json │ │ ├── non-optimized-with-nested-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── object-assigned-exports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── only-object-assigned-exports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── optimized-cjs-with-nested-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── optimized-with-nested-external/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── package.json │ │ ├── pkg-exports/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── primitive-export/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── read-file-content/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── require-absolute/ │ │ │ ├── foo.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── server.js │ │ ├── src/ │ │ │ ├── app.js │ │ │ ├── isomorphic-module-browser.js │ │ │ └── isomorphic-module-server.js │ │ └── ts-transpiled-exports/ │ │ ├── index.js │ │ └── package.json │ ├── ssr-html/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-html.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── slash@3.0.0.js │ │ ├── server.js │ │ ├── src/ │ │ │ ├── app.js │ │ │ ├── error-js.js │ │ │ ├── error-ts.ts │ │ │ ├── has-error-deep.ts │ │ │ ├── importedVirtual.js │ │ │ └── network-imports.js │ │ ├── test-network-imports.js │ │ ├── test-stacktrace-runtime.js │ │ └── test-stacktrace.js │ ├── ssr-noexternal/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-noexternal.spec.ts │ │ ├── external-cjs/ │ │ │ ├── import.mjs │ │ │ ├── package.json │ │ │ └── require.cjs │ │ ├── index.html │ │ ├── package.json │ │ ├── require-external-cjs/ │ │ │ ├── main.js │ │ │ └── package.json │ │ ├── server.js │ │ ├── src/ │ │ │ └── entry-server.js │ │ └── vite.config.js │ ├── ssr-pug/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-pug.spec.ts │ │ ├── index.pug │ │ ├── package.json │ │ ├── server.js │ │ └── src/ │ │ └── app.js │ ├── ssr-resolve/ │ │ ├── __tests__/ │ │ │ └── ssr-resolve.spec.ts │ │ ├── deep-import/ │ │ │ ├── bar/ │ │ │ │ └── package.json │ │ │ ├── foo/ │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ ├── index.js │ │ │ ├── package.json │ │ │ └── utils/ │ │ │ └── bar.js │ │ ├── entries/ │ │ │ ├── dir/ │ │ │ │ └── index.js │ │ │ ├── file.js │ │ │ └── package.json │ │ ├── main.js │ │ ├── package.json │ │ ├── pkg-exports/ │ │ │ ├── entry.js │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── pkg-module-sync/ │ │ │ ├── index.js │ │ │ └── package.json │ │ ├── util.js │ │ └── vite.config.js │ ├── ssr-wasm/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-wasm.spec.ts │ │ ├── package.json │ │ ├── server.js │ │ ├── src/ │ │ │ ├── app.js │ │ │ ├── heavy.wasm │ │ │ ├── light.wasm │ │ │ ├── static-heavy.js │ │ │ └── static-light.js │ │ └── vite.config.ts │ ├── ssr-webworker/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── ssr-webworker.spec.ts │ │ ├── browser-exports/ │ │ │ ├── browser.js │ │ │ ├── node.js │ │ │ └── package.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── dynamic.js │ │ │ └── entry-worker.jsx │ │ ├── vite.config.js │ │ ├── worker-exports/ │ │ │ ├── browser.js │ │ │ ├── node.js │ │ │ ├── package.json │ │ │ └── worker.js │ │ └── worker.js │ ├── tailwind/ │ │ ├── __test__/ │ │ │ └── tailwind.spec.ts │ │ ├── index.css │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ └── component1.js │ │ │ ├── main.js │ │ │ └── views/ │ │ │ └── view1.js │ │ ├── tailwind.config.ts │ │ └── vite.config.ts │ ├── tailwind-sourcemap/ │ │ ├── __tests__/ │ │ │ └── tailwind-sourcemap.spec.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── tailwind.css │ │ └── vite.config.js │ ├── tailwind-v3/ │ │ ├── __test__/ │ │ │ └── tailwind-v3.spec.ts │ │ ├── index.css │ │ ├── index.html │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ └── component1.js │ │ │ ├── main.js │ │ │ └── views/ │ │ │ └── view1.js │ │ ├── tailwind.config.ts │ │ └── vite.config.ts │ ├── test-utils.ts │ ├── transform-plugin/ │ │ ├── __tests__/ │ │ │ ├── base/ │ │ │ │ └── transform-plugin.spec.ts │ │ │ ├── tests.ts │ │ │ └── transform-plugin.spec.ts │ │ ├── foo.json │ │ ├── index.html │ │ ├── index.js │ │ ├── package.json │ │ ├── plugin-dep-load.js │ │ ├── plugin-dep.js │ │ ├── vite.config-base.js │ │ └── vite.config.js │ ├── tsconfig-json/ │ │ ├── __tests__/ │ │ │ └── tsconfig-json.spec.ts │ │ ├── index.html │ │ ├── nested/ │ │ │ ├── main.ts │ │ │ ├── not-used-type.ts │ │ │ └── tsconfig.json │ │ ├── nested-with-extends/ │ │ │ ├── main.ts │ │ │ ├── not-used-type.ts │ │ │ └── tsconfig.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── decorator.ts │ │ │ ├── main.ts │ │ │ └── not-used-type.ts │ │ └── tsconfig.json │ ├── tsconfig-json-load-error/ │ │ ├── __tests__/ │ │ │ ├── serve.ts │ │ │ └── tsconfig-json-load-error.spec.ts │ │ ├── has-error/ │ │ │ ├── main.ts │ │ │ └── tsconfig.json │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ └── main.ts │ │ └── tsconfig.json │ ├── tsconfig.json │ ├── vitestGlobalSetup.ts │ ├── vitestSetup.ts │ ├── wasm/ │ │ ├── __tests__/ │ │ │ └── wasm.spec.ts │ │ ├── add.wasm │ │ ├── heavy.wasm │ │ ├── index.html │ │ ├── light.wasm │ │ ├── package.json │ │ ├── vite.config.ts │ │ └── worker.js │ └── worker/ │ ├── __tests__/ │ │ ├── es/ │ │ │ └── worker-es.spec.ts │ │ ├── iife/ │ │ │ └── worker-iife.spec.ts │ │ ├── relative-base/ │ │ │ └── worker-relative-base.spec.ts │ │ ├── relative-base-iife/ │ │ │ └── worker-relative-base-iife.spec.ts │ │ ├── sourcemap/ │ │ │ └── worker-sourcemap.spec.ts │ │ ├── sourcemap-hidden/ │ │ │ └── worker-sourcemap-hidden.spec.ts │ │ └── sourcemap-inline/ │ │ └── worker-sourcemap-inline.spec.ts │ ├── classic-esm.js │ ├── classic-shared-worker.js │ ├── classic-worker.js │ ├── deeply-nested-second-worker.js │ ├── deeply-nested-third-worker.js │ ├── deeply-nested-worker.js │ ├── dep-cjs/ │ │ ├── index.cjs │ │ └── package.json │ ├── dep-cjs-with-json/ │ │ ├── data.json │ │ └── importer.cjs │ ├── dep-self-reference-url-worker/ │ │ ├── index.js │ │ ├── package.json │ │ └── worker.js │ ├── dep-to-optimize/ │ │ ├── index.js │ │ └── package.json │ ├── emit-chunk-dynamic-import-worker.js │ ├── emit-chunk-nested-worker.js │ ├── emit-chunk-sub-worker.js │ ├── importMetaGlob.worker.js │ ├── importMetaGlobEager.worker.js │ ├── index.html │ ├── module-and-worker.js │ ├── modules/ │ │ ├── module0.js │ │ ├── module1.js │ │ ├── module2.js │ │ ├── module3.js │ │ ├── test-plugin.js │ │ └── workerImport.ts │ ├── my-inline-shared-worker.ts │ ├── my-shared-worker.ts │ ├── my-worker.ts │ ├── package.json │ ├── possible-ts-output-worker.mjs │ ├── public/ │ │ └── classic.js │ ├── self-reference-url-worker.js │ ├── self-reference-worker.js │ ├── simple-worker.js │ ├── sub-worker.js │ ├── url-shared-worker.js │ ├── url-worker.js │ ├── vite.config-es.js │ ├── vite.config-iife.js │ ├── vite.config-relative-base-iife.js │ ├── vite.config-relative-base.js │ ├── vite.config-sourcemap-hidden.js │ ├── vite.config-sourcemap-inline.js │ ├── vite.config-sourcemap.js │ ├── worker/ │ │ ├── main-classic.js │ │ ├── main-deeply-nested.js │ │ ├── main-format-es.js │ │ ├── main-module.js │ │ ├── main-url.js │ │ └── main.js │ ├── worker-nested-worker.js │ ├── worker-plugin-test-plugin.js │ ├── worker-require-json.js │ └── worker-sourcemap-config.js ├── pnpm-workspace.yaml ├── scripts/ │ ├── docs-check.sh │ ├── mergeChangelog.ts │ ├── publishCI.ts │ ├── release.ts │ ├── releaseUtils.ts │ └── tsconfig.json ├── vitest.config.e2e.ts └── vitest.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: .git-blame-ignore-revs ================================================ # chore: enable prettier trailing commas (#11167) 134ce6817984bad0f5fb043481502531fee9b1db # chore: rename test packages (#11172) 5170e44920458090b8b43ee9cfe5010c25dfe22b ================================================ FILE: .gitattributes ================================================ * text=auto eol=lf ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: "\U0001F41E Bug report" description: Report an issue with Vite labels: [pending triage] type: Bug body: - type: markdown attributes: value: | Thanks for taking the time to fill out this bug report! - type: textarea id: bug-description attributes: label: Describe the bug description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks! placeholder: I am doing ... What I expect is ... What actually happening is ... validations: required: true - type: input id: reproduction attributes: label: Reproduction description: Please provide a link via [vite.new](https://vite.new/) or a link to a repo that can reproduce the problem you ran into. `npm create vite@latest` and `npm create vite-extra@latest` (for SSR or library repros) can be used as a starter template. A [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) is required ([Why?](https://antfu.me/posts/why-reproductions-are-required)). If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a "needs reproduction" label. If no reproduction is provided after 3 days, it will be auto-closed. placeholder: Reproduction URL validations: required: true - type: textarea id: reproduction-steps attributes: label: Steps to reproduce description: Please provide any reproduction steps that may need to be described. E.g. if it happens only when running the dev or build script make sure it's clear which one to use. placeholder: Run `npm install` followed by `npm run dev` - type: textarea id: system-info attributes: label: System Info description: Output of `npx envinfo --system --npmPackages '{vite,@vitejs/*,rollup,rolldown}' --binaries --browsers` render: shell placeholder: System, Binaries, Browsers validations: required: true - type: dropdown id: package-manager attributes: label: Used Package Manager description: Select the used package manager options: - npm - yarn - pnpm - bun validations: required: true - type: textarea id: logs attributes: label: Logs description: | Optional if provided reproduction. Please try not to insert an image but copy paste the log text. 1. Run `vite` or `vite build` with the `--debug` flag. 2. Provide the error log here in the format below. ````
Click to expand! ```shell // paste the log text here ```
```` - type: checkboxes id: checkboxes attributes: label: Validations description: Before submitting the issue, please make sure you do the following options: - label: Follow our [Code of Conduct](https://github.com/vitejs/vite/blob/main/CODE_OF_CONDUCT.md) required: true - label: Read the [Contributing Guidelines](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md). required: true - label: Read the [docs](https://vite.dev/guide). required: true - label: Check that there isn't [already an issue](https://github.com/vitejs/vite/issues) that reports the same bug to avoid creating a duplicate. required: true - label: Make sure this is a Vite issue and not a framework-specific issue. For example, if it's a Vue SFC related bug, it should likely be reported to [vuejs/core](https://github.com/vuejs/core) instead. required: true - label: Check that this is a concrete bug. For Q&A open a [GitHub Discussion](https://github.com/vitejs/vite/discussions) or join our [Discord Chat Server](https://chat.vite.dev/). required: true - label: The provided reproduction is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) of the bug. required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ 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.vite.dev about: Ask questions and discuss with other Vite users in real time. - name: Questions & Discussions url: https://github.com/vitejs/vite/discussions about: Use GitHub discussions for message-board style questions and discussions. ================================================ FILE: .github/ISSUE_TEMPLATE/docs.yml ================================================ name: "\U0001F4DA Documentation" description: Suggest a change or new page to be added to vite.dev labels: [documentation] body: - type: markdown attributes: value: | Thanks for taking the time to fill out this issue! - type: checkboxes id: documentation_is attributes: label: Documentation is options: - label: Missing - label: Outdated - label: Confusing - label: Not sure? - type: textarea id: description attributes: label: Explain in Detail description: A clear and concise description of your suggestion. If you intend to submit a PR for this issue, tell us in the description. Thanks! placeholder: The description of ... page is not clear. I thought it meant ... but it wasn't. validations: required: true - type: textarea id: suggestion attributes: label: Your Suggestion for Changes validations: required: true - type: input id: reproduction attributes: label: Reproduction description: If you have a reproduction, please provide a link via [vite.new](https://vite.new/) or a link to a repo that can reproduce the problem you ran into. `npm create vite@latest` and `npm create vite-extra@latest` (for SSR or library repros) can be used as a starter template. placeholder: Reproduction URL - type: textarea id: reproduction-steps attributes: label: Steps to reproduce description: Please provide any reproduction steps that may need to be described. E.g. if it happens only when running the dev or build script make sure it's clear which one to use. placeholder: Run `npm install` followed by `npm run dev` ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: "\U0001F680 New feature proposal" description: Propose a new feature to be added to Vite labels: ["pending triage"] type: Feature body: - type: markdown attributes: value: | Thanks for your interest in the project and taking the time to fill out this feature report! - type: textarea id: feature-description attributes: label: Description description: "Clear and concise description of the problem. Please make the reason and usecases as detailed as possible. If you intend to submit a PR for this issue, tell us in the description. Thanks!" placeholder: As a developer using Vite I want [goal / wish] so that [benefit]. validations: required: true - type: textarea id: suggested-solution attributes: label: Suggested solution description: "In module [xy] we could provide following implementation..." validations: required: true - type: textarea id: alternative attributes: label: Alternative description: Clear and concise description of any alternative solutions or features you've considered. - type: textarea id: additional-context attributes: label: Additional context description: Any other context or screenshots about the feature request here. - type: checkboxes id: checkboxes attributes: label: Validations description: Before submitting the issue, please make sure you do the following options: - label: Follow our [Code of Conduct](https://github.com/vitejs/vite/blob/main/CODE_OF_CONDUCT.md) required: true - label: Read the [Contributing Guidelines](https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md). required: true - label: Read the [docs](https://vite.dev/guide). required: true - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate. required: true ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ================================================ FILE: .github/commit-convention.md ================================================ ## Git Commit Message Convention > This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular). #### TL;DR: Messages must be matched by the following regex: ```js /^(revert: )?(feat|fix|docs|style|refactor|perf|test|build|ci|chore)(\(.+\))?!?: .{1,50}/ ``` #### Examples ``` feat(dev): add 'comments' option fix(dev): fix dev error perf(build)!: remove 'foo' option revert: feat(compiler): add 'comments' option ``` ### Revert If the PR reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit ### Scope The scope could be anything specifying the place of the commit change. For example `dev`, `build`, `workflow`, `cli` etc... ### Subject The subject contains a succinct description of the change: - use the imperative, present tense: "change" not "changed" nor "changes" - don't capitalize the first letter - no dot (.) at the end ================================================ FILE: .github/copilot-instructions.md ================================================ This is a TypeScript project that implements a frontend build tooling called Vite. Please follow these guidelines when contributing: ## Code Standards - Run `pnpm run lint` to ensure that your code adheres to the code standards. - Run `pnpm run format` to format your code. - Build: `pnpm run build` - Test: `pnpm run test` (uses Vitest and Playwright) ## Repository Structure - `docs/`: Documentation - `packages/create-vite`: The source code for the `create-vite` command - `packages/plugin-legacy`: The source code for the `@vitejs/plugin-legacy` plugin - `packages/vite`: The source code for the Vite core - `playground/`: E2E tests ## PR Guidelines ### PR Title & Commit Messages - Follow the [commit message convention](./commit-convention.md) ### PR Description - What does this PR solve? - Clear problem/feature description - Why was this approach chosen? - Implementation rationale - If this is a new feature, include a convincing reason. - If this adds a new config option, verify problem can't be solved with smarter defaults, existing options, or a plugin - If this is a bug fix, explain what caused the bug - Link to relevant code if possible ### Code Style & Standards - Code follows TypeScript best practices - Maintains existing code structure and organization - Comments explain "why", not "what" ### Testing - Prefer unit tests if it can be tested without using mocks - E2E tests should be added in the `playground/` directory ### Documentation - Update documentation for public API changes - Documentation changes go in `docs/` folder ### Other Considerations - No concerning performance impacts ================================================ FILE: .github/renovate.json5 ================================================ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended", "schedule:weekly", "group:allNonMajor"], "labels": ["dependencies"], "ignorePaths": ["**/__tests__/**"], "rangeStrategy": "bump", "postUpdateOptions": ["pnpmDedupe"], "packageRules": [ { "matchDepTypes": ["peerDependencies"], "enabled": false, }, { "matchDepTypes": ["action"], "pinDigests": true, "matchPackageNames": ["!actions/{/,}**", "!github/{/,}**"], }, { "groupName": "rolldown-related dependencies", "matchDepNames": [ "rolldown", "rolldown-plugin-dts", "tsdown", "@oxc-project/*", "oxc-*", ], }, ], "ignoreDeps": [ // manually bumping "rollup", "node", "typescript", "@rollup/plugin-dynamic-import-vars", // prefer version using tinyglobby // pinned "slash3", "slash5", "vue34", // breaking changes "kill-port", // `kill-port:^2.0.0 has perf issues (#8392) // v1 is a drop-in replacement for debug, while v2 introduces breaking changes "obug", ], "github-actions": { "managerFilePatterns": [ // default values "/(^|/)(workflow-templates|\\.(?:github|gitea|forgejo)/(?:workflows|actions))/.+\\.ya?ml$/", "/(^|/)action\\.ya?ml$/", // custom value "/(^|/)docs/guide/static-deploy-github-pages\\.yaml$/", ], }, "customManagers": [ { "customType": "regex", "managerFilePatterns": ["/packages/create-vite/src/index\\.ts$/"], "matchStrings": [ "//\\s*renovate:\\s+datasource=(?\\S+)\\s+depName=(?\\S+)\\s+(?:var|let|const)\\s+\\S+\\s*=\\s*[\"'](?[^\"']+)[\"']", ], }, ], } ================================================ FILE: .github/workflows/ci.yml ================================================ name: CI env: # 7 GiB by default on GitHub, setting to 6 GiB # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources NODE_OPTIONS: --max-old-space-size=6144 # install playwright binary manually (because pnpm only runs install script once) PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" # Vitest auto retry on flaky segfault VITEST_SEGFAULT_RETRY: 3 # Remove default permissions of GITHUB_TOKEN for security # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs permissions: {} on: push: branches: - main - release/* - feat/* - fix/* - perf/* - "v[0-9]+" # v1, v2, ... - "v[0-9]+.[0-9]+" # v4.0, v4.1, ... pull_request: workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.number || github.sha }} cancel-in-progress: true jobs: changed: name: Get changed files runs-on: ubuntu-slim outputs: should_skip: ${{ steps.changed-files.outputs.only_changed == 'true' }} steps: - name: Checkout uses: actions/checkout@v6 with: # Assume PRs are less than 50 commits fetch-depth: 50 - name: Get changed files id: changed-files uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 with: files: | docs/** .github/** !.github/workflows/ci.yml packages/create-vite/template** **.md test: needs: changed if: needs.changed.outputs.should_skip != 'true' timeout-minutes: 20 runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] node_version: [20, 22, 24] include: # Active LTS + other OS - os: macos-latest node_version: 24 - os: windows-latest node_version: 24 fail-fast: false name: "Build&Test: node-${{ matrix.node_version }}, ${{ matrix.os }}" steps: - name: Checkout uses: actions/checkout@v6 - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - name: Set node version to ${{ matrix.node_version }} uses: actions/setup-node@v6 with: node-version: ${{ matrix.node_version }} cache: "pnpm" - name: Install deps run: pnpm install # Install playwright's binary under custom directory to cache - name: (non-windows) Set Playwright path and Get playwright version if: runner.os != 'Windows' run: | echo "PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/playwright-bin" >> $GITHUB_ENV PLAYWRIGHT_VERSION="$(pnpm ls --depth 0 --json -w playwright-chromium | jq --raw-output '.[0].devDependencies["playwright-chromium"].version')" echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV - name: (windows) Set Playwright path and Get playwright version if: runner.os == 'Windows' run: | echo "PLAYWRIGHT_BROWSERS_PATH=$HOME\.cache\playwright-bin" >> $env:GITHUB_ENV $env:PLAYWRIGHT_VERSION="$(pnpm ls --depth 0 --json -w playwright-chromium | jq --raw-output '.[0].devDependencies["playwright-chromium"].version')" echo "PLAYWRIGHT_VERSION=$env:PLAYWRIGHT_VERSION" >> $env:GITHUB_ENV - name: Cache Playwright's binary uses: actions/cache@v5 with: key: ${{ runner.os }}-playwright-bin-v1-${{ env.PLAYWRIGHT_VERSION }} path: ${{ env.PLAYWRIGHT_BROWSERS_PATH }} restore-keys: | ${{ runner.os }}-playwright-bin-v1- - name: Install Playwright # does not need to explicitly set chromium after https://github.com/microsoft/playwright/issues/14862 is solved run: pnpm playwright install chromium - name: Build run: pnpm run build - name: Test unit run: pnpm run test-unit - name: Test serve run: pnpm run test-serve - name: Test build run: pnpm run test-build test-passed: if: (!cancelled() && !failure()) needs: test runs-on: ubuntu-slim name: Build & Test Passed or Skipped steps: - run: echo "Build & Test Passed or Skipped" test-failed: if: (!cancelled() && failure()) needs: test runs-on: ubuntu-slim name: Build & Test Failed steps: - run: echo "Build & Test Failed" lint: timeout-minutes: 10 runs-on: ubuntu-latest name: "Lint: node-24, ubuntu-latest" steps: - uses: actions/checkout@v6 - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - name: Set node version to 24 uses: actions/setup-node@v6 with: node-version: 24 cache: "pnpm" - name: Install deps run: pnpm install - name: Build run: pnpm run build - name: Lint run: pnpm run lint - name: Check formatting run: pnpm prettier --write --log-level=warn . && git diff --exit-code - name: Typecheck run: pnpm run typecheck - name: Test docs run: pnpm run test-docs # From https://github.com/rhysd/actionlint/blob/main/docs/usage.md#use-actionlint-on-github-actions - name: Check workflow files run: | bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) ./actionlint -color -shellcheck="" ================================================ FILE: .github/workflows/copilot-setup-steps.yml ================================================ on: workflow_dispatch: push: paths: - .github/workflows/copilot-setup-steps.yml pull_request: paths: - .github/workflows/copilot-setup-steps.yml jobs: copilot-setup-steps: runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout uses: actions/checkout@v6 - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - name: Set node version to 24 uses: actions/setup-node@v6 with: node-version: 24 cache: "pnpm" - name: Install deps run: pnpm install # Install playwright's binary under custom directory to cache - name: (non-windows) Set Playwright path and Get playwright version if: runner.os != 'Windows' run: | echo "PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/playwright-bin" >> $GITHUB_ENV PLAYWRIGHT_VERSION="$(pnpm ls --depth 0 --json -w playwright-chromium | jq --raw-output '.[0].devDependencies["playwright-chromium"].version')" echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV - name: (windows) Set Playwright path and Get playwright version if: runner.os == 'Windows' run: | echo "PLAYWRIGHT_BROWSERS_PATH=$HOME\.cache\playwright-bin" >> $env:GITHUB_ENV $env:PLAYWRIGHT_VERSION="$(pnpm ls --depth 0 --json -w playwright-chromium | jq --raw-output '.[0].devDependencies["playwright-chromium"].version')" echo "PLAYWRIGHT_VERSION=$env:PLAYWRIGHT_VERSION" >> $env:GITHUB_ENV - name: Install Playwright # does not need to explicitly set chromium after https://github.com/microsoft/playwright/issues/14862 is solved run: pnpm playwright install chromium ================================================ FILE: .github/workflows/ecosystem-ci-trigger.yml ================================================ name: ecosystem-ci trigger on: issue_comment: types: [created] jobs: trigger: runs-on: ubuntu-slim if: github.repository == 'vitejs/vite' && github.event.issue.pull_request && startsWith(github.event.comment.body, '/ecosystem-ci run') permissions: issues: write # to add / delete reactions, post comments pull-requests: write # to read PR data, and to add labels actions: read # to check workflow status steps: - name: Check User Permissions uses: actions/github-script@v8 id: check-permissions with: script: | const user = context.payload.sender.login console.log(`Validate user: ${user}`) const additionalAllowedUsers = ['lukastaegert'] let hasTriagePermission = false try { const { data } = await github.rest.repos.getCollaboratorPermissionLevel({ owner: context.repo.owner, repo: context.repo.repo, username: user, }); hasTriagePermission = data.user.permissions.triage } catch (e) { console.warn(e) } if (hasTriagePermission || additionalAllowedUsers.includes(user)) { console.log('User is allowed. Adding +1 reaction.') await github.rest.reactions.createForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, content: '+1', }) } else { console.log('User is not allowed. Adding -1 reaction.') await github.rest.reactions.createForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, content: '-1', }) throw new Error('User does not have the necessary permissions.') } - name: Get PR Data uses: actions/github-script@v8 id: get-pr-data with: script: | console.log(`Get PR info: ${context.repo.owner}/${context.repo.repo}#${context.issue.number}`) const { data: pr } = await github.rest.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number }) const commentCreatedAt = new Date(context.payload.comment.created_at) const commitPushedAt = new Date(pr.head.repo.pushed_at) console.log(`Comment created at: ${commentCreatedAt.toISOString()}`) console.log(`PR last pushed at: ${commitPushedAt.toISOString()}`) // Check if any commits were pushed after the comment was created if (commitPushedAt > commentCreatedAt) { const errorMsg = [ '⚠️ Security warning: PR was updated after the trigger command was posted.', '', `Comment posted at: ${commentCreatedAt.toISOString()}`, `PR last pushed at: ${commitPushedAt.toISOString()}`, '', 'This could indicate an attempt to inject code after approval.', 'Please review the latest changes and re-run /ecosystem-ci run if they are acceptable.' ].join('\n') core.setFailed(errorMsg) await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: errorMsg }) throw new Error('PR was pushed to after comment was created') } core.setOutput('head_sha', pr.head.sha) return { num: context.issue.number, branchName: pr.head.ref, commit: pr.head.sha, repo: pr.head.repo.full_name } - name: Check Package Existence uses: actions/github-script@v8 id: check-package with: script: | const prData = ${{ steps.get-pr-data.outputs.result }} const url = `https://pkg.pr.new/vite@${prData.commit}` const response = await fetch(url) console.log(`Package check URL: ${url}, Status: ${response.status}`) // Add 'rocket' reaction to the issue comment if (response.status === 404) { const { data: reaction } = await github.rest.reactions.createForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, content: 'rocket', }) return { exists: false, reaction: reaction.id } } return { exists: true, reaction: null } - name: Generate Token id: generate-token uses: actions/create-github-app-token@v3 with: app-id: ${{ secrets.ECOSYSTEM_CI_GITHUB_APP_ID }} private-key: ${{ secrets.ECOSYSTEM_CI_GITHUB_APP_PRIVATE_KEY }} repositories: | vite vite-ecosystem-ci - name: Trigger Preview Release (if Package Not Found) if: fromJSON(steps.check-package.outputs.result).exists == false uses: actions/github-script@v8 id: trigger-preview-release env: PR_DATA: ${{ steps.get-pr-data.outputs.result }} with: github-token: ${{ steps.generate-token.outputs.token }} script: | const prData = JSON.parse(process.env.PR_DATA) console.log('Package not found, triggering preview release...') // Add label "trigger: preview" to the PR await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prData.num, labels: ['trigger: preview'] }) console.log('Added "trigger: preview" label.') - name: Wait for Preview Release Completion (if Package Not Found) if: fromJSON(steps.check-package.outputs.result).exists == false uses: actions/github-script@v8 id: wait-preview-release env: PR_DATA: ${{ steps.get-pr-data.outputs.result }} REACTION: ${{ fromJSON(steps.check-package.outputs.result).reaction }} with: script: | const prData = JSON.parse(process.env.PR_DATA) const reaction = +process.env.REACTION const workflowFileName = 'preview-release.yml' const workflow = await github.rest.actions.getWorkflow({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: workflowFileName, }) const workflowId = workflow.data.id console.log(`Waiting for workflow ID ${workflowId} to complete...`) const maxRetries = 60 // Wait up to 10 minutes const delay = 10000 // 10 seconds let completed = false for (let i = 0; i < maxRetries; i++) { const runsData = await github.rest.actions.listWorkflowRuns({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: workflowId, head_sha: prData.commit, per_page: 100, page: 1, }) const runs = runsData.data.workflow_runs if (runs.length > 0) { const latestRun = runs[0] console.log(`Latest run status: ${latestRun.status}, conclusion: ${latestRun.conclusion}`) if (latestRun.status === 'completed') { if (latestRun.conclusion === 'success') { console.log('Preview release workflow completed successfully.') completed = true break } else if (latestRun.conclusion === 'skipped') { // noop } else { throw new Error('Preview Release workflow failed.') } } } console.log(`Retrying... (${i + 1}/${maxRetries})`) await new Promise(resolve => setTimeout(resolve, delay)) } if (!completed) { throw new Error('Preview Release workflow did not complete in time.') } // Remove the 'rocket' reaction if (reaction) { await github.rest.reactions.deleteForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, reaction_id: reaction, }) console.log('Removed "rocket" reaction.') } - name: Trigger Downstream Workflow uses: actions/github-script@v8 id: trigger env: COMMENT: ${{ github.event.comment.body }} PR_DATA: ${{ steps.get-pr-data.outputs.result }} with: github-token: ${{ steps.generate-token.outputs.token }} script: | const comment = process.env.COMMENT.trim() const prData = JSON.parse(process.env.PR_DATA) const suite = comment.split('\n')[0].replace(/^\/ecosystem-ci run/, '').trim() await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: 'vite-ecosystem-ci', workflow_id: 'ecosystem-ci-from-pr.yml', ref: 'main', inputs: { prNumber: '' + prData.num, branchName: prData.branchName, repo: prData.repo, commit: prData.commit, suite: suite === '' ? '-' : suite } }) ================================================ FILE: .github/workflows/issue-close-require.yml ================================================ name: Issue Close Require on: schedule: - cron: "0 0 * * *" jobs: close-issues: if: github.repository == 'vitejs/vite' runs-on: ubuntu-slim permissions: issues: write # for actions-cool/issues-helper to update issues pull-requests: write # for actions-cool/issues-helper to update PRs steps: - name: needs reproduction uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3 with: actions: "close-issues" token: ${{ secrets.GITHUB_TOKEN }} labels: "needs reproduction" inactive-day: 3 ================================================ FILE: .github/workflows/issue-labeled.yml ================================================ name: Issue Labeled on: issues: types: [labeled] jobs: reply-labeled: if: github.repository == 'vitejs/vite' runs-on: ubuntu-slim permissions: issues: write # for actions-cool/issues-helper to update issues pull-requests: write # for actions-cool/issues-helper to update PRs steps: - name: contribution welcome if: github.event.label.name == 'contribution welcome' || github.event.label.name == 'help wanted' uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3 with: actions: "remove-labels" token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} labels: "pending triage, needs reproduction" - name: remove pending if: (github.event.label.name == 'enhancement' || contains(github.event.label.description, '(priority)')) && contains(github.event.issue.labels.*.name, 'pending triage') uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3 with: actions: "remove-labels" token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} labels: "pending triage" - name: needs reproduction if: github.event.label.name == 'needs reproduction' uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3 with: actions: "create-comment, remove-labels" token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} body: | Hello @${{ github.event.issue.user.login }}. Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository or [StackBlitz](https://vite.new). Issues marked with `needs reproduction` will be closed if they have no activity within 3 days. labels: "pending triage" ================================================ FILE: .github/workflows/issue-template-check.yml ================================================ name: Issue Template Check on: issues: types: [opened] jobs: evaluate-issue: if: "!github.event.issue.pull_request" runs-on: ubuntu-latest permissions: contents: read issues: read pull-requests: read outputs: agent_output: ${{ steps.agent.outputs.agent_output }} template_type: ${{ steps.detect.outputs.template_type }} skip: ${{ steps.detect.outputs.skip }} steps: - uses: actions/checkout@v6 - name: Detect issue type id: detect uses: actions/github-script@v8 with: script: | const labels = context.payload.issue.labels.map(l => l.name); const issueType = context.payload.issue.type?.name; if (issueType === 'Bug') { core.setOutput('template_type', 'bug_report'); core.setOutput('skip', 'false'); } else if (issueType === 'Feature') { core.setOutput('template_type', 'feature_request'); core.setOutput('skip', 'false'); } else if (labels.includes('documentation')) { core.setOutput('template_type', 'docs'); core.setOutput('skip', 'false'); } else { core.info('Issue was not created from a recognized template. Skipping.'); core.setOutput('template_type', 'unknown'); core.setOutput('skip', 'true'); } - uses: warpdotdev/oz-agent-action@827a9ad5438c195eb9d1d9a7acece3a8000be512 # v1 if: steps.detect.outputs.skip == 'false' id: agent with: prompt: | You are an issue reviewer for the Vite project. The issue template type detected is: ${{ steps.detect.outputs.template_type }} Read the matching issue template from the checked-out repository at: .github/ISSUE_TEMPLATE/${{ steps.detect.outputs.template_type }}.yml Then evaluate the following issue to determine if it faithfully follows that template. Issue title: ${{ github.event.issue.title }} Issue body: ${{ github.event.issue.body }} Here is a summary of the required fields per template type: **bug_report** required fields: 1. Describe the bug (required) - A clear and concise description, not vague or just a generic error message 2. Reproduction (required) - A valid link to a reproduction (vite.new or GitHub repo URL), not empty or plain text 3. Steps to reproduce - Steps needed to reproduce (optional) 4. System Info (required) - Output of the envinfo command, must look like actual system/envinfo output 5. Used Package Manager (required) - One of: npm, yarn, pnpm, bun 6. Logs - Optional error logs 7. Validations (required) - All checkboxes must be checked **feature_request** required fields: 1. Description (required) - Clear and concise description of the problem and use cases 2. Suggested solution (required) - A proposed implementation or approach. If it suggests a new option, check against "Think Before Adding Yet Another Option" in the CONTRIBUTING.md 3. Alternative - Alternative solutions considered (optional) 4. Additional context - Any other context (optional) 5. Validations (required) - All checkboxes must be checked **docs** required fields: 1. Documentation is - Checkboxes indicating the issue type: Missing, Outdated, Confusing, Not sure (optional but at least one should be checked) 2. Explain in Detail (required) - A clear description of the documentation issue 3. Your Suggestion for Changes (required) - What should be changed 4. Reproduction - Optional link via vite.new or GitHub repo 5. Steps to reproduce - Optional reproduction steps Evaluate the issue against the criteria for its detected template type. Focus on whether the required fields are present and substantive (not empty placeholders or placeholder text). Respond with ONLY a JSON object (no markdown fencing) with these fields: - "template": the template type that was checked - "compliant": true/false - "missing": an array of strings describing what is missing or inadequate (empty array if compliant) - "comment": a polite, helpful comment to post if non-compliant, formatted in GitHub markdown. Address the user by their username @${{ github.event.issue.user.login }}. Ask them to update the issue with the missing information. Reference the specific template they should follow. Be concise. output_format: json warp_api_key: ${{ secrets.WARP_API_KEY }} profile: ${{ vars.WARP_AGENT_PROFILE || '' }} post-results: needs: evaluate-issue if: needs.evaluate-issue.outputs.skip == 'false' && needs.evaluate-issue.outputs.agent_output runs-on: ubuntu-latest permissions: contents: read issues: write steps: - name: Write result to summary uses: actions/github-script@v8 env: TEMPLATE_TYPE: ${{ needs.evaluate-issue.outputs.template_type }} AGENT_OUTPUT: ${{ needs.evaluate-issue.outputs.agent_output }} with: script: | const output = process.env.AGENT_OUTPUT; const templateType = process.env.TEMPLATE_TYPE; try { // The agent outputs streaming JSON format with multiple lines // We need to extract the last line with type:"agent" and parse its text field const lines = output.trim().split('\n'); let agentText = null; for (const line of lines) { try { const parsed = JSON.parse(line); if (parsed.type === 'agent' && parsed.text) { agentText = parsed.text; } } catch (e) {} } if (agentText) { await core.summary .addHeading(`Issue Template Check (${templateType})`) .addCodeBlock(agentText, 'json') .write(); } } catch (e) { core.setFailed(`Failed to write summary: ${e.message}`); } ================================================ FILE: .github/workflows/lock-closed-issues.yml ================================================ name: Lock Closed Issues on: schedule: - cron: "0 0 * * *" permissions: issues: write jobs: action: if: github.repository == 'vitejs/vite' runs-on: ubuntu-slim steps: - uses: actions-cool/issues-helper@71b62d7da76e59ff7b193904feb6e77d4dbb2777 # v3 with: actions: "lock-issues" token: ${{ secrets.GITHUB_TOKEN }} #body: | # This issue has been locked since it has been closed for more than 14 days. # # If you have found a concrete bug or regression related to it, please open a new [bug report](https://github.com/vitejs/vite/issues/new/choose) with a reproduction against the latest Vite version. If you have any other comments you should join the chat at [Vite Land](https://chat.vite.dev) or create a new [discussion](https://github.com/vitejs/vite/discussions). issue-state: closed inactive-day: 14 ================================================ FILE: .github/workflows/preview-release.yml ================================================ name: Preview release env: # install playwright binary manually (because pnpm only runs install script once) PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" permissions: pull-requests: write on: push: branches: - main pull_request: types: [opened, synchronize, labeled] jobs: preview: if: > github.repository == 'vitejs/vite' && (github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'trigger: preview'))) runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v6 - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - name: Set node version to 24 uses: actions/setup-node@v6 with: node-version: 24 registry-url: https://registry.npmjs.org/ # disable cache, to avoid cache poisoning (https://docs.zizmor.sh/audits/#cache-poisoning) package-manager-cache: false - name: Disallow installation scripts run: yq '.onlyBuiltDependencies = []' -i pnpm-workspace.yaml - name: Install deps run: pnpm install env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" - name: Build Vite core working-directory: ./packages/vite run: pnpm build - name: Build plugin-legacy working-directory: ./packages/plugin-legacy run: pnpm build - run: pnpm dlx pkg-pr-new@0.0 publish --pnpm './packages/vite' './packages/plugin-legacy' --packageManager=pnpm,npm,yarn --commentWithDev ================================================ FILE: .github/workflows/publish.yml ================================================ name: Publish Package on: push: tags: - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 - "plugin-*" # Push events to matching plugin-*, i.e. plugin-(vue|vue-jsx|react|legacy)@1.0.0 - "create-vite*" # # Push events to matching create-vite*, i.e. create-vite@1.0.0 jobs: publish: # prevents this action from running on forks if: github.repository == 'vitejs/vite' runs-on: ubuntu-latest permissions: contents: read id-token: write environment: Release steps: - name: Checkout uses: actions/checkout@v6 - name: Install pnpm uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - name: Set node version to 24 uses: actions/setup-node@v6 with: node-version: 24 registry-url: https://registry.npmjs.org/ # disable cache, to avoid cache poisoning (https://docs.zizmor.sh/audits/#cache-poisoning) package-manager-cache: false - name: Disallow installation scripts run: yq '.onlyBuiltDependencies = []' -i pnpm-workspace.yaml - name: Install deps run: pnpm install env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1" - name: Publish package run: npm i -g npm@^11.5.2 && pnpm run ci-publish "$REF_NAME" env: REF_NAME: ${{ github.ref_name }} ================================================ FILE: .github/workflows/release-tag.yml ================================================ name: Add GitHub Release Tag on: push: tags: - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 - "plugin-*" # Push events to matching plugin-*, i.e. plugin-(vue|vue-jsx|react|legacy)@1.0.0 - "create-vite*" # # Push events to matching create-vite*, i.e. create-vite@1.0.0 # $GITHUB_REF_NAME - https://docs.github.com/en/actions/reference/workflows-and-actions/variables#default-environment-variables jobs: release: if: github.repository == 'vitejs/vite' runs-on: ubuntu-slim permissions: contents: write # for yyx990803/release-tag to create a release tag steps: - uses: actions/checkout@v6 - name: Get pkgName for tag id: tag run: | # skip if alpha if [[ $GITHUB_REF_NAME =~ alpha ]]; then exit 0 fi # matching v2.0.0 / v2.0.0-beta.8 etc if [[ $GITHUB_REF_NAME =~ ^v.+ ]]; then pkgName="vite" else # `%@*` truncates @ and version number from the right side. # https://stackoverflow.com/questions/9532654/expression-after-last-specific-character pkgName=${GITHUB_REF_NAME%@*} fi echo "pkgName=$pkgName" >> $GITHUB_OUTPUT - name: Create Release for Tag # only run if tag is not alpha if: steps.tag.outputs.pkgName id: release_tag uses: yyx990803/release-tag@8cccf7c5aa332d71d222df46677f70f77a8d2dc0 # v1.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ github.ref }} body: | Please refer to [CHANGELOG.md](https://github.com/vitejs/vite/blob/${{ github.ref_name }}/packages/${{ steps.tag.outputs.pkgName }}/CHANGELOG.md) for details. ================================================ FILE: .github/workflows/semantic-pull-request.yml ================================================ name: Semantic Pull Request on: pull_request_target: types: - opened - edited - synchronize jobs: main: if: github.repository == 'vitejs/vite' runs-on: ubuntu-slim name: Semantic Pull Request permissions: pull-requests: read steps: - name: Validate PR title uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6 with: subjectPattern: ^(?![A-Z]).+$ subjectPatternError: | The subject "{subject}" found in the pull request title "{title}" didn't match the configured pattern. Please ensure that the subject doesn't start with an uppercase character. env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ !**/glob-import/dir/node_modules .DS_Store .idea .pnpm-store *.cpuprofile *.local *.log /.vscode/ /docs/.vitepress/cache /docs/.vitepress/.temp /packages/vite/LICENSE dist dist-ssr explorations node_modules playground-temp temp TODOs.md .eslintcache ================================================ FILE: .prettierignore ================================================ packages/*/CHANGELOG.md packages/vite/src/node/ssr/__tests__/fixtures/errors/syntax-error.* playground-temp/ dist/ LICENSE.md pnpm-lock.yaml pnpm-workspace.yaml playground/tsconfig-json-load-error/has-error/tsconfig.json playground/html/invalid.html playground/html/invalidClick.html playground/html/invalidEscape.html playground/html/valid.html playground/external/public/slash@3.0.0.js playground/ssr-html/public/slash@3.0.0.js playground/worker/classic-worker.js playground/css/weapp.wxss ================================================ FILE: .prettierrc.json ================================================ { "semi": false, "singleQuote": true, "overrides": [ { "files": ["**/*.json5"], "options": { "singleQuote": false, "quoteProps": "preserve" } }, { "files": ["**/*.yml"], "options": { "singleQuote": false } } ] } ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Code Of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, political party, or sexual identity and orientation. Note, however, that religion, political party, or other ideological affiliation provide no exemptions for the behavior we outline as unacceptable in this Code of Conduct. ## Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team by DM at [Vite Land](https://chat.vite.dev). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org ================================================ FILE: CONTRIBUTING.md ================================================ # Vite Contributing Guide Hi! We're really excited that you're interested in contributing to Vite! Before submitting your contribution, please read through the following guide. We also suggest you read the [Project Philosophy](https://vite.dev/guide/philosophy) in our documentation. ## Repo Setup To develop locally, fork the Vite repository and clone it in your local machine. The Vite repo is a monorepo using pnpm workspaces. The package manager used to install and link dependencies must be [pnpm](https://pnpm.io/). You can find the required pnpm version in `package.json` under the `packageManager` key. To develop and test the core `vite` package: 1. Run `pnpm i` in Vite's root folder. 2. Run `pnpm run build` in Vite's root folder. 3. If you are developing Vite itself, you can go to `packages/vite` and run `pnpm run dev` to automatically rebuild Vite whenever you change its code. > If you are working on multiple projects with different versions of pnpm, it's recommended to enable [Corepack](https://github.com/nodejs/corepack) by running `corepack enable`. ### Cloning the repo on Windows On Windows, you may want to [activate Developer Mode](https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development) to resolve [issues with symlink creation for non-admins](https://github.com/vitejs/vite/issues/7390). Also, you may want to [set git `core.symlinks` to `true` to resolve issues with symlinks in git](https://github.com/vitejs/vite/issues/5242). ### Ignoring commits when running `git blame` We have a `.git-blame-ignore-revs` file to ignore formatting changes. To make this file used by `git blame`, you need to run the following command. ```sh git config --local blame.ignoreRevsFile .git-blame-ignore-revs ``` ## Documentation To develop the `docs/` site: 1. Run `pnpm run build` in Vite's root folder. This will generate the types for `twoslash` to work in the code examples. If the types are not available, errors will be logged in step 2 but does not prevent the site from working. 2. Run `pnpm run docs` in Vite's root folder. ### Docs Translation Contribution To add a new language to the Vite docs, see [`vite-docs-template`](https://github.com/tony19/vite-docs-template/blob/main/.github/CONTRIBUTING.md). ## Notes on Dependencies Vite aims to be lightweight, and this includes being aware of the number of npm dependencies and their size. We use Rolldown to pre-bundle most dependencies before publishing! Therefore, most dependencies, even those used in runtime source code, should be added under `devDependencies` by default. This also creates the following constraints that we need to be aware of in the codebase. ### Usage of `require()` In some cases, we intentionally lazy-require some dependencies to improve start-up performance. However, note that we cannot use simple `require('somedep')` calls since these are ignored in ESM files, so the dependency won't be included in the bundle, and the actual dependency won't even be there when published since they are in `devDependencies`. Instead, use `(await import('somedep')).default`. ### Think Before Adding a Dependency Most deps should be added to `devDependencies` even if they are needed at runtime. Some exceptions are: - Type packages. Example: `@types/*`. - Deps that cannot be properly bundled due to binary files. Example: `esbuild`. - Deps that ship their own types that are used in Vite's own public types. Example: `rollup`. Avoid deps with large transitive dependencies that result in bloated size compared to the functionality it provides. For example, `http-proxy` itself is around 380kB in size, but `http-proxy-middleware` pulls in a ton of dependencies that make it 3MB(!) when a minimal custom middleware on top of `http-proxy` only requires a couple of lines of code. ### Ensure Type Support Vite aims to be fully usable as a dependency in a TypeScript project (e.g. it should provide proper typings for VitePress), and also in `vite.config.ts`. This means technically a dependency whose types are exposed needs to be part of `dependencies` instead of `devDependencies`. However, this also means we won't be able to bundle it. To get around this, we inline some of these dependencies' types in `packages/vite/src/types`. This way, we can still expose the typing but bundle the dependency's source code. Use `pnpm run build-types-check` to check that the bundled types do not rely on types in `devDependencies`. For types shared between client and node, they should be added into `packages/vite/types`. These types are not bundled and are published as is (though they are still considered internal). ## Think Before Adding Yet Another Option We already have many config options, and we should avoid fixing an issue by adding yet another one. Before adding an option, consider whether the problem: - is really worth addressing - can be fixed with a smarter default - has workaround using existing options - can be addressed with a plugin instead ## Debugging To use breakpoints and explore code execution, you can use the ["Run and Debug"](https://code.visualstudio.com/docs/editor/debugging) feature from VS Code. 1. Add a `debugger` statement where you want to stop the code execution. 2. Click the "Run and Debug" icon in the activity bar of the editor, which opens the [_Run and Debug view_](https://code.visualstudio.com/docs/editor/debugging#_run-and-debug-view). 3. Click the "JavaScript Debug Terminal" button in the _Run and Debug view_, which opens a terminal in VS Code. 4. From that terminal, go to `playground/xxx`, and run `pnpm run dev`. 5. The execution will stop at the `debugger` statement, and you can use the [Debug toolbar](https://code.visualstudio.com/docs/editor/debugging#_debug-actions) to continue, step over, and restart the process... ### Debugging Errors in Vitest Tests Using Playwright (Chromium) Some errors are masked and hidden away because of the layers of abstraction and sandboxed nature added by Vitest, Playwright, and Chromium. In order to see what's actually going wrong and the contents of the devtools console in those instances, follow this setup: 1. Add a `debugger` statement to the `playground/vitestSetup.ts` -> `afterAll` hook. This will pause execution before the tests quit and the Playwright browser instance exits. 2. Run the tests with the `debug-serve` script command, which will enable remote debugging: `pnpm run debug-serve resolve`. 3. Wait for inspector devtools to open in your browser and the debugger to attach. 4. In the sources panel in the right column, click the play button to resume execution, and allow the tests to run, which will open a Chromium instance. 5. Focusing the Chromium instance, you can open the browser devtools and inspect the console there to find the underlying problems. 6. To close everything, just stop the test process back in your terminal. ### Debug Logging You can set the `--debug` option to turn on debugging logs (e.g. `vite --debug resolve`). To see all debug logs, you can set `vite --debug *`, 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. ### Disabling Source Maps Source maps for Vite's source code are enabled by default when Vite is placed outside `node_modules` so that you can easily debug it. When bundling Vite in watch mode, source maps will be generated. However, this behavior may not be desirable when you are developing source map related features. In that case, you can disable source maps by setting the `DEBUG_DISABLE_SOURCE_MAP` environment variable to `1` when running Vite (e.g. `DEBUG_DISABLE_SOURCE_MAP=1 vite`). This environment variable can also be used to disable source map generation. ## Testing Vite against external packages You may wish to test your locally modified copy of Vite against another package that is built with Vite. For pnpm, after building Vite, you can use [`pnpm.overrides`](https://pnpm.io/package_json#pnpmoverrides) to do this. Note that `pnpm.overrides` must be specified in the root `package.json`, and you must list the package as a dependency in the root `package.json`: ```json { "dependencies": { "vite": "^7.0.0" }, "pnpm": { "overrides": { "vite": "link:../path/to/vite/packages/vite" } } } ``` And re-run `pnpm install` to link the package. ## Running Tests ### Integration Tests Each package under `playground/` contains a `__tests__` directory. The tests are run using [Vitest](https://vitest.dev/) + [Playwright](https://playwright.dev/) with custom integrations to make writing tests simple. The detailed setup is inside `vitest.config.e2e.ts` and `playground/vitest*.ts` files. Some playgrounds define variants to run the same app using different config setups. By convention, when running a test spec file in a nested folder in `__tests__`, the setup will try to use a config file named `vite.config-{folderName}.js` at the playground's root. You can see an example of variants in the [assets playground](https://github.com/vitejs/vite/tree/main/playground/assets). Before running the tests, make sure that [Vite has been built](#repo-setup). Each integration test can be run under either dev server mode or build mode. - `pnpm test` by default runs every integration test in both serve and build mode, and also unit tests. - `pnpm run test-serve` runs tests only under serve mode. - `pnpm run test-build` runs tests only under build mode. `pnpm run test-serve [match]` or `pnpm run test-build [match]` runs tests in specific packages that match the given filter. e.g. `pnpm run test-serve assets` runs tests for both `playground/assets` and `playground/assets-sanitize` under serve mode. Note package matching is not available for the `pnpm test` script, which always runs all tests. ### Unit Tests Other than tests under `playground/` for integration tests, packages might contain unit tests under their `__tests__` directory. Unit tests are powered by [Vitest](https://vitest.dev/). The detailed config is inside `vitest.config.ts` files. - `pnpm run test-unit` runs unit tests under each package. `pnpm run test-unit [match]` runs tests in specific packages that match the given filter. ### Test Env and Helpers Inside playground tests, you can import the `page` object from `~utils`, which is a Playwright [`Page`](https://playwright.dev/docs/api/class-page) instance that has already navigated to the served page of the current playground. So, writing a test is as simple as: ```js import { page } from '~utils' test('should work', async () => { expect(await page.textContent('.foo')).toMatch('foo') }) ``` Some common test helpers (e.g. `testDir`, `isBuild`, or `editFile`) are also available in the utils. Source code is located at `playground/test-utils.ts`. Note: The test build environment uses a [different default set of Vite config](https://github.com/vitejs/vite/blob/main/playground/vitestSetup.ts#L207-L227) to skip transpilation during tests to make it faster. This may produce a different result compared to the default production build. ### Extending the Test Suite To add new tests, you should find a related playground to the fix or feature (or create a new one). As an example, static assets loading is tested in the [assets playground](https://github.com/vitejs/vite/tree/main/playground/assets). In this Vite app, there is a test for `?raw` imports with [a section defined in the `index.html` for it](https://github.com/vitejs/vite/blob/v6.3.1/playground/assets/index.html#L266-L267): ```html

?raw import

``` This will be modified [with the result of a file import](https://github.com/vitejs/vite/blob/v6.3.1/playground/assets/index.html#L543-L544): ```js import rawSvg from './nested/fragment.svg?raw' text('.raw', rawSvg) ``` ...where the `text` util is defined as: ```js function text(el, text) { document.querySelector(el).textContent = text } ``` In the [spec tests](https://github.com/vitejs/vite/blob/v6.3.1/playground/assets/__tests__/assets.spec.ts#L469-L471), the modifications to the DOM listed above are used to test this feature: ```js test('?raw import', async () => { expect(await page.textContent('.raw')).toMatch('SVG') }) ``` ### Note on Test Dependencies 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. ## Pull Request Guidelines > [!NOTE] > You do not need to ask for permission to work on an open issue. You can start investigating or open a PR directly. If someone else ships a fix first, you can still help by reviewing or validating the solution. - Checkout a topic branch from a base branch (e.g. `main`), and merge back against that branch. - If adding a new feature: - Add accompanying test case. - Provide a convincing reason to add this feature. Ideally, you should open a suggestion issue first, and have it approved before working on it. - If fixing a bug: - If you are resolving a special issue, add `(fix #xxxx[,#xxxx])` (#xxxx is the issue id) in your PR title for a better release log (e.g. `fix: update entities encoding/decoding (fix #3899)`). - Provide a detailed description of the bug in the PR. Live demo preferred. - Add appropriate test coverage. If not applicable, explain in the PR description why tests are not included. - If it's a chore: - For typos and comment changes, try to combine multiple of them into a single PR. - **Note that we discourage contributors from submitting code refactors that are largely stylistic.** Code refactors are only accepted if it improves performance, or objectively improves code quality (e.g. makes a related bug fix or feature implementation easier, and it is as a separate PR to improve git history). - The reason is that code readability is subjective. The maintainers of this project have chosen to write the code in its current style based on our preferences, and we do not want to spend time explaining our stylistic preferences. Contributors should just respect the established conventions when contributing code. Another aspect of it is that large scale stylistic changes result in massive diffs that touch multiple files, adding noise to the git history and makes tracing behavior changes across commits more cumbersome. - It's OK to have multiple small commits as you work on the PR. GitHub can automatically squash them before merging. - Make sure tests pass! - No need to worry about code style as long as you have installed the dev dependencies. Modified files are automatically formatted with Prettier on commit (by invoking [Git Hooks](https://git-scm.com/docs/githooks) via [simple-git-hooks](https://github.com/toplenboren/simple-git-hooks)). - PR title must follow the [commit message convention](./.github/commit-convention.md) so that changelogs can be automatically generated. ## Maintenance Guidelines > The following section is mostly for maintainers who have commit access, but it's helpful to go through if you intend to make non-trivial contributions to the codebase. ### Issue Triaging Workflow ```mermaid flowchart TD start{Followed issue template?} start --NO--> close1["Close and ask to follow template"] start --YES--> dupe{Is duplicate?} dupe --YES--> close2[Close and point to duplicate] dupe --NO--> repro{Has proper reproduction?} repro --NO--> close3[Label: 'needs reproduction' bot will auto close if no update has been made in 3 days] repro --YES--> real{Is actually a bug?} real --NO--> intended{Is the intended behaviour?} intended --YES--> explain[Explain and close point to docs if needed] intended --NO--> open[Keep open for discussion Remove 'pending triage' label] real --YES--> real2["① Remove 'pending triage' label ② Add related feature label if applicable (e.g. 'feat: ssr') ③ Add priority and meta labels (see below)"] real2 --> unusable{Does the bug make Vite unusable?} unusable --YES--> maj{Does the bug affect the majority of Vite users?} maj --YES--> p5[p5: urgent] maj --NO--> p4[p4: important] unusable --NO--> workarounds{Are there workarounds for the bug?} workarounds --NO--> p3[p3: minor bug] workarounds --YES--> p2[p2: edge case has workaround] ``` ### Pull Request Review Workflow ```mermaid flowchart TD start{Bug fix or feature} start --BUG FIX--> strict_bug{"Is this a 'strict fix'? i.e. fixes an obvious oversight with no side effects"} start --FEATURE--> feature[• Discuss feature necessity • Is there a better way to address the need? • Review code quality • Add labels • Add to milestone • Add to Team Board] feature -.-> approve_non_strict[• Run vite-ecosystem-ci if needed • Approve if you feel strongly that the PR is needed and add to milestone] strict_bug --YES--> strict[• Verify the fix locally • Review code quality • Require test case if applicable • Request changes if necessary • Add labels] strict_bug --NO--> non_strict[Discuss the potential side effects of the fix, e.g. • Could it introduce implicit behavior changes in other cases? • Does it introduce too much changes? • Add labels • Add to Team Board] non_strict -.-> approve_non_strict strict --> approve_strict[Approve if ready to be merged] approve_strict --> merge_strict[Merge if approved by 2 or more team members] approve_non_strict -.-> merge_non_strict[Merge if approved by 2 or more team members and the PR has been discussed in a team meeting] merge_non_strict -.-> merge_extra merge_strict --> merge_extra["• Use 'Squash and Merge' • Edit commit message to follow convention • In commit message body, list relevant issues being fixed e.g. 'fix #1234, fix #1235'"] ``` ### Release If you have publish access, the steps below explain how to cut a release for a package. There are two phases for the release step: "Release" and "Publish". "Release" is done locally to generate the changelogs and git tags: 1. Make sure the git remote for https://github.com/vitejs/vite is set as `origin`. 2. In the `vite` project root `main` branch, run `git pull` and `pnpm i` to get it up-to-date. Then run `pnpm build`. 3. Run `pnpm release` and follow the prompts to cut a release for a package. It will generate the changelog, a git release tag, and push them to `origin`. You can run with the `--dry` flag to test it out. 4. When the command finishes, it will provide a link to https://github.com/vitejs/vite/actions/workflows/publish.yml. 5. Click the link to visit the page, and follow the next steps below. "Publish" is done on GitHub Actions to publish the package to npm: 1. Shortly in the workflows page, a new workflow will appear for the released package and is waiting for approval to publish to npm. 2. Click on the workflow to open its page. 3. Click on the "Review deployments" button in the yellow box, a popup will appear. 4. Check "Release" and click "Approve and deploy". 5. The package will start publishing to npm. To learn more about how and when Vite does releases, check out the [Releases](https://vite.dev/releases) documentation. ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2019-present, VoidZero Inc. and Vite contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================



vite logo


npm package node compatibility build status issue triage powered by Oz discord chat


# Vite ⚡ > Next Generation Frontend Tooling - 💡 Instant Server Start - ⚡️ Lightning Fast HMR - 🛠️ Rich Features - 📦 Optimized Build - 🔩 Universal Plugin Interface - 🔑 Fully Typed APIs Vite (French word for "quick", pronounced [`/viːt/`](https://cdn.jsdelivr.net/gh/vitejs/vite@main/docs/public/vite.mp3), like "veet") is a new breed of frontend build tooling that significantly improves the frontend development experience. It consists of two major parts: - A dev server that serves your source files over [native ES modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), with [rich built-in features](https://vite.dev/guide/features.html) and astonishingly fast [Hot Module Replacement (HMR)](https://vite.dev/guide/features.html#hot-module-replacement). - A [build command](https://vite.dev/guide/build.html) that bundles your code with [Rollup](https://rollupjs.org), pre-configured to output highly optimized static assets for production. In addition, Vite is highly extensible via its [Plugin API](https://vite.dev/guide/api-plugin.html) and [JavaScript API](https://vite.dev/guide/api-javascript.html) with full typing support. [Read the Docs to Learn More](https://vite.dev). ## Packages | Package | Version (click for changelogs) | | ----------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | | [vite](packages/vite) | [![vite version](https://img.shields.io/npm/v/vite.svg?label=%20)](packages/vite/CHANGELOG.md) | | [@vitejs/plugin-legacy](packages/plugin-legacy) | [![plugin-legacy version](https://img.shields.io/npm/v/@vitejs/plugin-legacy.svg?label=%20)](packages/plugin-legacy/CHANGELOG.md) | | [create-vite](packages/create-vite) | [![create-vite version](https://img.shields.io/npm/v/create-vite.svg?label=%20)](packages/create-vite/CHANGELOG.md) | ## Contribution See [Contributing Guide](CONTRIBUTING.md). ## License [MIT](LICENSE). ## Sponsors

sponsors

================================================ FILE: docs/.vitepress/buildEnd.config.ts ================================================ import path from 'node:path' import { writeFileSync } from 'node:fs' import { Feed } from 'feed' import type { SiteConfig } from 'vitepress' import { createContentLoader } from 'vitepress' const siteUrl = 'https://vite.dev' const blogUrl = `${siteUrl}/blog` export const buildEnd = async (config: SiteConfig): Promise => { const feed = new Feed({ title: 'Vite', description: 'Next Generation Frontend Tooling', id: blogUrl, link: blogUrl, language: 'en', image: 'https://vite.dev/og-image.jpg', favicon: 'https://vite.dev/logo.svg', copyright: 'Copyright © 2019-present VoidZero Inc. & Vite Contributors', }) const posts = await createContentLoader('blog/*.md', { excerpt: true, render: true, }).load() posts.sort( (a, b) => +new Date(b.frontmatter.date as string) - +new Date(a.frontmatter.date as string), ) for (const { url, excerpt, frontmatter, html } of posts) { feed.addItem({ title: frontmatter.title, id: `${siteUrl}${url}`, link: `${siteUrl}${url}`, description: excerpt, content: html, author: [ { name: frontmatter.author.name, }, ], date: frontmatter.date, }) } writeFileSync(path.join(config.outDir, 'blog.rss'), feed.rss2()) } ================================================ FILE: docs/.vitepress/config.ts ================================================ import path from 'node:path' import fs from 'node:fs' import type { HeadConfig } from 'vitepress' import { defineConfig } from 'vitepress' import { transformerTwoslash } from '@shikijs/vitepress-twoslash' import { groupIconMdPlugin, groupIconVitePlugin, } from 'vitepress-plugin-group-icons' import { graphvizMarkdownPlugin } from 'vitepress-plugin-graphviz' import llmstxt from 'vitepress-plugin-llms' import { markdownItImageSize } from 'markdown-it-image-size' import { extendConfig } from '@voidzero-dev/vitepress-theme/config' import type { FooterLink } from '@voidzero-dev/vitepress-theme' import packageJson from '../../packages/vite/package.json' with { type: 'json' } import { buildEnd } from './buildEnd.config' const viteVersion = packageJson.version const viteMajorVersion = +viteVersion.split('.')[0] const ogDescription = 'Next Generation Frontend Tooling' const ogImage = 'https://vite.dev/og-image.jpg' const ogTitle = 'Vite' const ogUrl = 'https://vite.dev' // netlify envs const deployURL = process.env.DEPLOY_PRIME_URL || '' const commitRef = process.env.COMMIT_REF?.slice(0, 8) || 'dev' const deployType = (() => { switch (deployURL) { case 'https://main--vite-docs-main.netlify.app': return 'main' case '': return 'local' default: return 'release' } })() const additionalTitle = ((): string => { switch (deployType) { case 'main': return ' (main branch)' case 'local': return ' (local)' case 'release': return '' } })() const versionLinks = (() => { const links: FooterLink[] = [] if (deployType !== 'main') { links.push({ text: 'Unreleased Docs', link: 'https://main.vite.dev', }) } if (deployType === 'main' || deployType === 'local') { links.push({ text: `Vite ${viteMajorVersion} Docs (release)`, link: 'https://vite.dev', }) } // Create version links from v2 onwards for (let i = viteMajorVersion - 1; i >= 2; i--) { links.push({ text: `Vite ${i} Docs`, link: `https://v${i}.vite.dev`, }) } return links })() function inlineScript(file: string): HeadConfig { return [ 'script', {}, fs.readFileSync( path.resolve(import.meta.dirname, `./inlined-scripts/${file}`), 'utf-8', ), ] } const config = defineConfig({ title: `Vite${additionalTitle}`, description: 'Next Generation Frontend Tooling', cleanUrls: true, sitemap: { hostname: 'https://vite.dev', }, head: [ [ 'link', { rel: 'icon', type: 'image/svg+xml', href: '/logo-without-border.svg' }, ], [ 'link', { rel: 'alternate', type: 'application/rss+xml', href: '/blog.rss' }, ], ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], inlineScript('banner.js'), ['link', { rel: 'me', href: 'https://m.webtoo.ls/@vite' }], ['meta', { property: 'og:type', content: 'website' }], ['meta', { property: 'og:title', content: ogTitle }], ['meta', { property: 'og:image', content: ogImage }], ['meta', { property: 'og:url', content: ogUrl }], ['meta', { property: 'og:description', content: ogDescription }], ['meta', { property: 'og:site_name', content: 'vitejs' }], ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ['meta', { name: 'twitter:site', content: '@vite_js' }], ['meta', { name: 'theme-color', content: '#646cff' }], [ 'script', { src: 'https://cdn.usefathom.com/script.js', 'data-site': 'CBDFBSLI', 'data-spa': 'auto', defer: '', }, ], ], locales: { root: { label: 'English' }, zh: { label: '简体中文', link: 'https://cn.vite.dev' }, ja: { label: '日本語', link: 'https://ja.vite.dev' }, es: { label: 'Español', link: 'https://es.vite.dev' }, pt: { label: 'Português', link: 'https://pt.vite.dev' }, ko: { label: '한국어', link: 'https://ko.vite.dev' }, de: { label: 'Deutsch', link: 'https://de.vite.dev' }, fa: { label: 'فارسی', link: 'https://fa.vite.dev' }, }, themeConfig: { variant: 'vite', logo: '/logo.svg', banner: { id: 'viteplus-alpha', text: 'Announcing Vite+ Alpha: Open source. Unified. Next-gen.', url: 'https://voidzero.dev/posts/announcing-vite-plus-alpha?utm_source=vite&utm_content=top_banner', }, editLink: { pattern: 'https://github.com/vitejs/vite/edit/main/docs/:path', text: 'Suggest changes to this page', }, socialLinks: [ { icon: 'bluesky', link: 'https://bsky.app/profile/vite.dev' }, { icon: 'mastodon', link: 'https://elk.zone/m.webtoo.ls/@vite' }, { icon: 'x', link: 'https://x.com/vite_js' }, { icon: 'discord', link: 'https://chat.vite.dev' }, { icon: 'github', link: 'https://github.com/vitejs/vite' }, ], search: { provider: 'algolia', options: { appId: '7H67QR5P0A', apiKey: '208bb9c14574939326032b937431014b', indexName: 'vitejs', searchParameters: { facetFilters: ['tags:en'], }, insights: true, }, }, carbonAds: { code: 'CEBIEK3N', placement: 'vitejsdev', }, footer: { copyright: `© 2019-present VoidZero Inc. and Vite contributors. (${commitRef})`, nav: [ { title: 'Vite', items: [ { text: 'Guide', link: '/guide/' }, { text: 'Config', link: '/config/' }, { text: 'Plugins', link: '/plugins/' }, ], }, { title: 'Resources', items: [ { text: 'Team', link: '/team' }, { text: 'Blog', link: '/blog' }, { text: 'Releases', link: 'https://github.com/vitejs/vite/releases', }, ], }, { title: 'Versions', items: versionLinks, }, ], social: [ { icon: 'github', link: 'https://github.com/vitejs/vite' }, { icon: 'discord', link: 'https://chat.vite.dev' }, { icon: 'bluesky', link: 'https://bsky.app/profile/vite.dev' }, { icon: 'x', link: 'https://x.com/vite_js' }, ], }, nav: [ { text: 'Guide', link: '/guide/', activeMatch: '/guide/' }, { text: 'Config', link: '/config/', activeMatch: '/config/' }, { text: 'Plugins', link: '/plugins/', activeMatch: '/plugins/' }, { text: 'Resources', items: [ { text: 'Team', link: '/team' }, { text: 'Blog', link: '/blog' }, { text: 'Releases', link: '/releases' }, { text: 'Acknowledgements', link: '/acknowledgements' }, { text: 'Plugin Registry', link: 'https://registry.vite.dev/plugins', }, { text: 'The Documentary', link: 'https://www.youtube.com/watch?v=bmWQqAKLgT4', }, { items: [ { text: 'Bluesky', link: 'https://bsky.app/profile/vite.dev', }, { text: 'Mastodon', link: 'https://elk.zone/m.webtoo.ls/@vite', }, { text: 'X', link: 'https://x.com/vite_js', }, { text: 'Discord Chat', link: 'https://chat.vite.dev', }, { text: 'Awesome Vite', link: 'https://github.com/vitejs/awesome-vite', }, { text: 'ViteConf', link: 'https://viteconf.org', }, { text: 'DEV Community', link: 'https://dev.to/t/vite', }, ], }, ], }, { text: `v${viteVersion}`, items: [ { text: 'Changelog', link: 'https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md', }, { text: 'Contributing', link: 'https://github.com/vitejs/vite/blob/main/CONTRIBUTING.md', }, { items: versionLinks, }, ], }, ], sidebar: { '/guide/': [ { text: 'Introduction', items: [ { text: 'Getting Started', link: '/guide/', }, { text: 'Philosophy', link: '/guide/philosophy', }, { text: 'Why Vite', link: '/guide/why', }, ], }, { text: 'Guide', items: [ { text: 'Features', link: '/guide/features', }, { text: 'CLI', link: '/guide/cli', }, { text: 'Using Plugins', link: '/guide/using-plugins', }, { text: 'Dependency Pre-Bundling', link: '/guide/dep-pre-bundling', }, { text: 'Static Asset Handling', link: '/guide/assets', }, { text: 'Building for Production', link: '/guide/build', }, { text: 'Deploying a Static Site', link: '/guide/static-deploy', }, { text: 'Env Variables and Modes', link: '/guide/env-and-mode', }, { text: 'Server-Side Rendering (SSR)', link: '/guide/ssr', }, { text: 'Backend Integration', link: '/guide/backend-integration', }, { text: 'Troubleshooting', link: '/guide/troubleshooting', }, { text: 'Performance', link: '/guide/performance', }, { text: `Migration from v${viteMajorVersion - 1}`, link: '/guide/migration', }, { text: 'Breaking Changes', link: '/changes/', }, ], }, { text: 'APIs', items: [ { text: 'Plugin API', link: '/guide/api-plugin', }, { text: 'HMR API', link: '/guide/api-hmr', }, { text: 'JavaScript API', link: '/guide/api-javascript', }, { text: 'Config Reference', link: '/config/', }, ], }, { text: 'Environment API', items: [ { text: 'Introduction', link: '/guide/api-environment', }, { text: 'Environment Instances', link: '/guide/api-environment-instances', }, { text: 'Plugins', link: '/guide/api-environment-plugins', }, { text: 'Frameworks', link: '/guide/api-environment-frameworks', }, { text: 'Runtimes', link: '/guide/api-environment-runtimes', }, ], }, ], '/config/': [ { text: 'Config', items: [ { text: 'Configuring Vite', link: '/config/', }, { text: 'Shared Options', link: '/config/shared-options', }, { text: 'Server Options', link: '/config/server-options', }, { text: 'Build Options', link: '/config/build-options', }, { text: 'Preview Options', link: '/config/preview-options', }, { text: 'Dep Optimization Options', link: '/config/dep-optimization-options', }, { text: 'SSR Options', link: '/config/ssr-options', }, { text: 'Worker Options', link: '/config/worker-options', }, ], }, ], '/changes/': [ { text: 'Breaking Changes', link: '/changes/', }, { text: 'Current', items: [], }, { text: 'Future', items: [ { text: 'this.environment in Hooks', link: '/changes/this-environment-in-hooks', }, { text: 'HMR hotUpdate Plugin Hook', link: '/changes/hotupdate-hook', }, { text: 'Move to Per-environment APIs', link: '/changes/per-environment-apis', }, { text: 'SSR Using ModuleRunner API', link: '/changes/ssr-using-modulerunner', }, { text: 'Shared Plugins During Build', link: '/changes/shared-plugins-during-build', }, ], }, { text: 'Past', items: [], }, ], }, outline: { level: [2, 3], }, }, transformHead(ctx) { const path = ctx.page.replace(/(^|\/)index\.md$/, '$1').replace(/\.md$/, '') if (path !== '404') { const canonicalUrl = path ? `${ogUrl}/${path}` : ogUrl ctx.head.push( ['link', { rel: 'canonical', href: canonicalUrl }], ['meta', { property: 'og:title', content: ctx.pageData.title }], ) } // For the landing page, move the google font links to the top for better performance if (path === '') { const googleFontLinks: HeadConfig[] = [] for (let i = 0; i < ctx.head.length; i++) { const tag = ctx.head[i] if ( tag[0] === 'link' && (tag[1]?.href?.includes('fonts.googleapis.com') || tag[1]?.href?.includes('fonts.gstatic.com')) ) { ctx.head.splice(i, 1) googleFontLinks.push(tag) i-- } } ctx.head.unshift(...googleFontLinks) } }, markdown: { // languages used for twoslash and jsdocs in twoslash languages: ['ts', 'js', 'json'], codeTransformers: [ transformerTwoslash(), // add `style:*` support { root(hast) { const meta = this.options.meta?.__raw ?.split(' ') .find((m) => m.startsWith('style:')) if (meta) { const style = meta.slice('style:'.length) const rootPre = hast.children.find( (n): n is typeof n & { type: 'element'; tagName: 'pre' } => n.type === 'element' && n.tagName === 'pre', ) if (rootPre) { rootPre.properties.style += '; ' + style } } }, }, ], async config(md) { md.use(groupIconMdPlugin, { titleBar: { includeSnippet: true, }, }) md.use(markdownItImageSize, { publicDir: path.resolve(import.meta.dirname, '../public'), }) await graphvizMarkdownPlugin(md) }, }, vite: { plugins: [ groupIconVitePlugin({ customIcon: { firebase: 'vscode-icons:file-type-firebase', '.gitlab-ci.yml': 'vscode-icons:file-type-gitlab', }, }), llmstxt({ ignoreFiles: ['blog/*', 'blog.md', 'index.md', 'team.md'], description: 'The Build Tool for the Web', details: `\ - 💡 Instant Server Start - ⚡️ Lightning Fast HMR - 🛠️ Rich Features - 📦 Optimized Build - 🔩 Universal Plugin Interface - 🔑 Fully Typed APIs Vite is a new breed of frontend build tooling that significantly improves the frontend development experience. It consists of two major parts: - A dev server that serves your source files over [native ES modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), with [rich built-in features](https://vite.dev/guide/features.md) and astonishingly fast [Hot Module Replacement (HMR)](https://vite.dev/guide/features.md#hot-module-replacement). - A [build command](https://vite.dev/guide/build.md) that bundles your code with [Rollup](https://rollupjs.org), pre-configured to output highly optimized static assets for production. In addition, Vite is highly extensible via its [Plugin API](https://vite.dev/guide/api-plugin.md) and [JavaScript API](https://vite.dev/guide/api-javascript.md) with full typing support.`, }), ], optimizeDeps: { include: ['@shikijs/vitepress-twoslash/client'], }, define: { __VITE_VERSION__: JSON.stringify(viteVersion), }, }, buildEnd, }) export default extendConfig(config) ================================================ FILE: docs/.vitepress/inlined-scripts/banner.d.ts ================================================ interface Window { __VITE_BANNER_ID__: string } ================================================ FILE: docs/.vitepress/inlined-scripts/banner.js ================================================ ;(() => { const restore = (key, cls, def = false) => { const saved = localStorage.getItem(key) if (saved ? saved !== 'false' : def) { document.documentElement.classList.add(cls) } } window.__VITE_BANNER_ID__ = 'viteplusannouncement' restore(`vite-docs-banner-${__VITE_BANNER_ID__}`, 'banner-dismissed') })() ================================================ FILE: docs/.vitepress/theme/components/AsideSponsors.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/BlogIndex.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/NonInheritBadge.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/ScrimbaLink.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/SponsorBanner.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/SupportedVersions.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/SvgImage.vue ================================================ ================================================ FILE: docs/.vitepress/theme/components/YouTubeVideo.vue ================================================ ================================================ FILE: docs/.vitepress/theme/composables/sponsor.ts ================================================ import { onMounted, onUnmounted, ref } from 'vue' import type { Sponsor, SponsorTier, } from '@voidzero-dev/vitepress-theme/src/types/sponsors' import voidZeroSvg from './images/voidzero.svg' import boltSvg from './images/bolt.svg' import nuxtLabsSvg from './images/nuxtlabs.svg' interface Sponsors { special: Sponsor[] platinum: Sponsor[] platinum_china: Sponsor[] gold: Sponsor[] silver: Sponsor[] bronze: Sponsor[] } // shared data across instances so we load only once. const data = ref() const dataHost = 'https://sponsors.vuejs.org' const dataUrl = `${dataHost}/vite.json` export const voidZero = { name: 'VoidZero', url: 'https://voidzero.dev', img: voidZeroSvg, } satisfies Sponsor const viteSponsors: Pick = { special: [ // sponsors patak-dev { name: 'Bolt', url: 'https://bolt.new', img: boltSvg, }, // sponsors antfu { name: 'NuxtLabs', url: 'https://nuxtlabs.com', img: nuxtLabsSvg, }, ], gold: [ // now automated via sponsors.vuejs.org too ], } function toggleDarkLogos() { if (data.value) { const isDark = document.documentElement.classList.contains('dark') data.value.forEach(({ items }) => { items.forEach((s: Sponsor) => { if (s.hasDark) { s.img = isDark ? s.img.replace(/(\.\w+)$/, '-dark$1') : s.img.replace(/-dark(\.\w+)$/, '$1') } }) }) } } export function useSponsor() { onMounted(async () => { const ob = new MutationObserver((list) => { for (const m of list) { if (m.attributeName === 'class') { toggleDarkLogos() } } }) ob.observe(document.documentElement, { attributes: true }) onUnmounted(() => { ob.disconnect() }) if (data.value) { return } const result = await fetch(dataUrl) const json = await result.json() data.value = mapSponsors(json) toggleDarkLogos() }) return { data, } } function mapSponsors(sponsors: Sponsors): SponsorTier[] { return [ { tier: 'in partnership with', size: 'big' as const, items: viteSponsors['special'], }, { tier: 'Platinum Sponsors', size: 'big' as const, items: mapImgPath(sponsors['platinum']), }, { tier: 'Gold Sponsors', size: 'medium' as const, items: [...mapImgPath(sponsors['gold']), ...viteSponsors['gold']], }, ] } const viteSponsorNames = new Set( Object.values(viteSponsors).flatMap((sponsors) => sponsors.map((s) => s.name), ), ) /** * Map Vue/Vite sponsors data to objects and filter out Vite-specific sponsors */ function mapImgPath(sponsors: Sponsor[]) { return sponsors .filter((sponsor) => !viteSponsorNames.has(sponsor.name)) .map((sponsor) => ({ ...sponsor, img: `${dataHost}/images/${sponsor.img}`, })) } ================================================ FILE: docs/.vitepress/theme/index.ts ================================================ import { h } from 'vue' import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client' import '@shikijs/vitepress-twoslash/style.css' import 'virtual:group-icons.css' import 'vitepress-plugin-graphviz/style.css' import Theme from '@voidzero-dev/vitepress-theme/src/vite' import './styles.css' // components import SvgImage from './components/SvgImage.vue' import YouTubeVideo from './components/YouTubeVideo.vue' import NonInheritBadge from './components/NonInheritBadge.vue' import AsideSponsors from './components/AsideSponsors.vue' import ScrimbaLink from './components/ScrimbaLink.vue' export default { Layout() { return h((Theme as any).Layout, null, { 'aside-ads-before': () => h(AsideSponsors), }) }, enhanceApp(ctx: any) { const { app } = ctx app.component('SvgImage', SvgImage) app.component('YouTubeVideo', YouTubeVideo) app.component('NonInheritBadge', NonInheritBadge) app.component('ScrimbaLink', ScrimbaLink) app.use(TwoslashFloatingVue) Theme.enhanceApp(ctx) }, } ================================================ FILE: docs/.vitepress/theme/landing/Community.vue ================================================ ================================================ FILE: docs/.vitepress/theme/landing/FeatureGrid1.vue ================================================ ================================================ FILE: docs/.vitepress/theme/landing/FeatureGrid2.vue ================================================ ================================================ FILE: docs/.vitepress/theme/landing/Frameworks.vue ================================================ ================================================ FILE: docs/.vitepress/theme/landing/Hero.vue ================================================ ================================================ FILE: docs/.vitepress/theme/landing/Layout.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/Events.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/Hero.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/Layout.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/TimeoutSwitcher.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/Timer.vue ================================================ ================================================ FILE: docs/.vitepress/theme/live/VideoIframe.vue ================================================