Skip to content

Commit 4e840da

Browse files
committed
feat: support resolve imports fields options
1 parent ed09dd1 commit 4e840da

File tree

11 files changed

+51
-5
lines changed

11 files changed

+51
-5
lines changed

crates/node_binding/binding.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,6 +1217,7 @@ export interface RawResolveOptions {
12171217
aliasFields?: Array<string>
12181218
restrictions?: Array<string>
12191219
roots?: Array<string>
1220+
importsFields?: Array<string>
12201221
}
12211222

12221223
export interface RawResolveTsconfigOptions {

crates/rspack_binding_options/src/options/raw_resolve.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub struct RawResolveOptions {
4949
pub alias_fields: Option<Vec<String>>,
5050
pub restrictions: Option<Vec<String>>,
5151
pub roots: Option<Vec<String>>,
52+
pub imports_fields: Option<Vec<String>>,
5253
}
5354

5455
fn normalize_alias(alias: Option<Vec<RawAliasOptionItem>>) -> rspack_error::Result<Option<Alias>> {
@@ -120,6 +121,9 @@ impl TryFrom<RawResolveOptions> for Resolve {
120121
.map(|v| v.into_iter().map(|s| vec![s]).collect());
121122
let restrictions = value.restrictions;
122123
let roots = value.roots;
124+
let imports_fields = value
125+
.imports_fields
126+
.map(|v| v.into_iter().map(|s| vec![s]).collect());
123127
Ok(Resolve {
124128
modules,
125129
prefer_relative,
@@ -139,6 +143,7 @@ impl TryFrom<RawResolveOptions> for Resolve {
139143
alias_fields,
140144
restrictions,
141145
roots,
146+
imports_fields,
142147
})
143148
}
144149
}

crates/rspack_core/src/options/resolve/clever_merge.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use hashlink::LinkedHashMap;
33
use super::value_type::{GetValueType, ValueType};
44
use super::{
55
Alias, AliasFields, ConditionNames, ExportsField, ExtensionAlias, Extensions, Fallback,
6-
FullySpecified, MainFields, MainFiles, Modules, PreferAbsolute, PreferRelative, Restrictions,
7-
Roots, Symlink, TsconfigOptions,
6+
FullySpecified, ImportsFields, MainFields, MainFiles, Modules, PreferAbsolute, PreferRelative,
7+
Restrictions, Roots, Symlink, TsconfigOptions,
88
};
99
use super::{ByDependency, DependencyCategoryStr, Resolve};
1010

@@ -64,6 +64,7 @@ struct ResolveWithEntry {
6464
alias_fields: Entry<AliasFields>,
6565
restrictions: Entry<Restrictions>,
6666
roots: Entry<Roots>,
67+
imports_fields: Entry<ImportsFields>,
6768
}
6869

6970
fn parse_resolve(resolve: Resolve) -> ResolveWithEntry {
@@ -93,6 +94,7 @@ fn parse_resolve(resolve: Resolve) -> ResolveWithEntry {
9394
alias_fields: entry!(alias_fields),
9495
restrictions: entry!(restrictions),
9596
roots: entry!(roots),
97+
imports_fields: entry!(imports_fields),
9698
};
9799
let Some(by_dependency) = resolve.by_dependency else {
98100
return res;
@@ -313,6 +315,7 @@ fn _merge_resolve(first: Resolve, second: Resolve) -> Resolve {
313315
alias_fields: merge!(alias_fields, ValueType::Other, |_| false, |_, b| b),
314316
restrictions: merge!(restrictions, ValueType::Other, |_| false, |_, b| b),
315317
roots: merge!(roots, ValueType::Other, |_| false, |_, b| b),
318+
imports_fields: merge!(imports_fields, ValueType::Other, |_| false, |_, b| b),
316319
};
317320

318321
let mut by_dependency: LinkedHashMap<DependencyCategoryStr, Resolve> = LinkedHashMap::new();
@@ -376,6 +379,7 @@ fn _merge_resolve(first: Resolve, second: Resolve) -> Resolve {
376379
to_resolve!(alias_fields);
377380
to_resolve!(restrictions);
378381
to_resolve!(roots);
382+
to_resolve!(imports_fields);
379383

380384
let by_dependency = if by_dependency.iter().all(|(_, by_value)| is_empty(by_value)) {
381385
None
@@ -402,6 +406,7 @@ fn _merge_resolve(first: Resolve, second: Resolve) -> Resolve {
402406
alias_fields: result_entry.alias_fields.base,
403407
restrictions: result_entry.restrictions.base,
404408
roots: result_entry.roots.base,
409+
imports_fields: result_entry.imports_fields.base,
405410
}
406411
}
407412

crates/rspack_core/src/options/resolve/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub(super) type ExtensionAlias = Vec<(String, Vec<String>)>;
2525
pub(super) type Modules = Vec<String>;
2626
pub(super) type Roots = Vec<String>;
2727
pub(super) type Restrictions = Vec<String>;
28+
pub(super) type ImportsFields = Vec<Vec<String>>;
2829

2930
#[derive(Debug, Clone, Default, Hash, PartialEq, Eq)]
3031
pub struct Resolve {
@@ -73,7 +74,9 @@ pub struct Resolve {
7374
/// A list of directories where requests of server-relative URLs (starting with '/') are resolved
7475
pub roots: Option<Roots>,
7576
/// A list of resolve restrictions to restrict the paths that a request can be resolved on.
76-
pub restrictions: Option<Roots>,
77+
pub restrictions: Option<Restrictions>,
78+
/// Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).
79+
pub imports_fields: Option<ImportsFields>,
7780
/// Configure resolve options by the type of module request.
7881
pub by_dependency: Option<ByDependency>,
7982
}

crates/rspack_core/src/resolver/resolver_impl.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@ fn to_oxc_resolver_options(
259259
.into_iter()
260260
.map(PathBuf::from)
261261
.collect();
262+
let imports_fields = options
263+
.imports_fields
264+
.unwrap_or_else(|| vec![vec!["imports".to_string()]]);
262265
oxc_resolver::ResolveOptions {
263266
fallback,
264267
modules,
@@ -281,7 +284,7 @@ fn to_oxc_resolver_options(
281284
restrictions,
282285
roots,
283286
builtin_modules: false,
284-
imports_fields: vec![vec!["imports".to_string()]],
287+
imports_fields,
285288
}
286289
}
287290

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import d1 from "./pkg.mjs";
2+
import d2 from "#internal";
3+
import d3 from "#internal2"
4+
5+
it("imports field to resolve to the same", () => {
6+
expect(d2).toBe(d1);
7+
expect(d3).toBe(d1);
8+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "pkg",
3+
"hash-start": {
4+
"#internal": "./pkg.mjs"
5+
},
6+
"imports": {
7+
"#internal": "./index.js",
8+
"#internal2": "./pkg.mjs"
9+
}
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'pkg';
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
entry: "./index.js",
3+
resolve: {
4+
importsFields: ["hash-start", "..."]
5+
}
6+
};

packages/rspack/etc/api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ const baseResolveOptions: z.ZodObject<{
736736
aliasFields: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
737737
restrictions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
738738
roots: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
739+
importsFields: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
739740
}, "strict", z.ZodTypeAny, {
740741
alias?: Record<string, string | false | (string | false)[]> | undefined;
741742
browserField?: boolean | undefined;
@@ -759,6 +760,7 @@ const baseResolveOptions: z.ZodObject<{
759760
aliasFields?: string[] | undefined;
760761
restrictions?: string[] | undefined;
761762
roots?: string[] | undefined;
763+
importsFields?: string[] | undefined;
762764
}, {
763765
alias?: Record<string, string | false | (string | false)[]> | undefined;
764766
browserField?: boolean | undefined;
@@ -782,6 +784,7 @@ const baseResolveOptions: z.ZodObject<{
782784
aliasFields?: string[] | undefined;
783785
restrictions?: string[] | undefined;
784786
roots?: string[] | undefined;
787+
importsFields?: string[] | undefined;
785788
}>;
786789

787790
// @public (undocumented)

0 commit comments

Comments
 (0)