-
Notifications
You must be signed in to change notification settings - Fork 12k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
build: migrate
@angular-devkit/architect
to npm_package
Migrates the `@angular-devkit/architect` package to the `rules_js` npm package rule, consuming the direct `rules_ts` output JS files. Notably, substitution is FAR different than what it used to be with `rules_nodejs`, so we needed some extra work to leverage `make_template` for substitutions in `package.json` files. **Keep in mind** that for now, this does not apply to any other files; so we only substitute in the `package.json`, but not in e.g. `.js` files as before. We will follow-up on this. The other jq merging/filtering for snapshot or tar references in `package.json` files is kept as is, and is temporarily duplicated. This is acceptable as the migration should be pretty smooth and quick.
- Loading branch information
1 parent
aaf114f
commit 2218b0d
Showing
7 changed files
with
152 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") | ||
load("@aspect_bazel_lib//lib:expand_template.bzl", "expand_template") | ||
load("@aspect_bazel_lib//lib:jq.bzl", "jq") | ||
load("@aspect_bazel_lib//lib:utils.bzl", "to_label") | ||
load("@aspect_rules_js//npm:defs.bzl", _npm_package = "npm_package") | ||
load("@rules_pkg//:pkg.bzl", "pkg_tar") | ||
load("//tools:link_package_json_to_tarballs.bzl", "link_package_json_to_tarballs") | ||
load("//tools:snapshot_repo_filter.bzl", "SNAPSHOT_REPO_JQ_FILTER") | ||
load("//tools:substitutions.bzl", "NO_STAMP_PACKAGE_SUBSTITUTIONS", "get_npm_package_substitutions_for_rjs") | ||
|
||
def npm_package( | ||
name, | ||
deps = [], | ||
visibility = None, | ||
pkg_deps = [], | ||
pkg_json = "package.json", | ||
**kwargs): | ||
if name != "pkg": | ||
fail("Expected npm_package to be named `pkg`. " + | ||
"This is needed for pnpm workspace integration.") | ||
|
||
# Merge package.json with root package.json and perform various substitutions to | ||
# prepare it for release. For jq docs, see https://stedolan.github.io/jq/manual/. | ||
jq( | ||
name = "basic_substitutions", | ||
# Note: this jq filter relies on the order of the inputs | ||
# buildifier: do not sort | ||
srcs = ["//:package.json", pkg_json], | ||
filter_file = "//tools:package_json_release_filter.jq", | ||
args = ["--slurp"], | ||
out = "substituted/package.json", | ||
) | ||
|
||
# Copy package.json files to bazel-out so we can use their bazel-out paths to determine | ||
# the corresponding package npm package tgz path for substitutions. | ||
copy_to_bin( | ||
name = "package_json_copy", | ||
srcs = [pkg_json], | ||
) | ||
pkg_deps_copies = [] | ||
for pkg_dep in pkg_deps: | ||
pkg_label = to_label(pkg_dep) | ||
if pkg_label.name != "package.json": | ||
fail("ERROR: only package.json files allowed in pkg_deps of pkg_npm macro") | ||
pkg_deps_copies.append("@%s//%s:package_json_copy" % (pkg_label.workspace_name, pkg_label.package)) | ||
|
||
# Substitute dependencies on other packages in this repo with tarballs. | ||
link_package_json_to_tarballs( | ||
name = "tar_substitutions", | ||
src = "substituted/package.json", | ||
pkg_deps = [":package_json_copy"] + pkg_deps_copies, | ||
out = "substituted_with_tars/package.json", | ||
) | ||
|
||
# Substitute dependencies on other packages in this repo with snapshot repos. | ||
jq( | ||
name = "snapshot_repo_substitutions", | ||
srcs = ["substituted/package.json"], | ||
filter = SNAPSHOT_REPO_JQ_FILTER, | ||
out = "substituted_with_snapshot_repos/package.json", | ||
) | ||
|
||
expand_template( | ||
name = "final_package_json", | ||
template = select({ | ||
# Do local tar substitution if config_setting is true. | ||
"//:package_json_use_tar_deps": "substituted_with_tars/package.json", | ||
# Do snapshot repo substitution if config_setting is true. | ||
"//:package_json_use_snapshot_repo_deps": "substituted_with_snapshot_repos/package.json", | ||
"//conditions:default": "substituted/package.json", | ||
}), | ||
out = "substituted_final/package.json", | ||
substitutions = NO_STAMP_PACKAGE_SUBSTITUTIONS, | ||
stamp_substitutions = get_npm_package_substitutions_for_rjs(), | ||
) | ||
|
||
_npm_package( | ||
name = "npm_package", | ||
visibility = visibility, | ||
srcs = [":final_package_json"] + deps, | ||
replace_prefixes = { | ||
"substituted_final/": "", | ||
"substituted_with_tars/": "", | ||
"substituted_with_snapshot_repos/": "", | ||
"substituted/": "", | ||
}, | ||
exclude_srcs_patterns = [ | ||
# Exclude `node_modules` which may be pulled by the `js_module_output` runfiles. | ||
"node_modules/**/*", | ||
], | ||
allow_overwrites = True, | ||
**kwargs | ||
) | ||
|
||
# Note: For now, in hybrid mode with RNJS and RJS, we ensure | ||
# both `:pkg` and `:npm_package` work. | ||
native.alias( | ||
name = "pkg", | ||
actual = ":npm_package", | ||
) | ||
|
||
if pkg_json: | ||
pkg_tar( | ||
name = "npm_package_archive", | ||
srcs = [":pkg"], | ||
extension = "tgz", | ||
strip_prefix = "./npm_package", | ||
visibility = visibility, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
load("//tools:interop.bzl", _ts_project = "ts_project") | ||
load("//tools/bazel:npm_package.bzl", _npm_package = "npm_package") | ||
|
||
def ts_project(**kwargs): | ||
_ts_project(**kwargs) | ||
|
||
def npm_package(**kwargs): | ||
_npm_package(**kwargs) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
load("//:constants.bzl", "RELEASE_ENGINES_NODE", "RELEASE_ENGINES_NPM", "RELEASE_ENGINES_YARN") | ||
|
||
NPM_PACKAGE_SUBSTITUTIONS = { | ||
# Version of the local package being built, generated via the `--workspace_status_command` flag. | ||
"0.0.0-PLACEHOLDER": "{STABLE_PROJECT_VERSION}", | ||
"0.0.0-EXPERIMENTAL-PLACEHOLDER": "{STABLE_PROJECT_EXPERIMENTAL_VERSION}", | ||
"BUILD_SCM_HASH-PLACEHOLDER": "{BUILD_SCM_ABBREV_HASH}", | ||
"0.0.0-ENGINES-NODE": RELEASE_ENGINES_NODE, | ||
"0.0.0-ENGINES-NPM": RELEASE_ENGINES_NPM, | ||
"0.0.0-ENGINES-YARN": RELEASE_ENGINES_YARN, | ||
# The below is needed for @angular/ssr FESM file. | ||
"\\./(.+)/packages/angular/ssr/third_party/beasties": "../third_party/beasties/index.js", | ||
} | ||
|
||
NO_STAMP_PACKAGE_SUBSTITUTIONS = dict(NPM_PACKAGE_SUBSTITUTIONS, **{ | ||
"0.0.0-PLACEHOLDER": "0.0.0", | ||
"0.0.0-EXPERIMENTAL-PLACEHOLDER": "0.0.0", | ||
}) | ||
|
||
def get_npm_package_substitutions_for_rjs(): | ||
result = {} | ||
for key, value in NPM_PACKAGE_SUBSTITUTIONS.items(): | ||
# in `rules_js`, or `expand_template` from `bazel-lib`, stamp variables | ||
# can only be retrieved via `{{X}}` syntax. | ||
result[key] = value.replace("{", "{{").replace("}", "}}") | ||
return result |