@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
@@ -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
  }
@@ -12,7 +12,6 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  import { unsafeLocal } from "./unsafe.js";
15
- import { isMessage } from "../is-message.js";
16
15
  export function isObject(arg) {
17
16
  return arg !== null && typeof arg == "object" && !Array.isArray(arg);
18
17
  }
@@ -64,7 +63,8 @@ export function isReflectMap(arg, field) {
64
63
  export function isReflectMessage(arg, messageDesc) {
65
64
  return (isObject(arg) &&
66
65
  unsafeLocal in arg &&
67
- "message" in arg &&
68
- isMessage(arg.message) &&
69
- (messageDesc === undefined || arg.message.$typeName == messageDesc.typeName));
66
+ "desc" in arg &&
67
+ isObject(arg.desc) &&
68
+ arg.desc.kind === "message" &&
69
+ (messageDesc === undefined || arg.desc.typeName == messageDesc.typeName));
70
70
  }
@@ -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,22 +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;
112
- /**
113
- * Add an item to a list field.
114
- */
115
- addListItem<Field extends DescField & {
116
- fieldKind: "list";
117
- }>(field: Field, value: ReflectAddListItemValue<Field>): FieldError | undefined;
118
- /**
119
- * Set a map entry.
120
- */
121
- setMapEntry<Field extends DescField & {
122
- fieldKind: "map";
123
- }>(field: Field, key: MapEntryKey, value: ReflectSetMapEntryValue<Field>): FieldError | undefined;
110
+ set<Field extends DescField>(field: Field, value: unknown): void;
124
111
  /**
125
112
  * Returns the unknown fields of the message.
126
113
  */
@@ -159,16 +146,16 @@ export interface ReflectList<V = unknown> extends Iterable<V> {
159
146
  */
160
147
  get(index: number): V | undefined;
161
148
  /**
162
- * Adds an item - or several items - at the end of the list.
163
- * 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.
164
151
  */
165
- add(...item: V[]): FieldError | undefined;
152
+ add(item: V): void;
166
153
  /**
167
154
  * Replaces the item at the specified index with the specified item.
168
- * Returns an error if the index is out of range (index < 0 || index >= size).
169
- * 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.
170
157
  */
171
- set(index: number, item: V): FieldError | undefined;
158
+ set(index: number, item: V): void;
172
159
  /**
173
160
  * Removes all items from the list.
174
161
  */
@@ -190,7 +177,7 @@ export interface ReflectList<V = unknown> extends Iterable<V> {
190
177
  * ReflectMap converts keys to their closest possible type in TypeScript.
191
178
  * - Messages are wrapped in a ReflectMessage.
192
179
  */
193
- 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> {
194
181
  /**
195
182
  * Returns the map field.
196
183
  */
@@ -204,46 +191,19 @@ export interface ReflectMap<K extends MapEntryKey = MapEntryKey, V = unknown> ex
204
191
  delete(key: K): boolean;
205
192
  /**
206
193
  * Sets or replaces the item at the specified key with the specified value.
207
- * 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.
208
195
  */
209
- set(key: K, value: V): FieldError | undefined;
196
+ set(key: K, value: V): this;
210
197
  /**
211
198
  * Removes all entries from the map.
212
199
  */
213
200
  clear(): void;
214
201
  [unsafeLocal]: Record<string, unknown>;
215
202
  }
216
- /**
217
- * A ReflectMap key.
218
- */
219
- export type MapEntryKey = string | number | bigint | boolean;
220
- type enumVal = number;
221
203
  /**
222
204
  * The return type of ReflectMessage.get()
223
205
  */
224
- export type ReflectGetValue<Field extends DescField = DescField> = (Field extends {
225
- fieldKind: "map";
226
- } ? (Field extends {
227
- mapKind: "message";
228
- } ? ReflectMap<MapEntryKey, ReflectMessage> : Field extends {
229
- mapKind: "enum";
230
- } ? ReflectMap<MapEntryKey, enumVal> : Field extends {
231
- mapKind: "scalar";
232
- scalar: infer T;
233
- } ? ReflectMap<MapEntryKey, ScalarValue<T>> : never) : Field extends {
234
- fieldKind: "list";
235
- } ? ReflectList : Field extends {
236
- fieldKind: "enum";
237
- } ? number : Field extends {
238
- fieldKind: "message";
239
- } ? ReflectMessage : Field extends {
240
- fieldKind: "scalar";
241
- scalar: infer T;
242
- } ? ScalarValue<T> : never);
243
- /**
244
- * The type of the "value" argument of ReflectMessage.set()
245
- */
246
- export type ReflectSetValue<Field extends DescField = DescField> = (Field extends {
206
+ export type ReflectMessageGet<Field extends DescField = DescField> = (Field extends {
247
207
  fieldKind: "map";
248
208
  } ? ReflectMap : Field extends {
249
209
  fieldKind: "list";
@@ -255,30 +215,3 @@ export type ReflectSetValue<Field extends DescField = DescField> = (Field extend
255
215
  fieldKind: "scalar";
256
216
  scalar: infer T;
257
217
  } ? ScalarValue<T> : never);
258
- /**
259
- * The type of the "value" argument of ReflectMessage.addListItem()
260
- */
261
- export type ReflectAddListItemValue<Field extends DescField & {
262
- fieldKind: "list";
263
- }> = (Field extends {
264
- listKind: "scalar";
265
- scalar: infer T;
266
- } ? ScalarValue<T> : Field extends {
267
- listKind: "enum";
268
- } ? enumVal : Field extends {
269
- listKind: "message";
270
- } ? ReflectMessage : never);
271
- /**
272
- * The type of the "value" argument of ReflectMessage.setMapEntry()
273
- */
274
- export type ReflectSetMapEntryValue<Field extends DescField & {
275
- fieldKind: "map";
276
- }> = (Field extends {
277
- mapKind: "enum";
278
- } ? enumVal : Field extends {
279
- mapKind: "message";
280
- } ? ReflectMessage : Field extends {
281
- mapKind: "scalar";
282
- scalar: infer T;
283
- } ? ScalarValue<T> : never);
284
- export {};
@@ -12,5 +12,4 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  import {} from "../descriptors.js";
15
- import { FieldError } from "./error.js";
16
15
  import { unsafeLocal } from "./unsafe.js";
@@ -1,32 +1,43 @@
1
1
  import { type DescField, type DescMessage } from "../descriptors.js";
2
2
  import type { MessageShape } from "../types.js";
3
- import type { MapEntryKey, ReflectList, ReflectMap, ReflectMessage } from "./reflect-types.js";
3
+ import type { ReflectList, ReflectMap, ReflectMessage } from "./reflect-types.js";
4
4
  /**
5
5
  * Create a ReflectMessage.
6
6
  */
7
- export declare function reflect<Desc extends DescMessage>(messageDesc: Desc, message?: MessageShape<Desc>, opt?: {
8
- /**
9
- * By default, field values are validated when setting them. For example,
10
- * a value for an uint32 field must be a ECMAScript Number >= 0.
11
- *
12
- * Note that setting a message field validates the type of the message,
13
- * but does not check its fields.
14
- *
15
- * In some contexts, field values are trusted, and performance can be
16
- * improved by disabling validation by setting disableFieldValueCheck to
17
- * `false`.
18
- */
19
- disableFieldValueCheck?: boolean;
20
- }): ReflectMessage;
7
+ export declare function reflect<Desc extends DescMessage>(messageDesc: Desc, message?: MessageShape<Desc>,
8
+ /**
9
+ * By default, field values are validated when setting them. For example,
10
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
11
+ *
12
+ * When field values are trusted, performance can be improved by disabling
13
+ * checks.
14
+ */
15
+ check?: boolean): ReflectMessage;
21
16
  /**
22
17
  * Create a ReflectList.
23
18
  */
24
19
  export declare function reflectList<V>(field: DescField & {
25
20
  fieldKind: "list";
26
- }, unsafeInput?: unknown[], check?: boolean): ReflectList<V>;
21
+ }, unsafeInput?: unknown[],
22
+ /**
23
+ * By default, field values are validated when setting them. For example,
24
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
25
+ *
26
+ * When field values are trusted, performance can be improved by disabling
27
+ * checks.
28
+ */
29
+ check?: boolean): ReflectList<V>;
27
30
  /**
28
31
  * Create a ReflectMap.
29
32
  */
30
- export declare function reflectMap<K extends MapEntryKey, V>(field: DescField & {
33
+ export declare function reflectMap<K = unknown, V = unknown>(field: DescField & {
31
34
  fieldKind: "map";
32
- }, unsafeInput?: Record<string, unknown>, check?: boolean): ReflectMap<K, V>;
35
+ }, unsafeInput?: Record<string, unknown>,
36
+ /**
37
+ * By default, field values are validated when setting them. For example,
38
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
39
+ *
40
+ * When field values are trusted, performance can be improved by disabling
41
+ * checks.
42
+ */
43
+ check?: boolean): ReflectMap<K, V>;
@@ -14,19 +14,25 @@
14
14
  import { ScalarType, } from "../descriptors.js";
15
15
  import { checkField, checkListItem, checkMapEntry } from "./reflect-check.js";
16
16
  import { FieldError } from "./error.js";
17
- import { unsafeAddListItem, unsafeClear, unsafeGet, unsafeIsSet, unsafeLocal, unsafeOneofCase, unsafeSet, unsafeSetMapEntry, } from "./unsafe.js";
17
+ import { unsafeClear, unsafeGet, unsafeIsSet, unsafeLocal, unsafeOneofCase, unsafeSet, } from "./unsafe.js";
18
18
  import { create } from "../create.js";
19
19
  import { isWrapper, isWrapperDesc } from "../wkt/wrappers.js";
20
20
  import { scalarZeroValue } from "./scalar.js";
21
21
  import { protoInt64 } from "../proto-int64.js";
22
- import { isReflectList, isReflectMap, isReflectMessage } from "./guard.js";
22
+ import { isObject, isReflectList, isReflectMap, isReflectMessage, } from "./guard.js";
23
23
  /**
24
24
  * Create a ReflectMessage.
25
25
  */
26
26
  export function reflect(messageDesc, message,
27
- // TODO either remove this option, or support it in reflect-list and reflect-map as well
28
- opt) {
29
- return new ReflectMessageImpl(messageDesc, message, (opt === null || opt === void 0 ? void 0 : opt.disableFieldValueCheck) !== true);
27
+ /**
28
+ * By default, field values are validated when setting them. For example,
29
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
30
+ *
31
+ * When field values are trusted, performance can be improved by disabling
32
+ * checks.
33
+ */
34
+ check = true) {
35
+ return new ReflectMessageImpl(messageDesc, message, check);
30
36
  }
31
37
  class ReflectMessageImpl {
32
38
  get sortedFields() {
@@ -35,9 +41,9 @@ class ReflectMessageImpl {
35
41
  .concat()
36
42
  .sort((a, b) => a.number - b.number)));
37
43
  }
38
- constructor(messageDesc, message,
39
- // TODO either remove this option, or support it in reflect-list and reflect-map as well
40
- check = true) {
44
+ constructor(messageDesc, message, check = true) {
45
+ this.lists = new Map();
46
+ this.maps = new Map();
41
47
  this.check = check;
42
48
  this.desc = messageDesc;
43
49
  this.message = this[unsafeLocal] = message !== null && message !== void 0 ? message : create(messageDesc);
@@ -65,24 +71,24 @@ class ReflectMessageImpl {
65
71
  }
66
72
  get(field) {
67
73
  assertOwn(this.message, field);
68
- let value = unsafeGet(this.message, field);
74
+ const value = unsafeGet(this.message, field);
69
75
  switch (field.fieldKind) {
70
76
  case "list":
71
- return new ReflectListImpl(field, value, this.check);
77
+ // eslint-disable-next-line no-case-declarations
78
+ let list = this.lists.get(field);
79
+ if (!list || list[unsafeLocal] !== value) {
80
+ this.lists.set(field, (list = new ReflectListImpl(field, value, this.check)));
81
+ }
82
+ return list;
72
83
  case "map":
73
- // TODO fix types
74
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
75
- return reflectMap(field, value, this.check); // eslint-disable-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return
76
- case "message":
77
- if (value !== undefined &&
78
- !field.oneof &&
79
- isWrapperDesc(field.message)) {
80
- value = {
81
- $typeName: field.message.typeName,
82
- value: longToReflect(field.message.fields[0], value),
83
- };
84
+ // eslint-disable-next-line no-case-declarations
85
+ let map = this.maps.get(field);
86
+ if (!map || map[unsafeLocal] !== value) {
87
+ this.maps.set(field, (map = new ReflectMapImpl(field, value, this.check)));
84
88
  }
85
- return new ReflectMessageImpl(field.message, value, this.check);
89
+ return map;
90
+ case "message":
91
+ return messageToReflect(field, value, this.check);
86
92
  case "scalar":
87
93
  return (value === undefined
88
94
  ? scalarZeroValue(field.scalar, false)
@@ -96,46 +102,20 @@ class ReflectMessageImpl {
96
102
  if (this.check) {
97
103
  const err = checkField(field, value);
98
104
  if (err) {
99
- return err;
105
+ throw err;
100
106
  }
101
107
  }
102
108
  let local;
103
- if (isReflectMap(value) || isReflectList(value)) {
104
- local = value[unsafeLocal];
109
+ if (field.fieldKind == "message") {
110
+ local = messageToLocal(field, value);
105
111
  }
106
- else if (isReflectMessage(value)) {
107
- const msg = value.message;
108
- local = !field.oneof && isWrapper(msg) ? msg.value : msg;
112
+ else if (isReflectMap(value) || isReflectList(value)) {
113
+ local = value[unsafeLocal];
109
114
  }
110
115
  else {
111
116
  local = longToLocal(field, value);
112
117
  }
113
118
  unsafeSet(this.message, field, local);
114
- return undefined;
115
- }
116
- addListItem(field, value) {
117
- assertOwn(this.message, field);
118
- assertKind(field, "list");
119
- if (this.check) {
120
- if (checkListItem(field, 0, value)) {
121
- const arr = unsafeGet(this.message, field);
122
- return checkListItem(field, arr.length, value);
123
- }
124
- }
125
- unsafeAddListItem(this.message, field, listItemToLocal(field, value));
126
- return undefined;
127
- }
128
- setMapEntry(field, key, value) {
129
- assertOwn(this.message, field);
130
- assertKind(field, "map");
131
- if (this.check) {
132
- const err = checkMapEntry(field, key, value);
133
- if (err) {
134
- return err;
135
- }
136
- }
137
- unsafeSetMapEntry(this.message, field, mapKeyToLocal(key), mapValueToLocal(field, value));
138
- return undefined;
139
119
  }
140
120
  getUnknown() {
141
121
  return this.message.$unknown;
@@ -144,11 +124,6 @@ class ReflectMessageImpl {
144
124
  this.message.$unknown = value;
145
125
  }
146
126
  }
147
- function assertKind(field, kind) {
148
- if (field.fieldKind != kind) {
149
- throw new FieldError(field, `${field.toString()} is ${field.fieldKind}`, "ForeignFieldError");
150
- }
151
- }
152
127
  function assertOwn(owner, member) {
153
128
  if (member.parent.typeName !== owner.$typeName) {
154
129
  throw new FieldError(member, `cannot use ${member.toString()} with message ${owner.$typeName}`, "ForeignFieldError");
@@ -157,7 +132,15 @@ function assertOwn(owner, member) {
157
132
  /**
158
133
  * Create a ReflectList.
159
134
  */
160
- export function reflectList(field, unsafeInput, check = true) {
135
+ export function reflectList(field, unsafeInput,
136
+ /**
137
+ * By default, field values are validated when setting them. For example,
138
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
139
+ *
140
+ * When field values are trusted, performance can be improved by disabling
141
+ * checks.
142
+ */
143
+ check = true) {
161
144
  return new ReflectListImpl(field, unsafeInput !== null && unsafeInput !== void 0 ? unsafeInput : [], check);
162
145
  }
163
146
  class ReflectListImpl {
@@ -180,29 +163,24 @@ class ReflectListImpl {
180
163
  }
181
164
  set(index, item) {
182
165
  if (index < 0 || index >= this._arr.length) {
183
- return new FieldError(this._field, `list item #${index + 1}: out of range`);
166
+ throw new FieldError(this._field, `list item #${index + 1}: out of range`);
184
167
  }
185
168
  if (this.check) {
186
169
  const err = checkListItem(this._field, index, item);
187
170
  if (err) {
188
- return err;
171
+ throw err;
189
172
  }
190
173
  }
191
174
  this._arr[index] = listItemToLocal(this._field, item);
192
- return undefined;
193
175
  }
194
- add(...items) {
176
+ add(item) {
195
177
  if (this.check) {
196
- for (let i = 0; i < items.length; i++) {
197
- const err = checkListItem(this._field, this._arr.length + i, items[i]);
198
- if (err) {
199
- return err;
200
- }
178
+ const err = checkListItem(this._field, this._arr.length, item);
179
+ if (err) {
180
+ throw err;
201
181
  }
202
182
  }
203
- for (const item of items) {
204
- this._arr.push(listItemToLocal(this._field, item));
205
- }
183
+ this._arr.push(listItemToLocal(this._field, item));
206
184
  return undefined;
207
185
  }
208
186
  clear() {
@@ -228,7 +206,15 @@ class ReflectListImpl {
228
206
  /**
229
207
  * Create a ReflectMap.
230
208
  */
231
- export function reflectMap(field, unsafeInput, check = true) {
209
+ export function reflectMap(field, unsafeInput,
210
+ /**
211
+ * By default, field values are validated when setting them. For example,
212
+ * a value for an uint32 field must be a ECMAScript Number >= 0.
213
+ *
214
+ * When field values are trusted, performance can be improved by disabling
215
+ * checks.
216
+ */
217
+ check = true) {
232
218
  return new ReflectMapImpl(field, unsafeInput, check);
233
219
  }
234
220
  class ReflectMapImpl {
@@ -244,11 +230,11 @@ class ReflectMapImpl {
244
230
  if (this.check) {
245
231
  const err = checkMapEntry(this._field, key, value);
246
232
  if (err) {
247
- return err;
233
+ throw err;
248
234
  }
249
235
  }
250
236
  this.obj[mapKeyToLocal(key)] = mapValueToLocal(this._field, value);
251
- return undefined;
237
+ return this;
252
238
  }
253
239
  delete(key) {
254
240
  const k = mapKeyToLocal(key);
@@ -303,27 +289,68 @@ class ReflectMapImpl {
303
289
  }
304
290
  }
305
291
  }
292
+ function messageToLocal(field, value) {
293
+ if (!isReflectMessage(value)) {
294
+ return value;
295
+ }
296
+ if (isWrapper(value.message) &&
297
+ !field.oneof &&
298
+ field.fieldKind == "message") {
299
+ // Types from google/protobuf/wrappers.proto are unwrapped when used in
300
+ // a singular field that is not part of a oneof group.
301
+ return value.message.value;
302
+ }
303
+ if (value.desc.typeName == "google.protobuf.Struct" &&
304
+ field.parent.typeName != "google.protobuf.Value") {
305
+ // google.protobuf.Struct is represented with JsonObject when used in a
306
+ // field, except when used in google.protobuf.Value.
307
+ return wktStructToLocal(value.message);
308
+ }
309
+ return value.message;
310
+ }
311
+ function messageToReflect(field, value, check) {
312
+ if (value !== undefined) {
313
+ if (isWrapperDesc(field.message) &&
314
+ !field.oneof &&
315
+ field.fieldKind == "message") {
316
+ // Types from google/protobuf/wrappers.proto are unwrapped when used in
317
+ // a singular field that is not part of a oneof group.
318
+ value = {
319
+ $typeName: field.message.typeName,
320
+ value: longToReflect(field.message.fields[0], value),
321
+ };
322
+ }
323
+ else if (field.message.typeName == "google.protobuf.Struct" &&
324
+ field.parent.typeName != "google.protobuf.Value" &&
325
+ isObject(value)) {
326
+ // google.protobuf.Struct is represented with JsonObject when used in a
327
+ // field, except when used in google.protobuf.Value.
328
+ value = wktStructToReflect(value);
329
+ }
330
+ }
331
+ return new ReflectMessageImpl(field.message, value, check);
332
+ }
306
333
  function listItemToLocal(field, value) {
307
- if (isReflectMessage(value)) {
308
- return value.message;
334
+ if (field.listKind == "message") {
335
+ return messageToLocal(field, value);
309
336
  }
310
337
  return longToLocal(field, value);
311
338
  }
312
339
  function listItemToReflect(field, value, check) {
313
340
  if (field.listKind == "message") {
314
- return new ReflectMessageImpl(field.message, value, check);
341
+ return messageToReflect(field, value, check);
315
342
  }
316
343
  return longToReflect(field, value);
317
344
  }
318
345
  function mapValueToLocal(field, value) {
319
- if (isReflectMessage(value)) {
320
- return value.message;
346
+ if (field.mapKind == "message") {
347
+ return messageToLocal(field, value);
321
348
  }
322
349
  return longToLocal(field, value);
323
350
  }
324
351
  function mapValueToReflect(field, value, check) {
325
352
  if (field.mapKind == "message") {
326
- return new ReflectMessageImpl(field.message, value, check);
353
+ return messageToReflect(field, value, check);
327
354
  }
328
355
  return value;
329
356
  }
@@ -427,3 +454,81 @@ function longToLocal(field, value) {
427
454
  }
428
455
  return value;
429
456
  }
457
+ function wktStructToReflect(json) {
458
+ const struct = {
459
+ $typeName: "google.protobuf.Struct",
460
+ fields: {},
461
+ };
462
+ if (isObject(json)) {
463
+ for (const [k, v] of Object.entries(json)) {
464
+ struct.fields[k] = wktValueToReflect(v);
465
+ }
466
+ }
467
+ return struct;
468
+ }
469
+ function wktStructToLocal(val) {
470
+ const json = {};
471
+ for (const [k, v] of Object.entries(val.fields)) {
472
+ json[k] = wktValueToLocal(v);
473
+ }
474
+ return json;
475
+ }
476
+ function wktValueToLocal(val) {
477
+ switch (val.kind.case) {
478
+ case "structValue":
479
+ return wktStructToLocal(val.kind.value);
480
+ case "listValue":
481
+ return val.kind.value.values.map(wktValueToLocal);
482
+ case "nullValue":
483
+ case undefined:
484
+ return null;
485
+ default:
486
+ return val.kind.value;
487
+ }
488
+ }
489
+ function wktValueToReflect(json) {
490
+ const value = {
491
+ $typeName: "google.protobuf.Value",
492
+ kind: { case: undefined },
493
+ };
494
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- invalid input is unselected kind
495
+ switch (typeof json) {
496
+ case "number":
497
+ value.kind = { case: "numberValue", value: json };
498
+ break;
499
+ case "string":
500
+ value.kind = { case: "stringValue", value: json };
501
+ break;
502
+ case "boolean":
503
+ value.kind = { case: "boolValue", value: json };
504
+ break;
505
+ case "object":
506
+ if (json === null) {
507
+ const nullValue = 0;
508
+ value.kind = { case: "nullValue", value: nullValue };
509
+ }
510
+ else if (Array.isArray(json)) {
511
+ const listValue = {
512
+ $typeName: "google.protobuf.ListValue",
513
+ values: [],
514
+ };
515
+ if (Array.isArray(json)) {
516
+ for (const e of json) {
517
+ listValue.values.push(wktValueToReflect(e));
518
+ }
519
+ }
520
+ value.kind = {
521
+ case: "listValue",
522
+ value: listValue,
523
+ };
524
+ }
525
+ else {
526
+ value.kind = {
527
+ case: "structValue",
528
+ value: wktStructToReflect(json),
529
+ };
530
+ }
531
+ break;
532
+ }
533
+ return value;
534
+ }
@@ -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;