blob: ac1e322b521b9777e15f3d912d7679496a451c28 [file] [log] [blame]
"""This module defines the copy_file_from_npm_pkg macro."""
load("@aspect_bazel_lib//lib:copy_file.bzl", "copy_file")
load("@aspect_bazel_lib//lib:directory_path.bzl", "directory_path")
def copy_file_from_npm_pkg(name, npm_package_name, src, out):
"""Makes a local copy of a file found in an NPM package.
As an example, a local copy of `node_modules/codemirror/lib/codemirror.css` can be created with
the following rule:
```
copy_file_from_npm_pkg(
name = "codemirror_css",
npm_package_name = "codemirror",
src = "lib/codemirror.css",
out = "codemirror.css",
)
```
This macro is necessary because rules_js[1] exposes NPM packages in a way that makes it
difficult to access individual files directly.
In https://bazelbuild.slack.com/archives/CEZUUKQ6P/p1661466555661629, a rules_js maintainer
recommends using the directory_path and copy_file rules from the aspect-build/bazel_lib[2]
ruleset to create a local copy of files distributed within NPM packages. The copied files will
appear under the //_bazel_bin directory, and can be depended upon from other rules as if they
were local source files.
[1] https://github.com/aspect-build/rules_js
[2] https://github.com/aspect-build/bazel-lib
Args:
name: Name of the rule.
npm_package_name: Name of the NPM package containing the source file.
src: Relative path within the NPM package to the source file.
out: Name of the destination file.
"""
# Based on
# https://github.com/aspect-build/rules_js/blob/014b409c6a96d90ee42dbf5274fb15cbc4bbf9f4/examples/js_binary/BUILD.bazel#L400.
directory_path(
name = name + "_directory_path",
directory = "//:node_modules/%s/dir" % npm_package_name,
path = src,
)
copy_file(
name = name,
src = name + "_directory_path",
out = out,
visibility = ["//visibility:public"],
)