Skip to content

vite build intermittently hangs after transform completes when bundling CJS packages process never exits #21784

@jetersen

Description

@jetersen

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
  1. Install vite 8.0.0-beta.16
  2. Add @actions/core as a dependency (which transitively brings in undici and other CJS packages)
  3. Run node node_modules/.bin/vite build in a loop 50 times
  4. 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.16

Used 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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions