Add js_component rule from Gerrit core

Change-Id: I1db7c326a9af1aaefcd703dc1d8f588106488edd
diff --git a/js/BUILD b/js/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/js/BUILD
diff --git a/js/defs.bzl b/js/defs.bzl
new file mode 100644
index 0000000..dd95df9
--- /dev/null
+++ b/js/defs.bzl
@@ -0,0 +1,3 @@
+load("//js/private:js_component.bzl", _js_component = "js_component")
+
+js_component = _js_component
diff --git a/js/private/BUILD b/js/private/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/js/private/BUILD
diff --git a/js/private/js_component.bzl b/js/private/js_component.bzl
new file mode 100644
index 0000000..11ba396
--- /dev/null
+++ b/js/private/js_component.bzl
@@ -0,0 +1,47 @@
+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",
+    },
+)