Skip to content

feat(@angular/build): allow enabling Bazel sandbox plugin with esbuild #30654

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

sbarfurth
Copy link

PR Checklist

Please check to confirm your PR fulfills the following requirements:

User facing documentation is intentionally omitted as this will be considered internal for now.

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

What is the current behavior?

When trying to integrate the esbuild based builder into Bazel with rules_js we found that it will incorrectly follow symlinks out of the sandbox. This is because Node.js based tooling runs in the output tree to support canonical JS project directory structures. The output tree will contain symlinks outside of the sandbox. Node tooling will generally follow these symlinks, which violates the rules of Bazel sandboxing. This can manifest in a wide variety of errors. One example we encountered with Angular compilation is that the symlinked browser entry point (e.g. main.ts) is outside of the range of tsconfig.json when the compiler follows the symlink.

Issue Number: N/A

What is the new behavior?

Setting the new ENABLE_BAZEL_SANDBOX_PLUGIN environment variable to true or 1 during a build with the esbuild based builder will now inject a special plugin to make esbuild compatible with Bazel builds in the output tree.

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

The plugin itself was originally written in https://github.com/aspect-build/rules_esbuild. The version container in this commit is a fork of https://github.com/aspect-build/rules_esbuild/blob/e4e49d3354cbf7087c47ac9c5f2e6fe7f5e398d3/esbuild/private/plugins/bazel-sandbox.js. I've adapted the JS file to TypeScript and made no further changes.

@angular-robot angular-robot bot added detected: feature PR contains a feature commit area: @angular/build labels Jul 4, 2025
@devversion devversion requested review from devversion and clydin July 4, 2025 11:46
@devversion
Copy link
Member

For additional context: This will also be useful / needed for our usages of CLI inside Bazel for e.g. angular.dev

@sbarfurth sbarfurth force-pushed the sbarfurth/bazel-sandbox-plugin branch from d584b32 to 04007f0 Compare July 4, 2025 12:24
@sbarfurth sbarfurth marked this pull request as ready for review July 4, 2025 12:47
@sbarfurth sbarfurth force-pushed the sbarfurth/bazel-sandbox-plugin branch from 04007f0 to 9283c09 Compare July 4, 2025 13:15
Setting the new `ENABLE_BAZEL_SANDBOX_PLUGIN` environment variable to `true` or `1`
during a build with the `esbuild` based builder will now inject a special plugin to
make `esbuild` compatible with Bazel builds in the output tree.

When trying to integrate the `esbuild` based builder into Bazel with `rules_js` we found
that it will incorrectly follow symlinks out of the sandbox. This is because Node.js based
tooling runs in the output tree to support canonical JS project directory structures. The
output tree will contain symlinks outside of the sandbox. Node tooling will generally
follow these symlinks, which violates the rules of Bazel sandboxing. This can manifest
in a wide variety of errors. One example we encountered with Angular compilation
is that the symlinked browser entry point (e.g. `main.ts`) is outside of the range of
`tsconfig.json` when the compiler follows the symlink.

The plugin itself was originally written in https://github.com/aspect-build/rules_esbuild.
The version container in this commit is a fork of https://github.com/aspect-build/rules_esbuild/blob/e4e49d3354cbf7087c47ac9c5f2e6fe7f5e398d3/esbuild/private/plugins/bazel-sandbox.js.
I've adapted the JS file to TypeScript and made no further changes.
@sbarfurth sbarfurth force-pushed the sbarfurth/bazel-sandbox-plugin branch from 9283c09 to f363aa0 Compare July 4, 2025 13:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: @angular/build detected: feature PR contains a feature commit
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants