@bufbuild/protobuf 0.0.8 → 0.0.9
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.
- package/README.md +34 -4
- package/dist/cjs/codegen-info.js +60 -0
- package/dist/cjs/create-descriptor-set.js +952 -0
- package/dist/cjs/create-registry-from-desc.js +376 -0
- package/dist/cjs/create-registry.js +75 -0
- package/dist/cjs/descriptor-set.js +0 -436
- package/dist/cjs/google/protobuf/struct_pb.js +1 -1
- package/dist/cjs/google/protobuf/type_pb.js +1 -1
- package/dist/cjs/index.js +17 -7
- package/dist/cjs/{descriptor-registry.js → legacy-descriptor-registry.js} +18 -10
- package/dist/cjs/legacy-descriptor-set.js +453 -0
- package/dist/cjs/legacy-type-registry.js +104 -0
- package/dist/cjs/private/enum.js +22 -31
- package/dist/cjs/private/field-wrapper.js +30 -1
- package/dist/cjs/private/field.js +1 -1
- package/dist/cjs/private/names.js +168 -29
- package/dist/cjs/proto2.js +2 -2
- package/dist/cjs/proto3.js +2 -2
- package/dist/cjs/type-registry.js +0 -87
- package/dist/esm/codegen-info.js +57 -0
- package/dist/esm/create-descriptor-set.js +947 -0
- package/dist/esm/create-registry-from-desc.js +371 -0
- package/dist/esm/create-registry.js +71 -0
- package/dist/esm/descriptor-set.js +1 -434
- package/dist/esm/google/protobuf/struct_pb.js +1 -1
- package/dist/esm/google/protobuf/type_pb.js +1 -1
- package/dist/esm/index.js +9 -3
- package/dist/esm/{descriptor-registry.js → legacy-descriptor-registry.js} +16 -8
- package/dist/esm/legacy-descriptor-set.js +449 -0
- package/dist/esm/legacy-type-registry.js +100 -0
- package/dist/esm/private/enum.js +22 -31
- package/dist/esm/private/field-wrapper.js +28 -0
- package/dist/esm/private/field.js +2 -2
- package/dist/esm/private/names.js +163 -24
- package/dist/esm/proto2.js +3 -3
- package/dist/esm/proto3.js +3 -3
- package/dist/esm/type-registry.js +1 -85
- package/dist/types/codegen-info.d.ts +19 -0
- package/dist/types/create-descriptor-set.d.ts +16 -0
- package/dist/types/create-registry-from-desc.d.ts +49 -0
- package/dist/types/create-registry.d.ts +8 -0
- package/dist/types/descriptor-set.d.ts +554 -108
- package/dist/types/enum.d.ts +9 -5
- package/dist/types/index.d.ts +9 -3
- package/dist/types/{descriptor-registry.d.ts → legacy-descriptor-registry.d.ts} +8 -6
- package/dist/types/legacy-descriptor-set.d.ts +152 -0
- package/dist/types/legacy-type-registry.d.ts +44 -0
- package/dist/types/private/enum.d.ts +4 -8
- package/dist/types/private/field-wrapper.d.ts +7 -0
- package/dist/types/private/message-type.d.ts +1 -4
- package/dist/types/private/names.d.ts +26 -8
- package/dist/types/private/proto-runtime.d.ts +2 -2
- package/dist/types/private/util.d.ts +1 -6
- package/dist/types/type-registry.d.ts +0 -38
- package/package.json +2 -2
- package/dist/protobuf.cjs +0 -2
- package/dist/protobuf.cjs.map +0 -1
- package/dist/protobuf.esm.js +0 -2
- package/dist/protobuf.esm.js.map +0 -1
- package/dist/protobuf.modern.js +0 -2
- package/dist/protobuf.modern.js.map +0 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2021-2022 Buf Technologies, Inc.
|
|
3
|
+
//
|
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
// you may not use this file except in compliance with the License.
|
|
6
|
+
// You may obtain a copy of the License at
|
|
7
|
+
//
|
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
//
|
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
// See the License for the specific language governing permissions and
|
|
14
|
+
// limitations under the License.
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.DescriptorRegistry = exports.createRegistryFromDescriptors = void 0;
|
|
17
|
+
const assert_js_1 = require("./private/assert.js");
|
|
18
|
+
const proto3_js_1 = require("./proto3.js");
|
|
19
|
+
const proto2_js_1 = require("./proto2.js");
|
|
20
|
+
const names_js_1 = require("./private/names.js");
|
|
21
|
+
const timestamp_pb_js_1 = require("./google/protobuf/timestamp_pb.js");
|
|
22
|
+
const duration_pb_js_1 = require("./google/protobuf/duration_pb.js");
|
|
23
|
+
const any_pb_js_1 = require("./google/protobuf/any_pb.js");
|
|
24
|
+
const empty_pb_js_1 = require("./google/protobuf/empty_pb.js");
|
|
25
|
+
const field_mask_pb_js_1 = require("./google/protobuf/field_mask_pb.js");
|
|
26
|
+
const struct_pb_js_1 = require("./google/protobuf/struct_pb.js");
|
|
27
|
+
const enum_js_1 = require("./private/enum.js");
|
|
28
|
+
const wrappers_pb_js_1 = require("./google/protobuf/wrappers_pb.js");
|
|
29
|
+
const descriptor_pb_js_1 = require("./google/protobuf/descriptor_pb.js");
|
|
30
|
+
const create_descriptor_set_js_1 = require("./create-descriptor-set.js");
|
|
31
|
+
// well-known message types with specialized JSON representation
|
|
32
|
+
const wkMessages = [
|
|
33
|
+
any_pb_js_1.Any,
|
|
34
|
+
duration_pb_js_1.Duration,
|
|
35
|
+
empty_pb_js_1.Empty,
|
|
36
|
+
field_mask_pb_js_1.FieldMask,
|
|
37
|
+
struct_pb_js_1.Struct,
|
|
38
|
+
struct_pb_js_1.Value,
|
|
39
|
+
struct_pb_js_1.ListValue,
|
|
40
|
+
timestamp_pb_js_1.Timestamp,
|
|
41
|
+
duration_pb_js_1.Duration,
|
|
42
|
+
wrappers_pb_js_1.DoubleValue,
|
|
43
|
+
wrappers_pb_js_1.FloatValue,
|
|
44
|
+
wrappers_pb_js_1.Int64Value,
|
|
45
|
+
wrappers_pb_js_1.Int32Value,
|
|
46
|
+
wrappers_pb_js_1.UInt32Value,
|
|
47
|
+
wrappers_pb_js_1.UInt64Value,
|
|
48
|
+
wrappers_pb_js_1.BoolValue,
|
|
49
|
+
wrappers_pb_js_1.StringValue,
|
|
50
|
+
wrappers_pb_js_1.BytesValue,
|
|
51
|
+
];
|
|
52
|
+
// well-known enum types with specialized JSON representation
|
|
53
|
+
const wkEnums = [(0, enum_js_1.getEnumType)(struct_pb_js_1.NullValue)];
|
|
54
|
+
/**
|
|
55
|
+
* Create a registry from a set of descriptors. The types returned by this
|
|
56
|
+
* registry behave exactly like types from generated code.
|
|
57
|
+
*
|
|
58
|
+
* This function accepts google.protobuf.FileDescriptorSet in serialized or
|
|
59
|
+
* deserialized form. Alternatively, it also accepts a DescriptorSet (see
|
|
60
|
+
* createDescriptorSet()).
|
|
61
|
+
*
|
|
62
|
+
* By default, all well-known types with a specialized JSON representation
|
|
63
|
+
* are replaced with their generated counterpart in this package.
|
|
64
|
+
*/
|
|
65
|
+
function createRegistryFromDescriptors(input, replaceWkt = true) {
|
|
66
|
+
const set = input instanceof Uint8Array || input instanceof descriptor_pb_js_1.FileDescriptorSet
|
|
67
|
+
? (0, create_descriptor_set_js_1.createDescriptorSet)(input)
|
|
68
|
+
: input;
|
|
69
|
+
const enums = {};
|
|
70
|
+
const messages = {};
|
|
71
|
+
const services = {};
|
|
72
|
+
if (replaceWkt) {
|
|
73
|
+
for (const mt of wkMessages) {
|
|
74
|
+
messages[mt.typeName] = mt;
|
|
75
|
+
}
|
|
76
|
+
for (const et of wkEnums) {
|
|
77
|
+
enums[et.typeName] = et;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
/**
|
|
82
|
+
* May raise an error on invalid descriptors.
|
|
83
|
+
*/
|
|
84
|
+
findEnum(typeName) {
|
|
85
|
+
const existing = enums[typeName];
|
|
86
|
+
if (existing) {
|
|
87
|
+
return existing;
|
|
88
|
+
}
|
|
89
|
+
const desc = set.enums.get(typeName);
|
|
90
|
+
if (!desc) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const runtime = desc.file.syntax == "proto3" ? proto3_js_1.proto3 : proto2_js_1.proto2;
|
|
94
|
+
const type = runtime.makeEnumType(typeName, desc.values.map((u) => ({
|
|
95
|
+
no: u.number,
|
|
96
|
+
name: u.name,
|
|
97
|
+
localName: (0, names_js_1.localName)(u),
|
|
98
|
+
})), {});
|
|
99
|
+
enums[typeName] = type;
|
|
100
|
+
return type;
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* May raise an error on invalid descriptors.
|
|
104
|
+
*/
|
|
105
|
+
findMessage(typeName) {
|
|
106
|
+
const existing = messages[typeName];
|
|
107
|
+
if (existing) {
|
|
108
|
+
return existing;
|
|
109
|
+
}
|
|
110
|
+
const desc = set.messages.get(typeName);
|
|
111
|
+
if (!desc) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
const runtime = desc.file.syntax == "proto3" ? proto3_js_1.proto3 : proto2_js_1.proto2;
|
|
115
|
+
const fields = [];
|
|
116
|
+
const type = runtime.makeMessageType(typeName, () => fields, {
|
|
117
|
+
localName: (0, names_js_1.localName)(desc),
|
|
118
|
+
});
|
|
119
|
+
messages[typeName] = type;
|
|
120
|
+
for (const field of desc.fields) {
|
|
121
|
+
const fieldInfo = makeFieldInfo(field, this);
|
|
122
|
+
fields.push(fieldInfo);
|
|
123
|
+
}
|
|
124
|
+
return type;
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* May raise an error on invalid descriptors.
|
|
128
|
+
*/
|
|
129
|
+
findService(typeName) {
|
|
130
|
+
const existing = services[typeName];
|
|
131
|
+
if (existing) {
|
|
132
|
+
return existing;
|
|
133
|
+
}
|
|
134
|
+
const desc = set.services.get(typeName);
|
|
135
|
+
if (!desc) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const methods = {};
|
|
139
|
+
for (const method of desc.methods) {
|
|
140
|
+
const I = this.findMessage(method.input.typeName);
|
|
141
|
+
const O = this.findMessage(method.input.typeName);
|
|
142
|
+
(0, assert_js_1.assert)(I, `message "${method.input.typeName}" for ${method.toString()} not found`);
|
|
143
|
+
(0, assert_js_1.assert)(O, `output message "${method.output.typeName}" for ${method.toString()} not found`);
|
|
144
|
+
const m = {
|
|
145
|
+
name: method.name,
|
|
146
|
+
localName: (0, names_js_1.localName)(method),
|
|
147
|
+
I,
|
|
148
|
+
O,
|
|
149
|
+
kind: method.methodKind,
|
|
150
|
+
idempotency: method.idempotency,
|
|
151
|
+
options: {},
|
|
152
|
+
};
|
|
153
|
+
methods[m.localName] = m;
|
|
154
|
+
}
|
|
155
|
+
return (services[typeName] = {
|
|
156
|
+
typeName: desc.typeName,
|
|
157
|
+
methods,
|
|
158
|
+
});
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
exports.createRegistryFromDescriptors = createRegistryFromDescriptors;
|
|
163
|
+
/**
|
|
164
|
+
* DescriptorRegistry is a type registry that dynamically creates types
|
|
165
|
+
* from a set of google.protobuf.FileDescriptorProto.
|
|
166
|
+
*
|
|
167
|
+
* By default, all well-known types with a specialized JSON representation
|
|
168
|
+
* are replaced with their generated counterpart in this package.
|
|
169
|
+
*/
|
|
170
|
+
class DescriptorRegistry {
|
|
171
|
+
constructor(descriptorSet, replaceWkt = true) {
|
|
172
|
+
this.enums = {};
|
|
173
|
+
this.messages = {};
|
|
174
|
+
this.services = {};
|
|
175
|
+
this.desc = descriptorSet;
|
|
176
|
+
if (replaceWkt) {
|
|
177
|
+
for (const mt of wkMessages) {
|
|
178
|
+
this.messages[mt.typeName] = mt;
|
|
179
|
+
}
|
|
180
|
+
for (const et of wkEnums) {
|
|
181
|
+
this.enums[et.typeName] = et;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Conveniently create a DescriptorRegistry from a FileDescriptorSet,
|
|
187
|
+
* or a FileDescriptorSet in binary format.
|
|
188
|
+
*/
|
|
189
|
+
static fromFileDescriptorSet(input) {
|
|
190
|
+
return new DescriptorRegistry((0, create_descriptor_set_js_1.createDescriptorSet)(input));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* May raise an error on invalid descriptors.
|
|
194
|
+
*/
|
|
195
|
+
findEnum(typeName) {
|
|
196
|
+
const existing = this.enums[typeName];
|
|
197
|
+
if (existing) {
|
|
198
|
+
return existing;
|
|
199
|
+
}
|
|
200
|
+
const desc = this.desc.enums.get(typeName);
|
|
201
|
+
if (!desc) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const runtime = desc.file.syntax == "proto3" ? proto3_js_1.proto3 : proto2_js_1.proto2;
|
|
205
|
+
const type = runtime.makeEnumType(typeName, desc.values.map((u) => ({
|
|
206
|
+
no: u.number,
|
|
207
|
+
name: u.name,
|
|
208
|
+
localName: (0, names_js_1.localName)(u),
|
|
209
|
+
})), {});
|
|
210
|
+
this.enums[typeName] = type;
|
|
211
|
+
return type;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* May raise an error on invalid descriptors.
|
|
215
|
+
*/
|
|
216
|
+
findMessage(typeName) {
|
|
217
|
+
const existing = this.messages[typeName];
|
|
218
|
+
if (existing) {
|
|
219
|
+
return existing;
|
|
220
|
+
}
|
|
221
|
+
const desc = this.desc.messages.get(typeName);
|
|
222
|
+
if (!desc) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const runtime = desc.file.syntax == "proto3" ? proto3_js_1.proto3 : proto2_js_1.proto2;
|
|
226
|
+
const fields = [];
|
|
227
|
+
const type = runtime.makeMessageType(typeName, () => fields, {
|
|
228
|
+
localName: (0, names_js_1.localName)(desc),
|
|
229
|
+
});
|
|
230
|
+
this.messages[typeName] = type;
|
|
231
|
+
for (const field of desc.fields) {
|
|
232
|
+
const fieldInfo = makeFieldInfo(field, this);
|
|
233
|
+
fields.push(fieldInfo);
|
|
234
|
+
}
|
|
235
|
+
return type;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* May raise an error on invalid descriptors.
|
|
239
|
+
*/
|
|
240
|
+
findService(typeName) {
|
|
241
|
+
const existing = this.services[typeName];
|
|
242
|
+
if (existing) {
|
|
243
|
+
return existing;
|
|
244
|
+
}
|
|
245
|
+
const desc = this.desc.services.get(typeName);
|
|
246
|
+
if (!desc) {
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
const methods = {};
|
|
250
|
+
for (const method of desc.methods) {
|
|
251
|
+
const I = this.findMessage(method.input.typeName);
|
|
252
|
+
const O = this.findMessage(method.input.typeName);
|
|
253
|
+
(0, assert_js_1.assert)(I, `message "${method.input.typeName}" for ${method.toString()} not found`);
|
|
254
|
+
(0, assert_js_1.assert)(O, `output message "${method.output.typeName}" for ${method.toString()} not found`);
|
|
255
|
+
const m = {
|
|
256
|
+
name: method.name,
|
|
257
|
+
localName: (0, names_js_1.localName)(method),
|
|
258
|
+
I,
|
|
259
|
+
O,
|
|
260
|
+
kind: method.methodKind,
|
|
261
|
+
idempotency: method.idempotency,
|
|
262
|
+
options: {},
|
|
263
|
+
};
|
|
264
|
+
methods[m.localName] = m;
|
|
265
|
+
}
|
|
266
|
+
return (this.services[typeName] = {
|
|
267
|
+
typeName: desc.typeName,
|
|
268
|
+
methods,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.DescriptorRegistry = DescriptorRegistry;
|
|
273
|
+
function makeFieldInfo(desc, resolver) {
|
|
274
|
+
switch (desc.kind) {
|
|
275
|
+
case "map_field":
|
|
276
|
+
return makeMapFieldInfo(desc, resolver);
|
|
277
|
+
case "message_field":
|
|
278
|
+
return makeMessageFieldInfo(desc, resolver);
|
|
279
|
+
case "enum_field": {
|
|
280
|
+
const fi = makeEnumFieldInfo(desc, resolver);
|
|
281
|
+
fi.default = desc.getDefaultValue();
|
|
282
|
+
return fi;
|
|
283
|
+
}
|
|
284
|
+
case "scalar_field": {
|
|
285
|
+
const fi = makeScalarFieldInfo(desc);
|
|
286
|
+
fi.default = desc.getDefaultValue();
|
|
287
|
+
return fi;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function makeMapFieldInfo(field, resolver) {
|
|
292
|
+
const base = {
|
|
293
|
+
kind: "map",
|
|
294
|
+
name: field.name,
|
|
295
|
+
no: field.number,
|
|
296
|
+
K: field.mapKey,
|
|
297
|
+
};
|
|
298
|
+
if (field.mapValue.message) {
|
|
299
|
+
const messageType = resolver.findMessage(field.mapValue.message.typeName);
|
|
300
|
+
(0, assert_js_1.assert)(messageType, `message "${field.mapValue.message.typeName}" for ${field.toString()} not found`);
|
|
301
|
+
return Object.assign(Object.assign({}, base), { V: {
|
|
302
|
+
kind: "message",
|
|
303
|
+
T: messageType,
|
|
304
|
+
} });
|
|
305
|
+
}
|
|
306
|
+
if (field.mapValue.enum) {
|
|
307
|
+
const enumType = resolver.findEnum(field.mapValue.enum.typeName);
|
|
308
|
+
(0, assert_js_1.assert)(enumType, `enum "${field.mapValue.enum.typeName}" for ${field.toString()} not found`);
|
|
309
|
+
return Object.assign(Object.assign({}, base), { V: {
|
|
310
|
+
kind: "enum",
|
|
311
|
+
T: enumType,
|
|
312
|
+
} });
|
|
313
|
+
}
|
|
314
|
+
return Object.assign(Object.assign({}, base), { V: {
|
|
315
|
+
kind: "scalar",
|
|
316
|
+
T: field.mapValue.scalar,
|
|
317
|
+
} });
|
|
318
|
+
}
|
|
319
|
+
function makeScalarFieldInfo(field) {
|
|
320
|
+
const base = {
|
|
321
|
+
no: field.number,
|
|
322
|
+
name: field.name,
|
|
323
|
+
kind: "scalar",
|
|
324
|
+
T: field.scalar,
|
|
325
|
+
};
|
|
326
|
+
if (field.repeated) {
|
|
327
|
+
return Object.assign(Object.assign({}, base), { repeated: true, packed: field.packed, oneof: undefined, T: field.scalar });
|
|
328
|
+
}
|
|
329
|
+
if (field.oneof) {
|
|
330
|
+
return Object.assign(Object.assign({}, base), { oneof: field.oneof.name });
|
|
331
|
+
}
|
|
332
|
+
if (field.optional) {
|
|
333
|
+
return Object.assign(Object.assign({}, base), { opt: true });
|
|
334
|
+
}
|
|
335
|
+
return base;
|
|
336
|
+
}
|
|
337
|
+
function makeMessageFieldInfo(field, resolver) {
|
|
338
|
+
const messageType = resolver.findMessage(field.message.typeName);
|
|
339
|
+
(0, assert_js_1.assert)(messageType, `message "${field.message.typeName}" for ${field.toString()} not found`);
|
|
340
|
+
const base = {
|
|
341
|
+
no: field.number,
|
|
342
|
+
name: field.name,
|
|
343
|
+
kind: "message",
|
|
344
|
+
T: messageType,
|
|
345
|
+
};
|
|
346
|
+
if (field.repeated) {
|
|
347
|
+
return Object.assign(Object.assign({}, base), { repeated: true, packed: field.packed, oneof: undefined });
|
|
348
|
+
}
|
|
349
|
+
if (field.oneof) {
|
|
350
|
+
return Object.assign(Object.assign({}, base), { oneof: field.oneof.name });
|
|
351
|
+
}
|
|
352
|
+
if (field.optional) {
|
|
353
|
+
return Object.assign(Object.assign({}, base), { opt: true });
|
|
354
|
+
}
|
|
355
|
+
return base;
|
|
356
|
+
}
|
|
357
|
+
function makeEnumFieldInfo(field, resolver) {
|
|
358
|
+
const enumType = resolver.findEnum(field.enum.typeName);
|
|
359
|
+
(0, assert_js_1.assert)(enumType, `enum "${field.enum.typeName}" for ${field.toString()} not found`);
|
|
360
|
+
const base = {
|
|
361
|
+
no: field.number,
|
|
362
|
+
name: field.name,
|
|
363
|
+
kind: "enum",
|
|
364
|
+
T: enumType,
|
|
365
|
+
};
|
|
366
|
+
if (field.repeated) {
|
|
367
|
+
return Object.assign(Object.assign({}, base), { repeated: true, packed: field.packed, oneof: undefined });
|
|
368
|
+
}
|
|
369
|
+
if (field.oneof) {
|
|
370
|
+
return Object.assign(Object.assign({}, base), { oneof: field.oneof.name });
|
|
371
|
+
}
|
|
372
|
+
if (field.optional) {
|
|
373
|
+
return Object.assign(Object.assign({}, base), { opt: true });
|
|
374
|
+
}
|
|
375
|
+
return base;
|
|
376
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2021-2022 Buf Technologies, Inc.
|
|
3
|
+
//
|
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
// you may not use this file except in compliance with the License.
|
|
6
|
+
// You may obtain a copy of the License at
|
|
7
|
+
//
|
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
//
|
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
// See the License for the specific language governing permissions and
|
|
14
|
+
// limitations under the License.
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.createRegistry = void 0;
|
|
17
|
+
/**
|
|
18
|
+
* Create a new registry from the given types. Note that
|
|
19
|
+
*/
|
|
20
|
+
function createRegistry(...types) {
|
|
21
|
+
const messages = {};
|
|
22
|
+
const enums = {};
|
|
23
|
+
const services = {};
|
|
24
|
+
const registry = {
|
|
25
|
+
/**
|
|
26
|
+
* Add a type to the registry. For messages, the types used in message
|
|
27
|
+
* fields are added recursively. For services, the message types used
|
|
28
|
+
* for requests and responses are added recursively.
|
|
29
|
+
*/
|
|
30
|
+
add(type) {
|
|
31
|
+
if ("fields" in type) {
|
|
32
|
+
if (!this.findMessage(type.typeName)) {
|
|
33
|
+
messages[type.typeName] = type;
|
|
34
|
+
for (const field of type.fields.list()) {
|
|
35
|
+
if (field.kind == "message") {
|
|
36
|
+
this.add(field.T);
|
|
37
|
+
}
|
|
38
|
+
else if (field.kind == "map" && field.V.kind == "message") {
|
|
39
|
+
this.add(field.V.T);
|
|
40
|
+
}
|
|
41
|
+
else if (field.kind == "enum") {
|
|
42
|
+
this.add(field.T);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if ("methods" in type) {
|
|
48
|
+
if (!this.findService(type.typeName)) {
|
|
49
|
+
services[type.typeName] = type;
|
|
50
|
+
for (const method of Object.values(type.methods)) {
|
|
51
|
+
this.add(method.I);
|
|
52
|
+
this.add(method.O);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
enums[type.typeName] = type;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
findMessage(typeName) {
|
|
61
|
+
return messages[typeName];
|
|
62
|
+
},
|
|
63
|
+
findEnum(typeName) {
|
|
64
|
+
return enums[typeName];
|
|
65
|
+
},
|
|
66
|
+
findService(typeName) {
|
|
67
|
+
return services[typeName];
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
for (const type of types) {
|
|
71
|
+
registry.add(type);
|
|
72
|
+
}
|
|
73
|
+
return registry;
|
|
74
|
+
}
|
|
75
|
+
exports.createRegistry = createRegistry;
|