@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 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
- val = readMessageField(reader, field.V.T.create(), field.V.T.fields, options, undefined);
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
- val = field.V.T.create();
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 message = (0, field_wrapper_js_1.wrapField)(field.T.fieldWrapper, value);
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(field.T.toBinary(message, options))
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(field.T.toBinary(message, options));
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(field.V.T.toBinary(value, options));
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.
@@ -38,7 +38,8 @@ function isCompleteField(value, field) {
38
38
  case "scalar":
39
39
  return true;
40
40
  case "message":
41
- return isCompleteMessage(value, field.T.fields.list());
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
- return isCompleteMessage(val, field.V.T.fields.list());
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
- targetArray.push(field.T.fromJson(jsonItem, options));
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
- targetMap[key] = field.V.T.fromJson(jsonMapValue, options);
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
- jsonObj[entryKey.toString()] = field.V.T.toJson(entryValue, options);
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
- return va.every((a, i) => m.T.equals(a, vb[i]));
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
- return s.T.equals(va.value, vb.value);
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
- return cloneMessage(value, fieldInfo.T.fields);
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
- message[field.localName] = createMessage(field.T.fields);
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.kind == "message" &&
27
- !(0, is_message_js_1.isCompleteMessage)(val, sourceField.T.fields.list())) {
28
- val = sourceField.T.create(val);
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
- t[localName] = (0, is_message_js_1.isCompleteMessage)(val, mt.fields.list())
95
+ const messageType = mt;
96
+ t[localName] = (0, is_message_js_1.isCompleteMessage)(val, messageType.fields.list())
93
97
  ? val
94
- : mt.create(val);
98
+ : messageType.create(val);
95
99
  }
96
100
  }
97
101
  break;
@@ -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;
@@ -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, `_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.5",
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"