@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
@@ -27,9 +27,15 @@ const guard_js_1 = require("./guard.js");
27
27
  * Create a ReflectMessage.
28
28
  */
29
29
  function reflect(messageDesc, message,
30
- // TODO either remove this option, or support it in reflect-list and reflect-map as well
31
- opt) {
32
- return new ReflectMessageImpl(messageDesc, message, (opt === null || opt === void 0 ? void 0 : opt.disableFieldValueCheck) !== true);
30
+ /**
31
+ * By default, field values are validated when setting them. For example,
32
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
33
+ *
34
+ * When field values are trusted, performance can be improved by disabling
35
+ * checks.
36
+ */
37
+ check = true) {
38
+ return new ReflectMessageImpl(messageDesc, message, check);
33
39
  }
34
40
  exports.reflect = reflect;
35
41
  class ReflectMessageImpl {
@@ -39,9 +45,9 @@ class ReflectMessageImpl {
39
45
  .concat()
40
46
  .sort((a, b) => a.number - b.number)));
41
47
  }
42
- constructor(messageDesc, message,
43
- // TODO either remove this option, or support it in reflect-list and reflect-map as well
44
- check = true) {
48
+ constructor(messageDesc, message, check = true) {
49
+ this.lists = new Map();
50
+ this.maps = new Map();
45
51
  this.check = check;
46
52
  this.desc = messageDesc;
47
53
  this.message = this[unsafe_js_1.unsafeLocal] = message !== null && message !== void 0 ? message : (0, create_js_1.create)(messageDesc);
@@ -69,24 +75,24 @@ class ReflectMessageImpl {
69
75
  }
70
76
  get(field) {
71
77
  assertOwn(this.message, field);
72
- let value = (0, unsafe_js_1.unsafeGet)(this.message, field);
78
+ const value = (0, unsafe_js_1.unsafeGet)(this.message, field);
73
79
  switch (field.fieldKind) {
74
80
  case "list":
75
- return new ReflectListImpl(field, value, this.check);
81
+ // eslint-disable-next-line no-case-declarations
82
+ let list = this.lists.get(field);
83
+ if (!list || list[unsafe_js_1.unsafeLocal] !== value) {
84
+ this.lists.set(field, (list = new ReflectListImpl(field, value, this.check)));
85
+ }
86
+ return list;
76
87
  case "map":
77
- // TODO fix types
78
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
79
- return reflectMap(field, value, this.check); // eslint-disable-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return
80
- case "message":
81
- if (value !== undefined &&
82
- !field.oneof &&
83
- (0, wrappers_js_1.isWrapperDesc)(field.message)) {
84
- value = {
85
- $typeName: field.message.typeName,
86
- value: longToReflect(field.message.fields[0], value),
87
- };
88
+ // eslint-disable-next-line no-case-declarations
89
+ let map = this.maps.get(field);
90
+ if (!map || map[unsafe_js_1.unsafeLocal] !== value) {
91
+ this.maps.set(field, (map = new ReflectMapImpl(field, value, this.check)));
88
92
  }
89
- return new ReflectMessageImpl(field.message, value, this.check);
93
+ return map;
94
+ case "message":
95
+ return messageToReflect(field, value, this.check);
90
96
  case "scalar":
91
97
  return (value === undefined
92
98
  ? (0, scalar_js_1.scalarZeroValue)(field.scalar, false)
@@ -100,46 +106,20 @@ class ReflectMessageImpl {
100
106
  if (this.check) {
101
107
  const err = (0, reflect_check_js_1.checkField)(field, value);
102
108
  if (err) {
103
- return err;
109
+ throw err;
104
110
  }
105
111
  }
106
112
  let local;
107
- if ((0, guard_js_1.isReflectMap)(value) || (0, guard_js_1.isReflectList)(value)) {
108
- local = value[unsafe_js_1.unsafeLocal];
113
+ if (field.fieldKind == "message") {
114
+ local = messageToLocal(field, value);
109
115
  }
110
- else if ((0, guard_js_1.isReflectMessage)(value)) {
111
- const msg = value.message;
112
- local = !field.oneof && (0, wrappers_js_1.isWrapper)(msg) ? msg.value : msg;
116
+ else if ((0, guard_js_1.isReflectMap)(value) || (0, guard_js_1.isReflectList)(value)) {
117
+ local = value[unsafe_js_1.unsafeLocal];
113
118
  }
114
119
  else {
115
120
  local = longToLocal(field, value);
116
121
  }
117
122
  (0, unsafe_js_1.unsafeSet)(this.message, field, local);
118
- return undefined;
119
- }
120
- addListItem(field, value) {
121
- assertOwn(this.message, field);
122
- assertKind(field, "list");
123
- if (this.check) {
124
- if ((0, reflect_check_js_1.checkListItem)(field, 0, value)) {
125
- const arr = (0, unsafe_js_1.unsafeGet)(this.message, field);
126
- return (0, reflect_check_js_1.checkListItem)(field, arr.length, value);
127
- }
128
- }
129
- (0, unsafe_js_1.unsafeAddListItem)(this.message, field, listItemToLocal(field, value));
130
- return undefined;
131
- }
132
- setMapEntry(field, key, value) {
133
- assertOwn(this.message, field);
134
- assertKind(field, "map");
135
- if (this.check) {
136
- const err = (0, reflect_check_js_1.checkMapEntry)(field, key, value);
137
- if (err) {
138
- return err;
139
- }
140
- }
141
- (0, unsafe_js_1.unsafeSetMapEntry)(this.message, field, mapKeyToLocal(key), mapValueToLocal(field, value));
142
- return undefined;
143
123
  }
144
124
  getUnknown() {
145
125
  return this.message.$unknown;
@@ -148,11 +128,6 @@ class ReflectMessageImpl {
148
128
  this.message.$unknown = value;
149
129
  }
150
130
  }
151
- function assertKind(field, kind) {
152
- if (field.fieldKind != kind) {
153
- throw new error_js_1.FieldError(field, `${field.toString()} is ${field.fieldKind}`, "ForeignFieldError");
154
- }
155
- }
156
131
  function assertOwn(owner, member) {
157
132
  if (member.parent.typeName !== owner.$typeName) {
158
133
  throw new error_js_1.FieldError(member, `cannot use ${member.toString()} with message ${owner.$typeName}`, "ForeignFieldError");
@@ -161,7 +136,15 @@ function assertOwn(owner, member) {
161
136
  /**
162
137
  * Create a ReflectList.
163
138
  */
164
- function reflectList(field, unsafeInput, check = true) {
139
+ function reflectList(field, unsafeInput,
140
+ /**
141
+ * By default, field values are validated when setting them. For example,
142
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
143
+ *
144
+ * When field values are trusted, performance can be improved by disabling
145
+ * checks.
146
+ */
147
+ check = true) {
165
148
  return new ReflectListImpl(field, unsafeInput !== null && unsafeInput !== void 0 ? unsafeInput : [], check);
166
149
  }
167
150
  exports.reflectList = reflectList;
@@ -185,29 +168,24 @@ class ReflectListImpl {
185
168
  }
186
169
  set(index, item) {
187
170
  if (index < 0 || index >= this._arr.length) {
188
- return new error_js_1.FieldError(this._field, `list item #${index + 1}: out of range`);
171
+ throw new error_js_1.FieldError(this._field, `list item #${index + 1}: out of range`);
189
172
  }
190
173
  if (this.check) {
191
174
  const err = (0, reflect_check_js_1.checkListItem)(this._field, index, item);
192
175
  if (err) {
193
- return err;
176
+ throw err;
194
177
  }
195
178
  }
196
179
  this._arr[index] = listItemToLocal(this._field, item);
197
- return undefined;
198
180
  }
199
- add(...items) {
181
+ add(item) {
200
182
  if (this.check) {
201
- for (let i = 0; i < items.length; i++) {
202
- const err = (0, reflect_check_js_1.checkListItem)(this._field, this._arr.length + i, items[i]);
203
- if (err) {
204
- return err;
205
- }
183
+ const err = (0, reflect_check_js_1.checkListItem)(this._field, this._arr.length, item);
184
+ if (err) {
185
+ throw err;
206
186
  }
207
187
  }
208
- for (const item of items) {
209
- this._arr.push(listItemToLocal(this._field, item));
210
- }
188
+ this._arr.push(listItemToLocal(this._field, item));
211
189
  return undefined;
212
190
  }
213
191
  clear() {
@@ -233,7 +211,15 @@ class ReflectListImpl {
233
211
  /**
234
212
  * Create a ReflectMap.
235
213
  */
236
- function reflectMap(field, unsafeInput, check = true) {
214
+ function reflectMap(field, unsafeInput,
215
+ /**
216
+ * By default, field values are validated when setting them. For example,
217
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
218
+ *
219
+ * When field values are trusted, performance can be improved by disabling
220
+ * checks.
221
+ */
222
+ check = true) {
237
223
  return new ReflectMapImpl(field, unsafeInput, check);
238
224
  }
239
225
  exports.reflectMap = reflectMap;
@@ -250,11 +236,11 @@ class ReflectMapImpl {
250
236
  if (this.check) {
251
237
  const err = (0, reflect_check_js_1.checkMapEntry)(this._field, key, value);
252
238
  if (err) {
253
- return err;
239
+ throw err;
254
240
  }
255
241
  }
256
242
  this.obj[mapKeyToLocal(key)] = mapValueToLocal(this._field, value);
257
- return undefined;
243
+ return this;
258
244
  }
259
245
  delete(key) {
260
246
  const k = mapKeyToLocal(key);
@@ -309,27 +295,68 @@ class ReflectMapImpl {
309
295
  }
310
296
  }
311
297
  }
298
+ function messageToLocal(field, value) {
299
+ if (!(0, guard_js_1.isReflectMessage)(value)) {
300
+ return value;
301
+ }
302
+ if ((0, wrappers_js_1.isWrapper)(value.message) &&
303
+ !field.oneof &&
304
+ field.fieldKind == "message") {
305
+ // Types from google/protobuf/wrappers.proto are unwrapped when used in
306
+ // a singular field that is not part of a oneof group.
307
+ return value.message.value;
308
+ }
309
+ if (value.desc.typeName == "google.protobuf.Struct" &&
310
+ field.parent.typeName != "google.protobuf.Value") {
311
+ // google.protobuf.Struct is represented with JsonObject when used in a
312
+ // field, except when used in google.protobuf.Value.
313
+ return wktStructToLocal(value.message);
314
+ }
315
+ return value.message;
316
+ }
317
+ function messageToReflect(field, value, check) {
318
+ if (value !== undefined) {
319
+ if ((0, wrappers_js_1.isWrapperDesc)(field.message) &&
320
+ !field.oneof &&
321
+ field.fieldKind == "message") {
322
+ // Types from google/protobuf/wrappers.proto are unwrapped when used in
323
+ // a singular field that is not part of a oneof group.
324
+ value = {
325
+ $typeName: field.message.typeName,
326
+ value: longToReflect(field.message.fields[0], value),
327
+ };
328
+ }
329
+ else if (field.message.typeName == "google.protobuf.Struct" &&
330
+ field.parent.typeName != "google.protobuf.Value" &&
331
+ (0, guard_js_1.isObject)(value)) {
332
+ // google.protobuf.Struct is represented with JsonObject when used in a
333
+ // field, except when used in google.protobuf.Value.
334
+ value = wktStructToReflect(value);
335
+ }
336
+ }
337
+ return new ReflectMessageImpl(field.message, value, check);
338
+ }
312
339
  function listItemToLocal(field, value) {
313
- if ((0, guard_js_1.isReflectMessage)(value)) {
314
- return value.message;
340
+ if (field.listKind == "message") {
341
+ return messageToLocal(field, value);
315
342
  }
316
343
  return longToLocal(field, value);
317
344
  }
318
345
  function listItemToReflect(field, value, check) {
319
346
  if (field.listKind == "message") {
320
- return new ReflectMessageImpl(field.message, value, check);
347
+ return messageToReflect(field, value, check);
321
348
  }
322
349
  return longToReflect(field, value);
323
350
  }
324
351
  function mapValueToLocal(field, value) {
325
- if ((0, guard_js_1.isReflectMessage)(value)) {
326
- return value.message;
352
+ if (field.mapKind == "message") {
353
+ return messageToLocal(field, value);
327
354
  }
328
355
  return longToLocal(field, value);
329
356
  }
330
357
  function mapValueToReflect(field, value, check) {
331
358
  if (field.mapKind == "message") {
332
- return new ReflectMessageImpl(field.message, value, check);
359
+ return messageToReflect(field, value, check);
333
360
  }
334
361
  return value;
335
362
  }
@@ -433,3 +460,81 @@ function longToLocal(field, value) {
433
460
  }
434
461
  return value;
435
462
  }
463
+ function wktStructToReflect(json) {
464
+ const struct = {
465
+ $typeName: "google.protobuf.Struct",
466
+ fields: {},
467
+ };
468
+ if ((0, guard_js_1.isObject)(json)) {
469
+ for (const [k, v] of Object.entries(json)) {
470
+ struct.fields[k] = wktValueToReflect(v);
471
+ }
472
+ }
473
+ return struct;
474
+ }
475
+ function wktStructToLocal(val) {
476
+ const json = {};
477
+ for (const [k, v] of Object.entries(val.fields)) {
478
+ json[k] = wktValueToLocal(v);
479
+ }
480
+ return json;
481
+ }
482
+ function wktValueToLocal(val) {
483
+ switch (val.kind.case) {
484
+ case "structValue":
485
+ return wktStructToLocal(val.kind.value);
486
+ case "listValue":
487
+ return val.kind.value.values.map(wktValueToLocal);
488
+ case "nullValue":
489
+ case undefined:
490
+ return null;
491
+ default:
492
+ return val.kind.value;
493
+ }
494
+ }
495
+ function wktValueToReflect(json) {
496
+ const value = {
497
+ $typeName: "google.protobuf.Value",
498
+ kind: { case: undefined },
499
+ };
500
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- invalid input is unselected kind
501
+ switch (typeof json) {
502
+ case "number":
503
+ value.kind = { case: "numberValue", value: json };
504
+ break;
505
+ case "string":
506
+ value.kind = { case: "stringValue", value: json };
507
+ break;
508
+ case "boolean":
509
+ value.kind = { case: "boolValue", value: json };
510
+ break;
511
+ case "object":
512
+ if (json === null) {
513
+ const nullValue = 0;
514
+ value.kind = { case: "nullValue", value: nullValue };
515
+ }
516
+ else if (Array.isArray(json)) {
517
+ const listValue = {
518
+ $typeName: "google.protobuf.ListValue",
519
+ values: [],
520
+ };
521
+ if (Array.isArray(json)) {
522
+ for (const e of json) {
523
+ listValue.values.push(wktValueToReflect(e));
524
+ }
525
+ }
526
+ value.kind = {
527
+ case: "listValue",
528
+ value: listValue,
529
+ };
530
+ }
531
+ else {
532
+ value.kind = {
533
+ case: "structValue",
534
+ value: wktStructToReflect(json),
535
+ };
536
+ }
537
+ break;
538
+ }
539
+ return value;
540
+ }
@@ -6,7 +6,7 @@ export type ScalarValue<T = ScalarType, LongAsString extends boolean = false> =
6
6
  /**
7
7
  * Returns true if both scalar values are equal.
8
8
  */
9
- export declare function scalarEquals(type: ScalarType, a: string | boolean | number | bigint | Uint8Array | undefined, b: string | boolean | number | bigint | Uint8Array | undefined): boolean;
9
+ export declare function scalarEquals(type: ScalarType, a: ScalarValue | undefined, b: ScalarValue | undefined): boolean;
10
10
  /**
11
11
  * Returns the zero value for the given scalar type.
12
12
  */
@@ -40,19 +40,3 @@ export declare function unsafeSet(target: Record<string, unknown>, field: DescFi
40
40
  */
41
41
  export declare function unsafeClear(target: Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any -- `any` is the best choice for dynamic access
42
42
  field: DescField): void;
43
- /**
44
- * Add an item to a list field.
45
- *
46
- * @private
47
- */
48
- export declare function unsafeAddListItem(target: Record<string, unknown>, field: DescField & {
49
- fieldKind: "list";
50
- }, value: unknown): void;
51
- /**
52
- * Set a map entry.
53
- *
54
- * @private
55
- */
56
- export declare function unsafeSetMapEntry(target: Record<string, unknown>, field: DescField & {
57
- fieldKind: "map";
58
- }, key: string | number, value: unknown): void;
@@ -13,7 +13,7 @@
13
13
  // See the License for the specific language governing permissions and
14
14
  // limitations under the License.
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.unsafeSetMapEntry = exports.unsafeAddListItem = exports.unsafeClear = exports.unsafeSet = exports.unsafeGet = exports.unsafeIsSetExplicit = exports.unsafeIsSet = exports.unsafeOneofCase = exports.unsafeLocal = void 0;
16
+ exports.unsafeClear = exports.unsafeSet = exports.unsafeGet = exports.unsafeIsSetExplicit = exports.unsafeIsSet = exports.unsafeOneofCase = exports.unsafeLocal = void 0;
17
17
  const scalar_js_1 = require("./scalar.js");
18
18
  // bootstrap-inject google.protobuf.FeatureSet.FieldPresence.IMPLICIT: const $name: FeatureSet_FieldPresence.$localName = $number;
19
19
  const IMPLICIT = 2;
@@ -146,21 +146,3 @@ field) {
146
146
  }
147
147
  }
148
148
  exports.unsafeClear = unsafeClear;
149
- /**
150
- * Add an item to a list field.
151
- *
152
- * @private
153
- */
154
- function unsafeAddListItem(target, field, value) {
155
- target[field.localName].push(value);
156
- }
157
- exports.unsafeAddListItem = unsafeAddListItem;
158
- /**
159
- * Set a map entry.
160
- *
161
- * @private
162
- */
163
- function unsafeSetMapEntry(target, field, key, value) {
164
- target[field.localName][key] = value;
165
- }
166
- exports.unsafeSetMapEntry = unsafeSetMapEntry;
@@ -39,8 +39,20 @@ export interface Registry {
39
39
  getService(typeName: string): DescService | undefined;
40
40
  }
41
41
  /**
42
- * A set of descriptors for messages, enumerations, extensions,
43
- * and services - and files.
42
+ * A registry that allows adding and removing descriptors.
43
+ */
44
+ export interface MutableRegistry extends Registry {
45
+ /**
46
+ * Adds the given descriptor - but not types nested within - to the registry.
47
+ */
48
+ add(desc: DescMessage | DescEnum | DescExtension | DescService): void;
49
+ /**
50
+ * Remove the given descriptor - but not types nested within - from the registry.
51
+ */
52
+ remove(desc: DescMessage | DescEnum | DescExtension | DescService): void;
53
+ }
54
+ /**
55
+ * A registry that includes files.
44
56
  */
45
57
  export interface FileRegistry extends Registry {
46
58
  /**
@@ -64,6 +76,10 @@ export interface FileRegistry extends Registry {
64
76
  * For duplicate descriptors (same type name), the one given last wins.
65
77
  */
66
78
  export declare function createRegistry(...input: (Registry | DescFile | DescMessage | DescEnum | DescExtension | DescService)[]): Registry;
79
+ /**
80
+ * Create a registry that allows adding and removing descriptors.
81
+ */
82
+ export declare function createMutableRegistry(...input: (Registry | DescFile | DescMessage | DescEnum | DescExtension | DescService)[]): MutableRegistry;
67
83
  /**
68
84
  * Create a registry (including file descriptors) from a google.protobuf.FileDescriptorSet
69
85
  * message.
@@ -13,7 +13,7 @@
13
13
  // See the License for the specific language governing permissions and
14
14
  // limitations under the License.
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.maximumEdition = exports.minimumEdition = exports.createFileRegistry = exports.createRegistry = void 0;
16
+ exports.maximumEdition = exports.minimumEdition = exports.createFileRegistry = exports.createMutableRegistry = exports.createRegistry = void 0;
17
17
  const descriptors_js_1 = require("./descriptors.js");
18
18
  const text_format_js_1 = require("./wire/text-format.js");
19
19
  const nested_types_js_1 = require("./reflect/nested-types.js");
@@ -31,29 +31,25 @@ const names_js_1 = require("./reflect/names.js");
31
31
  * For duplicate descriptors (same type name), the one given last wins.
32
32
  */
33
33
  function createRegistry(...input) {
34
- const reg = createMutableRegistry();
35
- for (const i of input) {
36
- switch (i.kind) {
37
- case "registry":
38
- for (const n of i) {
39
- reg.add(n);
40
- }
41
- break;
42
- case "file":
43
- for (const n of (0, nested_types_js_1.nestedTypes)(i)) {
44
- reg.add(n);
45
- }
46
- break;
47
- default:
48
- reg.add(i);
49
- break;
50
- }
51
- }
52
- return reg;
34
+ return initBaseRegistry(input);
53
35
  }
54
36
  exports.createRegistry = createRegistry;
37
+ /**
38
+ * Create a registry that allows adding and removing descriptors.
39
+ */
40
+ function createMutableRegistry(...input) {
41
+ const reg = initBaseRegistry(input);
42
+ return Object.assign(Object.assign({}, reg), { remove(desc) {
43
+ var _a;
44
+ if (desc.kind == "extension") {
45
+ (_a = reg.extendees.get(desc.extendee.typeName)) === null || _a === void 0 ? void 0 : _a.delete(desc.number);
46
+ }
47
+ reg.types.delete(desc.typeName);
48
+ } });
49
+ }
50
+ exports.createMutableRegistry = createMutableRegistry;
55
51
  function createFileRegistry(...args) {
56
- const registry = createMutableRegistry();
52
+ const registry = createBaseRegistry();
57
53
  if ("$typeName" in args[0] &&
58
54
  args[0].$typeName == "google.protobuf.FileDescriptorSet") {
59
55
  for (const file of args[0].file) {
@@ -80,7 +76,7 @@ function createFileRegistry(...args) {
80
76
  throw new Error(`Unable to resolve ${protoFileName}, imported by ${file.name}`);
81
77
  }
82
78
  if ("kind" in dep) {
83
- addDescFile(dep, registry);
79
+ registry.addFile(dep, false, true);
84
80
  }
85
81
  else {
86
82
  seen.add(dep.name);
@@ -96,10 +92,7 @@ function createFileRegistry(...args) {
96
92
  else {
97
93
  for (const fileReg of args) {
98
94
  for (const file of fileReg.files) {
99
- registry.add(file);
100
- for (const type of (0, nested_types_js_1.nestedTypes)(file)) {
101
- registry.add(type);
102
- }
95
+ registry.addFile(file);
103
96
  }
104
97
  }
105
98
  }
@@ -107,47 +100,46 @@ function createFileRegistry(...args) {
107
100
  }
108
101
  exports.createFileRegistry = createFileRegistry;
109
102
  /**
110
- * Create a mutable file registry.
111
103
  * @private
112
104
  */
113
- function createMutableRegistry() {
105
+ function createBaseRegistry() {
114
106
  const types = new Map();
115
107
  const extendees = new Map();
116
108
  const files = new Map();
117
109
  return {
118
110
  kind: "registry",
111
+ types,
112
+ extendees,
119
113
  [Symbol.iterator]() {
120
114
  return types.values();
121
115
  },
122
116
  get files() {
123
117
  return files.values();
124
118
  },
125
- add(desc) {
126
- switch (desc.kind) {
127
- case "file":
128
- files.set(desc.proto.name, desc);
129
- break;
130
- // @ts-expect-error TS7029
131
- case "extension":
132
- // eslint-disable-next-line no-case-declarations
133
- let numberToExt = extendees.get(desc.extendee.typeName);
134
- if (!numberToExt) {
135
- extendees.set(desc.extendee.typeName, (numberToExt = new Map()));
136
- }
137
- numberToExt.set(desc.number, desc);
138
- // eslint-disable-next-line no-fallthrough
139
- default:
140
- types.set(desc.typeName, desc);
119
+ addFile(file, skipTypes, withDeps) {
120
+ files.set(file.proto.name, file);
121
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
122
+ if (!skipTypes) {
123
+ for (const type of (0, nested_types_js_1.nestedTypes)(file)) {
124
+ this.add(type);
125
+ }
126
+ }
127
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
128
+ if (withDeps) {
129
+ for (const f of file.dependencies) {
130
+ this.addFile(f, skipTypes, withDeps);
131
+ }
141
132
  }
142
133
  },
143
- remove(desc) {
144
- switch (desc.kind) {
145
- case "file":
146
- files.delete(desc.proto.name);
147
- break;
148
- default:
149
- types.delete(desc.typeName);
134
+ add(desc) {
135
+ if (desc.kind == "extension") {
136
+ let numberToExt = extendees.get(desc.extendee.typeName);
137
+ if (!numberToExt) {
138
+ extendees.set(desc.extendee.typeName, (numberToExt = new Map()));
139
+ }
140
+ numberToExt.set(desc.number, desc);
150
141
  }
142
+ types.set(desc.typeName, desc);
151
143
  },
152
144
  get(typeName) {
153
145
  return types.get(typeName);
@@ -178,16 +170,26 @@ function createMutableRegistry() {
178
170
  };
179
171
  }
180
172
  /**
181
- * Add the file descriptor and the types it contains to the registry.
173
+ * @private
182
174
  */
183
- function addDescFile(file, reg) {
184
- reg.add(file);
185
- for (const type of (0, nested_types_js_1.nestedTypes)(file)) {
186
- reg.add(type);
187
- }
188
- for (const dep of file.dependencies) {
189
- addDescFile(dep, reg);
175
+ function initBaseRegistry(inputs) {
176
+ const registry = createBaseRegistry();
177
+ for (const input of inputs) {
178
+ switch (input.kind) {
179
+ case "registry":
180
+ for (const n of input) {
181
+ registry.add(n);
182
+ }
183
+ break;
184
+ case "file":
185
+ registry.addFile(input);
186
+ break;
187
+ default:
188
+ registry.add(input);
189
+ break;
190
+ }
190
191
  }
192
+ return registry;
191
193
  }
192
194
  // bootstrap-inject google.protobuf.Edition.EDITION_PROTO2: const $name: Edition.$localName = $number;
193
195
  const EDITION_PROTO2 = 998;
@@ -306,7 +308,7 @@ function addFile(proto, reg) {
306
308
  addFields(message, reg, mapEntries);
307
309
  addExtensions(message, reg);
308
310
  }
309
- reg.add(file);
311
+ reg.addFile(file, true);
310
312
  }
311
313
  /**
312
314
  * Create descriptors for extensions, and add them to the message / file,
@@ -17,7 +17,7 @@ export interface BinaryWriteOptions {
17
17
  */
18
18
  writeUnknownFields: boolean;
19
19
  }
20
- export declare function toBinary<Desc extends DescMessage>(messageDesc: Desc, message: MessageShape<Desc>, options?: Partial<BinaryWriteOptions>): Uint8Array;
20
+ export declare function toBinary<Desc extends DescMessage>(schema: Desc, message: MessageShape<Desc>, options?: Partial<BinaryWriteOptions>): Uint8Array;
21
21
  /**
22
22
  * @private
23
23
  */