Skip to content

Commit 2679d36

Browse files
authored
feat: handle star pattern in exclude package contents (#2133)
1 parent 08eb590 commit 2679d36

File tree

3 files changed

+97
-3
lines changed

3 files changed

+97
-3
lines changed

npm/private/npm_translate_lock_generate.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ def _gen_npm_import(rctx, system_tar, _import, link_workspace):
550550
maybe_replace_package = ("""
551551
replace_package = "%s",""" % _import.replace_package) if _import.replace_package else ""
552552
maybe_exclude_package_contents = ("""
553-
exclude_package_contents = %s,""" % _import.exclude_package_contents) if len(_import.exclude_package_contents) > 0 else ""
553+
exclude_package_contents = %s,""" % _import.exclude_package_contents) if _import.exclude_package_contents != None else ""
554554

555555
return _NPM_IMPORT_TMPL.format(
556556
link_packages = starlark_codegen_utils.to_dict_attr(_import.link_packages, 2, quote_value = False),

npm/private/npm_translate_lock_helpers.bzl

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ Check the public_hoist_packages attribute for duplicates.
4747
)
4848
fail(msg)
4949

50+
################################################################################
51+
def _gather_package_content_excludes(keyed_lists, *names):
52+
keys = []
53+
result = {}
54+
for name in names:
55+
if name and (name in keyed_lists or "*" in keyed_lists):
56+
keys.append(name)
57+
v = keyed_lists[name] if name in keyed_lists else keyed_lists["*"]
58+
if type(v) == "list":
59+
for item in v:
60+
result[item] = []
61+
elif type(v) == "string":
62+
result[v] = []
63+
else:
64+
fail("expected value to be list or string")
65+
66+
# in case the key has not been met even once, we return None, instead of empty list as empty list is a valid value
67+
if not keys:
68+
return None
69+
70+
return result.keys()
71+
5072
################################################################################
5173
def _gather_values_from_matching_names(additive, keyed_lists, *names):
5274
keys = []
@@ -361,7 +383,7 @@ ERROR: can not apply both `pnpm.patchedDependencies` and `npm_translate_lock(pat
361383
patches = [("@" if patch.startswith("//") else "") + patch for patch in patches]
362384

363385
# gather exclude patterns
364-
exclude_package_contents, _ = _gather_values_from_matching_names(True, attr.exclude_package_contents, name, friendly_name, unfriendly_name)
386+
exclude_package_contents = _gather_package_content_excludes(attr.exclude_package_contents, name, friendly_name, unfriendly_name)
365387

366388
# gather replace packages
367389
replace_packages, _ = _gather_values_from_matching_names(True, attr.replace_packages, name, friendly_name, unfriendly_name)
@@ -649,4 +671,5 @@ helpers = struct(
649671
# exported for unit testing
650672
helpers_testonly = struct(
651673
find_missing_bazel_ignores = _find_missing_bazel_ignores,
674+
gather_package_content_excludes = _gather_package_content_excludes,
652675
)

npm/private/test/translate_lock_helpers_tests.bzl

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,76 @@ def test_verify_ignores_in_subdir(ctx):
6565
t0_test = unittest.make(test_verify_ignores_in_root)
6666
t1_test = unittest.make(test_verify_ignores_in_subdir)
6767

68+
# buildifier: disable=function-docstring
69+
def test_verify_gather_package_content_works_with_simple_name(ctx):
70+
env = unittest.begin(ctx)
71+
actual = helpers_testonly.gather_package_content_excludes(
72+
{
73+
"packageA": ["pattern1", "pattern2"],
74+
},
75+
"packageA",
76+
)
77+
expected = ["pattern1", "pattern2"]
78+
asserts.equals(env, expected, actual)
79+
return unittest.end(env)
80+
81+
# buildifier: disable=function-docstring
82+
def test_verify_gather_package_content_works_with_star_pattern(ctx):
83+
env = unittest.begin(ctx)
84+
actual = helpers_testonly.gather_package_content_excludes(
85+
{
86+
"*": ["pattern1", "pattern2"],
87+
},
88+
"packageA",
89+
)
90+
expected = ["pattern1", "pattern2"]
91+
asserts.equals(env, expected, actual)
92+
return unittest.end(env)
93+
94+
# buildifier: disable=function-docstring
95+
def test_verify_gather_package_content_works_with_simple_name_and_single_pattern(ctx):
96+
env = unittest.begin(ctx)
97+
actual = helpers_testonly.gather_package_content_excludes(
98+
{
99+
"packageA": "pattern1",
100+
},
101+
"packageA",
102+
)
103+
expected = ["pattern1"]
104+
asserts.equals(env, expected, actual)
105+
return unittest.end(env)
106+
107+
# buildifier: disable=function-docstring
108+
def test_verify_gather_package_content_works_with_star_pattern_and_only_one_exclude_pattern(ctx):
109+
env = unittest.begin(ctx)
110+
actual = helpers_testonly.gather_package_content_excludes(
111+
{
112+
"*": "pattern1",
113+
},
114+
"packageA",
115+
)
116+
expected = ["pattern1"]
117+
asserts.equals(env, expected, actual)
118+
return unittest.end(env)
119+
120+
# buildifier: disable=function-docstring
121+
def test_verify_gather_package_content_returns_none_when_no_matches(ctx):
122+
env = unittest.begin(ctx)
123+
actual = helpers_testonly.gather_package_content_excludes(
124+
{
125+
"packageB": "pattern1",
126+
},
127+
"packageA",
128+
)
129+
expected = None
130+
asserts.equals(env, expected, actual)
131+
return unittest.end(env)
132+
133+
t2_test = unittest.make(test_verify_gather_package_content_works_with_simple_name)
134+
t3_test = unittest.make(test_verify_gather_package_content_works_with_star_pattern)
135+
t4_test = unittest.make(test_verify_gather_package_content_works_with_simple_name_and_single_pattern)
136+
t5_test = unittest.make(test_verify_gather_package_content_works_with_star_pattern_and_only_one_exclude_pattern)
137+
t6_test = unittest.make(test_verify_gather_package_content_returns_none_when_no_matches)
138+
68139
def translate_lock_helpers_tests(name):
69-
unittest.suite(name, t0_test, t1_test)
140+
unittest.suite(name, t0_test, t1_test, t2_test, t3_test, t4_test, t5_test, t6_test)

0 commit comments

Comments
 (0)