@aptre/protobuf-es-lite 0.2.5 → 0.2.7
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 +2 -0
- package/dist/binary.js +11 -7
- package/dist/field.d.ts +2 -2
- package/dist/is-message.js +4 -2
- package/dist/json.js +8 -5
- package/dist/message.js +10 -6
- package/dist/partial.js +12 -8
- package/dist/typescript.d.ts +4 -2
- package/dist/typescript.js +20 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,6 +48,8 @@ const myMessageBin = new MyMessage(myMessage).toBinary()
|
|
|
48
48
|
declaration object containing the marshal and unmarshal functions. This allows
|
|
49
49
|
using interfaces and plain messages everywhere and does not need classes.
|
|
50
50
|
|
|
51
|
+
[ts-proto]: https://github.com/stephenh/ts-proto
|
|
52
|
+
|
|
51
53
|
This fork generates the ts-proto style with the protoc-gen-es tools:
|
|
52
54
|
|
|
53
55
|
```typescript
|
package/dist/binary.js
CHANGED
|
@@ -55,7 +55,7 @@ reader, field, wireType, options) {
|
|
|
55
55
|
}
|
|
56
56
|
break;
|
|
57
57
|
case "message":
|
|
58
|
-
const messageType = field.T;
|
|
58
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
59
59
|
if (repeated) {
|
|
60
60
|
var tgtArr = target[localName];
|
|
61
61
|
if (!Array.isArray(tgtArr)) {
|
|
@@ -105,7 +105,8 @@ function readMapEntry(field, reader, options) {
|
|
|
105
105
|
val = reader.int32();
|
|
106
106
|
break;
|
|
107
107
|
case "message":
|
|
108
|
-
|
|
108
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
109
|
+
val = readMessageField(reader, messageType.create(), messageType.fields, options, undefined);
|
|
109
110
|
break;
|
|
110
111
|
}
|
|
111
112
|
break;
|
|
@@ -126,7 +127,8 @@ function readMapEntry(field, reader, options) {
|
|
|
126
127
|
val = field.V.T.values[0].no;
|
|
127
128
|
break;
|
|
128
129
|
case "message":
|
|
129
|
-
|
|
130
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
131
|
+
val = messageType.create();
|
|
130
132
|
break;
|
|
131
133
|
}
|
|
132
134
|
}
|
|
@@ -301,17 +303,18 @@ function writeUnknownFields(message, writer) {
|
|
|
301
303
|
}
|
|
302
304
|
// Value must not be undefined
|
|
303
305
|
function writeMessageField(writer, options, field, value) {
|
|
304
|
-
const
|
|
306
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
307
|
+
const message = (0, field_wrapper_js_1.wrapField)(messageType.fieldWrapper, value);
|
|
305
308
|
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
306
309
|
if (field.delimited)
|
|
307
310
|
writer
|
|
308
311
|
.tag(field.no, protobuf_1.WireType.StartGroup)
|
|
309
|
-
.raw(
|
|
312
|
+
.raw(messageType.toBinary(message, options))
|
|
310
313
|
.tag(field.no, protobuf_1.WireType.EndGroup);
|
|
311
314
|
else
|
|
312
315
|
writer
|
|
313
316
|
.tag(field.no, protobuf_1.WireType.LengthDelimited)
|
|
314
|
-
.bytes(
|
|
317
|
+
.bytes(messageType.toBinary(message, options));
|
|
315
318
|
}
|
|
316
319
|
function writeScalar(writer, type, fieldNo, value) {
|
|
317
320
|
(0, assert_js_1.assert)(value !== undefined);
|
|
@@ -394,9 +397,10 @@ function writeMapEntry(writer, options, field, key, value) {
|
|
|
394
397
|
break;
|
|
395
398
|
case "message":
|
|
396
399
|
(0, assert_js_1.assert)(value !== undefined);
|
|
400
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
397
401
|
writer
|
|
398
402
|
.tag(2, protobuf_1.WireType.LengthDelimited)
|
|
399
|
-
.bytes(
|
|
403
|
+
.bytes(messageType.toBinary(value, options));
|
|
400
404
|
break;
|
|
401
405
|
}
|
|
402
406
|
writer.join();
|
package/dist/field.d.ts
CHANGED
|
@@ -220,7 +220,7 @@ interface fiMessage extends fiShared {
|
|
|
220
220
|
/**
|
|
221
221
|
* Message handler for the field.
|
|
222
222
|
*/
|
|
223
|
-
readonly T: MessageType;
|
|
223
|
+
readonly T: MessageType | (() => MessageType);
|
|
224
224
|
/**
|
|
225
225
|
* Is the field repeated?
|
|
226
226
|
*/
|
|
@@ -302,7 +302,7 @@ interface fiMap extends fiShared {
|
|
|
302
302
|
readonly T: EnumType;
|
|
303
303
|
} | {
|
|
304
304
|
readonly kind: "message";
|
|
305
|
-
readonly T: MessageType;
|
|
305
|
+
readonly T: MessageType | (() => MessageType);
|
|
306
306
|
};
|
|
307
307
|
/**
|
|
308
308
|
* Is the field repeated? Never true for maps.
|
package/dist/is-message.js
CHANGED
|
@@ -38,7 +38,8 @@ function isCompleteField(value, field) {
|
|
|
38
38
|
case "scalar":
|
|
39
39
|
return true;
|
|
40
40
|
case "message":
|
|
41
|
-
|
|
41
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
42
|
+
return isCompleteMessage(value, messageType.fields.list());
|
|
42
43
|
case "enum":
|
|
43
44
|
return typeof value === "number";
|
|
44
45
|
case "map":
|
|
@@ -50,7 +51,8 @@ function isCompleteField(value, field) {
|
|
|
50
51
|
case "enum":
|
|
51
52
|
return typeof val === "number";
|
|
52
53
|
case "message":
|
|
53
|
-
|
|
54
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
55
|
+
return isCompleteMessage(val, messageType.fields.list());
|
|
54
56
|
default:
|
|
55
57
|
return valueKind;
|
|
56
58
|
}
|
package/dist/json.js
CHANGED
|
@@ -175,7 +175,8 @@ function readField(target, jsonValue, field, options) {
|
|
|
175
175
|
}
|
|
176
176
|
switch (field.kind) {
|
|
177
177
|
case "message":
|
|
178
|
-
|
|
178
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
179
|
+
targetArray.push(messageType.fromJson(jsonItem, options));
|
|
179
180
|
break;
|
|
180
181
|
case "enum":
|
|
181
182
|
const enumValue = readEnum(field.T, jsonItem, options.ignoreUnknownFields, true);
|
|
@@ -226,7 +227,8 @@ function readField(target, jsonValue, field, options) {
|
|
|
226
227
|
}
|
|
227
228
|
switch (field.V.kind) {
|
|
228
229
|
case "message":
|
|
229
|
-
|
|
230
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
231
|
+
targetMap[key] = messageType.fromJson(jsonMapValue, options);
|
|
230
232
|
break;
|
|
231
233
|
case "enum":
|
|
232
234
|
const enumValue = readEnum(field.V.T, jsonMapValue, options.ignoreUnknownFields, true);
|
|
@@ -256,7 +258,7 @@ function readField(target, jsonValue, field, options) {
|
|
|
256
258
|
}
|
|
257
259
|
switch (field.kind) {
|
|
258
260
|
case "message":
|
|
259
|
-
const messageType = field.T;
|
|
261
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
260
262
|
if (jsonValue === null &&
|
|
261
263
|
messageType.typeName != "google.protobuf.Value") {
|
|
262
264
|
return;
|
|
@@ -521,7 +523,8 @@ function writeField(field, value, options) {
|
|
|
521
523
|
case "message":
|
|
522
524
|
for (const [entryKey, entryValue] of entries) {
|
|
523
525
|
// JSON standard allows only (double quoted) string as property key
|
|
524
|
-
|
|
526
|
+
const messageType = typeof field.V.T === "function" ? field.V.T() : field.V.T;
|
|
527
|
+
jsonObj[entryKey.toString()] = messageType.toJson(entryValue, options);
|
|
525
528
|
}
|
|
526
529
|
break;
|
|
527
530
|
case "enum":
|
|
@@ -566,7 +569,7 @@ function writeField(field, value, options) {
|
|
|
566
569
|
case "enum":
|
|
567
570
|
return writeEnum(field.T, value, options.enumAsInteger);
|
|
568
571
|
case "message":
|
|
569
|
-
return (0, field_wrapper_js_1.wrapField)(field.T.fieldWrapper, value).toJson(options);
|
|
572
|
+
return (0, field_wrapper_js_1.wrapField)((typeof field.T === "function" ? field.T() : field.T).fieldWrapper, value).toJson(options);
|
|
570
573
|
}
|
|
571
574
|
}
|
|
572
575
|
function writeScalar(type, value) {
|
package/dist/message.js
CHANGED
|
@@ -41,7 +41,8 @@ function compareMessages(fields, a, b) {
|
|
|
41
41
|
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- repeated fields are never "map"
|
|
42
42
|
switch (m.kind) {
|
|
43
43
|
case "message":
|
|
44
|
-
|
|
44
|
+
const messageType = typeof m.T === "function" ? m.T() : m.T;
|
|
45
|
+
return va.every((a, i) => messageType.equals(a, vb[i]));
|
|
45
46
|
case "scalar":
|
|
46
47
|
return va.every((a, i) => (0, scalar_js_1.scalarEquals)(m.T, a, vb[i]));
|
|
47
48
|
case "enum":
|
|
@@ -51,7 +52,7 @@ function compareMessages(fields, a, b) {
|
|
|
51
52
|
}
|
|
52
53
|
switch (m.kind) {
|
|
53
54
|
case "message":
|
|
54
|
-
return m.T.equals(va, vb);
|
|
55
|
+
return (typeof m.T === "function" ? m.T() : m.T).equals(va, vb);
|
|
55
56
|
case "enum":
|
|
56
57
|
return (0, scalar_js_1.scalarEquals)(protobuf_1.ScalarType.INT32, va, vb);
|
|
57
58
|
case "scalar":
|
|
@@ -67,7 +68,8 @@ function compareMessages(fields, a, b) {
|
|
|
67
68
|
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- oneof fields are never "map"
|
|
68
69
|
switch (s.kind) {
|
|
69
70
|
case "message":
|
|
70
|
-
|
|
71
|
+
const messageType = typeof s.T === "function" ? s.T() : s.T;
|
|
72
|
+
return messageType.equals(va.value, vb.value);
|
|
71
73
|
case "enum":
|
|
72
74
|
return (0, scalar_js_1.scalarEquals)(protobuf_1.ScalarType.INT32, va.value, vb.value);
|
|
73
75
|
case "scalar":
|
|
@@ -78,7 +80,7 @@ function compareMessages(fields, a, b) {
|
|
|
78
80
|
const keys = Object.keys(va).concat(Object.keys(vb));
|
|
79
81
|
switch (m.V.kind) {
|
|
80
82
|
case "message":
|
|
81
|
-
const messageType = m.V.T;
|
|
83
|
+
const messageType = typeof m.V.T === "function" ? m.V.T() : m.V.T;
|
|
82
84
|
return keys.every((k) => messageType.equals(va[k], vb[k]));
|
|
83
85
|
case "enum":
|
|
84
86
|
return keys.every((k) => (0, scalar_js_1.scalarEquals)(protobuf_1.ScalarType.INT32, va[k], vb[k]));
|
|
@@ -96,7 +98,8 @@ function cloneSingularField(value, fieldInfo) {
|
|
|
96
98
|
return value;
|
|
97
99
|
}
|
|
98
100
|
if (fieldInfo.kind === "message") {
|
|
99
|
-
|
|
101
|
+
const messageType = typeof fieldInfo.T === "function" ? fieldInfo.T() : fieldInfo.T;
|
|
102
|
+
return cloneMessage(value, messageType.fields);
|
|
100
103
|
}
|
|
101
104
|
if (fieldInfo.kind === "oneof") {
|
|
102
105
|
if (value.case === undefined) {
|
|
@@ -237,7 +240,8 @@ function createMessage(fields) {
|
|
|
237
240
|
message[field.localName] = undefined;
|
|
238
241
|
continue;
|
|
239
242
|
}
|
|
240
|
-
|
|
243
|
+
const messageType = typeof field.T === "function" ? field.T() : field.T;
|
|
244
|
+
message[field.localName] = createMessage(messageType.fields);
|
|
241
245
|
break;
|
|
242
246
|
case "map":
|
|
243
247
|
message[field.localName] = {};
|
package/dist/partial.js
CHANGED
|
@@ -22,10 +22,13 @@ function applyPartialMessage(source, target, fields) {
|
|
|
22
22
|
}
|
|
23
23
|
const sourceField = member.findField(sk);
|
|
24
24
|
let val = s[localName].value;
|
|
25
|
-
if (sourceField
|
|
26
|
-
sourceField.
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
if (sourceField?.kind == "message") {
|
|
26
|
+
const messageType = typeof sourceField.T === "function"
|
|
27
|
+
? sourceField.T()
|
|
28
|
+
: sourceField.T;
|
|
29
|
+
if (!(0, is_message_js_1.isCompleteMessage)(val, messageType.fields.list())) {
|
|
30
|
+
val = messageType.create(val);
|
|
31
|
+
}
|
|
29
32
|
}
|
|
30
33
|
else if (sourceField &&
|
|
31
34
|
sourceField.kind === "scalar" &&
|
|
@@ -58,7 +61,7 @@ function applyPartialMessage(source, target, fields) {
|
|
|
58
61
|
}
|
|
59
62
|
break;
|
|
60
63
|
case "message":
|
|
61
|
-
const messageType = member.V.T;
|
|
64
|
+
const messageType = typeof member.V.T === "function" ? member.V.T() : member.V.T;
|
|
62
65
|
for (const k of Object.keys(s[localName])) {
|
|
63
66
|
let val = s[localName][k];
|
|
64
67
|
if (!messageType.fieldWrapper) {
|
|
@@ -72,7 +75,7 @@ function applyPartialMessage(source, target, fields) {
|
|
|
72
75
|
}
|
|
73
76
|
break;
|
|
74
77
|
case "message":
|
|
75
|
-
const mt = member.T;
|
|
78
|
+
const mt = typeof member.T === "function" ? member.T() : member.T;
|
|
76
79
|
if (member.repeated) {
|
|
77
80
|
t[localName] = s[localName].map((val) => (0, is_message_js_1.isCompleteMessage)(val, mt.fields.list()) ? val : mt.create(val));
|
|
78
81
|
}
|
|
@@ -89,9 +92,10 @@ function applyPartialMessage(source, target, fields) {
|
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
else {
|
|
92
|
-
|
|
95
|
+
const messageType = mt;
|
|
96
|
+
t[localName] = (0, is_message_js_1.isCompleteMessage)(val, messageType.fields.list())
|
|
93
97
|
? val
|
|
94
|
-
:
|
|
98
|
+
: messageType.create(val);
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
break;
|
package/dist/typescript.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { DescExtension, DescField } from "@bufbuild/protobuf";
|
|
2
|
-
import type { GeneratedFile, Printable, Schema } from "@bufbuild/protoplugin/ecmascript";
|
|
1
|
+
import type { DescEnum, DescExtension, DescField, DescFile, DescMessage } from "@bufbuild/protobuf";
|
|
2
|
+
import type { GeneratedFile, ImportSymbol, Printable, Schema } from "@bufbuild/protoplugin/ecmascript";
|
|
3
3
|
export declare function generateTs(schema: Schema): void;
|
|
4
|
+
export declare function makeImportPath(file: DescFile): string;
|
|
4
5
|
export declare function generateFieldInfo(f: GeneratedFile, field: DescField | DescExtension): void;
|
|
6
|
+
export declare const createTypeImport: (desc: DescMessage | DescEnum | DescExtension) => ImportSymbol;
|
|
5
7
|
export declare function getFieldInfoLiteral(field: DescField | DescExtension): Printable;
|
package/dist/typescript.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// See the License for the specific language governing permissions and
|
|
15
15
|
// limitations under the License.
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getFieldInfoLiteral = exports.generateFieldInfo = exports.generateTs = void 0;
|
|
17
|
+
exports.getFieldInfoLiteral = exports.createTypeImport = exports.generateFieldInfo = exports.makeImportPath = exports.generateTs = void 0;
|
|
18
18
|
const protobuf_1 = require("@bufbuild/protobuf");
|
|
19
19
|
const ecmascript_1 = require("@bufbuild/protoplugin/ecmascript");
|
|
20
20
|
const editions_js_1 = require("./editions.js");
|
|
@@ -40,6 +40,9 @@ function generateTs(schema) {
|
|
|
40
40
|
if (message.file !== file) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
|
+
for (const nestedEnum of message.nestedEnums) {
|
|
44
|
+
generateEnum(f, nestedEnum);
|
|
45
|
+
}
|
|
43
46
|
messageTypes.push(message);
|
|
44
47
|
const deps = new Set();
|
|
45
48
|
for (const field of message.fields) {
|
|
@@ -133,12 +136,6 @@ function generateMessage(schema, f, message) {
|
|
|
133
136
|
f.print(" },");
|
|
134
137
|
f.print(");");
|
|
135
138
|
f.print();
|
|
136
|
-
for (const nestedEnum of message.nestedEnums) {
|
|
137
|
-
generateEnum(f, nestedEnum);
|
|
138
|
-
}
|
|
139
|
-
for (const nestedMessage of message.nestedMessages) {
|
|
140
|
-
generateMessage(schema, f, nestedMessage);
|
|
141
|
-
}
|
|
142
139
|
}
|
|
143
140
|
function generateField(f, field) {
|
|
144
141
|
if (field.oneof) {
|
|
@@ -168,10 +165,23 @@ function generateOneof(f, oneof) {
|
|
|
168
165
|
.flat();
|
|
169
166
|
f.print(" ", oneof.name, "?: {\n value?: undefined,\n case: undefined\n }", oneOfCases, ";");
|
|
170
167
|
}
|
|
168
|
+
function makeImportPath(file) {
|
|
169
|
+
return "./" + file.name + "_pb.js";
|
|
170
|
+
}
|
|
171
|
+
exports.makeImportPath = makeImportPath;
|
|
171
172
|
function generateFieldInfo(f, field) {
|
|
172
173
|
f.print(" ", getFieldInfoLiteral(field), ",");
|
|
173
174
|
}
|
|
174
175
|
exports.generateFieldInfo = generateFieldInfo;
|
|
176
|
+
const createTypeImport = (desc) => {
|
|
177
|
+
var name = (0, ecmascript_1.localName)(desc);
|
|
178
|
+
if (desc.kind === "enum") {
|
|
179
|
+
name += "_Enum";
|
|
180
|
+
}
|
|
181
|
+
const from = makeImportPath(desc.file);
|
|
182
|
+
return (0, ecmascript_1.createImportSymbol)(name, from);
|
|
183
|
+
};
|
|
184
|
+
exports.createTypeImport = createTypeImport;
|
|
175
185
|
function getFieldInfoLiteral(field) {
|
|
176
186
|
const e = [];
|
|
177
187
|
e.push("{ no: ", field.number, `, `);
|
|
@@ -195,7 +205,7 @@ function getFieldInfoLiteral(field) {
|
|
|
195
205
|
e.push(`V: {kind: "scalar", T: `, field.mapValue.scalar, ` /* ScalarType.`, protobuf_1.ScalarType[field.mapValue.scalar], ` */}, `);
|
|
196
206
|
break;
|
|
197
207
|
case "message":
|
|
198
|
-
e.push(`V: {kind: "message", T: `, field.mapValue.message, `}, `);
|
|
208
|
+
e.push(`V: {kind: "message", T: () => `, field.mapValue.message, `}, `);
|
|
199
209
|
break;
|
|
200
210
|
case "enum":
|
|
201
211
|
e.push(`V: {kind: "enum", T: `, field.mapValue.enum, `}, `);
|
|
@@ -203,13 +213,13 @@ function getFieldInfoLiteral(field) {
|
|
|
203
213
|
}
|
|
204
214
|
break;
|
|
205
215
|
case "message":
|
|
206
|
-
e.push(`kind: "message", T: `, field.message, `, `);
|
|
216
|
+
e.push(`kind: "message", T: () => `, field.message, `, `);
|
|
207
217
|
if (field.proto.type === protobuf_1.FieldDescriptorProto_Type.GROUP) {
|
|
208
218
|
e.push(`delimited: true, `);
|
|
209
219
|
}
|
|
210
220
|
break;
|
|
211
221
|
case "enum":
|
|
212
|
-
e.push(`kind: "enum", T: `, field.enum,
|
|
222
|
+
e.push(`kind: "enum", T: `, (0, exports.createTypeImport)(field.enum), `, `);
|
|
213
223
|
break;
|
|
214
224
|
}
|
|
215
225
|
if (field.repeated) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aptre/protobuf-es-lite",
|
|
3
3
|
"description": "Lightweight Protobuf codegen for TypeScript and JavaScript.",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.7",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"url": "git+ssh://git@github.com/aperturerobotics/protobuf-es-lite.git"
|