Skip to main content

rspack_core/
lib.rs

1use std::{fmt, sync::Arc};
2mod artifacts;
3mod binding;
4mod compilation;
5mod transient_cache;
6
7mod exports;
8pub mod legacy_cache;
9mod new_cache;
10mod value_cache_versions;
11pub use artifacts::*;
12pub use binding::*;
13pub use compilation::{
14  build_module_graph::{ExecuteModuleId, ForwardId, LazyUntil},
15  *,
16};
17pub use exports::*;
18pub use new_cache::{
19  Cache, CacheFacade, CacheValue, CompilerCache, Etag, FileSystemInfo, ItemCacheFacade,
20  MultiItemCache, Snapshot, SnapshotValidationResult, create_cache,
21};
22pub use transient_cache::*;
23pub use value_cache_versions::ValueCacheVersions;
24mod concatenation_backend;
25mod dependencies_block;
26pub use concatenation_backend::*;
27pub mod diagnostics;
28pub mod incremental;
29pub use dependencies_block::{
30  AsyncDependenciesBlock, AsyncDependenciesBlockIdentifier, AsyncDependenciesBlockIdentifierMap,
31  AsyncDependenciesBlockIdentifierSet, AsyncDependenciesBlockRef, DependenciesBlock,
32  DependenciesBlockData, DependencyIds,
33};
34mod fake_namespace_object;
35pub use fake_namespace_object::*;
36mod runtime_template;
37pub use runtime_template::*;
38use rustc_hash::FxHashMap;
39pub mod external_module;
40pub use external_module::*;
41mod logger;
42pub use logger::*;
43pub mod cache;
44mod normal_module;
45mod raw_module;
46pub use raw_module::*;
47pub mod module;
48pub mod parser_and_generator;
49pub use concatenated_module::*;
50pub use module::*;
51pub use parser_and_generator::*;
52mod runtime_globals;
53pub use normal_module::*;
54pub use runtime_globals::{
55  MODULE_GLOBALS, REQUIRE_SCOPE_GLOBALS, RuntimeGlobals, RuntimeVariable, runtime_variable_name,
56};
57mod runtime_module_source;
58pub use runtime_module_source::render_runtime_module_source;
59mod plugin;
60pub use plugin::*;
61mod context_module;
62pub use context_module::*;
63mod context_module_factory;
64pub use context_module_factory::*;
65mod glob_utils;
66pub(crate) use glob_utils::walk_dir;
67pub use glob_utils::*;
68mod init_fragment;
69pub use init_fragment::*;
70mod module_factory;
71pub use module_factory::*;
72mod normal_module_factory;
73pub use normal_module_factory::*;
74mod ignore_error_module_factory;
75pub use ignore_error_module_factory::*;
76mod self_module_factory;
77pub use self_module_factory::*;
78mod self_module;
79pub use self_module::*;
80mod compiler;
81pub use compiler::*;
82mod options;
83pub use options::*;
84mod module_graph;
85pub use module_graph::*;
86mod chunk;
87pub use chunk::*;
88mod dependency;
89pub use dependency::*;
90mod utils;
91use ustr::Ustr;
92pub use utils::*;
93mod chunk_graph;
94pub use chunk_graph::*;
95mod stats;
96pub use stats::*;
97mod runtime;
98mod runtime_module;
99pub use runtime::*;
100pub use runtime_module::*;
101mod entrypoint;
102pub use entrypoint::*;
103mod loader;
104pub use loader::*;
105// mod external;
106// pub use external::*;
107mod chunk_group;
108pub use chunk_group::*;
109mod ukey;
110pub use ukey::*;
111pub mod resolver;
112pub use resolver::*;
113pub use rspack_location::{
114  DependencyLocation, RealDependencyLocation, SourcePosition, SyntheticDependencyLocation,
115};
116pub mod concatenated_module;
117pub mod reserved_names;
118pub use inventory;
119use rspack_cacheable::{cacheable, with::AsPreset};
120use rspack_hash::{RspackHash, RspackHasher};
121pub use rspack_loader_runner::{
122  AdditionalData, BUILTIN_LOADER_PREFIX, ParseMeta, ResourceData, ResourceParsedData, Scheme,
123  get_scheme, parse_resource,
124};
125pub use rspack_macros::{impl_runtime_module, impl_source_map_config};
126pub use rspack_sources;
127
128#[cfg(debug_assertions)]
129pub mod debug_info;
130
131#[cacheable]
132#[derive(
133  Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, rspack_macros::StringEnum,
134)]
135#[string_enum(rename_all = "kebab-case")]
136pub enum SourceType {
137  #[string_enum(rename = "javascript")]
138  JavaScript,
139  Css,
140  AssetUrl,
141  Wasm,
142  Asset,
143  Expose,
144  Remote,
145  ShareInit,
146  ConsumeShared,
147  ShareContainerShared,
148  #[string_enum(fallback)]
149  Custom(#[cacheable(with=AsPreset)] Ustr),
150  #[default]
151  Unknown,
152  CssImport,
153  Runtime,
154}
155
156pub static NO_SOURCE_TYPE_LIST: &[SourceType; 0] = &[];
157
158impl std::fmt::Display for SourceType {
159  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160    f.write_str(self.as_str())
161  }
162}
163
164impl RspackHash for SourceType {
165  fn hash(&self, state: &mut RspackHasher) {
166    self.as_str().hash(state);
167  }
168}
169
170impl From<&ModuleType> for SourceType {
171  fn from(value: &ModuleType) -> Self {
172    match value {
173      ModuleType::JsAuto | ModuleType::JsEsm | ModuleType::JsDynamic => Self::JavaScript,
174      ModuleType::Css | ModuleType::CssModule | ModuleType::CssAuto | ModuleType::CssGlobal => {
175        Self::Css
176      }
177      ModuleType::WasmSync | ModuleType::WasmAsync => Self::Wasm,
178      ModuleType::Asset | ModuleType::AssetInline | ModuleType::AssetResource => Self::Asset,
179      ModuleType::ConsumeShared => Self::ConsumeShared,
180      ModuleType::ShareContainerShared => Self::ShareContainerShared,
181      _ => Self::Unknown,
182    }
183  }
184}
185
186#[cacheable]
187#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
188pub enum ModuleType {
189  Json,
190  Css,
191  CssModule,
192  CssAuto,
193  CssGlobal,
194  JsAuto,
195  JsDynamic,
196  JsEsm,
197  WasmSync,
198  WasmAsync,
199  AssetInline,
200  AssetResource,
201  AssetSource,
202  AssetBytes,
203  Asset,
204  Runtime,
205  Remote,
206  Fallback,
207  ProvideShared,
208  ConsumeShared,
209  ShareContainerShared,
210  SelfReference,
211  Custom(#[cacheable(with=AsPreset)] Ustr),
212}
213
214impl ModuleType {
215  pub fn is_js_like(&self) -> bool {
216    matches!(
217      self,
218      ModuleType::JsAuto | ModuleType::JsEsm | ModuleType::JsDynamic
219    )
220  }
221
222  pub fn is_asset_like(&self) -> bool {
223    matches!(
224      self,
225      ModuleType::Asset | ModuleType::AssetInline | ModuleType::AssetResource
226    )
227  }
228
229  pub fn is_wasm_like(&self) -> bool {
230    matches!(self, ModuleType::WasmSync | ModuleType::WasmAsync)
231  }
232
233  pub fn is_js_auto(&self) -> bool {
234    matches!(self, ModuleType::JsAuto)
235  }
236
237  pub fn is_js_esm(&self) -> bool {
238    matches!(self, ModuleType::JsEsm)
239  }
240
241  pub fn is_js_dynamic(&self) -> bool {
242    matches!(self, ModuleType::JsDynamic)
243  }
244
245  /// Webpack arbitrary determines the binary type from [NormalModule.binary](https://github.com/webpack/webpack/blob/1f99ad6367f2b8a6ef17cce0e058f7a67fb7db18/lib/NormalModule.js#L302)
246  pub fn is_binary(&self) -> bool {
247    matches!(self, ModuleType::AssetBytes) || self.is_asset_like() || self.is_wasm_like()
248  }
249
250  pub fn as_str(&self) -> &'static str {
251    match self {
252      ModuleType::JsAuto => "javascript/auto",
253      ModuleType::JsEsm => "javascript/esm",
254      ModuleType::JsDynamic => "javascript/dynamic",
255
256      ModuleType::Css => "css",
257      ModuleType::CssModule => "css/module",
258      ModuleType::CssAuto => "css/auto",
259      ModuleType::CssGlobal => "css/global",
260
261      ModuleType::Json => "json",
262
263      ModuleType::WasmSync => "webassembly/sync",
264      ModuleType::WasmAsync => "webassembly/async",
265
266      ModuleType::Asset => "asset",
267      ModuleType::AssetSource => "asset/source",
268      ModuleType::AssetResource => "asset/resource",
269      ModuleType::AssetInline => "asset/inline",
270      ModuleType::AssetBytes => "asset/bytes",
271      ModuleType::Runtime => "runtime",
272      ModuleType::Remote => "remote-module",
273      ModuleType::Fallback => "fallback-module",
274      ModuleType::ProvideShared => "provide-module",
275      ModuleType::ConsumeShared => "consume-shared-module",
276      ModuleType::ShareContainerShared => "share-container-shared-module",
277      ModuleType::SelfReference => "self-reference-module",
278
279      ModuleType::Custom(custom) => custom.as_str(),
280    }
281  }
282}
283
284impl fmt::Display for ModuleType {
285  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
286    write!(f, "{}", self.as_str(),)
287  }
288}
289
290impl From<&str> for ModuleType {
291  fn from(value: &str) -> Self {
292    match value {
293      "mjs" => Self::JsEsm,
294      "cjs" => Self::JsDynamic,
295      "javascript/auto" => Self::JsAuto,
296      "javascript/dynamic" => Self::JsDynamic,
297      "javascript/esm" => Self::JsEsm,
298
299      "css" => Self::Css,
300      "css/module" => Self::CssModule,
301      "css/auto" => Self::CssAuto,
302      "css/global" => Self::CssGlobal,
303
304      "json" => Self::Json,
305
306      "webassembly/sync" => Self::WasmSync,
307      "webassembly/async" => Self::WasmAsync,
308
309      "asset" => Self::Asset,
310      "asset/resource" => Self::AssetResource,
311      "asset/source" => Self::AssetSource,
312      "asset/inline" => Self::AssetInline,
313      "asset/bytes" => Self::AssetBytes,
314
315      custom => Self::Custom(custom.into()),
316    }
317  }
318}
319
320pub type ModuleLayer = String;
321
322pub(crate) type SharedPluginDriver = Arc<PluginDriver>;
323
324#[derive(Debug, Default, Clone)]
325pub struct ChunkByUkey {
326  inner: FxHashMap<ChunkUkey, Chunk>,
327}
328
329impl ChunkByUkey {
330  pub fn get(&self, ukey: &ChunkUkey) -> Option<&Chunk> {
331    self.inner.get(ukey)
332  }
333
334  pub fn get_mut(&mut self, ukey: &ChunkUkey) -> Option<&mut Chunk> {
335    self.inner.get_mut(ukey)
336  }
337
338  pub fn get_many_mut<const N: usize>(
339    &mut self,
340    ukeys: [&ChunkUkey; N],
341  ) -> [Option<&mut Chunk>; N] {
342    self.inner.get_disjoint_mut(ukeys)
343  }
344
345  pub fn expect_get(&self, ukey: &ChunkUkey) -> &Chunk {
346    self
347      .get(ukey)
348      .unwrap_or_else(|| panic!("Chunk({ukey:?}) not found in ChunkByUkey"))
349  }
350
351  pub fn expect_get_mut(&mut self, ukey: &ChunkUkey) -> &mut Chunk {
352    self
353      .get_mut(ukey)
354      .unwrap_or_else(|| panic!("Chunk({ukey:?}) not found in ChunkByUkey"))
355  }
356
357  pub fn add(&mut self, chunk: Chunk) -> &mut Chunk {
358    let ukey = chunk.ukey();
359    debug_assert!(!self.inner.contains_key(&ukey));
360    self.inner.entry(ukey).or_insert(chunk)
361  }
362
363  pub fn remove(&mut self, ukey: &ChunkUkey) -> Option<Chunk> {
364    self.inner.remove(ukey)
365  }
366
367  pub fn entry(
368    &mut self,
369    ukey: ChunkUkey,
370  ) -> std::collections::hash_map::Entry<'_, ChunkUkey, Chunk> {
371    self.inner.entry(ukey)
372  }
373
374  pub fn contains(&self, ukey: &ChunkUkey) -> bool {
375    self.inner.contains_key(ukey)
376  }
377
378  pub fn keys(&self) -> impl Iterator<Item = &ChunkUkey> {
379    self.inner.keys()
380  }
381
382  pub fn values(&self) -> impl Iterator<Item = &Chunk> {
383    self.inner.values()
384  }
385
386  pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Chunk> {
387    self.inner.values_mut()
388  }
389
390  pub fn iter(&self) -> impl Iterator<Item = (&ChunkUkey, &Chunk)> {
391    self.inner.iter()
392  }
393
394  pub fn iter_mut(&mut self) -> impl Iterator<Item = (&ChunkUkey, &mut Chunk)> {
395    self.inner.iter_mut()
396  }
397
398  #[allow(clippy::len_without_is_empty)]
399  pub fn len(&self) -> usize {
400    self.inner.len()
401  }
402}
403
404#[derive(Debug, Default, Clone)]
405pub struct ChunkGroupByUkey {
406  inner: FxHashMap<ChunkGroupUkey, ChunkGroup>,
407}
408
409impl ChunkGroupByUkey {
410  pub fn get(&self, ukey: &ChunkGroupUkey) -> Option<&ChunkGroup> {
411    self.inner.get(ukey)
412  }
413
414  pub fn get_mut(&mut self, ukey: &ChunkGroupUkey) -> Option<&mut ChunkGroup> {
415    self.inner.get_mut(ukey)
416  }
417
418  pub fn expect_get(&self, ukey: &ChunkGroupUkey) -> &ChunkGroup {
419    self
420      .get(ukey)
421      .unwrap_or_else(|| panic!("ChunkGroup({ukey:?}) not found in ChunkGroupByUkey"))
422  }
423
424  pub fn expect_get_mut(&mut self, ukey: &ChunkGroupUkey) -> &mut ChunkGroup {
425    self
426      .get_mut(ukey)
427      .unwrap_or_else(|| panic!("ChunkGroup({ukey:?}) not found in ChunkGroupByUkey"))
428  }
429
430  pub fn add(&mut self, chunk: ChunkGroup) -> &mut ChunkGroup {
431    let ukey = chunk.ukey();
432    debug_assert!(!self.inner.contains_key(&ukey));
433    self.inner.entry(ukey).or_insert(chunk)
434  }
435
436  pub fn remove(&mut self, ukey: &ChunkGroupUkey) -> Option<ChunkGroup> {
437    self.inner.remove(ukey)
438  }
439
440  pub fn contains(&self, ukey: &ChunkGroupUkey) -> bool {
441    self.inner.contains_key(ukey)
442  }
443
444  pub fn keys(&self) -> impl Iterator<Item = &ChunkGroupUkey> {
445    self.inner.keys()
446  }
447
448  pub fn values(&self) -> impl Iterator<Item = &ChunkGroup> {
449    self.inner.values()
450  }
451
452  pub fn iter(&self) -> impl Iterator<Item = (&ChunkGroupUkey, &ChunkGroup)> {
453    self.inner.iter()
454  }
455}