diff --git a/packages/vite/src/node/__tests__/external.spec.ts b/packages/vite/src/node/__tests__/external.spec.ts index 59d7ef6d159a4a..a4c78519fd91ef 100644 --- a/packages/vite/src/node/__tests__/external.spec.ts +++ b/packages/vite/src/node/__tests__/external.spec.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url' import { describe, expect, test } from 'vitest' import { resolveConfig } from '../config' import { createIsConfiguredAsExternal } from '../external' -import { Environment } from '../environment' +import { PartialEnvironment } from '../baseEnvironment' describe('createIsConfiguredAsExternal', () => { test('default', async () => { @@ -25,6 +25,6 @@ async function createIsExternal(external?: true) { }, 'serve', ) - const environment = new Environment('ssr', resolvedConfig) + const environment = new PartialEnvironment('ssr', resolvedConfig) return createIsConfiguredAsExternal(environment) } diff --git a/packages/vite/src/node/__tests__/plugins/css.spec.ts b/packages/vite/src/node/__tests__/plugins/css.spec.ts index 8a6c6bd5d42737..efa3156a5ddb18 100644 --- a/packages/vite/src/node/__tests__/plugins/css.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/css.spec.ts @@ -2,8 +2,6 @@ import fs from 'node:fs' import path from 'node:path' import { describe, expect, test, vi } from 'vitest' import { resolveConfig } from '../../config' -import { Environment } from '../../environment' -import type { PluginEnvironment } from '../../plugin' import type { InlineConfig } from '../../config' import { convertTargets, @@ -12,6 +10,7 @@ import { getEmptyChunkReplacer, hoistAtRules, } from '../../plugins/css' +import { PartialEnvironment } from '../../baseEnvironment' describe('search css url function', () => { test('some spaces before it', () => { @@ -215,7 +214,7 @@ async function createCssPluginTransform( inlineConfig: InlineConfig = {}, ) { const config = await resolveConfig(inlineConfig, 'serve') - const environment = new Environment('client', config) as PluginEnvironment + const environment = new PartialEnvironment('client', config) const { transform, buildStart } = cssPlugin(config) diff --git a/packages/vite/src/node/__tests__/plugins/define.spec.ts b/packages/vite/src/node/__tests__/plugins/define.spec.ts index 3748746af23430..cd01281229d624 100644 --- a/packages/vite/src/node/__tests__/plugins/define.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/define.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'vitest' import { definePlugin } from '../../plugins/define' import { resolveConfig } from '../../config' -import { Environment } from '../../environment' +import { PartialEnvironment } from '../../baseEnvironment' async function createDefinePluginTransform( define: Record = {}, @@ -13,7 +13,7 @@ async function createDefinePluginTransform( build ? 'build' : 'serve', ) const instance = definePlugin(config) - const environment = new Environment(ssr ? 'ssr' : 'client', config) + const environment = new PartialEnvironment(ssr ? 'ssr' : 'client', config) return async (code: string) => { // @ts-expect-error transform should exist diff --git a/packages/vite/src/node/baseEnvironment.ts b/packages/vite/src/node/baseEnvironment.ts new file mode 100644 index 00000000000000..8de290697cc8bb --- /dev/null +++ b/packages/vite/src/node/baseEnvironment.ts @@ -0,0 +1,103 @@ +import colors from 'picocolors' +import type { Logger } from './logger' +import type { ResolvedConfig, ResolvedEnvironmentOptions } from './config' +import type { EnvironmentPlugin } from './plugin' + +export class PartialEnvironment { + name: string + config: ResolvedConfig + options: ResolvedEnvironmentOptions + logger: Logger + + constructor( + name: string, + config: ResolvedConfig, + options: ResolvedEnvironmentOptions = config.environments[name], + ) { + this.name = name + this.config = config + this.options = options + const environment = colors.dim(`(${this.name})`) + const colorIndex = + [...environment].reduce((acc, c) => acc + c.charCodeAt(0), 0) % + environmentColors.length + const infoColor = environmentColors[colorIndex || 0] + this.logger = { + get hasWarned() { + return config.logger.hasWarned + }, + info(msg, opts) { + return config.logger.info(msg, { + ...opts, + environment: infoColor(environment), + }) + }, + warn(msg, opts) { + return config.logger.warn(msg, { + ...opts, + environment: colors.yellow(environment), + }) + }, + warnOnce(msg, opts) { + return config.logger.warnOnce(msg, { + ...opts, + environment: colors.yellow(environment), + }) + }, + error(msg, opts) { + return config.logger.error(msg, { + ...opts, + environment: colors.red(environment), + }) + }, + clearScreen(type) { + return config.logger.clearScreen(type) + }, + hasErrorLogged(error) { + return config.logger.hasErrorLogged(error) + }, + } + } +} + +export class BaseEnvironment extends PartialEnvironment { + get plugins(): EnvironmentPlugin[] { + if (!this._plugins) + throw new Error( + `${this.name} environment.plugins called before initialized`, + ) + return this._plugins + } + + /** + * @internal + */ + _plugins: EnvironmentPlugin[] | undefined + /** + * @internal + */ + _initiated: boolean = false + + constructor( + name: string, + config: ResolvedConfig, + options: ResolvedEnvironmentOptions = config.environments[name], + ) { + super(name, config, options) + } +} + +/** + * This is used both to avoid users to hardcode conditions like + * !scan && !build => dev + */ +export class FutureCompatEnvironment extends BaseEnvironment { + mode = 'futureCompat' as const +} + +const environmentColors = [ + colors.blue, + colors.magenta, + colors.green, + colors.gray, +] diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 1c93528fc8f60c..a8b042c4569bb6 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -66,7 +66,7 @@ import { completeSystemWrapPlugin } from './plugins/completeSystemWrap' import { mergeConfig } from './publicUtils' import { webWorkerPostPlugin } from './plugins/worker' import { getHookHandler } from './plugins' -import { Environment } from './environment' +import { BaseEnvironment } from './baseEnvironment' import type { Plugin, PluginContext } from './plugin' import type { RollupPluginHooks } from './typeUtils' @@ -1458,7 +1458,7 @@ function areSeparateFolders(a: string, b: string) { ) } -export class BuildEnvironment extends Environment { +export class BuildEnvironment extends BaseEnvironment { mode = 'build' as const constructor( @@ -1481,10 +1481,10 @@ export class BuildEnvironment extends Environment { } async init(): Promise { - if (this._inited) { + if (this._initiated) { return } - this._inited = true + this._initiated = true this._plugins = await resolveEnvironmentPlugins(this) } } diff --git a/packages/vite/src/node/cli.ts b/packages/vite/src/node/cli.ts index fa93b125113f3e..290524284b7acd 100644 --- a/packages/vite/src/node/cli.ts +++ b/packages/vite/src/node/cli.ts @@ -9,6 +9,7 @@ import type { ServerOptions } from './server' import type { CLIShortcut } from './shortcuts' import type { LogLevel } from './logger' import { createLogger } from './logger' +import { resolveConfig } from './config' const cli = cac('vite') @@ -339,8 +340,6 @@ cli ) .action( async (root: string, options: { force?: boolean } & GlobalCLIOptions) => { - /* TODO: do we need this command? - filterDuplicateOptions(options) const { optimizeDeps } = await import('./optimizer') try { @@ -354,8 +353,7 @@ cli }, 'serve', ) - const environment = new Environment('client', config) - await optimizeDeps(environment, options.force, true) + await optimizeDeps(config, options.force, true) } catch (e) { createLogger(options.logLevel).error( colors.red(`error when optimizing deps:\n${e.stack}`), @@ -363,7 +361,6 @@ cli ) process.exit(1) } - */ }, ) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 60b4e6a0ea89c5..a8f57e331e1ecf 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -23,7 +23,6 @@ import { import type { HookHandler, Plugin, - PluginEnvironment, PluginOption, PluginWithRequiredHook, } from './plugin' @@ -43,7 +42,6 @@ import { } from './build' import type { ResolvedServerOptions, ServerOptions } from './server' import { resolveServerOptions } from './server' -import { Environment } from './environment' import type { DevEnvironment } from './server/environment' import type { PreviewOptions, ResolvedPreviewOptions } from './preview' import { resolvePreviewOptions } from './preview' @@ -89,6 +87,7 @@ import { findNearestPackageData } from './packages' import { loadEnv, resolveEnvPrefix } from './env' import type { ResolvedSSROptions, SSROptions } from './ssr' import { resolveSSROptions } from './ssr' +import { FutureCompatEnvironment } from './baseEnvironment' const debug = createDebugger('vite:config') const promisifiedRealpath = promisify(fs.realpath) @@ -1223,11 +1222,10 @@ export async function resolveConfig( plugins: Plugin[], ) => { // The used alias and resolve plugins only use configuration options from the - // environment so we can safely cast to a base Environment instance to a - // PluginEnvironment here - const environment = new Environment(environmentName, this) + // environment so we can safely just use the FutureCompatEnvironment here + const environment = new FutureCompatEnvironment(environmentName, this) const pluginContainer = await createEnvironmentPluginContainer( - environment as PluginEnvironment, + environment, plugins, ) await pluginContainer.buildStart({}) diff --git a/packages/vite/src/node/environment.ts b/packages/vite/src/node/environment.ts index 8df034a721760a..1d748eedea96d1 100644 --- a/packages/vite/src/node/environment.ts +++ b/packages/vite/src/node/environment.ts @@ -1,96 +1,13 @@ -import colors from 'picocolors' -import type { Logger } from './logger' -import type { ResolvedConfig, ResolvedEnvironmentOptions } from './config' -import type { EnvironmentPlugin } from './plugin' +import type { DevEnvironment } from './server/environment' +import type { BuildEnvironment } from './build' +import type { ScanEnvironment } from './optimizer/scan' +import { type FutureCompatEnvironment } from './baseEnvironment' -export class Environment { - name: string - - config: ResolvedConfig - options: ResolvedEnvironmentOptions - - get plugins(): EnvironmentPlugin[] { - if (!this._plugins) - throw new Error( - `${this.name} environment.plugins called before initialized`, - ) - return this._plugins - } - /** - * @internal - */ - _plugins: EnvironmentPlugin[] | undefined - /** - * @internal - */ - _inited: boolean = false - - #logger: Logger | undefined - get logger(): Logger { - if (this.#logger) { - return this.#logger - } - const environment = colors.dim(`(${this.name})`) - const colorIndex = - Number([...environment].map((c) => c.charCodeAt(0))) % - environmentColors.length - const infoColor = environmentColors[colorIndex || 0] - const logger = this.config.logger - this.#logger = { - get hasWarned() { - return logger.hasWarned - }, - info(msg, opts) { - return logger.info(msg, { - ...opts, - environment: infoColor(environment), - }) - }, - warn(msg, opts) { - return logger.warn(msg, { - ...opts, - environment: colors.yellow(environment), - }) - }, - warnOnce(msg, opts) { - return logger.warnOnce(msg, { - ...opts, - environment: colors.yellow(environment), - }) - }, - error(msg, opts) { - return logger.error(msg, { - ...opts, - environment: colors.red(environment), - }) - }, - clearScreen(type) { - return logger.clearScreen(type) - }, - hasErrorLogged(error) { - return logger.hasErrorLogged(error) - }, - } - return this.#logger - } - - constructor( - name: string, - config: ResolvedConfig, - options: ResolvedEnvironmentOptions = config.environments[name], - ) { - this.name = name - this.config = config - this.options = options - } -} - -const environmentColors = [ - colors.blue, - colors.magenta, - colors.green, - colors.gray, -] +export type Environment = + | DevEnvironment + | BuildEnvironment + | ScanEnvironment + | FutureCompatEnvironment export function cachedByEnvironment( create: (environment: Environment) => Data, diff --git a/packages/vite/src/node/external.ts b/packages/vite/src/node/external.ts index 6d593cbb0d42b5..58d35435a51959 100644 --- a/packages/vite/src/node/external.ts +++ b/packages/vite/src/node/external.ts @@ -9,6 +9,7 @@ import { isBuiltin, } from './utils' import type { Environment } from './environment' +import type { PartialEnvironment } from './baseEnvironment' const debug = createDebugger('vite:external') @@ -49,7 +50,7 @@ export function isConfiguredAsExternal( } export function createIsConfiguredAsExternal( - environment: Environment, + environment: PartialEnvironment, ): (id: string, importer?: string) => boolean { const { config, options } = environment const { root } = config diff --git a/packages/vite/src/node/idResolver.ts b/packages/vite/src/node/idResolver.ts index bcf0f124a2677d..6cd62a93b3dcf6 100644 --- a/packages/vite/src/node/idResolver.ts +++ b/packages/vite/src/node/idResolver.ts @@ -1,16 +1,16 @@ import type { PartialResolvedId } from 'rollup' import aliasPlugin from '@rollup/plugin-alias' import type { ResolvedConfig } from './config' -import type { Environment } from './environment' -import type { PluginEnvironment } from './plugin' import type { EnvironmentPluginContainer } from './server/pluginContainer' import { createEnvironmentPluginContainer } from './server/pluginContainer' import { resolvePlugin } from './plugins/resolve' import type { InternalResolveOptions } from './plugins/resolve' import { getFsUtils } from './fsUtils' +import type { Environment } from './environment' +import type { PartialEnvironment } from './baseEnvironment' export type ResolveIdFn = ( - environment: Environment, + environment: PartialEnvironment, id: string, importer?: string, aliasOnly?: boolean, @@ -26,48 +26,57 @@ export function createIdResolver( ): ResolveIdFn { const scan = options?.scan - const pluginContainerMap = new Map() + const pluginContainerMap = new Map< + PartialEnvironment, + EnvironmentPluginContainer + >() async function resolve( - environment: PluginEnvironment, + environment: PartialEnvironment, id: string, importer?: string, ): Promise { let pluginContainer = pluginContainerMap.get(environment) if (!pluginContainer) { - pluginContainer = await createEnvironmentPluginContainer(environment, [ - aliasPlugin({ entries: config.resolve.alias }), // TODO: resolve.alias per environment? - resolvePlugin({ - root: config.root, - isProduction: config.isProduction, - isBuild: config.command === 'build', - asSrc: true, - preferRelative: false, - tryIndex: true, - ...options, - fsUtils: getFsUtils(config), - // Ignore sideEffects and other computations as we only need the id - idOnly: true, - }), - ]) + pluginContainer = await createEnvironmentPluginContainer( + environment as Environment, + [ + aliasPlugin({ entries: config.resolve.alias }), // TODO: resolve.alias per environment? + resolvePlugin({ + root: config.root, + isProduction: config.isProduction, + isBuild: config.command === 'build', + asSrc: true, + preferRelative: false, + tryIndex: true, + ...options, + fsUtils: getFsUtils(config), + // Ignore sideEffects and other computations as we only need the id + idOnly: true, + }), + ], + ) pluginContainerMap.set(environment, pluginContainer) } return await pluginContainer.resolveId(id, importer, { scan }) } const aliasOnlyPluginContainerMap = new Map< - Environment, + PartialEnvironment, EnvironmentPluginContainer >() async function resolveAlias( - environment: PluginEnvironment, + environment: PartialEnvironment, id: string, importer?: string, ): Promise { let pluginContainer = aliasOnlyPluginContainerMap.get(environment) if (!pluginContainer) { - pluginContainer = await createEnvironmentPluginContainer(environment, [ - aliasPlugin({ entries: config.resolve.alias }), // TODO: resolve.alias per environment? - ]) + pluginContainer = await createEnvironmentPluginContainer( + environment as Environment, + [ + aliasPlugin({ entries: config.resolve.alias }), // TODO: resolve.alias per environment? + ], + ) aliasOnlyPluginContainerMap.set(environment, pluginContainer) } return await pluginContainer.resolveId(id, importer, { scan }) @@ -77,11 +86,7 @@ export function createIdResolver( const resolveFn = aliasOnly ? resolveAlias : resolve // aliasPlugin and resolvePlugin are implemented to function with a Environment only, // we cast it as PluginEnvironment to be able to use the pluginContainer - const resolved = await resolveFn( - environment as PluginEnvironment, - id, - importer, - ) + const resolved = await resolveFn(environment, id, importer) return resolved?.id } } diff --git a/packages/vite/src/node/index.ts b/packages/vite/src/node/index.ts index a26af09b029e86..58e19934c253dc 100644 --- a/packages/vite/src/node/index.ts +++ b/packages/vite/src/node/index.ts @@ -54,7 +54,6 @@ export type { } from './config' export type { EnvironmentPlugin, - PluginEnvironment, Plugin, EnvironmentPluginOptionArray, PluginOption, diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 18fc7497b6dcbe..c4164f9cab8ab3 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -38,13 +38,13 @@ import { import { resolveEnvironmentPlugins } from '../plugin' import type { EnvironmentPluginContainer } from '../server/pluginContainer' import { createEnvironmentPluginContainer } from '../server/pluginContainer' -import { Environment } from '../environment' +import { BaseEnvironment } from '../baseEnvironment' import type { DevEnvironment } from '../server/environment' import { transformGlobImport } from '../plugins/importMetaGlob' import { cleanUrl } from '../../shared/utils' import { loadTsconfigJsonForFile } from '../plugins/esbuild' -export class ScanEnvironment extends Environment { +export class ScanEnvironment extends BaseEnvironment { mode = 'scan' as const get pluginContainer(): EnvironmentPluginContainer { @@ -60,10 +60,10 @@ export class ScanEnvironment extends Environment { _pluginContainer: EnvironmentPluginContainer | undefined async init(): Promise { - if (this._inited) { + if (this._initiated) { return } - this._inited = true + this._initiated = true this._plugins = await resolveEnvironmentPlugins(this) this._pluginContainer = await createEnvironmentPluginContainer( this, diff --git a/packages/vite/src/node/plugin.ts b/packages/vite/src/node/plugin.ts index 83ba552dd97b74..0a931bd6114c53 100644 --- a/packages/vite/src/node/plugin.ts +++ b/packages/vite/src/node/plugin.ts @@ -20,9 +20,7 @@ import type { EnvironmentModuleNode } from './server/moduleGraph' import type { ModuleNode } from './server/mixedModuleGraph' import type { HmrContext, HotUpdateContext } from './server/hmr' import type { PreviewServerHook } from './preview' -import type { DevEnvironment } from './server/environment' -import type { BuildEnvironment } from './build' -import type { ScanEnvironment } from './optimizer/scan' +import type { Environment } from './environment' /** * Vite plugins extends the Rollup plugin interface with a few extra @@ -54,13 +52,8 @@ import type { ScanEnvironment } from './optimizer/scan' * check if they have access to dev specific APIs. */ -export type PluginEnvironment = - | DevEnvironment - | BuildEnvironment - | ScanEnvironment - export interface PluginContextExtension { - environment?: PluginEnvironment + environment?: Environment } export interface PluginContext @@ -288,7 +281,7 @@ export interface Plugin extends EnvironmentPlugin { * Inject per environment plugins after the shared plugin */ environmentPlugins?: ( - environment: PluginEnvironment, + environment: Environment, ) => EnvironmentPluginOptionArray /** @@ -324,7 +317,7 @@ export type EnvironmentPluginOptionArray = Thenable< export type PluginOption = Thenable export async function resolveEnvironmentPlugins( - environment: PluginEnvironment, + environment: Environment, ): Promise { const resolvedPlugins: EnvironmentPlugin[] = [] for (const plugin of environment.config.plugins) { diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index bf36130d8580ca..05862d3e05f967 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -11,7 +11,6 @@ import { toOutputFilePathInJS, } from '../build' import type { Plugin, PluginContext } from '../plugin' -import type { Environment } from '../environment' import type { ResolvedConfig } from '../config' import { checkPublicFile } from '../publicDir' import { @@ -27,6 +26,7 @@ import { } from '../utils' import { DEFAULT_ASSETS_INLINE_LIMIT, FS_PREFIX } from '../constants' import { cleanUrl, withTrailingSlash } from '../../shared/utils' +import type { Environment } from '../environment' // referenceId is base64url but replaces - with $ export const assetUrlRE = /__VITE_ASSET__([\w$]+)__(?:\$_(.*?)__)?/g diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 3234f1929e7c0f..8664ac35c76088 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -41,7 +41,6 @@ import { } from '../constants' import type { ResolvedConfig } from '../config' import type { Plugin } from '../plugin' -import { Environment } from '../environment' import { checkPublicFile } from '../publicDir' import { arraify, @@ -71,6 +70,7 @@ import type { Logger } from '../logger' import { cleanUrl, slash } from '../../shared/utils' import { createIdResolver } from '../idResolver' import type { ResolveIdFn } from '../idResolver' +import { PartialEnvironment } from '../baseEnvironment' import { addToHTMLProxyTransformResult } from './html' import { assetUrlRE, @@ -1089,7 +1089,7 @@ function getCssResolversKeys( } async function compileCSSPreprocessors( - environment: Environment, + environment: PartialEnvironment, id: string, lang: PreprocessLang, code: string, @@ -1171,7 +1171,7 @@ function getAtImportResolvers(config: ResolvedConfig) { } async function compileCSS( - environment: Environment, + environment: PartialEnvironment, id: string, code: string, workerController: PreprocessorWorkerController, @@ -1480,7 +1480,7 @@ export async function preprocessCSS( // Backward compatibility, only the name is needed for the alias and resolve plugins used in the resolvers // TODO: Should we use environmentName instead of environment for these APIs? // Should the signature be preprocessCSS(code, filename, environment) or preprocessCSS(code, filename, config, environmentName)? - environment: Environment = new Environment('client', config), + environment: PartialEnvironment = new PartialEnvironment('client', config), ): Promise { let workerController = preprocessorWorkerControllerCache.get(config) @@ -1929,7 +1929,7 @@ type StylusStylePreprocessorOptions = StylePreprocessorOptions & { type StylePreprocessor = { process: ( - environment: Environment, + environment: PartialEnvironment, source: string, root: string, options: StylePreprocessorOptions, @@ -1940,7 +1940,7 @@ type StylePreprocessor = { type SassStylePreprocessor = { process: ( - environment: Environment, + environment: PartialEnvironment, source: string, root: string, options: SassStylePreprocessorOptions, @@ -1951,7 +1951,7 @@ type SassStylePreprocessor = { type StylusStylePreprocessor = { process: ( - environment: Environment, + environment: PartialEnvironment, source: string, root: string, options: StylusStylePreprocessorOptions, @@ -2048,7 +2048,7 @@ function fixScssBugImportValue( // .scss/.sass processor const makeScssWorker = ( - environment: Environment, + environment: PartialEnvironment, resolvers: CSSAtImportResolvers, alias: Alias[], maxWorkers: number | undefined, @@ -2225,7 +2225,7 @@ const scssProcessor = ( * root file as base. */ async function rebaseUrls( - environment: Environment, + environment: PartialEnvironment, file: string, rootFile: string, alias: Alias[], @@ -2292,7 +2292,7 @@ async function rebaseUrls( // .less const makeLessWorker = ( - environment: Environment, + environment: PartialEnvironment, resolvers: CSSAtImportResolvers, alias: Alias[], maxWorkers: number | undefined, @@ -2714,7 +2714,7 @@ const importLightningCSS = createCachedImport(() => import('lightningcss')) async function compileLightningCSS( id: string, src: string, - environment: Environment, + environment: PartialEnvironment, urlReplacer?: CssUrlReplacer, ): ReturnType { const { config } = environment diff --git a/packages/vite/src/node/plugins/dynamicImportVars.ts b/packages/vite/src/node/plugins/dynamicImportVars.ts index 625f8fcc2d199c..534f52ed690121 100644 --- a/packages/vite/src/node/plugins/dynamicImportVars.ts +++ b/packages/vite/src/node/plugins/dynamicImportVars.ts @@ -5,8 +5,6 @@ import type { ImportSpecifier } from 'es-module-lexer' import { parse as parseJS } from 'acorn' import { dynamicImportToGlob } from '@rollup/plugin-dynamic-import-vars' import type { Plugin } from '../plugin' -import type { Environment } from '../environment' -import { cachedByEnvironment } from '../environment' import type { ResolvedConfig } from '../config' import { CLIENT_ENTRY } from '../constants' import { createIdResolver } from '../idResolver' @@ -19,6 +17,7 @@ import { transformStableResult, urlRE, } from '../utils' +import { type Environment, cachedByEnvironment } from '../environment' import { toAbsoluteGlob } from './importMetaGlob' import { hasViteIgnoreRE } from './importAnalysis' import { workerOrSharedWorkerRE } from './worker' diff --git a/packages/vite/src/node/server/environment.ts b/packages/vite/src/node/server/environment.ts index 60e7b507ca557c..a4ddd12f06fb6e 100644 --- a/packages/vite/src/node/server/environment.ts +++ b/packages/vite/src/node/server/environment.ts @@ -1,7 +1,7 @@ import type { FetchResult } from 'vite/module-runner' import type { FSWatcher } from 'dep-types/chokidar' import colors from 'picocolors' -import { Environment } from '../environment' +import { BaseEnvironment } from '../baseEnvironment' import { ERR_OUTDATED_OPTIMIZED_DEP } from '../plugins/optimizedDeps' import type { EnvironmentOptions, @@ -21,14 +21,14 @@ import type { DepsOptimizer } from '../optimizer' import { EnvironmentModuleGraph } from './moduleGraph' import type { HMRChannel } from './hmr' import { createNoopHMRChannel, getShortName, updateModules } from './hmr' -import { transformRequest } from './transformRequest' import type { TransformResult } from './transformRequest' +import { transformRequest } from './transformRequest' +import type { EnvironmentPluginContainer } from './pluginContainer' import { ERR_CLOSED_SERVER, createEnvironmentPluginContainer, } from './pluginContainer' import type { RemoteEnvironmentTransport } from './environmentTransport' -import type { EnvironmentPluginContainer } from './pluginContainer' export interface DevEnvironmentSetup { hot?: false | HMRChannel @@ -40,8 +40,7 @@ export interface DevEnvironmentSetup { depsOptimizer?: DepsOptimizer } -// Maybe we will rename this to DevEnvironment -export class DevEnvironment extends Environment { +export class DevEnvironment extends BaseEnvironment { mode = 'dev' as const // TODO: should this be 'serve'? moduleGraph: EnvironmentModuleGraph @@ -147,8 +146,8 @@ export class DevEnvironment extends Environment { this.depsOptimizer = undefined } else { // We only support auto-discovery for the client environment, for all other - // environments `noDiscovery` has no effect and an simpler explicit deps - // optimizer is used that only optimizes explicitely included dependencies + // environments `noDiscovery` has no effect and a simpler explicit deps + // optimizer is used that only optimizes explicitly included dependencies // so it doesn't need to reload the environment. Now that we have proper HMR // and full reload for general environments, we can enable autodiscovery for // them in the future @@ -161,10 +160,10 @@ export class DevEnvironment extends Environment { } async init(): Promise { - if (this._inited) { + if (this._initiated) { return } - this._inited = true + this._initiated = true this._plugins = await resolveEnvironmentPlugins(this) this._pluginContainer = await createEnvironmentPluginContainer( this, @@ -207,9 +206,9 @@ export class DevEnvironment extends Environment { async close(): Promise { this._closing = true + this._crawlEndFinder?.cancel() await Promise.allSettled([ this.pluginContainer.close(), - this._crawlEndFinder?.cancel(), this.depsOptimizer?.close(), (async () => { while (this._pendingRequests.size > 0) { diff --git a/packages/vite/src/node/server/hmr.ts b/packages/vite/src/node/server/hmr.ts index 7c6a64e87769a8..247be05fc0a7d9 100644 --- a/packages/vite/src/node/server/hmr.ts +++ b/packages/vite/src/node/server/hmr.ts @@ -6,13 +6,13 @@ import colors from 'picocolors' import type { CustomPayload, HMRPayload, Update } from 'types/hmrPayload' import type { RollupError } from 'rollup' import { CLIENT_DIR } from '../constants' -import type { Environment } from '../environment' import { createDebugger, normalizePath } from '../utils' import type { InferCustomEventPayload, ViteDevServer } from '..' import { getHookHandler } from '../plugins' import { isCSSRequest } from '../plugins/css' import { isExplicitImportRequired } from '../plugins/importAnalysis' import { getEnvFilesForMode } from '../env' +import type { Environment } from '../environment' import { withTrailingSlash, wrapId } from '../../shared/utils' import type { Plugin } from '../plugin' import type { EnvironmentModuleNode } from './moduleGraph' diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index f7d00cf4a4651e..dbf25c65ecbba4 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -61,7 +61,7 @@ import { TraceMap, originalPositionFor } from '@jridgewell/trace-mapping' import MagicString from 'magic-string' import type { FSWatcher } from 'chokidar' import colors from 'picocolors' -import type { EnvironmentPlugin, Plugin, PluginEnvironment } from '../plugin' +import type { EnvironmentPlugin, Plugin } from '../plugin' import { combineSourcemaps, createDebugger, @@ -78,6 +78,7 @@ import { import { FS_PREFIX } from '../constants' import { createPluginHookUtils, getHookHandler } from '../plugins' import { cleanUrl, unwrapId } from '../../shared/utils' +import type { Environment } from '../environment' import type { DevEnvironment } from './environment' import { buildErrorMessage } from './middlewares/error' import type { EnvironmentModuleNode } from './moduleGraph' @@ -147,7 +148,7 @@ type PluginContext = Omit< * pipelines working with the same environment (used for createIdResolver). */ export async function createEnvironmentPluginContainer( - environment: PluginEnvironment, + environment: Environment, plugins: EnvironmentPlugin[], watcher?: FSWatcher, ): Promise { @@ -263,7 +264,7 @@ export async function createEnvironmentPluginContainer( // active plugin in that pipeline can be tracked in a concurrency-safe manner. // using a class to make creating new contexts more efficient class Context implements PluginContext { - environment: PluginEnvironment // TODO: | ScanEnvironment + environment: Environment meta = minimalContext.meta ssr = false _scan = false @@ -850,7 +851,7 @@ export interface PluginContainer { custom?: CustomPluginOptions skip?: Set ssr?: boolean - environment?: PluginEnvironment + environment?: Environment /** * @internal */ @@ -864,14 +865,14 @@ export interface PluginContainer { options?: { inMap?: SourceDescription['map'] ssr?: boolean - environment?: PluginEnvironment + environment?: Environment }, ): Promise<{ code: string; map: SourceMap | { mappings: '' } | null }> load( id: string, options?: { ssr?: boolean - environment?: PluginEnvironment + environment?: Environment }, ): Promise watchChange( @@ -892,7 +893,7 @@ export interface PluginContainer { **/ export function createPluginContainer( - environments: Record, + environments: Record, ): PluginContainer { // Backward compatibility // Users should call pluginContainer.resolveId (and load/transform) passing the environment they want to work with