From c7d45663539b6dc72e87a269371755f61eb47ed1 Mon Sep 17 00:00:00 2001 From: hiepthai Date: Mon, 19 Sep 2022 22:29:21 +0700 Subject: [PATCH 01/16] grpc-loader: add method options in MethodDefinition --- packages/proto-loader/src/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index d607668a9..b1fe68b98 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -126,6 +126,8 @@ export interface MethodDefinition Date: Tue, 20 Sep 2022 09:08:43 +0700 Subject: [PATCH 02/16] grpc-loader: update MethodDefinition interface --- packages/proto-loader/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index b1fe68b98..05ec158c6 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -126,8 +126,8 @@ export interface MethodDefinition Date: Wed, 21 Sep 2022 10:45:42 +0700 Subject: [PATCH 03/16] grpc-loader: map method options and add MethodOptions interface --- packages/proto-loader/src/index.ts | 59 ++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 05ec158c6..c1c78d280 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -115,6 +115,53 @@ export interface EnumTypeDefinition extends ProtobufTypeDefinition { format: 'Protocol Buffer 3 EnumDescriptorProto'; } +enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0, + NO_SIDE_EFFECTS = 1, + IDEMPOTENT = 2 +} + +interface NamePart { + namePart: string; + isExtension: boolean; +} + +interface UninterpretedOption { + name?: (NamePart[]|null); + identifierValue?: (string|null); + positiveIntValue?: (number|Long|string|null); + negativeIntValue?: (number|Long|string|null); + doubleValue?: (number|null); + stringValue?: (Uint8Array|string|null); + aggregateValue?: (string|null); +} + +interface CustomHttpPattern { + kind?: (string|null); + path?: (string|null); +} + +interface HttpRule { + selector?: (string|null); + get?: (string|null); + put?: (string|null); + post?: (string|null); + delete?: (string|null); + patch?: (string|null); + custom?: (CustomHttpPattern|null); + body?: (string|null); + responseBody?: (string|null); + additionalBindings?: (HttpRule[]|null); +} + +interface MethodOptions { + deprecated?: (boolean|null); + idempotency_level?: (IdempotencyLevel|keyof typeof IdempotencyLevel|null); + uninterpreted_option?: (UninterpretedOption[]|null); + "(google.api.http)"?: (HttpRule|null); + "(google.api.method_signature)"?: (string[]|null); +} + export interface MethodDefinition { path: string; requestStream: boolean; @@ -126,8 +173,7 @@ export interface MethodDefinition { }; } +function mapMethodOptions(options: Partial[] | undefined): MethodOptions | undefined { + return Array.isArray(options) ? + options.reduce((obj: MethodOptions, item: Partial) => ({ ...obj, ...item }), {}) : + undefined; +} + function createMethodDefinition( method: Protobuf.Method, serviceName: string, @@ -244,8 +296,7 @@ function createMethodDefinition( originalName: camelCase(method.name), requestType: createMessageDefinition(requestType, fileDescriptors), responseType: createMessageDefinition(responseType, fileDescriptors), - options: method.options, - parsedOptions: method.parsedOptions, + options: mapMethodOptions(method.parsedOptions), }; } From dfb10f9ac4e2ac33408937bfc0390e3a9d3d113c Mon Sep 17 00:00:00 2001 From: Hiep Thai Date: Wed, 21 Sep 2022 10:47:27 +0700 Subject: [PATCH 04/16] grpc-loader: add method options test --- packages/proto-loader/package.json | 1 + .../proto-loader/test/descriptor_type_test.ts | 17 +++++++++++++ .../test_protos/method_options.proto | 25 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 packages/proto-loader/test_protos/method_options.proto diff --git a/packages/proto-loader/package.json b/packages/proto-loader/package.json index 7958e5854..5782aae44 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 180681c12..9c5196334 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 000000000..3dfa56d15 --- /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'; + } +} From ae33e8797a79cb7a98e7748e19f0d5b1adb7835d Mon Sep 17 00:00:00 2001 From: Hiep Thai Date: Wed, 21 Sep 2022 11:04:39 +0700 Subject: [PATCH 05/16] grpc-loader: export interfaces and fix minor issue --- packages/proto-loader/src/index.ts | 12 ++++++------ packages/proto-loader/test/descriptor_type_test.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index c1c78d280..3b85e40dd 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -115,18 +115,18 @@ export interface EnumTypeDefinition extends ProtobufTypeDefinition { format: 'Protocol Buffer 3 EnumDescriptorProto'; } -enum IdempotencyLevel { +export enum IdempotencyLevel { IDEMPOTENCY_UNKNOWN = 0, NO_SIDE_EFFECTS = 1, IDEMPOTENT = 2 } -interface NamePart { +export interface NamePart { namePart: string; isExtension: boolean; } -interface UninterpretedOption { +export interface UninterpretedOption { name?: (NamePart[]|null); identifierValue?: (string|null); positiveIntValue?: (number|Long|string|null); @@ -136,12 +136,12 @@ interface UninterpretedOption { aggregateValue?: (string|null); } -interface CustomHttpPattern { +export interface CustomHttpPattern { kind?: (string|null); path?: (string|null); } -interface HttpRule { +export interface HttpRule { selector?: (string|null); get?: (string|null); put?: (string|null); @@ -154,7 +154,7 @@ interface HttpRule { additionalBindings?: (HttpRule[]|null); } -interface MethodOptions { +export interface MethodOptions { deprecated?: (boolean|null); idempotency_level?: (IdempotencyLevel|keyof typeof IdempotencyLevel|null); uninterpreted_option?: (UninterpretedOption[]|null); diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 9c5196334..cde89938f 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -20,7 +20,7 @@ import { rpcFileDescriptorSet } from '../test_protos/rpc.desc'; import { readFileSync } from 'fs'; import * as proto_loader from '../src/index'; -import { dirname } from "path"; +import { dirname } from 'path'; // Relative path from build output directory to test_protos directory const TEST_PROTO_DIR = `${__dirname}/../../test_protos/`; From 68ea1f43e2c36c079bb086133f6b136838b74092 Mon Sep 17 00:00:00 2001 From: hiepthai Date: Wed, 26 Oct 2022 10:41:18 +0700 Subject: [PATCH 06/16] grpc-loader: update & correct interface types --- packages/proto-loader/src/index.ts | 20 +++++++++---------- .../proto-loader/test/descriptor_type_test.ts | 20 +++++++++++++++++-- .../test_protos/method_options.proto | 16 +++++++++++++-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 3b85e40dd..5cb898069 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -122,18 +122,18 @@ export enum IdempotencyLevel { } export interface NamePart { - namePart: string; - isExtension: boolean; + name_part: string; + is_extension: boolean; } export interface UninterpretedOption { name?: (NamePart[]|null); - identifierValue?: (string|null); - positiveIntValue?: (number|Long|string|null); - negativeIntValue?: (number|Long|string|null); - doubleValue?: (number|null); - stringValue?: (Uint8Array|string|null); - aggregateValue?: (string|null); + identifier_value?: (string|null); + positive_int_value?: (number|null); + negative_int_value?: (number|null); + double_value?: (number|null); + string_value?: (string|null); + aggregate_value?: (string|null); } export interface CustomHttpPattern { @@ -150,8 +150,8 @@ export interface HttpRule { patch?: (string|null); custom?: (CustomHttpPattern|null); body?: (string|null); - responseBody?: (string|null); - additionalBindings?: (HttpRule[]|null); + response_body?: (string|null); + additional_bindings?: (HttpRule[]|null); } export interface MethodOptions { diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index cde89938f..7d799710a 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -140,8 +140,24 @@ describe('Descriptor types', () => { assert.deepStrictEqual(service.Hello.options, { deprecated: true, idempotency_level: 'IDEMPOTENCY_UNKNOWN', - uninterpreted_option: { identifier_value: 'foo' }, - '(google.api.http)': { post: '/hello' }, + uninterpreted_option: { + name: { + name_part: 'foo', + is_extension: false, + }, + identifier_value: 'bar', + positive_int_value: 9007199254740991, + negative_int_value: -9007199254740991, + double_value: 1.2345, + string_value: 'foobar', + aggregate_value: 'foobar' + }, + '(google.api.http)': { + post: "/hello", + body: "*", + response_body: "*", + additional_bindings: {} + }, '(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 index 3dfa56d15..4256002b9 100644 --- a/packages/proto-loader/test_protos/method_options.proto +++ b/packages/proto-loader/test_protos/method_options.proto @@ -7,7 +7,7 @@ import "google/api/httpbody.proto"; message Empty {} message MethodSignature { - repeated string method_signature = 0; + repeated string method_signature = 1; } service Hello { @@ -15,10 +15,22 @@ service Hello { option deprecated = true; option idempotency_level = IDEMPOTENCY_UNKNOWN; option uninterpreted_option = { - identifier_value: 'foo' + name: { + name_part: 'foo' + is_extension: false + } + identifier_value: 'bar' + positive_int_value: 9007199254740991 + negative_int_value: -9007199254740991 + double_value: 1.2345 + string_value: 'foobar' + aggregate_value: 'foobar' }; option (google.api.http) = { post: "/hello" + body: "*" + response_body: "*" + additional_bindings: {} }; option (google.api.method_signature) = 'bar'; } From d335428458daccce80b438e156294cab31072752 Mon Sep 17 00:00:00 2001 From: hiepthai Date: Wed, 26 Oct 2022 10:48:12 +0700 Subject: [PATCH 07/16] grpc-loader: cleanup MethodOptions interfaces --- packages/proto-loader/src/index.ts | 34 +++++++++--------------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 5cb898069..55008f83b 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -127,39 +127,25 @@ export interface NamePart { } export interface UninterpretedOption { - name?: (NamePart[]|null); - identifier_value?: (string|null); - positive_int_value?: (number|null); - negative_int_value?: (number|null); - double_value?: (number|null); - string_value?: (string|null); - aggregate_value?: (string|null); + name?: NamePart[]; + identifier_value?: string; + positive_int_value?: number; + negative_int_value?: number; + double_value?: number; + string_value?: string; + aggregate_value?: string; } export interface CustomHttpPattern { - kind?: (string|null); - path?: (string|null); -} - -export interface HttpRule { - selector?: (string|null); - get?: (string|null); - put?: (string|null); - post?: (string|null); - delete?: (string|null); - patch?: (string|null); - custom?: (CustomHttpPattern|null); - body?: (string|null); - response_body?: (string|null); - additional_bindings?: (HttpRule[]|null); + kind?: string; + path?: string; } export interface MethodOptions { deprecated?: (boolean|null); idempotency_level?: (IdempotencyLevel|keyof typeof IdempotencyLevel|null); uninterpreted_option?: (UninterpretedOption[]|null); - "(google.api.http)"?: (HttpRule|null); - "(google.api.method_signature)"?: (string[]|null); + [k: string]: unknown } export interface MethodDefinition { From 4c185fa2e6b5e7db961d73d211bfc48522beb367 Mon Sep 17 00:00:00 2001 From: hiepthai Date: Thu, 27 Oct 2022 07:59:26 +0700 Subject: [PATCH 08/16] grpc-loader: update interfaces & add new test --- packages/proto-loader/src/index.ts | 19 +++++++------------ .../proto-loader/test/descriptor_type_test.ts | 1 + .../test_protos/method_options.proto | 1 + 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 55008f83b..74704c71d 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -116,9 +116,9 @@ export interface EnumTypeDefinition extends ProtobufTypeDefinition { } export enum IdempotencyLevel { - IDEMPOTENCY_UNKNOWN = 0, - NO_SIDE_EFFECTS = 1, - IDEMPOTENT = 2 + IDEMPOTENCY_UNKNOWN = 'IDEMPOTENCY_UNKNOWN', + NO_SIDE_EFFECTS = 'NO_SIDE_EFFECTS', + IDEMPOTENT = 'IDEMPOTENT' } export interface NamePart { @@ -136,16 +136,11 @@ export interface UninterpretedOption { aggregate_value?: string; } -export interface CustomHttpPattern { - kind?: string; - path?: string; -} - export interface MethodOptions { - deprecated?: (boolean|null); - idempotency_level?: (IdempotencyLevel|keyof typeof IdempotencyLevel|null); - uninterpreted_option?: (UninterpretedOption[]|null); - [k: string]: unknown + deprecated?: boolean; + idempotency_level?: IdempotencyLevel|keyof typeof IdempotencyLevel; + uninterpreted_option?: UninterpretedOption; + [k: string]: unknown; } export interface MethodDefinition { diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 7d799710a..292a0f7e5 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -160,5 +160,6 @@ describe('Descriptor types', () => { }, '(google.api.method_signature)': 'bar' }) + assert(service.HelloWithoutOptions.options === undefined) }) }); diff --git a/packages/proto-loader/test_protos/method_options.proto b/packages/proto-loader/test_protos/method_options.proto index 4256002b9..e3eff7c46 100644 --- a/packages/proto-loader/test_protos/method_options.proto +++ b/packages/proto-loader/test_protos/method_options.proto @@ -34,4 +34,5 @@ service Hello { }; option (google.api.method_signature) = 'bar'; } + rpc HelloWithoutOptions (Empty) returns (Empty) {} } From 260966c07022014bd183f957a07423953712f5be Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:00:04 +0200 Subject: [PATCH 09/16] predefined options should always be returned with their default value --- packages/proto-loader/src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 74704c71d..2239cec44 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -137,9 +137,9 @@ export interface UninterpretedOption { } export interface MethodOptions { - deprecated?: boolean; - idempotency_level?: IdempotencyLevel|keyof typeof IdempotencyLevel; - uninterpreted_option?: UninterpretedOption; + deprecated: boolean; + idempotency_level: IdempotencyLevel|keyof typeof IdempotencyLevel; + uninterpreted_option: UninterpretedOption; [k: string]: unknown; } From 5bd37a9de10c53e3969efe8dfeb01407ec06ed5a Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:00:28 +0200 Subject: [PATCH 10/16] narrow down type of idempotency_level --- packages/proto-loader/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 2239cec44..609d6625d 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -138,7 +138,7 @@ export interface UninterpretedOption { export interface MethodOptions { deprecated: boolean; - idempotency_level: IdempotencyLevel|keyof typeof IdempotencyLevel; + idempotency_level: IdempotencyLevel; uninterpreted_option: UninterpretedOption; [k: string]: unknown; } From 99e8a060f6311a5ff98890b54936edabe5067002 Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:19:04 +0200 Subject: [PATCH 11/16] make uninterpreted_option an array --- packages/proto-loader/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 609d6625d..bc54e2ed8 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -139,7 +139,7 @@ export interface UninterpretedOption { export interface MethodOptions { deprecated: boolean; idempotency_level: IdempotencyLevel; - uninterpreted_option: UninterpretedOption; + uninterpreted_option: UninterpretedOption[]; [k: string]: unknown; } From 27d608763b4100ea5f5b8a8108fc41f2b33b0e7e Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:23:29 +0200 Subject: [PATCH 12/16] adjust implementation to always return default options --- packages/proto-loader/src/index.ts | 11 +++++++---- packages/proto-loader/test/descriptor_type_test.ts | 6 +++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index bc54e2ed8..9182fa8a3 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -249,10 +249,13 @@ function createSerializer(cls: Protobuf.Type): Serialize { }; } -function mapMethodOptions(options: Partial[] | undefined): MethodOptions | undefined { - return Array.isArray(options) ? - options.reduce((obj: MethodOptions, item: Partial) => ({ ...obj, ...item }), {}) : - undefined; +function mapMethodOptions(options: Partial[] | undefined): MethodOptions { + return (options || []).reduce((obj: MethodOptions, item: Partial) => ({ ...obj, ...item }), + { + deprecated: false, + idempotency_level: IdempotencyLevel.IDEMPOTENCY_UNKNOWN, + uninterpreted_option: [] + }); } function createMethodDefinition( diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 292a0f7e5..d4be4678a 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -160,6 +160,10 @@ describe('Descriptor types', () => { }, '(google.api.method_signature)': 'bar' }) - assert(service.HelloWithoutOptions.options === undefined) + assert.deepStrictEqual(service.HelloWithoutOptions.options, { + deprecated: false, + idempotency_level: 'IDEMPOTENCY_UNKNOWN', + uninterpreted_option: [] + }) }) }); From 1e37caadfca56d64d99df323292f6fae115f0e2d Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:37:03 +0200 Subject: [PATCH 13/16] add test case for partially set options --- packages/proto-loader/test/descriptor_type_test.ts | 14 +++++++++++++- .../proto-loader/test_protos/method_options.proto | 12 +++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index d4be4678a..6db40f6a8 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -139,7 +139,7 @@ describe('Descriptor types', () => { const service = packageDefinition.Hello as proto_loader.ServiceDefinition assert.deepStrictEqual(service.Hello.options, { deprecated: true, - idempotency_level: 'IDEMPOTENCY_UNKNOWN', + idempotency_level: 'NO_SIDE_EFFECTS', uninterpreted_option: { name: { name_part: 'foo', @@ -165,5 +165,17 @@ describe('Descriptor types', () => { idempotency_level: 'IDEMPOTENCY_UNKNOWN', uninterpreted_option: [] }) + assert.deepStrictEqual(service.HelloWithSomeOptions.options, { + deprecated: true, + idempotency_level: 'IDEMPOTENCY_UNKNOWN', + uninterpreted_option: [], + '(google.api.http)': { + get: "/hello", + additional_bindings: { + body: '*', + get: '/hello-world' + } + }, + }) }) }); diff --git a/packages/proto-loader/test_protos/method_options.proto b/packages/proto-loader/test_protos/method_options.proto index e3eff7c46..97c4fd3aa 100644 --- a/packages/proto-loader/test_protos/method_options.proto +++ b/packages/proto-loader/test_protos/method_options.proto @@ -13,7 +13,7 @@ message MethodSignature { service Hello { rpc Hello (Empty) returns (Empty) { option deprecated = true; - option idempotency_level = IDEMPOTENCY_UNKNOWN; + option idempotency_level = NO_SIDE_EFFECTS; option uninterpreted_option = { name: { name_part: 'foo' @@ -35,4 +35,14 @@ service Hello { option (google.api.method_signature) = 'bar'; } rpc HelloWithoutOptions (Empty) returns (Empty) {} + rpc HelloWithSomeOptions (Empty) returns (Empty) { + option deprecated = true; + option (google.api.http) = { + get: "/hello" + additional_bindings: { + get: "/hello-world" + body: "*" + } + }; + } } From 6e441a8d03ddd41c2f2fabb890e226d1c0aab28c Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 16:38:04 +0200 Subject: [PATCH 14/16] use single quotes consistently --- packages/proto-loader/test/descriptor_type_test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index 6db40f6a8..f99949799 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -153,9 +153,9 @@ describe('Descriptor types', () => { aggregate_value: 'foobar' }, '(google.api.http)': { - post: "/hello", - body: "*", - response_body: "*", + post: '/hello', + body: '*', + response_body: '*', additional_bindings: {} }, '(google.api.method_signature)': 'bar' @@ -170,7 +170,7 @@ describe('Descriptor types', () => { idempotency_level: 'IDEMPOTENCY_UNKNOWN', uninterpreted_option: [], '(google.api.http)': { - get: "/hello", + get: '/hello', additional_bindings: { body: '*', get: '/hello-world' From e6ac1a49ed959c6261299e57c4ec90de522bb9ca Mon Sep 17 00:00:00 2001 From: Christopher Fenn Date: Fri, 5 Apr 2024 17:12:04 +0200 Subject: [PATCH 15/16] return uninterpreted options as an array --- packages/proto-loader/src/index.ts | 13 ++++++++++++- packages/proto-loader/test/descriptor_type_test.ts | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index 9182fa8a3..cf5976bc3 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -250,7 +250,18 @@ function createSerializer(cls: Protobuf.Type): Serialize { } function mapMethodOptions(options: Partial[] | undefined): MethodOptions { - return (options || []).reduce((obj: MethodOptions, item: Partial) => ({ ...obj, ...item }), + return (options || []).reduce((obj: MethodOptions, item: Partial) => { + for (const [key, value] of Object.entries(item)) { + switch (key) { + case 'uninterpreted_option' : + obj.uninterpreted_option.push(item.uninterpreted_option as UninterpretedOption); + break; + default: + obj[key] = value + } + } + return obj + }, { deprecated: false, idempotency_level: IdempotencyLevel.IDEMPOTENCY_UNKNOWN, diff --git a/packages/proto-loader/test/descriptor_type_test.ts b/packages/proto-loader/test/descriptor_type_test.ts index f99949799..7a2ed3939 100644 --- a/packages/proto-loader/test/descriptor_type_test.ts +++ b/packages/proto-loader/test/descriptor_type_test.ts @@ -140,10 +140,10 @@ describe('Descriptor types', () => { assert.deepStrictEqual(service.Hello.options, { deprecated: true, idempotency_level: 'NO_SIDE_EFFECTS', - uninterpreted_option: { + uninterpreted_option: [{ name: { name_part: 'foo', - is_extension: false, + is_extension: false, }, identifier_value: 'bar', positive_int_value: 9007199254740991, @@ -151,7 +151,7 @@ describe('Descriptor types', () => { double_value: 1.2345, string_value: 'foobar', aggregate_value: 'foobar' - }, + }], '(google.api.http)': { post: '/hello', body: '*', From 6c7225f3ba38fb09cdf4911a2a7183254591ce94 Mon Sep 17 00:00:00 2001 From: n0v1 Date: Tue, 9 Apr 2024 18:21:33 +0000 Subject: [PATCH 16/16] make method options required --- packages/proto-loader/src/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/proto-loader/src/index.ts b/packages/proto-loader/src/index.ts index cf5976bc3..59e68df93 100644 --- a/packages/proto-loader/src/index.ts +++ b/packages/proto-loader/src/index.ts @@ -154,7 +154,7 @@ export interface MethodDefinition[] | undefined): Method { deprecated: false, idempotency_level: IdempotencyLevel.IDEMPOTENCY_UNKNOWN, - uninterpreted_option: [] - }); + uninterpreted_option: [], + } + ) as MethodOptions; } function createMethodDefinition(