blob: 45662adf72bcc027ec5a496ae1f6f354c8e6fce0 [file]
"""
Test utils for lockfiles
"""
load("@aspect_bazel_lib//lib:copy_file.bzl", "copy_file")
load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files")
load("@aspect_rules_js//js:defs.bzl", "js_test")
load("@bazel_skylib//rules:build_test.bzl", "build_test")
# Each version being tested
PNPM_LOCK_VERSIONS = [
"v54",
"v60",
"v61",
"v90",
]
BZL_FILES = {
# global
"defs.bzl": "@REPO_NAME//:defs.bzl",
# resolved.json reference
"is-odd_resolved.json": "@REPO_NAME//VERSION:is-odd/resolved.json",
"is-odd-v0_resolved.json": "@REPO_NAME//VERSION:is-odd-v0/resolved.json",
# hasBin, optional deps, deps and across versions
"rollup_links_defs.bzl": "@REPO_NAME__rollup__2.14.0__links//:defs.bzl",
"rollup_package_json.bzl": "@REPO_NAME__rollup__2.14.0//VERSION:package_json.bzl",
"rollup3_package_json.bzl": "@REPO_NAME__rollup__3.29.4//VERSION:package_json.bzl",
}
def lockfile_test(name = None):
"""
Tests for a lockfile and associated targets + files generated by rules_js.
Args:
name: the lockfile version name
"""
lock_version = name if name else native.package_name()
lock_repo = "lock-%s" % lock_version
# Copy each test to this lockfile dir
for test in ["patched-dependencies-test.js", "aliases-test.js"]:
copy_file(
name = "copy-{}".format(test),
src = "//:base/{}".format(test),
out = test,
)
js_test(
name = "patch-test",
data = [
":node_modules/meaning-of-life",
],
entry_point = "patched-dependencies-test.js",
)
js_test(
name = "aliases-test",
data = [
":node_modules/@aspect-test/a",
":node_modules/@aspect-test/a2",
":node_modules/aspect-test-a-no-scope",
":node_modules/aspect-test-a/no-at",
":node_modules/@aspect-test-a-bad-scope",
":node_modules/@aspect-test-custom-scope/a",
":node_modules/@types/node",
":node_modules/alias-only-sizzle",
":node_modules/alias-types-node",
":node_modules/is-odd",
":node_modules/is-odd-alias",
":node_modules/is-odd-v0",
":node_modules/is-odd-v1",
":node_modules/is-odd-v2",
":node_modules/is-odd-v3",
":node_modules/@isaacs/cliui",
],
entry_point = "aliases-test.js",
)
build_test(
name = "targets",
targets = [
# The full node_modules target
":node_modules",
# Direct 'dependencies'
":node_modules/@aspect-test", # target for the scope
":node_modules/@aspect-test/a",
# Direct 'devDependencies'
":node_modules/@aspect-test/b",
":node_modules/@types/node",
# Direct 'optionalDependencies'
":node_modules/@aspect-test/c",
# rollup has a 'optionalDependency' (fsevents)
":node_modules/rollup",
# npm: alias to a package that has many peers
":node_modules/rollup-plugin-with-peers",
# underlying repo for the many-peers package
"@%s__at_rollup_plugin-typescript__8.2.1_%s//:pkg" % (lock_repo, "ommloj5qql5ba6x5wuiluawhoi" if lock_version == "v54" else "1662662592" if lock_version == "v90" else "1813138439"),
# uuv 'hasBin'
":node_modules/uvu",
# a package with various `npm:` cases
":node_modules/@isaacs/cliui",
# link:, workspace:, file:, ./rel/path
":node_modules/@scoped", # target for the scope
":node_modules/@scoped/a",
":node_modules/@scoped/b",
":node_modules/@scoped/c",
":node_modules/@scoped/d",
":node_modules/scoped/bad",
# Packages involving overrides
":node_modules/is-odd",
":.aspect_rules_js/node_modules/is-odd@3.0.1",
":.aspect_rules_js/node_modules/is-number@0.0.0",
# Odd git/http versions
":node_modules/debug",
":node_modules/hello",
":node_modules/jsonify",
":node_modules/jquery-git-ssh-e61fccb",
# npm: alias
":node_modules/@aspect-test/a2",
# npm: alias to registry-scoped packages
":node_modules/alias-types-node",
# npm: alias adding/removing or odd @scopes
":node_modules/aspect-test-a/no-at",
":node_modules/aspect-test-a-no-scope",
":node_modules/@aspect-test-a-bad-scope",
":node_modules/@aspect-test-custom-scope", # target for the scope
":node_modules/@aspect-test-custom-scope/a",
# npm: alias to alternate versions
":node_modules/is-odd-v0",
":node_modules/is-odd-v1",
":node_modules/is-odd-v2",
":node_modules/is-odd-v3",
":.aspect_rules_js/node_modules/is-odd@0.1.0",
":.aspect_rules_js/node_modules/is-odd@1.0.0",
":.aspect_rules_js/node_modules/is-odd@2.0.0",
":.aspect_rules_js/node_modules/is-odd@3.0.0",
# npm: alias to package not listed elsewhere
":node_modules/alias-only-sizzle",
":.aspect_rules_js/node_modules/@types+sizzle@2.3.8",
"@%s__at_types_sizzle__2.3.8//:pkg" % lock_repo,
# Targets within the virtual store...
# Direct dep targets
":.aspect_rules_js/node_modules/@aspect-test+a@5.0.2",
":.aspect_rules_js/node_modules/@aspect-test+a@5.0.2/dir",
":.aspect_rules_js/node_modules/@aspect-test+a@5.0.2/pkg",
":.aspect_rules_js/node_modules/@aspect-test+a@5.0.2/ref",
# Direct deps with lifecycles
":.aspect_rules_js/node_modules/@aspect-test+c@2.0.2/lc",
":.aspect_rules_js/node_modules/@aspect-test+c@2.0.2/pkg_lc",
# link:, workspace:, file:, ./rel/path
":.aspect_rules_js/node_modules/@scoped+a@0.0.0",
":.aspect_rules_js/node_modules/@scoped+b@0.0.0",
":.aspect_rules_js/node_modules/@scoped+c@0.0.0",
":.aspect_rules_js/node_modules/@scoped+d@0.0.0",
# Patched dependencies
":.aspect_rules_js/node_modules/meaning-of-life@1.0.0_o3deharooos255qt5xdujc3cuq",
"@%s__meaning-of-life__1.0.0_o3deharooos255qt5xdujc3cuq//:pkg" % lock_repo,
# Direct deps from custom registry
":.aspect_rules_js/node_modules/@types+node@16.18.11",
# Direct deps with peers
":.aspect_rules_js/node_modules/@aspect-test+d@2.0.0_at_aspect-test_c_2.0.2",
"@%s__at_aspect-test_d__2.0.0_at_aspect-test_c_2.0.2//:pkg" % lock_repo,
],
)
# The generated bzl files (standard non-workspace)
# buildifier: disable=no-effect
[
native.genrule(
name = "extract-%s" % out,
srcs = [what.replace("VERSION", lock_version).replace("REPO_NAME", lock_repo)],
outs = ["snapshot-extracted-%s" % out],
cmd = 'sed "s/{}/<LOCKVERSION>/g" "$<" > "$@"'.format(lock_version),
visibility = ["//visibility:private"],
)
for (out, what) in BZL_FILES.items()
]
write_source_files(
name = "repos",
files = dict(
[
(
"snapshots/%s" % f,
":extract-%s" % f,
)
for f in BZL_FILES.keys()
],
),
target_compatible_with = select({
"@aspect_bazel_lib//lib:bzlmod": [],
"//conditions:default": ["@platforms//:incompatible"],
}),
)