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}