From dcbb66faac933a97f8f48999e2806ad4ac3c1799 Mon Sep 17 00:00:00 2001 From: "Worker Pants (Pantsbuild GitHub Automation Bot)" <133242086+WorkerPants@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:30:14 -0800 Subject: [PATCH] fix: js/ts dependency inference with file suffix (Cherry-pick of #22041) (#22056) # Description Its possible that we have a file like `foo..js`, but when importing that file on another .js file, dependency inference wasn't working. Co-authored-by: Kevin Oliveira --- .../javascript/dependency_inference/rules.py | 3 ++- .../dependency_inference/rules_test.py | 25 +++++++++++++++++ .../dependency_inference/rules_test.py | 27 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/python/pants/backend/javascript/dependency_inference/rules.py b/src/python/pants/backend/javascript/dependency_inference/rules.py index c90afa5bb11..040458aa9ba 100644 --- a/src/python/pants/backend/javascript/dependency_inference/rules.py +++ b/src/python/pants/backend/javascript/dependency_inference/rules.py @@ -161,12 +161,13 @@ async def _prepare_inference_metadata(address: Address, file_path: str) -> Infer def _add_extensions(file_imports: frozenset[str], file_extensions: tuple[str, ...]) -> PathGlobs: extensions = file_extensions + tuple(f"/index{ext}" for ext in file_extensions) + valid_file_extensions = set(file_extensions) return PathGlobs( string for file_import in file_imports for string in ( [file_import] - if PurePath(file_import).suffix + if PurePath(file_import).suffix in valid_file_extensions else [f"{file_import}{ext}" for ext in extensions] ) ) diff --git a/src/python/pants/backend/javascript/dependency_inference/rules_test.py b/src/python/pants/backend/javascript/dependency_inference/rules_test.py index 327f85c6528..3f2971bb62c 100644 --- a/src/python/pants/backend/javascript/dependency_inference/rules_test.py +++ b/src/python/pants/backend/javascript/dependency_inference/rules_test.py @@ -263,6 +263,31 @@ def test_infers_js_dependencies_via_config_and_extension_less_imports( assert set(addresses) == {Address("root/project/src/components", relative_file_path="index.js")} +def test_infers_js_dependencies_with_file_suffix(rule_runner: RuleRunner) -> None: + rule_runner.write_files( + { + "root/project/src/__generated__/BUILD": "javascript_sources()", + "root/project/src/__generated__/moduleA.generated.js": "", + "root/project/src/BUILD": "javascript_sources()", + "root/project/src/index.js": dedent( + """\ + import { x } from "./__generated__/moduleA.generated"; + """ + ), + } + ) + + index_tgt = rule_runner.get_target(Address("root/project/src", relative_file_path="index.js")) + addresses = rule_runner.request( + InferredDependencies, + [InferJSDependenciesRequest(JSSourceInferenceFieldSet.create(index_tgt))], + ).include + + assert set(addresses) == { + Address("root/project/src/__generated__", relative_file_path="moduleA.generated.js"), + } + + def test_infers_js_dependencies_with_compiled_typescript_modules(rule_runner: RuleRunner) -> None: rule_runner.write_files( { diff --git a/src/python/pants/backend/typescript/dependency_inference/rules_test.py b/src/python/pants/backend/typescript/dependency_inference/rules_test.py index dafb3ed9b57..80ccc9ea679 100644 --- a/src/python/pants/backend/typescript/dependency_inference/rules_test.py +++ b/src/python/pants/backend/typescript/dependency_inference/rules_test.py @@ -162,6 +162,33 @@ def test_infers_typescript_file_imports_dependencies_parent_dirs(rule_runner: Ru } +def test_infers_typescript_file_imports_dependencies_with_file_suffix( + rule_runner: RuleRunner, +) -> None: + rule_runner.write_files( + { + "root/project/src/__generated__/BUILD": "typescript_sources()", + "root/project/src/__generated__/moduleA.generated.ts": "", + "root/project/src/BUILD": "typescript_sources()", + "root/project/src/index.ts": dedent( + """\ + import { x } from "./__generated__/moduleA.generated"; + """ + ), + } + ) + + index_tgt = rule_runner.get_target(Address("root/project/src", relative_file_path="index.ts")) + addresses = rule_runner.request( + InferredDependencies, + [InferTypeScriptDependenciesRequest(TypeScriptSourceInferenceFieldSet.create(index_tgt))], + ).include + + assert set(addresses) == { + Address("root/project/src/__generated__", relative_file_path="moduleA.generated.ts"), + } + + def test_unmatched_ts_dependencies_error_unowned_behaviour(rule_runner: RuleRunner) -> None: rule_runner.set_options(["--nodejs-infer-unowned-dependency-behavior=error"]) rule_runner.write_files(