From b74771d8305eb901f915301305ffa206f8cbab42 Mon Sep 17 00:00:00 2001 From: Stephanie DiBenedetto Date: Sun, 28 Sep 2025 15:31:18 -0700 Subject: [PATCH] Add --version flag for protoc-gen-js This flag is intended to be used directly against protoc-gen-js (e.g. protoc-gen-js --version) as opposed to being passed to the plugin via protoc. Additionally, in order to make version updating a bit easier (and more consistent), we also script version management based on the top-level package.json. --- BUILD.bazel | 6 ++++-- MODULE.bazel.lock | 10 ++++++---- conformance/package.json | 2 +- generate-version-header.js | 14 ++++++++++++++ generator/BUILD.bazel | 9 +++++++++ generator/protoc-gen-js.cc | 9 +++++++++ package.json | 1 + update-bazel-versions.js | 28 ++++++++++++++++++++++++++++ 8 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 generate-version-header.js create mode 100644 update-bazel-versions.js diff --git a/BUILD.bazel b/BUILD.bazel index 62355cea..6604d3a2 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,4 +1,4 @@ -# Protobuf JS runtime +# Protobuf JavaScript runtime # # See also code generation logic under generator/ @@ -6,6 +6,8 @@ load("@rules_pkg//:mappings.bzl", "pkg_attributes", "pkg_files", "strip_prefix") load("@rules_pkg//:pkg.bzl", "pkg_tar", "pkg_zip") load("//:protobuf_javascript_release.bzl", "package_naming") +exports_files(["generate-version-header.js", "package.json"]) + config_setting( name = "x64_x86_windows", values = {"cpu": "x64_x86_windows"}, @@ -55,7 +57,7 @@ pkg_files( srcs = glob([ "google/protobuf/*.js", "google/protobuf/compiler/*.js" - ]) + [ + ], allow_empty = True) + [ "google-protobuf.js", "package.json", "README.md", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 86b517a3..8a6d97e2 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -15,7 +15,8 @@ "https://bcr.bazel.build/modules/abseil-cpp/20250512.1/source.json": "d725d73707d01bb46ab3ca59ba408b8e9bd336642ca77a2269d4bfb8bbfd413d", "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896", "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", - "https://bcr.bazel.build/modules/apple_support/1.15.1/source.json": "517f2b77430084c541bc9be2db63fdcbb7102938c5f64c17ee60ffda2e5cf07b", + "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/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", @@ -24,6 +25,7 @@ "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", "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", @@ -111,8 +113,8 @@ "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/8.12.0/MODULE.bazel": "8e6590b961f2defdfc2811c089c75716cb2f06c8a4edeb9a8d85eaa64ee2a761", - "https://bcr.bazel.build/modules/rules_java/8.12.0/source.json": "cbd5d55d9d38d4008a7d00bee5b5a5a4b6031fcd4a56515c9accbcd42c7be2ba", + "https://bcr.bazel.build/modules/rules_java/8.14.0/MODULE.bazel": "717717ed40cc69994596a45aec6ea78135ea434b8402fb91b009b9151dd65615", + "https://bcr.bazel.build/modules/rules_java/8.14.0/source.json": "8a88c4ca9e8759da53cddc88123880565c520503321e2566b4e33d0287a3d4bc", "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", @@ -207,7 +209,7 @@ }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "hUTp2w+RUVdL7ma5esCXZJAFnX7vLbVfLd7FwnQI6bU=", + "bzlTransitiveDigest": "OlvsB0HsvxbR8ZN+J9Vf00X/+WVz/Y/5Xrq2LgcVfdo=", "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, diff --git a/conformance/package.json b/conformance/package.json index 5a687392..cd2bf432 100644 --- a/conformance/package.json +++ b/conformance/package.json @@ -11,7 +11,7 @@ "LICENSE.md" ], "dependencies": { - "google-protobuf": "file:../google-protobuf-3.21.4.tgz" + "google-protobuf": "file:../google-protobuf-4.0.0.tgz" }, "author": "Google Protocol Buffers Team", "license": "BSD-3-Clause" diff --git a/generate-version-header.js b/generate-version-header.js new file mode 100644 index 00000000..c21ca67e --- /dev/null +++ b/generate-version-header.js @@ -0,0 +1,14 @@ +const fs = require('fs'); +const path = require('path'); + +const version = require('./package.json').version; +const headerContent = `// Generated by generate-version-header.js +#ifndef PROTOBUF_JAVASCRIPT_VERSION_H__ +#define PROTOBUF_JAVASCRIPT_VERSION_H__ + +const char* const kProtobufJavascriptVersion = "${version}"; + +#endif // PROTOBUF_JAVASCRIPT_VERSION_H__ +`; + +fs.writeFileSync(process.argv[2], headerContent); diff --git a/generator/BUILD.bazel b/generator/BUILD.bazel index b2df875e..ac7756d8 100644 --- a/generator/BUILD.bazel +++ b/generator/BUILD.bazel @@ -1,3 +1,11 @@ +genrule( + name = "generate_version_header", + srcs = ["//:package.json"], + outs = ["version.h"], + cmd = "node $(location //:generate-version-header.js) $(OUTS)", + tools = ["//:generate-version-header.js"], +) + cc_binary( name = "protoc-gen-js", srcs = [ @@ -6,6 +14,7 @@ cc_binary( "protoc-gen-js.cc", "well_known_types_embed.cc", "well_known_types_embed.h", + ":version.h", ], visibility = ["//visibility:public"], deps = [ diff --git a/generator/protoc-gen-js.cc b/generator/protoc-gen-js.cc index 731406ec..e1b406a4 100644 --- a/generator/protoc-gen-js.cc +++ b/generator/protoc-gen-js.cc @@ -29,10 +29,19 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include +#include #include "generator/js_generator.h" +#include "generator/version.h" int main(int argc, char** argv) { + for (int i = 1; i < argc; ++i) { + if (std::string(argv[i]) == "--version") { + std::cout << "protoc-gen-js version " << kProtobufJavascriptVersion << std::endl; + return 0; + } + } std::unique_ptr generator( new google::protobuf::compiler::js::Generator()); return google::protobuf::compiler::PluginMain(argc, argv, generator.get()); diff --git a/package.json b/package.json index 68344e1d..f5830fdf 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "jasmine": "~3.5.0" }, "scripts": { + "prebuild": "node update-bazel-versions.js", "build": "node ./node_modules/gulp/bin/gulp.js dist", "test": "node ./node_modules/gulp/bin/gulp.js test", "clean": "node ./node_modules/gulp/bin/gulp.js clean" diff --git a/update-bazel-versions.js b/update-bazel-versions.js new file mode 100644 index 00000000..9e8ee79f --- /dev/null +++ b/update-bazel-versions.js @@ -0,0 +1,28 @@ +const fs = require('fs'); +const path = require('path'); + +const version = require('./package.json').version; + +// Update MODULE.bazel +const moduleBazelPath = path.join(__dirname, 'MODULE.bazel'); +let moduleBazelContent = fs.readFileSync(moduleBazelPath, 'utf8'); +moduleBazelContent = moduleBazelContent.replace(/version = ".*"/, `version = "${version}"`); +fs.writeFileSync(moduleBazelPath, moduleBazelContent); + +// Update protobuf_javascript_release.bzl +const releaseBzlPath = path.join(__dirname, 'protobuf_javascript_release.bzl'); +let releaseBzlContent = fs.readFileSync(releaseBzlPath, 'utf8'); +releaseBzlContent = releaseBzlContent.replace(/_PROTOBUF_JAVASCRIPT_VERSION = ".*"/, `_PROTOBUF_JAVASCRIPT_VERSION = "${version}"`); +fs.writeFileSync(releaseBzlPath, releaseBzlContent); + +// Update conformance/package.json +const conformancePackageJsonPath = + path.join(__dirname, 'conformance', 'package.json'); +let conformancePackageJsonContent = + fs.readFileSync(conformancePackageJsonPath, 'utf8'); +const conformancePackageJson = JSON.parse(conformancePackageJsonContent); +conformancePackageJson.dependencies['google-protobuf'] = + `file:../google-protobuf-${version}.tgz`; +fs.writeFileSync( + conformancePackageJsonPath, + JSON.stringify(conformancePackageJson, null, 2) + '\n');