diff --git a/packages/protobuf-test/extra/extensions-proto2.proto b/packages/protobuf-test/extra/extensions-proto2.proto index 37fdd1281..259321c99 100644 --- a/packages/protobuf-test/extra/extensions-proto2.proto +++ b/packages/protobuf-test/extra/extensions-proto2.proto @@ -62,6 +62,7 @@ extend Proto2Extendee { repeated string repeated_string_ext = 7002; 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]; optional google.protobuf.UInt32Value wrapper_ext = 8001; diff --git a/packages/protobuf-test/extra/extensions-proto3.proto b/packages/protobuf-test/extra/extensions-proto3.proto index ec0e4c57b..e0518ff8f 100644 --- a/packages/protobuf-test/extra/extensions-proto3.proto +++ b/packages/protobuf-test/extra/extensions-proto3.proto @@ -23,4 +23,10 @@ extend google.protobuf.FileOptions { optional uint32 optional_uint32_ext = 1002; repeated uint32 packed_uint32_ext = 7003; repeated uint32 unpacked_uint32_ext = 7004 [packed = false]; + Proto3ExtMessage message_ext = 7005; +} + +// A message used in extensions +message Proto3ExtMessage { + string string_field = 1; } diff --git a/packages/protobuf-test/src/extension-accessor.test.ts b/packages/protobuf-test/src/extension-accessor.test.ts index 4f5e9ba78..082381f23 100644 --- a/packages/protobuf-test/src/extension-accessor.test.ts +++ b/packages/protobuf-test/src/extension-accessor.test.ts @@ -44,6 +44,7 @@ import { repeated_enum_ext, repeated_message_ext, repeated_string_ext, + repeated_uint64_ext_js_string, repeatedgroupext, string_ext, string_ext_with_default, @@ -99,6 +100,7 @@ const goldenValues: extensionWithValueCollection = [ { ext: repeated_string_ext, val: ["a", "b", "c"] }, { 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: wrapper_ext, val: 123 }, { ext: groupext, val: create(GroupExtDesc, { a: 123 }) }, { @@ -130,6 +132,7 @@ const goldenValuesZero: extensionWithValueCollection = [ { ext: repeated_string_ext, val: [] }, { ext: packed_uint32_ext, val: [] }, { ext: unpacked_uint32_ext, val: [] }, + { ext: repeated_uint64_ext_js_string, val: [] }, { ext: wrapper_ext, val: 0 }, { ext: groupext, val: create(GroupExtDesc) }, { ext: repeatedgroupext, val: [] }, 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 18f350962..917feb7b8 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 @@ -248,6 +248,11 @@ export declare const packed_uint32_ext: GenDescExtension; +/** + * @generated from extension: repeated uint64 repeated_uint64_ext_js_string = 7006 [jstype = JS_STRING]; + */ +export declare const repeated_uint64_ext_js_string: GenDescExtension; + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ 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 a34936b24..cf0476e39 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 @@ -24,7 +24,7 @@ import { fileDesc_google_protobuf_wrappers } from "@bufbuild/protobuf/wkt"; * Describes the file extra/extensions-proto2.proto. */ export const fileDesc_extra_extensions_proto2 = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpZCgt3cmFwcGVyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjBPiABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVSCndyYXBwZXJFeHQ6SwoIZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpD8gASgKMhMucHJvdG8yZXh0Lkdyb3VwRXh0Ughncm91cGV4dDpjChByZXBlYXRlZGdyb3VwZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKU/IAMoCjIbLnByb3RvMmV4dC5SZXBlYXRlZEdyb3VwRXh0UhByZXBlYXRlZGdyb3VwZXh0", [fileDesc_extra_example, fileDesc_google_protobuf_wrappers]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOlkKC3dyYXBwZXJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGME+IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZVIKd3JhcHBlckV4dDpLCghncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRikPyABKAoyEy5wcm90bzJleHQuR3JvdXBFeHRSCGdyb3VwZXh0OmMKEHJlcGVhdGVkZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpT8gAygKMhsucHJvdG8yZXh0LlJlcGVhdGVkR3JvdXBFeHRSEHJlcGVhdGVkZ3JvdXBleHQ", [fileDesc_extra_example, fileDesc_google_protobuf_wrappers]); /** * Describes the message proto2ext.Proto2Extendee. @@ -198,21 +198,27 @@ export const packed_uint32_ext = /*@__PURE__*/ export const unpacked_uint32_ext = /*@__PURE__*/ extDesc(fileDesc_extra_extensions_proto2, 16); +/** + * @generated from extension: repeated uint64 repeated_uint64_ext_js_string = 7006 [jstype = JS_STRING]; + */ +export const repeated_uint64_ext_js_string = /*@__PURE__*/ + extDesc(fileDesc_extra_extensions_proto2, 17); + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ export const wrapper_ext = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 17); + extDesc(fileDesc_extra_extensions_proto2, 18); /** * @generated from extension: optional proto2ext.GroupExt groupext = 8100; */ export const groupext = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 18); + extDesc(fileDesc_extra_extensions_proto2, 19); /** * @generated from extension: repeated proto2ext.RepeatedGroupExt repeatedgroupext = 8101; */ export const repeatedgroupext = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 19); + extDesc(fileDesc_extra_extensions_proto2, 20); diff --git a/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.d.ts b/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.d.ts index 704fb39b2..92e337f90 100644 --- a/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.d.ts +++ b/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.d.ts @@ -16,7 +16,8 @@ // @generated from file extra/extensions-proto3.proto (package proto3ext, syntax proto3) /* eslint-disable */ -import type { GenDescExtension, GenDescFile } from "@bufbuild/protobuf/codegenv1"; +import type { GenDescExtension, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; import type { FileOptions } from "@bufbuild/protobuf/wkt"; /** @@ -24,6 +25,24 @@ import type { FileOptions } from "@bufbuild/protobuf/wkt"; */ export declare const fileDesc_extra_extensions_proto3: GenDescFile; +/** + * A message used in extensions + * + * @generated from message proto3ext.Proto3ExtMessage + */ +export declare type Proto3ExtMessage = Message<"proto3ext.Proto3ExtMessage"> & { + /** + * @generated from field: string string_field = 1; + */ + stringField: string; +}; + +/** + * Describes the message proto3ext.Proto3ExtMessage. + * Use `create(Proto3ExtMessageDesc)` to create a new message. + */ +export declare const Proto3ExtMessageDesc: GenDescMessage; + /** * @generated from extension: uint32 uint32_ext = 1001; */ @@ -44,3 +63,8 @@ export declare const packed_uint32_ext: GenDescExtension; */ export declare const unpacked_uint32_ext: GenDescExtension; +/** + * @generated from extension: proto3ext.Proto3ExtMessage message_ext = 7005; + */ +export declare const message_ext: GenDescExtension; + diff --git a/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.js b/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.js index 125a005ee..65111e72c 100644 --- a/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.js +++ b/packages/protobuf-test/src/gen/js/extra/extensions-proto3_pb.js @@ -16,14 +16,21 @@ // @generated from file extra/extensions-proto3.proto (package proto3ext, syntax proto3) /* eslint-disable */ -import { extDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; +import { extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; import { fileDesc_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt"; /** * Describes the file extra/extensions-proto3.proto. */ export const fileDesc_extra_extensions_proto3 = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMy5wcm90bxIJcHJvdG8zZXh0OjwKCnVpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6QcgASgNUgl1aW50MzJFeHQ6UAoTb3B0aW9uYWxfdWludDMyX2V4dBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxjqByABKA1SEW9wdGlvbmFsVWludDMyRXh0iAEBOkkKEXBhY2tlZF91aW50MzJfZXh0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGNs2IAMoDVIPcGFja2VkVWludDMyRXh0OlEKE3VucGFja2VkX3VpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3DYgAygNQgIQAFIRdW5wYWNrZWRVaW50MzJFeHRiBnByb3RvMw", [fileDesc_google_protobuf_descriptor]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMy5wcm90bxIJcHJvdG8zZXh0IigKEFByb3RvM0V4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJOjwKCnVpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6QcgASgNUgl1aW50MzJFeHQ6UAoTb3B0aW9uYWxfdWludDMyX2V4dBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxjqByABKA1SEW9wdGlvbmFsVWludDMyRXh0iAEBOkkKEXBhY2tlZF91aW50MzJfZXh0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGNs2IAMoDVIPcGFja2VkVWludDMyRXh0OlEKE3VucGFja2VkX3VpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3DYgAygNQgIQAFIRdW5wYWNrZWRVaW50MzJFeHQ6WwoLbWVzc2FnZV9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3TYgASgLMhsucHJvdG8zZXh0LlByb3RvM0V4dE1lc3NhZ2VSCm1lc3NhZ2VFeHRiBnByb3RvMw", [fileDesc_google_protobuf_descriptor]); + +/** + * Describes the message proto3ext.Proto3ExtMessage. + * Use `create(Proto3ExtMessageDesc)` to create a new message. + */ +export const Proto3ExtMessageDesc = /*@__PURE__*/ + messageDesc(fileDesc_extra_extensions_proto3, 0); /** * @generated from extension: uint32 uint32_ext = 1001; @@ -49,3 +56,9 @@ export const packed_uint32_ext = /*@__PURE__*/ export const unpacked_uint32_ext = /*@__PURE__*/ extDesc(fileDesc_extra_extensions_proto3, 3); +/** + * @generated from extension: proto3ext.Proto3ExtMessage message_ext = 7005; + */ +export const message_ext = /*@__PURE__*/ + extDesc(fileDesc_extra_extensions_proto3, 4); + 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 75c9fe092..beb30f6cb 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 @@ -27,7 +27,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file extra/extensions-proto2.proto. */ export const fileDesc_extra_extensions_proto2: GenDescFile = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpZCgt3cmFwcGVyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjBPiABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVSCndyYXBwZXJFeHQ6SwoIZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpD8gASgKMhMucHJvdG8yZXh0Lkdyb3VwRXh0Ughncm91cGV4dDpjChByZXBlYXRlZGdyb3VwZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKU/IAMoCjIbLnByb3RvMmV4dC5SZXBlYXRlZEdyb3VwRXh0UhByZXBlYXRlZGdyb3VwZXh0", [fileDesc_extra_example, fileDesc_google_protobuf_wrappers]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMi5wcm90bxIJcHJvdG8yZXh0IisKDlByb3RvMkV4dGVuZGVlEhEKCW93bl9maWVsZBgBIAEoBSoGCOgHEJBOIigKEFByb3RvMkV4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJIiAKCEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSIoChBSZXBlYXRlZEdyb3VwRXh0EgkKAWEYASABKAUSCQoBYhgCIAEoBSKTAQoSUHJvdG8yRXh0Q29udGFpbmVyGkIKBUNoaWxkMjkKCnVpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYskYgASgNUgl1aW50MzJFeHQyOQoKdWludDMyX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRipRiABKA1SCXVpbnQzMkV4dCpACg1Qcm90bzJFeHRFbnVtEhcKE1BST1RPMl9FWFRfRU5VTV9ZRVMQARIWChJQUk9UTzJfRVhUX0VOVU1fTk8QAjo5Cgp1aW50MzJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOkHIAEoDVIJdWludDMyRXh0OlYKF3VpbnQzMl9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGOoHIAEoDToDOTk5UhR1aW50MzJFeHRXaXRoRGVmYXVsdDo5CgpzdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNEPIAEoCVIJc3RyaW5nRXh0Ol4KF3N0cmluZ19leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNIPIAEoCToLaGVsbG8gIiAqLyBSFHN0cmluZ0V4dFdpdGhEZWZhdWx0OjkKCnVpbnQ2NF9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuRcgASgEUgl1aW50NjRFeHQ6TwoUdWludDY0X2V4dF9qc19zdHJpbmcSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYuhcgASgEQgIwAVIRdWludDY0RXh0SnNTdHJpbmc6NwoJYnl0ZXNfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGKEfIAEoDFIIYnl0ZXNFeHQ6dgoWYnl0ZXNfZXh0X3dpdGhfZGVmYXVsdBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRiiHyABKAw6JVwwMDB4XFx4XCJ4XCdBQUFBQUFcMDEwXDAxNFxuXHJcdFwwMTNSE2J5dGVzRXh0V2l0aERlZmF1bHQ6TwoIZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYiScgASgOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SB2VudW1FeHQ6ewoVZW51bV9leHRfd2l0aF9kZWZhdWx0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGIonIAEoDjIYLnByb3RvMmV4dC5Qcm90bzJFeHRFbnVtOhJQUk9UTzJfRVhUX0VOVU1fTk9SEmVudW1FeHRXaXRoRGVmYXVsdDpYCgttZXNzYWdlX2V4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjxLiABKAsyGy5wcm90bzJleHQuUHJvdG8yRXh0TWVzc2FnZVIKbWVzc2FnZUV4dDpUChJtZXNzYWdlX2V4dF9wcm90bzMSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY8i4gASgLMgouZG9jcy5Vc2VyUhBtZXNzYWdlRXh0UHJvdG8zOmkKFHJlcGVhdGVkX21lc3NhZ2VfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNk2IAMoCzIbLnByb3RvMmV4dC5Qcm90bzJFeHRNZXNzYWdlUhJyZXBlYXRlZE1lc3NhZ2VFeHQ6YAoRcmVwZWF0ZWRfZW51bV9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3TYgAygOMhgucHJvdG8yZXh0LlByb3RvMkV4dEVudW1SD3JlcGVhdGVkRW51bUV4dDpKChNyZXBlYXRlZF9zdHJpbmdfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGNo2IAMoCVIRcmVwZWF0ZWRTdHJpbmdFeHQ6SgoRcGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY2zYgAygNQgIQAVIPcGFja2VkVWludDMyRXh0OkoKE3VucGFja2VkX3VpbnQzMl9leHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUY3DYgAygNUhF1bnBhY2tlZFVpbnQzMkV4dDpgCh1yZXBlYXRlZF91aW50NjRfZXh0X2pzX3N0cmluZxIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRjeNiADKARCAjABUhlyZXBlYXRlZFVpbnQ2NEV4dEpzU3RyaW5nOlkKC3dyYXBwZXJfZXh0EhkucHJvdG8yZXh0LlByb3RvMkV4dGVuZGVlGME+IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5VSW50MzJWYWx1ZVIKd3JhcHBlckV4dDpLCghncm91cGV4dBIZLnByb3RvMmV4dC5Qcm90bzJFeHRlbmRlZRikPyABKAoyEy5wcm90bzJleHQuR3JvdXBFeHRSCGdyb3VwZXh0OmMKEHJlcGVhdGVkZ3JvdXBleHQSGS5wcm90bzJleHQuUHJvdG8yRXh0ZW5kZWUYpT8gAygKMhsucHJvdG8yZXh0LlJlcGVhdGVkR3JvdXBFeHRSEHJlcGVhdGVkZ3JvdXBleHQ", [fileDesc_extra_example, fileDesc_google_protobuf_wrappers]); /** * The message we're going to extend @@ -278,21 +278,27 @@ export const packed_uint32_ext: GenDescExtension = /*@ export const unpacked_uint32_ext: GenDescExtension = /*@__PURE__*/ extDesc(fileDesc_extra_extensions_proto2, 16); +/** + * @generated from extension: repeated uint64 repeated_uint64_ext_js_string = 7006 [jstype = JS_STRING]; + */ +export const repeated_uint64_ext_js_string: GenDescExtension = /*@__PURE__*/ + extDesc(fileDesc_extra_extensions_proto2, 17); + /** * @generated from extension: optional google.protobuf.UInt32Value wrapper_ext = 8001; */ export const wrapper_ext: GenDescExtension = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 17); + extDesc(fileDesc_extra_extensions_proto2, 18); /** * @generated from extension: optional proto2ext.GroupExt groupext = 8100; */ export const groupext: GenDescExtension = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 18); + extDesc(fileDesc_extra_extensions_proto2, 19); /** * @generated from extension: repeated proto2ext.RepeatedGroupExt repeatedgroupext = 8101; */ export const repeatedgroupext: GenDescExtension = /*@__PURE__*/ - extDesc(fileDesc_extra_extensions_proto2, 19); + extDesc(fileDesc_extra_extensions_proto2, 20); diff --git a/packages/protobuf-test/src/gen/ts/extra/extensions-proto3_pb.ts b/packages/protobuf-test/src/gen/ts/extra/extensions-proto3_pb.ts index e69f5121d..d553c3df1 100644 --- a/packages/protobuf-test/src/gen/ts/extra/extensions-proto3_pb.ts +++ b/packages/protobuf-test/src/gen/ts/extra/extensions-proto3_pb.ts @@ -16,16 +16,36 @@ // @generated from file extra/extensions-proto3.proto (package proto3ext, syntax proto3) /* eslint-disable */ -import type { GenDescExtension, GenDescFile } from "@bufbuild/protobuf/codegenv1"; -import { extDesc, fileDesc } from "@bufbuild/protobuf/codegenv1"; +import type { GenDescExtension, GenDescFile, GenDescMessage } from "@bufbuild/protobuf/codegenv1"; +import { extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; import type { FileOptions } from "@bufbuild/protobuf/wkt"; import { fileDesc_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; /** * Describes the file extra/extensions-proto3.proto. */ export const fileDesc_extra_extensions_proto3: GenDescFile = /*@__PURE__*/ - fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMy5wcm90bxIJcHJvdG8zZXh0OjwKCnVpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6QcgASgNUgl1aW50MzJFeHQ6UAoTb3B0aW9uYWxfdWludDMyX2V4dBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxjqByABKA1SEW9wdGlvbmFsVWludDMyRXh0iAEBOkkKEXBhY2tlZF91aW50MzJfZXh0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGNs2IAMoDVIPcGFja2VkVWludDMyRXh0OlEKE3VucGFja2VkX3VpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3DYgAygNQgIQAFIRdW5wYWNrZWRVaW50MzJFeHRiBnByb3RvMw", [fileDesc_google_protobuf_descriptor]); + fileDesc("Ch1leHRyYS9leHRlbnNpb25zLXByb3RvMy5wcm90bxIJcHJvdG8zZXh0IigKEFByb3RvM0V4dE1lc3NhZ2USFAoMc3RyaW5nX2ZpZWxkGAEgASgJOjwKCnVpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY6QcgASgNUgl1aW50MzJFeHQ6UAoTb3B0aW9uYWxfdWludDMyX2V4dBIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxjqByABKA1SEW9wdGlvbmFsVWludDMyRXh0iAEBOkkKEXBhY2tlZF91aW50MzJfZXh0EhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGNs2IAMoDVIPcGFja2VkVWludDMyRXh0OlEKE3VucGFja2VkX3VpbnQzMl9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3DYgAygNQgIQAFIRdW5wYWNrZWRVaW50MzJFeHQ6WwoLbWVzc2FnZV9leHQSHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMY3TYgASgLMhsucHJvdG8zZXh0LlByb3RvM0V4dE1lc3NhZ2VSCm1lc3NhZ2VFeHRiBnByb3RvMw", [fileDesc_google_protobuf_descriptor]); + +/** + * A message used in extensions + * + * @generated from message proto3ext.Proto3ExtMessage + */ +export type Proto3ExtMessage = Message<"proto3ext.Proto3ExtMessage"> & { + /** + * @generated from field: string string_field = 1; + */ + stringField: string; +}; + +/** + * Describes the message proto3ext.Proto3ExtMessage. + * Use `create(Proto3ExtMessageDesc)` to create a new message. + */ +export const Proto3ExtMessageDesc: GenDescMessage = /*@__PURE__*/ + messageDesc(fileDesc_extra_extensions_proto3, 0); /** * @generated from extension: uint32 uint32_ext = 1001; @@ -51,3 +71,9 @@ export const packed_uint32_ext: GenDescExtension = /*@__P export const unpacked_uint32_ext: GenDescExtension = /*@__PURE__*/ extDesc(fileDesc_extra_extensions_proto3, 3); +/** + * @generated from extension: proto3ext.Proto3ExtMessage message_ext = 7005; + */ +export const message_ext: GenDescExtension = /*@__PURE__*/ + extDesc(fileDesc_extra_extensions_proto3, 4); + diff --git a/packages/protobuf-test/src/json.test.ts b/packages/protobuf-test/src/json.test.ts index 50cd17d69..cbdf5ddad 100644 --- a/packages/protobuf-test/src/json.test.ts +++ b/packages/protobuf-test/src/json.test.ts @@ -17,10 +17,16 @@ import { create, toJson, fromJson, + fromJsonString, setExtension, getExtension, } from "@bufbuild/protobuf"; -import type { MessageInitShape } from "@bufbuild/protobuf"; +import type { + MessageInitShape, + DescMessage, + JsonValue, +} from "@bufbuild/protobuf"; +import { createRegistry } from "@bufbuild/protobuf/reflect"; import { RepeatedScalarValuesMessageDesc, ScalarValuesMessageDesc, @@ -38,21 +44,16 @@ import { ValueDesc, anyPack, anyUnpack, + FileOptionsDesc, } from "@bufbuild/protobuf/wkt"; -import type { DescMessage, JsonValue } from "@bufbuild/protobuf"; -import { createRegistry } from "@bufbuild/protobuf/reflect"; - -import { - Proto2ExtendeeDesc, - string_ext, -} from "./gen/ts/extra/extensions-proto2_pb.js"; +import * as ext_proto2 from "./gen/ts/extra/extensions-proto2_pb.js"; +import * as ext_proto3 from "./gen/ts/extra/extensions-proto3_pb.js"; import { OneofMessageDesc } from "./gen/ts/extra/msg-oneof_pb.js"; import { JsonNamesMessageDesc } from "./gen/ts/extra/msg-json-names_pb.js"; import { JSTypeProto2NormalMessageDesc } from "./gen/ts/extra/jstype-proto2_pb.js"; -import { fromJsonString } from "@bufbuild/protobuf"; import { TestAllTypesProto3Desc } from "./gen/ts/google/protobuf/test_messages_proto3_pb.js"; -describe(`json serialization`, () => { +describe("JSON serialization", () => { testJson( ScalarValuesMessageDesc, { @@ -561,21 +562,142 @@ describe(`json serialization`, () => { }); }); }); - describe("extensions", () => { - test("encode and decode an extension", () => { - const extendee = create(Proto2ExtendeeDesc); - setExtension(extendee, string_ext, "foo"); - const jsonOpts = { registry: createRegistry(string_ext) }; - expect( - getExtension( - fromJson( - Proto2ExtendeeDesc, - toJson(Proto2ExtendeeDesc, extendee, jsonOpts), - jsonOpts, - ), - string_ext, - ), - ).toEqual("foo"); +}); + +describe("extensions in JSON", () => { + describe("proto2", () => { + const extendeeDesc = ext_proto2.Proto2ExtendeeDesc; + const jsonOpts = { + registry: createRegistry(ext_proto2.fileDesc_extra_extensions_proto2), + }; + describe("string_ext", () => { + const ext = ext_proto2.string_ext; + const goldenJson = { + "[proto2ext.string_ext]": "foo", + }; + const goldenValue = "foo"; + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + describe("uint64_ext", () => { + const ext = ext_proto2.uint64_ext; + const goldenJson = { + "[proto2ext.uint64_ext]": "123", + }; + const goldenValue = protoInt64.parse(123); + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + describe("uint64_ext_js_string", () => { + const ext = ext_proto2.uint64_ext_js_string; + const goldenJson = { + "[proto2ext.uint64_ext_js_string]": "456", + }; + const goldenValue = "456"; + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + describe("wrapper_ext", () => { + const ext = ext_proto2.wrapper_ext; + const goldenJson = { + "[proto2ext.wrapper_ext]": 789, + }; + const goldenValue = 789; + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + describe("message_ext", () => { + const ext = ext_proto2.message_ext; + const goldenJson = { + "[proto2ext.message_ext]": { stringField: "abc" }, + }; + const goldenValue = create(ext_proto2.Proto2ExtMessageDesc, { + stringField: "abc", + }); + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + }); + describe("proto3", () => { + const extendeeDesc = FileOptionsDesc; + const jsonOpts = { + registry: createRegistry(ext_proto3.fileDesc_extra_extensions_proto3), + }; + describe("uint32_ext", () => { + const ext = ext_proto3.uint32_ext; + const goldenJson = { + "[proto3ext.uint32_ext]": 0, + }; + const goldenValue = 0; + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); + }); + describe("message_ext", () => { + const ext = ext_proto3.message_ext; + const goldenJson = { + "[proto3ext.message_ext]": { stringField: "abc" }, + }; + const goldenValue = create(ext_proto3.Proto3ExtMessageDesc, { + stringField: "abc", + }); + test("encode", () => { + const extendee = create(extendeeDesc); + setExtension(extendee, ext, goldenValue); + const json = toJson(extendeeDesc, extendee, jsonOpts); + expect(json).toStrictEqual(goldenJson); + }); + test("decode", () => { + const extendee = fromJson(extendeeDesc, goldenJson, jsonOpts); + expect(getExtension(extendee, ext)).toStrictEqual(goldenValue); + }); }); }); }); diff --git a/packages/protobuf/src/to-json.ts b/packages/protobuf/src/to-json.ts index 5ccee9ed2..e7041b336 100644 --- a/packages/protobuf/src/to-json.ts +++ b/packages/protobuf/src/to-json.ts @@ -169,8 +169,8 @@ function reflectToJson(msg: ReflectMessage, opts: JsonWriteOptions): JsonValue { continue; } const value = getExtension(msg.message, extension); - const [, field] = createExtensionContainer(extension); - const jsonValue = fieldToJson(field, value, opts); + const [container, field] = createExtensionContainer(extension, value); + const jsonValue = fieldToJson(field, container.get(field), opts); if (jsonValue !== undefined) { json[extension.jsonName] = jsonValue; }