diff --git a/javascript/net/grpc/web/grpc_generator.cc b/javascript/net/grpc/web/grpc_generator.cc index b81c1ebd..035296dc 100644 --- a/javascript/net/grpc/web/grpc_generator.cc +++ b/javascript/net/grpc/web/grpc_generator.cc @@ -359,6 +359,30 @@ std::map GetAllMessages(const FileDescriptor* file) { return message_types; } +void RegisterEnum(const EnumDescriptor* desc, std::map& enum_types) { + if (enum_types.count(desc->full_name()) != 0) { + return; + } + + enum_types[desc->full_name()] = desc; +} + +std::map GetAllTopLevelEnums(std::map messages) { + std::map enum_types; + for (std::map::iterator it = messages.begin(); + it != messages.end(); it++) { + for (int i = 0; i < it->second->field_count(); i++) { + const FieldDescriptor* field = it->second->field(i); + if (field->type() != FieldDescriptor::Type::TYPE_ENUM || field->enum_type()->containing_type()) { + continue; + } + + RegisterEnum(field->enum_type(), enum_types); + } + } + return enum_types; +} + void PrintMessagesDeps(Printer* printer, const FileDescriptor* file) { std::map messages = GetAllMessages(file); std::map vars; @@ -675,6 +699,12 @@ void PrintProtoDtsFile(Printer *printer, const FileDescriptor *file) it != messages.end(); it++) { PrintProtoDtsMessage(printer, it->second, ""); } + + std::map enums = GetAllTopLevelEnums(messages); + for (std::map::iterator it = enums.begin(); + it != enums.end(); it++) { + PrintProtoDtsEnum(printer, it->second); + } } void PrintFileHeader(Printer* printer, const std::map& vars) { diff --git a/packages/grpc-web/package.json b/packages/grpc-web/package.json index b8d57c42..b33f5040 100644 --- a/packages/grpc-web/package.json +++ b/packages/grpc-web/package.json @@ -28,6 +28,7 @@ "google-protobuf": "^3.6.1", "mocha": "^5.2.0", "mock-xmlhttprequest": "^2.0.0", - "require-self": "^0.2.1" + "require-self": "^0.2.1", + "typescript": "^3.2.1" } } diff --git a/packages/grpc-web/test/generated_code_test.js b/packages/grpc-web/test/generated_code_test.js index 2042b9c5..de37cb03 100644 --- a/packages/grpc-web/test/generated_code_test.js +++ b/packages/grpc-web/test/generated_code_test.js @@ -374,4 +374,10 @@ describe('grpc-web generated code (commonjs+dts)', function() { assert.equal(true, fs.existsSync(protoGenCodePath)); assert.equal(true, fs.existsSync(protoDtsGenCodePath)); }); + + it('should compile', function() { + execSync(genCodeCmd); + execSync(`tsc ${genDtsCodePath}`); + execSync(`tsc ${protoDtsGenCodePath}`); + }) }); diff --git a/packages/grpc-web/test/protos/echo.proto b/packages/grpc-web/test/protos/echo.proto index d82143a7..98ac7c25 100644 --- a/packages/grpc-web/test/protos/echo.proto +++ b/packages/grpc-web/test/protos/echo.proto @@ -34,8 +34,27 @@ message ServerStreamingEchoResponse { string message = 1; } +enum Status { + UNKNOWN = 0; + SUCCESS = 1; +} + +message EchoStatusRequest { + Status status = 1; +} + +message EchoStatusResponse { + enum InternalStatus { + UNKNOWN = 0; + SUCCESS = 1; + } + InternalStatus status = 1; +} + + service EchoService { rpc Echo(EchoRequest) returns (EchoResponse); rpc ServerStreamingEcho(ServerStreamingEchoRequest) returns (stream ServerStreamingEchoResponse); + rpc EchoStatus(EchoStatusRequest) returns (EchoStatusResponse); }