| """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"], |
| ) |