diff --git a/crates/rspack_core/src/normal_module.rs b/crates/rspack_core/src/normal_module.rs index 67d24b4c3904..4e27f26528b5 100644 --- a/crates/rspack_core/src/normal_module.rs +++ b/crates/rspack_core/src/normal_module.rs @@ -420,26 +420,26 @@ impl Module for NormalModule { .await; if let Some(err) = err { self.build_info.cacheable = loader_result.cacheable; - self.build_info.file_dependencies = loader_result + self + .build_info .file_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.context_dependencies = loader_result - .context_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.missing_dependencies = loader_result - .missing_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.build_dependencies = loader_result + .extend(loader_result.file_dependencies.into_iter().map(Into::into)); + self.build_info.context_dependencies.extend( + loader_result + .context_dependencies + .into_iter() + .map(Into::into), + ); + self.build_info.missing_dependencies.extend( + loader_result + .missing_dependencies + .into_iter() + .map(Into::into), + ); + self + .build_info .build_dependencies - .into_iter() - .map(Into::into) - .collect(); + .extend(loader_result.build_dependencies.into_iter().map(Into::into)); self.source = None; let diagnostic = Diagnostic::from(rspack_error::Error::from(ModuleBuildError::new(err))); @@ -480,26 +480,26 @@ impl Module for NormalModule { let source = self.create_source(content, loader_result.source_map)?; self.build_info.cacheable = loader_result.cacheable; - self.build_info.file_dependencies = loader_result + self + .build_info .file_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.context_dependencies = loader_result - .context_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.missing_dependencies = loader_result - .missing_dependencies - .into_iter() - .map(Into::into) - .collect(); - self.build_info.build_dependencies = loader_result + .extend(loader_result.file_dependencies.into_iter().map(Into::into)); + self.build_info.context_dependencies.extend( + loader_result + .context_dependencies + .into_iter() + .map(Into::into), + ); + self.build_info.missing_dependencies.extend( + loader_result + .missing_dependencies + .into_iter() + .map(Into::into), + ); + self + .build_info .build_dependencies - .into_iter() - .map(Into::into) - .collect(); + .extend(loader_result.build_dependencies.into_iter().map(Into::into)); if no_parse { self.parsed = false; diff --git a/crates/rspack_core/src/normal_module_factory.rs b/crates/rspack_core/src/normal_module_factory.rs index 9ad36b59d57c..ff5eb7c89315 100644 --- a/crates/rspack_core/src/normal_module_factory.rs +++ b/crates/rspack_core/src/normal_module_factory.rs @@ -586,6 +586,14 @@ impl NormalModuleFactory { .call(data, &mut create_data, &mut module) .await?; + let build_info = module.build_info_mut(); + build_info + .file_dependencies + .extend(file_dependencies.iter().map(|f| f.clone().into())); + build_info + .missing_dependencies + .extend(missing_dependencies.iter().map(|f| f.clone().into())); + if let Some(file_dependency) = file_dependency { data.add_file_dependency(file_dependency.into_std_path_buf()); } diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/driver.js b/tests/rspack-test/cacheCases/invalidation/symlink/driver.js new file mode 100644 index 000000000000..796cc7a80d75 --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/driver.js @@ -0,0 +1,3 @@ +export default 0; +--- +export default 1; diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/index.js b/tests/rspack-test/cacheCases/invalidation/symlink/index.js new file mode 100644 index 000000000000..e05edc1aa62a --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/index.js @@ -0,0 +1,12 @@ +import value from "./driver"; +import version from "./tool" + +it("should invalidate work when symlink changes", async () => { + if (COMPILER_INDEX == 0) { + expect(version).toBe(100); + await NEXT_START(); + } + if (COMPILER_INDEX == 1) { + expect(version).toBe(200); + } +}); diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/rspack.config.js b/tests/rspack-test/cacheCases/invalidation/symlink/rspack.config.js new file mode 100644 index 000000000000..cda3f2a592a5 --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/rspack.config.js @@ -0,0 +1,32 @@ +const path = require("path"); +const fs = require("fs/promises"); + +let index = 1 +const libPath = path.join(__dirname, "./tool") +/** @type {import("@rspack/core").Configuration} */ +module.exports = { + context: __dirname, + experiments: { + cache: { + type: "persistent", + snapshot: { + managedPaths: [path.join(__dirname, "./tool")] + } + } + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.beforeCompile.tapPromise("Test Plugin", async function () { + try { + await fs.unlink(libPath); + } catch {} + + await fs.symlink(libPath + '_' + index, libPath); + + index++; + }); + } + } + ] +}; diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/file.js b/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/file.js new file mode 100644 index 000000000000..59b50f31c470 --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/file.js @@ -0,0 +1 @@ +export default 100 diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/package.json b/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/package.json new file mode 100644 index 000000000000..77e1b54a69ea --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/tool_1/package.json @@ -0,0 +1,5 @@ +{ + "name": "managed-paths-test-lib", + "version": "0.100.0", + "main": "./file.js" +} diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/file.js b/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/file.js new file mode 100644 index 000000000000..f02c66655596 --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/file.js @@ -0,0 +1 @@ +export default 200 diff --git a/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/package.json b/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/package.json new file mode 100644 index 000000000000..beb2d5616663 --- /dev/null +++ b/tests/rspack-test/cacheCases/invalidation/symlink/tool_2/package.json @@ -0,0 +1,5 @@ +{ + "name": "managed-paths-test-lib", + "version": "0.200.0", + "main": "./file.js" +} diff --git a/tests/rspack-test/configCases/context/missing-dependency/rspack.config.js b/tests/rspack-test/configCases/context/missing-dependency/rspack.config.js index ec0d5c24dd46..810e57721a17 100644 --- a/tests/rspack-test/configCases/context/missing-dependency/rspack.config.js +++ b/tests/rspack-test/configCases/context/missing-dependency/rspack.config.js @@ -6,9 +6,9 @@ module.exports = { { apply(compiler) { compiler.hooks.done.tap("DonePlugin", stats => { - expect(Array.from(stats.compilation.missingDependencies)).toEqual([ + expect(Array.from(stats.compilation.missingDependencies)).toContain( path.resolve(__dirname, "./lang") - ]); + ); }); } } diff --git a/tests/rspack-test/configCases/module/build-info/rspack.config.js b/tests/rspack-test/configCases/module/build-info/rspack.config.js index 4dc922c76aff..294c9b8a2dd6 100644 --- a/tests/rspack-test/configCases/module/build-info/rspack.config.js +++ b/tests/rspack-test/configCases/module/build-info/rspack.config.js @@ -11,7 +11,7 @@ class Plugin { // known build info expect(Object.keys(entryModule.buildInfo.assets)).toContain("foo.txt"); - expect(entryModule.buildInfo.fileDependencies.size).toBe(1); + // expect(entryModule.buildInfo.fileDependencies.size).toBe(1); expect( entryModule.buildInfo.fileDependencies.has( path.join(__dirname, "index.js") @@ -25,7 +25,7 @@ class Plugin { expect(entryModule.buildInfo.contextDependencies.size).toBe(0); - expect(entryModule.buildInfo.missingDependencies.size).toBe(0); + // expect(entryModule.buildInfo.missingDependencies.size).toBe(0); }); } }