Skip to content

Commit 6737fba

Browse files
authored
fix: should add file dependencies in loaderContext.resolve (#12107)
fix: should add file dependencies in loaderContext.resolve
1 parent 6d5dbd3 commit 6737fba

File tree

6 files changed

+68
-14
lines changed

6 files changed

+68
-14
lines changed

crates/rspack_binding_api/src/resolver.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use napi::{
55
bindgen_prelude::{Function, block_on},
66
};
77
use napi_derive::napi;
8-
use rspack_core::Resolver;
8+
use rspack_core::{ResolveContext, Resolver};
99
use serde::Serialize;
1010

1111
use crate::{error::ErrorCode, utils::callbackify};
@@ -18,6 +18,8 @@ pub struct ResolveRequest {
1818
pub fragment: String,
1919
pub description_file_data: Option<serde_json::Value>,
2020
pub description_file_path: Option<String>,
21+
pub file_dependencies: Vec<String>,
22+
pub missing_dependencies: Vec<String>,
2123
}
2224

2325
impl From<rspack_core::Resource> for ResolveRequest {
@@ -30,6 +32,8 @@ impl From<rspack_core::Resource> for ResolveRequest {
3032
fragment: value.fragment,
3133
description_file_data: description_file_data.map(std::sync::Arc::unwrap_or_clone),
3234
description_file_path: description_file_path.map(|path| path.to_string_lossy().into_owned()),
35+
file_dependencies: vec![],
36+
missing_dependencies: vec![],
3337
}
3438
}
3539
}
@@ -71,9 +75,23 @@ impl JsResolver {
7175
callbackify(
7276
f,
7377
async move {
74-
match resolver.resolve(Path::new(&path), &request).await {
78+
let mut resolve_context = ResolveContext::default();
79+
match resolver
80+
.resolve_with_context(Path::new(&path), &request, &mut resolve_context)
81+
.await
82+
{
7583
Ok(rspack_core::ResolveResult::Resource(resource)) => {
76-
let resolve_request = ResolveRequest::from(resource);
84+
let mut resolve_request = ResolveRequest::from(resource);
85+
resolve_request.file_dependencies = resolve_context
86+
.file_dependencies
87+
.drain()
88+
.map(|path| path.to_string_lossy().into_owned())
89+
.collect();
90+
resolve_request.missing_dependencies = resolve_context
91+
.missing_dependencies
92+
.drain()
93+
.map(|path| path.to_string_lossy().into_owned())
94+
.collect();
7795
Ok(match serde_json::to_string(&resolve_request) {
7896
Ok(json) => Either::<String, ()>::A(json),
7997
Err(_) => Either::B(()),

crates/rspack_core/src/resolver/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use sugar_path::SugarPath;
1919

2020
pub use self::{
2121
factory::{ResolveOptionsWithDependencyType, ResolverFactory},
22-
resolver_impl::{ResolveInnerError, ResolveInnerOptions, Resolver},
22+
resolver_impl::{ResolveContext, ResolveInnerError, ResolveInnerOptions, Resolver},
2323
};
2424
use crate::{
2525
Context, DependencyCategory, DependencyRange, DependencyType, ModuleIdentifier, Resolve,

packages/rspack/etc/core.api.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6092,7 +6092,17 @@ export type ResolveAlias = {
60926092
type ResolveCallback = (err: null | ErrorWithDetails, res?: string | false, req?: ResolveRequest) => void;
60936093

60946094
// @public (undocumented)
6095-
type ResolveContext = {};
6095+
type ResolveContext = {
6096+
contextDependencies?: {
6097+
add: (context: string) => void;
6098+
};
6099+
missingDependencies?: {
6100+
add: (dependency: string) => void;
6101+
};
6102+
fileDependencies?: {
6103+
add: (dependency: string) => void;
6104+
};
6105+
};
60966106

60976107
// @public (undocumented)
60986108
export type ResolveData = binding.JsResolveData;
@@ -6140,13 +6150,19 @@ class Resolver {
61406150

61416151
// @public (undocumented)
61426152
interface ResolveRequest {
6153+
// (undocumented)
6154+
contextDependencies?: string[];
61436155
// (undocumented)
61446156
descriptionFileData?: string;
61456157
// (undocumented)
61466158
descriptionFilePath?: string;
61476159
// (undocumented)
6160+
fileDependencies?: string[];
6161+
// (undocumented)
61486162
fragment: string;
61496163
// (undocumented)
6164+
missingDependencies?: string[];
6165+
// (undocumented)
61506166
path: string;
61516167
// (undocumented)
61526168
query: string;

packages/rspack/src/Resolver.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
import type binding from "@rspack/binding";
22
import type { ResolveCallback } from "./config/adapterRuleUse";
33

4-
type ResolveContext = {};
4+
export type ResolveContext = {
5+
contextDependencies?: {
6+
add: (context: string) => void;
7+
};
8+
missingDependencies?: {
9+
add: (dependency: string) => void;
10+
};
11+
fileDependencies?: {
12+
add: (dependency: string) => void;
13+
};
14+
};
515

616
export type ResourceData = binding.JsResourceData;
717

@@ -30,6 +40,9 @@ export interface ResolveRequest {
3040
fragment: string;
3141
descriptionFileData?: string;
3242
descriptionFilePath?: string;
43+
fileDependencies?: string[];
44+
missingDependencies?: string[];
45+
contextDependencies?: string[];
3346
}
3447

3548
export class Resolver {
@@ -56,6 +69,19 @@ export class Resolver {
5669
return;
5770
}
5871
const req = text ? (JSON.parse(text) as ResolveRequest) : undefined;
72+
73+
if (req?.fileDependencies) {
74+
req.fileDependencies.forEach(file => {
75+
resolveContext.fileDependencies?.add(file);
76+
});
77+
}
78+
79+
if (req?.missingDependencies) {
80+
req.missingDependencies.forEach(missing => {
81+
resolveContext.missingDependencies?.add(missing);
82+
});
83+
}
84+
5985
callback(
6086
error,
6187
req

packages/rspack/src/loader-runner/index.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
type LoaderContext
3434
} from "../config/adapterRuleUse";
3535
import { NormalModule } from "../NormalModule";
36+
import type { ResolveContext } from "../Resolver";
3637
import { NonErrorEmittedError, type RspackError } from "../RspackError";
3738
import { JavaScriptTracer } from "../trace";
3839
import {
@@ -518,24 +519,21 @@ export async function runLoaders(
518519
const getResolveContext = () => {
519520
return {
520521
fileDependencies: {
521-
// @ts-expect-error: Mocking insert-only `Set<T>`
522522
add: d => {
523523
loaderContext.addDependency(d);
524524
}
525525
},
526526
contextDependencies: {
527-
// @ts-expect-error: Mocking insert-only `Set<T>`
528527
add: d => {
529528
loaderContext.addContextDependency(d);
530529
}
531530
},
532531
missingDependencies: {
533-
// @ts-expect-error: Mocking insert-only `Set<T>`
534532
add: d => {
535533
loaderContext.addMissingDependency(d);
536534
}
537535
}
538-
};
536+
} as ResolveContext;
539537
};
540538

541539
const getResolver = memoize(() => {

tests/rspack-test/watchCases/resolve/in-loader/0/loader.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,11 @@ module.exports = function () {
44
this.resolve(this.context, "./file", (err, file) => {
55
if (err) return callback(err);
66
if (!file) return callback(new Error("Resolving failed"));
7-
// TODO: add dependencies in loaderContext.resolve
8-
this.addDependency(file);
9-
this.addMissingDependency(file.replace(".js", ""));
107

118
this.fs.readFile(file, (err, result) => {
129
if (err) return callback(err);
1310
callback(
1411
null,
15-
// `export default ${JSON.stringify(result.toString("utf-8").trim())};`
1612
`export default ${JSON.stringify(result.toString("utf-8").trim())};`
1713
);
1814
});

0 commit comments

Comments
 (0)