diff --git a/packages/proto-loader/package.json b/packages/proto-loader/package.json index 7958e585..5782aae4 100644 --- a/packages/proto-loader/package.json +++ b/packages/proto-loader/package.json @@ -57,6 +57,7 @@ "@types/node": "^10.17.26", "@types/yargs": "^17.0.24", "clang-format": "^1.2.2", + "google-proto-files": "^3.0.2", "gts": "^3.1.0", "rimraf": "^3.0.2", "ts-node": "^10.9.2", diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 180681c1..9c519633 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -20,6 +20,7 @@ import { rpcFileDescriptorSet } from '../test_protos/rpc.desc'; import { readFileSync } from 'fs'; import * as proto_loader from '../src/index'; +import { dirname } from "path"; // Relative path from build output directory to test_protos directory const TEST_PROTO_DIR = `${__dirname}/../../test_protos/`; @@ -128,4 +129,20 @@ describe('Descriptor types', () => { // This will throw if the file descriptor object cannot be parsed proto_loader.loadFileDescriptorSetFromObject(rpcFileDescriptorSet); }); + + it('Can parse method options into object correctly', () => { + const includeDirs = [ + dirname(require.resolve('google-proto-files/package.json')) + ]; + const packageDefinition = proto_loader.loadSync(`${TEST_PROTO_DIR}/method_options.proto`, { includeDirs }); + assert('Hello' in packageDefinition); + const service = packageDefinition.Hello as proto_loader.ServiceDefinition + assert.deepStrictEqual(service.Hello.options, { + deprecated: true, + idempotency_level: 'IDEMPOTENCY_UNKNOWN', + uninterpreted_option: { identifier_value: 'foo' }, + '(google.api.http)': { post: '/hello' }, + '(google.api.method_signature)': 'bar' + }) + }) }); diff --git a/packages/proto-loader/test_protos/method_options.proto b/packages/proto-loader/test_protos/method_options.proto new file mode 100644 index 00000000..3dfa56d1 --- /dev/null +++ b/packages/proto-loader/test_protos/method_options.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/httpbody.proto"; + +message Empty {} + +message MethodSignature { + repeated string method_signature = 0; +} + +service Hello { + rpc Hello (Empty) returns (Empty) { + option deprecated = true; + option idempotency_level = IDEMPOTENCY_UNKNOWN; + option uninterpreted_option = { + identifier_value: 'foo' + }; + option (google.api.http) = { + post: "/hello" + }; + option (google.api.method_signature) = 'bar'; + } +}