Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions bazel/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ ts_config(
name = "tsconfig",
src = "tsconfig.json",
visibility = ["//bazel:__subpackages__"],
deps = [
"//bazel:node_modules/@types/node",
],
)

filegroup(
Expand Down
2 changes: 1 addition & 1 deletion bazel/api-golden/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ ts_project(
srcs = [
"find_entry_points.ts",
"index_npm_packages.cts",
"interop_module_mappings.ts",
"path-normalize.ts",
"test_api_report.ts",
],
declaration = True,
tsconfig = "//bazel:tsconfig",
deps = [
"//bazel:node_modules/@microsoft/api-extractor",
Expand Down
56 changes: 56 additions & 0 deletions bazel/api-golden/api_golden_test.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
load("@aspect_rules_js//npm:defs.bzl", "npm_package")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("//bazel/api-golden:api_golden_test_npm_package.bzl", "api_golden_test_npm_package", "default_strip_export_pattern")

def api_golden_test(
name,
golden,
entry_point,
data = [],
strip_export_pattern = default_strip_export_pattern,
types = [],
**kwargs):
# We can't directly write `package.json` as this could cause conflicts
# if there are multiple individual file tests in the same Bazel package.
write_file(
name = "%s_synthetic_package_json" % name,
out = "%s_package.json" % name,
content = [json.encode({
"name": name,
"exports": {
".": {
"types": entry_point,
},
},
})],
)

npm_package(
name = "%s_js_package" % name,
srcs = data,
testonly = True,
)

copy_to_directory(
name = "%s_synthetic_package" % name,
srcs = [
"%s_synthetic_package_json" % name,
"%s_js_package" % name,
],
testonly = True,
replace_prefixes = {
"%s_" % name: "",
"%s_js_package/" % name: "",
},
)

api_golden_test_npm_package(
name = name,
golden_dir = golden,
data = [":%s_synthetic_package" % name] + data,
npm_package = "%s/%s_synthetic_package" % (native.package_name(), name),
strip_export_pattern = strip_export_pattern,
types = types,
**kwargs
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ def api_golden_test_npm_package(
npm_package,
data = [],
strip_export_pattern = default_strip_export_pattern,
types = {},
interop_mode = False,
types = [],
**kwargs):
"""Builds an API report for all entry-points within the given NPM package and compares it.

Expand All @@ -24,7 +23,6 @@ def api_golden_test_npm_package(
data: Runtime dependenices needed for the rule (e.g. the tree artifact of the NPM package)
strip_export_pattern: An optional regular expression to filter out exports from the golden.
types: Optional list of type targets to make available in the API report generation.
interop_mode: Whether we are compiling in `rules_nodejs` interop mode.
**kwargs: Other arguments passed to `js_binary`/`js_test` (depending on approval mode)
"""

Expand All @@ -33,18 +31,13 @@ def api_golden_test_npm_package(
kwargs["tags"] = kwargs.get("tags", []) + ["api_guard"]

data.append("@devinfra//bazel/api-golden")

type_names = []
for type_label, n in types.items():
data.append(type_label)
type_names.append(n)
data.extend(types)

js_test(
name = name,
data = data,
entry_point = "@devinfra//bazel/api-golden:index_npm_packages.cjs",
args = [golden_dir, npm_package, "false", quoted_export_pattern] + type_names,
env = {"RJS_MODE": "true" if not interop_mode else "false"},
args = [golden_dir, npm_package, "false", quoted_export_pattern],
**kwargs
)

Expand All @@ -53,10 +46,6 @@ def api_golden_test_npm_package(
testonly = True,
data = data,
entry_point = "@devinfra//bazel/api-golden:index_npm_packages.cjs",
args = [golden_dir, npm_package, "true", quoted_export_pattern] + type_names,
# TODO: Determine why this is needed but only for this `.accept` action
# https://github.com/angular/dev-infra/issues/2742
patch_node_fs = False,
env = {"RJS_MODE": "true" if not interop_mode else "false"},
args = [golden_dir, npm_package, "true", quoted_export_pattern],
**kwargs
)
99 changes: 4 additions & 95 deletions bazel/api-golden/index.bzl
Original file line number Diff line number Diff line change
@@ -1,96 +1,5 @@
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@build_bazel_rules_nodejs//:index.bzl", "pkg_npm")
load("//bazel/api-golden:index_rjs.bzl", _rjs_api_golden_test_npm_package = "api_golden_test_npm_package")
load("//bazel/api-golden:api_golden_test.bzl", _api_golden_test = "api_golden_test")
load("//bazel/api-golden:api_golden_test_npm_package.bzl", _api_golden_test_npm_package = "api_golden_test_npm_package")

default_strip_export_pattern = "^ɵ(?!ɵdefineInjectable|ɵinject|ɵInjectableDef)"

def extract_names_from_npm_targets(type_targets):
types = {}

for type_target in type_targets:
type_label = Label(type_target)
type_package = type_label.package

if type_label.workspace_name != "npm" or not type_package.startswith("@types/"):
fail("Expected type targets to be part of the `@npm` workspace." +
"e.g. `@npm//@types/nodes`.")

types[type_target] = type_package[len("@types/"):]

return types

def api_golden_test(
name,
golden,
entry_point,
data = [],
strip_export_pattern = default_strip_export_pattern,
types = [],
**kwargs):
# We can't directly write `package.json` as this could cause conflicts
# if there are multiple individual file tests in the same Bazel package.
write_file(
name = "%s_synthetic_package_json" % name,
out = "%s_package.json" % name,
content = [json.encode({
"name": name,
"exports": {
".": {
"types": entry_point,
},
},
})],
)

pkg_npm(
name = "%s_js_package" % name,
deps = data,
testonly = True,
)

copy_to_directory(
name = "%s_synthetic_package" % name,
srcs = ["%s_synthetic_package_json" % name, "%s_js_package" % name],
testonly = True,
replace_prefixes = {
"%s_" % name: "",
"%s_js_package/" % name: "",
},
)

_rjs_api_golden_test_npm_package(
no_copy_to_bin = types,
name = name,
golden_dir = fixup_path_for_rules_js(golden),
data = [":%s_synthetic_package" % name] + data,
npm_package = "%s/%s_synthetic_package" % (native.package_name(), name),
strip_export_pattern = strip_export_pattern,
types = extract_names_from_npm_targets(types),
interop_mode = True,
**kwargs
)

def api_golden_test_npm_package(
name,
golden_dir,
npm_package,
data = [],
strip_export_pattern = default_strip_export_pattern,
types = [],
**kwargs):
_rjs_api_golden_test_npm_package(
name = name,
no_copy_to_bin = types,
golden_dir = fixup_path_for_rules_js(golden_dir),
npm_package = fixup_path_for_rules_js(npm_package),
data = data,
strip_export_pattern = strip_export_pattern,
types = extract_names_from_npm_targets(types),
interop_mode = True,
**kwargs
)

def fixup_path_for_rules_js(p):
segs = p.split("/")
return "/".join(segs[1:])
api_golden_test_npm_package = _api_golden_test_npm_package
api_golden_test = _api_golden_test
4 changes: 2 additions & 2 deletions bazel/api-golden/index_npm_packages.cts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ async function main(
if (singleFileMode) {
console.error(
chalk.red(
`The golden is out of date and can be updated by running:\n - yarn bazel run ${process.env.TEST_TARGET}.accept`,
`The golden is out of date and can be updated by running:\n - bazel run ${process.env.TEST_TARGET}.accept`,
),
);
} else {
Expand All @@ -134,7 +134,7 @@ async function main(
console.info();
console.info(
chalk.yellow(
`The goldens can be updated by running:\n - yarn bazel run ${process.env.TEST_TARGET}.accept`,
`The goldens can be updated by running:\n - bazel run ${process.env.TEST_TARGET}.accept`,
),
);
}
Expand Down
87 changes: 0 additions & 87 deletions bazel/api-golden/interop_module_mappings.ts

This file was deleted.

15 changes: 7 additions & 8 deletions bazel/api-golden/test/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin")
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("//bazel/api-golden:index.bzl", "api_golden_test", "api_golden_test_npm_package")

package(default_visibility = ["//bazel/api-golden/test:__pkg__"])
Expand All @@ -20,8 +20,7 @@ api_golden_test(
"//bazel/api-golden/test/fixtures:test_lib",
],
entry_point = "./fixtures/test_fixture.d.ts",
golden = "dev-infra/bazel/api-golden/test/goldens/explicit_file",
types = ["@npm//@types/node"],
golden = "bazel/api-golden/test/goldens/explicit_file",
)

api_golden_test_npm_package(
Expand All @@ -30,11 +29,11 @@ api_golden_test_npm_package(
":test_package_golden_dir",
"//bazel/api-golden/test/fixtures:test_package_fixture",
],
golden_dir = "dev-infra/bazel/api-golden/test/goldens/test_package",
npm_package = "dev-infra/bazel/api-golden/test/fixtures/test_package",
golden_dir = "bazel/api-golden/test/goldens/test_package",
npm_package = "bazel/api-golden/test/fixtures/test_package",
# API extractor needs to be able to resolve `@babel/core` due to an aliased namespace
# we expose as part of the `nested.d.ts` fake entry-point.
types = ["@npm//@types/babel__core"],
types = ["//bazel:node_modules/@types/babel__core"],
)

api_golden_test_npm_package(
Expand All @@ -43,6 +42,6 @@ api_golden_test_npm_package(
":pkg_no_exports_field_golden_dir",
"//bazel/api-golden/test/fixtures:pkg_no_exports_field_fixture",
],
golden_dir = "dev-infra/bazel/api-golden/test/goldens/pkg_no_exports_field",
npm_package = "dev-infra/bazel/api-golden/test/fixtures/pkg_no_exports_field",
golden_dir = "bazel/api-golden/test/goldens/pkg_no_exports_field",
npm_package = "bazel/api-golden/test/fixtures/pkg_no_exports_field",
)
Loading
Loading