Skip to content

Commit dcbb66f

Browse files
fix: js/ts dependency inference with file suffix (Cherry-pick of #22041) (#22056)
# Description Its possible that we have a file like `foo.<suffix>.js`, but when importing that file on another .js file, dependency inference wasn't working. Co-authored-by: Kevin Oliveira <[email protected]>
1 parent 4140abd commit dcbb66f

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

src/python/pants/backend/javascript/dependency_inference/rules.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,13 @@ async def _prepare_inference_metadata(address: Address, file_path: str) -> Infer
161161

162162
def _add_extensions(file_imports: frozenset[str], file_extensions: tuple[str, ...]) -> PathGlobs:
163163
extensions = file_extensions + tuple(f"/index{ext}" for ext in file_extensions)
164+
valid_file_extensions = set(file_extensions)
164165
return PathGlobs(
165166
string
166167
for file_import in file_imports
167168
for string in (
168169
[file_import]
169-
if PurePath(file_import).suffix
170+
if PurePath(file_import).suffix in valid_file_extensions
170171
else [f"{file_import}{ext}" for ext in extensions]
171172
)
172173
)

src/python/pants/backend/javascript/dependency_inference/rules_test.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,31 @@ def test_infers_js_dependencies_via_config_and_extension_less_imports(
263263
assert set(addresses) == {Address("root/project/src/components", relative_file_path="index.js")}
264264

265265

266+
def test_infers_js_dependencies_with_file_suffix(rule_runner: RuleRunner) -> None:
267+
rule_runner.write_files(
268+
{
269+
"root/project/src/__generated__/BUILD": "javascript_sources()",
270+
"root/project/src/__generated__/moduleA.generated.js": "",
271+
"root/project/src/BUILD": "javascript_sources()",
272+
"root/project/src/index.js": dedent(
273+
"""\
274+
import { x } from "./__generated__/moduleA.generated";
275+
"""
276+
),
277+
}
278+
)
279+
280+
index_tgt = rule_runner.get_target(Address("root/project/src", relative_file_path="index.js"))
281+
addresses = rule_runner.request(
282+
InferredDependencies,
283+
[InferJSDependenciesRequest(JSSourceInferenceFieldSet.create(index_tgt))],
284+
).include
285+
286+
assert set(addresses) == {
287+
Address("root/project/src/__generated__", relative_file_path="moduleA.generated.js"),
288+
}
289+
290+
266291
def test_infers_js_dependencies_with_compiled_typescript_modules(rule_runner: RuleRunner) -> None:
267292
rule_runner.write_files(
268293
{

src/python/pants/backend/typescript/dependency_inference/rules_test.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,33 @@ def test_infers_typescript_file_imports_dependencies_parent_dirs(rule_runner: Ru
162162
}
163163

164164

165+
def test_infers_typescript_file_imports_dependencies_with_file_suffix(
166+
rule_runner: RuleRunner,
167+
) -> None:
168+
rule_runner.write_files(
169+
{
170+
"root/project/src/__generated__/BUILD": "typescript_sources()",
171+
"root/project/src/__generated__/moduleA.generated.ts": "",
172+
"root/project/src/BUILD": "typescript_sources()",
173+
"root/project/src/index.ts": dedent(
174+
"""\
175+
import { x } from "./__generated__/moduleA.generated";
176+
"""
177+
),
178+
}
179+
)
180+
181+
index_tgt = rule_runner.get_target(Address("root/project/src", relative_file_path="index.ts"))
182+
addresses = rule_runner.request(
183+
InferredDependencies,
184+
[InferTypeScriptDependenciesRequest(TypeScriptSourceInferenceFieldSet.create(index_tgt))],
185+
).include
186+
187+
assert set(addresses) == {
188+
Address("root/project/src/__generated__", relative_file_path="moduleA.generated.ts"),
189+
}
190+
191+
165192
def test_unmatched_ts_dependencies_error_unowned_behaviour(rule_runner: RuleRunner) -> None:
166193
rule_runner.set_options(["--nodejs-infer-unowned-dependency-behavior=error"])
167194
rule_runner.write_files(

0 commit comments

Comments
 (0)