Skip to main content

rspack_core/
lib.rs

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