blob: eeb5594018e5607bdfe0d8c743878ccb74852694 [file] [log] [blame]
load("@build_bazel_rules_nodejs//:providers.bzl", "JSModuleInfo")
load("@npm//@bazel/rollup:index.bzl", upstream_rollup_bundle = "rollup_bundle")
load("@npm//@bazel/terser:index.bzl", "terser_minified")
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@npm//@bazel/protractor:index.bzl", "protractor_web_test_suite")
load("@npm//@bazel/typescript:index.bzl", "ts_project")
def rollup_bundle(name, deps, visibility = None, **kwargs):
"""Calls the upstream rollup_bundle() and exposes a .min.js file.
Legacy version of rollup_bundle() used to provide the .min.js file. This
wrapper provides the same interface by explicitly exposing a .min.js file.
"""
upstream_rollup_bundle(
name = name,
visibility = visibility,
deps = deps + [
"@npm//@rollup/plugin-node-resolve",
],
config_file = "//:rollup.config.js",
link_workspace_root = True,
**kwargs
)
terser_minified(
name = name + "__min",
src = name + ".js",
)
# Copy the __min.js file (a declared output inside the rule) so that it's a
# pre-declared output and publicly visible. I.e. via attr.output() below.
_expose_minified_js(
name = name + "__min_exposed",
src = ":%s__min" % name,
out = name + ".min.js",
visibility = visibility,
)
def _expose_minified_js_impl(ctx):
"""Copies the .min.js file in order to make it publicly accessible."""
sources = ctx.attr.src[JSModuleInfo].sources.to_list()
min_js = None
for src in sources:
if src.basename.endswith("__min.js"):
min_js = src
break
if min_js == None:
fail("Couldn't find .min.js in " + str(ctx.attr.src))
ctx.actions.run(
inputs = [min_js],
outputs = [ctx.outputs.out],
executable = "cp",
arguments = [min_js.path, ctx.outputs.out.path],
)
_expose_minified_js = rule(
implementation = _expose_minified_js_impl,
attrs = {
"src": attr.label(providers = [JSModuleInfo]),
"out": attr.output(mandatory = True),
},
)
# Some rules (e.g. babel()) do not expose their files as runfiles. So we need
# to do this step manually.
def _turn_files_into_runfiles_impl(ctx):
files = ctx.attr.files.files
return [DefaultInfo(
files = files,
runfiles = ctx.runfiles(transitive_files = files),
)]
turn_files_into_runfiles = rule(
implementation = _turn_files_into_runfiles_impl,
attrs = {
"files": attr.label(
mandatory = True,
doc = "The target whose files should be turned into runfiles.",
),
},
)
def protractor_ts_test(name, srcs, deps = None, **kwargs):
"""Wraps upstream protractor_web_test_suite() to reduce boilerplate.
This is largely based on the upstream protractor example:
https://github.com/bazelbuild/rules_nodejs/blob/stable/examples/angular/e2e/BUILD.bazel
See the documentation for more information:
https://bazelbuild.github.io/rules_nodejs/Protractor.html#protractor_web_test_suite
"""
ts_project(
name = name + "__lib",
srcs = srcs,
testonly = 1,
deps = (deps or []) + [
# Implicit deps that are necessary to get tests of this kind to
# work.
"@npm//@types/jasmine",
"@npm//jasmine",
"@npm//protractor",
"@npm//@types/node",
],
tsconfig = {},
declaration = True,
declaration_map = True,
)
protractor_web_test_suite(
name = name,
srcs = [paths.replace_extension(src, ".js") for src in srcs],
deps = [":%s__lib" % name],
**kwargs
)