@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
@@ -137,19 +137,3 @@ field) {
137
137
  }
138
138
  }
139
139
  }
140
- /**
141
- * Add an item to a list field.
142
- *
143
- * @private
144
- */
145
- export function unsafeAddListItem(target, field, value) {
146
- target[field.localName].push(value);
147
- }
148
- /**
149
- * Set a map entry.
150
- *
151
- * @private
152
- */
153
- export function unsafeSetMapEntry(target, field, key, value) {
154
- target[field.localName][key] = value;
155
- }
@@ -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.
@@ -28,28 +28,23 @@ import { protoCamelCase, safeObjectProperty } from "./reflect/names.js";
28
28
  * For duplicate descriptors (same type name), the one given last wins.
29
29
  */
30
30
  export function createRegistry(...input) {
31
- const reg = createMutableRegistry();
32
- for (const i of input) {
33
- switch (i.kind) {
34
- case "registry":
35
- for (const n of i) {
36
- reg.add(n);
37
- }
38
- break;
39
- case "file":
40
- for (const n of nestedTypes(i)) {
41
- reg.add(n);
42
- }
43
- break;
44
- default:
45
- reg.add(i);
46
- break;
47
- }
48
- }
49
- return reg;
31
+ return initBaseRegistry(input);
32
+ }
33
+ /**
34
+ * Create a registry that allows adding and removing descriptors.
35
+ */
36
+ export function createMutableRegistry(...input) {
37
+ const reg = initBaseRegistry(input);
38
+ return Object.assign(Object.assign({}, reg), { remove(desc) {
39
+ var _a;
40
+ if (desc.kind == "extension") {
41
+ (_a = reg.extendees.get(desc.extendee.typeName)) === null || _a === void 0 ? void 0 : _a.delete(desc.number);
42
+ }
43
+ reg.types.delete(desc.typeName);
44
+ } });
50
45
  }
51
46
  export function createFileRegistry(...args) {
52
- const registry = createMutableRegistry();
47
+ const registry = createBaseRegistry();
53
48
  if ("$typeName" in args[0] &&
54
49
  args[0].$typeName == "google.protobuf.FileDescriptorSet") {
55
50
  for (const file of args[0].file) {
@@ -76,7 +71,7 @@ export function createFileRegistry(...args) {
76
71
  throw new Error(`Unable to resolve ${protoFileName}, imported by ${file.name}`);
77
72
  }
78
73
  if ("kind" in dep) {
79
- addDescFile(dep, registry);
74
+ registry.addFile(dep, false, true);
80
75
  }
81
76
  else {
82
77
  seen.add(dep.name);
@@ -92,57 +87,53 @@ export function createFileRegistry(...args) {
92
87
  else {
93
88
  for (const fileReg of args) {
94
89
  for (const file of fileReg.files) {
95
- registry.add(file);
96
- for (const type of nestedTypes(file)) {
97
- registry.add(type);
98
- }
90
+ registry.addFile(file);
99
91
  }
100
92
  }
101
93
  }
102
94
  return registry;
103
95
  }
104
96
  /**
105
- * Create a mutable file registry.
106
97
  * @private
107
98
  */
108
- function createMutableRegistry() {
99
+ function createBaseRegistry() {
109
100
  const types = new Map();
110
101
  const extendees = new Map();
111
102
  const files = new Map();
112
103
  return {
113
104
  kind: "registry",
105
+ types,
106
+ extendees,
114
107
  [Symbol.iterator]() {
115
108
  return types.values();
116
109
  },
117
110
  get files() {
118
111
  return files.values();
119
112
  },
120
- add(desc) {
121
- switch (desc.kind) {
122
- case "file":
123
- files.set(desc.proto.name, desc);
124
- break;
125
- // @ts-expect-error TS7029
126
- case "extension":
127
- // eslint-disable-next-line no-case-declarations
128
- let numberToExt = extendees.get(desc.extendee.typeName);
129
- if (!numberToExt) {
130
- extendees.set(desc.extendee.typeName, (numberToExt = new Map()));
131
- }
132
- numberToExt.set(desc.number, desc);
133
- // eslint-disable-next-line no-fallthrough
134
- default:
135
- types.set(desc.typeName, desc);
113
+ addFile(file, skipTypes, withDeps) {
114
+ files.set(file.proto.name, file);
115
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
116
+ if (!skipTypes) {
117
+ for (const type of nestedTypes(file)) {
118
+ this.add(type);
119
+ }
120
+ }
121
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
122
+ if (withDeps) {
123
+ for (const f of file.dependencies) {
124
+ this.addFile(f, skipTypes, withDeps);
125
+ }
136
126
  }
137
127
  },
138
- remove(desc) {
139
- switch (desc.kind) {
140
- case "file":
141
- files.delete(desc.proto.name);
142
- break;
143
- default:
144
- types.delete(desc.typeName);
128
+ add(desc) {
129
+ if (desc.kind == "extension") {
130
+ let numberToExt = extendees.get(desc.extendee.typeName);
131
+ if (!numberToExt) {
132
+ extendees.set(desc.extendee.typeName, (numberToExt = new Map()));
133
+ }
134
+ numberToExt.set(desc.number, desc);
145
135
  }
136
+ types.set(desc.typeName, desc);
146
137
  },
147
138
  get(typeName) {
148
139
  return types.get(typeName);
@@ -173,16 +164,26 @@ function createMutableRegistry() {
173
164
  };
174
165
  }
175
166
  /**
176
- * Add the file descriptor and the types it contains to the registry.
167
+ * @private
177
168
  */
178
- function addDescFile(file, reg) {
179
- reg.add(file);
180
- for (const type of nestedTypes(file)) {
181
- reg.add(type);
182
- }
183
- for (const dep of file.dependencies) {
184
- addDescFile(dep, reg);
169
+ function initBaseRegistry(inputs) {
170
+ const registry = createBaseRegistry();
171
+ for (const input of inputs) {
172
+ switch (input.kind) {
173
+ case "registry":
174
+ for (const n of input) {
175
+ registry.add(n);
176
+ }
177
+ break;
178
+ case "file":
179
+ registry.addFile(input);
180
+ break;
181
+ default:
182
+ registry.add(input);
183
+ break;
184
+ }
185
185
  }
186
+ return registry;
186
187
  }
187
188
  // bootstrap-inject google.protobuf.Edition.EDITION_PROTO2: const $name: Edition.$localName = $number;
188
189
  const EDITION_PROTO2 = 998;
@@ -301,7 +302,7 @@ function addFile(proto, reg) {
301
302
  addFields(message, reg, mapEntries);
302
303
  addExtensions(message, reg);
303
304
  }
304
- reg.add(file);
305
+ reg.addFile(file, true);
305
306
  }
306
307
  /**
307
308
  * 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
  */
@@ -23,8 +23,8 @@ const writeDefaults = {
23
23
  function makeWriteOptions(options) {
24
24
  return options ? Object.assign(Object.assign({}, writeDefaults), options) : writeDefaults;
25
25
  }
26
- export function toBinary(messageDesc, message, options) {
27
- return writeFields(new BinaryWriter(), makeWriteOptions(options), reflect(messageDesc, message)).finish();
26
+ export function toBinary(schema, message, options) {
27
+ return writeFields(new BinaryWriter(), makeWriteOptions(options), reflect(schema, message)).finish();
28
28
  }
29
29
  function writeFields(writer, opts, msg) {
30
30
  var _a;
@@ -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, MessageJsonType, MessageShape } from "./types.js";
5
5
  /**
6
6
  * Options for serializing to JSON.
7
7
  */
@@ -44,8 +44,18 @@ export interface JsonWriteStringOptions extends JsonWriteOptions {
44
44
  * Serialize the message to a JSON value, a JavaScript value that can be
45
45
  * passed to JSON.stringify().
46
46
  */
47
- export declare function toJson<Desc extends DescMessage>(messageDesc: Desc, message: MessageShape<Desc>, options?: Partial<JsonWriteOptions>): JsonValue;
47
+ export declare function toJson<Desc extends DescMessage, Opts extends Partial<JsonWriteOptions> | undefined = undefined>(schema: Desc, message: MessageShape<Desc>, options?: Opts): ToJson<Desc, Opts>;
48
+ type ToJson<Desc extends DescMessage, Opts extends undefined | Partial<JsonWriteOptions>> = Opts extends undefined | {
49
+ alwaysEmitImplicit?: false;
50
+ enumAsInteger?: false;
51
+ useProtoFieldName?: false;
52
+ } ? MessageJsonType<Desc> : JsonValue;
48
53
  /**
49
54
  * Serialize the message to a JSON string.
50
55
  */
51
- export declare function toJsonString<Desc extends DescMessage>(messageDesc: Desc, message: MessageShape<Desc>, options?: Partial<JsonWriteStringOptions>): string;
56
+ export declare function toJsonString<Desc extends DescMessage>(schema: Desc, message: MessageShape<Desc>, options?: Partial<JsonWriteStringOptions>): string;
57
+ /**
58
+ * Serialize a single enum value to JSON.
59
+ */
60
+ export declare function enumToJson<Desc extends DescEnum>(descEnum: Desc, value: EnumShape<Desc>): EnumJsonType<Desc>;
61
+ export {};
@@ -37,17 +37,31 @@ function makeWriteOptions(options) {
37
37
  * Serialize the message to a JSON value, a JavaScript value that can be
38
38
  * passed to JSON.stringify().
39
39
  */
40
- export function toJson(messageDesc, message, options) {
41
- return reflectToJson(reflect(messageDesc, message), makeWriteOptions(options));
40
+ export function toJson(schema, message, options) {
41
+ return reflectToJson(reflect(schema, message), makeWriteOptions(options));
42
42
  }
43
43
  /**
44
44
  * Serialize the message to a JSON string.
45
45
  */
46
- export function toJsonString(messageDesc, message, options) {
46
+ export function toJsonString(schema, message, options) {
47
47
  var _a;
48
- const jsonValue = toJson(messageDesc, message, options);
48
+ const jsonValue = toJson(schema, message, options);
49
49
  return JSON.stringify(jsonValue, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);
50
50
  }
51
+ /**
52
+ * Serialize a single enum value to JSON.
53
+ */
54
+ export function enumToJson(descEnum, value) {
55
+ var _a;
56
+ if (descEnum.typeName == "google.protobuf.NullValue") {
57
+ return null;
58
+ }
59
+ const name = (_a = descEnum.values.find((v) => v.number === value)) === null || _a === void 0 ? void 0 : _a.name;
60
+ if (name === undefined) {
61
+ throw new Error(`${String(value)} is not a value in ${descEnum.toString()}`);
62
+ }
63
+ return name;
64
+ }
51
65
  function reflectToJson(msg, opts) {
52
66
  var _a;
53
67
  const wktJson = tryWktToJson(msg, opts);
@@ -98,7 +112,7 @@ function fieldToJson(f, val, opts) {
98
112
  case "message":
99
113
  return reflectToJson(val, opts);
100
114
  case "enum":
101
- return enumToJson(f.enum, val, opts.enumAsInteger);
115
+ return enumToJsonInternal(f.enum, val, opts.enumAsInteger);
102
116
  case "list":
103
117
  return listToJson(val, opts);
104
118
  case "map":
@@ -111,19 +125,17 @@ function mapToJson(map, opts) {
111
125
  switch (f.mapKind) {
112
126
  case "scalar":
113
127
  for (const [entryKey, entryValue] of map) {
114
- jsonObj[entryKey.toString()] = scalarToJson(f, entryValue); // JSON standard allows only (double quoted) string as property key
128
+ jsonObj[entryKey] = scalarToJson(f, entryValue);
115
129
  }
116
130
  break;
117
131
  case "message":
118
132
  for (const [entryKey, entryValue] of map) {
119
- // JSON standard allows only (double quoted) string as property key
120
- jsonObj[entryKey.toString()] = reflectToJson(entryValue, opts);
133
+ jsonObj[entryKey] = reflectToJson(entryValue, opts);
121
134
  }
122
135
  break;
123
136
  case "enum":
124
137
  for (const [entryKey, entryValue] of map) {
125
- // JSON standard allows only (double quoted) string as property key
126
- jsonObj[entryKey.toString()] = enumToJson(f.enum, entryValue, opts.enumAsInteger);
138
+ jsonObj[entryKey] = enumToJsonInternal(f.enum, entryValue, opts.enumAsInteger);
127
139
  }
128
140
  break;
129
141
  }
@@ -140,7 +152,7 @@ function listToJson(list, opts) {
140
152
  break;
141
153
  case "enum":
142
154
  for (const item of list) {
143
- jsonArr.push(enumToJson(f.enum, item, opts.enumAsInteger));
155
+ jsonArr.push(enumToJsonInternal(f.enum, item, opts.enumAsInteger));
144
156
  }
145
157
  break;
146
158
  case "message":
@@ -151,7 +163,7 @@ function listToJson(list, opts) {
151
163
  }
152
164
  return opts.alwaysEmitImplicit || jsonArr.length > 0 ? jsonArr : undefined;
153
165
  }
154
- function enumToJson(desc, value, enumAsInteger) {
166
+ function enumToJsonInternal(desc, value, enumAsInteger) {
155
167
  var _a;
156
168
  if (typeof value != "number") {
157
169
  throw new Error(`cannot encode ${desc} to JSON: expected number, got ${formatVal(value)}`);
@@ -2,6 +2,7 @@ import type { GenDescEnum, GenDescExtension, GenDescMessage } from "./codegenv1/
2
2
  import type { DescEnum, DescExtension, DescMessage } from "./descriptors.js";
3
3
  import type { OneofADT } from "./reflect/guard.js";
4
4
  import type { WireType } from "./wire/index.js";
5
+ import type { JsonValue } from "./json-value.js";
5
6
  /**
6
7
  * The type `Message` contains the properties shared by all messages.
7
8
  */
@@ -19,6 +20,10 @@ export type Message<TypeName extends string = string> = {
19
20
  * Extract the message type from a message descriptor.
20
21
  */
21
22
  export type MessageShape<Desc extends DescMessage> = Desc extends GenDescMessage<infer RuntimeShape> ? RuntimeShape : Message;
23
+ /**
24
+ * Extract the message JSON type from a message descriptor.
25
+ */
26
+ export type MessageJsonType<Desc extends DescMessage> = Desc extends GenDescMessage<Message, infer JsonType> ? JsonType : JsonValue;
22
27
  /**
23
28
  * Extract the init type from a message descriptor.
24
29
  * The init type is accepted by the function create().
@@ -28,6 +33,10 @@ export type MessageInitShape<Desc extends DescMessage> = Desc extends GenDescMes
28
33
  * Extract the enum type of from an enum descriptor.
29
34
  */
30
35
  export type EnumShape<Desc extends DescEnum> = Desc extends GenDescEnum<infer RuntimeShape> ? RuntimeShape : number;
36
+ /**
37
+ * Extract the enum JSON type from a enum descriptor.
38
+ */
39
+ export type EnumJsonType<Desc extends DescEnum> = Desc extends GenDescEnum<unknown, infer JsonType> ? JsonType : string | null;
31
40
  /**
32
41
  * Extract the value type from an extension descriptor.
33
42
  */
@@ -457,29 +457,50 @@ export class BinaryReader {
457
457
  }
458
458
  }
459
459
  /**
460
- * Assert a valid signed protobuf 32-bit integer.
460
+ * Assert a valid signed protobuf 32-bit integer as a number or string.
461
461
  */
462
462
  function assertInt32(arg) {
463
- if (typeof arg !== "number")
463
+ if (typeof arg == "string") {
464
+ arg = Number(arg);
465
+ }
466
+ else if (typeof arg != "number") {
464
467
  throw new Error("invalid int32: " + typeof arg);
465
- if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
468
+ }
469
+ if (!Number.isInteger(arg) ||
470
+ arg > INT32_MAX ||
471
+ arg < INT32_MIN)
466
472
  throw new Error("invalid int32: " + arg);
467
473
  }
468
474
  /**
469
- * Assert a valid unsigned protobuf 32-bit integer.
475
+ * Assert a valid unsigned protobuf 32-bit integer as a number or string.
470
476
  */
471
477
  function assertUInt32(arg) {
472
- if (typeof arg !== "number")
478
+ if (typeof arg == "string") {
479
+ arg = Number(arg);
480
+ }
481
+ else if (typeof arg != "number") {
473
482
  throw new Error("invalid uint32: " + typeof arg);
474
- if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
483
+ }
484
+ if (!Number.isInteger(arg) ||
485
+ arg > UINT32_MAX ||
486
+ arg < 0)
475
487
  throw new Error("invalid uint32: " + arg);
476
488
  }
477
489
  /**
478
- * Assert a valid protobuf float value.
490
+ * Assert a valid protobuf float value as a number or string.
479
491
  */
480
492
  function assertFloat32(arg) {
481
- if (typeof arg !== "number")
493
+ if (typeof arg == "string") {
494
+ const o = arg;
495
+ arg = Number(arg);
496
+ if (isNaN(arg) && o !== "NaN") {
497
+ throw new Error("invalid float32: " + o);
498
+ }
499
+ }
500
+ else if (typeof arg != "number") {
482
501
  throw new Error("invalid float32: " + typeof arg);
483
- if (Number.isFinite(arg) && (arg > FLOAT32_MAX || arg < FLOAT32_MIN))
502
+ }
503
+ if (Number.isFinite(arg) &&
504
+ (arg > FLOAT32_MAX || arg < FLOAT32_MIN))
484
505
  throw new Error("invalid float32: " + arg);
485
506
  }
@@ -5,15 +5,15 @@ import type { Registry } from "../registry.js";
5
5
  /**
6
6
  * Creates a `google.protobuf.Any` from a message.
7
7
  */
8
- export declare function anyPack<Desc extends DescMessage>(messageDesc: Desc, message: MessageShape<Desc>): Any;
8
+ export declare function anyPack<Desc extends DescMessage>(schema: Desc, message: MessageShape<Desc>): Any;
9
9
  /**
10
10
  * Packs the message into the given any.
11
11
  */
12
- export declare function anyPack<Desc extends DescMessage>(messageDesc: Desc, message: MessageShape<Desc>, into: Any): void;
12
+ export declare function anyPack<Desc extends DescMessage>(schema: Desc, message: MessageShape<Desc>, into: Any): void;
13
13
  /**
14
- * Returns true if the Any contains the type given by messageDesc.
14
+ * Returns true if the Any contains the type given by schema.
15
15
  */
16
- export declare function anyIs(any: Any, messageDesc: DescMessage): boolean;
16
+ export declare function anyIs(any: Any, schema: DescMessage): boolean;
17
17
  /**
18
18
  * Returns true if the Any contains a message with the given typeName.
19
19
  */
@@ -29,10 +29,10 @@ export declare function anyUnpack(any: Any, registry: Registry): Message | undef
29
29
  * Unpacks the message the Any represents.
30
30
  *
31
31
  * Returns undefined if the Any is empty, or if it does not contain the type
32
- * given by messageDesc.
32
+ * given by schema.
33
33
  */
34
- export declare function anyUnpack<Desc extends DescMessage>(any: Any, messageDesc: Desc): MessageShape<Desc> | undefined;
34
+ export declare function anyUnpack<Desc extends DescMessage>(any: Any, schema: Desc): MessageShape<Desc> | undefined;
35
35
  /**
36
36
  * Same as anyUnpack but unpacks into the target message.
37
37
  */
38
- export declare function anyUnpackTo<Desc extends DescMessage>(any: Any, messageDesc: Desc, message: MessageShape<Desc>): void;
38
+ export declare function anyUnpackTo<Desc extends DescMessage>(any: Any, schema: Desc, message: MessageShape<Desc>): MessageShape<Desc> | undefined;
@@ -11,17 +11,17 @@
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
- import { AnyDesc } from "./gen/google/protobuf/any_pb.js";
14
+ import { AnySchema } from "./gen/google/protobuf/any_pb.js";
15
15
  import { create } from "../create.js";
16
16
  import { toBinary } from "../to-binary.js";
17
17
  import { fromBinary, mergeFromBinary } from "../from-binary.js";
18
- export function anyPack(messageDesc, message, into) {
18
+ export function anyPack(schema, message, into) {
19
19
  let ret = false;
20
20
  if (!into) {
21
- into = create(AnyDesc);
21
+ into = create(AnySchema);
22
22
  ret = true;
23
23
  }
24
- into.value = toBinary(messageDesc, message);
24
+ into.value = toBinary(schema, message);
25
25
  into.typeUrl = typeNameToUrl(message.$typeName);
26
26
  return ret ? into : undefined;
27
27
  }
@@ -50,11 +50,11 @@ export function anyUnpack(any, registryOrMessageDesc) {
50
50
  /**
51
51
  * Same as anyUnpack but unpacks into the target message.
52
52
  */
53
- export function anyUnpackTo(any, messageDesc, message) {
53
+ export function anyUnpackTo(any, schema, message) {
54
54
  if (any.typeUrl === "") {
55
55
  return undefined;
56
56
  }
57
- return mergeFromBinary(messageDesc, message, any.value);
57
+ return mergeFromBinary(schema, message, any.value);
58
58
  }
59
59
  function typeNameToUrl(name) {
60
60
  return `type.googleapis.com/${name}`;
@@ -3,7 +3,7 @@ import type { Message } from "../../../../types.js";
3
3
  /**
4
4
  * Describes the file google/protobuf/any.proto.
5
5
  */
6
- export declare const fileDesc_google_protobuf_any: GenDescFile;
6
+ export declare const file_google_protobuf_any: GenDescFile;
7
7
  /**
8
8
  * `Any` contains an arbitrary serialized protocol buffer message along with a
9
9
  * URL that describes the type of the serialized message.
@@ -136,8 +136,14 @@ export type Any = Message<"google.protobuf.Any"> & {
136
136
  */
137
137
  value: Uint8Array;
138
138
  };
139
+ /**
140
+ * JSON type for the message google.protobuf.Any.
141
+ */
142
+ export type AnyJson = {
143
+ "@type"?: string;
144
+ };
139
145
  /**
140
146
  * Describes the message google.protobuf.Any.
141
- * Use `create(AnyDesc)` to create a new message.
147
+ * Use `create(AnySchema)` to create a new message.
142
148
  */
143
- export declare const AnyDesc: GenDescMessage<Any>;
149
+ export declare const AnySchema: GenDescMessage<Any, AnyJson>;
@@ -16,9 +16,9 @@ import { messageDesc } from "../../../../codegenv1/message.js";
16
16
  /**
17
17
  * Describes the file google/protobuf/any.proto.
18
18
  */
19
- export const fileDesc_google_protobuf_any = /*@__PURE__*/ fileDesc("Chlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiJgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM");
19
+ export const file_google_protobuf_any = /*@__PURE__*/ fileDesc("Chlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiJgoDQW55EhAKCHR5cGVfdXJsGAEgASgJEg0KBXZhbHVlGAIgASgMQnYKE2NvbS5nb29nbGUucHJvdG9idWZCCEFueVByb3RvUAFaLGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2FueXBiogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzM");
20
20
  /**
21
21
  * Describes the message google.protobuf.Any.
22
- * Use `create(AnyDesc)` to create a new message.
22
+ * Use `create(AnySchema)` to create a new message.
23
23
  */
24
- export const AnyDesc = /*@__PURE__*/ messageDesc(fileDesc_google_protobuf_any, 0);
24
+ export const AnySchema = /*@__PURE__*/ messageDesc(file_google_protobuf_any, 0);