@bufbuild/protobuf 0.0.1-alpha.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 (146) hide show
  1. package/README.md +6 -0
  2. package/dist/cjs/binary-encoding.js +434 -0
  3. package/dist/cjs/binary-format.js +2 -0
  4. package/dist/cjs/descriptor-registry.js +518 -0
  5. package/dist/cjs/descriptor-set.js +557 -0
  6. package/dist/cjs/enum.js +2 -0
  7. package/dist/cjs/field-list.js +2 -0
  8. package/dist/cjs/field.js +40 -0
  9. package/dist/cjs/google/protobuf/any_pb.js +280 -0
  10. package/dist/cjs/google/protobuf/api_pb.js +383 -0
  11. package/dist/cjs/google/protobuf/compiler/plugin_pb.js +334 -0
  12. package/dist/cjs/google/protobuf/descriptor_pb.js +2311 -0
  13. package/dist/cjs/google/protobuf/duration_pb.js +201 -0
  14. package/dist/cjs/google/protobuf/empty_pb.js +72 -0
  15. package/dist/cjs/google/protobuf/field_mask_pb.js +347 -0
  16. package/dist/cjs/google/protobuf/source_context_pb.js +74 -0
  17. package/dist/cjs/google/protobuf/struct_pb.js +288 -0
  18. package/dist/cjs/google/protobuf/timestamp_pb.js +271 -0
  19. package/dist/cjs/google/protobuf/type_pb.js +613 -0
  20. package/dist/cjs/google/protobuf/wrappers_pb.js +658 -0
  21. package/dist/cjs/google/varint.js +280 -0
  22. package/dist/cjs/index.js +148 -0
  23. package/dist/cjs/json-format.js +2 -0
  24. package/dist/cjs/message-type.js +2 -0
  25. package/dist/cjs/message.js +98 -0
  26. package/dist/cjs/private/assert.js +52 -0
  27. package/dist/cjs/private/base64.js +118 -0
  28. package/dist/cjs/private/binary-format-common.js +253 -0
  29. package/dist/cjs/private/binary-format-proto2.js +120 -0
  30. package/dist/cjs/private/binary-format-proto3.js +102 -0
  31. package/dist/cjs/private/enum.js +70 -0
  32. package/dist/cjs/private/field-list.js +62 -0
  33. package/dist/cjs/private/field-wrapper.js +25 -0
  34. package/dist/cjs/private/field.js +34 -0
  35. package/dist/cjs/private/json-format-common.js +482 -0
  36. package/dist/cjs/private/json-format-proto2.js +100 -0
  37. package/dist/cjs/private/json-format-proto3.js +103 -0
  38. package/dist/cjs/private/message-type.js +37 -0
  39. package/dist/cjs/private/names.js +101 -0
  40. package/dist/cjs/private/options-map.js +2 -0
  41. package/dist/cjs/private/proto-runtime.js +24 -0
  42. package/dist/cjs/private/scalars.js +138 -0
  43. package/dist/cjs/private/util-common.js +229 -0
  44. package/dist/cjs/private/util.js +2 -0
  45. package/dist/cjs/proto-int64.js +121 -0
  46. package/dist/cjs/proto2.js +86 -0
  47. package/dist/cjs/proto3.js +99 -0
  48. package/dist/cjs/service-type.js +43 -0
  49. package/dist/cjs/type-registry.js +42 -0
  50. package/dist/esm/binary-encoding.js +434 -0
  51. package/dist/esm/binary-format.js +1 -0
  52. package/dist/esm/descriptor-registry.js +521 -0
  53. package/dist/esm/descriptor-set.js +517 -0
  54. package/dist/esm/enum.js +1 -0
  55. package/dist/esm/field-list.js +1 -0
  56. package/dist/esm/field.js +37 -0
  57. package/dist/esm/google/protobuf/any_pb.js +276 -0
  58. package/dist/esm/google/protobuf/api_pb.js +350 -0
  59. package/dist/esm/google/protobuf/compiler/plugin_pb.js +318 -0
  60. package/dist/esm/google/protobuf/descriptor_pb.js +2213 -0
  61. package/dist/esm/google/protobuf/duration_pb.js +197 -0
  62. package/dist/esm/google/protobuf/empty_pb.js +68 -0
  63. package/dist/esm/google/protobuf/field_mask_pb.js +343 -0
  64. package/dist/esm/google/protobuf/source_context_pb.js +70 -0
  65. package/dist/esm/google/protobuf/struct_pb.js +282 -0
  66. package/dist/esm/google/protobuf/timestamp_pb.js +267 -0
  67. package/dist/esm/google/protobuf/type_pb.js +569 -0
  68. package/dist/esm/google/protobuf/wrappers_pb.js +574 -0
  69. package/dist/esm/google/varint.js +265 -0
  70. package/dist/esm/index.js +24 -0
  71. package/dist/esm/json-format.js +1 -0
  72. package/dist/esm/message-type.js +1 -0
  73. package/dist/esm/message.js +94 -0
  74. package/dist/esm/private/assert.js +41 -0
  75. package/dist/esm/private/base64.js +113 -0
  76. package/dist/esm/private/binary-format-common.js +243 -0
  77. package/dist/esm/private/binary-format-proto2.js +87 -0
  78. package/dist/esm/private/binary-format-proto3.js +74 -0
  79. package/dist/esm/private/enum.js +64 -0
  80. package/dist/esm/private/field-list.js +58 -0
  81. package/dist/esm/private/field-wrapper.js +20 -0
  82. package/dist/esm/private/field.js +27 -0
  83. package/dist/esm/private/json-format-common.js +473 -0
  84. package/dist/esm/private/json-format-proto2.js +90 -0
  85. package/dist/esm/private/json-format-proto3.js +89 -0
  86. package/dist/esm/private/message-type.js +33 -0
  87. package/dist/esm/private/names.js +90 -0
  88. package/dist/esm/private/options-map.js +1 -0
  89. package/dist/esm/private/proto-runtime.js +15 -0
  90. package/dist/esm/private/scalars.js +129 -0
  91. package/dist/esm/private/util-common.js +207 -0
  92. package/dist/esm/private/util.js +1 -0
  93. package/dist/esm/proto-int64.js +118 -0
  94. package/dist/esm/proto2.js +77 -0
  95. package/dist/esm/proto3.js +90 -0
  96. package/dist/esm/service-type.js +37 -0
  97. package/dist/esm/type-registry.js +38 -0
  98. package/dist/types/binary-encoding.d.ts +421 -0
  99. package/dist/types/binary-format.d.ts +109 -0
  100. package/dist/types/descriptor-registry.d.ts +42 -0
  101. package/dist/types/descriptor-set.d.ts +171 -0
  102. package/dist/types/enum.d.ts +31 -0
  103. package/dist/types/field-list.d.ts +27 -0
  104. package/dist/types/field.d.ts +295 -0
  105. package/dist/types/google/protobuf/any_pb.d.ts +167 -0
  106. package/dist/types/google/protobuf/api_pb.d.ts +296 -0
  107. package/dist/types/google/protobuf/compiler/plugin_pb.d.ts +294 -0
  108. package/dist/types/google/protobuf/descriptor_pb.d.ts +1959 -0
  109. package/dist/types/google/protobuf/duration_pb.d.ts +117 -0
  110. package/dist/types/google/protobuf/empty_pb.d.ts +44 -0
  111. package/dist/types/google/protobuf/field_mask_pb.d.ts +243 -0
  112. package/dist/types/google/protobuf/source_context_pb.d.ts +44 -0
  113. package/dist/types/google/protobuf/struct_pb.d.ts +205 -0
  114. package/dist/types/google/protobuf/timestamp_pb.d.ts +151 -0
  115. package/dist/types/google/protobuf/type_pb.d.ts +482 -0
  116. package/dist/types/google/protobuf/wrappers_pb.d.ts +379 -0
  117. package/dist/types/google/varint.d.ts +65 -0
  118. package/dist/types/index.d.ts +53 -0
  119. package/dist/types/json-format.d.ts +129 -0
  120. package/dist/types/message-type.d.ts +58 -0
  121. package/dist/types/message.d.ts +124 -0
  122. package/dist/types/private/assert.d.ts +19 -0
  123. package/dist/types/private/base64.d.ts +18 -0
  124. package/dist/types/private/binary-format-common.d.ts +38 -0
  125. package/dist/types/private/binary-format-proto2.d.ts +2 -0
  126. package/dist/types/private/binary-format-proto3.d.ts +2 -0
  127. package/dist/types/private/enum.d.ts +29 -0
  128. package/dist/types/private/field-list.d.ts +25 -0
  129. package/dist/types/private/field-wrapper.d.ts +27 -0
  130. package/dist/types/private/field.d.ts +15 -0
  131. package/dist/types/private/json-format-common.d.ts +30 -0
  132. package/dist/types/private/json-format-proto2.d.ts +2 -0
  133. package/dist/types/private/json-format-proto3.d.ts +2 -0
  134. package/dist/types/private/message-type.d.ts +15 -0
  135. package/dist/types/private/names.d.ts +19 -0
  136. package/dist/types/private/options-map.d.ts +7 -0
  137. package/dist/types/private/proto-runtime.d.ts +55 -0
  138. package/dist/types/private/scalars.d.ts +33 -0
  139. package/dist/types/private/util-common.d.ts +5 -0
  140. package/dist/types/private/util.d.ts +55 -0
  141. package/dist/types/proto-int64.d.ts +94 -0
  142. package/dist/types/proto2.d.ts +4 -0
  143. package/dist/types/proto3.d.ts +4 -0
  144. package/dist/types/service-type.d.ts +118 -0
  145. package/dist/types/type-registry.d.ts +37 -0
  146. package/package.json +31 -0
@@ -0,0 +1,243 @@
1
+ import { BinaryReader, BinaryWriter, WireType } from "../binary-encoding.js";
2
+ import { ScalarType } from "../field.js";
3
+ import { unwrapField, wrapField } from "./field-wrapper.js";
4
+ import { scalarDefaultValue, scalarTypeInfo } from "./scalars.js";
5
+ import { assert } from "./assert.js";
6
+ /* eslint-disable @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unnecessary-condition, no-case-declarations, prefer-const */
7
+ const unknownFieldsSymbol = Symbol("@bufbuild/protobuf/unknown-fields");
8
+ // Default options for parsing binary data.
9
+ const readDefaults = {
10
+ readUnknownFields: true,
11
+ readerFactory: (bytes) => new BinaryReader(bytes),
12
+ };
13
+ // Default options for serializing binary data.
14
+ const writeDefaults = {
15
+ writeUnknownFields: true,
16
+ writerFactory: () => new BinaryWriter(),
17
+ };
18
+ function makeReadOptions(options) {
19
+ return options ? { ...readDefaults, ...options } : readDefaults;
20
+ }
21
+ function makeWriteOptions(options) {
22
+ return options ? { ...writeDefaults, ...options } : writeDefaults;
23
+ }
24
+ export function makeBinaryFormatCommon() {
25
+ return {
26
+ makeReadOptions,
27
+ makeWriteOptions,
28
+ listUnknownFields(message) {
29
+ return message[unknownFieldsSymbol] ?? [];
30
+ },
31
+ discardUnknownFields(message) {
32
+ delete message[unknownFieldsSymbol];
33
+ },
34
+ writeUnknownFields(message, writer) {
35
+ const m = message;
36
+ const c = m[unknownFieldsSymbol];
37
+ if (c) {
38
+ for (const f of c) {
39
+ writer.tag(f.no, f.wireType).raw(f.data);
40
+ }
41
+ }
42
+ },
43
+ onUnknownField(message, no, wireType, data) {
44
+ const m = message;
45
+ if (!Array.isArray(m[unknownFieldsSymbol])) {
46
+ m[unknownFieldsSymbol] = [];
47
+ }
48
+ m[unknownFieldsSymbol].push({ no, wireType, data });
49
+ },
50
+ readMessage(message, reader, length, options) {
51
+ const type = message.getType();
52
+ const end = length === undefined ? reader.len : reader.pos + length;
53
+ while (reader.pos < end) {
54
+ const [fieldNo, wireType] = reader.tag(),
55
+ field = type.fields.find(fieldNo);
56
+ if (!field) {
57
+ const data = reader.skip(wireType);
58
+ if (options.readUnknownFields) {
59
+ this.onUnknownField(message, fieldNo, wireType, data);
60
+ }
61
+ continue;
62
+ }
63
+ let target = message,
64
+ repeated = field.repeated,
65
+ localName = field.localName;
66
+ if (field.oneof) {
67
+ target = target[field.oneof.localName];
68
+ if (target.case != localName) {
69
+ delete target.value;
70
+ }
71
+ target.case = localName;
72
+ localName = "value";
73
+ }
74
+ switch (field.kind) {
75
+ case "scalar":
76
+ case "enum":
77
+ const scalarType =
78
+ field.kind == "enum" ? ScalarType.INT32 : field.T;
79
+ if (repeated) {
80
+ let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
81
+ if (
82
+ wireType == WireType.LengthDelimited &&
83
+ scalarType != ScalarType.STRING &&
84
+ scalarType != ScalarType.BYTES
85
+ ) {
86
+ let e = reader.uint32() + reader.pos;
87
+ while (reader.pos < e) {
88
+ arr.push(readScalar(reader, scalarType));
89
+ }
90
+ } else {
91
+ arr.push(readScalar(reader, scalarType));
92
+ }
93
+ } else {
94
+ target[localName] = readScalar(reader, scalarType);
95
+ }
96
+ break;
97
+ case "message":
98
+ const messageType = field.T;
99
+ if (repeated) {
100
+ // safe to assume presence of array, oneof cannot contain repeated values
101
+ target[localName].push(
102
+ messageType.fromBinary(reader.bytes(), options)
103
+ );
104
+ } else {
105
+ if (target[localName] instanceof messageType) {
106
+ target[localName].fromBinary(reader.bytes(), options);
107
+ } else {
108
+ target[localName] = unwrapField(
109
+ messageType,
110
+ messageType.fromBinary(reader.bytes(), options)
111
+ );
112
+ }
113
+ }
114
+ break;
115
+ case "map":
116
+ let [mapKey, mapVal] = readMapEntry(field, reader, options);
117
+ // safe to assume presence of map object, oneof cannot contain repeated values
118
+ target[localName][mapKey] = mapVal;
119
+ break;
120
+ }
121
+ }
122
+ },
123
+ };
124
+ }
125
+ // Read a map field, expecting key field = 1, value field = 2
126
+ function readMapEntry(field, reader, options) {
127
+ const length = reader.uint32(),
128
+ end = reader.pos + length;
129
+ let key, val;
130
+ while (reader.pos < end) {
131
+ let [fieldNo] = reader.tag();
132
+ switch (fieldNo) {
133
+ case 1:
134
+ key = readScalar(reader, field.K);
135
+ break;
136
+ case 2:
137
+ switch (field.V.kind) {
138
+ case "scalar":
139
+ val = readScalar(reader, field.V.T);
140
+ break;
141
+ case "enum":
142
+ val = reader.int32();
143
+ break;
144
+ case "message":
145
+ val = field.V.T.fromBinary(reader.bytes(), options);
146
+ break;
147
+ }
148
+ break;
149
+ }
150
+ }
151
+ if (key === undefined) {
152
+ let keyRaw = scalarDefaultValue(field.K);
153
+ key = field.K == ScalarType.BOOL ? keyRaw.toString() : keyRaw;
154
+ }
155
+ if (typeof key != "string" && typeof key != "number") {
156
+ key = key.toString();
157
+ }
158
+ if (val === undefined) {
159
+ switch (field.V.kind) {
160
+ case "scalar":
161
+ val = scalarDefaultValue(field.V.T);
162
+ break;
163
+ case "enum":
164
+ val = 0;
165
+ break;
166
+ case "message":
167
+ val = new field.V.T();
168
+ break;
169
+ }
170
+ }
171
+ return [key, val];
172
+ }
173
+ function readScalar(reader, type) {
174
+ let [, method] = scalarTypeInfo(type);
175
+ return reader[method]();
176
+ }
177
+ export function writeMapEntry(writer, options, field, key, value) {
178
+ writer.tag(field.no, WireType.LengthDelimited);
179
+ writer.fork();
180
+ // javascript only allows number or string for object properties
181
+ // we convert from our representation to the protobuf type
182
+ let keyValue = key;
183
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- we deliberately handle just the special cases for map keys
184
+ switch (field.K) {
185
+ case ScalarType.INT32:
186
+ case ScalarType.FIXED32:
187
+ case ScalarType.UINT32:
188
+ case ScalarType.SFIXED32:
189
+ case ScalarType.SINT32:
190
+ keyValue = Number.parseInt(key);
191
+ break;
192
+ case ScalarType.BOOL:
193
+ assert(key == "true" || key == "false");
194
+ keyValue = key == "true";
195
+ break;
196
+ }
197
+ // write key, expecting key field number = 1
198
+ writeScalar(writer, field.K, 1, keyValue, true);
199
+ // write value, expecting value field number = 2
200
+ switch (field.V.kind) {
201
+ case "scalar":
202
+ writeScalar(writer, field.V.T, 2, value, true);
203
+ break;
204
+ case "enum":
205
+ writeScalar(writer, ScalarType.INT32, 2, value, true);
206
+ break;
207
+ case "message":
208
+ writeMessageField(writer, options, field.V.T, 2, value);
209
+ break;
210
+ }
211
+ writer.join();
212
+ }
213
+ export function writeMessageField(writer, options, type, fieldNo, value) {
214
+ if (value !== undefined) {
215
+ const message = wrapField(type, value);
216
+ writer
217
+ .tag(fieldNo, WireType.LengthDelimited)
218
+ .bytes(message.toBinary(options));
219
+ }
220
+ }
221
+ export function writeScalar(
222
+ writer,
223
+ type,
224
+ fieldNo,
225
+ value,
226
+ emitIntrinsicDefault
227
+ ) {
228
+ let [wireType, method, isIntrinsicDefault] = scalarTypeInfo(type, value);
229
+ if (!isIntrinsicDefault || emitIntrinsicDefault) {
230
+ writer.tag(fieldNo, wireType)[method](value);
231
+ }
232
+ }
233
+ export function writePacked(writer, type, fieldNo, value) {
234
+ if (!value.length) {
235
+ return;
236
+ }
237
+ writer.tag(fieldNo, WireType.LengthDelimited).fork();
238
+ let [, method] = scalarTypeInfo(type);
239
+ for (let i = 0; i < value.length; i++) {
240
+ writer[method](value[i]);
241
+ }
242
+ writer.join();
243
+ }
@@ -0,0 +1,87 @@
1
+ import { ScalarType } from "../field.js";
2
+ import {
3
+ makeBinaryFormatCommon,
4
+ writeMapEntry,
5
+ writeMessageField,
6
+ writePacked,
7
+ writeScalar,
8
+ } from "./binary-format-common.js";
9
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions, no-case-declarations, prefer-const */
10
+ export function makeBinaryFormatProto2() {
11
+ return {
12
+ ...makeBinaryFormatCommon(),
13
+ writeMessage(message, writer, options) {
14
+ const type = message.getType();
15
+ let field;
16
+ try {
17
+ for (field of type.fields.byNumber()) {
18
+ let value, // this will be our field value, whether it is member of a oneof or not
19
+ repeated = field.repeated,
20
+ localName = field.localName;
21
+ if (field.oneof) {
22
+ const oneof = message[field.oneof.localName];
23
+ if (oneof.case !== localName) {
24
+ continue; // field is not selected, skip
25
+ }
26
+ value = oneof.value;
27
+ } else {
28
+ value = message[localName];
29
+ // In contrast to proto3, we raise an error if a non-optional (proto2 required)
30
+ // field is missing a value.
31
+ if (value === undefined && !field.oneof && !field.opt) {
32
+ throw new Error(
33
+ `cannot encode field ${type.typeName}.${field.name} to JSON: required field not set`
34
+ );
35
+ }
36
+ }
37
+ switch (field.kind) {
38
+ case "scalar":
39
+ case "enum":
40
+ let scalarType =
41
+ field.kind == "enum" ? ScalarType.INT32 : field.T;
42
+ if (repeated) {
43
+ if (field.packed) {
44
+ writePacked(writer, scalarType, field.no, value);
45
+ } else {
46
+ for (const item of value) {
47
+ writeScalar(writer, scalarType, field.no, item, true);
48
+ }
49
+ }
50
+ } else {
51
+ if (value !== undefined) {
52
+ // In contrast to proto3, we do not skip intrinsic default values.
53
+ // Explicit default values are not special cased either.
54
+ writeScalar(writer, scalarType, field.no, value, true);
55
+ }
56
+ }
57
+ break;
58
+ case "message":
59
+ if (repeated) {
60
+ for (const item of value) {
61
+ writeMessageField(writer, options, field.T, field.no, item);
62
+ }
63
+ } else {
64
+ writeMessageField(writer, options, field.T, field.no, value);
65
+ }
66
+ break;
67
+ case "map":
68
+ for (const [key, val] of Object.entries(value)) {
69
+ writeMapEntry(writer, options, field, key, val);
70
+ }
71
+ break;
72
+ }
73
+ }
74
+ } catch (e) {
75
+ let m = field
76
+ ? `cannot encode field ${type.typeName}.${field?.name} to binary`
77
+ : `cannot encode message ${type.typeName} to binary`;
78
+ let r = e instanceof Error ? e.message : String(e);
79
+ throw new Error(m + (r.length > 0 ? `: ${r}` : ""));
80
+ }
81
+ if (options.writeUnknownFields) {
82
+ this.writeUnknownFields(message, writer);
83
+ }
84
+ return writer;
85
+ },
86
+ };
87
+ }
@@ -0,0 +1,74 @@
1
+ import { ScalarType } from "../field.js";
2
+ import {
3
+ makeBinaryFormatCommon,
4
+ writeMapEntry,
5
+ writeMessageField,
6
+ writePacked,
7
+ writeScalar,
8
+ } from "./binary-format-common.js";
9
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions, prefer-const, no-case-declarations */
10
+ export function makeBinaryFormatProto3() {
11
+ return {
12
+ ...makeBinaryFormatCommon(),
13
+ writeMessage(message, writer, options) {
14
+ const type = message.getType();
15
+ for (const field of type.fields.byNumber()) {
16
+ let value, // this will be our field value, whether it is member of a oneof or regular field
17
+ repeated = field.repeated,
18
+ localName = field.localName;
19
+ if (field.oneof) {
20
+ const oneof = message[field.oneof.localName];
21
+ if (oneof.case !== localName) {
22
+ continue; // field is not selected, skip
23
+ }
24
+ value = oneof.value;
25
+ } else {
26
+ value = message[localName];
27
+ }
28
+ switch (field.kind) {
29
+ case "scalar":
30
+ case "enum":
31
+ let scalarType = field.kind == "enum" ? ScalarType.INT32 : field.T;
32
+ if (repeated) {
33
+ if (field.packed) {
34
+ writePacked(writer, scalarType, field.no, value);
35
+ } else {
36
+ for (const item of value) {
37
+ writeScalar(writer, scalarType, field.no, item, true);
38
+ }
39
+ }
40
+ } else {
41
+ if (value !== undefined) {
42
+ writeScalar(
43
+ writer,
44
+ scalarType,
45
+ field.no,
46
+ value,
47
+ !!field.oneof || field.opt
48
+ );
49
+ }
50
+ }
51
+ break;
52
+ case "message":
53
+ if (repeated) {
54
+ for (const item of value) {
55
+ writeMessageField(writer, options, field.T, field.no, item);
56
+ }
57
+ } else {
58
+ writeMessageField(writer, options, field.T, field.no, value);
59
+ }
60
+ break;
61
+ case "map":
62
+ for (const [key, val] of Object.entries(value)) {
63
+ writeMapEntry(writer, options, field, key, val);
64
+ }
65
+ break;
66
+ }
67
+ }
68
+ if (options.writeUnknownFields) {
69
+ this.writeUnknownFields(message, writer);
70
+ }
71
+ return writer;
72
+ },
73
+ };
74
+ }
@@ -0,0 +1,64 @@
1
+ import { assert } from "./assert.js";
2
+ const enumTypeSymbol = Symbol("@bufbuild/protobuf/enum-type");
3
+ /**
4
+ * Get reflection information from a generated enum.
5
+ * If this function is called on something other than a generated
6
+ * enum, it raises an error.
7
+ */
8
+ export function getEnumType(enumObject) {
9
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any
10
+ const t = enumObject[enumTypeSymbol];
11
+ assert(t, "missing enum type on enum object");
12
+ return t; // eslint-disable-line @typescript-eslint/no-unsafe-return
13
+ }
14
+ /**
15
+ * Sets reflection information on a generated enum.
16
+ */
17
+ export function setEnumType(
18
+ enumObject,
19
+ typeName,
20
+ values
21
+ // We do not surface options at this time
22
+ // opt?: {
23
+ // options?: { readonly [extensionName: string]: JsonValue };
24
+ // },
25
+ ) {
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
27
+ enumObject[enumTypeSymbol] = makeEnumType(typeName, values);
28
+ }
29
+ // We do not surface options at this time
30
+ // export type PartialEnumValue = Omit<EnumValueInfo, 'options'> & Partial<Pick<EnumValueInfo, "options">>;
31
+ /**
32
+ * Create a new EnumType with the given values.
33
+ */
34
+ export function makeEnumType(
35
+ typeName,
36
+ values
37
+ // We do not surface options at this time
38
+ // opt?: {
39
+ // options?: { readonly [extensionName: string]: JsonValue };
40
+ // },
41
+ ) {
42
+ const names = Object.create(null);
43
+ const numbers = Object.create(null);
44
+ const normalValues = [];
45
+ for (const value of values) {
46
+ // We do not surface options at this time
47
+ // const value: EnumValueInfo = {...v, options: v.options ?? emptyReadonlyObject};
48
+ normalValues.push(value);
49
+ names[value.name] = value;
50
+ numbers[value.no] = value;
51
+ }
52
+ return {
53
+ typeName,
54
+ values: normalValues,
55
+ // We do not surface options at this time
56
+ // options: opt?.options ?? Object.create(null),
57
+ findName(name) {
58
+ return names[name];
59
+ },
60
+ findNumber(no) {
61
+ return numbers[no];
62
+ },
63
+ };
64
+ }
@@ -0,0 +1,58 @@
1
+ export class InternalFieldList {
2
+ constructor(fields, normalizer) {
3
+ this._fields = fields;
4
+ this._normalizer = normalizer;
5
+ }
6
+ findJsonName(jsonName) {
7
+ if (!this.jsonNames) {
8
+ const t = {};
9
+ for (const f of this.list()) {
10
+ t[f.jsonName] = t[f.name] = f;
11
+ }
12
+ this.jsonNames = t;
13
+ }
14
+ return this.jsonNames[jsonName];
15
+ }
16
+ find(fieldNo) {
17
+ if (!this.numbers) {
18
+ const t = {};
19
+ for (const f of this.list()) {
20
+ t[f.no] = f;
21
+ }
22
+ this.numbers = t;
23
+ }
24
+ return this.numbers[fieldNo];
25
+ }
26
+ list() {
27
+ if (!this.all) {
28
+ this.all = this._normalizer(this._fields);
29
+ }
30
+ return this.all;
31
+ }
32
+ byNumber() {
33
+ if (!this.numbersAsc) {
34
+ this.numbersAsc = this.list()
35
+ .concat()
36
+ .sort((a, b) => a.no - b.no);
37
+ }
38
+ return this.numbersAsc;
39
+ }
40
+ byMember() {
41
+ if (!this.members) {
42
+ this.members = [];
43
+ const a = this.members;
44
+ let o;
45
+ for (const f of this.list()) {
46
+ if (f.oneof) {
47
+ if (f.oneof !== o) {
48
+ o = f.oneof;
49
+ a.push(o);
50
+ }
51
+ } else {
52
+ a.push(f);
53
+ }
54
+ }
55
+ }
56
+ return this.members;
57
+ }
58
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Wrap field values whose message type has a wrapper.
3
+ */
4
+ export function wrapField(type, value) {
5
+ if (value instanceof type) {
6
+ return value;
7
+ }
8
+ if (type.fieldWrapper) {
9
+ return type.fieldWrapper.wrapField(value);
10
+ }
11
+ throw new Error(
12
+ `cannot unwrap field value, ${type.typeName} does not define a field wrapper`
13
+ );
14
+ }
15
+ /**
16
+ * Unwrap field values whose message type has a wrapper.
17
+ */
18
+ export function unwrapField(type, value) {
19
+ return type.fieldWrapper ? type.fieldWrapper.unwrapField(value) : value;
20
+ }
@@ -0,0 +1,27 @@
1
+ import { makeOneofName } from "./names.js";
2
+ import { assert } from "./assert.js";
3
+ export class InternalOneofInfo {
4
+ constructor(name) {
5
+ this.kind = "oneof";
6
+ this.repeated = false;
7
+ this.packed = false;
8
+ this.opt = false;
9
+ this.default = undefined;
10
+ this.fields = [];
11
+ this.name = name;
12
+ this.localName = makeOneofName(name);
13
+ }
14
+ addField(field) {
15
+ assert(field.oneof === this, `field ${field.name} not one of ${this.name}`);
16
+ this.fields.push(field);
17
+ }
18
+ findField(localName) {
19
+ if (!this._lookup) {
20
+ this._lookup = Object.create(null);
21
+ for (let i = 0; i < this.fields.length; i++) {
22
+ this._lookup[this.fields[i].localName] = this.fields[i];
23
+ }
24
+ }
25
+ return this._lookup[localName];
26
+ }
27
+ }