diff --git a/.bazelversion b/.bazelversion new file mode 100644 index 0000000..fcdb2e1 --- /dev/null +++ b/.bazelversion @@ -0,0 +1 @@ +4.0.0 diff --git a/BUILD.bazel b/BUILD.bazel index e69de29..d357c69 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -0,0 +1,11 @@ +filegroup( + name = "all_files", + testonly = True, + srcs = [ + "BUILD.bazel", + "WORKSPACE", + "//protoc-gen-grpc-js:all_files", + "//rules:all_files", + ] + glob(["*.bzl"]), + visibility = ["//visibility:public"], +) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3dadf32 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +.PHONY: goldens +goldens: + find . -name '*.prototext' | xargs rm + ./tools/regenerate_golden_files.sh diff --git a/WORKSPACE b/WORKSPACE index dd6afc4..6270004 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,37 +1,78 @@ workspace(name = "com_github_stackb_grpc_js") -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +local_repository( + name = "build_stack_rules_proto", + path = "../rules_proto", +) -http_archive( - name = "bazel_skylib", - sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d", - strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b", - urls = ["https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz"], +load( + "@build_stack_rules_proto//:deps.bzl", + "bazel_gazelle", + "bazel_skylib", + "com_github_grpc_grpc", + "com_google_protobuf", + "io_bazel_rules_closure", + "io_bazel_rules_go", + "rules_cc", + "zlib", ) -# ================================================================ +# ================================================== +# C++ +# ================================================== +# +rules_cc() -RULES_CLOSURE_VERSION = "50d3dc9e6d27a5577a0f95708466718825d579f4" +# ================================================== +# Go +# ================================================== +# +io_bazel_rules_go() -http_archive( - name = "io_bazel_rules_closure", - url = "https://github.com/bazelbuild/rules_closure/archive/%s.zip" % RULES_CLOSURE_VERSION, - strip_prefix = "rules_closure-%s" % RULES_CLOSURE_VERSION, -) +bazel_gazelle() -http_archive( - name = "net_zlib", - build_file = "@io_bazel_rules_closure//:third_party/zlib.BUILD", - sha256 = "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1", - strip_prefix = "zlib-1.2.11", - urls = ["https://zlib.net/zlib-1.2.11.tar.gz"], -) +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") + +go_rules_dependencies() + +go_register_toolchains() + +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") + +gazelle_dependencies() -bind( - name = "zlib", - actual = "@net_zlib//:zlib", +# ================================================== +# closure +# ================================================== +# +io_bazel_rules_closure() + +load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_dependencies", "rules_closure_toolchains") + +rules_closure_dependencies( + omit_bazel_skylib = True, + omit_com_google_protobuf = True, + omit_zlib = True, ) -load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories") +rules_closure_toolchains() + +# ================================================== +# Protobuf +# ================================================== +# +com_google_protobuf() + +bazel_skylib() + +zlib() + +# ================================================== +# gRPC +# ================================================== +# +com_github_grpc_grpc() + +load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") -closure_repositories() +grpc_deps() diff --git a/protoc-gen-grpc-js/BUILD.bazel b/protoc-gen-grpc-js/BUILD.bazel index 93b8951..ce848a7 100644 --- a/protoc-gen-grpc-js/BUILD.bazel +++ b/protoc-gen-grpc-js/BUILD.bazel @@ -1,5 +1,16 @@ +load("@rules_cc//cc:defs.bzl", "cc_binary") +load("@build_stack_rules_proto//rules:proto_plugin.bzl", "proto_plugin") + package(default_visibility = ["//visibility:public"]) +proto_plugin( + name = "grpc_js", + exclusions = ["google/protobuf"], # TODO(pcj): is this needed? + outputs = ["{protopath}.grpc.js"], + tool = ":protoc-gen-grpc-js", + visibility = ["//visibility:public"], +) + cc_binary( name = "protoc-gen-grpc-js", srcs = [ @@ -9,3 +20,10 @@ cc_binary( "@com_google_protobuf//:protoc_lib", ], ) + +filegroup( + name = "all_files", + testonly = True, + srcs = glob(["**"]), + visibility = ["//visibility:public"], +) diff --git a/rules/BUILD.bazel b/rules/BUILD.bazel new file mode 100644 index 0000000..8cab6e0 --- /dev/null +++ b/rules/BUILD.bazel @@ -0,0 +1,8 @@ +filegroup( + name = "all_files", + testonly = True, + srcs = glob(["**"]), + visibility = ["//visibility:public"], +) + +exports_files(glob(["*.bzl"])) diff --git a/rules/grpc_js.bzl b/rules/grpc_js.bzl new file mode 100644 index 0000000..df61cbb --- /dev/null +++ b/rules/grpc_js.bzl @@ -0,0 +1,6 @@ +# rules for grpc_js +load("@build_stack_rules_proto//rules:grpc_js_grpc_compile.bzl", _grpc_js_grpc_compile = "grpc_js_grpc_compile") +load("@build_stack_rules_proto//rules:grpc_js_grpc_library.bzl", _grpc_js_grpc_library = "grpc_js_grpc_library") + +grpc_js_grpc_compile = _grpc_js_grpc_compile +grpc_js_grpc_library = _grpc_js_grpc_library diff --git a/rules/grpc_js_grpc_compile.bzl b/rules/grpc_js_grpc_compile.bzl new file mode 100644 index 0000000..87d8de4 --- /dev/null +++ b/rules/grpc_js_grpc_compile.bzl @@ -0,0 +1,18 @@ +load( + "@build_stack_rules_proto//rules:proto_aspect.bzl", + "proto_compile_aspect", + "proto_compile_rule_macro", + "proto_compile_rule", +) + +_default_plugins = [ + str(Label("@build_stack_rules_proto//plugins/closure/proto:proto")), + str(Label("//protoc-gen-grpc-js:grpc_js")), +] + +_grpc_js_grpc_compile_aspect = proto_compile_aspect(_default_plugins, "grpc_js_grpc_compile_aspect") + +_grpc_js_grpc_compile_rule = proto_compile_rule(_grpc_js_grpc_compile_aspect) + +def grpc_js_grpc_compile(**kwargs): + proto_compile_rule_macro(_grpc_js_grpc_compile_rule, **kwargs) diff --git a/rules/grpc_js_grpc_compile_deps.bzl b/rules/grpc_js_grpc_compile_deps.bzl new file mode 100644 index 0000000..6753af9 --- /dev/null +++ b/rules/grpc_js_grpc_compile_deps.bzl @@ -0,0 +1,66 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") + +def _maybe(repo_rule, name, **kwargs): + if name not in native.existing_rules(): + repo_rule(name = name, **kwargs) + +def grpc_js_grpc_compile_deps(): + bazel_skylib() + rules_python() + zlib() + com_github_stackb_grpc_js() + com_google_protobuf() + + +def bazel_skylib(): + _maybe( + http_archive, + name = "bazel_skylib", + sha256 = "ebdf850bfef28d923a2cc67ddca86355a449b5e4f38b0a70e584dc24e5984aa6", + strip_prefix = "bazel-skylib-f80bc733d4b9f83d427ce3442be2e07427b2cc8d", + urls = [ + "https://github.com/bazelbuild/bazel-skylib/archive/f80bc733d4b9f83d427ce3442be2e07427b2cc8d.tar.gz", + ], + ) +def rules_python(): + _maybe( + http_archive, + name = "rules_python", + sha256 = "8cc0ad31c8fc699a49ad31628273529ef8929ded0a0859a3d841ce711a9a90d5", + strip_prefix = "rules_python-c7e068d38e2fec1d899e1c150e372f205c220e27", + urls = [ + "https://github.com/bazelbuild/rules_python/archive/c7e068d38e2fec1d899e1c150e372f205c220e27.tar.gz", + ], + ) +def zlib(): + _maybe( + http_archive, + name = "zlib", + sha256 = "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1", + strip_prefix = "zlib-1.2.11", + urls = [ + "https://mirror.bazel.build/zlib.net/zlib-1.2.11.tar.gz", + "https://zlib.net/zlib-1.2.11.tar.gz", + ], + build_file = "@build_stack_rules_proto//third_party:BUILD.bazel.zlib", + ) +def com_github_stackb_grpc_js(): + _maybe( + http_archive, + name = "com_github_stackb_grpc_js", + sha256 = "f9cb4d932badc71d90a89263eabc93551923bb5c621e0940c7cfeaa79ef02596", + strip_prefix = "grpc.js-beb6ac3b43247816c1a1ebf741ebf0c98203414a", + urls = [ + "https://github.com/stackb/grpc.js/archive/beb6ac3b43247816c1a1ebf741ebf0c98203414a.tar.gz", + ], + ) +def com_google_protobuf(): + _maybe( + http_archive, + name = "com_google_protobuf", + sha256 = "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113", + strip_prefix = "protobuf-3.14.0", + urls = [ + "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz", + ], + ) \ No newline at end of file diff --git a/rules/grpc_js_grpc_library.bzl b/rules/grpc_js_grpc_library.bzl new file mode 100644 index 0000000..5dc8539 --- /dev/null +++ b/rules/grpc_js_grpc_library.bzl @@ -0,0 +1,91 @@ +load( + "@build_stack_rules_proto//rules:grpc_js_grpc_compile.bzl", + "grpc_js_grpc_compile", +) + +load("@build_stack_rules_proto//rules:closure.bzl", "closure_proto_compile") + +load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library") + +PROTO_DEPS = ["@io_bazel_rules_closure//closure/protobuf:jspb"] + +def grpc_js_grpc_library(**kwargs): + + name = kwargs.get("name") + name_pb = name + "_pb" + name_pb_lib = name + "_pb_lib" + name_pb_grpc = name + "_pb_grpc" + + closure_deps = kwargs.pop("closure_deps", []) + deps = kwargs.get("deps", []) + verbose = kwargs.pop("verbose", 0) + visibility = kwargs.get("visibility", []) + tags = kwargs.get("tags", []) + + closure_proto_compile( + name = name_pb, + deps = deps, + visibility = visibility, + verbose = verbose, + tags = tags, + ) + + grpc_js_grpc_compile( + name = name_pb_grpc, + deps = deps, + visibility = visibility, + verbose = verbose, + tags = tags, + ) + + closure_js_library( + name = name_pb_lib, + srcs = [name_pb], + deps = [ + "@io_bazel_rules_closure//closure/protobuf:jspb", + ] + closure_deps, + internal_descriptors = [ + name_pb + "/descriptor.source.bin", + ], + suppress = [ + "JSC_LATE_PROVIDE_ERROR", + "JSC_UNDEFINED_VARIABLE", + "JSC_IMPLICITLY_NULLABLE_JSDOC", + "JSC_STRICT_INEXISTENT_PROPERTY", + "JSC_POSSIBLE_INEXISTENT_PROPERTY", + "JSC_UNRECOGNIZED_TYPE_ERROR", + # "stricterMissingRequireType", + # "analyzerChecks", + # "analyzerChecksInternal", + ], + tags = tags, + visibility = visibility, + ) + + closure_js_library( + name = name, + srcs = [name_pb_grpc], + deps = [ + name_pb_lib, + "@io_bazel_rules_closure//closure/library/promise", + "@com_github_stackb_grpc_js//js/grpc/stream/observer:call", + "@com_github_stackb_grpc_js//js/grpc", + "@com_github_stackb_grpc_js//js/grpc:api", + "@com_github_stackb_grpc_js//js/grpc:options", + ] + closure_deps, + internal_descriptors = [ + name_pb + "/descriptor.source.bin", + name_pb_grpc + "/descriptor.source.bin", + ], + exports = [ + name_pb_lib, + ], + suppress = [ + "JSC_IMPLICITLY_NULLABLE_JSDOC", + # "stricterMissingRequireType", + # "analyzerChecks", + # "analyzerChecksInternal", + ], + tags = tags, + visibility = visibility, + ) \ No newline at end of file diff --git a/rules/grpc_js_grpc_library_deps.bzl b/rules/grpc_js_grpc_library_deps.bzl new file mode 100644 index 0000000..d39de1b --- /dev/null +++ b/rules/grpc_js_grpc_library_deps.bzl @@ -0,0 +1,77 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") + +def _maybe(repo_rule, name, **kwargs): + if name not in native.existing_rules(): + repo_rule(name = name, **kwargs) + +def grpc_js_grpc_library_deps(): + bazel_skylib() + rules_python() + zlib() + com_github_stackb_grpc_js() + com_google_protobuf() + io_bazel_rules_closure() + + +def bazel_skylib(): + _maybe( + http_archive, + name = "bazel_skylib", + sha256 = "ebdf850bfef28d923a2cc67ddca86355a449b5e4f38b0a70e584dc24e5984aa6", + strip_prefix = "bazel-skylib-f80bc733d4b9f83d427ce3442be2e07427b2cc8d", + urls = [ + "https://github.com/bazelbuild/bazel-skylib/archive/f80bc733d4b9f83d427ce3442be2e07427b2cc8d.tar.gz", + ], + ) +def rules_python(): + _maybe( + http_archive, + name = "rules_python", + sha256 = "8cc0ad31c8fc699a49ad31628273529ef8929ded0a0859a3d841ce711a9a90d5", + strip_prefix = "rules_python-c7e068d38e2fec1d899e1c150e372f205c220e27", + urls = [ + "https://github.com/bazelbuild/rules_python/archive/c7e068d38e2fec1d899e1c150e372f205c220e27.tar.gz", + ], + ) +def zlib(): + _maybe( + http_archive, + name = "zlib", + sha256 = "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1", + strip_prefix = "zlib-1.2.11", + urls = [ + "https://mirror.bazel.build/zlib.net/zlib-1.2.11.tar.gz", + "https://zlib.net/zlib-1.2.11.tar.gz", + ], + build_file = "@build_stack_rules_proto//third_party:BUILD.bazel.zlib", + ) +def com_github_stackb_grpc_js(): + _maybe( + http_archive, + name = "com_github_stackb_grpc_js", + sha256 = "f9cb4d932badc71d90a89263eabc93551923bb5c621e0940c7cfeaa79ef02596", + strip_prefix = "grpc.js-beb6ac3b43247816c1a1ebf741ebf0c98203414a", + urls = [ + "https://github.com/stackb/grpc.js/archive/beb6ac3b43247816c1a1ebf741ebf0c98203414a.tar.gz", + ], + ) +def com_google_protobuf(): + _maybe( + http_archive, + name = "com_google_protobuf", + sha256 = "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113", + strip_prefix = "protobuf-3.14.0", + urls = [ + "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz", + ], + ) +def io_bazel_rules_closure(): + _maybe( + http_archive, + name = "io_bazel_rules_closure", + sha256 = "4c98a6b8d2d81210f3e291b1c7c5034ab2e22e7870ab3e9603599c79833f7da3", + strip_prefix = "rules_closure-4c99be33856ce1b7b80f55a0e9a8345f559b6ef3", + urls = [ + "https://github.com/bazelbuild/rules_closure/archive/4c99be33856ce1b7b80f55a0e9a8345f559b6ef3.tar.gz", + ], + ) \ No newline at end of file diff --git a/rules/proto/BUILD.bazel b/rules/proto/BUILD.bazel new file mode 100644 index 0000000..1708a2b --- /dev/null +++ b/rules/proto/BUILD.bazel @@ -0,0 +1,39 @@ +load("@build_stack_rules_proto//rules/proto:proto_language_info_provider_test.bzl", "proto_language_info_provider_test") +load("@build_stack_rules_proto//rules/proto:proto_language_test.bzl", "proto_language_test") +load("@build_stack_rules_proto//rules/proto:proto_language.bzl", "proto_language") +load("@build_stack_rules_proto//rules:proto_dependency.bzl", "proto_dependency") + +proto_language( + name = "grpc_js", + avatar_url = "https://user-images.githubusercontent.com/50580/78734761-54effc80-7906-11ea-8f5e-42725718f419.png", + display_name = "grpc.js", + package = "rules", + prefix = "grpc_js", + rules = [ + "grpc_js_grpc_compile", + "grpc_js_grpc_library", + ], + visibility = ["//visibility:public"], +) + +proto_language_info_provider_test( + name = "grpc_js_info_provider_test", + srcs = ["grpc_js_info_provider_test.golden.1.prototext"], + deps = [":grpc_js"], +) + +proto_language_test( + name = "grpc_js_language_test", + srcs = ["//rules:grpc_js.bzl"], + package = "rules", + deps = [":grpc_js"], +) + +proto_dependency( + name = "com_github_stackb_grpc_js", + repository_rule = "http_archive", + sha256 = "f9cb4d932badc71d90a89263eabc93551923bb5c621e0940c7cfeaa79ef02596", + strip_prefix = "grpc.js-beb6ac3b43247816c1a1ebf741ebf0c98203414a", + urls = ["https://github.com/stackb/grpc.js/archive/beb6ac3b43247816c1a1ebf741ebf0c98203414a.tar.gz"], + visibility = ["//visibility:public"], +) diff --git a/rules/proto/grpc_js_grpc_compile/BUILD.bazel b/rules/proto/grpc_js_grpc_compile/BUILD.bazel new file mode 100644 index 0000000..5b571a6 --- /dev/null +++ b/rules/proto/grpc_js_grpc_compile/BUILD.bazel @@ -0,0 +1,43 @@ +load("@build_stack_rules_proto//rules/proto:proto_rule_info_provider_test.bzl", "proto_rule_info_provider_test") +load("@build_stack_rules_proto//rules/proto:proto_rule_test.bzl", "proto_rule_test") +load("@build_stack_rules_proto//rules/proto:proto_rule_bazel_test.bzl", "proto_rule_bazel_test") +load("@build_stack_rules_proto//rules/proto:proto_rule.bzl", "proto_rule") + +proto_rule( + name = "grpc_js_grpc_compile", + build_example_tmpl = "@build_stack_rules_proto//core/grpc:BUILD.tmpl", + kind = "grpc", + language = "//rules/proto:grpc_js", + package = "rules", + plugins = [ + "@build_stack_rules_proto//plugins/closure/proto", + "//protoc-gen-grpc-js:grpc_js", + ], + visibility = ["//visibility:public"], + deps = [ + "//rules/proto:com_github_stackb_grpc_js", + "@build_stack_rules_proto//core:com_google_protobuf", + ], +) + +proto_rule_info_provider_test( + name = "grpc_js_grpc_compile_info_provider_test", + srcs = ["grpc_js_grpc_compile_info_provider_test.golden.1.prototext"], + deps = [":grpc_js_grpc_compile"], +) + +proto_rule_test( + name = "grpc_js_grpc_compile_rule_test", + srcs = [ + "//rules:grpc_js_grpc_compile.bzl", + "//rules:grpc_js_grpc_compile_deps.bzl", + ], + package = "rules", + deps = [":grpc_js_grpc_compile"], +) + +proto_rule_bazel_test( + name = "grpc_js_grpc_compile_rule_bazel_test", + tags = ["exclusive"], + deps = ["grpc_js_grpc_compile"], +) diff --git a/rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile_info_provider_test.golden.1.prototext b/rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile_info_provider_test.golden.1.prototext new file mode 100644 index 0000000..540d3d5 --- /dev/null +++ b/rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile_info_provider_test.golden.1.prototext @@ -0,0 +1,58 @@ +bazel_test_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile_bazel_test.go" +build_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile.BUILD" +bzl_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile.bzl" +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:bazel_skylib" + name: "bazel_skylib" + repositoryRule: "http_archive" + sha256: "ebdf850bfef28d923a2cc67ddca86355a449b5e4f38b0a70e584dc24e5984aa6" + stripPrefix: "bazel-skylib-f80bc733d4b9f83d427ce3442be2e07427b2cc8d" + urls: "https://github.com/bazelbuild/bazel-skylib/archive/f80bc733d4b9f83d427ce3442be2e07427b2cc8d.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:rules_python" + name: "rules_python" + repositoryRule: "http_archive" + sha256: "8cc0ad31c8fc699a49ad31628273529ef8929ded0a0859a3d841ce711a9a90d5" + stripPrefix: "rules_python-c7e068d38e2fec1d899e1c150e372f205c220e27" + urls: "https://github.com/bazelbuild/rules_python/archive/c7e068d38e2fec1d899e1c150e372f205c220e27.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "@build_stack_rules_proto//third_party:BUILD.bazel.zlib" + label: "@build_stack_rules_proto//core:zlib" + name: "zlib" + repositoryRule: "http_archive" + sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" + stripPrefix: "zlib-1.2.11" + urls: "https://mirror.bazel.build/zlib.net/zlib-1.2.11.tar.gz" + urls: "https://zlib.net/zlib-1.2.11.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "//rules/proto:com_github_stackb_grpc_js" + name: "com_github_stackb_grpc_js" + repositoryRule: "http_archive" + sha256: "f9cb4d932badc71d90a89263eabc93551923bb5c621e0940c7cfeaa79ef02596" + stripPrefix: "grpc.js-beb6ac3b43247816c1a1ebf741ebf0c98203414a" + urls: "https://github.com/stackb/grpc.js/archive/beb6ac3b43247816c1a1ebf741ebf0c98203414a.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:com_google_protobuf" + name: "com_google_protobuf" + repositoryRule: "http_archive" + sha256: "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113" + stripPrefix: "protobuf-3.14.0" + urls: "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz" + workspaceSnippet: "" +} +deps_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile_deps.bzl" +json_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile.json" +name: "grpc_js_grpc_compile" +workspace_file: "rules/proto/grpc_js_grpc_compile/grpc_js_grpc_compile.WORKSPACE" diff --git a/rules/proto/grpc_js_grpc_library/BUILD.bazel b/rules/proto/grpc_js_grpc_library/BUILD.bazel new file mode 100644 index 0000000..08c5302 --- /dev/null +++ b/rules/proto/grpc_js_grpc_library/BUILD.bazel @@ -0,0 +1,45 @@ +load("@build_stack_rules_proto//rules/proto:proto_rule_info_provider_test.bzl", "proto_rule_info_provider_test") +load("@build_stack_rules_proto//rules/proto:proto_rule_test.bzl", "proto_rule_test") +load("@build_stack_rules_proto//rules/proto:proto_rule_bazel_test.bzl", "proto_rule_bazel_test") +load("@build_stack_rules_proto//rules/proto:proto_rule.bzl", "proto_rule") + +proto_rule( + name = "grpc_js_grpc_library", + build_example_tmpl = "@build_stack_rules_proto//core/grpc:BUILD.tmpl", + implementation_tmpl = "grpc_js_grpc_library.bzl.tmpl", + kind = "grpc", + language = "//rules/proto:grpc_js", + package = "rules", + plugins = [ + "@build_stack_rules_proto//plugins/closure/proto", + "//protoc-gen-grpc-js:grpc_js", + ], + visibility = ["//visibility:public"], + deps = [ + "//rules/proto:com_github_stackb_grpc_js", + "@build_stack_rules_proto//core:com_google_protobuf", + "@build_stack_rules_proto//rules/proto/closure:io_bazel_rules_closure", + ], +) + +proto_rule_info_provider_test( + name = "grpc_js_grpc_library_info_provider_test", + srcs = ["grpc_js_grpc_library_info_provider_test.golden.1.prototext"], + deps = [":grpc_js_grpc_library"], +) + +proto_rule_test( + name = "grpc_js_grpc_library_rule_test", + srcs = [ + "//rules:grpc_js_grpc_library.bzl", + "//rules:grpc_js_grpc_library_deps.bzl", + ], + package = "rules", + deps = [":grpc_js_grpc_library"], +) + +proto_rule_bazel_test( + name = "grpc_js_grpc_library_rule_bazel_test", + tags = ["exclusive"], + deps = ["grpc_js_grpc_library"], +) diff --git a/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.bzl.tmpl b/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.bzl.tmpl new file mode 100644 index 0000000..a631637 --- /dev/null +++ b/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.bzl.tmpl @@ -0,0 +1,91 @@ +load( + "@build_stack_rules_proto//{{ .Rule.Package }}:{{ .Rule.Language.Prefix }}_{{ .Rule.Kind }}_compile.bzl", + "{{ .Rule.Language.Prefix }}_{{ .Rule.Kind }}_compile", +) + +load("@build_stack_rules_proto//rules:closure.bzl", "closure_proto_compile") + +load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library") + +PROTO_DEPS = ["@io_bazel_rules_closure//closure/protobuf:jspb"] + +def {{ .Rule.Name }}(**kwargs): + + name = kwargs.get("name") + name_pb = name + "_pb" + name_pb_lib = name + "_pb_lib" + name_pb_grpc = name + "_pb_grpc" + + closure_deps = kwargs.pop("closure_deps", []) + deps = kwargs.get("deps", []) + verbose = kwargs.pop("verbose", 0) + visibility = kwargs.get("visibility", []) + tags = kwargs.get("tags", []) + + closure_proto_compile( + name = name_pb, + deps = deps, + visibility = visibility, + verbose = verbose, + tags = tags, + ) + + {{ .Rule.Language.Prefix }}_{{ .Rule.Kind }}_compile( + name = name_pb_grpc, + deps = deps, + visibility = visibility, + verbose = verbose, + tags = tags, + ) + + closure_js_library( + name = name_pb_lib, + srcs = [name_pb], + deps = [ + "@io_bazel_rules_closure//closure/protobuf:jspb", + ] + closure_deps, + internal_descriptors = [ + name_pb + "/descriptor.source.bin", + ], + suppress = [ + "JSC_LATE_PROVIDE_ERROR", + "JSC_UNDEFINED_VARIABLE", + "JSC_IMPLICITLY_NULLABLE_JSDOC", + "JSC_STRICT_INEXISTENT_PROPERTY", + "JSC_POSSIBLE_INEXISTENT_PROPERTY", + "JSC_UNRECOGNIZED_TYPE_ERROR", + # "stricterMissingRequireType", + # "analyzerChecks", + # "analyzerChecksInternal", + ], + tags = tags, + visibility = visibility, + ) + + closure_js_library( + name = name, + srcs = [name_pb_grpc], + deps = [ + name_pb_lib, + "@io_bazel_rules_closure//closure/library/promise", + "@com_github_stackb_grpc_js//js/grpc/stream/observer:call", + "@com_github_stackb_grpc_js//js/grpc", + "@com_github_stackb_grpc_js//js/grpc:api", + "@com_github_stackb_grpc_js//js/grpc:options", + ] + closure_deps, + internal_descriptors = [ + name_pb + "/descriptor.source.bin", + name_pb_grpc + "/descriptor.source.bin", + ], + exports = [ + name_pb_lib, + ], + suppress = [ + "JSC_IMPLICITLY_NULLABLE_JSDOC", + # "stricterMissingRequireType", + # "analyzerChecks", + # "analyzerChecksInternal", + ], + tags = tags, + visibility = visibility, + ) \ No newline at end of file diff --git a/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library_info_provider_test.golden.1.prototext b/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library_info_provider_test.golden.1.prototext new file mode 100644 index 0000000..bcc890c --- /dev/null +++ b/rules/proto/grpc_js_grpc_library/grpc_js_grpc_library_info_provider_test.golden.1.prototext @@ -0,0 +1,68 @@ +bazel_test_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library_bazel_test.go" +build_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.BUILD" +bzl_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.bzl" +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:bazel_skylib" + name: "bazel_skylib" + repositoryRule: "http_archive" + sha256: "ebdf850bfef28d923a2cc67ddca86355a449b5e4f38b0a70e584dc24e5984aa6" + stripPrefix: "bazel-skylib-f80bc733d4b9f83d427ce3442be2e07427b2cc8d" + urls: "https://github.com/bazelbuild/bazel-skylib/archive/f80bc733d4b9f83d427ce3442be2e07427b2cc8d.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:rules_python" + name: "rules_python" + repositoryRule: "http_archive" + sha256: "8cc0ad31c8fc699a49ad31628273529ef8929ded0a0859a3d841ce711a9a90d5" + stripPrefix: "rules_python-c7e068d38e2fec1d899e1c150e372f205c220e27" + urls: "https://github.com/bazelbuild/rules_python/archive/c7e068d38e2fec1d899e1c150e372f205c220e27.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "@build_stack_rules_proto//third_party:BUILD.bazel.zlib" + label: "@build_stack_rules_proto//core:zlib" + name: "zlib" + repositoryRule: "http_archive" + sha256: "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1" + stripPrefix: "zlib-1.2.11" + urls: "https://mirror.bazel.build/zlib.net/zlib-1.2.11.tar.gz" + urls: "https://zlib.net/zlib-1.2.11.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "//rules/proto:com_github_stackb_grpc_js" + name: "com_github_stackb_grpc_js" + repositoryRule: "http_archive" + sha256: "f9cb4d932badc71d90a89263eabc93551923bb5c621e0940c7cfeaa79ef02596" + stripPrefix: "grpc.js-beb6ac3b43247816c1a1ebf741ebf0c98203414a" + urls: "https://github.com/stackb/grpc.js/archive/beb6ac3b43247816c1a1ebf741ebf0c98203414a.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "@build_stack_rules_proto//core:com_google_protobuf" + name: "com_google_protobuf" + repositoryRule: "http_archive" + sha256: "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113" + stripPrefix: "protobuf-3.14.0" + urls: "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz" + workspaceSnippet: "" +} +deps { + buildFile: "" + label: "@build_stack_rules_proto//rules/proto/closure:io_bazel_rules_closure" + name: "io_bazel_rules_closure" + repositoryRule: "http_archive" + sha256: "4c98a6b8d2d81210f3e291b1c7c5034ab2e22e7870ab3e9603599c79833f7da3" + stripPrefix: "rules_closure-4c99be33856ce1b7b80f55a0e9a8345f559b6ef3" + urls: "https://github.com/bazelbuild/rules_closure/archive/4c99be33856ce1b7b80f55a0e9a8345f559b6ef3.tar.gz" + workspaceSnippet: "load(\"@io_bazel_rules_closure//closure:repositories.bzl\", \"rules_closure_dependencies\", \"rules_closure_toolchains\")\n\nrules_closure_dependencies(\n omit_bazel_skylib = False,\n omit_com_google_protobuf = True,\n omit_zlib = True,\n)\n\nrules_closure_toolchains()" +} +deps_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library_deps.bzl" +json_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.json" +name: "grpc_js_grpc_library" +workspace_file: "rules/proto/grpc_js_grpc_library/grpc_js_grpc_library.WORKSPACE" diff --git a/rules/proto/grpc_js_info_provider_test.golden.1.prototext b/rules/proto/grpc_js_info_provider_test.golden.1.prototext new file mode 100644 index 0000000..804a866 --- /dev/null +++ b/rules/proto/grpc_js_info_provider_test.golden.1.prototext @@ -0,0 +1,18 @@ +lang { + avatarUrl: "https://user-images.githubusercontent.com/50580/78734761-54effc80-7906-11ea-8f5e-42725718f419.png" + description: "" + displayName: "grpc.js" + markdownFilename: "bazel-out/{HOST_CONFIGURATION}/bin/rules/proto/grpc_js.md" + markdownTmpl: "external/build_stack_rules_proto/rules/proto/proto_language.md.tmpl" + name: "grpc_js" + package: "rules" + prefix: "grpc_js" + rules: "grpc_js_grpc_compile" + rules: "grpc_js_grpc_library" + rulesFilename: "bazel-out/{HOST_CONFIGURATION}/bin/rules/proto/grpc_js.bzl" + rulesTmpl: "external/build_stack_rules_proto/rules/proto/rules.bzl.tmpl" +} +markdown_file: "rules/proto/grpc_js.md" +name: "grpc_js" +prefix: "grpc_js" +rules_file: "rules/proto/grpc_js.bzl" diff --git a/tools/regenerate_golden_files.sh b/tools/regenerate_golden_files.sh new file mode 100755 index 0000000..adc4b23 --- /dev/null +++ b/tools/regenerate_golden_files.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail + +for LABEL in $(bazel query 'kind(".*_run", //rules/proto/...)' --output label) +do + bazel run "$LABEL" +done