Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/notes/2.32.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ The `runtime_package_dependencies` of `python_test` now traverse generic `target

#### Javascript

Fixed a bug where workspace member `node_modules/` directories were excluded from the sandbox. Packages that npm places in a workspace member's `node_modules/` (e.g. due to a version conflict preventing hoisting) are now correctly available in the sandbox.

#### TypeScript

#### Go
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,11 @@ def root_dir(self) -> str:
@property
def node_modules_directories(self) -> Iterable[str]:
yield "node_modules"
if self.package and not self.project.single_workspace:
yield os.path.join(self.relative_workspace_directory(), "node_modules")
if not self.project.single_workspace:
for workspace in self.project.workspaces:
if workspace.root_dir != self.project.root_dir:
rel_dir = fast_relpath(workspace.root_dir, self.project.root_dir)
yield os.path.join(rel_dir, "node_modules")

@property
def target(self) -> Target | None:
Expand Down
37 changes: 37 additions & 0 deletions src/python/pants/backend/typescript/goals/check_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,43 @@ def test_check_javascript_enabled_via_tsconfig(
assert "Type 'number' is not assignable to type 'string'" in results.results[0].stdout


def test_typescript_check_resolves_packages_from_workspace_member_node_modules() -> None:
"""Regression test for bug: workspace member node_modules is excluded from tsc sandbox.

When an npm workspace member has a dependency that npm places in
`<member>/node_modules/<pkg>` rather than hoisting it to root `node_modules/<pkg>`
(e.g. due to a version conflict with the root), that package is absent from the
pants tsc sandbox.

In this test project, `clsx@1.2.1` is installed only at `member/node_modules/clsx`
(the lockfile explicitly does not hoist it to root, simulating a version conflict
scenario). pants runs `npm ci` from the resolve root, which correctly installs clsx
into `member/node_modules/clsx`. However, the sandbox snapshot captures only
`node_modules/` (the root), never `member/node_modules/`.
"""
rule_runner = _create_rule_runner("npm")
test_files = _load_project_test_files("workspace_member_node_modules")
rule_runner.write_files(test_files)

target = rule_runner.get_target(
Address(
"workspace_member_node_modules/member/src",
target_name="ts_sources",
relative_file_path="index.ts",
)
)
field_set = TypeScriptCheckFieldSet.create(target)
request = TypeScriptCheckRequest([field_set])
results = rule_runner.request(CheckResults, [request])

assert len(results.results) == 1
result = results.results[0]
assert result.exit_code == 0, (
f"TypeScript check failed - workspace member node_modules likely missing from sandbox.\n"
f"stdout: {result.stdout}\nstderr: {result.stderr}"
)


def test_check_javascript_disabled_via_tsconfig(
basic_rule_runner: RuleRunnerWithProjectAndPackageManager,
) -> None:
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading