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::*;
105mod 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 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}