Added bzlmod support to all extension rules. (#3037)

Additional Changes:
- The rules `rules_nodejs` for `rules_rust_wasm_bindgen` will no longer
tested and will be dropped unless bzlmod support is added for the
original `bazel_build_rules_nodejs` rules.
- `rules_rust_bindgen` updated default clang version to 17.0.3 to match
bzlmod available version.
- `rules_rust_prost` updated protobuf version to `v28.3`

Relates to:
- https://github.com/bazelbuild/rules_rust/issues/2181
diff --git a/extensions/prost/.bazelignore b/extensions/prost/.bazelignore
index 8c29e7d..68062bd 100644
--- a/extensions/prost/.bazelignore
+++ b/extensions/prost/.bazelignore
@@ -1,5 +1,5 @@
 examples
 bazel-out
 bazel-testlogs
-bazel-extensions
+bazel-prost
 bazel-bin
diff --git a/extensions/prost/.bazelrc b/extensions/prost/.bazelrc
index 6b20ca4..f3e5a5d 100644
--- a/extensions/prost/.bazelrc
+++ b/extensions/prost/.bazelrc
@@ -60,9 +60,8 @@
 ## Bzlmod
 ###############################################################################
 
-# TODO: migrate all dependencies from WORKSPACE to MODULE.bazel
-# https://github.com/bazelbuild/rules_rust/issues/2181
-common --noenable_bzlmod --enable_workspace
+# A configuration for disabling bzlmod.
+common:no-bzlmod --noenable_bzlmod --enable_workspace
 
 # Disable the bzlmod lockfile, so we don't accidentally commit MODULE.bazel.lock
 common --lockfile_mode=off
diff --git a/extensions/prost/MODULE.bazel b/extensions/prost/MODULE.bazel
index fa1842e..7b59f68 100644
--- a/extensions/prost/MODULE.bazel
+++ b/extensions/prost/MODULE.bazel
@@ -16,11 +16,11 @@
 
 bazel_dep(
     name = "bazel_skylib",
-    version = "1.5.0",
+    version = "1.7.1",
 )
 bazel_dep(
     name = "rules_cc",
-    version = "0.0.9",
+    version = "0.0.17",
 )
 bazel_dep(
     name = "rules_proto",
@@ -28,13 +28,13 @@
 )
 bazel_dep(
     name = "protobuf",
-    version = "21.7",
+    version = "28.3",
     repo_name = "com_google_protobuf",
 )
 
-rust_ext_prost = use_extension("//:extensions.bzl", "rust_ext_prost")
+rust_ext = use_extension("//:extensions.bzl", "rust_ext")
 use_repo(
-    rust_ext_prost,
+    rust_ext,
     "rules_rust_prost_deps",
     "rules_rust_prost_deps__h2-0.4.6",
     "rules_rust_prost_deps__heck",
@@ -50,3 +50,25 @@
 register_toolchains(
     "//:default_prost_toolchain",
 )
+
+bazel_dep(
+    name = "googleapis",
+    version = "0.0.0-20240819-fe8ba054a",
+    dev_dependency = True,
+    repo_name = "com_google_googleapis",
+)
+bazel_dep(
+    name = "bazel_ci_rules",
+    version = "1.0.0",
+    dev_dependency = True,
+)
+
+rust_ext_dev = use_extension(
+    "//private:internal_extensions.bzl",
+    "rust_ext_dev",
+    dev_dependency = True,
+)
+use_repo(
+    rust_ext_dev,
+    "buildkite_config",
+)
diff --git a/extensions/prost/WORKSPACE.bazel b/extensions/prost/WORKSPACE.bazel
index 7b6296a..f59107e 100644
--- a/extensions/prost/WORKSPACE.bazel
+++ b/extensions/prost/WORKSPACE.bazel
@@ -33,6 +33,11 @@
 
 rust_prost_transitive_repositories()
 
+# Needed by protobuf
+load("@rules_python//python:repositories.bzl", "py_repositories")
+
+py_repositories()
+
 # buildifier: disable=bzl-visibility
 load("//private/tests:deps.bzl", "prost_test_deps")
 
diff --git a/extensions/prost/extensions.bzl b/extensions/prost/extensions.bzl
index 1fc8e4b..f3b9569 100644
--- a/extensions/prost/extensions.bzl
+++ b/extensions/prost/extensions.bzl
@@ -2,7 +2,7 @@
 
 load("//:repositories.bzl", "rust_prost_dependencies")
 
-def _rust_ext_prost_impl(module_ctx):
+def _rust_ext_impl(module_ctx):
     # This should contain the subset of WORKSPACE.bazel that defines
     # repositories.
     direct_deps = []
@@ -17,7 +17,7 @@
         root_module_direct_dev_deps = [],
     )
 
-rust_ext_prost = module_extension(
-    doc = "Dependencies for rules_rust extensions.",
-    implementation = _rust_ext_prost_impl,
+rust_ext = module_extension(
+    doc = "Dependencies for the rules_rust prost extension.",
+    implementation = _rust_ext_impl,
 )
diff --git a/extensions/prost/private/internal_extensions.bzl b/extensions/prost/private/internal_extensions.bzl
new file mode 100644
index 0000000..3b76d5e
--- /dev/null
+++ b/extensions/prost/private/internal_extensions.bzl
@@ -0,0 +1,26 @@
+"""Bzlmod internal extensions"""
+
+load("@bazel_ci_rules//:rbe_repo.bzl", "rbe_preconfig")
+
+def _rust_ext_dev_impl(module_ctx):
+    deps = []
+
+    rbe_preconfig(
+        name = "buildkite_config",
+        toolchain = "ubuntu1804-bazel-java11",
+    )
+
+    deps.append(struct(repo = "buildkite_config"))
+
+    # is_dev_dep is ignored here. It's not relevant for internal_deps, as dev
+    # dependencies are only relevant for module extensions that can be used
+    # by other MODULES.
+    return module_ctx.extension_metadata(
+        root_module_direct_deps = [],
+        root_module_direct_dev_deps = [repo.repo for repo in deps],
+    )
+
+rust_ext_dev = module_extension(
+    doc = "Development dependencies for the rules_rust_prost extension.",
+    implementation = _rust_ext_dev_impl,
+)
diff --git a/extensions/prost/private/tests/well_known_types/well_known_types_test.rs b/extensions/prost/private/tests/well_known_types/well_known_types_test.rs
index f74796e..eb985dc 100644
--- a/extensions/prost/private/tests/well_known_types/well_known_types_test.rs
+++ b/extensions/prost/private/tests/well_known_types/well_known_types_test.rs
@@ -2,11 +2,11 @@
 
 use well_known_types_proto::any_proto::google::protobuf::Any;
 use well_known_types_proto::api_proto::google::protobuf::{Api, Method, Mixin};
-use well_known_types_proto::compiler_plugin_proto::google::protobuf::compiler::Version;
 use well_known_types_proto::descriptor_proto::google::protobuf::DescriptorProto;
 use well_known_types_proto::duration_proto::google::protobuf::Duration;
 use well_known_types_proto::empty_proto::google::protobuf::Empty;
 use well_known_types_proto::field_mask_proto::google::protobuf::FieldMask;
+use well_known_types_proto::plugin_proto::google::protobuf::compiler::Version;
 use well_known_types_proto::source_context_proto::google::protobuf::SourceContext;
 use well_known_types_proto::struct_proto::google::protobuf::Struct;
 use well_known_types_proto::struct_proto::google::protobuf::Value;
diff --git a/extensions/prost/repositories.bzl b/extensions/prost/repositories.bzl
index 27a0772..5718092 100644
--- a/extensions/prost/repositories.bzl
+++ b/extensions/prost/repositories.bzl
@@ -36,9 +36,9 @@
         maybe(
             http_archive,
             name = "com_google_protobuf",
-            sha256 = "52b6160ae9266630adb5e96a9fc645215336371a740e87d411bfb63ea2f268a0",
-            strip_prefix = "protobuf-3.18.0",
-            urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v3.18.0/protobuf-all-3.18.0.tar.gz"],
+            integrity = "sha256-fD69eq7dhvpdxHmg/agD9gLKr3jYr/fOg7ieG4rnRCo=",
+            strip_prefix = "protobuf-28.3",
+            urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v28.3/protobuf-28.3.tar.gz"],
         )
         maybe(
             http_archive,
diff --git a/extensions/prost/transitive_repositories.bzl b/extensions/prost/transitive_repositories.bzl
index 60c99ed..277fd41 100644
--- a/extensions/prost/transitive_repositories.bzl
+++ b/extensions/prost/transitive_repositories.bzl
@@ -1,6 +1,7 @@
 """Definitions for loading transitive `@rules_rust//proto` dependencies"""
 
 load("@bazel_features//:deps.bzl", "bazel_features_deps")
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
 load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
 
 def rust_prost_transitive_repositories():
@@ -11,3 +12,5 @@
     rules_proto_dependencies()
 
     bazel_features_deps()
+
+    protobuf_deps()