@bufbuild/protobuf 2.0.0-alpha.2 → 2.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/clone.d.ts +1 -1
  3. package/dist/cjs/clone.js +9 -6
  4. package/dist/cjs/codegenv1/boot.d.ts +1 -1
  5. package/dist/cjs/codegenv1/boot.js +3 -5
  6. package/dist/cjs/codegenv1/embed.d.ts +1 -1
  7. package/dist/cjs/codegenv1/embed.js +39 -34
  8. package/dist/cjs/codegenv1/enum.d.ts +1 -1
  9. package/dist/cjs/codegenv1/extension.d.ts +1 -1
  10. package/dist/cjs/codegenv1/file.d.ts +1 -1
  11. package/dist/cjs/codegenv1/file.js +5 -7
  12. package/dist/cjs/codegenv1/index.d.ts +1 -0
  13. package/dist/cjs/codegenv1/index.js +1 -0
  14. package/dist/cjs/codegenv1/message.d.ts +1 -1
  15. package/dist/cjs/codegenv1/scalar.d.ts +5 -0
  16. package/dist/cjs/codegenv1/scalar.js +39 -0
  17. package/dist/cjs/codegenv1/service.d.ts +3 -3
  18. package/dist/cjs/codegenv1/types.d.ts +7 -9
  19. package/dist/cjs/create.d.ts +1 -1
  20. package/dist/cjs/create.js +6 -5
  21. package/dist/cjs/{desc-types.d.ts → descriptors.d.ts} +39 -7
  22. package/dist/cjs/descriptors.js +53 -0
  23. package/dist/cjs/equals.d.ts +1 -1
  24. package/dist/cjs/extensions.d.ts +1 -1
  25. package/dist/cjs/extensions.js +4 -3
  26. package/dist/cjs/fields.d.ts +1 -1
  27. package/dist/cjs/from-binary.d.ts +1 -1
  28. package/dist/cjs/from-binary.js +32 -29
  29. package/dist/cjs/from-json.d.ts +2 -2
  30. package/dist/cjs/from-json.js +201 -188
  31. package/dist/cjs/index.d.ts +2 -1
  32. package/dist/cjs/index.js +2 -1
  33. package/dist/cjs/is-message.d.ts +1 -1
  34. package/dist/cjs/proto-int64.d.ts +4 -1
  35. package/dist/cjs/proto-int64.js +16 -6
  36. package/dist/cjs/reflect/error.d.ts +1 -1
  37. package/dist/cjs/reflect/guard.d.ts +1 -1
  38. package/dist/cjs/reflect/guard.js +4 -4
  39. package/dist/cjs/reflect/index.d.ts +0 -1
  40. package/dist/cjs/reflect/index.js +0 -1
  41. package/dist/cjs/reflect/names.d.ts +1 -1
  42. package/dist/cjs/reflect/names.js +1 -1
  43. package/dist/cjs/reflect/nested-types.d.ts +1 -1
  44. package/dist/cjs/reflect/reflect-check.d.ts +10 -1
  45. package/dist/cjs/reflect/reflect-check.js +126 -9
  46. package/dist/cjs/reflect/reflect-types.d.ts +3 -41
  47. package/dist/cjs/reflect/reflect.d.ts +1 -1
  48. package/dist/cjs/reflect/reflect.js +42 -60
  49. package/dist/cjs/reflect/scalar.d.ts +3 -55
  50. package/dist/cjs/reflect/scalar.js +26 -220
  51. package/dist/cjs/reflect/unsafe.d.ts +1 -17
  52. package/dist/cjs/reflect/unsafe.js +2 -20
  53. package/dist/cjs/{reflect/registry.d.ts → registry.d.ts} +2 -2
  54. package/dist/cjs/{reflect/registry.js → registry.js} +54 -36
  55. package/dist/cjs/to-binary.d.ts +1 -1
  56. package/dist/cjs/to-binary.js +27 -27
  57. package/dist/cjs/to-json.d.ts +7 -6
  58. package/dist/cjs/to-json.js +57 -44
  59. package/dist/cjs/types.d.ts +1 -1
  60. package/dist/cjs/wire/base64-encoding.js +2 -2
  61. package/dist/cjs/wire/binary-encoding.d.ts +20 -0
  62. package/dist/cjs/wire/binary-encoding.js +75 -8
  63. package/dist/cjs/wire/size-delimited.d.ts +1 -1
  64. package/dist/cjs/wire/text-format.d.ts +1 -2
  65. package/dist/cjs/wire/text-format.js +21 -19
  66. package/dist/cjs/wkt/any.d.ts +2 -2
  67. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +6 -0
  68. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  69. package/dist/cjs/wkt/wrappers.d.ts +1 -1
  70. package/dist/esm/clone.d.ts +1 -1
  71. package/dist/esm/clone.js +8 -5
  72. package/dist/esm/codegenv1/boot.d.ts +1 -1
  73. package/dist/esm/codegenv1/boot.js +3 -5
  74. package/dist/esm/codegenv1/embed.d.ts +1 -1
  75. package/dist/esm/codegenv1/embed.js +9 -4
  76. package/dist/esm/codegenv1/enum.d.ts +1 -1
  77. package/dist/esm/codegenv1/extension.d.ts +1 -1
  78. package/dist/esm/codegenv1/file.d.ts +1 -1
  79. package/dist/esm/codegenv1/file.js +4 -6
  80. package/dist/esm/codegenv1/index.d.ts +1 -0
  81. package/dist/esm/codegenv1/index.js +1 -0
  82. package/dist/esm/codegenv1/message.d.ts +1 -1
  83. package/dist/esm/codegenv1/scalar.d.ts +5 -0
  84. package/dist/esm/codegenv1/scalar.js +35 -0
  85. package/dist/esm/codegenv1/service.d.ts +3 -3
  86. package/dist/esm/codegenv1/types.d.ts +7 -9
  87. package/dist/esm/create.d.ts +1 -1
  88. package/dist/esm/create.js +4 -3
  89. package/dist/esm/{desc-types.d.ts → descriptors.d.ts} +39 -7
  90. package/dist/esm/descriptors.js +50 -0
  91. package/dist/esm/equals.d.ts +1 -1
  92. package/dist/esm/extensions.d.ts +1 -1
  93. package/dist/esm/extensions.js +4 -3
  94. package/dist/esm/fields.d.ts +1 -1
  95. package/dist/esm/from-binary.d.ts +1 -1
  96. package/dist/esm/from-binary.js +14 -11
  97. package/dist/esm/from-json.d.ts +2 -2
  98. package/dist/esm/from-json.js +194 -181
  99. package/dist/esm/index.d.ts +2 -1
  100. package/dist/esm/index.js +2 -1
  101. package/dist/esm/is-message.d.ts +1 -1
  102. package/dist/esm/proto-int64.d.ts +4 -1
  103. package/dist/esm/proto-int64.js +16 -6
  104. package/dist/esm/reflect/error.d.ts +1 -1
  105. package/dist/esm/reflect/guard.d.ts +1 -1
  106. package/dist/esm/reflect/guard.js +4 -4
  107. package/dist/esm/reflect/index.d.ts +0 -1
  108. package/dist/esm/reflect/index.js +0 -1
  109. package/dist/esm/reflect/names.d.ts +1 -1
  110. package/dist/esm/reflect/names.js +1 -1
  111. package/dist/esm/reflect/nested-types.d.ts +1 -1
  112. package/dist/esm/reflect/reflect-check.d.ts +10 -1
  113. package/dist/esm/reflect/reflect-check.js +119 -2
  114. package/dist/esm/reflect/reflect-types.d.ts +3 -41
  115. package/dist/esm/reflect/reflect-types.js +1 -0
  116. package/dist/esm/reflect/reflect.d.ts +1 -1
  117. package/dist/esm/reflect/reflect.js +25 -43
  118. package/dist/esm/reflect/scalar.d.ts +3 -55
  119. package/dist/esm/reflect/scalar.js +14 -205
  120. package/dist/esm/reflect/unsafe.d.ts +1 -17
  121. package/dist/esm/reflect/unsafe.js +1 -17
  122. package/dist/esm/{reflect/registry.d.ts → registry.d.ts} +2 -2
  123. package/dist/esm/{reflect/registry.js → registry.js} +44 -26
  124. package/dist/esm/to-binary.d.ts +1 -1
  125. package/dist/esm/to-binary.js +1 -1
  126. package/dist/esm/to-json.d.ts +7 -6
  127. package/dist/esm/to-json.js +42 -29
  128. package/dist/esm/types.d.ts +1 -1
  129. package/dist/esm/wire/base64-encoding.js +2 -2
  130. package/dist/esm/wire/binary-encoding.d.ts +20 -0
  131. package/dist/esm/wire/binary-encoding.js +68 -1
  132. package/dist/esm/wire/size-delimited.d.ts +1 -1
  133. package/dist/esm/wire/text-format.d.ts +1 -2
  134. package/dist/esm/wire/text-format.js +5 -3
  135. package/dist/esm/wkt/any.d.ts +2 -2
  136. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +6 -0
  137. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  138. package/dist/esm/wkt/wrappers.d.ts +1 -1
  139. package/package.json +1 -1
  140. package/dist/cjs/desc-types.js +0 -15
  141. package/dist/cjs/reflect/assert.d.ts +0 -16
  142. package/dist/cjs/reflect/assert.js +0 -59
  143. package/dist/esm/desc-types.js +0 -14
  144. package/dist/esm/reflect/assert.d.ts +0 -16
  145. package/dist/esm/reflect/assert.js +0 -52
@@ -12,72 +12,7 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  import { protoInt64 } from "../proto-int64.js";
15
- import { getTextEncoding } from "../wire/text-encoding.js";
16
- /**
17
- * Scalar value types. This is a subset of field types declared by protobuf
18
- * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE
19
- * are omitted, but the numerical values are identical.
20
- */
21
- export var ScalarType;
22
- (function (ScalarType) {
23
- // 0 is reserved for errors.
24
- // Order is weird for historical reasons.
25
- ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";
26
- ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";
27
- // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
28
- // negative values are likely.
29
- ScalarType[ScalarType["INT64"] = 3] = "INT64";
30
- ScalarType[ScalarType["UINT64"] = 4] = "UINT64";
31
- // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
32
- // negative values are likely.
33
- ScalarType[ScalarType["INT32"] = 5] = "INT32";
34
- ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";
35
- ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";
36
- ScalarType[ScalarType["BOOL"] = 8] = "BOOL";
37
- ScalarType[ScalarType["STRING"] = 9] = "STRING";
38
- // Tag-delimited aggregate.
39
- // Group type is deprecated and not supported in proto3. However, Proto3
40
- // implementations should still be able to parse the group wire format and
41
- // treat group fields as unknown fields.
42
- // TYPE_GROUP = 10,
43
- // TYPE_MESSAGE = 11, // Length-delimited aggregate.
44
- // New in version 2.
45
- ScalarType[ScalarType["BYTES"] = 12] = "BYTES";
46
- ScalarType[ScalarType["UINT32"] = 13] = "UINT32";
47
- // TYPE_ENUM = 14,
48
- ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";
49
- ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";
50
- ScalarType[ScalarType["SINT32"] = 17] = "SINT32";
51
- ScalarType[ScalarType["SINT64"] = 18] = "SINT64";
52
- })(ScalarType || (ScalarType = {}));
53
- /**
54
- * JavaScript representation of fields with 64 bit integral types (int64, uint64,
55
- * sint64, fixed64, sfixed64).
56
- *
57
- * This is a subset of google.protobuf.FieldOptions.JSType, which defines JS_NORMAL,
58
- * JS_STRING, and JS_NUMBER. Protobuf-ES uses BigInt by default, but will use
59
- * String if `[jstype = JS_STRING]` is specified.
60
- *
61
- * ```protobuf
62
- * uint64 field_a = 1; // BigInt
63
- * uint64 field_b = 2 [jstype = JS_NORMAL]; // BigInt
64
- * uint64 field_b = 2 [jstype = JS_NUMBER]; // BigInt
65
- * uint64 field_b = 2 [jstype = JS_STRING]; // String
66
- * ```
67
- */
68
- export var LongType;
69
- (function (LongType) {
70
- /**
71
- * Use JavaScript BigInt.
72
- */
73
- LongType[LongType["BIGINT"] = 0] = "BIGINT";
74
- /**
75
- * Use JavaScript String.
76
- *
77
- * Field option `[jstype = JS_STRING]`.
78
- */
79
- LongType[LongType["STRING"] = 1] = "STRING";
80
- })(LongType || (LongType = {}));
15
+ import { ScalarType } from "../descriptors.js";
81
16
  /**
82
17
  * Returns true if both scalar values are equal.
83
18
  */
@@ -119,27 +54,27 @@ export function scalarEquals(type, a, b) {
119
54
  /**
120
55
  * Returns the zero value for the given scalar type.
121
56
  */
122
- export function scalarZeroValue(type, longType) {
57
+ export function scalarZeroValue(type, longAsString) {
123
58
  switch (type) {
59
+ case ScalarType.STRING:
60
+ return "";
124
61
  case ScalarType.BOOL:
125
62
  return false;
126
- case ScalarType.UINT64:
127
- case ScalarType.FIXED64:
128
- case ScalarType.INT64:
129
- case ScalarType.SFIXED64:
130
- case ScalarType.SINT64:
131
- return (longType == 0 ? protoInt64.zero : "0");
63
+ default:
64
+ // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.
65
+ // We do not use individual cases to save a few bytes code size.
66
+ return 0;
132
67
  case ScalarType.DOUBLE:
133
68
  case ScalarType.FLOAT:
134
69
  return 0.0;
70
+ case ScalarType.INT64:
71
+ case ScalarType.UINT64:
72
+ case ScalarType.SFIXED64:
73
+ case ScalarType.FIXED64:
74
+ case ScalarType.SINT64:
75
+ return (longAsString ? "0" : protoInt64.zero);
135
76
  case ScalarType.BYTES:
136
77
  return new Uint8Array(0);
137
- case ScalarType.STRING:
138
- return "";
139
- default:
140
- // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.
141
- // We do not use individual cases to save a few bytes code size.
142
- return 0;
143
78
  }
144
79
  }
145
80
  /**
@@ -161,129 +96,3 @@ export function isScalarZeroValue(type, value) {
161
96
  return value == 0; // Loose comparison matches 0n, 0 and "0"
162
97
  }
163
98
  }
164
- const FLOAT32_MAX = 3.4028234663852886e38, FLOAT32_MIN = -3.4028234663852886e38, UINT32_MAX = 0xffffffff, INT32_MAX = 0x7fffffff, INT32_MIN = -0x80000000;
165
- // TODO this checks UTF-8 validity
166
- export function checkScalarValue(value, scalar) {
167
- switch (scalar) {
168
- case ScalarType.DOUBLE:
169
- return typeof value == "number";
170
- case ScalarType.FLOAT:
171
- if (typeof value != "number") {
172
- return false;
173
- }
174
- if (Number.isNaN(value) || !Number.isFinite(value)) {
175
- return true;
176
- }
177
- if (value > FLOAT32_MAX || value < FLOAT32_MIN) {
178
- return `${value.toFixed()} out of range`;
179
- }
180
- return true;
181
- case ScalarType.INT32:
182
- case ScalarType.SFIXED32:
183
- case ScalarType.SINT32:
184
- // signed
185
- if (typeof value !== "number" || !Number.isInteger(value)) {
186
- return false;
187
- }
188
- if (value > INT32_MAX || value < INT32_MIN) {
189
- return `${value.toFixed()} out of range`;
190
- }
191
- return true;
192
- case ScalarType.FIXED32:
193
- case ScalarType.UINT32:
194
- // unsigned
195
- if (typeof value !== "number" || !Number.isInteger(value)) {
196
- return false;
197
- }
198
- if (value > UINT32_MAX || value < 0) {
199
- return `${value.toFixed()} out of range`;
200
- }
201
- return true;
202
- case ScalarType.BOOL:
203
- return typeof value == "boolean";
204
- case ScalarType.STRING:
205
- if (typeof value != "string") {
206
- return false;
207
- }
208
- return getTextEncoding().checkUtf8(value) || "invalid UTF8";
209
- case ScalarType.BYTES:
210
- return value instanceof Uint8Array;
211
- case ScalarType.INT64:
212
- case ScalarType.SFIXED64:
213
- case ScalarType.SINT64:
214
- // signed
215
- if (typeof value != "string" &&
216
- typeof value !== "bigint" &&
217
- typeof value !== "number") {
218
- return false;
219
- }
220
- try {
221
- protoInt64.parse(value);
222
- }
223
- catch (e) {
224
- return `${value} out of range`;
225
- }
226
- return true;
227
- case ScalarType.FIXED64:
228
- case ScalarType.UINT64:
229
- // unsigned
230
- if (typeof value != "string" &&
231
- typeof value !== "bigint" &&
232
- typeof value !== "number") {
233
- return false;
234
- }
235
- try {
236
- protoInt64.uParse(value);
237
- }
238
- catch (e) {
239
- return `${value} out of range`;
240
- }
241
- return true;
242
- }
243
- }
244
- export function scalarTypeDescription(scalar) {
245
- switch (scalar) {
246
- case ScalarType.STRING:
247
- return "string";
248
- case ScalarType.BOOL:
249
- return "boolean";
250
- case ScalarType.INT64:
251
- case ScalarType.SINT64:
252
- case ScalarType.SFIXED64:
253
- return "bigint (int64)";
254
- case ScalarType.UINT64:
255
- case ScalarType.FIXED64:
256
- return "bigint (uint64)";
257
- case ScalarType.BYTES:
258
- return "Uint8Array";
259
- case ScalarType.DOUBLE:
260
- return "number (float64)";
261
- case ScalarType.FLOAT:
262
- return "number (float32)";
263
- case ScalarType.FIXED32:
264
- case ScalarType.UINT32:
265
- return "number (uint32)";
266
- case ScalarType.INT32:
267
- case ScalarType.SFIXED32:
268
- case ScalarType.SINT32:
269
- return "number (int32)";
270
- }
271
- }
272
- export function scalarTypeScriptType(scalar, long) {
273
- switch (scalar) {
274
- case ScalarType.STRING:
275
- return "string";
276
- case ScalarType.BOOL:
277
- return "boolean";
278
- case ScalarType.UINT64:
279
- case ScalarType.SFIXED64:
280
- case ScalarType.FIXED64:
281
- case ScalarType.SINT64:
282
- case ScalarType.INT64:
283
- return long == LongType.STRING ? "string" : "bigint";
284
- case ScalarType.BYTES:
285
- return "Uint8Array";
286
- default:
287
- return "number";
288
- }
289
- }
@@ -1,4 +1,4 @@
1
- import type { DescField, DescOneof } from "../desc-types.js";
1
+ import type { DescField, DescOneof } from "../descriptors.js";
2
2
  export declare const unsafeLocal: unique symbol;
3
3
  /**
4
4
  * Return the selected field of a oneof group.
@@ -40,19 +40,3 @@ export declare function unsafeSet(target: Record<string, unknown>, field: DescFi
40
40
  */
41
41
  export declare function unsafeClear(target: Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any -- `any` is the best choice for dynamic access
42
42
  field: DescField): void;
43
- /**
44
- * Add an item to a list field.
45
- *
46
- * @private
47
- */
48
- export declare function unsafeAddListItem(target: Record<string, unknown>, field: DescField & {
49
- fieldKind: "list";
50
- }, value: unknown): void;
51
- /**
52
- * Set a map entry.
53
- *
54
- * @private
55
- */
56
- export declare function unsafeSetMapEntry(target: Record<string, unknown>, field: DescField & {
57
- fieldKind: "map";
58
- }, key: string | number, value: unknown): void;
@@ -132,24 +132,8 @@ field) {
132
132
  target[name] = field.enum.values[0].number;
133
133
  break;
134
134
  case "scalar":
135
- target[name] = scalarZeroValue(field.scalar, field.longType);
135
+ target[name] = scalarZeroValue(field.scalar, field.longAsString);
136
136
  break;
137
137
  }
138
138
  }
139
139
  }
140
- /**
141
- * Add an item to a list field.
142
- *
143
- * @private
144
- */
145
- export function unsafeAddListItem(target, field, value) {
146
- target[field.localName].push(value);
147
- }
148
- /**
149
- * Set a map entry.
150
- *
151
- * @private
152
- */
153
- export function unsafeSetMapEntry(target, field, key, value) {
154
- target[field.localName][key] = value;
155
- }
@@ -1,5 +1,5 @@
1
- import type { FileDescriptorProto, FileDescriptorSet } from "../wkt/gen/google/protobuf/descriptor_pb.js";
2
- import type { DescEnum, DescExtension, DescFile, DescMessage, DescService, SupportedEdition } from "../desc-types.js";
1
+ import type { FileDescriptorProto, FileDescriptorSet } from "./wkt/gen/google/protobuf/descriptor_pb.js";
2
+ import { type DescEnum, type DescExtension, type DescFile, type DescMessage, type DescService, type SupportedEdition } from "./descriptors.js";
3
3
  /**
4
4
  * A set of descriptors for messages, enumerations, extensions,
5
5
  * and services.
@@ -11,12 +11,11 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- import { assert } from "./assert.js";
15
- import { parseTextFormatEnumValue, parseTextFormatScalarValue, } from "../wire/text-format.js";
16
- import { LongType, ScalarType } from "./scalar.js";
17
- import { nestedTypes } from "./nested-types.js";
18
- import { unsafeIsSetExplicit } from "./unsafe.js";
19
- import { protoCamelCase, safeObjectProperty } from "./names.js";
14
+ import { ScalarType, } from "./descriptors.js";
15
+ import { parseTextFormatEnumValue, parseTextFormatScalarValue, } from "./wire/text-format.js";
16
+ import { nestedTypes } from "./reflect/nested-types.js";
17
+ import { unsafeIsSetExplicit } from "./reflect/unsafe.js";
18
+ import { protoCamelCase, safeObjectProperty } from "./reflect/names.js";
20
19
  /**
21
20
  * Create a registry from the given inputs.
22
21
  *
@@ -221,7 +220,7 @@ const DELIMITED = 2;
221
220
  const OPEN = 1;
222
221
  // prettier-ignore
223
222
  // bootstrap-inject defaults: EDITION_PROTO2 to EDITION_2023: export const minimumEdition: SupportedEdition = $minimumEdition, maximumEdition: SupportedEdition = $maximumEdition;
224
- // generated from protoc v27.0-rc2
223
+ // generated from protoc v27.0
225
224
  export const minimumEdition = 998, maximumEdition = 1000;
226
225
  const featureDefaults = {
227
226
  // EDITION_PROTO2
@@ -455,6 +454,7 @@ function addService(proto, file, reg) {
455
454
  name: proto.name,
456
455
  typeName: makeTypeName(proto, undefined, file),
457
456
  methods: [],
457
+ method: {},
458
458
  toString() {
459
459
  return `service ${this.typeName}`;
460
460
  },
@@ -462,7 +462,9 @@ function addService(proto, file, reg) {
462
462
  file.services.push(desc);
463
463
  reg.add(desc);
464
464
  for (const methodProto of proto.method) {
465
- desc.methods.push(newMethod(methodProto, desc, reg));
465
+ const method = newMethod(methodProto, desc, reg);
466
+ desc.methods.push(method);
467
+ desc.method[method.localName] = method;
466
468
  }
467
469
  }
468
470
  /**
@@ -541,7 +543,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
541
543
  mapKey: undefined,
542
544
  delimitedEncoding: undefined,
543
545
  packed: undefined,
544
- longType: undefined,
546
+ longAsString: false,
545
547
  getDefaultValue: undefined,
546
548
  };
547
549
  if (isExtension) {
@@ -583,21 +585,13 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
583
585
  if (mapEntry) {
584
586
  // map field
585
587
  field.fieldKind = "map";
586
- const keyField = mapEntry.fields.find((f) => f.number === 1);
587
- assert(keyField);
588
- assert(keyField.fieldKind == "scalar");
589
- assert(keyField.scalar != ScalarType.BYTES &&
590
- keyField.scalar != ScalarType.FLOAT &&
591
- keyField.scalar != ScalarType.DOUBLE);
592
- const valueField = mapEntry.fields.find((f) => f.number === 2);
593
- assert(valueField);
594
- assert(valueField.fieldKind != "list" && valueField.fieldKind != "map");
595
- field.mapKey = keyField.scalar;
596
- field.mapKind = valueField.fieldKind;
597
- field.message = valueField.message;
588
+ const { key, value } = findMapEntryFields(mapEntry);
589
+ field.mapKey = key.scalar;
590
+ field.mapKind = value.fieldKind;
591
+ field.message = value.message;
598
592
  field.delimitedEncoding = false; // map fields are always LENGTH_PREFIXED
599
- field.enum = valueField.enum;
600
- field.scalar = valueField.scalar;
593
+ field.enum = value.enum;
594
+ field.scalar = value.scalar;
601
595
  return field;
602
596
  }
603
597
  // list field
@@ -618,8 +612,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
618
612
  default:
619
613
  field.listKind = "scalar";
620
614
  field.scalar = type;
621
- field.longType =
622
- jstype == JS_STRING ? LongType.STRING : LongType.BIGINT;
615
+ field.longAsString = jstype == JS_STRING;
623
616
  break;
624
617
  }
625
618
  field.packed = isPackedField(proto, parentOrFile);
@@ -650,7 +643,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
650
643
  default: {
651
644
  field.fieldKind = "scalar";
652
645
  field.scalar = type;
653
- field.longType = jstype == JS_STRING ? LongType.STRING : LongType.BIGINT;
646
+ field.longAsString = jstype == JS_STRING;
654
647
  field.getDefaultValue = () => {
655
648
  return unsafeIsSetExplicit(proto, "defaultValue")
656
649
  ? parseTextFormatScalarValue(type, proto.defaultValue)
@@ -825,6 +818,22 @@ function isPackedField(proto, parent) {
825
818
  parent,
826
819
  }));
827
820
  }
821
+ /**
822
+ * Find the key and value fields of a synthetic map entry message.
823
+ */
824
+ function findMapEntryFields(mapEntry) {
825
+ const key = mapEntry.fields.find((f) => f.number === 1);
826
+ const value = mapEntry.fields.find((f) => f.number === 2);
827
+ assert(key &&
828
+ key.fieldKind == "scalar" &&
829
+ key.scalar != ScalarType.BYTES &&
830
+ key.scalar != ScalarType.FLOAT &&
831
+ key.scalar != ScalarType.DOUBLE &&
832
+ value &&
833
+ value.fieldKind != "list" &&
834
+ value.fieldKind != "map");
835
+ return { key, value };
836
+ }
828
837
  /**
829
838
  * Enumerations can be open or closed.
830
839
  * See https://protobuf.dev/programming-guides/enum/
@@ -872,3 +881,12 @@ function resolveFeature(name, ref) {
872
881
  }
873
882
  return resolveFeature(name, ref.parent);
874
883
  }
884
+ /**
885
+ * Assert that condition is truthy or throw error (with message)
886
+ */
887
+ function assert(condition, msg) {
888
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions -- we want the implicit conversion to boolean
889
+ if (!condition) {
890
+ throw new Error(msg);
891
+ }
892
+ }
@@ -1,6 +1,6 @@
1
1
  import type { MessageShape } from "./types.js";
2
2
  import { BinaryWriter } from "./wire/binary-encoding.js";
3
- import type { DescField, DescMessage } from "./desc-types.js";
3
+ import { type DescField, type DescMessage } from "./descriptors.js";
4
4
  import type { ReflectMessage } from "./reflect/index.js";
5
5
  /**
6
6
  * Options for serializing to binary data.
@@ -13,7 +13,7 @@
13
13
  // limitations under the License.
14
14
  import { reflect } from "./reflect/reflect.js";
15
15
  import { BinaryWriter, WireType } from "./wire/binary-encoding.js";
16
- import { ScalarType } from "./reflect/scalar.js";
16
+ import { ScalarType } from "./descriptors.js";
17
17
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.LEGACY_REQUIRED: const $name: FeatureSet_FieldPresence.$localName = $number;
18
18
  const LEGACY_REQUIRED = 3;
19
19
  // Default options for serializing binary data.
@@ -1,17 +1,18 @@
1
- import type { DescMessage } from "./desc-types.js";
1
+ import { type DescMessage } from "./descriptors.js";
2
2
  import type { JsonValue } from "./json-value.js";
3
- import type { Registry } from "./reflect/registry.js";
3
+ import type { Registry } from "./registry.js";
4
4
  import type { MessageShape } from "./types.js";
5
5
  /**
6
6
  * Options for serializing to JSON.
7
7
  */
8
8
  export interface JsonWriteOptions {
9
9
  /**
10
- * Emit fields with default values: Fields with default values are omitted
11
- * by default in proto3 JSON output. This option overrides this behavior
12
- * and outputs fields with their default values.
10
+ * By default, fields with implicit presence are not serialized if they are
11
+ * unset. For example, an empty list field or a proto3 int32 field with 0 is
12
+ * not serialized. With this option enabled, such fields are included in the
13
+ * output.
13
14
  */
14
- emitDefaultValues: boolean;
15
+ alwaysEmitImplicit: boolean;
15
16
  /**
16
17
  * Emit enum values as integers instead of strings: The name of an enum
17
18
  * value is used by default in JSON output. An option may be provided to