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