blob: c8d6e4b261ee86d2b1bc2a42c0efec67c065b9c2 [file] [log] [blame]
load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
load("@npm//@bazel/terser:index.bzl", "terser_minified")
load("//tools/bzl:genrule2.bzl", "genrule2")
ComponentInfo = provider()
def _js_component(ctx):
dir = ctx.outputs.zip.path + ".dir"
name = ctx.outputs.zip.basename
if name.endswith(".zip"):
name = name[:-4]
dest = "%s/%s" % (dir, name)
cmd = " && ".join([
"TZ=UTC",
"export TZ",
"mkdir -p %s" % dest,
"cp %s %s/" % (" ".join([s.path for s in ctx.files.srcs]), dest),
"cd %s" % dir,
"find . -exec touch -t 198001010000 '{}' ';'",
"zip -Xqr ../%s *" % ctx.outputs.zip.basename,
])
ctx.actions.run_shell(
inputs = ctx.files.srcs,
outputs = [ctx.outputs.zip],
command = cmd,
mnemonic = "GenJsComponentZip",
)
licenses = []
if ctx.file.license:
licenses.append(ctx.file.license)
return [
ComponentInfo(
transitive_licenses = depset(licenses),
transitive_versions = depset(),
transitive_zipfiles = list([ctx.outputs.zip]),
),
]
js_component = rule(
_js_component,
attrs = {
"srcs": attr.label_list(allow_files = [".js"]),
"license": attr.label(allow_single_file = True),
},
outputs = {
"zip": "%{name}.zip",
},
)
def polygerrit_plugin(name, app, plugin_name = None):
"""Produces plugin file set with minified javascript.
This rule minifies a plugin javascript file, potentially renames it, and produces a file set.
Output of this rule is a FileSet with "${plugin_name}.js".
Args:
name: String, rule name.
app: String, the main or root source file. This must be single JavaScript file.
plugin_name: String, plugin name. ${name} is used if not provided.
"""
if not plugin_name:
plugin_name = name
terser_minified(
name = plugin_name + ".min",
sourcemap = False,
src = app,
)
native.genrule(
name = name + "_rename_js",
srcs = [plugin_name + ".min"],
outs = [plugin_name + ".js"],
cmd = "cp $< $@",
output_to_bindir = True,
)
native.filegroup(
name = name,
srcs = [plugin_name + ".js"],
)
def gerrit_js_bundle(name, entry_point, srcs = []):
"""Produces a Gerrit JavaScript bundle archive.
This rule bundles and minifies the javascript files of a frontend plugin and
produces a file archive.
Output of this rule is an archive with "${name}.jar" with specific layout for
Gerrit frontend plugins. That archive should be provided to gerrit_plugin
rule as resource_jars attribute.
Args:
name: Rule name.
srcs: Plugin sources.
entry_point: Plugin entry_point.
"""
bundle = name + "-bundle"
minified = name + ".min"
main = name + ".js"
rollup_bundle(
name = bundle,
srcs = srcs + [
"@plugins_npm//:node_modules",
],
entry_point = entry_point,
format = "iife",
rollup_bin = "//tools/node_tools:rollup-bin",
sourcemap = "hidden",
config_file = "//plugins:rollup.config.js",
deps = [
"@tools_npm//rollup-plugin-node-resolve",
],
)
terser_minified(
name = minified,
sourcemap = False,
src = bundle,
)
native.genrule(
name = name + "_rename_js",
srcs = [minified],
outs = [main],
cmd = "cp $< $@",
output_to_bindir = True,
)
genrule2(
name = name,
srcs = [main],
outs = [name + ".jar"],
cmd = " && ".join([
"mkdir $$TMP/static",
"cp $(SRCS) $$TMP/static",
"cd $$TMP",
"zip -Drq $$ROOT/$@ -g .",
]),
)
def karma_test(name, srcs, data):
"""Creates a Karma test target.
It can be used both for the main Gerrit js bundle, but also for plugins. So
it should be extremely easy to add Karma test capabilities for new plugins.
We are sharing one karma.conf.js file. If you want to customize that, then
consider using command line arguments that the config file can process, see
the `root` argument for an example.
Args:
name: The name of the test rule.
srcs: The shell script to invoke, where you can set command line
arguments for Karma and its config.
data: The bundle of JavaScript files with the tests included.
"""
native.sh_test(
name = name,
size = "enormous",
srcs = srcs,
args = [
"$(location //polygerrit-ui:karma_bin)",
"$(location //polygerrit-ui:karma.conf.js)",
],
data = data + [
"//polygerrit-ui:karma_bin",
"//polygerrit-ui:karma.conf.js",
],
# Should not run sandboxed.
tags = ["karma", "local", "manual"],
)