Skip to content

Commit f6a28d5

Browse files
authored
feat: resolve environments plugins at config time (#20120)
1 parent b6df9aa commit f6a28d5

File tree

6 files changed

+46
-51
lines changed

6 files changed

+46
-51
lines changed

packages/vite/src/node/baseEnvironment.ts

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,6 @@ const environmentColors = [
1010
colors.gray,
1111
]
1212

13-
export function getDefaultResolvedEnvironmentOptions(
14-
config: ResolvedConfig,
15-
): ResolvedEnvironmentOptions {
16-
return {
17-
define: config.define,
18-
resolve: config.resolve,
19-
consumer: 'server',
20-
optimizeDeps: config.optimizeDeps,
21-
dev: config.dev,
22-
build: config.build,
23-
}
24-
}
25-
2613
export class PartialEnvironment {
2714
name: string
2815
getTopLevelConfig(): ResolvedConfig {
@@ -115,18 +102,10 @@ export class PartialEnvironment {
115102
}
116103

117104
export class BaseEnvironment extends PartialEnvironment {
118-
get plugins(): Plugin[] {
119-
if (!this._plugins)
120-
throw new Error(
121-
`${this.name} environment.plugins called before initialized`,
122-
)
123-
return this._plugins
105+
get plugins(): readonly Plugin[] {
106+
return this.config.plugins
124107
}
125108

126-
/**
127-
* @internal
128-
*/
129-
_plugins: Plugin[] | undefined
130109
/**
131110
* @internal
132111
*/

packages/vite/src/node/build.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ import {
5656
normalizePath,
5757
partialEncodeURIPath,
5858
} from './utils'
59-
import { perEnvironmentPlugin, resolveEnvironmentPlugins } from './plugin'
59+
import { perEnvironmentPlugin } from './plugin'
6060
import { manifestPlugin } from './plugins/manifest'
6161
import type { Logger } from './logger'
6262
import { dataURIPlugin } from './plugins/dataUri'
@@ -73,10 +73,7 @@ import {
7373
import { completeSystemWrapPlugin } from './plugins/completeSystemWrap'
7474
import { webWorkerPostPlugin } from './plugins/worker'
7575
import { getHookHandler } from './plugins'
76-
import {
77-
BaseEnvironment,
78-
getDefaultResolvedEnvironmentOptions,
79-
} from './baseEnvironment'
76+
import { BaseEnvironment } from './baseEnvironment'
8077
import type { MinimalPluginContextWithoutEnvironment, Plugin } from './plugin'
8178
import type { RollupPluginHooks } from './typeUtils'
8279
import {
@@ -1483,8 +1480,10 @@ export class BuildEnvironment extends BaseEnvironment {
14831480
options?: EnvironmentOptions
14841481
},
14851482
) {
1486-
let options =
1487-
config.environments[name] ?? getDefaultResolvedEnvironmentOptions(config)
1483+
let options = config.environments[name]
1484+
if (!options) {
1485+
throw new Error(`Environment "${name}" is not defined in the config.`)
1486+
}
14881487
if (setup?.options) {
14891488
options = mergeConfig(
14901489
options,
@@ -1499,7 +1498,6 @@ export class BuildEnvironment extends BaseEnvironment {
14991498
return
15001499
}
15011500
this._initiated = true
1502-
this._plugins = await resolveEnvironmentPlugins(this)
15031501
}
15041502
}
15051503

packages/vite/src/node/config.ts

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
ENV_ENTRY,
2626
FS_PREFIX,
2727
} from './constants'
28+
import { resolveEnvironmentPlugins } from './plugin'
2829
import type {
2930
FalsyPlugin,
3031
HookHandler,
@@ -294,6 +295,7 @@ export type ResolvedEnvironmentOptions = {
294295
optimizeDeps: DepOptimizationOptions
295296
dev: ResolvedDevEnvironmentOptions
296297
build: ResolvedBuildEnvironmentOptions
298+
plugins: readonly Plugin[]
297299
}
298300

299301
export type DefaultEnvironmentOptions = Omit<
@@ -835,6 +837,7 @@ function resolveEnvironmentOptions(
835837
logger,
836838
consumer,
837839
),
840+
plugins: undefined!, // to be resolved later
838841
}
839842
}
840843

@@ -1421,24 +1424,38 @@ export async function resolveConfig(
14211424
mainConfig: resolved,
14221425
bundleChain,
14231426
}
1424-
const resolvedWorkerPlugins = (await resolvePlugins(
1427+
1428+
// Plugins resolution needs the resolved config (minus plugins) so we need to mutate here
1429+
;(workerResolved.plugins as Plugin[]) = await resolvePlugins(
14251430
workerResolved,
14261431
workerPrePlugins,
14271432
workerNormalPlugins,
14281433
workerPostPlugins,
1429-
)) as Plugin[]
1434+
)
1435+
1436+
// During Build the client environment is used to bundle the worker
1437+
// Avoid overriding the mainConfig (resolved.environments.client)
1438+
;(workerResolved.environments as Record<
1439+
string,
1440+
ResolvedEnvironmentOptions
1441+
>) = {
1442+
...workerResolved.environments,
1443+
client: {
1444+
...workerResolved.environments.client,
1445+
plugins: await resolveEnvironmentPlugins(
1446+
new PartialEnvironment('client', workerResolved),
1447+
),
1448+
},
1449+
}
14301450

14311451
// run configResolved hooks
14321452
await Promise.all(
1433-
createPluginHookUtils(resolvedWorkerPlugins)
1453+
createPluginHookUtils(workerResolved.plugins)
14341454
.getSortedPluginHooks('configResolved')
14351455
.map((hook) => hook.call(resolvedConfigContext, workerResolved)),
14361456
)
14371457

1438-
return {
1439-
...workerResolved,
1440-
plugins: resolvedWorkerPlugins,
1441-
}
1458+
return workerResolved
14421459
}
14431460

14441461
const resolvedWorkerOptions: ResolvedWorkerOptions = {
@@ -1588,6 +1605,12 @@ export async function resolveConfig(
15881605
// TODO: Deprecate config.getSortedPlugins and config.getSortedPluginHooks
15891606
Object.assign(resolved, createPluginHookUtils(resolved.plugins))
15901607

1608+
for (const name of Object.keys(resolved.environments)) {
1609+
resolved.environments[name].plugins = await resolveEnvironmentPlugins(
1610+
new PartialEnvironment(name, resolved),
1611+
)
1612+
}
1613+
15911614
// call configResolved hooks
15921615
await Promise.all(
15931616
resolved

packages/vite/src/node/optimizer/scan.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import {
3434
virtualModulePrefix,
3535
virtualModuleRE,
3636
} from '../utils'
37-
import { resolveEnvironmentPlugins } from '../plugin'
3837
import type { EnvironmentPluginContainer } from '../server/pluginContainer'
3938
import { createEnvironmentPluginContainer } from '../server/pluginContainer'
4039
import { BaseEnvironment } from '../baseEnvironment'
@@ -63,7 +62,6 @@ export class ScanEnvironment extends BaseEnvironment {
6362
return
6463
}
6564
this._initiated = true
66-
this._plugins = await resolveEnvironmentPlugins(this)
6765
this._pluginContainer = await createEnvironmentPluginContainer(
6866
this,
6967
this.plugins,

packages/vite/src/node/server/environment.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import type { FetchFunctionOptions, FetchResult } from 'vite/module-runner'
22
import type { FSWatcher } from 'dep-types/chokidar'
33
import colors from 'picocolors'
4-
import {
5-
BaseEnvironment,
6-
getDefaultResolvedEnvironmentOptions,
7-
} from '../baseEnvironment'
4+
import { BaseEnvironment } from '../baseEnvironment'
85
import type {
96
EnvironmentOptions,
107
ResolvedConfig,
@@ -18,7 +15,6 @@ import {
1815
createDepsOptimizer,
1916
createExplicitDepsOptimizer,
2017
} from '../optimizer/optimizer'
21-
import { resolveEnvironmentPlugins } from '../plugin'
2218
import { ERR_OUTDATED_OPTIMIZED_DEP } from '../../shared/constants'
2319
import { promiseWithResolvers } from '../../shared/utils'
2420
import type { ViteDevServer } from '../server'
@@ -102,8 +98,10 @@ export class DevEnvironment extends BaseEnvironment {
10298
config: ResolvedConfig,
10399
context: DevEnvironmentContext,
104100
) {
105-
let options =
106-
config.environments[name] ?? getDefaultResolvedEnvironmentOptions(config)
101+
let options = config.environments[name]
102+
if (!options) {
103+
throw new Error(`Environment "${name}" is not defined in the config.`)
104+
}
107105
if (context.options) {
108106
options = mergeConfig(
109107
options,
@@ -172,10 +170,9 @@ export class DevEnvironment extends BaseEnvironment {
172170
return
173171
}
174172
this._initiated = true
175-
this._plugins = await resolveEnvironmentPlugins(this)
176173
this._pluginContainer = await createEnvironmentPluginContainer(
177174
this,
178-
this._plugins,
175+
this.config.plugins,
179176
options?.watcher,
180177
)
181178
}

packages/vite/src/node/server/pluginContainer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export async function createEnvironmentPluginContainer<
141141
Env extends Environment = Environment,
142142
>(
143143
environment: Env,
144-
plugins: Plugin[],
144+
plugins: readonly Plugin[],
145145
watcher?: FSWatcher,
146146
autoStart = true,
147147
): Promise<EnvironmentPluginContainer<Env>> {
@@ -190,7 +190,7 @@ class EnvironmentPluginContainer<Env extends Environment = Environment> {
190190
*/
191191
constructor(
192192
public environment: Env,
193-
public plugins: Plugin[],
193+
public plugins: readonly Plugin[],
194194
public watcher?: FSWatcher,
195195
autoStart = true,
196196
) {

0 commit comments

Comments
 (0)