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

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 (125) hide show
  1. package/README.md +2 -3
  2. package/dist/cjs/clone.d.ts +1 -1
  3. package/dist/cjs/clone.js +5 -16
  4. package/dist/cjs/codegenv1/embed.js +25 -25
  5. package/dist/cjs/codegenv1/enum.d.ts +2 -1
  6. package/dist/cjs/codegenv1/file.js +1 -1
  7. package/dist/cjs/codegenv1/message.d.ts +2 -1
  8. package/dist/cjs/codegenv1/scalar.d.ts +4 -0
  9. package/dist/cjs/codegenv1/scalar.js +30 -1
  10. package/dist/cjs/codegenv1/symbols.d.ts +10 -0
  11. package/dist/cjs/codegenv1/symbols.js +2 -0
  12. package/dist/cjs/codegenv1/types.d.ts +7 -5
  13. package/dist/cjs/codegenv1/types.js +2 -1
  14. package/dist/cjs/create.d.ts +1 -1
  15. package/dist/cjs/create.js +47 -20
  16. package/dist/cjs/equals.d.ts +1 -1
  17. package/dist/cjs/equals.js +8 -15
  18. package/dist/cjs/from-binary.d.ts +2 -2
  19. package/dist/cjs/from-binary.js +6 -6
  20. package/dist/cjs/from-json.d.ts +14 -6
  21. package/dist/cjs/from-json.js +35 -33
  22. package/dist/cjs/is-message.d.ts +1 -1
  23. package/dist/cjs/is-message.js +3 -3
  24. package/dist/cjs/reflect/reflect-types.d.ts +13 -42
  25. package/dist/cjs/reflect/reflect.d.ts +29 -18
  26. package/dist/cjs/reflect/reflect.js +169 -45
  27. package/dist/cjs/reflect/scalar.d.ts +1 -1
  28. package/dist/cjs/registry.d.ts +18 -2
  29. package/dist/cjs/registry.js +63 -61
  30. package/dist/cjs/to-binary.d.ts +1 -1
  31. package/dist/cjs/to-binary.js +2 -2
  32. package/dist/cjs/to-json.d.ts +14 -4
  33. package/dist/cjs/to-json.js +26 -13
  34. package/dist/cjs/types.d.ts +9 -0
  35. package/dist/cjs/wire/size-delimited.d.ts +1 -1
  36. package/dist/cjs/wkt/any.d.ts +7 -7
  37. package/dist/cjs/wkt/any.js +5 -5
  38. package/dist/cjs/wkt/gen/google/protobuf/any_pb.d.ts +9 -3
  39. package/dist/cjs/wkt/gen/google/protobuf/any_pb.js +4 -4
  40. package/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +88 -9
  41. package/dist/cjs/wkt/gen/google/protobuf/api_pb.js +8 -8
  42. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +107 -11
  43. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.js +11 -11
  44. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +1005 -92
  45. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +86 -86
  46. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.d.ts +7 -3
  47. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.js +4 -4
  48. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.d.ts +7 -3
  49. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.js +4 -4
  50. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -3
  51. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.js +4 -4
  52. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.d.ts +12 -3
  53. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.js +4 -4
  54. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.d.ts +25 -8
  55. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.js +9 -9
  56. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -3
  57. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.js +4 -4
  58. package/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +165 -16
  59. package/dist/cjs/wkt/gen/google/protobuf/type_pb.js +15 -15
  60. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.d.ts +55 -19
  61. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.js +20 -20
  62. package/dist/cjs/wkt/timestamp.js +1 -2
  63. package/dist/esm/clone.d.ts +1 -1
  64. package/dist/esm/clone.js +5 -16
  65. package/dist/esm/codegenv1/embed.js +26 -26
  66. package/dist/esm/codegenv1/enum.d.ts +2 -1
  67. package/dist/esm/codegenv1/file.js +2 -2
  68. package/dist/esm/codegenv1/message.d.ts +2 -1
  69. package/dist/esm/codegenv1/scalar.d.ts +4 -0
  70. package/dist/esm/codegenv1/scalar.js +28 -0
  71. package/dist/esm/codegenv1/symbols.d.ts +10 -0
  72. package/dist/esm/codegenv1/symbols.js +2 -0
  73. package/dist/esm/codegenv1/types.d.ts +7 -5
  74. package/dist/esm/codegenv1/types.js +2 -1
  75. package/dist/esm/create.d.ts +1 -1
  76. package/dist/esm/create.js +47 -20
  77. package/dist/esm/equals.d.ts +1 -1
  78. package/dist/esm/equals.js +8 -15
  79. package/dist/esm/from-binary.d.ts +2 -2
  80. package/dist/esm/from-binary.js +6 -6
  81. package/dist/esm/from-json.d.ts +14 -6
  82. package/dist/esm/from-json.js +33 -33
  83. package/dist/esm/is-message.d.ts +1 -1
  84. package/dist/esm/is-message.js +3 -3
  85. package/dist/esm/reflect/reflect-types.d.ts +13 -42
  86. package/dist/esm/reflect/reflect-types.js +0 -1
  87. package/dist/esm/reflect/reflect.d.ts +29 -18
  88. package/dist/esm/reflect/reflect.js +170 -46
  89. package/dist/esm/reflect/scalar.d.ts +1 -1
  90. package/dist/esm/registry.d.ts +18 -2
  91. package/dist/esm/registry.js +61 -60
  92. package/dist/esm/to-binary.d.ts +1 -1
  93. package/dist/esm/to-binary.js +2 -2
  94. package/dist/esm/to-json.d.ts +14 -4
  95. package/dist/esm/to-json.js +24 -12
  96. package/dist/esm/types.d.ts +9 -0
  97. package/dist/esm/wire/size-delimited.d.ts +1 -1
  98. package/dist/esm/wkt/any.d.ts +7 -7
  99. package/dist/esm/wkt/any.js +6 -6
  100. package/dist/esm/wkt/gen/google/protobuf/any_pb.d.ts +9 -3
  101. package/dist/esm/wkt/gen/google/protobuf/any_pb.js +3 -3
  102. package/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +88 -9
  103. package/dist/esm/wkt/gen/google/protobuf/api_pb.js +9 -9
  104. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +107 -11
  105. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.js +11 -11
  106. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +1005 -92
  107. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +84 -84
  108. package/dist/esm/wkt/gen/google/protobuf/duration_pb.d.ts +7 -3
  109. package/dist/esm/wkt/gen/google/protobuf/duration_pb.js +3 -3
  110. package/dist/esm/wkt/gen/google/protobuf/empty_pb.d.ts +7 -3
  111. package/dist/esm/wkt/gen/google/protobuf/empty_pb.js +3 -3
  112. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -3
  113. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.js +3 -3
  114. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.d.ts +12 -3
  115. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.js +3 -3
  116. package/dist/esm/wkt/gen/google/protobuf/struct_pb.d.ts +25 -8
  117. package/dist/esm/wkt/gen/google/protobuf/struct_pb.js +8 -8
  118. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -3
  119. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.js +3 -3
  120. package/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +165 -16
  121. package/dist/esm/wkt/gen/google/protobuf/type_pb.js +16 -16
  122. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.d.ts +55 -19
  123. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.js +19 -19
  124. package/dist/esm/wkt/timestamp.js +2 -3
  125. package/package.json +8 -5
@@ -1,5 +1,6 @@
1
1
  import type { Message } from "../types.js";
2
2
  import type { DescEnum, DescExtension, DescField, DescFile, DescMessage, DescMethod, DescService } from "../descriptors.js";
3
+ import type { JsonValue } from "../json-value.js";
3
4
  /**
4
5
  * Describes a protobuf source file.
5
6
  *
@@ -14,9 +15,9 @@ export type GenDescFile = DescFile;
14
15
  *
15
16
  * @private
16
17
  */
17
- export type GenDescMessage<RuntimeShape extends Message> = Omit<DescMessage, "field"> & {
18
+ export type GenDescMessage<RuntimeShape extends Message, JsonType = JsonValue> = Omit<DescMessage, "field"> & {
18
19
  field: Record<MessageFieldNames<RuntimeShape>, DescField>;
19
- } & brand<RuntimeShape>;
20
+ } & brandv1<RuntimeShape, JsonType>;
20
21
  /**
21
22
  * Describes an enumeration in a protobuf source file.
22
23
  *
@@ -25,7 +26,7 @@ export type GenDescMessage<RuntimeShape extends Message> = Omit<DescMessage, "fi
25
26
  *
26
27
  * @private
27
28
  */
28
- export type GenDescEnum<RuntimeShape> = DescEnum & brand<RuntimeShape>;
29
+ export type GenDescEnum<RuntimeShape, JsonType extends JsonValue = JsonValue> = DescEnum & brandv1<RuntimeShape, JsonType>;
29
30
  /**
30
31
  * Describes an extension in a protobuf source file.
31
32
  *
@@ -34,7 +35,7 @@ export type GenDescEnum<RuntimeShape> = DescEnum & brand<RuntimeShape>;
34
35
  *
35
36
  * @private
36
37
  */
37
- export type GenDescExtension<Extendee extends Message = Message, RuntimeShape = unknown> = DescExtension & brand<Extendee, RuntimeShape>;
38
+ export type GenDescExtension<Extendee extends Message = Message, RuntimeShape = unknown> = DescExtension & brandv1<Extendee, RuntimeShape>;
38
39
  /**
39
40
  * Describes a service declaration in a protobuf source file.
40
41
  *
@@ -52,7 +53,8 @@ export type GenDescService<RuntimeShape extends GenDescServiceMethods> = Omit<De
52
53
  * @private
53
54
  */
54
55
  export type GenDescServiceMethods = Record<string, Pick<DescMethod, "input" | "output" | "methodKind">>;
55
- declare class brand<A, B = unknown> {
56
+ declare class brandv1<A, B = unknown> {
57
+ protected v: "codegenv1";
56
58
  protected a: A | boolean;
57
59
  protected b: B | boolean;
58
60
  }
@@ -11,8 +11,9 @@
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
- class brand {
14
+ class brandv1 {
15
15
  constructor() {
16
+ this.v = "codegenv1";
16
17
  this.a = false;
17
18
  this.b = false;
18
19
  }
@@ -6,4 +6,4 @@ import type { MessageInitShape, MessageShape } from "./types.js";
6
6
  * The second argument is an optional initializer object, where all fields are
7
7
  * optional.
8
8
  */
9
- export declare function create<Desc extends DescMessage>(messageDesc: Desc, init?: MessageInitShape<Desc>): MessageShape<Desc>;
9
+ export declare function create<Desc extends DescMessage>(schema: Desc, init?: MessageInitShape<Desc>): MessageShape<Desc>;
@@ -20,6 +20,8 @@ import { unsafeGet, unsafeOneofCase, unsafeSet } from "./reflect/unsafe.js";
20
20
  import { isWrapperDesc } from "./wkt/wrappers.js";
21
21
  // bootstrap-inject google.protobuf.Edition.EDITION_PROTO3: const $name: Edition.$localName = $number;
22
22
  const EDITION_PROTO3 = 999;
23
+ // bootstrap-inject google.protobuf.Edition.EDITION_PROTO2: const $name: Edition.$localName = $number;
24
+ const EDITION_PROTO2 = 998;
23
25
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.IMPLICIT: const $name: FeatureSet_FieldPresence.$localName = $number;
24
26
  const IMPLICIT = 2;
25
27
  /**
@@ -28,13 +30,13 @@ const IMPLICIT = 2;
28
30
  * The second argument is an optional initializer object, where all fields are
29
31
  * optional.
30
32
  */
31
- export function create(messageDesc, init) {
32
- if (isMessage(init, messageDesc)) {
33
+ export function create(schema, init) {
34
+ if (isMessage(init, schema)) {
33
35
  return init;
34
36
  }
35
- const message = createZeroMessage(messageDesc);
37
+ const message = createZeroMessage(schema);
36
38
  if (init !== undefined) {
37
- initMessage(messageDesc, message, init);
39
+ initMessage(schema, message, init);
38
40
  }
39
41
  return message;
40
42
  }
@@ -63,12 +65,7 @@ function initMessage(messageDesc, message, init) {
63
65
  // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- no need to convert enum
64
66
  switch (field.fieldKind) {
65
67
  case "message":
66
- if (isWrapperDesc(field.message)) {
67
- value = initScalar(field.message.fields[0], value);
68
- }
69
- else {
70
- value = toMessage(value, field.message);
71
- }
68
+ value = toMessage(field, value);
72
69
  break;
73
70
  case "scalar":
74
71
  value = initScalar(field, value);
@@ -96,7 +93,7 @@ function initMap(field, value) {
96
93
  return convertObjectValues(value, toU8Arr);
97
94
  }
98
95
  if (field.mapKind == "message") {
99
- return convertObjectValues(value, (val) => toMessage(val, field.message));
96
+ return convertObjectValues(value, (val) => toMessage(field, val));
100
97
  }
101
98
  }
102
99
  return value;
@@ -107,14 +104,29 @@ function initList(field, value) {
107
104
  return value.map(toU8Arr);
108
105
  }
109
106
  if (field.listKind == "message") {
110
- return value.map((item) => toMessage(item, field.message));
107
+ return value.map((item) => toMessage(field, item));
111
108
  }
112
109
  }
113
110
  return value;
114
111
  }
115
- function toMessage(value, message) {
116
- if (!isMessage(value, message) && isObject(value)) {
117
- return create(message, value);
112
+ function toMessage(field, value) {
113
+ if (field.fieldKind == "message" &&
114
+ !field.oneof &&
115
+ isWrapperDesc(field.message)) {
116
+ // Types from google/protobuf/wrappers.proto are unwrapped when used in
117
+ // a singular field that is not part of a oneof group.
118
+ return initScalar(field.message.fields[0], value);
119
+ }
120
+ if (isObject(value)) {
121
+ if (field.message.typeName == "google.protobuf.Struct" &&
122
+ field.parent.typeName !== "google.protobuf.Value") {
123
+ // google.protobuf.Struct is represented with JsonObject when used in a
124
+ // field, except when used in google.protobuf.Value.
125
+ return value;
126
+ }
127
+ if (!isMessage(value, field.message)) {
128
+ return create(field.message, value);
129
+ }
118
130
  }
119
131
  return value;
120
132
  }
@@ -136,9 +148,7 @@ const messagePrototypes = new WeakMap();
136
148
  */
137
149
  function createZeroMessage(desc) {
138
150
  let msg;
139
- if (desc.file.edition == EDITION_PROTO3) {
140
- // we special case proto3: since it does not have default values, we let
141
- // the `optional` keyword generate an optional property.
151
+ if (!needsPrototypeChain(desc)) {
142
152
  msg = {};
143
153
  for (const member of desc.members) {
144
154
  if (member.kind == "oneof" || member.presence == IMPLICIT) {
@@ -147,8 +157,7 @@ function createZeroMessage(desc) {
147
157
  }
148
158
  }
149
159
  else {
150
- // for everything but proto3, we support default values, and track presence
151
- // via the prototype chain
160
+ // Support default values and track presence via the prototype chain
152
161
  const cached = messagePrototypes.get(desc);
153
162
  let prototype;
154
163
  let members;
@@ -200,6 +209,24 @@ function createZeroMessage(desc) {
200
209
  msg.$typeName = desc.typeName;
201
210
  return msg;
202
211
  }
212
+ /**
213
+ * Do we need the prototype chain to track field presence?
214
+ */
215
+ function needsPrototypeChain(desc) {
216
+ switch (desc.file.edition) {
217
+ case EDITION_PROTO3:
218
+ // proto3 always uses implicit presence, we never need the prototype chain.
219
+ return false;
220
+ case EDITION_PROTO2:
221
+ // proto2 never uses implicit presence, we always need the prototype chain.
222
+ return true;
223
+ default:
224
+ // If a message uses scalar or enum fields with explicit presence, we need
225
+ // the prototype chain to track presence. This rule does not apply to fields
226
+ // in a oneof group - they use a different mechanism to track presence.
227
+ return desc.fields.some((f) => f.presence != IMPLICIT && f.fieldKind != "message" && !f.oneof);
228
+ }
229
+ }
203
230
  /**
204
231
  * Returns a zero value for oneof groups, and for every field kind except
205
232
  * messages. Scalar and enum fields can have default values.
@@ -6,4 +6,4 @@ import type { DescMessage } from "./descriptors.js";
6
6
  * Note that this function disregards extensions and unknown fields, and that
7
7
  * NaN is not equal NaN, following the IEEE standard.
8
8
  */
9
- export declare function equals<Desc extends DescMessage>(messageDesc: Desc, a: MessageShape<Desc>, b: MessageShape<Desc>): boolean;
9
+ export declare function equals<Desc extends DescMessage>(schema: Desc, a: MessageShape<Desc>, b: MessageShape<Desc>): boolean;
@@ -19,15 +19,14 @@ import { reflect } from "./reflect/reflect.js";
19
19
  * Note that this function disregards extensions and unknown fields, and that
20
20
  * NaN is not equal NaN, following the IEEE standard.
21
21
  */
22
- export function equals(messageDesc, a, b) {
23
- if (a.$typeName != messageDesc.typeName ||
24
- b.$typeName != messageDesc.typeName) {
22
+ export function equals(schema, a, b) {
23
+ if (a.$typeName != schema.typeName || b.$typeName != schema.typeName) {
25
24
  return false;
26
25
  }
27
26
  if (a === b) {
28
27
  return true;
29
28
  }
30
- return reflectEquals(reflect(messageDesc, a), reflect(messageDesc, b));
29
+ return reflectEquals(reflect(schema, a), reflect(schema, b));
31
30
  }
32
31
  function reflectEquals(a, b) {
33
32
  for (const f of a.fields) {
@@ -76,15 +75,11 @@ function fieldEquals(f, a, b) {
76
75
  case "enum":
77
76
  return false;
78
77
  case "message":
79
- // TODO fix type error
80
- // @ts-expect-error TODO
81
78
  if (!reflectEquals(va, vb)) {
82
79
  return false;
83
80
  }
84
81
  break;
85
82
  case "scalar":
86
- // TODO fix type error
87
- // @ts-expect-error TODO
88
83
  if (!scalarEquals(f.scalar, va, vb)) {
89
84
  return false;
90
85
  }
@@ -100,23 +95,21 @@ function fieldEquals(f, a, b) {
100
95
  return false;
101
96
  }
102
97
  for (let i = 0; i < la.size; i++) {
103
- if (la.get(i) === lb.get(i)) {
98
+ const va = la.get(i);
99
+ const vb = lb.get(i);
100
+ if (va === vb) {
104
101
  continue;
105
102
  }
106
103
  switch (f.listKind) {
107
104
  case "enum":
108
105
  return false;
109
106
  case "message":
110
- // TODO fix type error
111
- // @ts-expect-error TODO
112
- if (!reflectEquals(la.get(i), lb.get(i))) {
107
+ if (!reflectEquals(va, vb)) {
113
108
  return false;
114
109
  }
115
110
  break;
116
111
  case "scalar":
117
- // TODO fix type error
118
- // @ts-expect-error TODO
119
- if (!scalarEquals(f.scalar, la.get(i), lb.get(i))) {
112
+ if (!scalarEquals(f.scalar, va, vb)) {
120
113
  return false;
121
114
  }
122
115
  break;
@@ -17,7 +17,7 @@ export interface BinaryReadOptions {
17
17
  /**
18
18
  * Parse serialized binary data.
19
19
  */
20
- export declare function fromBinary<Desc extends DescMessage>(messageDesc: Desc, bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MessageShape<Desc>;
20
+ export declare function fromBinary<Desc extends DescMessage>(schema: Desc, bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MessageShape<Desc>;
21
21
  /**
22
22
  * Parse from binary data, merging fields.
23
23
  *
@@ -27,7 +27,7 @@ export declare function fromBinary<Desc extends DescMessage>(messageDesc: Desc,
27
27
  * If a message field is already present, it will be merged with the
28
28
  * new data.
29
29
  */
30
- export declare function mergeFromBinary<Desc extends DescMessage>(messageDesc: Desc, target: MessageShape<Desc>, bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MessageShape<Desc>;
30
+ export declare function mergeFromBinary<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MessageShape<Desc>;
31
31
  /**
32
32
  * @private
33
33
  */
@@ -25,8 +25,8 @@ function makeReadOptions(options) {
25
25
  /**
26
26
  * Parse serialized binary data.
27
27
  */
28
- export function fromBinary(messageDesc, bytes, options) {
29
- const msg = reflect(messageDesc);
28
+ export function fromBinary(schema, bytes, options) {
29
+ const msg = reflect(schema, undefined, false);
30
30
  readMessage(msg, new BinaryReader(bytes), makeReadOptions(options), false, bytes.byteLength);
31
31
  return msg.message;
32
32
  }
@@ -39,8 +39,8 @@ export function fromBinary(messageDesc, bytes, options) {
39
39
  * If a message field is already present, it will be merged with the
40
40
  * new data.
41
41
  */
42
- export function mergeFromBinary(messageDesc, target, bytes, options) {
43
- readMessage(reflect(messageDesc, target), new BinaryReader(bytes), makeReadOptions(options), false, bytes.byteLength);
42
+ export function mergeFromBinary(schema, target, bytes, options) {
43
+ readMessage(reflect(schema, target, false), new BinaryReader(bytes), makeReadOptions(options), false, bytes.byteLength);
44
44
  return target;
45
45
  }
46
46
  /**
@@ -140,7 +140,7 @@ function readMapEntry(reader, map, options) {
140
140
  val = field.enum.values[0].number;
141
141
  break;
142
142
  case "message":
143
- val = reflect(field.message);
143
+ val = reflect(field.message, undefined, false);
144
144
  break;
145
145
  }
146
146
  }
@@ -168,7 +168,7 @@ function readListField(reader, wireType, list, options) {
168
168
  }
169
169
  function readMessageField(reader, options, field, mergeMessage) {
170
170
  const delimited = field.delimitedEncoding;
171
- const message = mergeMessage !== null && mergeMessage !== void 0 ? mergeMessage : reflect(field.message);
171
+ const message = mergeMessage !== null && mergeMessage !== void 0 ? mergeMessage : reflect(field.message, undefined, false);
172
172
  readMessage(message, reader, options, delimited, delimited ? field.number : reader.uint32());
173
173
  return message;
174
174
  }
@@ -1,7 +1,7 @@
1
- import { type DescMessage } from "./descriptors.js";
1
+ import { type DescEnum, type DescMessage } from "./descriptors.js";
2
2
  import type { JsonValue } from "./json-value.js";
3
3
  import type { Registry } from "./registry.js";
4
- import type { MessageShape } from "./types.js";
4
+ import type { EnumJsonType, EnumShape, MessageShape } from "./types.js";
5
5
  /**
6
6
  * Options for parsing JSON data.
7
7
  */
@@ -21,7 +21,7 @@ export interface JsonReadOptions {
21
21
  /**
22
22
  * Parse a message from a JSON string.
23
23
  */
24
- export declare function fromJsonString<Desc extends DescMessage>(messageDesc: Desc, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
24
+ export declare function fromJsonString<Desc extends DescMessage>(schema: Desc, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
25
25
  /**
26
26
  * Parse a message from a JSON string, merging fields.
27
27
  *
@@ -31,11 +31,11 @@ export declare function fromJsonString<Desc extends DescMessage>(messageDesc: De
31
31
  * If a message field is already present, it will be merged with the
32
32
  * new data.
33
33
  */
34
- export declare function mergeFromJsonString<Desc extends DescMessage>(messageDesc: Desc, target: MessageShape<Desc>, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
34
+ export declare function mergeFromJsonString<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
35
35
  /**
36
36
  * Parse a message from a JSON value.
37
37
  */
38
- export declare function fromJson<Desc extends DescMessage>(messageDesc: Desc, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
38
+ export declare function fromJson<Desc extends DescMessage>(schema: Desc, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
39
39
  /**
40
40
  * Parse a message from a JSON value, merging fields.
41
41
  *
@@ -45,4 +45,12 @@ export declare function fromJson<Desc extends DescMessage>(messageDesc: Desc, js
45
45
  * If a message field is already present, it will be merged with the
46
46
  * new data.
47
47
  */
48
- export declare function mergeFromJson<Desc extends DescMessage>(messageDesc: Desc, target: MessageShape<Desc>, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
48
+ export declare function mergeFromJson<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
49
+ /**
50
+ * Parses an enum value from JSON.
51
+ */
52
+ export declare function enumFromJson<Desc extends DescEnum>(descEnum: Desc, json: EnumJsonType<Desc>): EnumShape<Desc>;
53
+ /**
54
+ * Is the given value a JSON enum value?
55
+ */
56
+ export declare function isEnumJson<Desc extends DescEnum>(descEnum: Desc, value: unknown): value is EnumJsonType<Desc>;
@@ -20,7 +20,7 @@ import { FieldError, isFieldError } from "./reflect/error.js";
20
20
  import { formatVal } from "./reflect/reflect-check.js";
21
21
  import { scalarZeroValue } from "./reflect/scalar.js";
22
22
  import { base64Decode } from "./wire/base64-encoding.js";
23
- import { isWrapperDesc, anyPack, ListValueDesc, NullValue, StructDesc, ValueDesc, } from "./wkt/index.js";
23
+ import { isWrapperDesc, anyPack, ListValueSchema, NullValue, StructSchema, ValueSchema, } from "./wkt/index.js";
24
24
  import { createExtensionContainer, setExtension } from "./extensions.js";
25
25
  // Default options for parsing JSON.
26
26
  const jsonReadDefaults = {
@@ -32,8 +32,8 @@ function makeReadOptions(options) {
32
32
  /**
33
33
  * Parse a message from a JSON string.
34
34
  */
35
- export function fromJsonString(messageDesc, json, options) {
36
- return fromJson(messageDesc, parseJsonString(json, messageDesc.typeName), options);
35
+ export function fromJsonString(schema, json, options) {
36
+ return fromJson(schema, parseJsonString(json, schema.typeName), options);
37
37
  }
38
38
  /**
39
39
  * Parse a message from a JSON string, merging fields.
@@ -44,14 +44,14 @@ export function fromJsonString(messageDesc, json, options) {
44
44
  * If a message field is already present, it will be merged with the
45
45
  * new data.
46
46
  */
47
- export function mergeFromJsonString(messageDesc, target, json, options) {
48
- return mergeFromJson(messageDesc, target, parseJsonString(json, messageDesc.typeName), options);
47
+ export function mergeFromJsonString(schema, target, json, options) {
48
+ return mergeFromJson(schema, target, parseJsonString(json, schema.typeName), options);
49
49
  }
50
50
  /**
51
51
  * Parse a message from a JSON value.
52
52
  */
53
- export function fromJson(messageDesc, json, options) {
54
- const msg = reflect(messageDesc);
53
+ export function fromJson(schema, json, options) {
54
+ const msg = reflect(schema);
55
55
  try {
56
56
  readMessage(msg, json, makeReadOptions(options));
57
57
  }
@@ -75,9 +75,9 @@ export function fromJson(messageDesc, json, options) {
75
75
  * If a message field is already present, it will be merged with the
76
76
  * new data.
77
77
  */
78
- export function mergeFromJson(messageDesc, target, json, options) {
78
+ export function mergeFromJson(schema, target, json, options) {
79
79
  try {
80
- readMessage(reflect(messageDesc, target), json, makeReadOptions(options));
80
+ readMessage(reflect(schema, target), json, makeReadOptions(options));
81
81
  }
82
82
  catch (e) {
83
83
  if (isFieldError(e)) {
@@ -90,6 +90,22 @@ export function mergeFromJson(messageDesc, target, json, options) {
90
90
  }
91
91
  return target;
92
92
  }
93
+ /**
94
+ * Parses an enum value from JSON.
95
+ */
96
+ export function enumFromJson(descEnum, json) {
97
+ const val = readEnum(descEnum, json, false, false);
98
+ if (val === tokenIgnoredUnknownEnum) {
99
+ throw new Error(`cannot decode ${String(descEnum)} from JSON: ${formatVal(json)}`);
100
+ }
101
+ return val;
102
+ }
103
+ /**
104
+ * Is the given value a JSON enum value?
105
+ */
106
+ export function isEnumJson(descEnum, value) {
107
+ return undefined !== descEnum.values.find((v) => v.name === value);
108
+ }
93
109
  function readMessage(msg, json, opts) {
94
110
  var _a;
95
111
  if (tryWktFromJson(msg, json, opts)) {
@@ -184,12 +200,7 @@ function readMapField(map, json, opts) {
184
200
  break;
185
201
  }
186
202
  const key = mapKeyFromJson(field.mapKey, jsonMapKey);
187
- // TODO fix types
188
- // @ts-expect-error TODO
189
- const err = map.set(key, value);
190
- if (err) {
191
- throw err;
192
- }
203
+ map.set(key, value);
193
204
  }
194
205
  }
195
206
  function readListField(list, json, opts) {
@@ -217,10 +228,7 @@ function readListField(list, json, opts) {
217
228
  }
218
229
  break;
219
230
  case "scalar":
220
- const err = list.add(scalarFromJson(field, jsonItem, true));
221
- if (err) {
222
- throw err;
223
- }
231
+ list.add(scalarFromJson(field, jsonItem, true));
224
232
  break;
225
233
  }
226
234
  }
@@ -249,12 +257,7 @@ function readScalarField(msg, field, json) {
249
257
  msg.clear(field);
250
258
  }
251
259
  else {
252
- // TODO fix type error
253
- // @ts-expect-error TODO
254
- const err = msg.set(field, scalarValue);
255
- if (err) {
256
- throw err;
257
- }
260
+ msg.set(field, scalarValue);
258
261
  }
259
262
  }
260
263
  const tokenIgnoredUnknownEnum = Symbol();
@@ -454,10 +457,7 @@ function tryWktFromJson(msg, jsonValue, opts) {
454
457
  msg.clear(valueField);
455
458
  }
456
459
  else {
457
- const err = msg.set(valueField, scalarFromJson(valueField, jsonValue, true));
458
- if (err) {
459
- throw err;
460
- }
460
+ msg.set(valueField, scalarFromJson(valueField, jsonValue, true));
461
461
  }
462
462
  return true;
463
463
  }
@@ -568,7 +568,7 @@ function structFromJson(struct, json) {
568
568
  throw new Error(`cannot decode message ${struct.$typeName} from JSON ${formatVal(json)}`);
569
569
  }
570
570
  for (const [k, v] of Object.entries(json)) {
571
- const parsedV = create(ValueDesc);
571
+ const parsedV = create(ValueSchema);
572
572
  valueFromJson(parsedV, v);
573
573
  struct.fields[k] = parsedV;
574
574
  }
@@ -589,12 +589,12 @@ function valueFromJson(value, json) {
589
589
  value.kind = { case: "nullValue", value: NullValue.NULL_VALUE };
590
590
  }
591
591
  else if (Array.isArray(json)) {
592
- const listValue = create(ListValueDesc);
592
+ const listValue = create(ListValueSchema);
593
593
  listValueFromJson(listValue, json);
594
594
  value.kind = { case: "listValue", value: listValue };
595
595
  }
596
596
  else {
597
- const struct = create(StructDesc);
597
+ const struct = create(StructSchema);
598
598
  structFromJson(struct, json);
599
599
  value.kind = { case: "structValue", value: struct };
600
600
  }
@@ -609,7 +609,7 @@ function listValueFromJson(listValue, json) {
609
609
  throw new Error(`cannot decode message ${listValue.$typeName} from JSON ${formatVal(json)}`);
610
610
  }
611
611
  for (const e of json) {
612
- const value = create(ValueDesc);
612
+ const value = create(ValueSchema);
613
613
  valueFromJson(value, e);
614
614
  listValue.values.push(value);
615
615
  }
@@ -4,4 +4,4 @@ import type { DescMessage } from "./descriptors.js";
4
4
  * Determine whether the given `arg` is a message.
5
5
  * If `desc` is set, determine whether `arg` is this specific message.
6
6
  */
7
- export declare function isMessage<Desc extends DescMessage>(arg: unknown, desc?: Desc): arg is MessageShape<Desc>;
7
+ export declare function isMessage<Desc extends DescMessage>(arg: unknown, schema?: Desc): arg is MessageShape<Desc>;
@@ -15,7 +15,7 @@
15
15
  * Determine whether the given `arg` is a message.
16
16
  * If `desc` is set, determine whether `arg` is this specific message.
17
17
  */
18
- export function isMessage(arg, desc) {
18
+ export function isMessage(arg, schema) {
19
19
  const isMessage = arg !== null &&
20
20
  typeof arg == "object" &&
21
21
  "$typeName" in arg &&
@@ -23,8 +23,8 @@ export function isMessage(arg, desc) {
23
23
  if (!isMessage) {
24
24
  return false;
25
25
  }
26
- if (desc === undefined) {
26
+ if (schema === undefined) {
27
27
  return true;
28
28
  }
29
- return desc.typeName === arg.$typeName;
29
+ return schema.typeName === arg.$typeName;
30
30
  }
@@ -1,5 +1,4 @@
1
1
  import { type DescField, type DescMessage, type DescOneof } from "../descriptors.js";
2
- import { FieldError } from "./error.js";
3
2
  import { unsafeLocal } from "./unsafe.js";
4
3
  import type { Message, UnknownField } from "../types.js";
5
4
  import type { ScalarValue } from "./scalar.js";
@@ -87,7 +86,7 @@ export interface ReflectMessage {
87
86
  * Note that get() never returns `undefined`. To determine whether a field is
88
87
  * set, use isSet().
89
88
  */
90
- get<Field extends DescField>(field: Field): ReflectGetValue<Field>;
89
+ get<Field extends DescField>(field: Field): ReflectMessageGet<Field>;
91
90
  /**
92
91
  * Set a field value.
93
92
  *
@@ -105,10 +104,10 @@ export interface ReflectMessage {
105
104
  * - Map fields:
106
105
  * ReflectMap.
107
106
  *
108
- * Returns an error if the value is invalid for the field. `undefined` is not
107
+ * Throws an error if the value is invalid for the field. `undefined` is not
109
108
  * a valid value. To reset a field, use clear().
110
109
  */
111
- set<Field extends DescField>(field: Field, value: ReflectSetValue<Field>): FieldError | undefined;
110
+ set<Field extends DescField>(field: Field, value: unknown): void;
112
111
  /**
113
112
  * Returns the unknown fields of the message.
114
113
  */
@@ -147,16 +146,16 @@ export interface ReflectList<V = unknown> extends Iterable<V> {
147
146
  */
148
147
  get(index: number): V | undefined;
149
148
  /**
150
- * Adds an item - or several items - at the end of the list.
151
- * Returns an error if an item is invalid for this list.
149
+ * Adds an item at the end of the list.
150
+ * Throws an error if an item is invalid for this list.
152
151
  */
153
- add(...item: V[]): FieldError | undefined;
152
+ add(item: V): void;
154
153
  /**
155
154
  * Replaces the item at the specified index with the specified item.
156
- * Returns an error if the index is out of range (index < 0 || index >= size).
157
- * Returns an error if the item is invalid for this list.
155
+ * Throws an error if the index is out of range (index < 0 || index >= size).
156
+ * Throws an error if the item is invalid for this list.
158
157
  */
159
- set(index: number, item: V): FieldError | undefined;
158
+ set(index: number, item: V): void;
160
159
  /**
161
160
  * Removes all items from the list.
162
161
  */
@@ -178,7 +177,7 @@ export interface ReflectList<V = unknown> extends Iterable<V> {
178
177
  * ReflectMap converts keys to their closest possible type in TypeScript.
179
178
  * - Messages are wrapped in a ReflectMessage.
180
179
  */
181
- export interface ReflectMap<K extends MapEntryKey = MapEntryKey, V = unknown> extends ReadonlyMap<K, V> {
180
+ export interface ReflectMap<K = unknown, V = unknown> extends ReadonlyMap<K, V> {
182
181
  /**
183
182
  * Returns the map field.
184
183
  */
@@ -192,46 +191,19 @@ export interface ReflectMap<K extends MapEntryKey = MapEntryKey, V = unknown> ex
192
191
  delete(key: K): boolean;
193
192
  /**
194
193
  * Sets or replaces the item at the specified key with the specified value.
195
- * Returns an error if the key or value is invalid for this map.
194
+ * Throws an error if the key or value is invalid for this map.
196
195
  */
197
- set(key: K, value: V): FieldError | undefined;
196
+ set(key: K, value: V): this;
198
197
  /**
199
198
  * Removes all entries from the map.
200
199
  */
201
200
  clear(): void;
202
201
  [unsafeLocal]: Record<string, unknown>;
203
202
  }
204
- /**
205
- * A ReflectMap key.
206
- */
207
- export type MapEntryKey = string | number | bigint | boolean;
208
- type enumVal = number;
209
203
  /**
210
204
  * The return type of ReflectMessage.get()
211
205
  */
212
- export type ReflectGetValue<Field extends DescField = DescField> = (Field extends {
213
- fieldKind: "map";
214
- } ? (Field extends {
215
- mapKind: "message";
216
- } ? ReflectMap<MapEntryKey, ReflectMessage> : Field extends {
217
- mapKind: "enum";
218
- } ? ReflectMap<MapEntryKey, enumVal> : Field extends {
219
- mapKind: "scalar";
220
- scalar: infer T;
221
- } ? ReflectMap<MapEntryKey, ScalarValue<T>> : never) : Field extends {
222
- fieldKind: "list";
223
- } ? ReflectList : Field extends {
224
- fieldKind: "enum";
225
- } ? number : Field extends {
226
- fieldKind: "message";
227
- } ? ReflectMessage : Field extends {
228
- fieldKind: "scalar";
229
- scalar: infer T;
230
- } ? ScalarValue<T> : never);
231
- /**
232
- * The type of the "value" argument of ReflectMessage.set()
233
- */
234
- export type ReflectSetValue<Field extends DescField = DescField> = (Field extends {
206
+ export type ReflectMessageGet<Field extends DescField = DescField> = (Field extends {
235
207
  fieldKind: "map";
236
208
  } ? ReflectMap : Field extends {
237
209
  fieldKind: "list";
@@ -243,4 +215,3 @@ export type ReflectSetValue<Field extends DescField = DescField> = (Field extend
243
215
  fieldKind: "scalar";
244
216
  scalar: infer T;
245
217
  } ? ScalarValue<T> : never);
246
- export {};