nodejs_resolver/
options.rs

1use std::{collections::HashSet, path::PathBuf, sync::Arc};
2
3use crate::Cache;
4
5#[derive(Debug, Clone, Hash, PartialEq, Eq)]
6pub enum AliasMap {
7    Target(String),
8    Ignored,
9}
10
11#[derive(Debug, Clone, Hash, PartialEq, Eq)]
12pub enum EnforceExtension {
13    Enabled,
14    Disabled,
15    Auto,
16}
17
18pub type Alias = Vec<(String, Vec<AliasMap>)>;
19
20#[derive(Debug, Clone)]
21pub struct Options {
22    /// Tried detect file with this extension.
23    /// Default is `[".js", ".json", ".node"]`
24    pub extensions: Vec<String>,
25    /// Enforce that a extension from extensions must be used.
26    /// Default is `Auto`.
27    pub enforce_extension: EnforceExtension,
28    /// Maps key to value.
29    /// Default is `vec![]`.
30    /// The reason for using `Vec` instead `HashMap` to keep the order.
31    pub alias: Alias,
32    /// Prefer to resolve request as relative request and
33    /// fallback to resolving as modules.
34    /// Default is `false`
35    pub prefer_relative: bool,
36    /// Use of cache defined external, it designed to shared the info of `description_file`
37    /// in different resolver.
38    ///
39    /// - If `external_cache` is `None`, use default cache in resolver.
40    /// - If `external_cache.is_some()` is true, use this cache.
41    ///
42    /// Default is `None`.
43    pub external_cache: Option<Arc<Cache>>,
44    /// Whether to resolve the real path when the result
45    /// is a symlink.
46    /// Default is `true`.
47    pub symlinks: bool,
48    /// A JSON file to describing this lib information.
49    /// Default is `"package.json"`.
50    pub description_file: String,
51    /// Resolve to a context instead of a file.
52    /// Default is `false`
53    pub resolve_to_context: bool,
54    /// Main file in this directory.
55    /// Default is `["index"]`.
56    pub main_files: Vec<String>,
57    /// Main fields in Description.
58    /// Default is `["main"]`.
59    pub main_fields: Vec<String>,
60    /// Whether read and parse `"browser"` filed
61    /// in package.json.
62    /// Default is `false`
63    pub browser_field: bool,
64    /// Condition names for exports filed. Note that its type is a `HashSet`,
65    /// because the priority is related to the order in which the export field
66    /// fields are written.
67    /// Default is `[]`.
68    pub condition_names: HashSet<String>,
69    /// When this filed exists, it tries to read `baseURL`
70    /// and `paths` in the corresponding tsconfig,
71    /// and processes the mappings.
72    /// Default is `None`.
73    pub tsconfig: Option<PathBuf>,
74    /// A list of directories to resolve modules from, can be absolute path or folder name.
75    /// Default is `["node_modules"]`
76    pub modules: Vec<String>,
77    /// Same as `alias`, but only used if default resolving fails.
78    /// Default is `[]`.
79    pub fallback: Alias,
80    /// Request passed to resolve is already fully specified and
81    /// extensions or main files are not resolved for it.
82    /// Default is `false`.
83    pub fully_specified: bool,
84    /// A list of exports fields in descriptions files
85    /// Default is `[["exports"]]`.
86    pub exports_field: Vec<Vec<String>>,
87    /// A vector which maps extension to extension aliases.
88    /// Default is `[]`.
89    pub extension_alias: Vec<(String, Vec<String>)>,
90}
91
92impl Default for Options {
93    fn default() -> Self {
94        let extensions = vec![
95            String::from(".js"),
96            String::from(".json"),
97            String::from(".node"),
98        ];
99        let main_files = vec![String::from("index")];
100        let main_fields = vec![String::from("main")];
101        let description_file = String::from("package.json");
102        let alias = vec![];
103        let symlinks = true;
104        let browser_field = false;
105        let condition_names = HashSet::default();
106        let prefer_relative = false;
107        let enforce_extension = EnforceExtension::Auto;
108        let tsconfig = None;
109        let external_cache = None;
110        let resolve_to_context = false;
111        let modules = vec![String::from("node_modules")];
112        let fallback = vec![];
113        let fully_specified = false;
114        let exports_field = vec![vec![String::from("exports")]];
115        let extension_alias = vec![];
116        Self {
117            fallback,
118            modules,
119            extensions,
120            enforce_extension,
121            alias,
122            prefer_relative,
123            external_cache,
124            symlinks,
125            description_file,
126            resolve_to_context,
127            main_files,
128            main_fields,
129            browser_field,
130            condition_names,
131            tsconfig,
132            fully_specified,
133            exports_field,
134            extension_alias,
135        }
136    }
137}