@bufbuild/protobuf 2.0.0-alpha.1 → 2.0.0-alpha.3

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 (201) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/clone.d.ts +1 -1
  3. package/dist/cjs/clone.js +2 -2
  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 +2 -2
  7. package/dist/cjs/codegenv1/embed.js +51 -46
  8. package/dist/cjs/codegenv1/enum.d.ts +1 -1
  9. package/dist/cjs/codegenv1/enum.js +2 -4
  10. package/dist/cjs/codegenv1/extension.d.ts +1 -1
  11. package/dist/cjs/codegenv1/file.d.ts +1 -1
  12. package/dist/cjs/codegenv1/file.js +5 -7
  13. package/dist/cjs/codegenv1/index.d.ts +1 -0
  14. package/dist/cjs/codegenv1/index.js +1 -0
  15. package/dist/cjs/codegenv1/message.d.ts +1 -1
  16. package/dist/cjs/codegenv1/restore-json-names.d.ts +3 -0
  17. package/dist/cjs/codegenv1/restore-json-names.js +3 -0
  18. package/dist/cjs/codegenv1/scalar.d.ts +5 -0
  19. package/dist/cjs/codegenv1/scalar.js +39 -0
  20. package/dist/cjs/codegenv1/service.d.ts +3 -3
  21. package/dist/cjs/codegenv1/symbols.d.ts +9 -0
  22. package/dist/cjs/codegenv1/symbols.js +9 -0
  23. package/dist/cjs/codegenv1/types.d.ts +59 -8
  24. package/dist/cjs/create.d.ts +1 -1
  25. package/dist/cjs/create.js +13 -23
  26. package/dist/cjs/{desc-types.d.ts → descriptors.d.ts} +66 -17
  27. package/dist/cjs/descriptors.js +53 -0
  28. package/dist/cjs/equals.d.ts +1 -1
  29. package/dist/cjs/extensions.d.ts +21 -1
  30. package/dist/cjs/extensions.js +42 -10
  31. package/dist/cjs/fields.d.ts +17 -16
  32. package/dist/cjs/fields.js +17 -10
  33. package/dist/cjs/from-binary.d.ts +2 -2
  34. package/dist/cjs/from-binary.js +31 -41
  35. package/dist/cjs/from-json.d.ts +4 -4
  36. package/dist/cjs/from-json.js +200 -185
  37. package/dist/cjs/index.d.ts +3 -2
  38. package/dist/cjs/index.js +5 -2
  39. package/dist/cjs/is-message.d.ts +1 -1
  40. package/dist/cjs/proto-int64.d.ts +4 -1
  41. package/dist/cjs/proto-int64.js +16 -6
  42. package/dist/cjs/reflect/error.d.ts +1 -1
  43. package/dist/cjs/reflect/guard.d.ts +1 -1
  44. package/dist/cjs/reflect/index.d.ts +0 -1
  45. package/dist/cjs/reflect/index.js +0 -1
  46. package/dist/cjs/reflect/names.d.ts +1 -13
  47. package/dist/cjs/reflect/names.js +2 -40
  48. package/dist/cjs/reflect/nested-types.d.ts +11 -1
  49. package/dist/cjs/reflect/nested-types.js +34 -1
  50. package/dist/cjs/reflect/reflect-check.d.ts +10 -1
  51. package/dist/cjs/reflect/reflect-check.js +126 -9
  52. package/dist/cjs/reflect/reflect-types.d.ts +162 -14
  53. package/dist/cjs/reflect/reflect.d.ts +12 -3
  54. package/dist/cjs/reflect/reflect.js +316 -290
  55. package/dist/cjs/reflect/scalar.d.ts +3 -55
  56. package/dist/cjs/reflect/scalar.js +26 -220
  57. package/dist/cjs/reflect/unsafe.d.ts +1 -1
  58. package/dist/cjs/reflect/unsafe.js +38 -43
  59. package/dist/cjs/{reflect/registry.d.ts → registry.d.ts} +2 -2
  60. package/dist/cjs/{reflect/registry.js → registry.js} +100 -73
  61. package/dist/cjs/to-binary.d.ts +1 -1
  62. package/dist/cjs/to-binary.js +28 -30
  63. package/dist/cjs/to-json.d.ts +7 -6
  64. package/dist/cjs/to-json.js +63 -70
  65. package/dist/cjs/types.d.ts +1 -1
  66. package/dist/cjs/wire/base64-encoding.js +4 -4
  67. package/dist/cjs/wire/binary-encoding.d.ts +25 -3
  68. package/dist/cjs/wire/binary-encoding.js +70 -18
  69. package/dist/cjs/wire/size-delimited.d.ts +1 -1
  70. package/dist/cjs/wire/text-format.d.ts +1 -2
  71. package/dist/cjs/wire/text-format.js +21 -19
  72. package/dist/cjs/wkt/any.d.ts +3 -3
  73. package/dist/cjs/wkt/gen/google/protobuf/any_pb.d.ts +7 -0
  74. package/dist/cjs/wkt/gen/google/protobuf/any_pb.js +7 -2
  75. package/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +15 -0
  76. package/dist/cjs/wkt/gen/google/protobuf/api_pb.js +15 -6
  77. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +22 -0
  78. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.js +22 -9
  79. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +192 -0
  80. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +187 -84
  81. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.d.ts +7 -0
  82. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.js +7 -2
  83. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.d.ts +7 -0
  84. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.js +7 -2
  85. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -0
  86. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.js +7 -2
  87. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.d.ts +7 -0
  88. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.js +7 -2
  89. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.d.ts +18 -0
  90. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.js +18 -7
  91. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -0
  92. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.js +7 -2
  93. package/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +32 -0
  94. package/dist/cjs/wkt/gen/google/protobuf/type_pb.js +32 -13
  95. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.d.ts +39 -0
  96. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.js +39 -18
  97. package/dist/cjs/wkt/wrappers.d.ts +1 -1
  98. package/dist/esm/clone.d.ts +1 -1
  99. package/dist/esm/clone.js +1 -1
  100. package/dist/esm/codegenv1/boot.d.ts +1 -1
  101. package/dist/esm/codegenv1/boot.js +3 -5
  102. package/dist/esm/codegenv1/embed.d.ts +2 -2
  103. package/dist/esm/codegenv1/embed.js +34 -29
  104. package/dist/esm/codegenv1/enum.d.ts +1 -1
  105. package/dist/esm/codegenv1/enum.js +2 -4
  106. package/dist/esm/codegenv1/extension.d.ts +1 -1
  107. package/dist/esm/codegenv1/file.d.ts +1 -1
  108. package/dist/esm/codegenv1/file.js +4 -6
  109. package/dist/esm/codegenv1/index.d.ts +1 -0
  110. package/dist/esm/codegenv1/index.js +1 -0
  111. package/dist/esm/codegenv1/message.d.ts +1 -1
  112. package/dist/esm/codegenv1/restore-json-names.d.ts +3 -0
  113. package/dist/esm/codegenv1/restore-json-names.js +3 -0
  114. package/dist/esm/codegenv1/scalar.d.ts +5 -0
  115. package/dist/esm/codegenv1/scalar.js +35 -0
  116. package/dist/esm/codegenv1/service.d.ts +3 -3
  117. package/dist/esm/codegenv1/symbols.d.ts +9 -0
  118. package/dist/esm/codegenv1/symbols.js +9 -0
  119. package/dist/esm/codegenv1/types.d.ts +59 -8
  120. package/dist/esm/create.d.ts +1 -1
  121. package/dist/esm/create.js +11 -21
  122. package/dist/esm/{desc-types.d.ts → descriptors.d.ts} +66 -17
  123. package/dist/esm/descriptors.js +50 -0
  124. package/dist/esm/equals.d.ts +1 -1
  125. package/dist/esm/extensions.d.ts +21 -1
  126. package/dist/esm/extensions.js +39 -9
  127. package/dist/esm/fields.d.ts +17 -16
  128. package/dist/esm/fields.js +17 -10
  129. package/dist/esm/from-binary.d.ts +2 -2
  130. package/dist/esm/from-binary.js +13 -23
  131. package/dist/esm/from-json.d.ts +4 -4
  132. package/dist/esm/from-json.js +193 -178
  133. package/dist/esm/index.d.ts +3 -2
  134. package/dist/esm/index.js +3 -2
  135. package/dist/esm/is-message.d.ts +1 -1
  136. package/dist/esm/proto-int64.d.ts +4 -1
  137. package/dist/esm/proto-int64.js +16 -6
  138. package/dist/esm/reflect/error.d.ts +1 -1
  139. package/dist/esm/reflect/guard.d.ts +1 -1
  140. package/dist/esm/reflect/index.d.ts +0 -1
  141. package/dist/esm/reflect/index.js +0 -1
  142. package/dist/esm/reflect/names.d.ts +1 -13
  143. package/dist/esm/reflect/names.js +1 -38
  144. package/dist/esm/reflect/nested-types.d.ts +11 -1
  145. package/dist/esm/reflect/nested-types.js +32 -0
  146. package/dist/esm/reflect/reflect-check.d.ts +10 -1
  147. package/dist/esm/reflect/reflect-check.js +119 -2
  148. package/dist/esm/reflect/reflect-types.d.ts +162 -14
  149. package/dist/esm/reflect/reflect-types.js +1 -0
  150. package/dist/esm/reflect/reflect.d.ts +12 -3
  151. package/dist/esm/reflect/reflect.js +305 -279
  152. package/dist/esm/reflect/scalar.d.ts +3 -55
  153. package/dist/esm/reflect/scalar.js +14 -205
  154. package/dist/esm/reflect/unsafe.d.ts +1 -1
  155. package/dist/esm/reflect/unsafe.js +38 -43
  156. package/dist/esm/{reflect/registry.d.ts → registry.d.ts} +2 -2
  157. package/dist/esm/{reflect/registry.js → registry.js} +90 -63
  158. package/dist/esm/to-binary.d.ts +1 -1
  159. package/dist/esm/to-binary.js +2 -4
  160. package/dist/esm/to-json.d.ts +7 -6
  161. package/dist/esm/to-json.js +48 -55
  162. package/dist/esm/types.d.ts +1 -1
  163. package/dist/esm/wire/base64-encoding.js +4 -4
  164. package/dist/esm/wire/binary-encoding.d.ts +25 -3
  165. package/dist/esm/wire/binary-encoding.js +63 -11
  166. package/dist/esm/wire/size-delimited.d.ts +1 -1
  167. package/dist/esm/wire/text-format.d.ts +1 -2
  168. package/dist/esm/wire/text-format.js +5 -3
  169. package/dist/esm/wkt/any.d.ts +3 -3
  170. package/dist/esm/wkt/gen/google/protobuf/any_pb.d.ts +7 -0
  171. package/dist/esm/wkt/gen/google/protobuf/any_pb.js +7 -2
  172. package/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +15 -0
  173. package/dist/esm/wkt/gen/google/protobuf/api_pb.js +15 -6
  174. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +22 -0
  175. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.js +22 -9
  176. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +192 -0
  177. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +187 -84
  178. package/dist/esm/wkt/gen/google/protobuf/duration_pb.d.ts +7 -0
  179. package/dist/esm/wkt/gen/google/protobuf/duration_pb.js +7 -2
  180. package/dist/esm/wkt/gen/google/protobuf/empty_pb.d.ts +7 -0
  181. package/dist/esm/wkt/gen/google/protobuf/empty_pb.js +7 -2
  182. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -0
  183. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.js +7 -2
  184. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.d.ts +7 -0
  185. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.js +7 -2
  186. package/dist/esm/wkt/gen/google/protobuf/struct_pb.d.ts +18 -0
  187. package/dist/esm/wkt/gen/google/protobuf/struct_pb.js +18 -7
  188. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -0
  189. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.js +7 -2
  190. package/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +32 -0
  191. package/dist/esm/wkt/gen/google/protobuf/type_pb.js +32 -13
  192. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.d.ts +39 -0
  193. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.js +39 -18
  194. package/dist/esm/wkt/wrappers.d.ts +1 -1
  195. package/package.json +2 -2
  196. package/dist/cjs/desc-types.js +0 -15
  197. package/dist/cjs/reflect/assert.d.ts +0 -16
  198. package/dist/cjs/reflect/assert.js +0 -59
  199. package/dist/esm/desc-types.js +0 -14
  200. package/dist/esm/reflect/assert.d.ts +0 -16
  201. package/dist/esm/reflect/assert.js +0 -52
@@ -14,11 +14,11 @@
14
14
  // limitations under the License.
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.maximumEdition = exports.minimumEdition = exports.createFileRegistry = exports.createRegistry = void 0;
17
- const assert_js_1 = require("./assert.js");
18
- const text_format_js_1 = require("../wire/text-format.js");
19
- const scalar_js_1 = require("./scalar.js");
20
- const nested_types_js_1 = require("./nested-types.js");
21
- const unsafe_js_1 = require("./unsafe.js");
17
+ const descriptors_js_1 = require("./descriptors.js");
18
+ const text_format_js_1 = require("./wire/text-format.js");
19
+ const nested_types_js_1 = require("./reflect/nested-types.js");
20
+ const unsafe_js_1 = require("./reflect/unsafe.js");
21
+ const names_js_1 = require("./reflect/names.js");
22
22
  /**
23
23
  * Create a registry from the given inputs.
24
24
  *
@@ -205,8 +205,6 @@ const TYPE_BYTES = 12;
205
205
  const TYPE_ENUM = 14;
206
206
  // bootstrap-inject google.protobuf.FieldDescriptorProto.Label.LABEL_REPEATED: const $name: FieldDescriptorProto_Label.$localName = $number;
207
207
  const LABEL_REPEATED = 3;
208
- // bootstrap-inject google.protobuf.FieldDescriptorProto.Label.LABEL_OPTIONAL: const $name: FieldDescriptorProto_Label.$localName = $number;
209
- const LABEL_OPTIONAL = 1;
210
208
  // bootstrap-inject google.protobuf.FieldDescriptorProto.Label.LABEL_REQUIRED: const $name: FieldDescriptorProto_Label.$localName = $number;
211
209
  const LABEL_REQUIRED = 2;
212
210
  // bootstrap-inject google.protobuf.FieldOptions.JSType.JS_STRING: const $name: FieldOptions_JSType.$localName = $number;
@@ -215,6 +213,8 @@ const JS_STRING = 1;
215
213
  const IDEMPOTENCY_UNKNOWN = 0;
216
214
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.EXPLICIT: const $name: FeatureSet_FieldPresence.$localName = $number;
217
215
  const EXPLICIT = 1;
216
+ // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.IMPLICIT: const $name: FeatureSet_FieldPresence.$localName = $number;
217
+ const IMPLICIT = 2;
218
218
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.LEGACY_REQUIRED: const $name: FeatureSet_FieldPresence.$localName = $number;
219
219
  const LEGACY_REQUIRED = 3;
220
220
  // bootstrap-inject google.protobuf.FeatureSet.RepeatedFieldEncoding.PACKED: const $name: FeatureSet_RepeatedFieldEncoding.$localName = $number;
@@ -225,7 +225,7 @@ const DELIMITED = 2;
225
225
  const OPEN = 1;
226
226
  // prettier-ignore
227
227
  // bootstrap-inject defaults: EDITION_PROTO2 to EDITION_2023: export const minimumEdition: SupportedEdition = $minimumEdition, maximumEdition: SupportedEdition = $maximumEdition;
228
- // generated from protoc v27.0-rc1
228
+ // generated from protoc v27.0
229
229
  exports.minimumEdition = 998, exports.maximumEdition = 1000;
230
230
  const featureDefaults = {
231
231
  // EDITION_PROTO2
@@ -266,7 +266,7 @@ function addFile(proto, reg) {
266
266
  proto,
267
267
  deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
268
268
  edition: getFileEdition(proto),
269
- name: proto.name.replace(/\.proto/, ""),
269
+ name: proto.name.replace(/\.proto$/, ""),
270
270
  dependencies: findFileDependencies(proto, reg),
271
271
  enums: [],
272
272
  messages: [],
@@ -274,7 +274,7 @@ function addFile(proto, reg) {
274
274
  services: [],
275
275
  toString() {
276
276
  // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- we asserted above
277
- return `file ${this.proto.name}`;
277
+ return `file ${proto.name}`;
278
278
  },
279
279
  };
280
280
  const mapEntriesStore = new Map();
@@ -284,7 +284,7 @@ function addFile(proto, reg) {
284
284
  },
285
285
  add(desc) {
286
286
  var _a;
287
- (0, assert_js_1.assert)(((_a = desc.proto.options) === null || _a === void 0 ? void 0 : _a.mapEntry) === true);
287
+ assert(((_a = desc.proto.options) === null || _a === void 0 ? void 0 : _a.mapEntry) === true);
288
288
  mapEntriesStore.set(desc.typeName, desc);
289
289
  },
290
290
  };
@@ -345,6 +345,7 @@ function addFields(message, reg, mapEntries) {
345
345
  const oneof = findOneof(proto, allOneofs);
346
346
  const field = newField(proto, message, reg, oneof, mapEntries);
347
347
  message.fields.push(field);
348
+ message.field[field.localName] = field;
348
349
  if (oneof === undefined) {
349
350
  message.members.push(field);
350
351
  }
@@ -369,6 +370,7 @@ function addFields(message, reg, mapEntries) {
369
370
  */
370
371
  function addEnum(proto, file, parent, reg) {
371
372
  var _a, _b, _c;
373
+ const sharedPrefix = findEnumSharedPrefix(proto.name, proto.value);
372
374
  const desc = {
373
375
  kind: "enum",
374
376
  proto,
@@ -379,7 +381,7 @@ function addEnum(proto, file, parent, reg) {
379
381
  name: proto.name,
380
382
  typeName: makeTypeName(proto, parent, file),
381
383
  values: [],
382
- sharedPrefix: findEnumSharedPrefix(proto.name, proto.value.map((v) => v.name)),
384
+ sharedPrefix,
383
385
  toString() {
384
386
  return `enum ${this.typeName}`;
385
387
  },
@@ -388,12 +390,14 @@ function addEnum(proto, file, parent, reg) {
388
390
  reg.add(desc);
389
391
  proto.value.forEach((proto) => {
390
392
  var _a, _b;
393
+ const name = proto.name;
391
394
  desc.values.push({
392
395
  kind: "enum_value",
393
396
  proto,
394
397
  deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
395
398
  parent: desc,
396
399
  name: proto.name,
400
+ localName: (0, names_js_1.safeObjectProperty)(sharedPrefix == undefined ? name : name.substring(sharedPrefix.length)),
397
401
  number: proto.number,
398
402
  toString() {
399
403
  return `enum value ${desc.typeName}.${this.name}`;
@@ -417,6 +421,7 @@ function addMessage(proto, file, parent, reg, mapEntries) {
417
421
  name: proto.name,
418
422
  typeName: makeTypeName(proto, parent, file),
419
423
  fields: [],
424
+ field: {},
420
425
  oneofs: [],
421
426
  members: [],
422
427
  nestedEnums: [],
@@ -454,6 +459,7 @@ function addService(proto, file, reg) {
454
459
  name: proto.name,
455
460
  typeName: makeTypeName(proto, undefined, file),
456
461
  methods: [],
462
+ method: {},
457
463
  toString() {
458
464
  return `service ${this.typeName}`;
459
465
  },
@@ -461,7 +467,9 @@ function addService(proto, file, reg) {
461
467
  file.services.push(desc);
462
468
  reg.add(desc);
463
469
  for (const methodProto of proto.method) {
464
- desc.methods.push(newMethod(methodProto, desc, reg));
470
+ const method = newMethod(methodProto, desc, reg);
471
+ desc.methods.push(method);
472
+ desc.method[method.localName] = method;
465
473
  }
466
474
  }
467
475
  /**
@@ -484,8 +492,8 @@ function newMethod(proto, parent, reg) {
484
492
  }
485
493
  const input = reg.getMessage(trimLeadingDot(proto.inputType));
486
494
  const output = reg.getMessage(trimLeadingDot(proto.outputType));
487
- (0, assert_js_1.assert)(input, `invalid MethodDescriptorProto: input_type ${proto.inputType} not found`);
488
- (0, assert_js_1.assert)(output, `invalid MethodDescriptorProto: output_type ${proto.inputType} not found`);
495
+ assert(input, `invalid MethodDescriptorProto: input_type ${proto.inputType} not found`);
496
+ assert(output, `invalid MethodDescriptorProto: output_type ${proto.inputType} not found`);
489
497
  const name = proto.name;
490
498
  return {
491
499
  kind: "rpc",
@@ -493,6 +501,9 @@ function newMethod(proto, parent, reg) {
493
501
  deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
494
502
  parent,
495
503
  name,
504
+ localName: (0, names_js_1.safeObjectProperty)(name.length
505
+ ? (0, names_js_1.safeObjectProperty)(name[0].toLowerCase() + name.substring(1))
506
+ : name),
496
507
  methodKind,
497
508
  input,
498
509
  output,
@@ -513,6 +524,7 @@ function newOneof(proto, parent) {
513
524
  parent,
514
525
  fields: [],
515
526
  name: proto.name,
527
+ localName: (0, names_js_1.safeObjectProperty)((0, names_js_1.protoCamelCase)(proto.name)),
516
528
  toString() {
517
529
  return `oneof ${parent.typeName}.${this.name}`;
518
530
  },
@@ -520,7 +532,9 @@ function newOneof(proto, parent) {
520
532
  }
521
533
  function newField(proto, parentOrFile, reg, oneof, mapEntries) {
522
534
  var _a, _b, _c;
535
+ const isExtension = mapEntries === undefined;
523
536
  const field = {
537
+ kind: "field",
524
538
  proto,
525
539
  deprecated: (_b = (_a = proto.options) === null || _a === void 0 ? void 0 : _a.deprecated) !== null && _b !== void 0 ? _b : false,
526
540
  name: proto.name,
@@ -528,8 +542,16 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
528
542
  scalar: undefined,
529
543
  message: undefined,
530
544
  enum: undefined,
545
+ presence: getFieldPresence(proto, oneof, isExtension, parentOrFile),
546
+ listKind: undefined,
547
+ mapKind: undefined,
548
+ mapKey: undefined,
549
+ delimitedEncoding: undefined,
550
+ packed: undefined,
551
+ longAsString: false,
552
+ getDefaultValue: undefined,
531
553
  };
532
- if (mapEntries === undefined) {
554
+ if (isExtension) {
533
555
  // extension field
534
556
  const file = parentOrFile.kind == "file" ? parentOrFile : parentOrFile.file;
535
557
  const parent = parentOrFile.kind == "file" ? undefined : parentOrFile;
@@ -542,16 +564,18 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
542
564
  field.jsonName = `[${typeName}]`; // option json_name is not allowed on extension fields
543
565
  field.toString = () => `extension ${typeName}`;
544
566
  const extendee = reg.getMessage(trimLeadingDot(proto.extendee));
545
- (0, assert_js_1.assert)(extendee, `invalid FieldDescriptorProto: extendee ${proto.extendee} not found`);
567
+ assert(extendee, `invalid FieldDescriptorProto: extendee ${proto.extendee} not found`);
546
568
  field.extendee = extendee;
547
569
  }
548
570
  else {
549
571
  // regular field
550
572
  const parent = parentOrFile;
551
- (0, assert_js_1.assert)(parent.kind == "message");
552
- field.kind = "field";
573
+ assert(parent.kind == "message");
553
574
  field.parent = parent;
554
575
  field.oneof = oneof;
576
+ field.localName = oneof
577
+ ? (0, names_js_1.protoCamelCase)(proto.name)
578
+ : (0, names_js_1.safeObjectProperty)((0, names_js_1.protoCamelCase)(proto.name));
555
579
  field.jsonName = proto.jsonName;
556
580
  field.toString = () => `field ${parent.typeName}.${proto.name}`;
557
581
  }
@@ -566,21 +590,13 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
566
590
  if (mapEntry) {
567
591
  // map field
568
592
  field.fieldKind = "map";
569
- const keyField = mapEntry.fields.find((f) => f.number === 1);
570
- (0, assert_js_1.assert)(keyField);
571
- (0, assert_js_1.assert)(keyField.fieldKind == "scalar");
572
- (0, assert_js_1.assert)(keyField.scalar != scalar_js_1.ScalarType.BYTES &&
573
- keyField.scalar != scalar_js_1.ScalarType.FLOAT &&
574
- keyField.scalar != scalar_js_1.ScalarType.DOUBLE);
575
- const valueField = mapEntry.fields.find((f) => f.proto.number === 2);
576
- (0, assert_js_1.assert)(valueField);
577
- (0, assert_js_1.assert)(valueField.fieldKind != "list" && valueField.fieldKind != "map");
578
- field.mapKey = keyField.scalar;
579
- field.mapKind = valueField.fieldKind;
580
- field.message = valueField.message;
593
+ const { key, value } = findMapEntryFields(mapEntry);
594
+ field.mapKey = key.scalar;
595
+ field.mapKind = value.fieldKind;
596
+ field.message = value.message;
581
597
  field.delimitedEncoding = false; // map fields are always LENGTH_PREFIXED
582
- field.enum = valueField.enum;
583
- field.scalar = valueField.scalar;
598
+ field.enum = value.enum;
599
+ field.scalar = value.scalar;
584
600
  return field;
585
601
  }
586
602
  // list field
@@ -590,19 +606,18 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
590
606
  case TYPE_GROUP:
591
607
  field.listKind = "message";
592
608
  field.message = reg.getMessage(trimLeadingDot(proto.typeName));
593
- (0, assert_js_1.assert)(field.message);
609
+ assert(field.message);
594
610
  field.delimitedEncoding = isDelimitedEncoding(proto, parentOrFile);
595
611
  break;
596
612
  case TYPE_ENUM:
597
613
  field.listKind = "enum";
598
614
  field.enum = reg.getEnum(trimLeadingDot(proto.typeName));
599
- (0, assert_js_1.assert)(field.enum);
615
+ assert(field.enum);
600
616
  break;
601
617
  default:
602
618
  field.listKind = "scalar";
603
619
  field.scalar = type;
604
- field.longType =
605
- jstype == JS_STRING ? scalar_js_1.LongType.STRING : scalar_js_1.LongType.BIGINT;
620
+ field.longAsString = jstype == JS_STRING;
606
621
  break;
607
622
  }
608
623
  field.packed = isPackedField(proto, parentOrFile);
@@ -614,13 +629,13 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
614
629
  case TYPE_GROUP:
615
630
  field.fieldKind = "message";
616
631
  field.message = reg.getMessage(trimLeadingDot(proto.typeName));
617
- (0, assert_js_1.assert)(field.message, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
632
+ assert(field.message, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
618
633
  field.delimitedEncoding = isDelimitedEncoding(proto, parentOrFile);
619
634
  field.getDefaultValue = () => undefined;
620
635
  break;
621
636
  case TYPE_ENUM: {
622
637
  const enumeration = reg.getEnum(trimLeadingDot(proto.typeName));
623
- (0, assert_js_1.assert)(enumeration !== undefined, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
638
+ assert(enumeration !== undefined, `invalid FieldDescriptorProto: type_name ${proto.typeName} not found`);
624
639
  field.fieldKind = "enum";
625
640
  field.enum = reg.getEnum(trimLeadingDot(proto.typeName));
626
641
  field.getDefaultValue = () => {
@@ -633,7 +648,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
633
648
  default: {
634
649
  field.fieldKind = "scalar";
635
650
  field.scalar = type;
636
- field.longType = jstype == JS_STRING ? scalar_js_1.LongType.STRING : scalar_js_1.LongType.BIGINT;
651
+ field.longAsString = jstype == JS_STRING;
637
652
  field.getDefaultValue = () => {
638
653
  return (0, unsafe_js_1.unsafeIsSetExplicit)(proto, "defaultValue")
639
654
  ? (0, text_format_js_1.parseTextFormatScalarValue)(type, proto.defaultValue)
@@ -642,8 +657,6 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
642
657
  break;
643
658
  }
644
659
  }
645
- field.presence = getFieldPresence(proto, oneof, parentOrFile);
646
- field.optional = isOptionalField(field);
647
660
  return field;
648
661
  }
649
662
  /**
@@ -682,13 +695,13 @@ function findFileDependencies(proto, reg) {
682
695
  * Finds a prefix shared by enum values, for example `my_enum_` for
683
696
  * `enum MyEnum {MY_ENUM_A=0; MY_ENUM_B=1;}`.
684
697
  */
685
- function findEnumSharedPrefix(enumName, valueNames) {
698
+ function findEnumSharedPrefix(enumName, values) {
686
699
  const prefix = camelToSnakeCase(enumName) + "_";
687
- for (const name of valueNames) {
688
- if (!name.toLowerCase().startsWith(prefix)) {
700
+ for (const value of values) {
701
+ if (!value.name.toLowerCase().startsWith(prefix)) {
689
702
  return undefined;
690
703
  }
691
- const shortName = name.substring(prefix.length);
704
+ const shortName = value.name.substring(prefix.length);
692
705
  if (shortName.length == 0) {
693
706
  return undefined;
694
707
  }
@@ -753,46 +766,35 @@ function findOneof(proto, allOneofs) {
753
766
  return undefined;
754
767
  }
755
768
  const oneof = allOneofs[proto.oneofIndex];
756
- (0, assert_js_1.assert)(oneof, `invalid FieldDescriptorProto: oneof #${proto.oneofIndex} for field #${proto.number} not found`);
769
+ assert(oneof, `invalid FieldDescriptorProto: oneof #${proto.oneofIndex} for field #${proto.number} not found`);
757
770
  return oneof;
758
771
  }
759
772
  /**
760
773
  * Presence of the field.
761
774
  * See https://protobuf.dev/programming-guides/field_presence/
762
775
  */
763
- function getFieldPresence(proto, oneof, parent) {
776
+ function getFieldPresence(proto, oneof, isExtension, parent) {
764
777
  if (proto.label == LABEL_REQUIRED) {
765
778
  // proto2 required is LEGACY_REQUIRED
766
779
  return LEGACY_REQUIRED;
767
780
  }
768
- const { edition } = parent.kind == "message" ? parent.file : parent;
769
- if (edition == EDITION_PROTO3) {
770
- // proto3 oneof and optional are explicit
771
- if (oneof != undefined || proto.proto3Optional) {
772
- return EXPLICIT;
773
- }
774
- // proto3 singular message is explicit
775
- const singularMessage = proto.label != LABEL_REPEATED && proto.type == TYPE_MESSAGE;
776
- if (singularMessage) {
777
- return EXPLICIT;
778
- }
781
+ if (proto.label == LABEL_REPEATED) {
782
+ // repeated fields (including maps) do not track presence
783
+ return IMPLICIT;
779
784
  }
780
- // also resolves proto2/proto3 defaults
781
- return resolveFeature("fieldPresence", { proto, parent });
782
- }
783
- /**
784
- * Did the user use the `optional` keyword?
785
- */
786
- function isOptionalField(field) {
787
- const edition = (field.kind == "extension" ? field.file : field.parent.file)
788
- .edition;
789
- if (edition == EDITION_PROTO2) {
790
- return !field.oneof && field.proto.label == LABEL_OPTIONAL;
785
+ if (!!oneof || proto.proto3Optional) {
786
+ // oneof is always explicit
787
+ return EXPLICIT;
791
788
  }
792
- if (edition == EDITION_PROTO3) {
793
- return field.proto.proto3Optional;
789
+ if (proto.type == TYPE_MESSAGE) {
790
+ // singular message field cannot be implicit
791
+ return EXPLICIT;
794
792
  }
795
- return false;
793
+ if (isExtension) {
794
+ // extensions always track presence
795
+ return EXPLICIT;
796
+ }
797
+ return resolveFeature("fieldPresence", { proto, parent });
796
798
  }
797
799
  /**
798
800
  * Pack this repeated field?
@@ -821,6 +823,22 @@ function isPackedField(proto, parent) {
821
823
  parent,
822
824
  }));
823
825
  }
826
+ /**
827
+ * Find the key and value fields of a synthetic map entry message.
828
+ */
829
+ function findMapEntryFields(mapEntry) {
830
+ const key = mapEntry.fields.find((f) => f.number === 1);
831
+ const value = mapEntry.fields.find((f) => f.number === 2);
832
+ assert(key &&
833
+ key.fieldKind == "scalar" &&
834
+ key.scalar != descriptors_js_1.ScalarType.BYTES &&
835
+ key.scalar != descriptors_js_1.ScalarType.FLOAT &&
836
+ key.scalar != descriptors_js_1.ScalarType.DOUBLE &&
837
+ value &&
838
+ value.fieldKind != "list" &&
839
+ value.fieldKind != "map");
840
+ return { key, value };
841
+ }
824
842
  /**
825
843
  * Enumerations can be open or closed.
826
844
  * See https://protobuf.dev/programming-guides/enum/
@@ -868,3 +886,12 @@ function resolveFeature(name, ref) {
868
886
  }
869
887
  return resolveFeature(name, ref.parent);
870
888
  }
889
+ /**
890
+ * Assert that condition is truthy or throw error (with message)
891
+ */
892
+ function assert(condition, msg) {
893
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions -- we want the implicit conversion to boolean
894
+ if (!condition) {
895
+ throw new Error(msg);
896
+ }
897
+ }
@@ -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.
@@ -16,7 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.writeField = exports.toBinary = void 0;
17
17
  const reflect_js_1 = require("./reflect/reflect.js");
18
18
  const binary_encoding_js_1 = require("./wire/binary-encoding.js");
19
- const scalar_js_1 = require("./reflect/scalar.js");
19
+ const descriptors_js_1 = require("./descriptors.js");
20
20
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.LEGACY_REQUIRED: const $name: FeatureSet_FieldPresence.$localName = $number;
21
21
  const LEGACY_REQUIRED = 3;
22
22
  // Default options for serializing binary data.
@@ -34,9 +34,7 @@ function writeFields(writer, opts, msg) {
34
34
  var _a;
35
35
  for (const f of msg.sortedFields) {
36
36
  if (!msg.isSet(f)) {
37
- if (f.fieldKind != "map" &&
38
- f.fieldKind != "list" &&
39
- f.presence == LEGACY_REQUIRED) {
37
+ if (f.presence == LEGACY_REQUIRED) {
40
38
  throw new Error(`cannot encode field ${msg.desc.typeName}.${f.name} to binary: required field not set`);
41
39
  }
42
40
  continue;
@@ -58,7 +56,7 @@ function writeField(writer, opts, msg, field) {
58
56
  switch (field.fieldKind) {
59
57
  case "scalar":
60
58
  case "enum":
61
- writeScalar(writer, (_a = field.scalar) !== null && _a !== void 0 ? _a : scalar_js_1.ScalarType.INT32, field.number, msg.get(field));
59
+ writeScalar(writer, (_a = field.scalar) !== null && _a !== void 0 ? _a : descriptors_js_1.ScalarType.INT32, field.number, msg.get(field));
62
60
  break;
63
61
  case "list":
64
62
  writeListField(writer, opts, field, msg.get(field));
@@ -93,7 +91,7 @@ function writeListField(writer, opts, field, list) {
93
91
  }
94
92
  return;
95
93
  }
96
- const scalarType = (_a = field.scalar) !== null && _a !== void 0 ? _a : scalar_js_1.ScalarType.INT32;
94
+ const scalarType = (_a = field.scalar) !== null && _a !== void 0 ? _a : descriptors_js_1.ScalarType.INT32;
97
95
  if (field.packed) {
98
96
  if (!list.size) {
99
97
  return;
@@ -118,7 +116,7 @@ function writeMapEntry(writer, opts, field, key, value) {
118
116
  switch (field.mapKind) {
119
117
  case "scalar":
120
118
  case "enum":
121
- writeScalar(writer, (_a = field.scalar) !== null && _a !== void 0 ? _a : scalar_js_1.ScalarType.INT32, 2, value);
119
+ writeScalar(writer, (_a = field.scalar) !== null && _a !== void 0 ? _a : descriptors_js_1.ScalarType.INT32, 2, value);
122
120
  break;
123
121
  case "message":
124
122
  writeFields(writer.tag(2, binary_encoding_js_1.WireType.LengthDelimited).fork(), opts, value).join();
@@ -128,65 +126,65 @@ function writeMapEntry(writer, opts, field, key, value) {
128
126
  }
129
127
  function writeScalarValue(writer, type, value) {
130
128
  switch (type) {
131
- case scalar_js_1.ScalarType.STRING:
129
+ case descriptors_js_1.ScalarType.STRING:
132
130
  writer.string(value);
133
131
  break;
134
- case scalar_js_1.ScalarType.BOOL:
132
+ case descriptors_js_1.ScalarType.BOOL:
135
133
  writer.bool(value);
136
134
  break;
137
- case scalar_js_1.ScalarType.DOUBLE:
135
+ case descriptors_js_1.ScalarType.DOUBLE:
138
136
  writer.double(value);
139
137
  break;
140
- case scalar_js_1.ScalarType.FLOAT:
138
+ case descriptors_js_1.ScalarType.FLOAT:
141
139
  writer.float(value);
142
140
  break;
143
- case scalar_js_1.ScalarType.INT32:
141
+ case descriptors_js_1.ScalarType.INT32:
144
142
  writer.int32(value);
145
143
  break;
146
- case scalar_js_1.ScalarType.INT64:
144
+ case descriptors_js_1.ScalarType.INT64:
147
145
  writer.int64(value);
148
146
  break;
149
- case scalar_js_1.ScalarType.UINT64:
147
+ case descriptors_js_1.ScalarType.UINT64:
150
148
  writer.uint64(value);
151
149
  break;
152
- case scalar_js_1.ScalarType.FIXED64:
150
+ case descriptors_js_1.ScalarType.FIXED64:
153
151
  writer.fixed64(value);
154
152
  break;
155
- case scalar_js_1.ScalarType.BYTES:
153
+ case descriptors_js_1.ScalarType.BYTES:
156
154
  writer.bytes(value);
157
155
  break;
158
- case scalar_js_1.ScalarType.FIXED32:
156
+ case descriptors_js_1.ScalarType.FIXED32:
159
157
  writer.fixed32(value);
160
158
  break;
161
- case scalar_js_1.ScalarType.SFIXED32:
159
+ case descriptors_js_1.ScalarType.SFIXED32:
162
160
  writer.sfixed32(value);
163
161
  break;
164
- case scalar_js_1.ScalarType.SFIXED64:
162
+ case descriptors_js_1.ScalarType.SFIXED64:
165
163
  writer.sfixed64(value);
166
164
  break;
167
- case scalar_js_1.ScalarType.SINT64:
165
+ case descriptors_js_1.ScalarType.SINT64:
168
166
  writer.sint64(value);
169
167
  break;
170
- case scalar_js_1.ScalarType.UINT32:
168
+ case descriptors_js_1.ScalarType.UINT32:
171
169
  writer.uint32(value);
172
170
  break;
173
- case scalar_js_1.ScalarType.SINT32:
171
+ case descriptors_js_1.ScalarType.SINT32:
174
172
  writer.sint32(value);
175
173
  break;
176
174
  }
177
175
  }
178
176
  function writeTypeOfScalar(type) {
179
177
  switch (type) {
180
- case scalar_js_1.ScalarType.BYTES:
181
- case scalar_js_1.ScalarType.STRING:
178
+ case descriptors_js_1.ScalarType.BYTES:
179
+ case descriptors_js_1.ScalarType.STRING:
182
180
  return binary_encoding_js_1.WireType.LengthDelimited;
183
- case scalar_js_1.ScalarType.DOUBLE:
184
- case scalar_js_1.ScalarType.FIXED64:
185
- case scalar_js_1.ScalarType.SFIXED64:
181
+ case descriptors_js_1.ScalarType.DOUBLE:
182
+ case descriptors_js_1.ScalarType.FIXED64:
183
+ case descriptors_js_1.ScalarType.SFIXED64:
186
184
  return binary_encoding_js_1.WireType.Bit64;
187
- case scalar_js_1.ScalarType.FIXED32:
188
- case scalar_js_1.ScalarType.SFIXED32:
189
- case scalar_js_1.ScalarType.FLOAT:
185
+ case descriptors_js_1.ScalarType.FIXED32:
186
+ case descriptors_js_1.ScalarType.SFIXED32:
187
+ case descriptors_js_1.ScalarType.FLOAT:
190
188
  return binary_encoding_js_1.WireType.Bit32;
191
189
  default:
192
190
  return binary_encoding_js_1.WireType.Varint;
@@ -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