@@ -15,6 +15,7 @@ import {
1515 type RolldownOptions ,
1616 rolldown ,
1717} from 'rolldown'
18+ import type { StartOptions } from '@vitejs/devtools/cli-commands'
1819import type { Alias , AliasOptions } from '#dep-types/alias'
1920import type { AnymatchFn } from '../types/anymatch'
2021import { withTrailingSlash } from '../shared/utils'
@@ -90,6 +91,7 @@ import {
9091 nodeLikeBuiltins ,
9192 normalizeAlias ,
9293 normalizePath ,
94+ resolveHostname ,
9395 setupRollupOptionCompat ,
9496} from './utils'
9597import {
@@ -507,6 +509,13 @@ export interface UserConfig extends DefaultEnvironmentOptions {
507509 * @default 'spa'
508510 */
509511 appType ?: AppType
512+ /**
513+ * Enable devtools integration. Ensure that `@vitejs/devtools` is installed as a dependency.
514+ * This feature is currently supported only in build mode.
515+ * @experimental
516+ * @default false
517+ */
518+ devtools ?: boolean | DevToolsConfig
510519}
511520
512521export interface HTMLOptions {
@@ -611,6 +620,15 @@ export interface ResolvedWorkerOptions {
611620 rolldownOptions : RolldownOptions
612621}
613622
623+ export interface DevToolsConfig extends Partial < StartOptions > {
624+ enabled : boolean
625+ }
626+
627+ export interface ResolvedDevToolsConfig {
628+ config : Omit < DevToolsConfig , 'enabled' > & { host : string }
629+ enabled : boolean
630+ }
631+
614632export interface InlineConfig extends UserConfig {
615633 configFile ?: string | false
616634 /** @experimental */
@@ -636,6 +654,7 @@ export interface ResolvedConfig extends Readonly<
636654 | 'future'
637655 | 'server'
638656 | 'preview'
657+ | 'devtools'
639658 > & {
640659 configFile : string | undefined
641660 configFileDependencies : string [ ]
@@ -675,6 +694,7 @@ export interface ResolvedConfig extends Readonly<
675694 /** @experimental */
676695 builder : ResolvedBuilderOptions | undefined
677696 build : ResolvedBuildOptions
697+ devtools : ResolvedDevToolsConfig
678698 preview : ResolvedPreviewOptions
679699 ssr : ResolvedSSROptions
680700 assetsInclude : ( file : string ) => boolean
@@ -725,6 +745,24 @@ export interface ResolvedConfig extends Readonly<
725745 } & PluginHookUtils
726746> { }
727747
748+ export async function resolveDevToolsConfig (
749+ config : DevToolsConfig | boolean | undefined ,
750+ host : string | boolean | undefined ,
751+ ) : Promise < ResolvedDevToolsConfig > {
752+ const resolvedHostname = await resolveHostname ( host )
753+ const fallbackHostname = resolvedHostname . host ?? 'localhost'
754+
755+ return {
756+ enabled : config === true || ! ! ( config && config . enabled ) ,
757+ config : {
758+ ...( isObject ( config ) ? config : { } ) ,
759+ host : isObject ( config )
760+ ? ( config ?. host ?? fallbackHostname )
761+ : fallbackHostname ,
762+ } ,
763+ }
764+ }
765+
728766// inferred ones are omitted
729767const configDefaults = Object . freeze ( {
730768 define : { } ,
@@ -1813,6 +1851,11 @@ export async function resolveConfig(
18131851 experimental . renderBuiltUrl = undefined
18141852 }
18151853
1854+ const resolvedDevToolsConfig = await resolveDevToolsConfig (
1855+ config . devtools ,
1856+ server . host ,
1857+ )
1858+
18161859 resolved = {
18171860 configFile : configFile ? normalizePath ( configFile ) : undefined ,
18181861 configFileDependencies : configFileDependencies . map ( ( name ) =>
@@ -1900,6 +1943,7 @@ export async function resolveConfig(
19001943 resolve : resolvedDefaultResolve ,
19011944 dev : resolvedDevEnvironmentOptions ,
19021945 build : resolvedBuildOptions ,
1946+ devtools : resolvedDevToolsConfig ,
19031947
19041948 environments : resolvedEnvironments ,
19051949
@@ -2004,6 +2048,11 @@ export async function resolveConfig(
20042048 resolved . build . ssrEmitAssets || resolved . build . emitAssets
20052049 }
20062050
2051+ // Enable `rolldownOptions.devtools` if devtools is enabled
2052+ if ( resolved . devtools . enabled ) {
2053+ resolved . build . rolldownOptions . devtools ??= { }
2054+ }
2055+
20072056 applyDepOptimizationOptionCompat ( resolved )
20082057 await setOptimizeDepsPluginNames ( resolved )
20092058
0 commit comments