From 4488c9ff72efc4052fc338fc9fd28a1bad19fd1d Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Thu, 30 Jan 2025 07:22:23 -0800 Subject: [PATCH 01/14] chore: fix locale spam? (#2079) --- npm/private/npm_package_store.bzl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npm/private/npm_package_store.bzl b/npm/private/npm_package_store.bzl index 8962dc1d7..f0bb8a309 100644 --- a/npm/private/npm_package_store.bzl +++ b/npm/private/npm_package_store.bzl @@ -245,8 +245,9 @@ def _npm_package_store_impl(ctx): # Workaround https://github.com/bazelbuild/bazel-central-registry/issues/2256 # Always override the locale to give better hermeticity. # See https://github.com/bazelbuild/rules_java/blob/767e4410850453a10ccf89aa1cededf9de05c72e/toolchains/utf8_environment.bzl + # and https://github.com/libarchive/libarchive/blob/65196fdd1a385f22114f245a9002ee8dc899f2c4/tar/bsdtar.c#L192 env = { - "LC_CTYPE": + "LC_ALL": # # macOS doesn't have the C.UTF-8 locale, but en_US.UTF-8 is available and works the same way. "en_US.UTF-8" if is_macos else # The default UTF-8 locale on all recent Linux distributions. It is also available in Cygwin and MSYS2. From a365f472448d966f153d68f5e1e71df3145edc73 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Wed, 5 Feb 2025 19:29:29 +0100 Subject: [PATCH 02/14] fix: use Label.repo_name instead of Label.workspace_name (#2082) According to the documentation, Label.workspace_name is deprecated: https://bazel.build/rules/lib/builtins/Label.html#workspace_name Label.repo_name behaves identically and is available in Bazel 6 and later. --- js/private/js_binary.bzl | 2 +- js/private/js_helpers.bzl | 6 +++--- js/private/js_image_layer.bzl | 4 ++-- npm/extensions.bzl | 4 ++-- npm/private/npm_link_package_store.bzl | 6 +++--- npm/private/npm_package_store.bzl | 20 ++++++++++---------- npm/private/npm_translate_lock_state.bzl | 2 +- npm/private/repository_label_store.bzl | 8 ++++---- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/js/private/js_binary.bzl b/js/private/js_binary.bzl index bf94c5c35..1d4044c33 100644 --- a/js/private/js_binary.bzl +++ b/js/private/js_binary.bzl @@ -376,7 +376,7 @@ def _bash_launcher(ctx, nodeinfo, entry_point_path, log_prefix_rule_set, log_pre "JS_BINARY__PACKAGE": ctx.label.package, "JS_BINARY__TARGET_NAME": ctx.label.name, "JS_BINARY__TARGET": "{}//{}:{}".format( - "@" + ctx.label.workspace_name if ctx.label.workspace_name else "", + "@" + ctx.label.repo_name if ctx.label.repo_name else "", ctx.label.package, ctx.label.name, ), diff --git a/js/private/js_helpers.bzl b/js/private/js_helpers.bzl index 39d22e6dd..5b4406ce1 100644 --- a/js/private/js_helpers.bzl +++ b/js/private/js_helpers.bzl @@ -75,7 +75,7 @@ def gather_npm_package_store_infos(targets): return depset(transitive = npm_package_store_infos) def copy_js_file_to_bin_action(ctx, file): - if ctx.label.workspace_name != file.owner.workspace_name or ctx.label.package != file.owner.package: + if ctx.label.repo_name != file.owner.repo_name or ctx.label.package != file.owner.package: msg = """ Expected to find source file {file_basename} in '{this_package}', but instead it is in '{file_package}'. @@ -101,9 +101,9 @@ this option is not needed. """.format( file_basename = file.basename, - file_package = "%s//%s" % (file.owner.workspace_name, file.owner.package), + file_package = "%s//%s" % (file.owner.repo_name, file.owner.package), new_target_name = file.basename.replace(".", "_"), - this_package = "%s//%s" % (ctx.label.workspace_name, ctx.label.package), + this_package = "%s//%s" % (ctx.label.repo_name, ctx.label.package), this_target = ctx.label, ) fail(msg) diff --git a/js/private/js_image_layer.bzl b/js/private/js_image_layer.bzl index 5ed6f84cb..a0caa6b48 100644 --- a/js/private/js_image_layer.bzl +++ b/js/private/js_image_layer.bzl @@ -310,7 +310,7 @@ def _build_layer(ctx, type, all_entries_json, entries, inputs): return output def _select_layer(layers, destination, file): - is_node = file.owner.workspace_name != "" and "/bin/nodejs/" in destination + is_node = file.owner.repo_name != "" and "/bin/nodejs/" in destination is_js_patches = "/js/private/node-patches" in destination if is_node or is_js_patches: return layers.node @@ -382,7 +382,7 @@ def _js_image_layer_impl(ctx): entry = { "dest": file.path, "root": file.root.path, - "is_external": file.owner.workspace_name != "", + "is_external": file.owner.repo_name != "", "is_source": file.is_source, "is_directory": file.is_directory, } diff --git a/npm/extensions.bzl b/npm/extensions.bzl index 5d07b3ef4..62dea7938 100644 --- a/npm/extensions.bzl +++ b/npm/extensions.bzl @@ -148,8 +148,8 @@ WARNING: Cannot determine home directory in order to load home `.npmrc` file in lifecycle_hooks_execution_requirements = i.lifecycle_hooks_execution_requirements, lifecycle_hooks_use_default_shell_env = i.lifecycle_hooks_use_default_shell_env, link_packages = i.link_packages, - # attr.pnpm_lock.workspace_name is a canonical repository name, so it needs to be qualified with an extra '@'. - link_workspace = attr.link_workspace if attr.link_workspace else "@" + attr.pnpm_lock.workspace_name, + # attr.pnpm_lock.repo_name is a canonical repository name, so it needs to be qualified with an extra '@'. + link_workspace = attr.link_workspace if attr.link_workspace else "@" + attr.pnpm_lock.repo_name, npm_auth = i.npm_auth, npm_auth_basic = i.npm_auth_basic, npm_auth_password = i.npm_auth_password, diff --git a/npm/private/npm_link_package_store.bzl b/npm/private/npm_link_package_store.bzl index f503c08a7..a565aaa48 100644 --- a/npm/private/npm_link_package_store.bzl +++ b/npm/private/npm_link_package_store.bzl @@ -67,10 +67,10 @@ def _npm_link_package_store_impl(ctx): if not package_store_directory: fail("src must be a npm_link_package that provides a package_store_directory") - if package_store_directory.owner.workspace_name != ctx.label.workspace_name: + if package_store_directory.owner.repo_name != ctx.label.repo_name: msg = "expected package_store_directory to be in the same workspace as the link target '{}' but found '{}'".format( - ctx.label.workspace_name, - package_store_directory.owner.workspace_name, + ctx.label.repo_name, + package_store_directory.owner.repo_name, ) fail(msg) diff --git a/npm/private/npm_package_store.bzl b/npm/private/npm_package_store.bzl index f0bb8a309..1bb1c0006 100644 --- a/npm/private/npm_package_store.bzl +++ b/npm/private/npm_package_store.bzl @@ -202,10 +202,10 @@ def _npm_package_store_impl(ctx): npm_pkg_info = ctx.attr.src[NpmPackageInfo] # output the package as a TreeArtifact to its package store location - if ctx.label.workspace_name and ctx.label.package: - expected_short_path = "../{}/{}/{}".format(ctx.label.workspace_name, ctx.label.package, package_store_directory_path) - elif ctx.label.workspace_name: - expected_short_path = "../{}/{}".format(ctx.label.workspace_name, package_store_directory_path) + if ctx.label.repo_name and ctx.label.package: + expected_short_path = "../{}/{}/{}".format(ctx.label.repo_name, ctx.label.package, package_store_directory_path) + elif ctx.label.repo_name: + expected_short_path = "../{}/{}".format(ctx.label.repo_name, package_store_directory_path) elif ctx.label.package: expected_short_path = "{}/{}".format(ctx.label.package, package_store_directory_path) else: @@ -308,18 +308,18 @@ deps of npm_package_store must be in the same package.""" % (ctx.label.package, jsinfo = ctx.attr.src[JsInfo] # Symlink to the directory of the target that created this JsInfo - if ctx.label.workspace_name and ctx.label.package: - symlink_path = "external/{}/{}/{}".format(ctx.label.workspace_name, ctx.label.package, package_store_directory_path) - elif ctx.label.workspace_name: - symlink_path = "external/{}/{}".format(ctx.label.workspace_name, package_store_directory_path) + if ctx.label.repo_name and ctx.label.package: + symlink_path = "external/{}/{}/{}".format(ctx.label.repo_name, ctx.label.package, package_store_directory_path) + elif ctx.label.repo_name: + symlink_path = "external/{}/{}".format(ctx.label.repo_name, package_store_directory_path) else: symlink_path = package_store_directory_path # The package JsInfo including all direct and transitive sources, store info etc. js_infos.append(jsinfo) - if jsinfo.target.workspace_name: - target_path = "{}/external/{}/{}".format(ctx.bin_dir.path, jsinfo.target.workspace_name, jsinfo.target.package) + if jsinfo.target.repo_name: + target_path = "{}/external/{}/{}".format(ctx.bin_dir.path, jsinfo.target.repo_name, jsinfo.target.package) else: target_path = "{}/{}".format(ctx.bin_dir.path, jsinfo.target.package) package_store_directory = utils.make_symlink(ctx, symlink_path, target_path) diff --git a/npm/private/npm_translate_lock_state.bzl b/npm/private/npm_translate_lock_state.bzl index e629ccf9b..755776cb6 100644 --- a/npm/private/npm_translate_lock_state.bzl +++ b/npm/private/npm_translate_lock_state.bzl @@ -188,7 +188,7 @@ def _init_importer_labels(priv, label_store): ################################################################################ def _init_link_workspace(priv, _, attr, label_store): # initialize link_workspace either from pnpm_lock label or from override - priv["link_workspace"] = attr.link_workspace if attr.link_workspace else label_store.label("pnpm_lock").workspace_name + priv["link_workspace"] = attr.link_workspace if attr.link_workspace else label_store.label("pnpm_lock").repo_name ################################################################################ def _init_external_repository_action_cache(priv, attr): diff --git a/npm/private/repository_label_store.bzl b/npm/private/repository_label_store.bzl index ec4b27477..011d5b0cd 100644 --- a/npm/private/repository_label_store.bzl +++ b/npm/private/repository_label_store.bzl @@ -15,13 +15,13 @@ def _make_sibling_label(sibling_label, path): dirname = paths.dirname(sibling_label.name) if path.startswith("../"): # we have no idea what package this sibling is in so just assume the root package which works for repository rules - return Label("@@{}//:{}".format(sibling_label.workspace_name, paths.normalize(paths.join(sibling_label.package, dirname, path)))) + return Label("@@{}//:{}".format(sibling_label.repo_name, paths.normalize(paths.join(sibling_label.package, dirname, path)))) else: - return Label("@@{}//{}:{}".format(sibling_label.workspace_name, sibling_label.package, paths.join(dirname, path))) + return Label("@@{}//{}:{}".format(sibling_label.repo_name, sibling_label.package, paths.join(dirname, path))) ################################################################################ def _seed_root(priv, rctx_path, label): - if priv["root"] and label.workspace_name != priv["root"]["workspace"]: + if priv["root"] and label.repo_name != priv["root"]["workspace"]: fail("cannot seed_root twice with different workspaces") if priv["root"]: # already seed_rooted with the same workspace @@ -29,7 +29,7 @@ def _seed_root(priv, rctx_path, label): seed_root_path = str(rctx_path(label)) seed_root_depth = len(paths.join(label.package, label.name).split("/")) priv["root"] = { - "workspace": label.workspace_name, + "workspace": label.repo_name, "path": "/".join(seed_root_path.split("/")[:-seed_root_depth]), } From ef8e187423bcb520641aa6d0183fafd3b342c607 Mon Sep 17 00:00:00 2001 From: Mihail Vratchanski Date: Thu, 6 Feb 2025 20:31:15 +0200 Subject: [PATCH 03/14] feat: add exclude patterns for npm packages (#2078) ### Changes are visible to end-users: yes - Searched for relevant documentation and updated as needed: yes - Breaking change (forces users to change their own code or config): no - Suggested release notes appear below: yes Add `npm_translate_lock(exclude_package_contents)` and `npm_import(exclude_package_contents)` for excluding content when extracting packages. ### Test plan - New test added: e2e/package_exclude_patterns Resolves: https://github.com/aspect-build/rules_js/issues/2042 --- .github/workflows/ci.yaml | 1 + MODULE.bazel | 3 ++ WORKSPACE | 3 ++ docs/npm_import.md | 4 ++- docs/npm_translate_lock.md | 17 +++++----- .../bzlmod/segfault-handler_defs.bzl | 5 +++ .../snapshots/wksp/segfault-handler_defs.bzl | 5 +++ .../snapshots/aspect_test_c_links_defs.bzl | 3 ++ .../.bazelignore | 1 + .../.bazeliskrc | 1 + .../.bazelrc | 15 +++++++++ .../.bazelversion | 1 + .../.npmrc | 4 +++ .../BUILD.bazel | 11 +++++++ .../MODULE.bazel | 26 ++++++++++++++++ .../WORKSPACE | 28 +++++++++++++++++ .../WORKSPACE.bzlmod | 2 ++ .../is-odd-exclude-test.sh | 24 ++++++++++++++ .../package.json | 8 +++++ .../pnpm-lock.yaml | 31 +++++++++++++++++++ .../pnpm-workspace.yaml | 2 ++ .../v54/snapshots/rollup_links_defs.bzl | 3 ++ .../v60/snapshots/rollup_links_defs.bzl | 3 ++ .../v61/snapshots/rollup_links_defs.bzl | 3 ++ .../v90/snapshots/rollup_links_defs.bzl | 3 ++ npm/extensions.bzl | 2 ++ npm/private/npm_import.bzl | 23 +++++++++++++- npm/private/npm_package_store.bzl | 8 +++++ npm/private/npm_translate_lock.bzl | 26 +++++++++++++--- npm/private/npm_translate_lock_generate.bzl | 5 ++- npm/private/npm_translate_lock_helpers.bzl | 4 +++ .../snapshots/bzlmod/fsevents_links_defs.bzl | 5 +++ .../snapshots/bzlmod/rollup_links_defs.bzl | 3 ++ .../snapshots/bzlmod/unused_links_defs.bzl | 3 ++ .../snapshots/wksp/fsevents_links_defs.bzl | 5 +++ .../test/snapshots/wksp/repositories.bzl | 4 +++ .../test/snapshots/wksp/rollup_links_defs.bzl | 3 ++ .../test/snapshots/wksp/unused_links_defs.bzl | 3 ++ 38 files changed, 285 insertions(+), 16 deletions(-) create mode 100644 e2e/npm_translate_lock_exclude_package_contents/.bazelignore create mode 120000 e2e/npm_translate_lock_exclude_package_contents/.bazeliskrc create mode 100644 e2e/npm_translate_lock_exclude_package_contents/.bazelrc create mode 120000 e2e/npm_translate_lock_exclude_package_contents/.bazelversion create mode 100644 e2e/npm_translate_lock_exclude_package_contents/.npmrc create mode 100644 e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel create mode 100644 e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel create mode 100644 e2e/npm_translate_lock_exclude_package_contents/WORKSPACE create mode 100644 e2e/npm_translate_lock_exclude_package_contents/WORKSPACE.bzlmod create mode 100755 e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh create mode 100644 e2e/npm_translate_lock_exclude_package_contents/package.json create mode 100644 e2e/npm_translate_lock_exclude_package_contents/pnpm-lock.yaml create mode 100644 e2e/npm_translate_lock_exclude_package_contents/pnpm-workspace.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a7117f584..abf0a8344 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -54,6 +54,7 @@ jobs: e2e/npm_translate_lock_subdir_patch e2e/npm_translate_package_lock e2e/npm_translate_yarn_lock + e2e/npm_translate_lock_exclude_package_contents e2e/package_json_module e2e/patch_from_repo e2e/pnpm_lockfiles diff --git a/MODULE.bazel b/MODULE.bazel index 90f247fe4..a4bee49ed 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -152,6 +152,9 @@ npm.npm_translate_lock( "//npm/private/test/vendored/is-odd:package.json", "//npm/private/test/vendored/semver-max:package.json", ], + exclude_package_contents = { + "chalk": ["**/README*"], + }, generate_bzl_library_targets = True, lifecycle_hooks = { # We fetch @kubernetes/client-node from source and it has a `prepare` lifecycle hook that needs to be run diff --git a/WORKSPACE b/WORKSPACE index fade153c2..5e746b051 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -91,6 +91,9 @@ npm_translate_lock( "//npm/private/test/vendored/is-odd:package.json", "//npm/private/test/vendored/semver-max:package.json", ], + exclude_package_contents = { + "chalk": ["**/README*"], + }, generate_bzl_library_targets = True, lifecycle_hooks = { # We fetch @kubernetes/client-node from source and it has a `prepare` lifecycle hook that needs to be run diff --git a/docs/npm_import.md b/docs/npm_import.md index 98342fb38..e493440dd 100644 --- a/docs/npm_import.md +++ b/docs/npm_import.md @@ -26,7 +26,8 @@ npm_import(name, pa link_workspace, link_packages, lifecycle_hooks, lifecycle_hooks_execution_requirements, lifecycle_hooks_env, lifecycle_hooks_use_default_shell_env, integrity, url, commit, replace_package, package_visibility, patch_tool, patch_args, patches, custom_postinstall, - npm_auth, npm_auth_basic, npm_auth_username, npm_auth_password, bins, dev, kwargs) + npm_auth, npm_auth_basic, npm_auth_username, npm_auth_password, bins, dev, + exclude_package_contents, kwargs) Import a single npm package into Bazel. @@ -159,6 +160,7 @@ Read more about the downloader config: npm_auth_password | Auth password to authenticate with npm. When using Basic authentication. | `""` | | bins | Dictionary of `node_modules/.bin` binary files to create mapped to their node entry points.

This is typically derived from the "bin" attribute in the package.json file of the npm package being linked.

For example:

bins = {
    "foo": "./foo.js",
    "bar": "./bar.js",
}


In the future, this field may be automatically populated by npm_translate_lock from information in the pnpm lock file. That feature is currently blocked on https://github.com/pnpm/pnpm/issues/5131. | `{}` | | dev | Whether this npm package is a dev dependency | `False` | +| exclude_package_contents | List of glob patterns to exclude from the linked package.

This is useful for excluding files that are not needed in the linked package.

For example:

exclude_package_contents = ["**/tests/**"]
| `[]` | | kwargs | Internal use only | none | diff --git a/docs/npm_translate_lock.md b/docs/npm_translate_lock.md index a7af8aeb8..f93f57cf5 100644 --- a/docs/npm_translate_lock.md +++ b/docs/npm_translate_lock.md @@ -31,7 +31,7 @@ Advanced users may want to directly fetch a package from npm rather than start f ## list_patches
-list_patches(name, out, include_patterns, exclude_patterns)
+list_patches(name, out, include_patterns, exclude_package_contents)
 
Write a file containing a list of all patches in the current folder to the source tree. @@ -49,7 +49,7 @@ file stays up to date. | name | Name of the target | none | | out | Name of file to write to the source tree. If unspecified, `name` is used | `None` | | include_patterns | Patterns to pass to a glob of patch files | `["*.diff", "*.patch"]` | -| exclude_patterns | Patterns to ignore in a glob of patch files | `[]` | +| exclude_package_contents | Patterns to ignore in a glob of patch files | `[]` | @@ -59,12 +59,12 @@ file stays up to date.
 npm_translate_lock(name, pnpm_lock, npm_package_lock, yarn_lock, update_pnpm_lock,
                    node_toolchain_prefix, yq_toolchain_prefix, preupdate, npmrc, use_home_npmrc, data,
-                   patches, patch_tool, patch_args, custom_postinstalls, package_visibility, prod,
-                   public_hoist_packages, dev, no_optional, run_lifecycle_hooks, lifecycle_hooks,
-                   lifecycle_hooks_envs, lifecycle_hooks_exclude,
-                   lifecycle_hooks_execution_requirements, lifecycle_hooks_no_sandbox,
-                   lifecycle_hooks_use_default_shell_env, replace_packages, bins,
-                   verify_node_modules_ignored, verify_patches, quiet,
+                   patches, exclude_package_contents, patch_tool, patch_args, custom_postinstalls,
+                   package_visibility, prod, public_hoist_packages, dev, no_optional,
+                   run_lifecycle_hooks, lifecycle_hooks, lifecycle_hooks_envs,
+                   lifecycle_hooks_exclude, lifecycle_hooks_execution_requirements,
+                   lifecycle_hooks_no_sandbox, lifecycle_hooks_use_default_shell_env,
+                   replace_packages, bins, verify_node_modules_ignored, verify_patches, quiet,
                    external_repository_action_cache, link_workspace, pnpm_version, use_pnpm,
                    npm_package_target_name, kwargs)
 
@@ -107,6 +107,7 @@ For more about how to use npm_translate_lock, read [pnpm and rules_js](/docs/pnp | use_home_npmrc | Use the `$HOME/.npmrc` file (or `$USERPROFILE/.npmrc` when on Windows) if it exists.

Settings from home `.npmrc` are merged with settings loaded from the `.npmrc` file specified in the `npmrc` attribute, if any. Where there are conflicting settings, the home `.npmrc` values will take precedence.

WARNING: The repository rule will not be invalidated by changes to the home `.npmrc` file since there is no way to specify this file as an input to the repository rule. If changes are made to the home `.npmrc` you can force the repository rule to re-run and pick up the changes by running: `bazel run @{name}//:sync` where `name` is the name of the `npm_translate_lock` you want to re-run.

Because of the repository rule invalidation issue, using the home `.npmrc` is not recommended. `.npmrc` settings should generally go in the `npmrc` in your repository so they are shared by all developers. The home `.npmrc` should be reserved for authentication settings for private npm repositories. | `None` | | data | Data files required by this repository rule when auto-updating the pnpm lock file.

Only needed when `update_pnpm_lock` is True. Read more: [using update_pnpm_lock](/docs/pnpm.md#update_pnpm_lock) | `[]` | | patches | A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") to a label list of patches to apply to the downloaded npm package. Multiple matches are additive.

These patches are applied after any patches in [pnpm.patchedDependencies](https://pnpm.io/next/package_json#pnpmpatcheddependencies).

Read more: [patching](/docs/pnpm.md#patching) | `{}` | +| exclude_package_contents | A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") to a list of patterns to exclude from the package's generated node_modules link targets. Multiple matches are additive.

Versions must match if used.

For example,

exclude_package_contents = {
    "@foo/bar": ["**/test/**"],
    "@foo/car@2.0.0": ["**/README*"],
},
| `{}` | | patch_tool | The patch tool to use. If not specified, the `patch` from `PATH` is used. | `None` | | patch_args | A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") to a label list arguments to pass to the patch tool. The most specific match wins.

Read more: [patching](/docs/pnpm.md#patching) | `{"*": ["-p0"]}` | | custom_postinstalls | A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") to a custom postinstall script to apply to the downloaded npm package after its lifecycle scripts runs. If the version is left out of the package name, the script will run on every version of the npm package. If a custom postinstall scripts exists for a package as well as for a specific version, the script for the versioned package will be appended with `&&` to the non-versioned package script.

For example,

custom_postinstalls = {
    "@foo/bar": "echo something > somewhere.txt",
    "fum@0.0.1": "echo something_else > somewhere_else.txt",
},


Custom postinstalls are additive and joined with ` && ` when there are multiple matches for a package. More specific matches are appended to previous matches. | `{}` | diff --git a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl index 10a939883..456d411c9 100644 --- a/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl +++ b/e2e/gyp_no_install_script/snapshots/bzlmod/segfault-handler_defs.bzl @@ -139,6 +139,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -149,6 +150,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if True else "@@aspect_rules_js~~npm~npm__segfault-handler__1.3.0//:pkg", package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -160,6 +162,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~npm__segfault-handler__1.3.0//:pkg", package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], @@ -284,6 +287,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc_lite".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -294,6 +298,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = lc_deps, tags = ["manual"], diff --git a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl index c77757dd1..b6936c2d0 100644 --- a/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl +++ b/e2e/gyp_no_install_script/snapshots/wksp/segfault-handler_defs.bzl @@ -139,6 +139,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -149,6 +150,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if True else "@@npm__segfault-handler__1.3.0//:pkg", package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -160,6 +162,7 @@ def npm_imported_package_store(name): src = None if True else "@@npm__segfault-handler__1.3.0//:pkg", package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], @@ -284,6 +287,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc_lite".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -294,6 +298,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc".format(store_target_name), package = "segfault-handler", version = "1.3.0", + exclude_package_contents = [], dev = False, deps = lc_deps, tags = ["manual"], diff --git a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl index 0d10d069b..aa8978d52 100644 --- a/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl +++ b/e2e/npm_translate_lock_disable_hooks/snapshots/aspect_test_c_links_defs.bzl @@ -32,6 +32,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "@aspect-test/c", version = "2.0.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -42,6 +43,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~npm__at_aspect-test_c__2.0.0//:pkg", package = "@aspect-test/c", version = "2.0.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -53,6 +55,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~npm__at_aspect-test_c__2.0.0//:pkg", package = "@aspect-test/c", version = "2.0.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], diff --git a/e2e/npm_translate_lock_exclude_package_contents/.bazelignore b/e2e/npm_translate_lock_exclude_package_contents/.bazelignore new file mode 100644 index 000000000..b512c09d4 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/.bazelignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/e2e/npm_translate_lock_exclude_package_contents/.bazeliskrc b/e2e/npm_translate_lock_exclude_package_contents/.bazeliskrc new file mode 120000 index 000000000..0fbe20ff6 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/.bazeliskrc @@ -0,0 +1 @@ +../../.bazeliskrc \ No newline at end of file diff --git a/e2e/npm_translate_lock_exclude_package_contents/.bazelrc b/e2e/npm_translate_lock_exclude_package_contents/.bazelrc new file mode 100644 index 000000000..413c99502 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/.bazelrc @@ -0,0 +1,15 @@ +# Import Aspect bazelrc presets +try-import %workspace%/../../.aspect/bazelrc/bazel7.bazelrc +import %workspace%/../../.aspect/bazelrc/convenience.bazelrc +import %workspace%/../../.aspect/bazelrc/correctness.bazelrc +import %workspace%/../../.aspect/bazelrc/debug.bazelrc +import %workspace%/../../.aspect/bazelrc/javascript.bazelrc +import %workspace%/../../.aspect/bazelrc/performance.bazelrc + +### YOUR PROJECT SPECIFIC OPTIONS GO HERE ### + +# Load any settings & overrides specific to the current user from `.aspect/bazelrc/user.bazelrc`. +# This file should appear in `.gitignore` so that settings are not shared with team members. This +# should be last statement in this config so the user configuration is able to overwrite flags from +# this file. See https://bazel.build/configure/best-practices#bazelrc-file. +try-import %workspace%/../../.aspect/bazelrc/user.bazelrc diff --git a/e2e/npm_translate_lock_exclude_package_contents/.bazelversion b/e2e/npm_translate_lock_exclude_package_contents/.bazelversion new file mode 120000 index 000000000..96cf94962 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/.bazelversion @@ -0,0 +1 @@ +../../.bazelversion \ No newline at end of file diff --git a/e2e/npm_translate_lock_exclude_package_contents/.npmrc b/e2e/npm_translate_lock_exclude_package_contents/.npmrc new file mode 100644 index 000000000..5de6efae1 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/.npmrc @@ -0,0 +1,4 @@ +# Disabling pnpm [hoisting](https://pnpm.io/npmrc#hoist) by setting `hoist=false` is recommended on +# projects using rules_js so that pnpm outside of Bazel lays out a node_modules tree similar to what +# rules_js lays out under Bazel (without a hidden node_modules/.pnpm/node_modules) +hoist=false diff --git a/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel b/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel new file mode 100644 index 000000000..e895be1da --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/BUILD.bazel @@ -0,0 +1,11 @@ +load("@npm//:defs.bzl", "npm_link_all_packages") + +npm_link_all_packages(name = "node_modules") + +sh_test( + name = "test_sh", + srcs = ["is-odd-exclude-test.sh"], + data = [ + ":node_modules/is-odd", + ], +) diff --git a/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel b/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel new file mode 100644 index 000000000..e64d82039 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/MODULE.bazel @@ -0,0 +1,26 @@ +bazel_dep(name = "aspect_rules_js", version = "0.0.0", dev_dependency = True) +local_path_override( + module_name = "aspect_rules_js", + path = "../..", +) + +bazel_dep(name = "aspect_bazel_lib", version = "2.7.7", dev_dependency = True) +bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) +bazel_dep(name = "platforms", version = "0.0.9", dev_dependency = True) + +npm = use_extension( + "@aspect_rules_js//npm:extensions.bzl", + "npm", + dev_dependency = True, +) +npm.npm_translate_lock( + name = "npm", + data = ["//:package.json"], + exclude_package_contents = { + "is-odd@3.0.1": ["**/README*"], + }, + npmrc = "//:.npmrc", + pnpm_lock = "//:pnpm-lock.yaml", + verify_node_modules_ignored = "//:.bazelignore", +) +use_repo(npm, "npm") diff --git a/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE new file mode 100644 index 000000000..5ea667491 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE @@ -0,0 +1,28 @@ +local_repository( + name = "aspect_rules_js", + path = "../..", +) + +load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") + +rules_js_dependencies() + +load("@aspect_rules_js//js:toolchains.bzl", "DEFAULT_NODE_VERSION", "rules_js_register_toolchains") + +rules_js_register_toolchains(node_version = DEFAULT_NODE_VERSION) + +load("@aspect_rules_js//npm:repositories.bzl", "npm_translate_lock") + +npm_translate_lock( + name = "npm", + exclude_package_contents = { + "is-odd@3.0.1": ["**/README*"], + }, + npmrc = "//:.npmrc", + pnpm_lock = "//:pnpm-lock.yaml", + verify_node_modules_ignored = "//:.bazelignore", +) + +load("@npm//:repositories.bzl", "npm_repositories") + +npm_repositories() diff --git a/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE.bzlmod b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE.bzlmod new file mode 100644 index 000000000..3a956c2b7 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/WORKSPACE.bzlmod @@ -0,0 +1,2 @@ +# The presence of this file causes WORKSPACE to be ignored when bzlmod is enabled. +# See https://docs.google.com/document/d/1JtXIVnXyFZ4bmbiBCr5gsTH4-opZAFf5DMMb-54kES0/edit#heading=h.y054fjub9max diff --git a/e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh b/e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh new file mode 100755 index 000000000..629ea9164 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/is-odd-exclude-test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -o errexit -o nounset -o pipefail + +TARGET_DIR="node_modules/is-odd" + +# Check if the directory exists +if [[ ! -d "$TARGET_DIR" ]]; then + echo "Error: Directory $TARGET_DIR does not exist." + exit 1 +fi + +# Check if package.json exists +if [[ ! -f "$TARGET_DIR/package.json" ]]; then + echo "Error: package.json not found in $TARGET_DIR." + exit 1 +fi + +# Check if any README file exists +if ls "$TARGET_DIR"/README* >/dev/null 2>&1; then + echo "Error: README file found in $TARGET_DIR, exclusion did not work." + exit 1 +fi + +echo "All tests passed" diff --git a/e2e/npm_translate_lock_exclude_package_contents/package.json b/e2e/npm_translate_lock_exclude_package_contents/package.json new file mode 100644 index 000000000..0817f22f4 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "is-odd": "3.0.1" + }, + "pnpm": { + "onlyBuiltDependencies": [] + } +} diff --git a/e2e/npm_translate_lock_exclude_package_contents/pnpm-lock.yaml b/e2e/npm_translate_lock_exclude_package_contents/pnpm-lock.yaml new file mode 100644 index 000000000..f805ef82f --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/pnpm-lock.yaml @@ -0,0 +1,31 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + is-odd: + specifier: 3.0.1 + version: 3.0.1 + +packages: + + is-number@6.0.0: + resolution: {integrity: sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==} + engines: {node: '>=0.10.0'} + + is-odd@3.0.1: + resolution: {integrity: sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA==} + engines: {node: '>=4'} + +snapshots: + + is-number@6.0.0: {} + + is-odd@3.0.1: + dependencies: + is-number: 6.0.0 diff --git a/e2e/npm_translate_lock_exclude_package_contents/pnpm-workspace.yaml b/e2e/npm_translate_lock_exclude_package_contents/pnpm-workspace.yaml new file mode 100644 index 000000000..2cce0eb74 --- /dev/null +++ b/e2e/npm_translate_lock_exclude_package_contents/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - '.' diff --git a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl index ff6615a79..0cd71b68f 100644 --- a/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl +++ b/e2e/pnpm_lockfiles/v54/snapshots/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], diff --git a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl index ff6615a79..0cd71b68f 100644 --- a/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl +++ b/e2e/pnpm_lockfiles/v60/snapshots/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], diff --git a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl index ff6615a79..0cd71b68f 100644 --- a/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl +++ b/e2e/pnpm_lockfiles/v61/snapshots/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], diff --git a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl index ff6615a79..0cd71b68f 100644 --- a/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl +++ b/e2e/pnpm_lockfiles/v90/snapshots/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@aspect_rules_js~~npm~lock-__rollup__2.14.0//:pkg", package = "rollup", version = "2.14.0", + exclude_package_contents = [], dev = False, deps = deps, visibility = ["//visibility:public"], diff --git a/npm/extensions.bzl b/npm/extensions.bzl index 62dea7938..4784d5375 100644 --- a/npm/extensions.bzl +++ b/npm/extensions.bzl @@ -159,6 +159,7 @@ WARNING: Cannot determine home directory in order to load home `.npmrc` file in patch_tool = i.patch_tool, patch_args = i.patch_args, patches = i.patches, + exclude_package_contents = i.exclude_package_contents, replace_package = i.replace_package, root_package = i.root_package, transitive_closure = i.transitive_closure, @@ -192,6 +193,7 @@ def _npm_import_bzlmod(i): patch_tool = i.patch_tool, patch_args = i.patch_args, patches = i.patches, + exclude_package_contents = i.exclude_package_contents, replace_package = i.replace_package, root_package = i.root_package, transitive_closure = i.transitive_closure, diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl index 9ee88e881..335d6cdaa 100644 --- a/npm/private/npm_import.bzl +++ b/npm/private/npm_import.bzl @@ -72,6 +72,7 @@ def npm_imported_package_store(name): name = "{{}}/ref".format(store_target_name), package = "{package}", version = "{version}", + exclude_package_contents = {exclude_package_contents}, dev = {dev}, tags = ["manual"], ) @@ -82,6 +83,7 @@ def npm_imported_package_store(name): src = "{{}}/pkg_lc".format(store_target_name) if {has_lifecycle_build_target} else "{npm_package_target}", package = "{package}", version = "{version}", + exclude_package_contents = {exclude_package_contents}, dev = {dev}, deps = ref_deps, tags = ["manual"], @@ -93,6 +95,7 @@ def npm_imported_package_store(name): src = None if {transitive_closure_pattern} else "{npm_package_target}", package = "{package}", version = "{version}", + exclude_package_contents = {exclude_package_contents}, dev = {dev}, deps = deps, visibility = ["//visibility:public"], @@ -118,6 +121,7 @@ _LINK_JS_PACKAGE_LIFECYCLE_TMPL = """\ name = "{{}}/pkg_pre_lc_lite".format(store_target_name), package = "{package}", version = "{version}", + exclude_package_contents = {exclude_package_contents}, dev = {dev}, deps = ref_deps, tags = ["manual"], @@ -128,6 +132,7 @@ _LINK_JS_PACKAGE_LIFECYCLE_TMPL = """\ name = "{{}}/pkg_pre_lc".format(store_target_name), package = "{package}", version = "{version}", + exclude_package_contents = {exclude_package_contents}, dev = {dev}, deps = lc_deps, tags = ["manual"], @@ -452,7 +457,8 @@ def _download_and_extract_archive(rctx, package_json_only): # npm packages are always published with one top-level directory inside the tarball, tho the name is not predictable # so we use tar here which takes a --strip-components N argument instead of rctx.download_and_extract - tar_args = ["tar", "-xf", _TARBALL_FILENAME, "--strip-components", "1", "-C", _EXTRACT_TO_DIRNAME, "--no-same-owner", "--no-same-permissions"] + exclude_pattern_args = ["--exclude", rctx.attr.exclude_package_contents] if rctx.attr.exclude_package_contents else [] + tar_args = ["tar", "-xf", _TARBALL_FILENAME] + ["--strip-components", "1", "-C", _EXTRACT_TO_DIRNAME, "--no-same-owner", "--no-same-permissions"] + exclude_pattern_args system_tar = detect_system_tar(rctx) if rctx.attr.system_tar == "auto" else rctx.attr.system_tar if system_tar == "gnu": @@ -773,6 +779,7 @@ def _npm_import_links_rule_impl(rctx): maybe_bins = maybe_bins, dev = rctx.attr.dev, use_default_shell_env = rctx.attr.lifecycle_hooks_use_default_shell_env, + exclude_package_contents = starlark_codegen_utils.to_list_attr(rctx.attr.exclude_package_contents), ) npm_link_package_bzl = [ @@ -812,6 +819,7 @@ _ATTRS_LINKS = dicts.add(_COMMON_ATTRS, { "transitive_closure": attr.string_list_dict(), "package_visibility": attr.string_list(), "replace_package": attr.string(), + "exclude_package_contents": attr.string_list(), }) _ATTRS = dicts.add(_COMMON_ATTRS, { @@ -819,6 +827,7 @@ _ATTRS = dicts.add(_COMMON_ATTRS, { "custom_postinstall": attr.string(), "extra_build_content": attr.string(), "extract_full_archive": attr.bool(), + "exclude_package_contents": attr.string(), "generate_bzl_library_targets": attr.bool(), "integrity": attr.string(), "lifecycle_hooks": attr.string_list(), @@ -902,6 +911,7 @@ def npm_import( npm_auth_password = "", bins = {}, dev = False, + exclude_package_contents = [], **kwargs): """Import a single npm package into Bazel. @@ -1148,6 +1158,16 @@ def npm_import( dev: Whether this npm package is a dev dependency + exclude_package_contents: List of glob patterns to exclude from the linked package. + + This is useful for excluding files that are not needed in the linked package. + + For example: + + ``` + exclude_package_contents = ["**/tests/**"] + ``` + **kwargs: Internal use only """ @@ -1208,4 +1228,5 @@ def npm_import( bins = bins, package_visibility = package_visibility, replace_package = replace_package, + exclude_package_contents = exclude_package_contents, ) diff --git a/npm/private/npm_package_store.bzl b/npm/private/npm_package_store.bzl index 1bb1c0006..22923fa97 100644 --- a/npm/private/npm_package_store.bzl +++ b/npm/private/npm_package_store.bzl @@ -107,6 +107,12 @@ _ATTRS = { """, providers = [NpmPackageStoreInfo, JsInfo], ), + "exclude_package_contents": attr.string_list( + doc = """List of exclude patterns to exclude files from the package store. + + The exclude patterns are relative to the package store directory. + """, + ), "package": attr.string( doc = """The package name to link to. @@ -225,12 +231,14 @@ def _npm_package_store_impl(ctx): # executable which make the directories not listable (pngjs@5.0.0 for example). bsdtar = ctx.toolchains["@aspect_bazel_lib//lib:tar_toolchain_type"] is_macos = ctx.target_platform_has_constraint(ctx.attr._macos_constraint[platform_common.ConstraintValueInfo]) + tar_exclude_package_contents = (["--exclude"] + ctx.attr.exclude_package_contents) if ctx.attr.exclude_package_contents else [] ctx.actions.run( executable = bsdtar.tarinfo.binary, inputs = depset(direct = [src], transitive = [bsdtar.default.files]), outputs = [package_store_directory], arguments = [ "--extract", + ] + tar_exclude_package_contents + [ "--no-same-owner", "--no-same-permissions", "--strip-components", diff --git a/npm/private/npm_translate_lock.bzl b/npm/private/npm_translate_lock.bzl index 772650404..63c778ed8 100644 --- a/npm/private/npm_translate_lock.bzl +++ b/npm/private/npm_translate_lock.bzl @@ -68,6 +68,7 @@ _ATTRS = { "patch_tool": attr.label(), "patch_args": attr.string_list_dict(), "patches": attr.string_list_dict(), + "exclude_package_contents": attr.string_list_dict(), "use_pnpm": attr.label(default = "@pnpm//:package/bin/pnpm.cjs"), # bzlmod pnpm extension "pnpm_lock": attr.label(), "preupdate": attr.label_list(), @@ -165,6 +166,7 @@ def npm_translate_lock( use_home_npmrc = None, data = [], patches = {}, + exclude_package_contents = {}, patch_tool = None, patch_args = {"*": ["-p0"]}, custom_postinstalls = {}, @@ -282,6 +284,19 @@ def npm_translate_lock( Read more: [patching](/docs/pnpm.md#patching) + exclude_package_contents: A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") + to a list of patterns to exclude from the package's generated node_modules link targets. Multiple matches are additive. + + Versions must match if used. + + For example, + + ``` + exclude_package_contents = { + "@foo/bar": ["**/test/**"], + "@foo/car@2.0.0": ["**/README*"], + }, + ``` patch_tool: The patch tool to use. If not specified, the `patch` from `PATH` is used. patch_args: A map of package names or package names with their version (e.g., "my-package" or "my-package@v1.2.3") @@ -576,6 +591,7 @@ def npm_translate_lock( npmrc = npmrc, use_home_npmrc = use_home_npmrc, patches = patches, + exclude_package_contents = exclude_package_contents, patch_tool = patch_tool, patch_args = patch_args, custom_postinstalls = custom_postinstalls, @@ -609,7 +625,7 @@ def npm_translate_lock( bzlmod = False, ) -def list_patches(name, out = None, include_patterns = ["*.diff", "*.patch"], exclude_patterns = []): +def list_patches(name, out = None, include_patterns = ["*.diff", "*.patch"], exclude_package_contents = []): """Write a file containing a list of all patches in the current folder to the source tree. Use this together with the `verify_patches` attribute of `npm_translate_lock` to verify @@ -620,17 +636,17 @@ def list_patches(name, out = None, include_patterns = ["*.diff", "*.patch"], exc name: Name of the target out: Name of file to write to the source tree. If unspecified, `name` is used include_patterns: Patterns to pass to a glob of patch files - exclude_patterns: Patterns to ignore in a glob of patch files + exclude_package_contents: Patterns to ignore in a glob of patch files """ outfile = out if out else name # Ignore the patch list file we generate - exclude_patterns = exclude_patterns[:] - exclude_patterns.append(outfile) + exclude_package_contents = exclude_package_contents[:] + exclude_package_contents.append(outfile) list_sources( name = "%s_list" % name, - srcs = native.glob(include_patterns, exclude = exclude_patterns), + srcs = native.glob(include_patterns, exclude = exclude_package_contents), ) write_source_file( diff --git a/npm/private/npm_translate_lock_generate.bzl b/npm/private/npm_translate_lock_generate.bzl index 4e65de303..db9d2d194 100644 --- a/npm/private/npm_translate_lock_generate.bzl +++ b/npm/private/npm_translate_lock_generate.bzl @@ -18,7 +18,7 @@ _NPM_IMPORT_TMPL = \ version = "{version}", url = "{url}", system_tar = "{system_tar}", - package_visibility = {package_visibility},{maybe_dev}{maybe_commit}{maybe_generate_bzl_library_targets}{maybe_integrity}{maybe_deps}{maybe_transitive_closure}{maybe_patches}{maybe_patch_tool}{maybe_patch_args}{maybe_lifecycle_hooks}{maybe_custom_postinstall}{maybe_lifecycle_hooks_env}{maybe_lifecycle_hooks_execution_requirements}{maybe_bins}{maybe_npm_auth}{maybe_npm_auth_basic}{maybe_npm_auth_username}{maybe_npm_auth_password}{maybe_replace_package}{maybe_lifecycle_hooks_use_default_shell_env} + package_visibility = {package_visibility},{maybe_dev}{maybe_commit}{maybe_generate_bzl_library_targets}{maybe_integrity}{maybe_deps}{maybe_transitive_closure}{maybe_patches}{maybe_patch_tool}{maybe_patch_args}{maybe_lifecycle_hooks}{maybe_custom_postinstall}{maybe_lifecycle_hooks_env}{maybe_lifecycle_hooks_execution_requirements}{maybe_bins}{maybe_npm_auth}{maybe_npm_auth_basic}{maybe_npm_auth_username}{maybe_npm_auth_password}{maybe_replace_package}{maybe_lifecycle_hooks_use_default_shell_env}{maybe_exclude_package_contents} ) """ @@ -549,6 +549,8 @@ def _gen_npm_import(rctx, system_tar, _import, link_workspace): dev = True,""") if _import.dev else "" maybe_replace_package = (""" replace_package = "%s",""" % _import.replace_package) if _import.replace_package else "" + maybe_exclude_package_contents = (""" + exclude_package_contents = %s,""" % _import.exclude_package_contents) if len(_import.exclude_package_contents) > 0 else "" return _NPM_IMPORT_TMPL.format( link_packages = starlark_codegen_utils.to_dict_attr(_import.link_packages, 2, quote_value = False), @@ -580,4 +582,5 @@ def _gen_npm_import(rctx, system_tar, _import, link_workspace): system_tar = system_tar, url = _import.url, version = _import.version, + maybe_exclude_package_contents = maybe_exclude_package_contents, ) diff --git a/npm/private/npm_translate_lock_helpers.bzl b/npm/private/npm_translate_lock_helpers.bzl index 5de37b7c2..4b6e40fba 100644 --- a/npm/private/npm_translate_lock_helpers.bzl +++ b/npm/private/npm_translate_lock_helpers.bzl @@ -360,6 +360,9 @@ ERROR: can not apply both `pnpm.patchedDependencies` and `npm_translate_lock(pat # that checked in repositories.bzl files don't fail diff tests when run under multiple versions of Bazel. patches = [("@" if patch.startswith("//") else "") + patch for patch in patches] + # gather exclude patterns + exclude_package_contents, _ = _gather_values_from_matching_names(True, attr.exclude_package_contents, name, friendly_name, unfriendly_name) + # gather replace packages replace_packages, _ = _gather_values_from_matching_names(True, attr.replace_packages, name, friendly_name, unfriendly_name) if len(replace_packages) > 1: @@ -452,6 +455,7 @@ ERROR: can not apply both `pnpm.patchedDependencies` and `npm_translate_lock(pat patch_tool = attr.patch_tool, patch_args = patch_args, patches = patches, + exclude_package_contents = exclude_package_contents, root_package = root_package, lifecycle_hooks = lifecycle_hooks, lifecycle_hooks_env = lifecycle_hooks_env, diff --git a/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl b/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl index 08fcbb3f0..1b4903bfb 100644 --- a/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl +++ b/npm/private/test/snapshots/bzlmod/fsevents_links_defs.bzl @@ -36,6 +36,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -46,6 +47,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if True else "@@_main~npm~npm__fsevents__2.3.2//:pkg", package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -57,6 +59,7 @@ def npm_imported_package_store(name): src = None if True else "@@_main~npm~npm__fsevents__2.3.2//:pkg", package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], @@ -82,6 +85,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc_lite".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -92,6 +96,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = lc_deps, tags = ["manual"], diff --git a/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl b/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl index e5943e6ff..05fcc7787 100644 --- a/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl +++ b/npm/private/test/snapshots/bzlmod/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@_main~npm~npm__rollup__2.70.2//:pkg", package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@_main~npm~npm__rollup__2.70.2//:pkg", package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], diff --git a/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl b/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl index 6d0ac704d..98b5bf225 100644 --- a/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl +++ b/npm/private/test/snapshots/bzlmod/unused_links_defs.bzl @@ -39,6 +39,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -49,6 +50,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@_main~npm~npm__unused__0.2.2//:pkg", package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -60,6 +62,7 @@ def npm_imported_package_store(name): src = None if True else "@@_main~npm~npm__unused__0.2.2//:pkg", package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], diff --git a/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl b/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl index 02f46ce6d..19008a474 100644 --- a/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl +++ b/npm/private/test/snapshots/wksp/fsevents_links_defs.bzl @@ -36,6 +36,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -46,6 +47,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if True else "@@npm__fsevents__2.3.2//:pkg", package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -57,6 +59,7 @@ def npm_imported_package_store(name): src = None if True else "@@npm__fsevents__2.3.2//:pkg", package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], @@ -82,6 +85,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc_lite".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -92,6 +96,7 @@ def npm_imported_package_store(name): name = "{}/pkg_pre_lc".format(store_target_name), package = "fsevents", version = "2.3.2", + exclude_package_contents = [], dev = True, deps = lc_deps, tags = ["manual"], diff --git a/npm/private/test/snapshots/wksp/repositories.bzl b/npm/private/test/snapshots/wksp/repositories.bzl index d7e2ada89..f35fd2906 100644 --- a/npm/private/test/snapshots/wksp/repositories.bzl +++ b/npm/private/test/snapshots/wksp/repositories.bzl @@ -8011,6 +8011,7 @@ def npm_repositories(): "has-flag": ["3.0.0"], "supports-color": ["5.5.0"], }, + exclude_package_contents = ["**/README*"], ) npm_import( @@ -8037,6 +8038,7 @@ def npm_repositories(): "has-flag": ["4.0.0"], "supports-color": ["7.2.0"], }, + exclude_package_contents = ["**/README*"], ) npm_import( @@ -8057,6 +8059,7 @@ def npm_repositories(): transitive_closure = { "chalk": ["5.0.1"], }, + exclude_package_contents = ["**/README*"], ) npm_import( @@ -8077,6 +8080,7 @@ def npm_repositories(): transitive_closure = { "chalk": ["5.1.1"], }, + exclude_package_contents = ["**/README*"], ) npm_import( diff --git a/npm/private/test/snapshots/wksp/rollup_links_defs.bzl b/npm/private/test/snapshots/wksp/rollup_links_defs.bzl index 75c09880b..553dfa436 100644 --- a/npm/private/test/snapshots/wksp/rollup_links_defs.bzl +++ b/npm/private/test/snapshots/wksp/rollup_links_defs.bzl @@ -35,6 +35,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -45,6 +46,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@npm__rollup__2.70.2//:pkg", package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -56,6 +58,7 @@ def npm_imported_package_store(name): src = None if True else "@@npm__rollup__2.70.2//:pkg", package = "rollup", version = "2.70.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], diff --git a/npm/private/test/snapshots/wksp/unused_links_defs.bzl b/npm/private/test/snapshots/wksp/unused_links_defs.bzl index da468e8a1..bec8dcc16 100644 --- a/npm/private/test/snapshots/wksp/unused_links_defs.bzl +++ b/npm/private/test/snapshots/wksp/unused_links_defs.bzl @@ -39,6 +39,7 @@ def npm_imported_package_store(name): name = "{}/ref".format(store_target_name), package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, tags = ["manual"], ) @@ -49,6 +50,7 @@ def npm_imported_package_store(name): src = "{}/pkg_lc".format(store_target_name) if False else "@@npm__unused__0.2.2//:pkg", package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, deps = ref_deps, tags = ["manual"], @@ -60,6 +62,7 @@ def npm_imported_package_store(name): src = None if True else "@@npm__unused__0.2.2//:pkg", package = "unused", version = "0.2.2", + exclude_package_contents = [], dev = True, deps = deps, visibility = ["//visibility:public"], From 79ff2b550e1dd07eb206eb80087ba1dc6d665bf3 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Thu, 6 Feb 2025 14:57:17 -0800 Subject: [PATCH 04/14] refactor(bazel 8): point out ignore_directories function (#2053) --- docs/pnpm.md | 5 ++++- npm/private/npm_translate_lock_helpers.bzl | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/pnpm.md b/docs/pnpm.md index 0c338bff0..84b23666f 100644 --- a/docs/pnpm.md +++ b/docs/pnpm.md @@ -72,7 +72,10 @@ npm_translate_lock( # Creates a new repository named "@npm" - you could choose any name you like name = "npm", pnpm_lock = "//:pnpm-lock.yaml", - # Recommended attribute that also checks the .bazelignore file + # Bazel 7.x and earlier: this attribute checks the .bazelignore file covers all node_modules folders. + # Bazel 8.0 can use https://bazel.build/rules/lib/globals/repo#ignore_directories: + # ignore_directories(["**/node_modules"]) + # in REPO.bazel verify_node_modules_ignored = "//:.bazelignore", ) ``` diff --git a/npm/private/npm_translate_lock_helpers.bzl b/npm/private/npm_translate_lock_helpers.bzl index 4b6e40fba..270cef4be 100644 --- a/npm/private/npm_translate_lock_helpers.bzl +++ b/npm/private/npm_translate_lock_helpers.bzl @@ -536,11 +536,12 @@ pnpm install will create nested node_modules, but not all of them are ignored by We recommend that all node_modules folders in the source tree be ignored, to avoid Bazel printing confusing error messages. -Either add line(s) to {bazelignore}: +Possible fixes: + - Upgrade to Bazel 8.0 and use ignore_directories(["**/node_modules"]) in REPO.bazel + - Disable this check by removing `verify_node_modules_ignored` in `npm_translate_lock(name = "{repo}")` + - Add line(s) to {bazelignore}: {fixes} - -or disable this check by setting `verify_node_modules_ignored = None` in `npm_translate_lock(name = "{repo}")` """.format( fixes = "\n".join(missing_ignores), bazelignore = rctx.attr.verify_node_modules_ignored, From 203d4d53a3df6dffa152cdea8dc3240c67833a44 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 15:07:17 -0800 Subject: [PATCH 05/14] chore: mirror external pnpm releases (#2058) Co-authored-by: alexeagle <47395+alexeagle@users.noreply.github.com> --- npm/private/versions.bzl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/npm/private/versions.bzl b/npm/private/versions.bzl index 3370144b5..953a3f021 100644 --- a/npm/private/versions.bzl +++ b/npm/private/versions.bzl @@ -1,6 +1,6 @@ """Mirror of npm registry metadata for the pnpm package. -AUTO-GENERATED; do not edit. +AUTO-GENERATED; do not edit """ PNPM_VERSIONS = { @@ -844,4 +844,7 @@ PNPM_VERSIONS = { "9.15.0": "sha512-duI3l2CkMo7EQVgVvNZije5yevN3mqpMkU45RBVsQpmSGon5djge4QfUHxLPpLZmgcqccY8GaPoIMe1MbYulbA==", "9.15.1": "sha512-GstWXmGT7769p3JwKVBGkVDPErzHZCYudYfnHRncmKQj3/lTblfqRMSb33kP9pToPCe+X6oj1n4MAztYO+S/zw==", "9.15.2": "sha512-k+V7ASbw33TOa/8paAOUwLpU7Ecka5zzIfASHY2bsD91CnBfJO3DwRgIU6/XwsO5QZbQo9U9PgadnieT7xHzIQ==", + "9.15.3": "sha512-H3m8JFpm6wsHxdTYMTEkB3RkLKqobvfQQ0q0fA0W9msE4h4MCG62HmLHfvxNf37Aca+tN5avZIkvrmZQkXOJOg==", + "9.15.4": "sha512-stwg4vxys+GISEWbNzWaMgZGY+VielHkx0ssKd2OjgSRSDw6u0B4nP1Xi/Ni+2uoJhsF8Dh9dnku1uI+o7G2oA==", + "9.15.5": "sha512-hFGWAmqrHMPwmKBHS2TfurKv56G06R3YaJXY5Koyp6bQMEni0K13C75N4COnEi+2jBodbg0DPHB2CF+dXUgA1A==", } From 054642f3fc6c8b65808efa85bc88f6e8d934a144 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 15:36:33 -0800 Subject: [PATCH 06/14] chore(deps): update aspect to v1.1.0 (#2007) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- js/private/dev_deps.bzl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index a4bee49ed..0b371aa28 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -46,7 +46,7 @@ use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") ####### Dev dependencies ######## -bazel_dep(name = "aspect_rules_lint", version = "1.0.2", dev_dependency = True) +bazel_dep(name = "aspect_rules_lint", version = "1.1.0", dev_dependency = True) bazel_dep(name = "buildifier_prebuilt", version = "7.3.1", dev_dependency = True) bazel_dep(name = "rules_go", version = "0.50.1", dev_dependency = True) bazel_dep(name = "stardoc", version = "0.6.2", dev_dependency = True, repo_name = "io_bazel_stardoc") diff --git a/js/private/dev_deps.bzl b/js/private/dev_deps.bzl index 019ba037d..47eed3669 100644 --- a/js/private/dev_deps.bzl +++ b/js/private/dev_deps.bzl @@ -37,9 +37,9 @@ def rules_js_dev_dependencies(): http_archive( name = "aspect_rules_lint", - sha256 = "7d5feef9ad85f0ba78cc5757a9478f8fa99c58a8cabc1660d610b291dc242e9b", - strip_prefix = "rules_lint-1.0.2", - url = "https://github.com/aspect-build/rules_lint/releases/download/v1.0.2/rules_lint-v1.0.2.tar.gz", + sha256 = "f60e4a737a5e09402f5fa3bd182efa80dac5523ca4b9bc5c6fa8c06fbfb46630", + strip_prefix = "rules_lint-1.1.0", + url = "https://github.com/aspect-build/rules_lint/releases/download/v1.1.0/rules_lint-v1.1.0.tar.gz", ) http_archive( From 127a5c804a84740743d3196307d851ce77d7f222 Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Wed, 12 Feb 2025 17:23:56 -0800 Subject: [PATCH 07/14] chore: mirror external pnpm v10 releases (#2102) --- npm/private/versions.bzl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/npm/private/versions.bzl b/npm/private/versions.bzl index 953a3f021..8faf02b71 100644 --- a/npm/private/versions.bzl +++ b/npm/private/versions.bzl @@ -847,4 +847,9 @@ PNPM_VERSIONS = { "9.15.3": "sha512-H3m8JFpm6wsHxdTYMTEkB3RkLKqobvfQQ0q0fA0W9msE4h4MCG62HmLHfvxNf37Aca+tN5avZIkvrmZQkXOJOg==", "9.15.4": "sha512-stwg4vxys+GISEWbNzWaMgZGY+VielHkx0ssKd2OjgSRSDw6u0B4nP1Xi/Ni+2uoJhsF8Dh9dnku1uI+o7G2oA==", "9.15.5": "sha512-hFGWAmqrHMPwmKBHS2TfurKv56G06R3YaJXY5Koyp6bQMEni0K13C75N4COnEi+2jBodbg0DPHB2CF+dXUgA1A==", + "10.0.0": "sha512-uP71SUvT/ky9Ttq9B0XfLuW+PksLiwj6ZDqj5MZwLMwPANaPqKjJhYpzWgAySFpEmQ7SgQUmyHXkFvABsX3xKw==", + "10.1.0": "sha512-yJhHsGZ92rUDlru9AIoqQ887WB79Wc9dmqiSPqH7S4EGwEHVQNCKywlQN1lNc+vFHh7InuQMiLMLimbA+uCsGw==", + "10.2.0": "sha512-DSc2TgE5xqre7WWtoVMTXgypbI2kISO9UAR/lhM53Hp1j8LpRLQo9SvlcNG9M3JFXBxl+i56oL+/kxGQ+VUgAQ==", + "10.2.1": "sha512-OYA1x71pbQugsQpojtVYKFMp0n6plIBKUrrZFn2OOnK8uZP5aZWF08old5rGSUnvQidXpsMRAsEquTLly+XMkg==", + "10.3.0": "sha512-7lku2ogVqKKTwga7CRfEuw/ydMUN73y8F74F7GQfwtGwJJDOZgBhNWvQ0Sak1+suyIMOaVn7ikR1ccYx1aJELQ==", } From 0994c14f3ccf7642453029a25f2b8ebb88c8e4ce Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Thu, 13 Feb 2025 19:48:56 -0800 Subject: [PATCH 08/14] chore: remove unused rules_go dev dep (#2087) --- MODULE.bazel | 13 ------------- e2e/js_run_devserver/MODULE.bazel | 14 -------------- e2e/js_run_devserver/WORKSPACE | 12 ------------ e2e/webpack_devserver/MODULE.bazel | 14 -------------- e2e/webpack_devserver/WORKSPACE | 12 ------------ e2e/webpack_devserver_esm/MODULE.bazel | 14 -------------- e2e/webpack_devserver_esm/WORKSPACE | 12 ------------ 7 files changed, 91 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 0b371aa28..2de1cb44a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -48,7 +48,6 @@ use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") bazel_dep(name = "aspect_rules_lint", version = "1.1.0", dev_dependency = True) bazel_dep(name = "buildifier_prebuilt", version = "7.3.1", dev_dependency = True) -bazel_dep(name = "rules_go", version = "0.50.1", dev_dependency = True) bazel_dep(name = "stardoc", version = "0.6.2", dev_dependency = True, repo_name = "io_bazel_stardoc") host = use_extension( @@ -240,15 +239,3 @@ use_repo( "acorn__8.4.0", "acorn__8.4.0__links", ) - -# Used by formatter -go_sdk = use_extension( - "@rules_go//go:extensions.bzl", - "go_sdk", - dev_dependency = True, -) -go_sdk.download( - name = "go_sdk", - version = "1.20.3", -) -use_repo(go_sdk, "go_sdk") diff --git a/e2e/js_run_devserver/MODULE.bazel b/e2e/js_run_devserver/MODULE.bazel index 576869664..8aacc2ad5 100644 --- a/e2e/js_run_devserver/MODULE.bazel +++ b/e2e/js_run_devserver/MODULE.bazel @@ -6,7 +6,6 @@ local_path_override( bazel_dep(name = "aspect_bazel_lib", version = "2.7.7", dev_dependency = True) bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) -bazel_dep(name = "rules_go", version = "0.46.0", dev_dependency = True) pnpm = use_extension( "@aspect_rules_js//npm:extensions.bzl", @@ -33,16 +32,3 @@ npm.npm_translate_lock( verify_node_modules_ignored = "//:.bazelignore", ) use_repo(npm, "npm") - -go_sdk = use_extension( - "@rules_go//go:extensions.bzl", - "go_sdk", - dev_dependency = True, -) -go_sdk.download( - name = "go_sdk", - version = "1.20.3", -) -use_repo(go_sdk, "go_sdk") - -register_toolchains("@go_sdk//:all") diff --git a/e2e/js_run_devserver/WORKSPACE b/e2e/js_run_devserver/WORKSPACE index b1ebf8562..e43ac3044 100644 --- a/e2e/js_run_devserver/WORKSPACE +++ b/e2e/js_run_devserver/WORKSPACE @@ -32,18 +32,6 @@ npm_repositories() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "io_bazel_rules_go", - sha256 = "80a98277ad1311dacd837f9b16db62887702e9f1d1c4c9f796d0121a46c8e184", - urls = ["https://github.com/bazelbuild/rules_go/releases/download/v0.46.0/rules_go-v0.46.0.zip"], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains(version = "1.20.5") - http_archive( name = "com_github_ash2k_bazel_tools", sha256 = "a911dab6711bc12a00f02cc94b66ced7dc57650e382ebd4f17c9cdb8ec2cbd56", diff --git a/e2e/webpack_devserver/MODULE.bazel b/e2e/webpack_devserver/MODULE.bazel index 5d9862056..2abe6eba0 100644 --- a/e2e/webpack_devserver/MODULE.bazel +++ b/e2e/webpack_devserver/MODULE.bazel @@ -6,7 +6,6 @@ local_path_override( bazel_dep(name = "aspect_bazel_lib", version = "2.7.7", dev_dependency = True) bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) -bazel_dep(name = "rules_go", version = "0.46.0", dev_dependency = True) npm = use_extension( "@aspect_rules_js//npm:extensions.bzl", @@ -27,16 +26,3 @@ pnpm = use_extension( dev_dependency = True, ) use_repo(pnpm, "pnpm") - -go_sdk = use_extension( - "@rules_go//go:extensions.bzl", - "go_sdk", - dev_dependency = True, -) -go_sdk.download( - name = "go_sdk", - version = "1.20.3", -) -use_repo(go_sdk, "go_sdk") - -register_toolchains("@go_sdk//:all") diff --git a/e2e/webpack_devserver/WORKSPACE b/e2e/webpack_devserver/WORKSPACE index 64b7701ad..2276239ac 100644 --- a/e2e/webpack_devserver/WORKSPACE +++ b/e2e/webpack_devserver/WORKSPACE @@ -26,18 +26,6 @@ npm_repositories() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "io_bazel_rules_go", - sha256 = "80a98277ad1311dacd837f9b16db62887702e9f1d1c4c9f796d0121a46c8e184", - urls = ["https://github.com/bazelbuild/rules_go/releases/download/v0.46.0/rules_go-v0.46.0.zip"], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains(version = "1.20.5") - http_archive( name = "com_github_ash2k_bazel_tools", sha256 = "a911dab6711bc12a00f02cc94b66ced7dc57650e382ebd4f17c9cdb8ec2cbd56", diff --git a/e2e/webpack_devserver_esm/MODULE.bazel b/e2e/webpack_devserver_esm/MODULE.bazel index 5d9862056..2abe6eba0 100644 --- a/e2e/webpack_devserver_esm/MODULE.bazel +++ b/e2e/webpack_devserver_esm/MODULE.bazel @@ -6,7 +6,6 @@ local_path_override( bazel_dep(name = "aspect_bazel_lib", version = "2.7.7", dev_dependency = True) bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) -bazel_dep(name = "rules_go", version = "0.46.0", dev_dependency = True) npm = use_extension( "@aspect_rules_js//npm:extensions.bzl", @@ -27,16 +26,3 @@ pnpm = use_extension( dev_dependency = True, ) use_repo(pnpm, "pnpm") - -go_sdk = use_extension( - "@rules_go//go:extensions.bzl", - "go_sdk", - dev_dependency = True, -) -go_sdk.download( - name = "go_sdk", - version = "1.20.3", -) -use_repo(go_sdk, "go_sdk") - -register_toolchains("@go_sdk//:all") diff --git a/e2e/webpack_devserver_esm/WORKSPACE b/e2e/webpack_devserver_esm/WORKSPACE index 64b7701ad..2276239ac 100644 --- a/e2e/webpack_devserver_esm/WORKSPACE +++ b/e2e/webpack_devserver_esm/WORKSPACE @@ -26,18 +26,6 @@ npm_repositories() load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "io_bazel_rules_go", - sha256 = "80a98277ad1311dacd837f9b16db62887702e9f1d1c4c9f796d0121a46c8e184", - urls = ["https://github.com/bazelbuild/rules_go/releases/download/v0.46.0/rules_go-v0.46.0.zip"], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains(version = "1.20.5") - http_archive( name = "com_github_ash2k_bazel_tools", sha256 = "a911dab6711bc12a00f02cc94b66ced7dc57650e382ebd4f17c9cdb8ec2cbd56", From 6338c8e799a581af20178798713fd2799406c6e0 Mon Sep 17 00:00:00 2001 From: Stephen Date: Fri, 14 Feb 2025 17:11:42 -0600 Subject: [PATCH 09/14] Add example pnpm workspace configuration (#2105) --- docs/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/README.md b/docs/README.md index 361e61f75..dd9436533 100644 --- a/docs/README.md +++ b/docs/README.md @@ -107,6 +107,25 @@ Assuming your `npm_translate_lock` was named `npm`, you can run: $ bazel fetch @npm//... ``` +### Using pnpm workspaces + +Here's an example `pnpm-workspace.yaml` file which will automatically discover all packages in the repository, based on the existence of a `package.json` file. +Make sure to place this file at the root of the repository. + +```yaml +packages: + # Include all directories in the workspace + - '*' + # Include all subdirectories at any depth + - '**/*' + # Exclude node_modules folders anywhere in the tree + - '!**/node_modules/**' + # Exclude node_modules folder in root + - '!node_modules' + # Exclude anything inside bazel dirs + - '!bazel-*/**' +``` + ### Link the node_modules Next, we'll need to "link" these npm packages into a `node_modules` tree. From 549311ec741af47a8927dd26f2329b2bdcb42947 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Mon, 17 Feb 2025 11:21:28 -0800 Subject: [PATCH 10/14] fix(coverage): ensure js_library#srcs are instrumented for coverage (#2106) * fix: ensure js_library#srcs are instrumented for coverage * Update js_library.bzl * Update js_library.bzl * Update js_library.bzl * Update js_library.bzl --- examples/coverage/BUILD.bazel | 16 ++++++++++++++-- js/private/js_binary.bzl | 1 + js/private/js_library.bzl | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/examples/coverage/BUILD.bazel b/examples/coverage/BUILD.bazel index f55f4319f..68c784f0d 100644 --- a/examples/coverage/BUILD.bazel +++ b/examples/coverage/BUILD.bazel @@ -1,9 +1,21 @@ -load("@aspect_rules_js//js:defs.bzl", "js_test") +load("@aspect_rules_js//js:defs.bzl", "js_library", "js_test") +js_library( + name = "lib", + srcs = ["coverage.js"], +) + +# Verify this works: +# % bazel coverage examples/coverage --combined_report=lcov +# % cat $(bazel info output_path)/_coverage/_coverage_report.dat +# SF:examples/coverage/coverage.js +# FN:1,module.exports.test +# FNDA:1,module.exports.test +# ... js_test( name = "coverage", data = [ - "coverage.js", + ":lib", "//:node_modules/@types/node", ], entry_point = "test.js", diff --git a/js/private/js_binary.bzl b/js/private/js_binary.bzl index 1d4044c33..ec3341932 100644 --- a/js/private/js_binary.bzl +++ b/js/private/js_binary.bzl @@ -586,6 +586,7 @@ def _js_binary_impl(ctx): coverage_common.instrumented_files_info( ctx, source_attributes = ["data"], + dependency_attributes = ["data"], # TODO: check if there is more extensions # TODO: .ts should not be here since we ought to only instrument transpiled files? extensions = [ diff --git a/js/private/js_library.bzl b/js/private/js_library.bzl index 60db7868b..2a106cce6 100644 --- a/js/private/js_library.bzl +++ b/js/private/js_library.bzl @@ -254,6 +254,11 @@ def _js_library_impl(ctx): ) return [ + coverage_common.instrumented_files_info( + ctx, + dependency_attributes = ["deps"], + source_attributes = ["srcs"], + ), js_info( target = ctx.label, sources = sources, From 3bc69f2168268eb0b369603dd52b0a05909d7d2e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:21:53 -0800 Subject: [PATCH 11/14] chore: mirror external releases (#2104) Co-authored-by: alexeagle <47395+alexeagle@users.noreply.github.com> --- npm/private/versions.bzl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npm/private/versions.bzl b/npm/private/versions.bzl index 8faf02b71..3fa46f060 100644 --- a/npm/private/versions.bzl +++ b/npm/private/versions.bzl @@ -852,4 +852,6 @@ PNPM_VERSIONS = { "10.2.0": "sha512-DSc2TgE5xqre7WWtoVMTXgypbI2kISO9UAR/lhM53Hp1j8LpRLQo9SvlcNG9M3JFXBxl+i56oL+/kxGQ+VUgAQ==", "10.2.1": "sha512-OYA1x71pbQugsQpojtVYKFMp0n6plIBKUrrZFn2OOnK8uZP5aZWF08old5rGSUnvQidXpsMRAsEquTLly+XMkg==", "10.3.0": "sha512-7lku2ogVqKKTwga7CRfEuw/ydMUN73y8F74F7GQfwtGwJJDOZgBhNWvQ0Sak1+suyIMOaVn7ikR1ccYx1aJELQ==", + "10.4.0": "sha512-a4SdB4fZf49OHwOpuP+PA4554VPW8RrlOa58Q1/555bfaoYsmRUCaVx/no+siur8GsWo2rR+NhSNGDgy2IbdUg==", + "10.4.1": "sha512-x1O2w616+hOvOI+m2AgDWgCOMOqZk/WMZmPivF/yFnmqg02wlJhxKapNSIuG31f3tjSYGy+CfNysxpjMDPuIrw==", } From 66a85a69c124415f50d3491b7bfe3a2a73cbf3ad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:22:45 -0800 Subject: [PATCH 12/14] chore(deps): update dependency buildifier_prebuilt to v8 (#2097) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- MODULE.bazel | 2 +- js/private/dev_deps.bzl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 2de1cb44a..763ab513a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -47,7 +47,7 @@ use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") ####### Dev dependencies ######## bazel_dep(name = "aspect_rules_lint", version = "1.1.0", dev_dependency = True) -bazel_dep(name = "buildifier_prebuilt", version = "7.3.1", dev_dependency = True) +bazel_dep(name = "buildifier_prebuilt", version = "8.0.1", dev_dependency = True) bazel_dep(name = "stardoc", version = "0.6.2", dev_dependency = True, repo_name = "io_bazel_stardoc") host = use_extension( diff --git a/js/private/dev_deps.bzl b/js/private/dev_deps.bzl index 47eed3669..00ae45e08 100644 --- a/js/private/dev_deps.bzl +++ b/js/private/dev_deps.bzl @@ -30,9 +30,9 @@ def rules_js_dev_dependencies(): http_archive( name = "buildifier_prebuilt", - sha256 = "7f85b688a4b558e2d9099340cfb510ba7179f829454fba842370bccffb67d6cc", - strip_prefix = "buildifier-prebuilt-7.3.1", - urls = ["http://github.com/keith/buildifier-prebuilt/archive/7.3.1.tar.gz"], + sha256 = "5dbf72e4f93917edfb91f53958d6289736adb845b2b89dbfb9bfc199a492030c", + strip_prefix = "buildifier-prebuilt-8.0.1", + urls = ["http://github.com/keith/buildifier-prebuilt/archive/8.0.1.tar.gz"], ) http_archive( From e6c8019169268e7bad7e9b26deebc7656942007b Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Wed, 19 Feb 2025 09:41:44 -0800 Subject: [PATCH 13/14] fix(devserver): use readline instead of reading from raw stdin (#2099) --- js/private/js_run_devserver.mjs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/private/js_run_devserver.mjs b/js/private/js_run_devserver.mjs index 64eae429b..ae9503124 100644 --- a/js/private/js_run_devserver.mjs +++ b/js/private/js_run_devserver.mjs @@ -4,6 +4,7 @@ import * as fs from 'node:fs' import * as os from 'node:os' import * as child_process from 'node:child_process' import * as crypto from 'node:crypto' +import * as readline from 'node:readline' // Globals const RUNFILES_ROOT = path.join( @@ -452,10 +453,11 @@ async function main(args, sandbox) { }) // Process stdin data in order using a promise chain. - let syncing = Promise.resolve() - process.stdin.on('data', async (chunk) => { - return (syncing = syncing.then(() => processChunk(chunk))) - }) + let syncing = Promise.resolve(); + const rl = readline.createInterface({ input: process.stdin }); + rl.on('line', (line) => { + syncing = syncing.then(() => processChunk(line)); + }); async function processChunk(chunk) { try { From 868f12dc2db6bf7e4992101e6c929d1b4874841b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:07:11 -0800 Subject: [PATCH 14/14] chore(deps): update dependency bazel to v7.5.0 (#2084) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .bazelversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelversion b/.bazelversion index ba7f754d0..18bb4182d 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.4.0 +7.5.0