#![allow(clippy::enum_variant_names)]
use enum_tag::EnumTag;
use rspack_core::{
BoxPlugin, ChunkLoadingType, CompilerOptions, CompilerPlatform, EntryOptions, ExternalItem,
ExternalType, LibraryType, PluginExt as _, WasmLoadingType,
};
#[derive(EnumTag, Debug)]
#[repr(u8)]
pub(super) enum BuiltinPluginOptions {
ExternalsPlugin((ExternalType, Vec<ExternalItem>, bool)),
NodeTargetPlugin,
ElectronTargetPlugin(rspack_plugin_externals::ElectronTargetContext),
HttpExternalsRspackPlugin((bool , bool )),
ChunkPrefetchPreloadPlugin,
CommonJsChunkFormatPlugin,
ArrayPushCallbackChunkFormatPlugin,
ModuleChunkFormatPlugin,
EnableChunkLoadingPlugin(ChunkLoadingType),
EnableWasmLoadingPlugin(WasmLoadingType),
RuntimeChunkPlugin(rspack_plugin_runtime_chunk::RuntimeChunkOptions),
NoEmitOnErrorsPlugin,
SourceMapDevToolPlugin(rspack_plugin_devtool::SourceMapDevToolPluginOptions),
EvalSourceMapDevToolPlugin(rspack_plugin_devtool::SourceMapDevToolPluginOptions),
EvalDevToolModulePlugin(rspack_plugin_devtool::EvalDevToolModulePluginOptions),
JavascriptModulesPlugin,
JsonModulesPlugin,
AssetModulesPlugin,
AsyncWebAssemblyModulesPlugin,
CssModulesPlugin,
EntryPlugin(Box<(String /* entry request */, EntryOptions)>),
RuntimePlugin,
InferAsyncModulesPlugin,
APIPlugin,
DataUriPlugin,
FileUriPlugin,
EnsureChunkConditionsPlugin,
MergeDuplicateChunksPlugin,
SideEffectsFlagPlugin(bool),
FlagDependencyExportsPlugin,
FlagDependencyUsagePlugin(bool),
ModuleConcatenationPlugin,
MangleExportsPlugin(bool),
EnableLibraryPlugin(LibraryType),
RemoveEmptyChunksPlugin,
RealContentHashPlugin,
NamedModuleIdsPlugin,
NaturalModuleIdsPlugin,
DeterministicModuleIdsPlugin,
HashedModuleIdsPlugin,
NaturalChunkIdsPlugin,
NamedChunkIdsPlugin,
DeterministicChunkIdsPlugin,
OccurrenceChunkIdsPlugin(rspack_ids::OccurrenceChunkIdsPluginOptions),
DefinePlugin(rspack_plugin_javascript::define_plugin::DefineValue),
AnyMinimizerRspackPlugin(BoxPlugin),
WorkerPlugin,
}
#[derive(Default, Debug)]
pub struct BuilderContext {
pub(super) plugins: Vec<BuiltinPluginOptions>,
pub(super) platform: CompilerPlatform,
}
impl BuilderContext {
pub fn take_platform(&mut self) -> CompilerPlatform {
std::mem::take(&mut self.platform)
}
pub fn take_plugins(&mut self, compiler_options: &CompilerOptions) -> Vec<BoxPlugin> {
self.plugins.sort_by_key(|p| p.tag());
let mut plugins = Vec::new();
self.plugins.drain(..).for_each(|plugin| match plugin {
BuiltinPluginOptions::ExternalsPlugin((external_type, externals, place_in_initial)) => {
plugins.push(
rspack_plugin_externals::ExternalsPlugin::new(external_type, externals, place_in_initial)
.boxed(),
);
}
BuiltinPluginOptions::NodeTargetPlugin => {
plugins.push(rspack_plugin_externals::node_target_plugin())
}
BuiltinPluginOptions::ElectronTargetPlugin(context) => {
rspack_plugin_externals::electron_target_plugin(context, &mut plugins)
}
BuiltinPluginOptions::HttpExternalsRspackPlugin((css, web_async)) => {
plugins.push(rspack_plugin_externals::http_externals_rspack_plugin(
css, web_async,
));
}
BuiltinPluginOptions::ChunkPrefetchPreloadPlugin => {
plugins.push(rspack_plugin_runtime::ChunkPrefetchPreloadPlugin::default().boxed());
}
BuiltinPluginOptions::CommonJsChunkFormatPlugin => {
plugins.push(rspack_plugin_runtime::CommonJsChunkFormatPlugin::default().boxed());
}
BuiltinPluginOptions::ArrayPushCallbackChunkFormatPlugin => {
plugins.push(rspack_plugin_runtime::ArrayPushCallbackChunkFormatPlugin::default().boxed());
}
BuiltinPluginOptions::ModuleChunkFormatPlugin => {
plugins.push(rspack_plugin_runtime::ModuleChunkFormatPlugin::default().boxed());
}
BuiltinPluginOptions::EnableChunkLoadingPlugin(chunk_loading_type) => {
rspack_plugin_runtime::enable_chunk_loading_plugin(chunk_loading_type, &mut plugins);
}
BuiltinPluginOptions::EnableWasmLoadingPlugin(wasm_loading_type) => {
plugins.push(rspack_plugin_wasm::enable_wasm_loading_plugin(
wasm_loading_type,
));
}
BuiltinPluginOptions::RuntimeChunkPlugin(options) => {
plugins.push(rspack_plugin_runtime_chunk::RuntimeChunkPlugin::new(options).boxed());
}
BuiltinPluginOptions::NoEmitOnErrorsPlugin => {
plugins.push(rspack_plugin_no_emit_on_errors::NoEmitOnErrorsPlugin::default().boxed());
}
BuiltinPluginOptions::SourceMapDevToolPlugin(options) => {
plugins.push(
rspack_plugin_devtool::SourceMapDevToolModuleOptionsPlugin::new(
rspack_plugin_devtool::SourceMapDevToolModuleOptionsPluginOptions {
module: options.module,
cheap: !options.columns,
},
)
.boxed(),
);
plugins.push(rspack_plugin_devtool::SourceMapDevToolPlugin::new(options).boxed());
}
BuiltinPluginOptions::EvalSourceMapDevToolPlugin(options) => {
plugins.push(
rspack_plugin_devtool::SourceMapDevToolModuleOptionsPlugin::new(
rspack_plugin_devtool::SourceMapDevToolModuleOptionsPluginOptions {
module: options.module,
cheap: !options.columns,
},
)
.boxed(),
);
plugins.push(rspack_plugin_devtool::EvalSourceMapDevToolPlugin::new(options).boxed());
}
BuiltinPluginOptions::EvalDevToolModulePlugin(options) => {
plugins.push(rspack_plugin_devtool::EvalDevToolModulePlugin::new(options).boxed());
}
BuiltinPluginOptions::JavascriptModulesPlugin => {
plugins.push(rspack_plugin_javascript::JsPlugin::default().boxed());
}
BuiltinPluginOptions::JsonModulesPlugin => {
plugins.push(rspack_plugin_json::JsonPlugin.boxed());
}
BuiltinPluginOptions::AssetModulesPlugin => {
plugins.push(rspack_plugin_asset::AssetPlugin::default().boxed());
}
BuiltinPluginOptions::AsyncWebAssemblyModulesPlugin => {
plugins.push(rspack_plugin_wasm::AsyncWasmPlugin::default().boxed());
}
BuiltinPluginOptions::CssModulesPlugin => {
plugins.push(rspack_plugin_css::CssPlugin::default().boxed());
}
BuiltinPluginOptions::EntryPlugin(entry_options) => {
let (entry_request, options) = *entry_options;
plugins.push(
rspack_plugin_entry::EntryPlugin::new(
compiler_options.context.clone(),
entry_request,
options,
)
.boxed(),
);
}
BuiltinPluginOptions::RuntimePlugin => {
plugins.push(rspack_plugin_runtime::RuntimePlugin::default().boxed())
}
BuiltinPluginOptions::InferAsyncModulesPlugin => {
plugins.push(rspack_plugin_javascript::InferAsyncModulesPlugin::default().boxed())
}
BuiltinPluginOptions::APIPlugin => {
plugins.push(rspack_plugin_javascript::api_plugin::APIPlugin::default().boxed())
}
BuiltinPluginOptions::DataUriPlugin => {
plugins.push(rspack_plugin_schemes::DataUriPlugin::default().boxed());
}
BuiltinPluginOptions::FileUriPlugin => {
plugins.push(rspack_plugin_schemes::FileUriPlugin::default().boxed());
}
BuiltinPluginOptions::EnsureChunkConditionsPlugin => {
plugins.push(
rspack_plugin_ensure_chunk_conditions::EnsureChunkConditionsPlugin::default().boxed(),
);
}
BuiltinPluginOptions::MergeDuplicateChunksPlugin => {
plugins.push(
rspack_plugin_merge_duplicate_chunks::MergeDuplicateChunksPlugin::default().boxed(),
);
}
BuiltinPluginOptions::SideEffectsFlagPlugin(analyze_side_effects_free) => {
plugins.push(
rspack_plugin_javascript::SideEffectsFlagPlugin::new(analyze_side_effects_free).boxed(),
);
}
BuiltinPluginOptions::FlagDependencyExportsPlugin => {
plugins.push(rspack_plugin_javascript::FlagDependencyExportsPlugin::default().boxed());
}
BuiltinPluginOptions::FlagDependencyUsagePlugin(value) => {
plugins.push(rspack_plugin_javascript::FlagDependencyUsagePlugin::new(value).boxed())
}
BuiltinPluginOptions::ModuleConcatenationPlugin => {
plugins.push(rspack_plugin_javascript::ModuleConcatenationPlugin::default().boxed());
}
BuiltinPluginOptions::MangleExportsPlugin(value) => {
plugins.push(rspack_plugin_javascript::MangleExportsPlugin::new(value).boxed())
}
BuiltinPluginOptions::EnableLibraryPlugin(library_type) => {
rspack_plugin_library::enable_library_plugin(library_type, None, None, &mut plugins)
}
BuiltinPluginOptions::RemoveEmptyChunksPlugin => {
plugins.push(rspack_plugin_remove_empty_chunks::RemoveEmptyChunksPlugin::default().boxed())
}
BuiltinPluginOptions::RealContentHashPlugin => {
plugins.push(rspack_plugin_real_content_hash::RealContentHashPlugin::default().boxed())
}
BuiltinPluginOptions::NamedModuleIdsPlugin => {
plugins.push(rspack_ids::NamedModuleIdsPlugin::default().boxed())
}
BuiltinPluginOptions::NaturalModuleIdsPlugin => {
plugins.push(rspack_ids::NaturalModuleIdsPlugin::default().boxed())
}
BuiltinPluginOptions::DeterministicModuleIdsPlugin => {
plugins.push(rspack_ids::DeterministicModuleIdsPlugin::default().boxed())
}
BuiltinPluginOptions::HashedModuleIdsPlugin => plugins.push(
rspack_ids::HashedModuleIdsPlugin::new(rspack_ids::HashedModuleIdsPluginOptions::default())
.boxed(),
),
BuiltinPluginOptions::NaturalChunkIdsPlugin => {
plugins.push(rspack_ids::NaturalChunkIdsPlugin::default().boxed())
}
BuiltinPluginOptions::NamedChunkIdsPlugin => {
plugins.push(rspack_ids::NamedChunkIdsPlugin::new(None, None).boxed())
}
BuiltinPluginOptions::DeterministicChunkIdsPlugin => {
plugins.push(rspack_ids::DeterministicChunkIdsPlugin::default().boxed())
}
BuiltinPluginOptions::OccurrenceChunkIdsPlugin(options) => {
plugins.push(rspack_ids::OccurrenceChunkIdsPlugin::new(options).boxed())
}
BuiltinPluginOptions::DefinePlugin(values) => {
plugins.push(rspack_plugin_javascript::define_plugin::DefinePlugin::new(values).boxed())
}
BuiltinPluginOptions::AnyMinimizerRspackPlugin(plugin) => plugins.push(plugin),
BuiltinPluginOptions::WorkerPlugin => {
plugins.push(rspack_plugin_worker::WorkerPlugin::default().boxed())
}
});
plugins
}
}