Bazel: Add gerrit_js_bundle rule

Change-Id: Ia8421a9ef6f1ad91808bb698769da84022f63973
(cherry picked from commit 9975c3cf96a1fa8d68a6582e57fef235ea208abc)
diff --git a/tools/bzl/js.bzl b/tools/bzl/js.bzl
index bbb1432..7f78bcb4 100644
--- a/tools/bzl/js.bzl
+++ b/tools/bzl/js.bzl
@@ -1,5 +1,7 @@
+load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
 load("@npm//@bazel/terser:index.bzl", "terser_minified")
 load("//lib/js:npm.bzl", "NPM_SHA1S", "NPM_VERSIONS")
+load("//tools/bzl:genrule2.bzl", "genrule2")
 
 NPMJS = "NPMJS"
 
@@ -534,3 +536,55 @@
         name = name,
         srcs = static_files,
     )
+
+def gerrit_js_bundle(name, srcs, entry_point):
+    """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 frontentd 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.
+    """
+    rollup_bundle(
+        name = name + "-bundle",
+        srcs = srcs,
+        entry_point = entry_point,
+        format = "iife",
+        rollup_bin = "//tools/node_tools:rollup-bin",
+        sourcemap = "hidden",
+        deps = [
+            "@tools_npm//rollup-plugin-node-resolve",
+        ],
+    )
+
+    terser_minified(
+        name = name + ".min",
+        sourcemap = False,
+        src = name + "-bundle.js",
+    )
+
+    native.genrule(
+        name = name + "_rename_js",
+        srcs = [name + ".min"],
+        outs = [name + ".js"],
+        cmd = "cp $< $@",
+        output_to_bindir = True,
+    )
+
+    genrule2(
+        name = name,
+        srcs = [name + ".js"],
+        outs = [name + ".jar"],
+        cmd = " && ".join([
+            "mkdir $$TMP/static",
+            "cp $(SRCS) $$TMP/static",
+            "cd $$TMP",
+            "zip -Drq $$ROOT/$@ -g .",
+        ]),
+    )