anki/ts/esbuild/helpers.bzl

121 lines
3.5 KiB
Python
Raw Normal View History

"""
NOTE: this file was forked from the following repo (Apache2)
https://github.com/bazelbuild/rules_nodejs/blob/c47b770a122e9614516df2e3fdca6fe0bf6e3420/packages/esbuild/helpers.bzl
2021-03-28 04:32:40 +02:00
Local changes not in upstream:
https://github.com/bazelbuild/rules_nodejs/pull/2563
Utility helper functions for the esbuild rule
"""
load("@build_bazel_rules_nodejs//third_party/github.com/bazelbuild/bazel-skylib:lib/paths.bzl", "paths")
def strip_ext(f):
"Strips the extension of a file."
return f.short_path[:-len(f.extension) - 1]
def resolve_js_input(f, inputs):
"""Find a corresponding javascript entrypoint for a provided file
Args:
f: The file where its basename is used to match the entrypoint
inputs: The list of files where it should take a look at
Returns:
Returns the file that is the corresponding entrypoint
"""
if f.extension == "js" or f.extension == "mjs":
return f
no_ext = strip_ext(f)
for i in inputs:
if i.extension == "js" or i.extension == "mjs":
if strip_ext(i) == no_ext:
return i
fail("Could not find corresponding javascript entry point for %s. Add the %s.js to your deps." % (f.path, no_ext))
def filter_files(input, endings = [".js"]):
"""Filters a list of files for specific endings
Args:
input: The depset or list of files
endings: The list of endings that should be filtered for
Returns:
Returns the filtered list of files
"""
# Convert input into list regardles of being a depset or list
input_list = input.to_list() if type(input) == "depset" else input
filtered = []
for file in input_list:
for ending in endings:
if file.path.endswith(ending):
filtered.append(file)
continue
return filtered
def generate_path_mapping(package_name, path):
"""Generate a path alias mapping for a jsconfig.json
For example: {"@my-alias/*": [ "path/to/my-alias/*" ]},
Args:
package_name: The module name
path: The base path of the package
"""
pkg = {}
# entry for the barrel files favor mjs over normal as it results
# in smaller bundles
pkg[package_name] = [
path + "/index.mjs",
path,
]
# A glob import for deep package imports
pkg[package_name + "/*"] = [path + "/*"]
return pkg
def write_jsconfig_file(ctx, path_alias_mappings):
"""Writes the js config file for the path alias mappings.
Args:
ctx: The rule context
path_alias_mappings: Dict with the mappings
Returns:
File object reference for the jsconfig file
"""
# The package path, including an "external/repo_name/" prefix if the package is in
# an external repo.
rule_path = paths.join(ctx.label.workspace_root, paths.dirname(ctx.build_file_path))
# Replace all segments in the path with .. join them with "/" and postfix
# it with another / to get a relative path from the build file dir
# to the workspace root.
if len(rule_path) == 0:
base_url_path = "."
else:
base_url_path = "/".join([".." for segment in rule_path.split("/")]) + "/"
# declare the jsconfig_file
jsconfig_file = ctx.actions.declare_file("%s.config.json" % ctx.attr.name)
# write the config file
ctx.actions.write(
output = jsconfig_file,
content = struct(compilerOptions = struct(
rootDirs = ["."],
baseUrl = base_url_path,
paths = path_alias_mappings,
)).to_json(),
)
return jsconfig_file