Merge "Move plugin UI macros to bazlets and align minification with Gerrit core"
diff --git a/.bazelversion b/.bazelversion
new file mode 100644
index 0000000..acd405b
--- /dev/null
+++ b/.bazelversion
@@ -0,0 +1 @@
+8.6.0
diff --git a/.gitignore b/.gitignore
index 5bab770..3dc7721 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
/bazel-bazlets
/bazel-out
/bazel-testlogs
+/node_modules
*.pyc
.DS_Store
*.swp
diff --git a/MODULE.bazel b/MODULE.bazel
index 4f1de5b..40a398b 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -5,6 +5,7 @@
version = GERRIT_API_VERSION,
)
+bazel_dep(name = "aspect_rules_rollup", version = "2.0.1")
bazel_dep(name = "bazel_skylib", version = "1.9.0")
bazel_dep(name = "rules_java", version = "8.16.1")
bazel_dep(name = "rules_jvm_external", version = "6.10")
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
index b143985..eb69744 100644
--- a/MODULE.bazel.lock
+++ b/MODULE.bazel.lock
@@ -21,6 +21,13 @@
"https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85",
"https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442",
"https://bcr.bazel.build/modules/apple_support/1.23.1/source.json": "d888b44312eb0ad2c21a91d026753f330caa48a25c9b2102fae75eb2b0dcfdd2",
+ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/MODULE.bazel": "cb1ba9f9999ed0bc08600c221f532c1ddd8d217686b32ba7d45b0713b5131452",
+ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.11.0/source.json": "92494d5aa43b96665397dd13ee16023097470fa85e276b93674d62a244de47ee",
+ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c",
+ "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5",
+ "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/source.json": "a6b09288ab135225982a58ac0b5e2c032c331d88f80553d86596000e894e86b3",
+ "https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/MODULE.bazel": "296e3a053658c2af989ba9bd62a205e6d1fa84bdd6dd5249196546e6b84770ec",
+ "https://bcr.bazel.build/modules/aspect_rules_rollup/2.0.1/source.json": "2fe8ac1ccb4de74bf884761e070010280b272d94e3997205b361b91c75409726",
"https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b",
"https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd",
"https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8",
@@ -37,6 +44,7 @@
"https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
"https://bcr.bazel.build/modules/bazel_features/1.30.0/source.json": "b07e17f067fe4f69f90b03b36ef1e08fe0d1f3cac254c1241a1818773e3423bc",
"https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
+ "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b",
"https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
"https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8",
"https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e",
@@ -184,6 +192,8 @@
"https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d",
"https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c",
"https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
+ "https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e",
+ "https://bcr.bazel.build/modules/rules_nodejs/6.2.0/source.json": "a77c307175a82982f0847fd6a8660db5b21440d8a9d073642cb4afa7a18612ff",
"https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
"https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff",
"https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a",
@@ -222,6 +232,7 @@
"https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186",
"https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8",
"https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c",
+ "https://bcr.bazel.build/modules/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4",
"https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef",
"https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd",
"https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c",
@@ -240,6 +251,109 @@
},
"selectedYankedVersions": {},
"moduleExtensions": {
+ "@@aspect_rules_js+//npm:extensions.bzl%pnpm": {
+ "general": {
+ "bzlTransitiveDigest": "HRRDUZUB4rW09cDf//73OaGv0t4EFAUO559mXYx2Jfc=",
+ "usagesDigest": "VcsfDFwmBt+ECaA/4/v9Ozpk8OnXWBpmy21oeFuDhZg=",
+ "recordedFileInputs": {},
+ "recordedDirentsInputs": {},
+ "envVariables": {},
+ "generatedRepoSpecs": {
+ "pnpm": {
+ "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule",
+ "attributes": {
+ "package": "pnpm",
+ "version": "8.6.7",
+ "root_package": "",
+ "link_workspace": "",
+ "link_packages": {},
+ "integrity": "sha512-vRIWpD/L4phf9Bk2o/O2TDR8fFoJnpYrp2TKqTIZF/qZ2/rgL3qKXzHofHgbXsinwMoSEigz28sqk3pQ+yMEQQ==",
+ "url": "",
+ "commit": "",
+ "patch_args": [
+ "-p0"
+ ],
+ "patches": [],
+ "custom_postinstall": "",
+ "npm_auth": "",
+ "npm_auth_basic": "",
+ "npm_auth_username": "",
+ "npm_auth_password": "",
+ "lifecycle_hooks": [],
+ "extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])",
+ "generate_bzl_library_targets": false,
+ "extract_full_archive": true,
+ "system_tar": "auto"
+ }
+ },
+ "pnpm__links": {
+ "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links",
+ "attributes": {
+ "package": "pnpm",
+ "version": "8.6.7",
+ "dev": false,
+ "root_package": "",
+ "link_packages": {},
+ "deps": {},
+ "transitive_closure": {},
+ "lifecycle_build_target": false,
+ "lifecycle_hooks_env": [],
+ "lifecycle_hooks_execution_requirements": [
+ "no-sandbox"
+ ],
+ "lifecycle_hooks_use_default_shell_env": false,
+ "bins": {},
+ "package_visibility": [
+ "//visibility:public"
+ ],
+ "replace_package": ""
+ }
+ }
+ },
+ "recordedRepoMappingEntries": [
+ [
+ "aspect_bazel_lib+",
+ "bazel_skylib",
+ "bazel_skylib+"
+ ],
+ [
+ "aspect_bazel_lib+",
+ "bazel_tools",
+ "bazel_tools"
+ ],
+ [
+ "aspect_rules_js+",
+ "aspect_bazel_lib",
+ "aspect_bazel_lib+"
+ ],
+ [
+ "aspect_rules_js+",
+ "bazel_features",
+ "bazel_features+"
+ ],
+ [
+ "aspect_rules_js+",
+ "bazel_skylib",
+ "bazel_skylib+"
+ ],
+ [
+ "aspect_rules_js+",
+ "bazel_tools",
+ "bazel_tools"
+ ],
+ [
+ "bazel_features+",
+ "bazel_features_globals",
+ "bazel_features++version_extension+bazel_features_globals"
+ ],
+ [
+ "bazel_features+",
+ "bazel_features_version",
+ "bazel_features++version_extension+bazel_features_version"
+ ]
+ ]
+ }
+ },
"@@pybind11_bazel+//:internal_configure.bzl%internal_configure_extension": {
"general": {
"bzlTransitiveDigest": "NFQjcZF+fAvf5fDH+pqsx4JrfzP9PuHBz6S6ZutIbnw=",
@@ -527,6 +641,127 @@
]
}
},
+ "@@rules_nodejs+//nodejs:extensions.bzl%node": {
+ "general": {
+ "bzlTransitiveDigest": "0IJr1Jg3Dns9QKY65MtauFLtHjjP3n1DgN0+ZAjFYXo=",
+ "usagesDigest": "lYnf78fCR7lvI17f6EaZO0GCSdImBY/Loh6ocUce2GI=",
+ "recordedFileInputs": {},
+ "recordedDirentsInputs": {},
+ "envVariables": {},
+ "generatedRepoSpecs": {
+ "nodejs_linux_amd64": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "linux_amd64"
+ }
+ },
+ "nodejs_linux_arm64": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "linux_arm64"
+ }
+ },
+ "nodejs_linux_s390x": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "linux_s390x"
+ }
+ },
+ "nodejs_linux_ppc64le": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "linux_ppc64le"
+ }
+ },
+ "nodejs_darwin_amd64": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "darwin_amd64"
+ }
+ },
+ "nodejs_darwin_arm64": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "darwin_arm64"
+ }
+ },
+ "nodejs_windows_amd64": {
+ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories",
+ "attributes": {
+ "node_download_auth": {},
+ "node_repositories": {},
+ "node_urls": [
+ "https://nodejs.org/dist/v{version}/{filename}"
+ ],
+ "node_version": "18.20.3",
+ "include_headers": false,
+ "platform": "windows_amd64"
+ }
+ },
+ "nodejs": {
+ "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias",
+ "attributes": {
+ "user_node_repository_name": "nodejs"
+ }
+ },
+ "nodejs_host": {
+ "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias",
+ "attributes": {
+ "user_node_repository_name": "nodejs"
+ }
+ },
+ "nodejs_toolchains": {
+ "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo",
+ "attributes": {
+ "user_node_repository_name": "nodejs"
+ }
+ }
+ },
+ "recordedRepoMappingEntries": []
+ }
+ },
"@@rules_python+//python/extensions:config.bzl%config": {
"general": {
"bzlTransitiveDigest": "9cZw51LLMu2V/jKcxvnA1pBg58ZgQEDuMni3CbNZSRg=",
diff --git a/js/defs.bzl b/js/defs.bzl
index dd95df9..6102dcd 100644
--- a/js/defs.bzl
+++ b/js/defs.bzl
@@ -1,3 +1,10 @@
load("//js/private:js_component.bzl", _js_component = "js_component")
+load(
+ "//js/private:plugin.bzl",
+ _gerrit_js_bundle = "gerrit_js_bundle",
+ _polygerrit_plugin = "polygerrit_plugin",
+)
+gerrit_js_bundle = _gerrit_js_bundle
js_component = _js_component
+polygerrit_plugin = _polygerrit_plugin
diff --git a/js/private/plugin.bzl b/js/private/plugin.bzl
new file mode 100644
index 0000000..212c798
--- /dev/null
+++ b/js/private/plugin.bzl
@@ -0,0 +1,117 @@
+load("@aspect_rules_rollup//rollup:defs.bzl", "rollup")
+load("@com_googlesource_gerrit_bazlets//tools:genrule2.bzl", "genrule2")
+
+def _rollup_minify(
+ name,
+ srcs,
+ entry_point,
+ rollup_config,
+ node_modules):
+ """Run Rollup with @rollup/plugin-terser; emit the minified bundle."""
+ rollup(
+ name = name,
+ srcs = srcs,
+ entry_point = entry_point,
+ args = [
+ "--bundleConfigAsCjs=true",
+ ],
+ format = "iife",
+ silent = True,
+ sourcemap = "hidden",
+ config_file = rollup_config,
+ node_modules = node_modules,
+ deps = [
+ node_modules + "/@rollup/plugin-node-resolve",
+ node_modules + "/@rollup/plugin-terser",
+ ],
+ )
+
+def gerrit_js_bundle(
+ name,
+ srcs,
+ entry_point,
+ rollup_config = "//plugins:rollup.config",
+ node_modules = "//tools/node_tools:node_modules"):
+ """Produces a Gerrit JavaScript bundle archive.
+
+ This rule bundles and minifies frontend plugin JavaScript files with Rollup.
+ Output is an archive "${name}.jar" with Gerrit frontend plugin layout.
+ """
+
+ bundle = name + "-bundle"
+ main = name + ".js"
+
+ _rollup_minify(
+ name = bundle,
+ srcs = srcs,
+ entry_point = entry_point,
+ rollup_config = rollup_config,
+ node_modules = node_modules,
+ )
+
+ native.genrule(
+ name = name + "_rename_js",
+ srcs = [bundle],
+ 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 polygerrit_plugin(
+ name,
+ app,
+ plugin_name = None,
+ rollup_config = "//plugins:rollup.config",
+ node_modules = "//tools/node_tools:node_modules"):
+ """Produces a plugin file set with minified JavaScript.
+
+ This rule minifies a single-source frontend plugin and exposes the
+ result as a filegroup containing one .js file. Unlike gerrit_js_bundle,
+ no .jar archive is produced; consumers depend on the filegroup
+ directly.
+
+ Args:
+ name: Rule name. The output filegroup is named "${name}".
+ app: The single root source JavaScript file fed into Rollup.
+ plugin_name: Filename stem for the emitted .js. Defaults to ${name}.
+ rollup_config: Label of the shared Rollup config file.
+ node_modules: Label of the node_modules tree the plugins resolve
+ against.
+ """
+ if not plugin_name:
+ plugin_name = name
+
+ bundle = plugin_name + "-bundle"
+
+ _rollup_minify(
+ name = bundle,
+ srcs = [app],
+ entry_point = app,
+ rollup_config = rollup_config,
+ node_modules = node_modules,
+ )
+
+ native.genrule(
+ name = name + "_rename_js",
+ srcs = [bundle],
+ outs = [plugin_name + ".js"],
+ cmd = "cp $< $@",
+ output_to_bindir = True,
+ )
+
+ native.filegroup(
+ name = name,
+ srcs = [plugin_name + ".js"],
+ )
diff --git a/tools/js.bzl b/tools/js.bzl
deleted file mode 100644
index e360e84..0000000
--- a/tools/js.bzl
+++ /dev/null
@@ -1,81 +0,0 @@
-load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
-load("@npm//@bazel/terser:index.bzl", "terser_minified")
-load("@com_googlesource_gerrit_bazlets//tools:genrule2.bzl", "genrule2")
-
-def gerrit_js_bundle(
- name,
- srcs,
- entry_point,
- deps = [],
- args = [],
- config_file = None,
- rollup_bin = None,
- include_node_modules = False):
- """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: Plugin name.
- srcs: Plugin sources.
- entry_point: Plugin entry_point.
- deps: Additional JavaScript deps required by Rollup.
- args: Extra args for Rollup.
- config_file: Optional Rollup config file.
- rollup_bin: Optional Rollup binary target.
- include_node_modules: Whether to include @npm//:node_modules in srcs.
- """
-
- bundle = name + "-bundle"
- minified = name + ".min"
- main = name + ".js"
-
- rollup_srcs = srcs
- if include_node_modules:
- rollup_srcs = rollup_srcs + ["@npm//:node_modules"]
-
- rollup_kwargs = dict(
- name = bundle,
- srcs = rollup_srcs,
- entry_point = entry_point,
- format = "iife",
- sourcemap = "hidden",
- deps = deps,
- args = args,
- )
- if config_file:
- rollup_kwargs["config_file"] = config_file
- if rollup_bin:
- rollup_kwargs["rollup_bin"] = rollup_bin
-
- rollup_bundle(**rollup_kwargs)
-
- 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 .",
- ]),
- )