-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Description
Describe the bug
When running vite build repeatedly, the process intermittently hangs after printing ✓ N modules transformed.. The build output is written correctly to dist/ but the process never exits and must be killed. Repro rate is roughly 10-20% of runs.
The hang is triggered by bundling CJS packages. Externalizing all CJS packages eliminates the hang entirely across 50 consecutive builds. undici alone is the biggest contributor (~100 modules) but other CJS packages (semver, yaml, ignore, @octokit/* etc.) also contribute.
CPU profile analysis shows ~99% of samples are (idle) - the Node.js event loop is completely idle for the full hang duration (~10s). A handful of samples show rolldown#build completing, after which the process just waits. This suggests rolldown's native Rust worker threads are not signalling back to the Node.js event loop on completion when processing CJS modules.
CPU.20260308.215438.228120.0.001.cpuprofile
Reproduction
https://github.com/jetersen/vite-8-build-hang
Steps to reproduce
git clone https://github.com/jetersen/vite-8-build-hang
cd vite-8-build-hang
npm install
bash scripts/stress-build.sh- Install vite 8.0.0-beta.16
- Add
@actions/coreas a dependency (which transitively brings inundiciand other CJS packages) - Run
node node_modules/.bin/vite buildin a loop 50 times - Observe occasional hangs after
✓ N modules transformed.
Initially observed in release-drafter/release-drafter#1526
System Info
System:
OS: Linux 6.19 CachyOS Linux
CPU: (16) x64 AMD Ryzen 7 9800X3D 8-Core Processor
Memory: 43.25 GB / 60.41 GB
Container: Yes
Shell: 4.5.0 - /bin/fish
Binaries:
Node: 24.14.0 - /home/joseph/.local/share/mise/installs/node/24.14.0/bin/node
npm: 11.11.0 - /home/joseph/.local/share/mise/installs/npm/11.11.0/bin/npm
bun: 1.3.10 - /usr/bin/bun
Deno: 2.7.4 - /usr/bin/deno
Browsers:
Firefox: 148.0
Firefox Developer Edition: 148.0
npmPackages:
vite: ^8.0.0-beta.16 => 8.0.0-beta.16Used Package Manager
npm
Logs
Click to expand!
standard error:
vite v8.0.0-beta.16 building client environment for production...
�[2K
transforming...✓ 362 modules transformed.standard out
vite:config config file loaded in 33.58ms +0ms
vite:env loading env files: [
vite:env '/home/joseph/git/code/release-drafter/.env',
vite:env '/home/joseph/git/code/release-drafter/.env.local',
vite:env '/home/joseph/git/code/release-drafter/.env.production',
vite:env '/home/joseph/git/code/release-drafter/.env.production.local'
vite:env ] +0ms
vite:env env files loaded in 0.20ms +0ms
vite:env using resolved env: {} +0ms
vite:config using resolved config: {
vite:config plugins: [
vite:config 'vite:watch-package-data',
vite:config 'builtin:vite-alias',
vite:config 'vite-tsconfig-paths',
vite:config 'native:modulepreload-polyfill',
vite:config 'vite:resolve-builtin:get-environment',
vite:config 'vite:resolve-builtin',
vite:config 'vite:html-inline-proxy',
vite:config 'vite:css',
vite:config 'native:transform',
vite:config 'builtin:vite-json',
vite:config 'vite:wasm-helper',
vite:config 'vite:worker',
vite:config 'vite:asset',
vite:config 'builtin:vite-wasm-fallback',
vite:config 'vite:define',
vite:config 'vite:css-post',
vite:config 'vite:build-html',
vite:config 'vite:worker-import-meta-url',
vite:config 'vite:asset-import-meta-url',
vite:config 'vite:prepare-out-dir',
vite:config 'vite:rollup-options-plugins',
vite:config 'native:dynamic-import-vars',
vite:config 'builtin:vite-import-glob',
vite:config 'vite:build-import-analysis',
vite:config 'native:import-analysis-build',
vite:config 'vite:terser',
vite:config 'vite:license',
vite:config 'vite:manifest',
vite:config 'vite:ssr-manifest',
vite:config 'native:reporter',
vite:config 'builtin:vite-load-fallback'
vite:config ],
vite:config build: {
vite:config target: 'node24',
vite:config polyfillModulePreload: true,
vite:config modulePreload: { polyfill: true },
vite:config outDir: 'dist',
vite:config assetsDir: 'assets',
vite:config assetsInlineLimit: 4096,
vite:config sourcemap: false,
vite:config terserOptions: {},
vite:config rolldownOptions: {
vite:config platform: 'browser',
vite:config external: [Function: external],
vite:config input: {
vite:config 'actions/drafter/run': 'src/actions/drafter/run.ts',
vite:config 'actions/autolabeler/run': 'src/actions/autolabeler/run.ts'
vite:config },
vite:config output: {
vite:config format: 'es',
vite:config entryFileNames: '[name].js',
vite:config chunkFileNames: 'chunks/[name].js',
vite:config paths: [Function: paths]
vite:config }
vite:config },
vite:config commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
vite:config dynamicImportVarsOptions: { exclude: [ /node_modules/ ] },
vite:config write: true,
vite:config emptyOutDir: null,
vite:config copyPublicDir: true,
vite:config license: false,
vite:config manifest: false,
vite:config lib: false,
vite:config ssrManifest: false,
vite:config ssrEmitAssets: false,
vite:config reportCompressedSize: true,
vite:config chunkSizeWarningLimit: 500,
vite:config watch: null,
vite:config cssCodeSplit: true,
vite:config minify: false,
vite:config rollupOptions: {
vite:config platform: 'browser',
vite:config external: [Function: external],
vite:config input: {
vite:config 'actions/drafter/run': 'src/actions/drafter/run.ts',
vite:config 'actions/autolabeler/run': 'src/actions/autolabeler/run.ts'
vite:config },
vite:config output: {
vite:config format: 'es',
vite:config entryFileNames: '[name].js',
vite:config chunkFileNames: 'chunks/[name].js',
vite:config paths: [Function: paths]
vite:config }
vite:config },
vite:config ssr: false,
vite:config emitAssets: true,
vite:config createEnvironment: [Function: createEnvironment],
vite:config cssTarget: 'node24',
vite:config cssMinify: false
vite:config },
vite:config test: {
vite:config include: [ 'src/tests/**/*.test.ts' ],
vite:config testTimeout: 60000,
vite:config setupFiles: [ 'src/tests/setup.ts' ],
vite:config coverage: {
vite:config enabled: true,
vite:config reporter: [ 'json-summary' ],
vite:config include: [ 'src/**/*.ts' ],
vite:config exclude: [
vite:config 'src/tests/**/*.ts',
vite:config 'src/scripts/**/*',
vite:config 'src/**/*.generated.ts'
vite:config ]
vite:config }
vite:config },
vite:config worker: {
vite:config format: 'iife',
vite:config plugins: '() => plugins',
vite:config rollupOptions: {},
vite:config rolldownOptions: {}
vite:config },
vite:config optimizeDeps: {
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config rolldownOptions: { resolve: { symlinks: true }, output: { topLevelVar: true } },
vite:config extensions: [],
vite:config disabled: undefined,
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config ignoreOutdatedRequests: false,
vite:config noDiscovery: false,
vite:config rollupOptions: [Getter/Setter],
vite:config esbuildOptions: { preserveSymlinks: false }
vite:config },
vite:config environments: {
vite:config client: {
vite:config define: undefined,
vite:config resolve: {
vite:config externalConditions: [ 'node', 'module-sync' ],
vite:config extensions: [
vite:config '.mjs', '.js',
vite:config '.mts', '.ts',
vite:config '.jsx', '.tsx',
vite:config '.json'
vite:config ],
vite:config dedupe: [],
vite:config noExternal: [],
vite:config external: [],
vite:config preserveSymlinks: false,
vite:config tsconfigPaths: false,
vite:config alias: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ],
vite:config mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
vite:config conditions: [ 'module', 'browser', 'development|production' ],
vite:config builtins: []
vite:config },
vite:config keepProcessEnv: false,
vite:config consumer: 'client',
vite:config optimizeDeps: {
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config rolldownOptions: { resolve: { symlinks: true }, output: { topLevelVar: true } },
vite:config extensions: [],
vite:config disabled: undefined,
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config ignoreOutdatedRequests: false,
vite:config noDiscovery: false,
vite:config rollupOptions: [Getter/Setter],
vite:config esbuildOptions: { preserveSymlinks: false }
vite:config },
vite:config dev: {
vite:config warmup: [],
vite:config sourcemap: { js: true },
vite:config sourcemapIgnoreList: [Function: isInNodeModules],
vite:config preTransformRequests: true,
vite:config createEnvironment: [Function: defaultCreateClientDevEnvironment],
vite:config recoverable: true,
vite:config moduleRunnerTransform: false
vite:config },
vite:config build: {
vite:config target: 'node24',
vite:config polyfillModulePreload: true,
vite:config modulePreload: { polyfill: true },
vite:config outDir: 'dist',
vite:config assetsDir: 'assets',
vite:config assetsInlineLimit: 4096,
vite:config sourcemap: false,
vite:config terserOptions: {},
vite:config rolldownOptions: {
vite:config platform: 'browser',
vite:config external: [Function: external],
vite:config input: {
vite:config 'actions/drafter/run': 'src/actions/drafter/run.ts',
vite:config 'actions/autolabeler/run': 'src/actions/autolabeler/run.ts'
vite:config },
vite:config output: {
vite:config format: 'es',
vite:config entryFileNames: '[name].js',
vite:config chunkFileNames: 'chunks/[name].js',
vite:config paths: [Function: paths]
vite:config }
vite:config },
vite:config commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
vite:config dynamicImportVarsOptions: { exclude: [ /node_modules/ ] },
vite:config write: true,
vite:config emptyOutDir: null,
vite:config copyPublicDir: true,
vite:config license: false,
vite:config manifest: false,
vite:config lib: false,
vite:config ssrManifest: false,
vite:config ssrEmitAssets: false,
vite:config reportCompressedSize: true,
vite:config chunkSizeWarningLimit: 500,
vite:config watch: null,
vite:config cssCodeSplit: true,
vite:config minify: false,
vite:config rollupOptions: {
vite:config platform: 'browser',
vite:config external: [Function: external],
vite:config input: {
vite:config 'actions/drafter/run': 'src/actions/drafter/run.ts',
vite:config 'actions/autolabeler/run': 'src/actions/autolabeler/run.ts'
vite:config },
vite:config output: {
vite:config format: 'es',
vite:config entryFileNames: '[name].js',
vite:config chunkFileNames: 'chunks/[name].js',
vite:config paths: [Function: paths]
vite:config }
vite:config },
vite:config ssr: false,
vite:config emitAssets: true,
vite:config createEnvironment: [Function: createEnvironment],
vite:config cssTarget: 'node24',
vite:config cssMinify: false
vite:config },
vite:config plugins: [
vite:config {
vite:config name: 'vite:watch-package-data',
vite:config buildStart: [Function: buildStart],
vite:config buildEnd: [Function: buildEnd],
vite:config watchChange: [Function: watchChange]
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-alias',
vite:config _options: {
vite:config entries: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ]
vite:config }
vite:config },
vite:config {
vite:config name: 'vite-tsconfig-paths',
vite:config enforce: 'pre',
vite:config configResolved: [Function: configResolved],
vite:config configureServer: [Function: configureServer],
vite:config buildStart: [Function: buildStart],
vite:config resolveId: [AsyncFunction: resolveId]
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-module-preload-polyfill',
vite:config _options: { isServer: false }
vite:config },
vite:config {
vite:config name: 'vite:resolve-builtin:get-environment',
vite:config buildStart: [Function: buildStart],
vite:config perEnvironmentStartEndDuringDev: true
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-resolve',
vite:config _options: {
vite:config resolveOptions: {
vite:config isBuild: true,
vite:config isProduction: true,
vite:config asSrc: true,
vite:config preferRelative: false,
vite:config isRequire: undefined,
vite:config root: '/home/joseph/git/code/release-drafter',
vite:config scan: false,
vite:config mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext', 'main' ],
vite:config conditions: [ 'module', 'browser', 'development|production' ],
vite:config externalConditions: [ 'node', 'module-sync' ],
vite:config extensions: [
vite:config '.mjs', '.js',
vite:config '.mts', '.ts',
vite:config '.jsx', '.tsx',
vite:config '.json'
vite:config ],
vite:config tryIndex: true,
vite:config tryPrefix: undefined,
vite:config preserveSymlinks: false,
vite:config tsconfigPaths: false
vite:config },
vite:config environmentConsumer: 'client',
vite:config environmentName: 'client',
vite:config builtins: [],
vite:config external: [],
vite:config noExternal: [],
vite:config dedupe: [],
vite:config disableCache: false,
vite:config legacyInconsistentCjsInterop: undefined,
vite:config finalizeBareSpecifier: undefined,
vite:config finalizeOtherSpecifiers: undefined,
vite:config resolveSubpathImports: [Function: resolveSubpathImports],
vite:config yarnPnp: false
vite:config },
vite:config load: [AsyncFunction (anonymous)],
vite:config resolveId: [AsyncFunction (anonymous)],
vite:config transform: [AsyncFunction (anonymous)],
vite:config watchChange: [AsyncFunction (anonymous)],
vite:config perEnvironmentWatchChangeDuringDev: true
vite:config },
vite:config {
vite:config name: 'vite:html-inline-proxy',
vite:config resolveId: {
vite:config filter: { id: /[?&]html-proxy\b/ },
vite:config handler: [Function: handler]
vite:config },
vite:config load: {
vite:config filter: { id: /[?&]html-proxy\b/ },
vite:config handler: [Function: handler]
vite:config }
vite:config },
vite:config {
vite:config name: 'vite:css',
vite:config buildStart: [Function: buildStart],
vite:config buildEnd: [Function: buildEnd],
vite:config load: {
vite:config filter: {
vite:config id: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config transform: {
vite:config filter: {
vite:config id: {
vite:config include: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/,
vite:config exclude: [
vite:config /[?&]commonjs-proxy/,
vite:config /[?&](?:worker|sharedworker|raw|url)\b/
vite:config ]
vite:config }
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config }
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-transform',
vite:config _options: {
vite:config root: '/home/joseph/git/code/release-drafter',
vite:config include: [ /\.(m?ts|[jt]sx)$/ ],
vite:config exclude: [ /\.js$/ ],
vite:config jsxRefreshInclude: undefined,
vite:config jsxRefreshExclude: undefined,
vite:config isServerConsumer: false,
vite:config jsxInject: undefined,
vite:config transformOptions: { jsx: { development: false }, sourcemap: true },
vite:config yarnPnp: false
vite:config }
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-json',
vite:config _options: { namedExports: true, stringify: 'auto', minify: true },
vite:config load: [AsyncFunction (anonymous)],
vite:config resolveId: [AsyncFunction (anonymous)],
vite:config transform: [AsyncFunction (anonymous)],
vite:config watchChange: [AsyncFunction (anonymous)]
vite:config },
vite:config {
vite:config name: 'vite:wasm-helper',
vite:config resolveId: {
vite:config filter: { id: /^vite\/wasm\-helper\.js$/ },
vite:config handler: [Function: handler]
vite:config },
vite:config load: {
vite:config filter: {
vite:config id: [
vite:config /^vite\/wasm\-helper\.js$/,
vite:config /(?<![?#].*)\.wasm\?init/
vite:config ]
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config renderChunk: undefined
vite:config },
vite:config {
vite:config name: 'vite:worker',
vite:config buildStart: [Function: buildStart],
vite:config load: {
vite:config filter: { id: /(?:\?|&)(worker|sharedworker)(?:&|$)/ },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config transform: {
vite:config filter: { id: /(?:\?|&)worker_file&type=(\w+)(?:&|$)/ },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config renderChunk: [Function: renderChunk],
vite:config generateBundle: [Function: generateBundle],
vite:config watchChange: [Function: watchChange]
vite:config },
vite:config {
vite:config name: 'vite:asset',
vite:config perEnvironmentStartEndDuringDev: true,
vite:config buildStart: [Function: buildStart],
vite:config resolveId: {
vite:config filter: {
vite:config id: [
vite:config /(\?|&)url(?:&|$)/,
vite:config /\.(apng|bmp|png|jpe?g|jfif|pjpeg|pjp|gif|svg|ico|webp|avif|cur|jxl|mp4|webm|ogg|mp3|wav|flac|aac|opus|mov|m4a|vtt|woff2?|eot|ttf|otf|webmanifest|pdf|txt)(\?.*)?$/i
vite:config ]
vite:config },
vite:config handler: [Function: handler]
vite:config },
vite:config load: {
vite:config filter: {
vite:config id: {
vite:config include: [
vite:config /(\?|&)raw(?:&|$)/,
vite:config /(\?|&)url(?:&|$)/,
vite:config /\.(apng|bmp|png|jpe?g|jfif|pjpeg|pjp|gif|svg|ico|webp|avif|cur|jxl|mp4|webm|ogg|mp3|wav|flac|aac|opus|mov|m4a|vtt|woff2?|eot|ttf|otf|webmanifest|pdf|txt)(\?.*)?$/i
vite:config ],
vite:config exclude: /^\0/
vite:config }
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config renderChunk: [Function: renderChunk],
vite:config generateBundle: [Function: generateBundle],
vite:config watchChange: [Function: watchChange]
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-wasm-fallback',
vite:config _options: undefined,
vite:config load: [AsyncFunction (anonymous)],
vite:config resolveId: [AsyncFunction (anonymous)],
vite:config transform: [AsyncFunction (anonymous)],
vite:config watchChange: [AsyncFunction (anonymous)]
vite:config },
vite:config { name: 'vite:define', options: [Function: options] },
vite:config {
vite:config name: 'vite:css-post',
vite:config renderStart: [Function: renderStart],
vite:config transform: {
vite:config filter: {
vite:config id: {
vite:config include: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/,
vite:config exclude: [
vite:config /[?&]commonjs-proxy/,
vite:config /[?&](?:worker|sharedworker|raw|url)\b/
vite:config ]
vite:config }
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config renderChunk: [AsyncFunction: renderChunk],
vite:config augmentChunkHash: [Function: augmentChunkHash],
vite:config generateBundle: [AsyncFunction: generateBundle]
vite:config },
vite:config {
vite:config name: 'vite:build-html',
vite:config transform: {
vite:config filter: { id: /\.html$/ },
vite:config handler: [AsyncFunction: handler]
vite:config },
vite:config generateBundle: [AsyncFunction: generateBundle]
vite:config },
vite:config {
vite:config name: 'vite:worker-import-meta-url',
vite:config applyToEnvironment: [Function: applyToEnvironment],
vite:config transform: {
vite:config filter: {
vite:config code: /new\s+(?:Worker|SharedWorker)\s*\(\s*new\s+URL.+?import\.meta\.url/s
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config }
vite:config },
vite:config {
vite:config name: 'vite:asset-import-meta-url',
vite:config applyToEnvironment: [Function: applyToEnvironment],
vite:config transform: {
vite:config filter: {
vite:config id: {
vite:config exclude: [
vite:config /^vite\/preload\-helper\.js$/,
vite:config /^\/home\/joseph\/git\/code\/release\-drafter\/node_modules\/vite\/dist\/client\/client\.mjs$/
vite:config ]
vite:config },
vite:config code: /new\s+URL.+import\.meta\.url/s
vite:config },
vite:config handler: [AsyncFunction: handler]
vite:config }
vite:config },
vite:config {
vite:config name: 'vite:prepare-out-dir',
vite:config options: [Function: options],
vite:config renderStart: { order: 'pre', handler: [Function: handler] }
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-dynamic-import-vars',
vite:config _options: {
vite:config include: undefined,
vite:config exclude: [ /node_modules/ ],
vite:config resolver: [Function: resolver],
vite:config sourcemap: false
vite:config }
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-import-glob',
vite:config _options: {
vite:config root: '/home/joseph/git/code/release-drafter',
vite:config sourcemap: false,
vite:config restoreQueryExtension: false
vite:config }
vite:config },
vite:config {
vite:config name: 'vite:build-import-analysis',
vite:config renderChunk: [Function: renderChunk],
vite:config generateBundle: [AsyncFunction: generateBundle]
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-build-import-analysis',
vite:config _options: {
vite:config preloadCode: `const scriptRel = 'modulepreload';const assetsURL = function(dep) { return "/"+dep };const seen = {};export const __vitePreload = function preload(baseModule, deps, importerUrl) {\n` +
vite:config '\tlet promise = Promise.resolve();\n' +
vite:config '\tif (__VITE_IS_MODERN__ && deps && deps.length > 0) {\n' +
vite:config '\t\tconst links = document.getElementsByTagName("link");\n' +
vite:config '\t\tconst cspNonceMeta = document.querySelector("meta[property=csp-nonce]");\n' +
vite:config '\t\tconst cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce");\n' +
vite:config '\t\tfunction allSettled(promises) {\n' +
vite:config '\t\t\treturn Promise.all(promises.map((p) => Promise.resolve(p).then((value) => ({\n' +
vite:config '\t\t\t\tstatus: "fulfilled",\n' +
vite:config '\t\t\t\tvalue\n' +
vite:config '\t\t\t}), (reason) => ({\n' +
vite:config '\t\t\t\tstatus: "rejected",\n' +
vite:config '\t\t\t\treason\n' +
vite:config '\t\t\t}))));\n' +
vite:config '\t\t}\n' +
vite:config '\t\tpromise = allSettled(deps.map((dep) => {\n' +
vite:config '\t\t\tdep = assetsURL(dep, importerUrl);\n' +
vite:config '\t\t\tif (dep in seen) return;\n' +
vite:config '\t\t\tseen[dep] = true;\n' +
vite:config '\t\t\tconst isCss = dep.endsWith(".css");\n' +
vite:config '\t\t\tconst cssSelector = isCss ? "[rel=\\"stylesheet\\"]" : "";\n' +
vite:config '\t\t\tif (!!importerUrl) for (let i = links.length - 1; i >= 0; i--) {\n' +
vite:config '\t\t\t\tconst link = links[i];\n' +
vite:config '\t\t\t\tif (link.href === dep && (!isCss || link.rel === "stylesheet")) return;\n' +
vite:config '\t\t\t}\n' +
vite:config '\t\t\telse if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) return;\n' +
vite:config '\t\t\tconst link = document.createElement("link");\n' +
vite:config '\t\t\tlink.rel = isCss ? "stylesheet" : scriptRel;\n' +
vite:config '\t\t\tif (!isCss) link.as = "script";\n' +
vite:config '\t\t\tlink.crossOrigin = "";\n' +
vite:config '\t\t\tlink.href = dep;\n' +
vite:config '\t\t\tif (cspNonce) link.setAttribute("nonce", cspNonce);\n' +
vite:config '\t\t\tdocument.head.appendChild(link);\n' +
vite:config '\t\t\tif (isCss) return new Promise((res, rej) => {\n' +
vite:config '\t\t\t\tlink.addEventListener("load", res);\n' +
vite:config '\t\t\t\tlink.addEventListener("error", () => rej(/* @__PURE__ */ new Error(`Unable to preload CSS for ${dep}`)));\n' +
vite:config '\t\t\t});\n' +
vite:config '\t\t}));\n' +
vite:config '\t}\n' +
vite:config '\tfunction handlePreloadError(err) {\n' +
vite:config '\t\tconst e = new Event("vite:preloadError", { cancelable: true });\n' +
vite:config '\t\te.payload = err;\n' +
vite:config '\t\twindow.dispatchEvent(e);\n' +
vite:config '\t\tif (!e.defaultPrevented) throw err;\n' +
vite:config '\t}\n' +
vite:config '\treturn promise.then((res) => {\n' +
vite:config '\t\tfor (const item of res || []) {\n' +
vite:config '\t\t\tif (item.status !== "rejected") continue;\n' +
vite:config '\t\t\thandlePreloadError(item.reason);\n' +
vite:config '\t\t}\n' +
vite:config '\t\treturn baseModule().catch(handlePreloadError);\n' +
vite:config '\t});\n' +
vite:config '}',
vite:config insertPreload: true,
vite:config optimizeModulePreloadRelativePaths: false,
vite:config renderBuiltUrl: false,
vite:config isRelativeBase: false
vite:config }
vite:config },
vite:config {
vite:config name: 'vite:license',
vite:config generateBundle: [AsyncFunction: generateBundle]
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-reporter',
vite:config _options: {
vite:config root: '/home/joseph/git/code/release-drafter',
vite:config isTty: false,
vite:config isLib: false,
vite:config assetsDir: 'assets/',
vite:config chunkLimit: 500,
vite:config logInfo: [Function (anonymous)],
vite:config reportCompressedSize: true,
vite:config warnLargeChunks: false
vite:config }
vite:config },
vite:config BuiltinPlugin {
vite:config enforce: undefined,
vite:config name: 'builtin:vite-load-fallback',
vite:config _options: undefined
vite:config }
vite:config ],
vite:config optimizeDepsPluginNames: []
vite:config }
vite:config },
vite:config resolve: {
vite:config externalConditions: [ 'node', 'module-sync' ],
vite:config extensions: [
vite:config '.mjs', '.js',
vite:config '.mts', '.ts',
vite:config '.jsx', '.tsx',
vite:config '.json'
vite:config ],
vite:config dedupe: [],
vite:config noExternal: [],
vite:config external: [],
vite:config preserveSymlinks: false,
vite:config tsconfigPaths: false,
vite:config alias: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/home/joseph/git/code/release-drafter/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ],
vite:config mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
vite:config conditions: [ 'module', 'browser', 'development|production' ],
vite:config builtins: []
vite:config },
vite:config configFile: '/home/joseph/git/code/release-drafter/vite.config.ts',
vite:config configFileDependencies: [ '/home/joseph/git/code/release-drafter/vite.config.ts' ],
vite:config inlineConfig: {
vite:config root: undefined,
vite:config base: undefined,
vite:config mode: undefined,
vite:config configFile: undefined,
vite:config configLoader: undefined,
vite:config logLevel: undefined,
vite:config clearScreen: undefined,
vite:config build: { rolldownOptions: undefined, rollupOptions: [Getter/Setter] },
vite:config worker: { rolldownOptions: undefined, rollupOptions: [Getter/Setter] },
vite:config optimizeDeps: { rolldownOptions: undefined, rollupOptions: [Getter/Setter] }
vite:config },
vite:config root: '/home/joseph/git/code/release-drafter',
vite:config base: '/',
vite:config decodedBase: '/',
vite:config rawBase: '/',
vite:config publicDir: '/home/joseph/git/code/release-drafter/public',
vite:config cacheDir: '/home/joseph/git/code/release-drafter/node_modules/.vite',
vite:config command: 'build',
vite:config mode: 'production',
vite:config isBundled: true,
vite:config isWorker: false,
vite:config mainConfig: null,
vite:config bundleChain: [],
vite:config isProduction: true,
vite:config css: {
vite:config transformer: 'postcss',
vite:config preprocessorMaxWorkers: true,
vite:config devSourcemap: false
vite:config },
vite:config json: { namedExports: true, stringify: 'auto' },
vite:config esbuild: { jsxDev: false, charset: 'utf8', legalComments: 'none' },
vite:config oxc: { jsx: { development: false } },
vite:config server: {
vite:config port: 5173,
vite:config strictPort: false,
vite:config host: undefined,
vite:config allowedHosts: [],
vite:config https: undefined,
vite:config open: false,
vite:config proxy: undefined,
vite:config cors: {
vite:config origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
vite:config },
vite:config headers: {},
vite:config warmup: { clientFiles: [], ssrFiles: [] },
vite:config middlewareMode: false,
vite:config fs: {
vite:config strict: true,
vite:config deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ],
vite:config allow: [ '/home/joseph/git/code/release-drafter' ]
vite:config },
vite:config preTransformRequests: true,
vite:config perEnvironmentStartEndDuringDev: false,
vite:config perEnvironmentWatchChangeDuringDev: false,
vite:config sourcemapIgnoreList: [Function: isInNodeModules]
vite:config },
vite:config builder: undefined,
vite:config preview: {
vite:config port: 4173,
vite:config strictPort: false,
vite:config host: undefined,
vite:config allowedHosts: [],
vite:config https: undefined,
vite:config open: false,
vite:config proxy: undefined,
vite:config cors: {
vite:config origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
vite:config },
vite:config headers: {}
vite:config },
vite:config envDir: '/home/joseph/git/code/release-drafter',
vite:config env: { BASE_URL: '/', MODE: 'production', DEV: false, PROD: true },
vite:config assetsInclude: [Function: assetsInclude],
vite:config rawAssetsInclude: [],
vite:config logger: {
vite:config hasWarned: false,
vite:config info: [Function: info],
vite:config warn: [Function: warn],
vite:config warnOnce: [Function: warnOnce],
vite:config error: [Function: error],
vite:config clearScreen: [Function: clearScreen],
vite:config hasErrorLogged: [Function: hasErrorLogged]
vite:config },
vite:config packageCache: Map(1) {
vite:config 'fnpd_/home/joseph/git/code/release-drafter' => {
vite:config dir: '/home/joseph/git/code/release-drafter',
vite:config data: {
vite:config name: 'release-drafter',
vite:config description: 'Drafts your next release notes as pull requests are merged into your branch(es).',
vite:config version: '0.0.0',
vite:config author: '',
vite:config type: 'module',
vite:config private: true,
vite:config homepage: 'https://github.com/release-drafter/release-drafter',
vite:config repository: {
vite:config type: 'git',
vite:config url: 'git+https://github.com/release-drafter/release-drafter.git'
vite:config },
vite:config bugs: {
vite:config url: 'https://github.com/release-drafter/release-drafter/issues'
vite:config },
vite:config keywords: [ 'actions', 'release', 'release-notes', 'release-automation' ],
vite:config engines: { node: '>=24.0.0' },
vite:config scripts: {
vite:config build: 'vite build',
vite:config test: 'vitest',
vite:config 'test:run': 'vitest run',
vite:config coverage: 'npx make-coverage-badge --output-path ./badges/coverage.svg',
vite:config 'tsc:check': 'tsc --noEmit',
vite:config 'format:write': 'npx prettier --write .',
vite:config 'format:check': 'npx prettier --check .',
vite:config lint: 'npx eslint .',
vite:config codegen: 'graphql-codegen -c src/scripts/graphql.codegen-config.ts -v',
vite:config schemas: 'npx tsx src/scripts/json-schema.ts && npx prettier --write **/schema.json schema.json',
vite:config all: 'npm run format:write && npm run lint && npm run test && npm run coverage && npm run build'
vite:config },
vite:config license: 'MIT',
vite:config dependencies: {
vite:config '@actions/core': '^3.0.0',
vite:config '@actions/github': '^9.0.0',
vite:config 'compare-versions': '^4.1.3',
vite:config 'escape-string-regexp': '^5.0.0',
vite:config ignore: '^7.0.5',
vite:config 'regex-parser': '^2.3.1',
vite:config semver: '^7.7.3',
vite:config yaml: '^2.8.2',
vite:config zod: '^4.3.5'
vite:config },
vite:config devDependencies: {
vite:config '@eslint/compat': '^1.4.0',
vite:config '@graphql-codegen/cli': '^6.1.1',
vite:config '@graphql-codegen/near-operation-file-preset': '^4.0.0',
vite:config '@octokit/webhooks-types': '^7.6.1',
vite:config '@types/node': '^24.10.1',
vite:config '@types/semver': '^7.7.1',
vite:config '@typescript-eslint/eslint-plugin': '^8.48.1',
vite:config '@typescript-eslint/parser': '^8.32.1',
vite:config '@vitest/coverage-v8': '^4.0.18',
vite:config '@vitest/eslint-plugin': '^1.6.6',
vite:config eslint: '^9.39.1',
vite:config 'eslint-config-prettier': '^10.1.8',
vite:config 'eslint-import-resolver-typescript': '^4.4.4',
vite:config 'eslint-plugin-import': '^2.32.0',
vite:config 'eslint-plugin-prettier': '^5.5.4',
vite:config 'make-coverage-badge': '^1.2.0',
vite:config nock: '^14.0.10',
vite:config prettier: '^3.7.4',
vite:config 'prettier-eslint': '^16.4.2',
vite:config tsx: '^4.21.0',
vite:config typescript: '^5.9.3',
vite:config vite: '^8.0.0-beta.16',
vite:config 'vite-tsconfig-paths': '^6.0.4',
vite:config vitest: '^4.0.18'
vite:config }
vite:config },
vite:config hasSideEffects: [Function: hasSideEffects],
vite:config setResolvedCache: [Function: setResolvedCache],
vite:config getResolvedCache: [Function: getResolvedCache]
vite:config },
vite:config set: [Function (anonymous)]
vite:config },
vite:config appType: 'spa',
vite:config experimental: {
vite:config importGlobRestoreExtension: false,
vite:config renderBuiltUrl: undefined,
vite:config hmrPartialAccept: false,
vite:config enableNativePlugin: 'v2',
vite:config bundledDev: false
vite:config },
vite:config future: undefined,
vite:config ssr: {
vite:config target: 'node',
vite:config optimizeDeps: { esbuildOptions: { preserveSymlinks: false } },
vite:config resolve: { conditions: undefined, externalConditions: undefined }
vite:config },
vite:config dev: {
vite:config warmup: [],
vite:config sourcemap: { js: true },
vite:config sourcemapIgnoreList: [Function: isInNodeModules],
vite:config preTransformRequests: false,
vite:config createEnvironment: [Function: defaultCreateDevEnvironment],
vite:config recoverable: false,
vite:config moduleRunnerTransform: false
vite:config },
vite:config devtools: { config: { host: 'localhost' }, enabled: false },
vite:config webSocketToken: 'viM2RevuKKdA',
vite:config getSortedPlugins: [Function: getSortedPlugins],
vite:config getSortedPluginHooks: [Function: getSortedPluginHooks],
vite:config createResolver: [Function: createResolver],
vite:config fsDenyGlob: [Function: arrayMatcher],
vite:config safeModulePaths: Set(0) {},
vite:config nativePluginEnabledLevel: 2,
vite:config Symbol(vite:resolved-config): true
vite:config } +9ms
Validations
- Follow our Code of Conduct
- Read the Contributing Guidelines.
- Read the docs.
- Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- 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 instead.
- Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- The provided reproduction is a minimal reproducible example of the bug.