Skip to content

Commit e0a193d

Browse files
committed
feat: add prod and dev attributes to npm_link_targets
1 parent 7fe3b5c commit e0a193d

File tree

5 files changed

+333
-324
lines changed

5 files changed

+333
-324
lines changed

npm/extensions.bzl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ WARNING: Cannot determine home directory in order to load home `.npmrc` file in
134134
system_tar = detect_system_tar(module_ctx)
135135

136136
for i in imports:
137+
link_packages = {}
138+
for link_package, link_names in i.link_packages.items():
139+
link_packages[link_package] = [link_name["pkg"] for link_name in link_names]
137140
npm_import(
138141
name = i.name,
139142
bins = i.bins,
@@ -147,7 +150,7 @@ WARNING: Cannot determine home directory in order to load home `.npmrc` file in
147150
lifecycle_hooks_env = i.lifecycle_hooks_env,
148151
lifecycle_hooks_execution_requirements = i.lifecycle_hooks_execution_requirements,
149152
lifecycle_hooks_use_default_shell_env = i.lifecycle_hooks_use_default_shell_env,
150-
link_packages = i.link_packages,
153+
link_packages = link_packages,
151154
# attr.pnpm_lock.workspace_name is a canonical repository name, so it needs to be qualified with an extra '@'.
152155
link_workspace = attr.link_workspace if attr.link_workspace else "@" + attr.pnpm_lock.workspace_name,
153156
npm_auth = i.npm_auth,

npm/private/npm_translate_lock_generate.bzl

Lines changed: 95 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,8 @@ _FP_DIRECT_TMPL = \
6565

6666
_FP_DIRECT_TARGET_TMPL = \
6767
"""
68-
for link_package in {link_packages}:
69-
if link_package == bazel_package:
70-
link_targets.append("//{{}}:{{}}/{pkg}".format(bazel_package, name))"""
68+
if bazel_package in {link_packages} and ((not prod and not dev) or {prod_or_dev}):
69+
link_targets.append("//{{}}:{{}}/{pkg}".format(bazel_package, name))"""
7170

7271
_BZL_LIBRARY_TMPL = \
7372
"""bzl_library(
@@ -148,67 +147,71 @@ sh_binary(
148147
"package": name,
149148
"path": dep_path,
150149
"link_packages": {},
150+
"link_dev_packages": {},
151151
"deps": transitive_deps,
152152
}
153153

154154
# Look for first-party links in importers
155155
for import_path, importer in importers.items():
156-
dependencies = importer.get("all_deps")
157-
if type(dependencies) != "dict":
158-
msg = "expected dict of dependencies in processed importer '{}'".format(import_path)
159-
fail(msg)
160156
link_package = helpers.link_package(root_package, import_path)
161-
for dep_package, dep_version in dependencies.items():
162-
if dep_version.startswith("file:"):
163-
if dep_version in packages and packages[dep_version]["id"]:
164-
dep_path = helpers.link_package(root_package, packages[dep_version]["id"][len("file:"):])
165-
else:
166-
dep_path = helpers.link_package(root_package, dep_version[len("file:"):])
167-
dep_key = "{}+{}".format(dep_package, dep_version)
168-
if not dep_key in fp_links.keys():
169-
msg = "Expected to file: referenced package {} in first-party links".format(dep_key)
170-
fail(msg)
171-
fp_links[dep_key]["link_packages"][link_package] = True
172-
elif dep_version.startswith("link:"):
173-
dep_version = dep_version[len("link:"):]
174-
dep_importer = paths.normalize("{}/{}".format(import_path, dep_version) if import_path else dep_version)
175-
dep_path = helpers.link_package(root_package, import_path, dep_version)
176-
dep_key = "{}+{}".format(dep_package, dep_path)
177-
if fp_links.get(dep_key, False):
178-
fp_links[dep_key]["link_packages"][link_package] = True
179-
else:
180-
transitive_deps = {}
181-
raw_deps = {}
182-
if importers.get(dep_importer, False):
183-
raw_deps = importers.get(dep_importer).get("deps")
184-
for raw_package, raw_version in raw_deps.items():
185-
package_store_name = utils.package_store_name(raw_package, raw_version)
186-
dep_store_target = """"//{root_package}:{package_store_root}/{{}}/{package_store_name}".format(name)""".format(
187-
root_package = root_package,
188-
package_store_name = package_store_name,
189-
package_store_root = utils.package_store_root,
190-
)
191-
if dep_store_target not in transitive_deps:
192-
transitive_deps[dep_store_target] = [raw_package]
193-
else:
194-
transitive_deps[dep_store_target].append(raw_package)
195-
196-
# collapse link aliases lists into to a comma separated strings
197-
for dep_store_target in transitive_deps.keys():
198-
transitive_deps[dep_store_target] = ",".join(transitive_deps[dep_store_target])
199-
fp_links[dep_key] = {
200-
"package": dep_package,
201-
"path": dep_path,
202-
"link_packages": {link_package: True},
203-
"deps": transitive_deps,
204-
}
157+
for deps_type, link_type in [("deps", "link_packages"), ("dev_deps", "link_dev_packages")]:
158+
dependencies = importer.get(deps_type)
159+
if type(dependencies) != "dict":
160+
msg = "expected dict of dependencies in processed importer '{}'".format(import_path)
161+
fail(msg)
162+
for dep_package, dep_version in dependencies.items():
163+
if dep_version.startswith("file:"):
164+
if dep_version in packages and packages[dep_version]["id"]:
165+
dep_path = helpers.link_package(root_package, packages[dep_version]["id"][len("file:"):])
166+
else:
167+
dep_path = helpers.link_package(root_package, dep_version[len("file:"):])
168+
dep_key = "{}+{}".format(dep_package, dep_version)
169+
if not dep_key in fp_links.keys():
170+
msg = "Expected to file: referenced package {} in first-party links".format(dep_key)
171+
fail(msg)
172+
fp_links[dep_key][link_type][link_package] = True
173+
elif dep_version.startswith("link:"):
174+
dep_version = dep_version[len("link:"):]
175+
dep_importer = paths.normalize("{}/{}".format(import_path, dep_version) if import_path else dep_version)
176+
dep_path = helpers.link_package(root_package, import_path, dep_version)
177+
dep_key = "{}+{}".format(dep_package, dep_path)
178+
if not fp_links.get(dep_key, False):
179+
transitive_deps = {}
180+
raw_deps = {}
181+
if importers.get(dep_importer, False):
182+
raw_deps = importers.get(dep_importer).get("deps")
183+
for raw_package, raw_version in raw_deps.items():
184+
package_store_name = utils.package_store_name(raw_package, raw_version)
185+
dep_store_target = """"//{root_package}:{package_store_root}/{{}}/{package_store_name}".format(name)""".format(
186+
root_package = root_package,
187+
package_store_name = package_store_name,
188+
package_store_root = utils.package_store_root,
189+
)
190+
if dep_store_target not in transitive_deps:
191+
transitive_deps[dep_store_target] = [raw_package]
192+
else:
193+
transitive_deps[dep_store_target].append(raw_package)
194+
195+
# collapse link aliases lists into to a comma separated strings
196+
for dep_store_target in transitive_deps.keys():
197+
transitive_deps[dep_store_target] = ",".join(transitive_deps[dep_store_target])
198+
fp_links[dep_key] = {
199+
"package": dep_package,
200+
"path": dep_path,
201+
"link_packages": {},
202+
"link_dev_packages": {},
203+
"deps": transitive_deps,
204+
}
205+
fp_links[dep_key][link_type][link_package] = True
205206

206207
npm_link_packages_const = """_LINK_PACKAGES = {link_packages}""".format(link_packages = str(link_packages))
207208

208209
npm_link_targets_bzl = [
209210
"""\
210211
# buildifier: disable=function-docstring
211-
def npm_link_targets(name = "node_modules", package = None):
212+
def npm_link_targets(name = "node_modules", package = None, prod = False, dev = False):
213+
if prod and dev:
214+
fail("prod and dev attributes cannot both be set to true")
212215
bazel_package = package if package != None else native.package_name()
213216
link = bazel_package in _LINK_PACKAGES
214217
@@ -219,7 +222,7 @@ def npm_link_targets(name = "node_modules", package = None):
219222
npm_link_all_packages_bzl = [
220223
"""\
221224
# buildifier: disable=function-docstring
222-
def npm_link_all_packages(name = "node_modules", imported_links = []):
225+
def npm_link_all_packages(name = "node_modules", imported_links = [], prod = False, dev = False):
223226
bazel_package = native.package_name()
224227
root_package = "{root_package}"
225228
is_root = bazel_package == root_package
@@ -271,9 +274,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
271274
i = i,
272275
pkg = _import.package,
273276
))
274-
for link_package, _link_aliases in _import.link_packages.items():
275-
link_aliases = _link_aliases or [_import.package]
276-
277+
for link_package, link_names in _import.link_packages.items():
277278
# the build file for the package being linked
278279
build_file = "{}/{}".format(link_package, "BUILD.bazel") if link_package else "BUILD.bazel"
279280
if build_file not in rctx_files:
@@ -286,7 +287,10 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
286287
links_targets_bzl[link_package] = []
287288

288289
# for each alias of this package
289-
for link_alias in link_aliases:
290+
for link_name in link_names:
291+
link_alias = link_name["pkg"]
292+
dev = link_name["dev"]
293+
290294
# link the alias to the underlying package
291295
links_bzl[link_package].append(""" link_{i}(name = "{{}}/{pkg}".format(name))""".format(
292296
i = i,
@@ -295,7 +299,7 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
295299

296300
# expose the alias if public
297301
if "//visibility:public" in _import.package_visibility:
298-
add_to_link_targets = """ link_targets.append("//{{}}:{{}}/{pkg}".format(bazel_package, name))""".format(pkg = link_alias)
302+
add_to_link_targets = """ link_targets.append("//{{}}:{{}}/{pkg}".format(bazel_package, name)) if (not prod and not dev) or {prod_or_dev} else None""".format(pkg = link_alias, prod_or_dev = "dev" if dev else "prod")
299303
links_bzl[link_package].append(add_to_link_targets)
300304
links_targets_bzl[link_package].append(add_to_link_targets)
301305
package_scope = link_alias[:link_alias.find("/", 1)] if link_alias[0] == "@" else None
@@ -319,19 +323,19 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
319323
if rctx.attr.generate_bzl_library_targets:
320324
rctx_files[build_file].append("""load("@bazel_skylib//:bzl_library.bzl", "bzl_library")""")
321325

322-
for link_alias in link_aliases:
326+
for link_name in link_names:
323327
rctx_files[build_file].append(_BZL_LIBRARY_TMPL.format(
324-
name = link_alias,
325-
src = ":{}/{}".format(link_alias, _PACKAGE_JSON_BZL_FILENAME),
328+
name = link_name["pkg"],
329+
src = ":{}/{}".format(link_name["pkg"], _PACKAGE_JSON_BZL_FILENAME),
326330
dep = "@{repo_name}//{link_package}:{package_name}_bzl_library".format(
327331
repo_name = helpers.to_apparent_repo_name(_import.name),
328332
link_package = link_package,
329-
package_name = link_package[link_package.rfind("/") + 1] if link_package else link_alias.split("/")[-1],
333+
package_name = link_package[link_package.rfind("/") + 1] if link_package else link_name["pkg"].split("/")[-1],
330334
),
331335
))
332336

333-
for link_alias in link_aliases:
334-
package_json_bzl_file_path = "{}/{}/{}".format(link_package, link_alias, _PACKAGE_JSON_BZL_FILENAME) if link_package else "{}/{}".format(link_alias, _PACKAGE_JSON_BZL_FILENAME)
337+
for link_name in link_names:
338+
package_json_bzl_file_path = "{}/{}/{}".format(link_package, link_name["pkg"], _PACKAGE_JSON_BZL_FILENAME) if link_package else "{}/{}".format(link_name["pkg"], _PACKAGE_JSON_BZL_FILENAME)
335339
repo_package_json_bzl = "@@{repo_name}//{link_package}:{package_json_bzl}".format(
336340
repo_name = _import.name,
337341
link_package = link_package,
@@ -373,7 +377,6 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
373377
for fp_link in fp_links.values():
374378
fp_package = fp_link.get("package")
375379
fp_path = fp_link.get("path")
376-
fp_link_packages = fp_link.get("link_packages").keys()
377380
fp_deps = fp_link.get("deps")
378381
fp_target = "//{}:{}".format(
379382
fp_path,
@@ -392,28 +395,31 @@ def npm_link_all_packages(name = "node_modules", imported_links = []):
392395
if len(package_visibility) == 0:
393396
package_visibility = ["//visibility:public"]
394397

395-
if len(fp_link_packages) > 0:
396-
npm_link_all_packages_bzl.append(_FP_DIRECT_TMPL.format(
397-
link_packages = fp_link_packages,
398-
link_visibility = package_visibility,
399-
pkg = fp_package,
400-
package_directory_output_group = utils.package_directory_output_group,
401-
root_package = root_package,
402-
package_store_name = utils.package_store_name(fp_package, "0.0.0"),
403-
package_store_root = utils.package_store_root,
404-
))
398+
for link_type in ["link_packages", "link_dev_packages"]:
399+
fp_link_packages = fp_link.get(link_type).keys()
400+
if len(fp_link_packages) > 0:
401+
npm_link_all_packages_bzl.append(_FP_DIRECT_TMPL.format(
402+
link_packages = fp_link_packages,
403+
link_visibility = package_visibility,
404+
pkg = fp_package,
405+
package_directory_output_group = utils.package_directory_output_group,
406+
root_package = root_package,
407+
package_store_name = utils.package_store_name(fp_package, "0.0.0"),
408+
package_store_root = utils.package_store_root,
409+
))
405410

406-
npm_link_targets_bzl.append(_FP_DIRECT_TARGET_TMPL.format(
407-
link_packages = fp_link_packages,
408-
pkg = fp_package,
409-
))
411+
npm_link_targets_bzl.append(_FP_DIRECT_TARGET_TMPL.format(
412+
link_packages = fp_link_packages,
413+
pkg = fp_package,
414+
prod_or_dev = "dev" if link_type == "link_dev_packages" else "prod",
415+
))
410416

411-
if "//visibility:public" in package_visibility:
412-
add_to_link_targets = """ link_targets.append(":{{}}/{pkg}".format(name))""".format(pkg = fp_package)
413-
npm_link_all_packages_bzl.append(add_to_link_targets)
414-
package_scope = fp_package[:fp_package.find("/", 1)] if fp_package[0] == "@" else None
415-
if package_scope:
416-
npm_link_all_packages_bzl.append(_ADD_SCOPE_TARGET.format(package_scope = package_scope))
417+
if "//visibility:public" in package_visibility:
418+
add_to_link_targets = """ link_targets.append(":{{}}/{pkg}".format(name))""".format(pkg = fp_package)
419+
npm_link_all_packages_bzl.append(add_to_link_targets)
420+
package_scope = fp_package[:fp_package.find("/", 1)] if fp_package[0] == "@" else None
421+
if package_scope:
422+
npm_link_all_packages_bzl.append(_ADD_SCOPE_TARGET.format(package_scope = package_scope))
417423

418424
# Generate catch all & scoped js_library targets
419425
npm_link_all_packages_bzl.append("""
@@ -544,8 +550,11 @@ def _gen_npm_import(rctx, system_tar, _import, link_workspace):
544550
maybe_replace_package = ("""
545551
replace_package = "%s",""" % _import.replace_package) if _import.replace_package else ""
546552

553+
link_packages = {}
554+
for link_package, link_names in _import.link_packages.items():
555+
link_packages[link_package] = [link_name["pkg"] for link_name in link_names]
547556
return _NPM_IMPORT_TMPL.format(
548-
link_packages = starlark_codegen_utils.to_dict_attr(_import.link_packages, 2, quote_value = False),
557+
link_packages = starlark_codegen_utils.to_dict_attr(link_packages, 2, quote_value = False),
549558
link_workspace = link_workspace,
550559
maybe_bins = maybe_bins,
551560
maybe_commit = maybe_commit,

0 commit comments

Comments
 (0)