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

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 (130) hide show
  1. package/dist/cjs/clone.d.ts +1 -1
  2. package/dist/cjs/clone.js +9 -17
  3. package/dist/cjs/codegenv1/embed.js +25 -25
  4. package/dist/cjs/codegenv1/enum.d.ts +2 -1
  5. package/dist/cjs/codegenv1/file.js +1 -1
  6. package/dist/cjs/codegenv1/message.d.ts +2 -1
  7. package/dist/cjs/codegenv1/scalar.d.ts +4 -0
  8. package/dist/cjs/codegenv1/scalar.js +30 -1
  9. package/dist/cjs/codegenv1/symbols.d.ts +10 -0
  10. package/dist/cjs/codegenv1/symbols.js +2 -0
  11. package/dist/cjs/codegenv1/types.d.ts +7 -5
  12. package/dist/cjs/codegenv1/types.js +2 -1
  13. package/dist/cjs/create.d.ts +1 -1
  14. package/dist/cjs/create.js +47 -20
  15. package/dist/cjs/equals.d.ts +1 -1
  16. package/dist/cjs/equals.js +8 -15
  17. package/dist/cjs/from-binary.d.ts +2 -2
  18. package/dist/cjs/from-binary.js +17 -14
  19. package/dist/cjs/from-json.d.ts +14 -6
  20. package/dist/cjs/from-json.js +51 -55
  21. package/dist/cjs/is-message.d.ts +1 -1
  22. package/dist/cjs/is-message.js +3 -3
  23. package/dist/cjs/reflect/guard.js +4 -4
  24. package/dist/cjs/reflect/reflect-types.d.ts +13 -80
  25. package/dist/cjs/reflect/reflect.d.ts +29 -18
  26. package/dist/cjs/reflect/reflect.js +183 -78
  27. package/dist/cjs/reflect/scalar.d.ts +1 -1
  28. package/dist/cjs/reflect/unsafe.d.ts +0 -16
  29. package/dist/cjs/reflect/unsafe.js +1 -19
  30. package/dist/cjs/registry.d.ts +18 -2
  31. package/dist/cjs/registry.js +62 -60
  32. package/dist/cjs/to-binary.d.ts +1 -1
  33. package/dist/cjs/to-binary.js +2 -2
  34. package/dist/cjs/to-json.d.ts +14 -4
  35. package/dist/cjs/to-json.js +26 -13
  36. package/dist/cjs/types.d.ts +9 -0
  37. package/dist/cjs/wire/binary-encoding.js +30 -9
  38. package/dist/cjs/wkt/any.d.ts +7 -7
  39. package/dist/cjs/wkt/any.js +5 -5
  40. package/dist/cjs/wkt/gen/google/protobuf/any_pb.d.ts +9 -3
  41. package/dist/cjs/wkt/gen/google/protobuf/any_pb.js +4 -4
  42. package/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +88 -9
  43. package/dist/cjs/wkt/gen/google/protobuf/api_pb.js +8 -8
  44. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +107 -11
  45. package/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.js +11 -11
  46. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +1005 -92
  47. package/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +86 -86
  48. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.d.ts +7 -3
  49. package/dist/cjs/wkt/gen/google/protobuf/duration_pb.js +4 -4
  50. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.d.ts +7 -3
  51. package/dist/cjs/wkt/gen/google/protobuf/empty_pb.js +4 -4
  52. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -3
  53. package/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.js +4 -4
  54. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.d.ts +12 -3
  55. package/dist/cjs/wkt/gen/google/protobuf/source_context_pb.js +4 -4
  56. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.d.ts +25 -8
  57. package/dist/cjs/wkt/gen/google/protobuf/struct_pb.js +9 -9
  58. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -3
  59. package/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.js +4 -4
  60. package/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +165 -16
  61. package/dist/cjs/wkt/gen/google/protobuf/type_pb.js +15 -15
  62. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.d.ts +55 -19
  63. package/dist/cjs/wkt/gen/google/protobuf/wrappers_pb.js +20 -20
  64. package/dist/cjs/wkt/timestamp.js +1 -2
  65. package/dist/esm/clone.d.ts +1 -1
  66. package/dist/esm/clone.js +9 -17
  67. package/dist/esm/codegenv1/embed.js +26 -26
  68. package/dist/esm/codegenv1/enum.d.ts +2 -1
  69. package/dist/esm/codegenv1/file.js +2 -2
  70. package/dist/esm/codegenv1/message.d.ts +2 -1
  71. package/dist/esm/codegenv1/scalar.d.ts +4 -0
  72. package/dist/esm/codegenv1/scalar.js +28 -0
  73. package/dist/esm/codegenv1/symbols.d.ts +10 -0
  74. package/dist/esm/codegenv1/symbols.js +2 -0
  75. package/dist/esm/codegenv1/types.d.ts +7 -5
  76. package/dist/esm/codegenv1/types.js +2 -1
  77. package/dist/esm/create.d.ts +1 -1
  78. package/dist/esm/create.js +47 -20
  79. package/dist/esm/equals.d.ts +1 -1
  80. package/dist/esm/equals.js +8 -15
  81. package/dist/esm/from-binary.d.ts +2 -2
  82. package/dist/esm/from-binary.js +17 -14
  83. package/dist/esm/from-json.d.ts +14 -6
  84. package/dist/esm/from-json.js +49 -55
  85. package/dist/esm/is-message.d.ts +1 -1
  86. package/dist/esm/is-message.js +3 -3
  87. package/dist/esm/reflect/guard.js +4 -4
  88. package/dist/esm/reflect/reflect-types.d.ts +13 -80
  89. package/dist/esm/reflect/reflect-types.js +0 -1
  90. package/dist/esm/reflect/reflect.d.ts +29 -18
  91. package/dist/esm/reflect/reflect.js +185 -80
  92. package/dist/esm/reflect/scalar.d.ts +1 -1
  93. package/dist/esm/reflect/unsafe.d.ts +0 -16
  94. package/dist/esm/reflect/unsafe.js +0 -16
  95. package/dist/esm/registry.d.ts +18 -2
  96. package/dist/esm/registry.js +60 -59
  97. package/dist/esm/to-binary.d.ts +1 -1
  98. package/dist/esm/to-binary.js +2 -2
  99. package/dist/esm/to-json.d.ts +14 -4
  100. package/dist/esm/to-json.js +24 -12
  101. package/dist/esm/types.d.ts +9 -0
  102. package/dist/esm/wire/binary-encoding.js +30 -9
  103. package/dist/esm/wkt/any.d.ts +7 -7
  104. package/dist/esm/wkt/any.js +6 -6
  105. package/dist/esm/wkt/gen/google/protobuf/any_pb.d.ts +9 -3
  106. package/dist/esm/wkt/gen/google/protobuf/any_pb.js +3 -3
  107. package/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +88 -9
  108. package/dist/esm/wkt/gen/google/protobuf/api_pb.js +9 -9
  109. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +107 -11
  110. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.js +11 -11
  111. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +1005 -92
  112. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +84 -84
  113. package/dist/esm/wkt/gen/google/protobuf/duration_pb.d.ts +7 -3
  114. package/dist/esm/wkt/gen/google/protobuf/duration_pb.js +3 -3
  115. package/dist/esm/wkt/gen/google/protobuf/empty_pb.d.ts +7 -3
  116. package/dist/esm/wkt/gen/google/protobuf/empty_pb.js +3 -3
  117. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +7 -3
  118. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.js +3 -3
  119. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.d.ts +12 -3
  120. package/dist/esm/wkt/gen/google/protobuf/source_context_pb.js +3 -3
  121. package/dist/esm/wkt/gen/google/protobuf/struct_pb.d.ts +25 -8
  122. package/dist/esm/wkt/gen/google/protobuf/struct_pb.js +8 -8
  123. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +7 -3
  124. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.js +3 -3
  125. package/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +165 -16
  126. package/dist/esm/wkt/gen/google/protobuf/type_pb.js +16 -16
  127. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.d.ts +55 -19
  128. package/dist/esm/wkt/gen/google/protobuf/wrappers_pb.js +19 -19
  129. package/dist/esm/wkt/timestamp.js +2 -3
  130. package/package.json +2 -2
@@ -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>): void;
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,9 @@ 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
+ return target;
44
45
  }
45
46
  /**
46
47
  * If `delimited` is false, read the length given in `lengthOrDelimitedFieldNo`.
@@ -94,15 +95,16 @@ export function readField(message, reader, field, wireType, options) {
94
95
  message.set(field, readMessageField(reader, options, field, message.get(field)));
95
96
  break;
96
97
  case "list":
97
- readListField(message, reader, options, field, wireType);
98
+ readListField(reader, wireType, message.get(field), options);
98
99
  break;
99
100
  case "map":
100
- readMapEntry(message, field, reader, options);
101
+ readMapEntry(reader, message.get(field), options);
101
102
  break;
102
103
  }
103
104
  }
104
105
  // Read a map field, expecting key field = 1, value field = 2
105
- function readMapEntry(message, field, reader, options) {
106
+ function readMapEntry(reader, map, options) {
107
+ const field = map.field();
106
108
  let key, val;
107
109
  const end = reader.pos + reader.uint32();
108
110
  while (reader.pos < end) {
@@ -138,16 +140,17 @@ function readMapEntry(message, field, reader, options) {
138
140
  val = field.enum.values[0].number;
139
141
  break;
140
142
  case "message":
141
- val = reflect(field.message);
143
+ val = reflect(field.message, undefined, false);
142
144
  break;
143
145
  }
144
146
  }
145
- message.setMapEntry(field, key, val);
147
+ map.set(key, val);
146
148
  }
147
- function readListField(message, reader, options, field, wireType) {
149
+ function readListField(reader, wireType, list, options) {
148
150
  var _a;
151
+ const field = list.field();
149
152
  if (field.listKind === "message") {
150
- message.addListItem(field, readMessageField(reader, options, field));
153
+ list.add(readMessageField(reader, options, field));
151
154
  return;
152
155
  }
153
156
  const scalarType = (_a = field.scalar) !== null && _a !== void 0 ? _a : ScalarType.INT32;
@@ -155,17 +158,17 @@ function readListField(message, reader, options, field, wireType) {
155
158
  scalarType != ScalarType.STRING &&
156
159
  scalarType != ScalarType.BYTES;
157
160
  if (!packed) {
158
- message.addListItem(field, readScalar(reader, scalarType));
161
+ list.add(readScalar(reader, scalarType));
159
162
  return;
160
163
  }
161
164
  const e = reader.uint32() + reader.pos;
162
165
  while (reader.pos < e) {
163
- message.addListItem(field, readScalar(reader, scalarType));
166
+ list.add(readScalar(reader, scalarType));
164
167
  }
165
168
  }
166
169
  function readMessageField(reader, options, field, mergeMessage) {
167
170
  const delimited = field.delimitedEncoding;
168
- 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);
169
172
  readMessage(message, reader, options, delimited, delimited ? field.number : reader.uint32());
170
173
  return message;
171
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>): void;
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>): void;
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
- 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)) {
@@ -88,6 +88,23 @@ export function mergeFromJson(messageDesc, target, json, options) {
88
88
  }
89
89
  throw e;
90
90
  }
91
+ return target;
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);
91
108
  }
92
109
  function readMessage(msg, json, opts) {
93
110
  var _a;
@@ -146,17 +163,18 @@ function readField(msg, field, json, opts) {
146
163
  readMessageField(msg, field, json, opts);
147
164
  break;
148
165
  case "list":
149
- readListField(msg, field, json, opts);
166
+ readListField(msg.get(field), json, opts);
150
167
  break;
151
168
  case "map":
152
- readMapField(msg, field, json, opts);
169
+ readMapField(msg.get(field), json, opts);
153
170
  break;
154
171
  }
155
172
  }
156
- function readMapField(msg, field, json, opts) {
173
+ function readMapField(map, json, opts) {
157
174
  if (json === null) {
158
175
  return;
159
176
  }
177
+ const field = map.field();
160
178
  if (typeof json != "object" || Array.isArray(json)) {
161
179
  throw new FieldError(field, "expected object, got " + formatVal(json));
162
180
  }
@@ -164,45 +182,32 @@ function readMapField(msg, field, json, opts) {
164
182
  if (jsonMapValue === null) {
165
183
  throw new FieldError(field, "map value must not be null");
166
184
  }
167
- const key = mapKeyFromJson(field.mapKey, jsonMapKey);
185
+ let value;
168
186
  switch (field.mapKind) {
169
187
  case "message":
170
188
  const msgValue = reflect(field.message);
171
189
  readMessage(msgValue, jsonMapValue, opts);
172
- // TODO fix types
173
- // @ts-expect-error TODO
174
- const err = msg.setMapEntry(field, key, msgValue);
175
- if (err) {
176
- throw err;
177
- }
190
+ value = msgValue;
178
191
  break;
179
192
  case "enum":
180
- const enumValue = readEnum(field.enum, jsonMapValue, opts.ignoreUnknownFields, true);
181
- if (enumValue !== tokenIgnoredUnknownEnum) {
182
- // TODO fix types
183
- // @ts-expect-error TODO
184
- const err = msg.setMapEntry(field, key, enumValue);
185
- if (err) {
186
- throw err;
187
- }
193
+ value = readEnum(field.enum, jsonMapValue, opts.ignoreUnknownFields, true);
194
+ if (value === tokenIgnoredUnknownEnum) {
195
+ return;
188
196
  }
189
197
  break;
190
198
  case "scalar":
191
- const err2 = msg.setMapEntry(field,
192
- // TODO fix types
193
- // @ts-expect-error TODO
194
- key, scalarFromJson(field, jsonMapValue, true));
195
- if (err2) {
196
- throw err2;
197
- }
199
+ value = scalarFromJson(field, jsonMapValue, true);
198
200
  break;
199
201
  }
202
+ const key = mapKeyFromJson(field.mapKey, jsonMapKey);
203
+ map.set(key, value);
200
204
  }
201
205
  }
202
- function readListField(msg, field, json, opts) {
206
+ function readListField(list, json, opts) {
203
207
  if (json === null) {
204
208
  return;
205
209
  }
210
+ const field = list.field();
206
211
  if (!Array.isArray(json)) {
207
212
  throw new FieldError(field, "expected Array, got " + formatVal(json));
208
213
  }
@@ -214,19 +219,16 @@ function readListField(msg, field, json, opts) {
214
219
  case "message":
215
220
  const msgValue = reflect(field.message);
216
221
  readMessage(msgValue, jsonItem, opts);
217
- msg.addListItem(field, msgValue);
222
+ list.add(msgValue);
218
223
  break;
219
224
  case "enum":
220
225
  const enumValue = readEnum(field.enum, jsonItem, opts.ignoreUnknownFields, true);
221
226
  if (enumValue !== tokenIgnoredUnknownEnum) {
222
- msg.addListItem(field, enumValue);
227
+ list.add(enumValue);
223
228
  }
224
229
  break;
225
230
  case "scalar":
226
- const err = msg.addListItem(field, scalarFromJson(field, jsonItem, true));
227
- if (err) {
228
- throw err;
229
- }
231
+ list.add(scalarFromJson(field, jsonItem, true));
230
232
  break;
231
233
  }
232
234
  }
@@ -255,12 +257,7 @@ function readScalarField(msg, field, json) {
255
257
  msg.clear(field);
256
258
  }
257
259
  else {
258
- // TODO fix type error
259
- // @ts-expect-error TODO
260
- const err = msg.set(field, scalarValue);
261
- if (err) {
262
- throw err;
263
- }
260
+ msg.set(field, scalarValue);
264
261
  }
265
262
  }
266
263
  const tokenIgnoredUnknownEnum = Symbol();
@@ -460,10 +457,7 @@ function tryWktFromJson(msg, jsonValue, opts) {
460
457
  msg.clear(valueField);
461
458
  }
462
459
  else {
463
- const err = msg.set(valueField, scalarFromJson(valueField, jsonValue, true));
464
- if (err) {
465
- throw err;
466
- }
460
+ msg.set(valueField, scalarFromJson(valueField, jsonValue, true));
467
461
  }
468
462
  return true;
469
463
  }
@@ -574,7 +568,7 @@ function structFromJson(struct, json) {
574
568
  throw new Error(`cannot decode message ${struct.$typeName} from JSON ${formatVal(json)}`);
575
569
  }
576
570
  for (const [k, v] of Object.entries(json)) {
577
- const parsedV = create(ValueDesc);
571
+ const parsedV = create(ValueSchema);
578
572
  valueFromJson(parsedV, v);
579
573
  struct.fields[k] = parsedV;
580
574
  }
@@ -595,12 +589,12 @@ function valueFromJson(value, json) {
595
589
  value.kind = { case: "nullValue", value: NullValue.NULL_VALUE };
596
590
  }
597
591
  else if (Array.isArray(json)) {
598
- const listValue = create(ListValueDesc);
592
+ const listValue = create(ListValueSchema);
599
593
  listValueFromJson(listValue, json);
600
594
  value.kind = { case: "listValue", value: listValue };
601
595
  }
602
596
  else {
603
- const struct = create(StructDesc);
597
+ const struct = create(StructSchema);
604
598
  structFromJson(struct, json);
605
599
  value.kind = { case: "structValue", value: struct };
606
600
  }
@@ -615,7 +609,7 @@ function listValueFromJson(listValue, json) {
615
609
  throw new Error(`cannot decode message ${listValue.$typeName} from JSON ${formatVal(json)}`);
616
610
  }
617
611
  for (const e of json) {
618
- const value = create(ValueDesc);
612
+ const value = create(ValueSchema);
619
613
  valueFromJson(value, e);
620
614
  listValue.values.push(value);
621
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>;