From fd32e0d048d47964ba4b2b68f7c1d40922679d3c Mon Sep 17 00:00:00 2001 From: Timo Stamm Date: Fri, 14 Jun 2024 13:02:15 +0200 Subject: [PATCH 1/2] Use JsonObject to represent google.protobuf.Struct in message fields --- packages/bundle-size/README.md | 10 +- packages/bundle-size/chart.svg | 12 +- .../rpc/context/attribute_context_pb.ts | 6 +- .../test_messages_proto3_editions_pb.ts | 8 +- .../protobuf/test_messages_proto3_pb.ts | 8 +- .../extra/extensions-proto2.proto | 3 + packages/protobuf-test/extra/proto3.proto | 6 + packages/protobuf-test/src/create.test.ts | 47 +++++ .../src/extension-accessor.test.ts | 6 + .../gen/js/extra/extensions-proto2_pb.d.ts | 12 +- .../src/gen/js/extra/extensions-proto2_pb.js | 22 +- .../src/gen/js/extra/proto3_pb.d.ts | 28 ++- .../src/gen/js/extra/proto3_pb.js | 4 +- .../protobuf/test_messages_proto3_pb.d.ts | 8 +- .../unittest_well_known_types_pb.d.ts | 12 +- .../src/gen/ts/extra/extensions-proto2_pb.ts | 24 ++- .../src/gen/ts/extra/proto3_pb.ts | 32 ++- .../protobuf/test_messages_proto3_pb.ts | 8 +- .../protobuf/unittest_well_known_types_pb.ts | 12 +- .../src/reflect/reflect-list.test.ts | 18 +- .../src/reflect/reflect-map.test.ts | 25 ++- .../protobuf-test/src/reflect/reflect.test.ts | 72 ++++++- packages/protobuf/src/codegenv1/symbols.ts | 2 + packages/protobuf/src/create.ts | 38 +++- packages/protobuf/src/reflect/reflect.ts | 192 +++++++++++++++--- .../protoc-gen-es/src/protoc-gen-es-plugin.ts | 8 +- packages/protoc-gen-es/src/util.ts | 61 +++--- 27 files changed, 547 insertions(+), 137 deletions(-) diff --git a/packages/bundle-size/README.md b/packages/bundle-size/README.md index 3692c1ea1..3447319e5 100644 --- a/packages/bundle-size/README.md +++ b/packages/bundle-size/README.md @@ -16,11 +16,11 @@ usually do. We repeat this for an increasing number of files. | code generator | files | bundle size | minified | compressed | |-----------------|----------|------------------------:|-----------------------:|-------------------:| -| protobuf-es | 1 | 123,138 b | 64,107 b | 14,966 b | -| protobuf-es | 4 | 125,327 b | 65,617 b | 15,608 b | -| protobuf-es | 8 | 128,089 b | 67,388 b | 16,135 b | -| protobuf-es | 16 | 138,539 b | 75,369 b | 18,451 b | -| protobuf-es | 32 | 166,330 b | 97,384 b | 23,898 b | +| protobuf-es | 1 | 125,782 b | 65,554 b | 15,210 b | +| protobuf-es | 4 | 127,971 b | 67,062 b | 15,882 b | +| protobuf-es | 8 | 130,733 b | 68,833 b | 16,446 b | +| protobuf-es | 16 | 141,183 b | 76,814 b | 18,708 b | +| protobuf-es | 32 | 168,974 b | 98,830 b | 24,189 b | | protobuf-javascript | 1 | 339,613 b | 255,820 b | 42,481 b | | protobuf-javascript | 4 | 366,281 b | 271,092 b | 43,912 b | | protobuf-javascript | 8 | 388,324 b | 283,409 b | 45,038 b | diff --git a/packages/bundle-size/chart.svg b/packages/bundle-size/chart.svg index 97296ac9e..355794448 100644 --- a/packages/bundle-size/chart.svg +++ b/packages/bundle-size/chart.svg @@ -43,14 +43,14 @@ 0 KiB - + protobuf-es -protobuf-es 14.62 KiB for 1 files -protobuf-es 15.24 KiB for 4 files -protobuf-es 15.76 KiB for 8 files -protobuf-es 18.02 KiB for 16 files -protobuf-es 23.34 KiB for 32 files +protobuf-es 14.85 KiB for 1 files +protobuf-es 15.51 KiB for 4 files +protobuf-es 16.06 KiB for 8 files +protobuf-es 18.27 KiB for 16 files +protobuf-es 23.62 KiB for 32 files diff --git a/packages/bundle-size/src/gen/protobuf-es/google/rpc/context/attribute_context_pb.ts b/packages/bundle-size/src/gen/protobuf-es/google/rpc/context/attribute_context_pb.ts index 7c9d2cc18..11ad79020 100644 --- a/packages/bundle-size/src/gen/protobuf-es/google/rpc/context/attribute_context_pb.ts +++ b/packages/bundle-size/src/gen/protobuf-es/google/rpc/context/attribute_context_pb.ts @@ -18,9 +18,9 @@ import type { GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Any, Duration, Struct, Timestamp } from "@bufbuild/protobuf/wkt"; +import type { Any, Duration, Timestamp } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file google/rpc/context/attribute_context.proto. @@ -296,7 +296,7 @@ export type AttributeContext_Auth = Message<"google.rpc.context.AttributeContext * * @generated from field: google.protobuf.Struct claims = 4; */ - claims?: Struct; + claims?: JsonObject; /** * A list of access level resource names that allow resources to be diff --git a/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_editions_pb.ts b/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_editions_pb.ts index 9ae8c30c3..dfb0a2c8e 100644 --- a/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_editions_pb.ts +++ b/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_editions_pb.ts @@ -19,9 +19,9 @@ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file google/protobuf/test_messages_proto3_editions.proto. @@ -681,7 +681,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.editions.proto3 /** * @generated from field: google.protobuf.Struct optional_struct = 304; */ - optionalStruct?: Struct; + optionalStruct?: JsonObject; /** * @generated from field: google.protobuf.Any optional_any = 305; @@ -716,7 +716,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.editions.proto3 /** * @generated from field: repeated google.protobuf.Struct repeated_struct = 324; */ - repeatedStruct: Struct[]; + repeatedStruct: JsonObject[]; /** * @generated from field: repeated google.protobuf.Any repeated_any = 315; diff --git a/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_pb.ts b/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_pb.ts index e1774e8f3..53f526121 100644 --- a/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_pb.ts +++ b/packages/protobuf-conformance/src/gen/google/protobuf/test_messages_proto3_pb.ts @@ -18,9 +18,9 @@ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file google/protobuf/test_messages_proto3.proto. @@ -680,7 +680,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3.TestAllT /** * @generated from field: google.protobuf.Struct optional_struct = 304; */ - optionalStruct?: Struct; + optionalStruct?: JsonObject; /** * @generated from field: google.protobuf.Any optional_any = 305; @@ -715,7 +715,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3.TestAllT /** * @generated from field: repeated google.protobuf.Struct repeated_struct = 324; */ - repeatedStruct: Struct[]; + repeatedStruct: JsonObject[]; /** * @generated from field: repeated google.protobuf.Any repeated_any = 315; diff --git a/packages/protobuf-test/extra/extensions-proto2.proto b/packages/protobuf-test/extra/extensions-proto2.proto index 259321c99..b4061f387 100644 --- a/packages/protobuf-test/extra/extensions-proto2.proto +++ b/packages/protobuf-test/extra/extensions-proto2.proto @@ -17,6 +17,7 @@ package proto2ext; import "extra/example.proto"; import "google/protobuf/wrappers.proto"; +import "google/protobuf/struct.proto"; // The message we're going to extend message Proto2Extendee { @@ -63,8 +64,10 @@ extend Proto2Extendee { repeated uint32 packed_uint32_ext = 7003 [packed = true]; repeated uint32 unpacked_uint32_ext = 7004; // unpacked by default in proto2 repeated uint64 repeated_uint64_ext_js_string = 7006 [jstype = JS_STRING]; + repeated google.protobuf.Struct repeated_struct_ext = 7007; optional google.protobuf.UInt32Value wrapper_ext = 8001; + optional google.protobuf.Struct struct_ext = 8002; optional group GroupExt = 8100 { optional int32 a = 1; diff --git a/packages/protobuf-test/extra/proto3.proto b/packages/protobuf-test/extra/proto3.proto index e9a720228..9861da1a7 100644 --- a/packages/protobuf-test/extra/proto3.proto +++ b/packages/protobuf-test/extra/proto3.proto @@ -16,6 +16,7 @@ syntax = "proto3"; package spec; option go_package = "github.com/bufbuild/protobuf-es"; import "google/protobuf/wrappers.proto"; +import "google/protobuf/struct.proto"; // Note: We do not exhaust all field types message Proto3Message { @@ -30,6 +31,7 @@ message Proto3Message { Proto3Enum singular_enum_field = 7; Proto3Message singular_message_field = 8; google.protobuf.UInt32Value singular_wrapped_uint32_field = 211; + google.protobuf.Struct singular_struct_field = 214; optional string optional_string_field = 9; optional bytes optional_bytes_field = 10; @@ -42,6 +44,7 @@ message Proto3Message { optional Proto3Enum optional_enum_field = 15; optional Proto3Message optional_message_field = 16; optional google.protobuf.UInt32Value optional_wrapped_uint32_field = 212; + optional google.protobuf.Struct optional_struct_field = 215; repeated string repeated_string_field = 17; repeated bytes repeated_bytes_field = 18; @@ -54,6 +57,7 @@ message Proto3Message { repeated Proto3Enum repeated_enum_field = 23; repeated Proto3Message repeated_message_field = 24; repeated google.protobuf.UInt32Value repeated_wrapped_uint32_field = 213; + repeated google.protobuf.Struct repeated_struct_field = 216; repeated double packed_double_field = 25 [packed = true]; repeated uint32 packed_uint32_field = 26 [packed = true]; @@ -75,6 +79,7 @@ message Proto3Message { Proto3Enum oneof_enum_field = 37; Proto3Message oneof_message_field = 38; google.protobuf.UInt32Value oneof_wrapped_uint32_field = 204; + google.protobuf.Struct oneof_struct_field = 217; } map map_string_string_field = 39; map map_int32_int32_field = 40; @@ -83,6 +88,7 @@ message Proto3Message { map map_int32_enum_field = 43; map map_int32_message_field = 44; map map_int32_wrapped_uint32_field = 205; + map map_int32_struct_field = 218; } enum Proto3Enum { diff --git a/packages/protobuf-test/src/create.test.ts b/packages/protobuf-test/src/create.test.ts index 35b5cc6e3..499e6c14e 100644 --- a/packages/protobuf-test/src/create.test.ts +++ b/packages/protobuf-test/src/create.test.ts @@ -875,5 +875,52 @@ describe("create()", () => { expect(msg.mapInt32WrappedUint32Field[123].value).toBe(123); }); }); + describe("wkt struct field", () => { + test("accepts JsonObject", () => { + const msg = create(proto3_ts.Proto3MessageSchema, { + singularStructField: { + shouldBeJson: true, + }, + repeatedStructField: [ + { + shouldBeJson: 1, + }, + { + shouldBeJson: 2, + }, + ], + either: { + case: "oneofStructField", + value: { + shouldBeJson: true, + }, + }, + mapInt32StructField: { + 123: { + shouldBeJson: true, + }, + }, + }); + + expect(msg.singularStructField).toStrictEqual({ shouldBeJson: true }); + expect(msg.repeatedStructField).toStrictEqual([ + { + shouldBeJson: 1, + }, + { + shouldBeJson: 2, + }, + ]); + expect(msg.either.case).toBe("oneofStructField"); + if (msg.either.case == "oneofStructField") { + expect(msg.either.value).toStrictEqual({ + shouldBeJson: true, + }); + } + expect(msg.mapInt32StructField[123]).toStrictEqual({ + shouldBeJson: true, + }); + }); + }); }); }); diff --git a/packages/protobuf-test/src/extension-accessor.test.ts b/packages/protobuf-test/src/extension-accessor.test.ts index 031e24eb8..b6ab7983b 100644 --- a/packages/protobuf-test/src/extension-accessor.test.ts +++ b/packages/protobuf-test/src/extension-accessor.test.ts @@ -54,6 +54,8 @@ import { uint64_ext_js_string, unpacked_uint32_ext, wrapper_ext, + struct_ext, + repeated_struct_ext, } from "./gen/ts/extra/extensions-proto2_pb.js"; import { BinaryWriter, WireType } from "@bufbuild/protobuf/wire"; import type { DescExtension, DescMessage } from "@bufbuild/protobuf"; @@ -101,7 +103,9 @@ const goldenValues: extensionWithValueCollection = [ { ext: packed_uint32_ext, val: [1, 2, 3] }, { ext: unpacked_uint32_ext, val: [4, 5, 6] }, { ext: repeated_uint64_ext_js_string, val: ["1", "2", "3"] }, + { ext: repeated_struct_ext, val: [{ shouldBeJson: 1 }, { shouldBeJson: 2 }] }, { ext: wrapper_ext, val: 123 }, + { ext: struct_ext, val: { shouldBeJson: true } }, { ext: groupext, val: create(GroupExtSchema, { a: 123 }) }, { ext: repeatedgroupext, @@ -133,7 +137,9 @@ const goldenValuesZero: extensionWithValueCollection = [ { ext: packed_uint32_ext, val: [] }, { ext: unpacked_uint32_ext, val: [] }, { ext: repeated_uint64_ext_js_string, val: [] }, + { ext: repeated_struct_ext, val: [] }, { ext: wrapper_ext, val: 0 }, + { ext: struct_ext, val: {} }, { ext: groupext, val: create(GroupExtSchema) }, { ext: repeatedgroupext, val: [] }, { ext: Proto2ExtContainer_uint32_ext, val: 0 }, diff --git a/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.d.ts b/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.d.ts index 00ebe2847..40d57bfe2 100644 --- a/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.d.ts +++ b/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.d.ts @@ -17,7 +17,7 @@ /* eslint-disable */ import type { GenDescEnum, GenDescExtension, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; import type { User } from "./example_pb.js"; /** @@ -253,11 +253,21 @@ export declare const unpacked_uint32_ext: GenDescExtension; +/** + * @generated from extension: repeated google.protobuf.Struct repeated_struct_ext = 7007; + */ +export declare const repeated_struct_ext: GenDescExtension; + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ export declare const wrapper_ext: GenDescExtension; +/** + * @generated from extension: optional google.protobuf.Struct struct_ext = 8002; + */ +export declare const struct_ext: GenDescExtension; + /** * @generated from extension: optional proto2ext.GroupExt groupext = 8100; */ diff --git a/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.js b/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.js index ce9e664ac..093efe9d0 100644 --- a/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.js +++ b/packages/protobuf-test/src/gen/js/extra/extensions-proto2_pb.js @@ -18,13 +18,13 @@ import { enumDesc, extDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv1"; import { file_extra_example } from "./example_pb.js"; -import { file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; /** * Describes the file extra/extensions-proto2.proto. */ export const file_extra_extensions_proto2 = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOlkKC3dyYXBwZXJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGME+IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZVIKd3JhcHBlckV4dDpLCghncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRikPyABKAoyEy5wcm90bzJleHQuR3JvdXBFeHRSCGdyb3VwZXh0OmMKEHJlcGVhdGVkZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpT8gAygKMhsucHJvdG8yZXh0LlJlcGVhdGVkR3JvdXBFeHRSEHJlcGVhdGVkZ3JvdXBleHQ", [file_extra_example, file_google_protobuf_wrappers]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOmMKE3JlcGVhdGVkX3N0cnVjdF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3zYgAygLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdFIRcmVwZWF0ZWRTdHJ1Y3RFeHQ6WQoLd3JhcHBlcl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYwT4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlUgp3cmFwcGVyRXh0OlIKCnN0cnVjdF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYwj4gASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdFIJc3RydWN0RXh0OksKCGdyb3VwZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKQ/IAEoCjITLnByb3RvMmV4dC5Hcm91cEV4dFIIZ3JvdXBleHQ6YwoQcmVwZWF0ZWRncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRilPyADKAoyGy5wcm90bzJleHQuUmVwZWF0ZWRHcm91cEV4dFIQcmVwZWF0ZWRncm91cGV4dA", [file_extra_example, file_google_protobuf_wrappers, file_google_protobuf_struct]); /** * Describes the message proto2ext.Proto2Extendee. @@ -204,21 +204,33 @@ export const unpacked_uint32_ext = /*@__PURE__*/ export const repeated_uint64_ext_js_string = /*@__PURE__*/ extDesc(file_extra_extensions_proto2, 17); +/** + * @generated from extension: repeated google.protobuf.Struct repeated_struct_ext = 7007; + */ +export const repeated_struct_ext = /*@__PURE__*/ + extDesc(file_extra_extensions_proto2, 18); + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ export const wrapper_ext = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 18); + extDesc(file_extra_extensions_proto2, 19); + +/** + * @generated from extension: optional google.protobuf.Struct struct_ext = 8002; + */ +export const struct_ext = /*@__PURE__*/ + extDesc(file_extra_extensions_proto2, 20); /** * @generated from extension: optional proto2ext.GroupExt groupext = 8100; */ export const groupext = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 19); + extDesc(file_extra_extensions_proto2, 21); /** * @generated from extension: repeated proto2ext.RepeatedGroupExt repeatedgroupext = 8101; */ export const repeatedgroupext = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 20); + extDesc(file_extra_extensions_proto2, 22); diff --git a/packages/protobuf-test/src/gen/js/extra/proto3_pb.d.ts b/packages/protobuf-test/src/gen/js/extra/proto3_pb.d.ts index 0232f3c6e..21e6855ea 100644 --- a/packages/protobuf-test/src/gen/js/extra/proto3_pb.d.ts +++ b/packages/protobuf-test/src/gen/js/extra/proto3_pb.d.ts @@ -17,7 +17,7 @@ /* eslint-disable */ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; import type { UInt32Value } from "@bufbuild/protobuf/wkt"; /** @@ -86,6 +86,11 @@ export declare type Proto3Message = Message<"spec.Proto3Message"> & { */ singularWrappedUint32Field?: number; + /** + * @generated from field: google.protobuf.Struct singular_struct_field = 214; + */ + singularStructField?: JsonObject; + /** * @generated from field: optional string optional_string_field = 9; */ @@ -141,6 +146,11 @@ export declare type Proto3Message = Message<"spec.Proto3Message"> & { */ optionalWrappedUint32Field?: number; + /** + * @generated from field: optional google.protobuf.Struct optional_struct_field = 215; + */ + optionalStructField?: JsonObject; + /** * @generated from field: repeated string repeated_string_field = 17; */ @@ -196,6 +206,11 @@ export declare type Proto3Message = Message<"spec.Proto3Message"> & { */ repeatedWrappedUint32Field: UInt32Value[]; + /** + * @generated from field: repeated google.protobuf.Struct repeated_struct_field = 216; + */ + repeatedStructField: JsonObject[]; + /** * @generated from field: repeated double packed_double_field = 25 [packed = true]; */ @@ -295,6 +310,12 @@ export declare type Proto3Message = Message<"spec.Proto3Message"> & { */ value: UInt32Value; case: "oneofWrappedUint32Field"; + } | { + /** + * @generated from field: google.protobuf.Struct oneof_struct_field = 217; + */ + value: JsonObject; + case: "oneofStructField"; } | { case: undefined; value?: undefined }; /** @@ -331,6 +352,11 @@ export declare type Proto3Message = Message<"spec.Proto3Message"> & { * @generated from field: map map_int32_wrapped_uint32_field = 205; */ mapInt32WrappedUint32Field: { [key: number]: UInt32Value }; + + /** + * @generated from field: map map_int32_struct_field = 218; + */ + mapInt32StructField: { [key: number]: JsonObject }; }; /** diff --git a/packages/protobuf-test/src/gen/js/extra/proto3_pb.js b/packages/protobuf-test/src/gen/js/extra/proto3_pb.js index f41336977..0c3d074c3 100644 --- a/packages/protobuf-test/src/gen/js/extra/proto3_pb.js +++ b/packages/protobuf-test/src/gen/js/extra/proto3_pb.js @@ -17,13 +17,13 @@ /* eslint-disable */ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv1"; -import { file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; /** * Describes the file extra/proto3.proto. */ export const file_extra_proto3 = /*@__PURE__*/ - fileDesc("ChJleHRyYS9wcm90bzMucHJvdG8SBHNwZWMirRoKDVByb3RvM01lc3NhZ2USHQoVc2luZ3VsYXJfc3RyaW5nX2ZpZWxkGAEgASgJEhwKFHNpbmd1bGFyX2J5dGVzX2ZpZWxkGAIgASgMEhwKFHNpbmd1bGFyX2ludDMyX2ZpZWxkGAMgASgFEhwKFHNpbmd1bGFyX2ludDY0X2ZpZWxkGAQgASgDEioKHnNpbmd1bGFyX2ludDY0X2pzX251bWJlcl9maWVsZBhnIAEoA0ICMAISKgoec2luZ3VsYXJfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGYgASgDQgIwARIcChRzaW5ndWxhcl9mbG9hdF9maWVsZBgFIAEoAhIbChNzaW5ndWxhcl9ib29sX2ZpZWxkGAYgASgIEi0KE3Npbmd1bGFyX2VudW1fZmllbGQYByABKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWc2luZ3VsYXJfbWVzc2FnZV9maWVsZBgIIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1zaW5ndWxhcl93cmFwcGVkX3VpbnQzMl9maWVsZBjTASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSIgoVb3B0aW9uYWxfc3RyaW5nX2ZpZWxkGAkgASgJSAGIAQESIQoUb3B0aW9uYWxfYnl0ZXNfZmllbGQYCiABKAxIAogBARIhChRvcHRpb25hbF9pbnQzMl9maWVsZBgLIAEoBUgDiAEBEiEKFG9wdGlvbmFsX2ludDY0X2ZpZWxkGAwgASgDSASIAQESLwoeb3B0aW9uYWxfaW50NjRfanNfbnVtYmVyX2ZpZWxkGGogASgDQgIwAkgFiAEBEi8KHm9wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZBhpIAEoA0ICMAFIBogBARIhChRvcHRpb25hbF9mbG9hdF9maWVsZBgNIAEoAkgHiAEBEiAKE29wdGlvbmFsX2Jvb2xfZmllbGQYDiABKAhICIgBARIyChNvcHRpb25hbF9lbnVtX2ZpZWxkGA8gASgOMhAuc3BlYy5Qcm90bzNFbnVtSAmIAQESOAoWb3B0aW9uYWxfbWVzc2FnZV9maWVsZBgQIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgKiAEBEkkKHW9wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkGNQBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgLiAEBEh0KFXJlcGVhdGVkX3N0cmluZ19maWVsZBgRIAMoCRIcChRyZXBlYXRlZF9ieXRlc19maWVsZBgSIAMoDBIcChRyZXBlYXRlZF9pbnQzMl9maWVsZBgTIAMoBRIcChRyZXBlYXRlZF9pbnQ2NF9maWVsZBgUIAMoAxIqCh5yZXBlYXRlZF9pbnQ2NF9qc19udW1iZXJfZmllbGQYbSADKANCAjACEioKHnJlcGVhdGVkX2ludDY0X2pzX3N0cmluZ19maWVsZBhsIAMoA0ICMAESHAoUcmVwZWF0ZWRfZmxvYXRfZmllbGQYFSADKAISGwoTcmVwZWF0ZWRfYm9vbF9maWVsZBgWIAMoCBItChNyZXBlYXRlZF9lbnVtX2ZpZWxkGBcgAygOMhAuc3BlYy5Qcm90bzNFbnVtEjMKFnJlcGVhdGVkX21lc3NhZ2VfZmllbGQYGCADKAsyEy5zcGVjLlByb3RvM01lc3NhZ2USRAodcmVwZWF0ZWRfd3JhcHBlZF91aW50MzJfZmllbGQY1QEgAygLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlEh8KE3BhY2tlZF9kb3VibGVfZmllbGQYGSADKAFCAhABEh8KE3BhY2tlZF91aW50MzJfZmllbGQYGiADKA1CAhABEh8KE3BhY2tlZF91aW50NjRfZmllbGQYGyADKARCAhABEiEKFXVucGFja2VkX2RvdWJsZV9maWVsZBgcIAMoAUICEAASIQoVdW5wYWNrZWRfdWludDMyX2ZpZWxkGB0gAygNQgIQABIhChV1bnBhY2tlZF91aW50NjRfZmllbGQYHiADKARCAhAAEhwKEm9uZW9mX3N0cmluZ19maWVsZBgfIAEoCUgAEhsKEW9uZW9mX2J5dGVzX2ZpZWxkGCAgASgMSAASGwoRb25lb2ZfaW50MzJfZmllbGQYISABKAVIABIbChFvbmVvZl9pbnQ2NF9maWVsZBgiIAEoA0gAEikKG29uZW9mX2ludDY0X2pzX251bWJlcl9maWVsZBhwIAEoA0ICMAJIABIpChtvbmVvZl9pbnQ2NF9qc19zdHJpbmdfZmllbGQYbyABKANCAjABSAASGwoRb25lb2ZfZmxvYXRfZmllbGQYIyABKAJIABIaChBvbmVvZl9ib29sX2ZpZWxkGCQgASgISAASLAoQb25lb2ZfZW51bV9maWVsZBglIAEoDjIQLnNwZWMuUHJvdG8zRW51bUgAEjIKE29uZW9mX21lc3NhZ2VfZmllbGQYJiABKAsyEy5zcGVjLlByb3RvM01lc3NhZ2VIABJDChpvbmVvZl93cmFwcGVkX3VpbnQzMl9maWVsZBjMASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVIABJOChdtYXBfc3RyaW5nX3N0cmluZ19maWVsZBgnIAMoCzItLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBTdHJpbmdTdHJpbmdGaWVsZEVudHJ5EkoKFW1hcF9pbnQzMl9pbnQzMl9maWVsZBgoIAMoCzIrLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBJbnQzMkludDMyRmllbGRFbnRyeRJGChNtYXBfYm9vbF9ib29sX2ZpZWxkGCkgAygLMikuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEJvb2xCb29sRmllbGRFbnRyeRJKChVtYXBfaW50NjRfaW50NjRfZmllbGQYKiADKAsyKy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50NjRJbnQ2NEZpZWxkRW50cnkSSAoUbWFwX2ludDMyX2VudW1fZmllbGQYKyADKAsyKi5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJFbnVtRmllbGRFbnRyeRJOChdtYXBfaW50MzJfbWVzc2FnZV9maWVsZBgsIAMoCzItLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBJbnQzMk1lc3NhZ2VGaWVsZEVudHJ5ElwKHm1hcF9pbnQzMl93cmFwcGVkX3VpbnQzMl9maWVsZBjNASADKAsyMy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJXcmFwcGVkVWludDMyRmllbGRFbnRyeRo7ChlNYXBTdHJpbmdTdHJpbmdGaWVsZEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaOQoXTWFwSW50MzJJbnQzMkZpZWxkRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ARo3ChVNYXBCb29sQm9vbEZpZWxkRW50cnkSCwoDa2V5GAEgASgIEg0KBXZhbHVlGAIgASgIOgI4ARo5ChdNYXBJbnQ2NEludDY0RmllbGRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGkoKFk1hcEludDMyRW51bUZpZWxkRW50cnkSCwoDa2V5GAEgASgFEh8KBXZhbHVlGAIgASgOMhAuc3BlYy5Qcm90bzNFbnVtOgI4ARpQChlNYXBJbnQzMk1lc3NhZ2VGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIiCgV2YWx1ZRgCIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZToCOAEaXwofTWFwSW50MzJXcmFwcGVkVWludDMyRmllbGRFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWU6AjgBQggKBmVpdGhlckIYChZfb3B0aW9uYWxfc3RyaW5nX2ZpZWxkQhcKFV9vcHRpb25hbF9ieXRlc19maWVsZEIXChVfb3B0aW9uYWxfaW50MzJfZmllbGRCFwoVX29wdGlvbmFsX2ludDY0X2ZpZWxkQiEKH19vcHRpb25hbF9pbnQ2NF9qc19udW1iZXJfZmllbGRCIQofX29wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZEIXChVfb3B0aW9uYWxfZmxvYXRfZmllbGRCFgoUX29wdGlvbmFsX2Jvb2xfZmllbGRCFgoUX29wdGlvbmFsX2VudW1fZmllbGRCGQoXX29wdGlvbmFsX21lc3NhZ2VfZmllbGRCIAoeX29wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkKlIKClByb3RvM0VudW0SGwoXUFJPVE8zX0VOVU1fVU5TUEVDSUZJRUQQABITCg9QUk9UTzNfRU5VTV9ZRVMQARISCg5QUk9UTzNfRU5VTV9OTxACQiFaH2dpdGh1Yi5jb20vYnVmYnVpbGQvcHJvdG9idWYtZXNiBnByb3RvMw", [file_google_protobuf_wrappers]); + fileDesc("ChJleHRyYS9wcm90bzMucHJvdG8SBHNwZWMi0x0KDVByb3RvM01lc3NhZ2USHQoVc2luZ3VsYXJfc3RyaW5nX2ZpZWxkGAEgASgJEhwKFHNpbmd1bGFyX2J5dGVzX2ZpZWxkGAIgASgMEhwKFHNpbmd1bGFyX2ludDMyX2ZpZWxkGAMgASgFEhwKFHNpbmd1bGFyX2ludDY0X2ZpZWxkGAQgASgDEioKHnNpbmd1bGFyX2ludDY0X2pzX251bWJlcl9maWVsZBhnIAEoA0ICMAISKgoec2luZ3VsYXJfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGYgASgDQgIwARIcChRzaW5ndWxhcl9mbG9hdF9maWVsZBgFIAEoAhIbChNzaW5ndWxhcl9ib29sX2ZpZWxkGAYgASgIEi0KE3Npbmd1bGFyX2VudW1fZmllbGQYByABKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWc2luZ3VsYXJfbWVzc2FnZV9maWVsZBgIIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1zaW5ndWxhcl93cmFwcGVkX3VpbnQzMl9maWVsZBjTASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSNwoVc2luZ3VsYXJfc3RydWN0X2ZpZWxkGNYBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSIgoVb3B0aW9uYWxfc3RyaW5nX2ZpZWxkGAkgASgJSAGIAQESIQoUb3B0aW9uYWxfYnl0ZXNfZmllbGQYCiABKAxIAogBARIhChRvcHRpb25hbF9pbnQzMl9maWVsZBgLIAEoBUgDiAEBEiEKFG9wdGlvbmFsX2ludDY0X2ZpZWxkGAwgASgDSASIAQESLwoeb3B0aW9uYWxfaW50NjRfanNfbnVtYmVyX2ZpZWxkGGogASgDQgIwAkgFiAEBEi8KHm9wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZBhpIAEoA0ICMAFIBogBARIhChRvcHRpb25hbF9mbG9hdF9maWVsZBgNIAEoAkgHiAEBEiAKE29wdGlvbmFsX2Jvb2xfZmllbGQYDiABKAhICIgBARIyChNvcHRpb25hbF9lbnVtX2ZpZWxkGA8gASgOMhAuc3BlYy5Qcm90bzNFbnVtSAmIAQESOAoWb3B0aW9uYWxfbWVzc2FnZV9maWVsZBgQIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgKiAEBEkkKHW9wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkGNQBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgLiAEBEjwKFW9wdGlvbmFsX3N0cnVjdF9maWVsZBjXASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SAyIAQESHQoVcmVwZWF0ZWRfc3RyaW5nX2ZpZWxkGBEgAygJEhwKFHJlcGVhdGVkX2J5dGVzX2ZpZWxkGBIgAygMEhwKFHJlcGVhdGVkX2ludDMyX2ZpZWxkGBMgAygFEhwKFHJlcGVhdGVkX2ludDY0X2ZpZWxkGBQgAygDEioKHnJlcGVhdGVkX2ludDY0X2pzX251bWJlcl9maWVsZBhtIAMoA0ICMAISKgoecmVwZWF0ZWRfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGwgAygDQgIwARIcChRyZXBlYXRlZF9mbG9hdF9maWVsZBgVIAMoAhIbChNyZXBlYXRlZF9ib29sX2ZpZWxkGBYgAygIEi0KE3JlcGVhdGVkX2VudW1fZmllbGQYFyADKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWcmVwZWF0ZWRfbWVzc2FnZV9maWVsZBgYIAMoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1yZXBlYXRlZF93cmFwcGVkX3VpbnQzMl9maWVsZBjVASADKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSNwoVcmVwZWF0ZWRfc3RydWN0X2ZpZWxkGNgBIAMoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSHwoTcGFja2VkX2RvdWJsZV9maWVsZBgZIAMoAUICEAESHwoTcGFja2VkX3VpbnQzMl9maWVsZBgaIAMoDUICEAESHwoTcGFja2VkX3VpbnQ2NF9maWVsZBgbIAMoBEICEAESIQoVdW5wYWNrZWRfZG91YmxlX2ZpZWxkGBwgAygBQgIQABIhChV1bnBhY2tlZF91aW50MzJfZmllbGQYHSADKA1CAhAAEiEKFXVucGFja2VkX3VpbnQ2NF9maWVsZBgeIAMoBEICEAASHAoSb25lb2Zfc3RyaW5nX2ZpZWxkGB8gASgJSAASGwoRb25lb2ZfYnl0ZXNfZmllbGQYICABKAxIABIbChFvbmVvZl9pbnQzMl9maWVsZBghIAEoBUgAEhsKEW9uZW9mX2ludDY0X2ZpZWxkGCIgASgDSAASKQobb25lb2ZfaW50NjRfanNfbnVtYmVyX2ZpZWxkGHAgASgDQgIwAkgAEikKG29uZW9mX2ludDY0X2pzX3N0cmluZ19maWVsZBhvIAEoA0ICMAFIABIbChFvbmVvZl9mbG9hdF9maWVsZBgjIAEoAkgAEhoKEG9uZW9mX2Jvb2xfZmllbGQYJCABKAhIABIsChBvbmVvZl9lbnVtX2ZpZWxkGCUgASgOMhAuc3BlYy5Qcm90bzNFbnVtSAASMgoTb25lb2ZfbWVzc2FnZV9maWVsZBgmIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgAEkMKGm9uZW9mX3dyYXBwZWRfdWludDMyX2ZpZWxkGMwBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgAEjYKEm9uZW9mX3N0cnVjdF9maWVsZBjZASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SAASTgoXbWFwX3N0cmluZ19zdHJpbmdfZmllbGQYJyADKAsyLS5zcGVjLlByb3RvM01lc3NhZ2UuTWFwU3RyaW5nU3RyaW5nRmllbGRFbnRyeRJKChVtYXBfaW50MzJfaW50MzJfZmllbGQYKCADKAsyKy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJJbnQzMkZpZWxkRW50cnkSRgoTbWFwX2Jvb2xfYm9vbF9maWVsZBgpIAMoCzIpLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBCb29sQm9vbEZpZWxkRW50cnkSSgoVbWFwX2ludDY0X2ludDY0X2ZpZWxkGCogAygLMisuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDY0SW50NjRGaWVsZEVudHJ5EkgKFG1hcF9pbnQzMl9lbnVtX2ZpZWxkGCsgAygLMiouc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDMyRW51bUZpZWxkRW50cnkSTgoXbWFwX2ludDMyX21lc3NhZ2VfZmllbGQYLCADKAsyLS5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJNZXNzYWdlRmllbGRFbnRyeRJcCh5tYXBfaW50MzJfd3JhcHBlZF91aW50MzJfZmllbGQYzQEgAygLMjMuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDMyV3JhcHBlZFVpbnQzMkZpZWxkRW50cnkSTQoWbWFwX2ludDMyX3N0cnVjdF9maWVsZBjaASADKAsyLC5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJTdHJ1Y3RGaWVsZEVudHJ5GjsKGU1hcFN0cmluZ1N0cmluZ0ZpZWxkRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo5ChdNYXBJbnQzMkludDMyRmllbGRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjcKFU1hcEJvb2xCb29sRmllbGRFbnRyeRILCgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGjkKF01hcEludDY0SW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoCOAEaSgoWTWFwSW50MzJFbnVtRmllbGRFbnRyeRILCgNrZXkYASABKAUSHwoFdmFsdWUYAiABKA4yEC5zcGVjLlByb3RvM0VudW06AjgBGlAKGU1hcEludDMyTWVzc2FnZUZpZWxkRW50cnkSCwoDa2V5GAEgASgFEiIKBXZhbHVlGAIgASgLMhMuc3BlYy5Qcm90bzNNZXNzYWdlOgI4ARpfCh9NYXBJbnQzMldyYXBwZWRVaW50MzJGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1ZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZToCOAEaUwoYTWFwSW50MzJTdHJ1Y3RGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRImCgV2YWx1ZRgCIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Q6AjgBQggKBmVpdGhlckIYChZfb3B0aW9uYWxfc3RyaW5nX2ZpZWxkQhcKFV9vcHRpb25hbF9ieXRlc19maWVsZEIXChVfb3B0aW9uYWxfaW50MzJfZmllbGRCFwoVX29wdGlvbmFsX2ludDY0X2ZpZWxkQiEKH19vcHRpb25hbF9pbnQ2NF9qc19udW1iZXJfZmllbGRCIQofX29wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZEIXChVfb3B0aW9uYWxfZmxvYXRfZmllbGRCFgoUX29wdGlvbmFsX2Jvb2xfZmllbGRCFgoUX29wdGlvbmFsX2VudW1fZmllbGRCGQoXX29wdGlvbmFsX21lc3NhZ2VfZmllbGRCIAoeX29wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkQhgKFl9vcHRpb25hbF9zdHJ1Y3RfZmllbGQqUgoKUHJvdG8zRW51bRIbChdQUk9UTzNfRU5VTV9VTlNQRUNJRklFRBAAEhMKD1BST1RPM19FTlVNX1lFUxABEhIKDlBST1RPM19FTlVNX05PEAJCIVofZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2J1Zi1lc2IGcHJvdG8z", [file_google_protobuf_wrappers, file_google_protobuf_struct]); /** * Describes the message spec.Proto3Message. diff --git a/packages/protobuf-test/src/gen/js/google/protobuf/test_messages_proto3_pb.d.ts b/packages/protobuf-test/src/gen/js/google/protobuf/test_messages_proto3_pb.d.ts index 6d1b277a8..274afe80e 100644 --- a/packages/protobuf-test/src/gen/js/google/protobuf/test_messages_proto3_pb.d.ts +++ b/packages/protobuf-test/src/gen/js/google/protobuf/test_messages_proto3_pb.d.ts @@ -17,8 +17,8 @@ /* eslint-disable */ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; -import type { Message } from "@bufbuild/protobuf"; -import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; +import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; /** * Describes the file google/protobuf/test_messages_proto3.proto. @@ -677,7 +677,7 @@ export declare type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3. /** * @generated from field: google.protobuf.Struct optional_struct = 304; */ - optionalStruct?: Struct; + optionalStruct?: JsonObject; /** * @generated from field: google.protobuf.Any optional_any = 305; @@ -712,7 +712,7 @@ export declare type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3. /** * @generated from field: repeated google.protobuf.Struct repeated_struct = 324; */ - repeatedStruct: Struct[]; + repeatedStruct: JsonObject[]; /** * @generated from field: repeated google.protobuf.Any repeated_any = 315; diff --git a/packages/protobuf-test/src/gen/js/google/protobuf/unittest_well_known_types_pb.d.ts b/packages/protobuf-test/src/gen/js/google/protobuf/unittest_well_known_types_pb.d.ts index b350a50c7..7acf101c0 100644 --- a/packages/protobuf-test/src/gen/js/google/protobuf/unittest_well_known_types_pb.d.ts +++ b/packages/protobuf-test/src/gen/js/google/protobuf/unittest_well_known_types_pb.d.ts @@ -17,8 +17,8 @@ /* eslint-disable */ import type { GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; -import type { Message } from "@bufbuild/protobuf"; -import type { Any, Api, BoolValue, BytesValue, DoubleValue, Duration, Empty, FieldMask, FloatValue, Int32Value, Int64Value, SourceContext, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; +import type { Any, Api, BoolValue, BytesValue, DoubleValue, Duration, Empty, FieldMask, FloatValue, Int32Value, Int64Value, SourceContext, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; import type { Type } from "./type_pb.js"; /** @@ -67,7 +67,7 @@ export declare type TestWellKnownTypes = Message<"protobuf_unittest.TestWellKnow /** * @generated from field: google.protobuf.Struct struct_field = 7; */ - structField?: Struct; + structField?: JsonObject; /** * @generated from field: google.protobuf.Timestamp timestamp_field = 8; @@ -177,7 +177,7 @@ export declare type RepeatedWellKnownTypes = Message<"protobuf_unittest.Repeated /** * @generated from field: repeated google.protobuf.Struct struct_field = 7; */ - structField: Struct[]; + structField: JsonObject[]; /** * @generated from field: repeated google.protobuf.Timestamp timestamp_field = 8; @@ -290,7 +290,7 @@ export declare type OneofWellKnownTypes = Message<"protobuf_unittest.OneofWellKn /** * @generated from field: google.protobuf.Struct struct_field = 7; */ - value: Struct; + value: JsonObject; case: "structField"; } | { /** @@ -408,7 +408,7 @@ export declare type MapWellKnownTypes = Message<"protobuf_unittest.MapWellKnownT /** * @generated from field: map struct_field = 7; */ - structField: { [key: number]: Struct }; + structField: { [key: number]: JsonObject }; /** * @generated from field: map timestamp_field = 8; diff --git a/packages/protobuf-test/src/gen/ts/extra/extensions-proto2_pb.ts b/packages/protobuf-test/src/gen/ts/extra/extensions-proto2_pb.ts index 7ee7d7614..26aafec9b 100644 --- a/packages/protobuf-test/src/gen/ts/extra/extensions-proto2_pb.ts +++ b/packages/protobuf-test/src/gen/ts/extra/extensions-proto2_pb.ts @@ -20,14 +20,14 @@ import type { GenDescEnum, GenDescExtension, GenDescFile, GenDescMessage } from import { enumDesc, extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; import type { User } from "./example_pb.js"; import { file_extra_example } from "./example_pb.js"; -import { file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import { file_google_protobuf_struct, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file extra/extensions-proto2.proto. */ export const file_extra_extensions_proto2: GenDescFile = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOlkKC3dyYXBwZXJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGME+IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZVIKd3JhcHBlckV4dDpLCghncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRikPyABKAoyEy5wcm90bzJleHQuR3JvdXBFeHRSCGdyb3VwZXh0OmMKEHJlcGVhdGVkZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpT8gAygKMhsucHJvdG8yZXh0LlJlcGVhdGVkR3JvdXBFeHRSEHJlcGVhdGVkZ3JvdXBleHQ", [file_extra_example, file_google_protobuf_wrappers]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOmMKE3JlcGVhdGVkX3N0cnVjdF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3zYgAygLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdFIRcmVwZWF0ZWRTdHJ1Y3RFeHQ6WQoLd3JhcHBlcl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYwT4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlUgp3cmFwcGVyRXh0OlIKCnN0cnVjdF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYwj4gASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdFIJc3RydWN0RXh0OksKCGdyb3VwZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKQ/IAEoCjITLnByb3RvMmV4dC5Hcm91cEV4dFIIZ3JvdXBleHQ6YwoQcmVwZWF0ZWRncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRilPyADKAoyGy5wcm90bzJleHQuUmVwZWF0ZWRHcm91cEV4dFIQcmVwZWF0ZWRncm91cGV4dA", [file_extra_example, file_google_protobuf_wrappers, file_google_protobuf_struct]); /** * The message we're going to extend @@ -284,21 +284,33 @@ export const unpacked_uint32_ext: GenDescExtension = / export const repeated_uint64_ext_js_string: GenDescExtension = /*@__PURE__*/ extDesc(file_extra_extensions_proto2, 17); +/** + * @generated from extension: repeated google.protobuf.Struct repeated_struct_ext = 7007; + */ +export const repeated_struct_ext: GenDescExtension = /*@__PURE__*/ + extDesc(file_extra_extensions_proto2, 18); + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ export const wrapper_ext: GenDescExtension = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 18); + extDesc(file_extra_extensions_proto2, 19); + +/** + * @generated from extension: optional google.protobuf.Struct struct_ext = 8002; + */ +export const struct_ext: GenDescExtension = /*@__PURE__*/ + extDesc(file_extra_extensions_proto2, 20); /** * @generated from extension: optional proto2ext.GroupExt groupext = 8100; */ export const groupext: GenDescExtension = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 19); + extDesc(file_extra_extensions_proto2, 21); /** * @generated from extension: repeated proto2ext.RepeatedGroupExt repeatedgroupext = 8101; */ export const repeatedgroupext: GenDescExtension = /*@__PURE__*/ - extDesc(file_extra_extensions_proto2, 20); + extDesc(file_extra_extensions_proto2, 22); diff --git a/packages/protobuf-test/src/gen/ts/extra/proto3_pb.ts b/packages/protobuf-test/src/gen/ts/extra/proto3_pb.ts index 070f97fb7..867e581fe 100644 --- a/packages/protobuf-test/src/gen/ts/extra/proto3_pb.ts +++ b/packages/protobuf-test/src/gen/ts/extra/proto3_pb.ts @@ -19,14 +19,14 @@ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; import type { UInt32Value } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import { file_google_protobuf_struct, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file extra/proto3.proto. */ export const file_extra_proto3: GenDescFile = /*@__PURE__*/ - fileDesc("ChJleHRyYS9wcm90bzMucHJvdG8SBHNwZWMirRoKDVByb3RvM01lc3NhZ2USHQoVc2luZ3VsYXJfc3RyaW5nX2ZpZWxkGAEgASgJEhwKFHNpbmd1bGFyX2J5dGVzX2ZpZWxkGAIgASgMEhwKFHNpbmd1bGFyX2ludDMyX2ZpZWxkGAMgASgFEhwKFHNpbmd1bGFyX2ludDY0X2ZpZWxkGAQgASgDEioKHnNpbmd1bGFyX2ludDY0X2pzX251bWJlcl9maWVsZBhnIAEoA0ICMAISKgoec2luZ3VsYXJfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGYgASgDQgIwARIcChRzaW5ndWxhcl9mbG9hdF9maWVsZBgFIAEoAhIbChNzaW5ndWxhcl9ib29sX2ZpZWxkGAYgASgIEi0KE3Npbmd1bGFyX2VudW1fZmllbGQYByABKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWc2luZ3VsYXJfbWVzc2FnZV9maWVsZBgIIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1zaW5ndWxhcl93cmFwcGVkX3VpbnQzMl9maWVsZBjTASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSIgoVb3B0aW9uYWxfc3RyaW5nX2ZpZWxkGAkgASgJSAGIAQESIQoUb3B0aW9uYWxfYnl0ZXNfZmllbGQYCiABKAxIAogBARIhChRvcHRpb25hbF9pbnQzMl9maWVsZBgLIAEoBUgDiAEBEiEKFG9wdGlvbmFsX2ludDY0X2ZpZWxkGAwgASgDSASIAQESLwoeb3B0aW9uYWxfaW50NjRfanNfbnVtYmVyX2ZpZWxkGGogASgDQgIwAkgFiAEBEi8KHm9wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZBhpIAEoA0ICMAFIBogBARIhChRvcHRpb25hbF9mbG9hdF9maWVsZBgNIAEoAkgHiAEBEiAKE29wdGlvbmFsX2Jvb2xfZmllbGQYDiABKAhICIgBARIyChNvcHRpb25hbF9lbnVtX2ZpZWxkGA8gASgOMhAuc3BlYy5Qcm90bzNFbnVtSAmIAQESOAoWb3B0aW9uYWxfbWVzc2FnZV9maWVsZBgQIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgKiAEBEkkKHW9wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkGNQBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgLiAEBEh0KFXJlcGVhdGVkX3N0cmluZ19maWVsZBgRIAMoCRIcChRyZXBlYXRlZF9ieXRlc19maWVsZBgSIAMoDBIcChRyZXBlYXRlZF9pbnQzMl9maWVsZBgTIAMoBRIcChRyZXBlYXRlZF9pbnQ2NF9maWVsZBgUIAMoAxIqCh5yZXBlYXRlZF9pbnQ2NF9qc19udW1iZXJfZmllbGQYbSADKANCAjACEioKHnJlcGVhdGVkX2ludDY0X2pzX3N0cmluZ19maWVsZBhsIAMoA0ICMAESHAoUcmVwZWF0ZWRfZmxvYXRfZmllbGQYFSADKAISGwoTcmVwZWF0ZWRfYm9vbF9maWVsZBgWIAMoCBItChNyZXBlYXRlZF9lbnVtX2ZpZWxkGBcgAygOMhAuc3BlYy5Qcm90bzNFbnVtEjMKFnJlcGVhdGVkX21lc3NhZ2VfZmllbGQYGCADKAsyEy5zcGVjLlByb3RvM01lc3NhZ2USRAodcmVwZWF0ZWRfd3JhcHBlZF91aW50MzJfZmllbGQY1QEgAygLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlEh8KE3BhY2tlZF9kb3VibGVfZmllbGQYGSADKAFCAhABEh8KE3BhY2tlZF91aW50MzJfZmllbGQYGiADKA1CAhABEh8KE3BhY2tlZF91aW50NjRfZmllbGQYGyADKARCAhABEiEKFXVucGFja2VkX2RvdWJsZV9maWVsZBgcIAMoAUICEAASIQoVdW5wYWNrZWRfdWludDMyX2ZpZWxkGB0gAygNQgIQABIhChV1bnBhY2tlZF91aW50NjRfZmllbGQYHiADKARCAhAAEhwKEm9uZW9mX3N0cmluZ19maWVsZBgfIAEoCUgAEhsKEW9uZW9mX2J5dGVzX2ZpZWxkGCAgASgMSAASGwoRb25lb2ZfaW50MzJfZmllbGQYISABKAVIABIbChFvbmVvZl9pbnQ2NF9maWVsZBgiIAEoA0gAEikKG29uZW9mX2ludDY0X2pzX251bWJlcl9maWVsZBhwIAEoA0ICMAJIABIpChtvbmVvZl9pbnQ2NF9qc19zdHJpbmdfZmllbGQYbyABKANCAjABSAASGwoRb25lb2ZfZmxvYXRfZmllbGQYIyABKAJIABIaChBvbmVvZl9ib29sX2ZpZWxkGCQgASgISAASLAoQb25lb2ZfZW51bV9maWVsZBglIAEoDjIQLnNwZWMuUHJvdG8zRW51bUgAEjIKE29uZW9mX21lc3NhZ2VfZmllbGQYJiABKAsyEy5zcGVjLlByb3RvM01lc3NhZ2VIABJDChpvbmVvZl93cmFwcGVkX3VpbnQzMl9maWVsZBjMASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVIABJOChdtYXBfc3RyaW5nX3N0cmluZ19maWVsZBgnIAMoCzItLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBTdHJpbmdTdHJpbmdGaWVsZEVudHJ5EkoKFW1hcF9pbnQzMl9pbnQzMl9maWVsZBgoIAMoCzIrLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBJbnQzMkludDMyRmllbGRFbnRyeRJGChNtYXBfYm9vbF9ib29sX2ZpZWxkGCkgAygLMikuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEJvb2xCb29sRmllbGRFbnRyeRJKChVtYXBfaW50NjRfaW50NjRfZmllbGQYKiADKAsyKy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50NjRJbnQ2NEZpZWxkRW50cnkSSAoUbWFwX2ludDMyX2VudW1fZmllbGQYKyADKAsyKi5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJFbnVtRmllbGRFbnRyeRJOChdtYXBfaW50MzJfbWVzc2FnZV9maWVsZBgsIAMoCzItLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBJbnQzMk1lc3NhZ2VGaWVsZEVudHJ5ElwKHm1hcF9pbnQzMl93cmFwcGVkX3VpbnQzMl9maWVsZBjNASADKAsyMy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJXcmFwcGVkVWludDMyRmllbGRFbnRyeRo7ChlNYXBTdHJpbmdTdHJpbmdGaWVsZEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaOQoXTWFwSW50MzJJbnQzMkZpZWxkRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ARo3ChVNYXBCb29sQm9vbEZpZWxkRW50cnkSCwoDa2V5GAEgASgIEg0KBXZhbHVlGAIgASgIOgI4ARo5ChdNYXBJbnQ2NEludDY0RmllbGRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGkoKFk1hcEludDMyRW51bUZpZWxkRW50cnkSCwoDa2V5GAEgASgFEh8KBXZhbHVlGAIgASgOMhAuc3BlYy5Qcm90bzNFbnVtOgI4ARpQChlNYXBJbnQzMk1lc3NhZ2VGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIiCgV2YWx1ZRgCIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZToCOAEaXwofTWFwSW50MzJXcmFwcGVkVWludDMyRmllbGRFbnRyeRILCgNrZXkYASABKAUSKwoFdmFsdWUYAiABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWU6AjgBQggKBmVpdGhlckIYChZfb3B0aW9uYWxfc3RyaW5nX2ZpZWxkQhcKFV9vcHRpb25hbF9ieXRlc19maWVsZEIXChVfb3B0aW9uYWxfaW50MzJfZmllbGRCFwoVX29wdGlvbmFsX2ludDY0X2ZpZWxkQiEKH19vcHRpb25hbF9pbnQ2NF9qc19udW1iZXJfZmllbGRCIQofX29wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZEIXChVfb3B0aW9uYWxfZmxvYXRfZmllbGRCFgoUX29wdGlvbmFsX2Jvb2xfZmllbGRCFgoUX29wdGlvbmFsX2VudW1fZmllbGRCGQoXX29wdGlvbmFsX21lc3NhZ2VfZmllbGRCIAoeX29wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkKlIKClByb3RvM0VudW0SGwoXUFJPVE8zX0VOVU1fVU5TUEVDSUZJRUQQABITCg9QUk9UTzNfRU5VTV9ZRVMQARISCg5QUk9UTzNfRU5VTV9OTxACQiFaH2dpdGh1Yi5jb20vYnVmYnVpbGQvcHJvdG9idWYtZXNiBnByb3RvMw", [file_google_protobuf_wrappers]); + fileDesc("ChJleHRyYS9wcm90bzMucHJvdG8SBHNwZWMi0x0KDVByb3RvM01lc3NhZ2USHQoVc2luZ3VsYXJfc3RyaW5nX2ZpZWxkGAEgASgJEhwKFHNpbmd1bGFyX2J5dGVzX2ZpZWxkGAIgASgMEhwKFHNpbmd1bGFyX2ludDMyX2ZpZWxkGAMgASgFEhwKFHNpbmd1bGFyX2ludDY0X2ZpZWxkGAQgASgDEioKHnNpbmd1bGFyX2ludDY0X2pzX251bWJlcl9maWVsZBhnIAEoA0ICMAISKgoec2luZ3VsYXJfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGYgASgDQgIwARIcChRzaW5ndWxhcl9mbG9hdF9maWVsZBgFIAEoAhIbChNzaW5ndWxhcl9ib29sX2ZpZWxkGAYgASgIEi0KE3Npbmd1bGFyX2VudW1fZmllbGQYByABKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWc2luZ3VsYXJfbWVzc2FnZV9maWVsZBgIIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1zaW5ndWxhcl93cmFwcGVkX3VpbnQzMl9maWVsZBjTASABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSNwoVc2luZ3VsYXJfc3RydWN0X2ZpZWxkGNYBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSIgoVb3B0aW9uYWxfc3RyaW5nX2ZpZWxkGAkgASgJSAGIAQESIQoUb3B0aW9uYWxfYnl0ZXNfZmllbGQYCiABKAxIAogBARIhChRvcHRpb25hbF9pbnQzMl9maWVsZBgLIAEoBUgDiAEBEiEKFG9wdGlvbmFsX2ludDY0X2ZpZWxkGAwgASgDSASIAQESLwoeb3B0aW9uYWxfaW50NjRfanNfbnVtYmVyX2ZpZWxkGGogASgDQgIwAkgFiAEBEi8KHm9wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZBhpIAEoA0ICMAFIBogBARIhChRvcHRpb25hbF9mbG9hdF9maWVsZBgNIAEoAkgHiAEBEiAKE29wdGlvbmFsX2Jvb2xfZmllbGQYDiABKAhICIgBARIyChNvcHRpb25hbF9lbnVtX2ZpZWxkGA8gASgOMhAuc3BlYy5Qcm90bzNFbnVtSAmIAQESOAoWb3B0aW9uYWxfbWVzc2FnZV9maWVsZBgQIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgKiAEBEkkKHW9wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkGNQBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgLiAEBEjwKFW9wdGlvbmFsX3N0cnVjdF9maWVsZBjXASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SAyIAQESHQoVcmVwZWF0ZWRfc3RyaW5nX2ZpZWxkGBEgAygJEhwKFHJlcGVhdGVkX2J5dGVzX2ZpZWxkGBIgAygMEhwKFHJlcGVhdGVkX2ludDMyX2ZpZWxkGBMgAygFEhwKFHJlcGVhdGVkX2ludDY0X2ZpZWxkGBQgAygDEioKHnJlcGVhdGVkX2ludDY0X2pzX251bWJlcl9maWVsZBhtIAMoA0ICMAISKgoecmVwZWF0ZWRfaW50NjRfanNfc3RyaW5nX2ZpZWxkGGwgAygDQgIwARIcChRyZXBlYXRlZF9mbG9hdF9maWVsZBgVIAMoAhIbChNyZXBlYXRlZF9ib29sX2ZpZWxkGBYgAygIEi0KE3JlcGVhdGVkX2VudW1fZmllbGQYFyADKA4yEC5zcGVjLlByb3RvM0VudW0SMwoWcmVwZWF0ZWRfbWVzc2FnZV9maWVsZBgYIAMoCzITLnNwZWMuUHJvdG8zTWVzc2FnZRJECh1yZXBlYXRlZF93cmFwcGVkX3VpbnQzMl9maWVsZBjVASADKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUSNwoVcmVwZWF0ZWRfc3RydWN0X2ZpZWxkGNgBIAMoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QSHwoTcGFja2VkX2RvdWJsZV9maWVsZBgZIAMoAUICEAESHwoTcGFja2VkX3VpbnQzMl9maWVsZBgaIAMoDUICEAESHwoTcGFja2VkX3VpbnQ2NF9maWVsZBgbIAMoBEICEAESIQoVdW5wYWNrZWRfZG91YmxlX2ZpZWxkGBwgAygBQgIQABIhChV1bnBhY2tlZF91aW50MzJfZmllbGQYHSADKA1CAhAAEiEKFXVucGFja2VkX3VpbnQ2NF9maWVsZBgeIAMoBEICEAASHAoSb25lb2Zfc3RyaW5nX2ZpZWxkGB8gASgJSAASGwoRb25lb2ZfYnl0ZXNfZmllbGQYICABKAxIABIbChFvbmVvZl9pbnQzMl9maWVsZBghIAEoBUgAEhsKEW9uZW9mX2ludDY0X2ZpZWxkGCIgASgDSAASKQobb25lb2ZfaW50NjRfanNfbnVtYmVyX2ZpZWxkGHAgASgDQgIwAkgAEikKG29uZW9mX2ludDY0X2pzX3N0cmluZ19maWVsZBhvIAEoA0ICMAFIABIbChFvbmVvZl9mbG9hdF9maWVsZBgjIAEoAkgAEhoKEG9uZW9mX2Jvb2xfZmllbGQYJCABKAhIABIsChBvbmVvZl9lbnVtX2ZpZWxkGCUgASgOMhAuc3BlYy5Qcm90bzNFbnVtSAASMgoTb25lb2ZfbWVzc2FnZV9maWVsZBgmIAEoCzITLnNwZWMuUHJvdG8zTWVzc2FnZUgAEkMKGm9uZW9mX3dyYXBwZWRfdWludDMyX2ZpZWxkGMwBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZUgAEjYKEm9uZW9mX3N0cnVjdF9maWVsZBjZASABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SAASTgoXbWFwX3N0cmluZ19zdHJpbmdfZmllbGQYJyADKAsyLS5zcGVjLlByb3RvM01lc3NhZ2UuTWFwU3RyaW5nU3RyaW5nRmllbGRFbnRyeRJKChVtYXBfaW50MzJfaW50MzJfZmllbGQYKCADKAsyKy5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJJbnQzMkZpZWxkRW50cnkSRgoTbWFwX2Jvb2xfYm9vbF9maWVsZBgpIAMoCzIpLnNwZWMuUHJvdG8zTWVzc2FnZS5NYXBCb29sQm9vbEZpZWxkRW50cnkSSgoVbWFwX2ludDY0X2ludDY0X2ZpZWxkGCogAygLMisuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDY0SW50NjRGaWVsZEVudHJ5EkgKFG1hcF9pbnQzMl9lbnVtX2ZpZWxkGCsgAygLMiouc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDMyRW51bUZpZWxkRW50cnkSTgoXbWFwX2ludDMyX21lc3NhZ2VfZmllbGQYLCADKAsyLS5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJNZXNzYWdlRmllbGRFbnRyeRJcCh5tYXBfaW50MzJfd3JhcHBlZF91aW50MzJfZmllbGQYzQEgAygLMjMuc3BlYy5Qcm90bzNNZXNzYWdlLk1hcEludDMyV3JhcHBlZFVpbnQzMkZpZWxkRW50cnkSTQoWbWFwX2ludDMyX3N0cnVjdF9maWVsZBjaASADKAsyLC5zcGVjLlByb3RvM01lc3NhZ2UuTWFwSW50MzJTdHJ1Y3RGaWVsZEVudHJ5GjsKGU1hcFN0cmluZ1N0cmluZ0ZpZWxkRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo5ChdNYXBJbnQzMkludDMyRmllbGRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjcKFU1hcEJvb2xCb29sRmllbGRFbnRyeRILCgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGjkKF01hcEludDY0SW50NjRGaWVsZEVudHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoCOAEaSgoWTWFwSW50MzJFbnVtRmllbGRFbnRyeRILCgNrZXkYASABKAUSHwoFdmFsdWUYAiABKA4yEC5zcGVjLlByb3RvM0VudW06AjgBGlAKGU1hcEludDMyTWVzc2FnZUZpZWxkRW50cnkSCwoDa2V5GAEgASgFEiIKBXZhbHVlGAIgASgLMhMuc3BlYy5Qcm90bzNNZXNzYWdlOgI4ARpfCh9NYXBJbnQzMldyYXBwZWRVaW50MzJGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRIrCgV2YWx1ZRgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZToCOAEaUwoYTWFwSW50MzJTdHJ1Y3RGaWVsZEVudHJ5EgsKA2tleRgBIAEoBRImCgV2YWx1ZRgCIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Q6AjgBQggKBmVpdGhlckIYChZfb3B0aW9uYWxfc3RyaW5nX2ZpZWxkQhcKFV9vcHRpb25hbF9ieXRlc19maWVsZEIXChVfb3B0aW9uYWxfaW50MzJfZmllbGRCFwoVX29wdGlvbmFsX2ludDY0X2ZpZWxkQiEKH19vcHRpb25hbF9pbnQ2NF9qc19udW1iZXJfZmllbGRCIQofX29wdGlvbmFsX2ludDY0X2pzX3N0cmluZ19maWVsZEIXChVfb3B0aW9uYWxfZmxvYXRfZmllbGRCFgoUX29wdGlvbmFsX2Jvb2xfZmllbGRCFgoUX29wdGlvbmFsX2VudW1fZmllbGRCGQoXX29wdGlvbmFsX21lc3NhZ2VfZmllbGRCIAoeX29wdGlvbmFsX3dyYXBwZWRfdWludDMyX2ZpZWxkQhgKFl9vcHRpb25hbF9zdHJ1Y3RfZmllbGQqUgoKUHJvdG8zRW51bRIbChdQUk9UTzNfRU5VTV9VTlNQRUNJRklFRBAAEhMKD1BST1RPM19FTlVNX1lFUxABEhIKDlBST1RPM19FTlVNX05PEAJCIVofZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2J1Zi1lc2IGcHJvdG8z", [file_google_protobuf_wrappers, file_google_protobuf_struct]); /** * Note: We do not exhaust all field types @@ -89,6 +89,11 @@ export type Proto3Message = Message<"spec.Proto3Message"> & { */ singularWrappedUint32Field?: number; + /** + * @generated from field: google.protobuf.Struct singular_struct_field = 214; + */ + singularStructField?: JsonObject; + /** * @generated from field: optional string optional_string_field = 9; */ @@ -144,6 +149,11 @@ export type Proto3Message = Message<"spec.Proto3Message"> & { */ optionalWrappedUint32Field?: number; + /** + * @generated from field: optional google.protobuf.Struct optional_struct_field = 215; + */ + optionalStructField?: JsonObject; + /** * @generated from field: repeated string repeated_string_field = 17; */ @@ -199,6 +209,11 @@ export type Proto3Message = Message<"spec.Proto3Message"> & { */ repeatedWrappedUint32Field: UInt32Value[]; + /** + * @generated from field: repeated google.protobuf.Struct repeated_struct_field = 216; + */ + repeatedStructField: JsonObject[]; + /** * @generated from field: repeated double packed_double_field = 25 [packed = true]; */ @@ -298,6 +313,12 @@ export type Proto3Message = Message<"spec.Proto3Message"> & { */ value: UInt32Value; case: "oneofWrappedUint32Field"; + } | { + /** + * @generated from field: google.protobuf.Struct oneof_struct_field = 217; + */ + value: JsonObject; + case: "oneofStructField"; } | { case: undefined; value?: undefined }; /** @@ -334,6 +355,11 @@ export type Proto3Message = Message<"spec.Proto3Message"> & { * @generated from field: map map_int32_wrapped_uint32_field = 205; */ mapInt32WrappedUint32Field: { [key: number]: UInt32Value }; + + /** + * @generated from field: map map_int32_struct_field = 218; + */ + mapInt32StructField: { [key: number]: JsonObject }; }; /** diff --git a/packages/protobuf-test/src/gen/ts/google/protobuf/test_messages_proto3_pb.ts b/packages/protobuf-test/src/gen/ts/google/protobuf/test_messages_proto3_pb.ts index 9781ef2d4..7e60553c2 100644 --- a/packages/protobuf-test/src/gen/ts/google/protobuf/test_messages_proto3_pb.ts +++ b/packages/protobuf-test/src/gen/ts/google/protobuf/test_messages_proto3_pb.ts @@ -18,9 +18,9 @@ import type { GenDescEnum, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { Any, BoolValue, BytesValue, DoubleValue, Duration, FieldMask, FloatValue, Int32Value, Int64Value, ListValue, NullValue, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_any, file_google_protobuf_duration, file_google_protobuf_field_mask, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file google/protobuf/test_messages_proto3.proto. @@ -680,7 +680,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3.TestAllT /** * @generated from field: google.protobuf.Struct optional_struct = 304; */ - optionalStruct?: Struct; + optionalStruct?: JsonObject; /** * @generated from field: google.protobuf.Any optional_any = 305; @@ -715,7 +715,7 @@ export type TestAllTypesProto3 = Message<"protobuf_test_messages.proto3.TestAllT /** * @generated from field: repeated google.protobuf.Struct repeated_struct = 324; */ - repeatedStruct: Struct[]; + repeatedStruct: JsonObject[]; /** * @generated from field: repeated google.protobuf.Any repeated_any = 315; diff --git a/packages/protobuf-test/src/gen/ts/google/protobuf/unittest_well_known_types_pb.ts b/packages/protobuf-test/src/gen/ts/google/protobuf/unittest_well_known_types_pb.ts index 07440839f..4d518a1de 100644 --- a/packages/protobuf-test/src/gen/ts/google/protobuf/unittest_well_known_types_pb.ts +++ b/packages/protobuf-test/src/gen/ts/google/protobuf/unittest_well_known_types_pb.ts @@ -18,11 +18,11 @@ import type { GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; -import type { Any, Api, BoolValue, BytesValue, DoubleValue, Duration, Empty, FieldMask, FloatValue, Int32Value, Int64Value, SourceContext, StringValue, Struct, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; +import type { Any, Api, BoolValue, BytesValue, DoubleValue, Duration, Empty, FieldMask, FloatValue, Int32Value, Int64Value, SourceContext, StringValue, Timestamp, UInt32Value, UInt64Value, Value } from "@bufbuild/protobuf/wkt"; import { file_google_protobuf_any, file_google_protobuf_api, file_google_protobuf_duration, file_google_protobuf_empty, file_google_protobuf_field_mask, file_google_protobuf_source_context, file_google_protobuf_struct, file_google_protobuf_timestamp, file_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; import type { Type } from "./type_pb.js"; import { file_google_protobuf_type } from "./type_pb.js"; -import type { Message } from "@bufbuild/protobuf"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; /** * Describes the file google/protobuf/unittest_well_known_types.proto. @@ -71,7 +71,7 @@ export type TestWellKnownTypes = Message<"protobuf_unittest.TestWellKnownTypes"> /** * @generated from field: google.protobuf.Struct struct_field = 7; */ - structField?: Struct; + structField?: JsonObject; /** * @generated from field: google.protobuf.Timestamp timestamp_field = 8; @@ -182,7 +182,7 @@ export type RepeatedWellKnownTypes = Message<"protobuf_unittest.RepeatedWellKnow /** * @generated from field: repeated google.protobuf.Struct struct_field = 7; */ - structField: Struct[]; + structField: JsonObject[]; /** * @generated from field: repeated google.protobuf.Timestamp timestamp_field = 8; @@ -296,7 +296,7 @@ export type OneofWellKnownTypes = Message<"protobuf_unittest.OneofWellKnownTypes /** * @generated from field: google.protobuf.Struct struct_field = 7; */ - value: Struct; + value: JsonObject; case: "structField"; } | { /** @@ -415,7 +415,7 @@ export type MapWellKnownTypes = Message<"protobuf_unittest.MapWellKnownTypes"> & /** * @generated from field: map struct_field = 7; */ - structField: { [key: number]: Struct }; + structField: { [key: number]: JsonObject }; /** * @generated from field: map timestamp_field = 8; diff --git a/packages/protobuf-test/src/reflect/reflect-list.test.ts b/packages/protobuf-test/src/reflect/reflect-list.test.ts index 48729635e..0f9090cfd 100644 --- a/packages/protobuf-test/src/reflect/reflect-list.test.ts +++ b/packages/protobuf-test/src/reflect/reflect-list.test.ts @@ -19,11 +19,12 @@ import { reflect, isReflectMessage, } from "@bufbuild/protobuf/reflect"; -import * as proto3_ts from "../gen/ts/extra/proto3_pb.js"; import { create, protoInt64 } from "@bufbuild/protobuf"; -import { UserSchema } from "../gen/ts/extra/example_pb.js"; import assert from "node:assert"; import { catchFieldError } from "../helpers.js"; +import { StructSchema } from "@bufbuild/protobuf/wkt"; +import { UserSchema } from "../gen/ts/extra/example_pb.js"; +import * as proto3_ts from "../gen/ts/extra/proto3_pb.js"; describe("reflectList()", () => { test("creates ReflectList", () => { @@ -47,11 +48,13 @@ describe("ReflectList", () => { repeatedInt64Field, repeatedInt64JsStringField, repeatedMessageField, + repeatedStructField, } = proto3_ts.Proto3MessageSchema.field; assert(repeatedStringField.fieldKind == "list"); assert(repeatedInt64Field.fieldKind == "list"); assert(repeatedInt64JsStringField.fieldKind == "list"); assert(repeatedMessageField.fieldKind == "list"); + assert(repeatedStructField.fieldKind == "list"); const n0 = protoInt64.zero; const n1 = protoInt64.parse(1); const n2 = protoInt64.parse(2); @@ -91,6 +94,11 @@ describe("ReflectList", () => { const val = list.get(0); expect(isReflectMessage(val)).toBe(true); }); + test("returns ReflectMessage for google.protobuf.Struct list", () => { + const list = reflectList(repeatedStructField, [{ shouldBeJson: true }]); + const val = list.get(0); + expect(isReflectMessage(val)).toBe(true); + }); }); describe("add()", () => { test("adds item", () => { @@ -116,6 +124,12 @@ describe("ReflectList", () => { list.add(n3); expect(local).toStrictEqual(["1", "2", "3"]); }); + test("adds google.protobuf.Struct as JsonObject", () => { + const local: unknown[] = []; + const list = reflectList(repeatedStructField, local); + list.add(reflect(StructSchema)); + expect(local).toStrictEqual([{}]); + }); test("throws error for wrong message type", () => { const list = reflectList(repeatedMessageField, []); const err = catchFieldError(() => list.add(reflect(UserSchema))); diff --git a/packages/protobuf-test/src/reflect/reflect-map.test.ts b/packages/protobuf-test/src/reflect/reflect-map.test.ts index 2f174d8a5..c564f922f 100644 --- a/packages/protobuf-test/src/reflect/reflect-map.test.ts +++ b/packages/protobuf-test/src/reflect/reflect-map.test.ts @@ -13,18 +13,18 @@ // limitations under the License. import { describe, expect, test } from "@jest/globals"; -import * as proto3_ts from "../gen/ts/extra/proto3_pb.js"; import { isReflectMap, reflectMap, reflect, isReflectMessage, } from "@bufbuild/protobuf/reflect"; -import { protoInt64 } from "@bufbuild/protobuf"; -import { UserSchema } from "../gen/ts/extra/example_pb.js"; -import { create } from "@bufbuild/protobuf"; +import { create, protoInt64 } from "@bufbuild/protobuf"; import assert from "node:assert"; import { catchFieldError } from "../helpers.js"; +import { StructSchema } from "@bufbuild/protobuf/wkt"; +import { UserSchema } from "../gen/ts/extra/example_pb.js"; +import * as proto3_ts from "../gen/ts/extra/proto3_pb.js"; describe("reflectMap()", () => { test("creates ReflectMap", () => { @@ -49,11 +49,13 @@ describe("ReflectMap", () => { mapInt64Int64Field, mapInt32Int32Field, mapInt32MessageField, + mapInt32StructField, } = proto3_ts.Proto3MessageSchema.field; assert(mapStringStringField.fieldKind == "map"); assert(mapInt64Int64Field.fieldKind == "map"); assert(mapInt32Int32Field.fieldKind == "map"); assert(mapInt32MessageField.fieldKind == "map"); + assert(mapInt32StructField.fieldKind == "map"); const n1 = protoInt64.parse(1); const n2 = protoInt64.parse(2); const n3 = protoInt64.parse(3); @@ -103,6 +105,13 @@ describe("ReflectMap", () => { const val = map.get("a"); expect(isReflectMessage(val)).toBe(true); }); + test("returns ReflectMessage for google.protobuf.Struct map", () => { + const map = reflectMap(mapInt32StructField, { + 123: { shouldBeJson: true }, + }); + const val = map.get(123); + expect(isReflectMessage(val)).toBe(true); + }); }); describe("keys()", () => { test("returns iterable keys", () => { @@ -194,6 +203,14 @@ describe("ReflectMap", () => { "3": n33, }); }); + test("sets google.protobuf.Struct as JsonObject", () => { + const local = {}; + const map = reflectMap(mapInt32StructField, local); + map.set(123, reflect(StructSchema)); + expect(local).toStrictEqual({ + 123: {}, + }); + }); test("throws error for invalid key", () => { const map = reflectMap(mapInt32Int32Field, {}); const err = catchFieldError(() => map.set(true, "A")); diff --git a/packages/protobuf-test/src/reflect/reflect.test.ts b/packages/protobuf-test/src/reflect/reflect.test.ts index f7747741f..22b3a07bd 100644 --- a/packages/protobuf-test/src/reflect/reflect.test.ts +++ b/packages/protobuf-test/src/reflect/reflect.test.ts @@ -13,24 +13,22 @@ // limitations under the License. import { beforeEach, describe, expect, test } from "@jest/globals"; -import type { DescMessage } from "@bufbuild/protobuf"; -import { protoInt64 } from "@bufbuild/protobuf"; -import type { Message } from "@bufbuild/protobuf"; -import { UInt32ValueSchema } from "@bufbuild/protobuf/wkt"; -import { create } from "@bufbuild/protobuf"; +import type { DescMessage, Message } from "@bufbuild/protobuf"; +import { create, protoInt64 } from "@bufbuild/protobuf"; import type { ReflectMessage } from "@bufbuild/protobuf/reflect"; import { + isReflectList, + isReflectMap, + isReflectMessage, reflect, reflectList, reflectMap, - isReflectMessage, - isReflectList, - isReflectMap, } from "@bufbuild/protobuf/reflect"; import { catchFieldError, compileMessage } from "../helpers.js"; +import assert from "node:assert"; +import { StructSchema, UInt32ValueSchema } from "@bufbuild/protobuf/wkt"; import * as proto3_ts from "../gen/ts/extra/proto3_pb.js"; import * as example_ts from "../gen/ts/extra/example_pb.js"; -import assert from "node:assert"; describe("reflect()", () => { test("accepts generated message shape", () => { @@ -173,6 +171,40 @@ describe("ReflectMessage", () => { expect(value).toBe(123); } }); + test("gets google.protobuf.Struct field", () => { + msg.singularStructField = { + shouldBeJson: true, + }; + msg.repeatedStructField = [{ shouldBeJson: 1 }, { shouldBeJson: 2 }]; + msg.either = { + case: "oneofStructField", + value: { + shouldBeJson: true, + }, + }; + msg.mapInt32StructField = { + 123: { shouldBeJson: true }, + }; + for (const f of desc.fields) { + if (f.message?.typeName != StructSchema.typeName) { + continue; + } + // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check + switch (f.fieldKind) { + case "message": + expect(isReflectMessage(r.get(f), StructSchema)).toBe(true); + break; + case "list": + expect(isReflectMessage(r.get(f).get(0), StructSchema)).toBe(true); + break; + case "map": + expect(isReflectMessage(r.get(f).get(123), StructSchema)).toBe( + true, + ); + break; + } + } + }); test("gets selected oneof field", () => { const f = desc.field.oneofBoolField; msg.either = { @@ -299,6 +331,28 @@ describe("ReflectMessage", () => { r.set(f, reflect(UInt32ValueSchema, wrapper)); expect(msg.singularWrappedUint32Field).toBe(123); }); + test("sets google.protobuf.Struct field as JsonObject", () => { + const structMessage = create(StructSchema, { + fields: { + shouldBeJson: { + kind: { + case: "boolValue", + value: true, + }, + }, + }, + }); + const structReflect = reflect(StructSchema, structMessage); + r.set(desc.field.singularStructField, structReflect); + expect(msg.singularStructField).toStrictEqual({ + shouldBeJson: true, + }); + r.set(desc.field.oneofStructField, structReflect); + expect(msg.either).toStrictEqual({ + case: "oneofStructField", + value: { shouldBeJson: true }, + }); + }); test("sets unknown value for open enum", () => { const f = desc.field.singularEnumField; r.set(f, 99); diff --git a/packages/protobuf/src/codegenv1/symbols.ts b/packages/protobuf/src/codegenv1/symbols.ts index 01d9080b3..fe7e28918 100644 --- a/packages/protobuf/src/codegenv1/symbols.ts +++ b/packages/protobuf/src/codegenv1/symbols.ts @@ -50,6 +50,8 @@ export const symbols = { toJson: {typeOnly: false, bootstrapWktFrom: "../../to-json.js", from: packageName }, toJsonString: {typeOnly: false, bootstrapWktFrom: "../../to-json.js", from: packageName }, protoInt64: {typeOnly: false, bootstrapWktFrom: "../../proto-int64.js", from: packageName }, + JsonValue: {typeOnly: true, bootstrapWktFrom: "../../json-value.js", from: packageName }, + JsonObject: {typeOnly: true, bootstrapWktFrom: "../../json-value.js", from: packageName }, codegen: { boot: {typeOnly: false, bootstrapWktFrom: "../../codegenv1/boot.js", from: packageName + "/codegenv1" }, fileDesc: {typeOnly: false, bootstrapWktFrom: "../../codegenv1/file.js", from: packageName + "/codegenv1" }, diff --git a/packages/protobuf/src/create.ts b/packages/protobuf/src/create.ts index 6d3a92e74..fd7517aa8 100644 --- a/packages/protobuf/src/create.ts +++ b/packages/protobuf/src/create.ts @@ -83,11 +83,7 @@ function initMessage( // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- no need to convert enum switch (field.fieldKind) { case "message": - if (!field.oneof && isWrapperDesc(field.message)) { - value = initScalar(field.message.fields[0], value); - } else { - value = toMessage(value, field.message); - } + value = toMessage(field, value); break; case "scalar": value = initScalar(field, value); @@ -123,7 +119,7 @@ function initMap( return convertObjectValues(value, toU8Arr); } if (field.mapKind == "message") { - return convertObjectValues(value, (val) => toMessage(val, field.message)); + return convertObjectValues(value, (val) => toMessage(field, val)); } } return value; @@ -138,15 +134,37 @@ function initList( return value.map(toU8Arr); } if (field.listKind == "message") { - return value.map((item: unknown) => toMessage(item, field.message)); + return value.map((item: unknown) => toMessage(field, item)); } } return value; } -function toMessage(value: unknown, message: DescMessage): unknown { - if (!isMessage(value, message) && isObject(value)) { - return create(message, value); +function toMessage( + field: DescField & { message: DescMessage }, + value: unknown, +): unknown { + if ( + field.fieldKind == "message" && + !field.oneof && + isWrapperDesc(field.message) + ) { + // Types from google/protobuf/wrappers.proto are unwrapped when used in + // a singular field that is not part of a oneof group. + return initScalar(field.message.fields[0], value); + } + if (isObject(value)) { + if ( + field.message.typeName == "google.protobuf.Struct" && + field.parent.typeName !== "google.protobuf.Value" + ) { + // google.protobuf.Struct is represented with JsonObject when used in a + // field, except when used in google.protobuf.Value. + return value; + } + if (!isMessage(value, field.message)) { + return create(field.message, value); + } } return value; } diff --git a/packages/protobuf/src/reflect/reflect.ts b/packages/protobuf/src/reflect/reflect.ts index ff75bb5ab..8be535efe 100644 --- a/packages/protobuf/src/reflect/reflect.ts +++ b/packages/protobuf/src/reflect/reflect.ts @@ -39,7 +39,19 @@ import { create } from "../create.js"; import { isWrapper, isWrapperDesc } from "../wkt/wrappers.js"; import { scalarZeroValue } from "./scalar.js"; import { protoInt64 } from "../proto-int64.js"; -import { isReflectList, isReflectMap, isReflectMessage } from "./guard.js"; +import { + isObject, + isReflectList, + isReflectMap, + isReflectMessage, +} from "./guard.js"; +import type { + ListValue, + NullValue, + Struct, + Value, +} from "../wkt/gen/google/protobuf/struct_pb.js"; +import type { JsonObject, JsonValue } from "../json-value.js"; /** * Create a ReflectMessage. @@ -115,7 +127,7 @@ class ReflectMessageImpl implements ReflectMessage { get(field: Field): ReflectMessageGet { assertOwn(this.message, field); - let value = unsafeGet(this.message, field); + const value = unsafeGet(this.message, field); switch (field.fieldKind) { case "list": // eslint-disable-next-line no-case-declarations @@ -142,19 +154,9 @@ class ReflectMessageImpl implements ReflectMessage { } return map as ReflectMessageGet; case "message": - if ( - value !== undefined && - !field.oneof && - isWrapperDesc(field.message) - ) { - value = { - $typeName: field.message.typeName, - value: longToReflect(field.message.fields[0], value), - } satisfies Message & { value: unknown }; - } - return new ReflectMessageImpl( - field.message, - value as Message | undefined, + return messageToReflect( + field, + value, this.check, ) as ReflectMessageGet; case "scalar": @@ -178,11 +180,10 @@ class ReflectMessageImpl implements ReflectMessage { } } let local: unknown; - if (isReflectMap(value) || isReflectList(value)) { + if (field.fieldKind == "message") { + local = messageToLocal(field, value); + } else if (isReflectMap(value) || isReflectList(value)) { local = value[unsafeLocal]; - } else if (isReflectMessage(value)) { - const msg = value.message; - local = !field.oneof && isWrapper(msg) ? msg.value : msg; } else { local = longToLocal(field, value); } @@ -403,12 +404,73 @@ class ReflectMapImpl implements ReflectMap { } } +function messageToLocal( + field: DescField & { message: DescMessage }, + value: unknown, +) { + if (!isReflectMessage(value)) { + return value; + } + if ( + isWrapper(value.message) && + !field.oneof && + field.fieldKind == "message" + ) { + // Types from google/protobuf/wrappers.proto are unwrapped when used in + // a singular field that is not part of a oneof group. + return value.message.value; + } + if ( + value.desc.typeName == "google.protobuf.Struct" && + field.parent.typeName != "google.protobuf.Value" + ) { + // google.protobuf.Struct is represented with JsonObject when used in a + // field, except when used in google.protobuf.Value. + return wktStructToLocal(value.message as Struct); + } + return value.message; +} + +function messageToReflect( + field: DescField & { message: DescMessage }, + value: unknown, + check: boolean, +) { + if (value !== undefined) { + if ( + isWrapperDesc(field.message) && + !field.oneof && + field.fieldKind == "message" + ) { + // Types from google/protobuf/wrappers.proto are unwrapped when used in + // a singular field that is not part of a oneof group. + value = { + $typeName: field.message.typeName, + value: longToReflect(field.message.fields[0], value), + } satisfies Message & { value: unknown }; + } else if ( + field.message.typeName == "google.protobuf.Struct" && + field.parent.typeName != "google.protobuf.Value" && + isObject(value) + ) { + // google.protobuf.Struct is represented with JsonObject when used in a + // field, except when used in google.protobuf.Value. + value = wktStructToReflect(value as JsonObject); + } + } + return new ReflectMessageImpl( + field.message, + value as Message | undefined, + check, + ); +} + function listItemToLocal( field: DescField & { fieldKind: "list" }, value: unknown, ): unknown { - if (isReflectMessage(value)) { - return value.message; + if (field.listKind == "message") { + return messageToLocal(field, value); } return longToLocal(field, value); } @@ -419,7 +481,7 @@ function listItemToReflect( check: boolean, ): unknown { if (field.listKind == "message") { - return new ReflectMessageImpl(field.message, value as Message, check); + return messageToReflect(field, value, check); } return longToReflect(field, value); } @@ -428,8 +490,8 @@ function mapValueToLocal( field: DescField & { fieldKind: "map" }, value: unknown, ) { - if (isReflectMessage(value)) { - return value.message; + if (field.mapKind == "message") { + return messageToLocal(field, value); } return longToLocal(field, value); } @@ -440,7 +502,7 @@ function mapValueToReflect( check: boolean, ): unknown { if (field.mapKind == "message") { - return new ReflectMessageImpl(field.message, value as Message, check); + return messageToReflect(field, value, check); } return value; } @@ -554,3 +616,83 @@ function longToLocal(field: DescField, value: unknown) { } return value; } + +function wktStructToReflect(json: JsonValue): Struct { + const struct: Struct = { + $typeName: "google.protobuf.Struct", + fields: {}, + }; + if (isObject(json)) { + for (const [k, v] of Object.entries(json)) { + struct.fields[k] = wktValueToReflect(v); + } + } + return struct; +} + +function wktStructToLocal(val: Struct) { + const json: JsonObject = {}; + for (const [k, v] of Object.entries(val.fields)) { + json[k] = wktValueToLocal(v); + } + return json; +} + +function wktValueToLocal(val: Value): JsonValue { + switch (val.kind.case) { + case "structValue": + return wktStructToLocal(val.kind.value); + case "listValue": + return val.kind.value.values.map(wktValueToLocal); + case "nullValue": + case undefined: + return null; + default: + return val.kind.value; + } +} + +function wktValueToReflect(json: JsonValue): Value { + const value: Value = { + $typeName: "google.protobuf.Value", + kind: { case: undefined }, + }; + // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- invalid input is unselected kind + switch (typeof json) { + case "number": + value.kind = { case: "numberValue", value: json }; + break; + case "string": + value.kind = { case: "stringValue", value: json }; + break; + case "boolean": + value.kind = { case: "boolValue", value: json }; + break; + case "object": + if (json === null) { + const nullValue: NullValue.NULL_VALUE = 0; + value.kind = { case: "nullValue", value: nullValue }; + } else if (Array.isArray(json)) { + const listValue: ListValue = { + $typeName: "google.protobuf.ListValue", + values: [], + }; + if (Array.isArray(json)) { + for (const e of json) { + listValue.values.push(wktValueToReflect(e)); + } + } + value.kind = { + case: "listValue", + value: listValue, + }; + } else { + value.kind = { + case: "structValue", + value: wktStructToReflect(json), + }; + } + break; + } + return value; +} diff --git a/packages/protoc-gen-es/src/protoc-gen-es-plugin.ts b/packages/protoc-gen-es/src/protoc-gen-es-plugin.ts index 8f79688ae..de75ef142 100644 --- a/packages/protoc-gen-es/src/protoc-gen-es-plugin.ts +++ b/packages/protoc-gen-es/src/protoc-gen-es-plugin.ts @@ -85,7 +85,7 @@ function generateTs(schema: Schema) { const { GenDescExtension, extDesc } = f.runtime.codegen; const name = f.importSchema(desc).name; const E = f.importShape(desc.extendee); - const V = fieldTypeScriptType(desc).typing; + const V = fieldTypeScriptType(desc, f.runtime).typing; const call = functionCall(extDesc, [fileDesc, ...pathInFileDesc(desc)]); f.print(f.jsDoc(desc)); f.print(f.export("const", name), ": ", GenDescExtension, "<", E, ", ", V, ">", " = ", pure); @@ -213,7 +213,7 @@ function generateDts(schema: Schema) { const { GenDescExtension } = f.runtime.codegen; const name = f.importSchema(desc).name; const E = f.importShape(desc.extendee); - const V = fieldTypeScriptType(desc).typing; + const V = fieldTypeScriptType(desc, f.runtime).typing; f.print(f.jsDoc(desc)); f.print(f.export("declare const", name), ": ", GenDescExtension, "<", E, ", ", V, ">;"); f.print(); @@ -339,7 +339,7 @@ function generateMessageShape(f: GeneratedFile, message: DescMessage, target: Ex f.print(` } | {`); } f.print(f.jsDoc(field, " ")); - const { typing } = fieldTypeScriptType(field); + const { typing } = fieldTypeScriptType(field, f.runtime); f.print(` value: `, typing, `;`); f.print(` case: "`, field.localName, `";`); } @@ -347,7 +347,7 @@ function generateMessageShape(f: GeneratedFile, message: DescMessage, target: Ex break; default: { f.print(f.jsDoc(member, " ")); - const { typing, optional } = fieldTypeScriptType(member); + const { typing, optional } = fieldTypeScriptType(member, f.runtime); if (optional) { f.print(" ", member.localName, "?: ", typing, ";"); } else { diff --git a/packages/protoc-gen-es/src/util.ts b/packages/protoc-gen-es/src/util.ts index 8f71690a2..7f4e04ab4 100644 --- a/packages/protoc-gen-es/src/util.ts +++ b/packages/protoc-gen-es/src/util.ts @@ -15,13 +15,21 @@ import { type DescExtension, type DescField, + DescMessage, ScalarType, } from "@bufbuild/protobuf"; import { scalarTypeScriptType } from "@bufbuild/protobuf/codegenv1"; -import { isWrapperDesc } from "@bufbuild/protobuf/wkt"; -import type { Printable } from "@bufbuild/protoplugin"; +import { + isWrapperDesc, + StructSchema, + ValueSchema, +} from "@bufbuild/protobuf/wkt"; +import type { GeneratedFile, Printable } from "@bufbuild/protoplugin"; -export function fieldTypeScriptType(field: DescField | DescExtension): { +export function fieldTypeScriptType( + field: DescField | DescExtension, + imports: GeneratedFile["runtime"], +): { typing: Printable; optional: boolean; } { @@ -33,15 +41,7 @@ export function fieldTypeScriptType(field: DescField | DescExtension): { optional = field.proto.proto3Optional; break; case "message": { - if (!field.oneof && isWrapperDesc(field.message)) { - const baseType = field.message.fields[0].scalar; - typing.push(scalarTypeScriptType(baseType, false)); - } else { - typing.push({ - kind: "es_shape_ref", - desc: field.message, - }); - } + typing.push(messageFieldTypeScriptType(field, imports)); optional = true; break; } @@ -71,13 +71,7 @@ export function fieldTypeScriptType(field: DescField | DescExtension): { ); break; case "message": { - typing.push( - { - kind: "es_shape_ref", - desc: field.message, - }, - "[]", - ); + typing.push(messageFieldTypeScriptType(field, imports), "[]"); break; } } @@ -102,10 +96,7 @@ export function fieldTypeScriptType(field: DescField | DescExtension): { valueType = scalarTypeScriptType(field.scalar, false); break; case "message": - valueType = { - kind: "es_shape_ref", - desc: field.message, - }; + valueType = messageFieldTypeScriptType(field, imports); break; case "enum": valueType = { @@ -122,6 +113,30 @@ export function fieldTypeScriptType(field: DescField | DescExtension): { return { typing, optional }; } +function messageFieldTypeScriptType( + field: (DescField | DescExtension) & { message: DescMessage }, + imports: GeneratedFile["runtime"], +): Printable { + if ( + isWrapperDesc(field.message) && + !field.oneof && + field.fieldKind == "message" + ) { + const baseType = field.message.fields[0].scalar; + return scalarTypeScriptType(baseType, false); + } + if ( + field.message.typeName == StructSchema.typeName && + field.parent?.typeName != ValueSchema.typeName + ) { + return imports.JsonObject; + } + return { + kind: "es_shape_ref", + desc: field.message, + }; +} + export function functionCall( fn: Printable, args: Printable[], From 8d80ca3c6e45892d42beccbfd1b389b7b9ca2bf6 Mon Sep 17 00:00:00 2001 From: Timo Stamm Date: Fri, 14 Jun 2024 13:27:28 +0200 Subject: [PATCH 2/2] make bundle-size --- packages/bundle-size/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/bundle-size/README.md b/packages/bundle-size/README.md index 3447319e5..1ec18105a 100644 --- a/packages/bundle-size/README.md +++ b/packages/bundle-size/README.md @@ -16,11 +16,11 @@ usually do. We repeat this for an increasing number of files. | code generator | files | bundle size | minified | compressed | |-----------------|----------|------------------------:|-----------------------:|-------------------:| -| protobuf-es | 1 | 125,782 b | 65,554 b | 15,210 b | -| protobuf-es | 4 | 127,971 b | 67,062 b | 15,882 b | -| protobuf-es | 8 | 130,733 b | 68,833 b | 16,446 b | -| protobuf-es | 16 | 141,183 b | 76,814 b | 18,708 b | -| protobuf-es | 32 | 168,974 b | 98,830 b | 24,189 b | +| protobuf-es | 1 | 125,758 b | 65,554 b | 15,210 b | +| protobuf-es | 4 | 127,947 b | 67,062 b | 15,882 b | +| protobuf-es | 8 | 130,709 b | 68,833 b | 16,446 b | +| protobuf-es | 16 | 141,159 b | 76,814 b | 18,708 b | +| protobuf-es | 32 | 168,950 b | 98,830 b | 24,189 b | | protobuf-javascript | 1 | 339,613 b | 255,820 b | 42,481 b | | protobuf-javascript | 4 | 366,281 b | 271,092 b | 43,912 b | | protobuf-javascript | 8 | 388,324 b | 283,409 b | 45,038 b |