@aptre/protobuf-es-lite 0.1.3 → 0.1.4

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 (2) hide show
  1. package/dist/typescript.js +36 -0
  2. package/package.json +1 -1
@@ -30,16 +30,52 @@ function generateTs(schema) {
30
30
  f.preamble(file);
31
31
  f.print(`export const protobufPackage = "${file.proto.package}";`);
32
32
  f.print();
33
+ const messageTypes = [];
34
+ const dependencies = new Map();
35
+ function collectMessages(message) {
36
+ messageTypes.push(message);
37
+ const deps = new Set();
38
+ for (const field of message.fields) {
39
+ if (field.fieldKind === "message") {
40
+ deps.add(field.message);
41
+ }
42
+ }
43
+ dependencies.set(message, deps);
44
+ for (const nestedMessage of message.nestedMessages) {
45
+ collectMessages(nestedMessage);
46
+ }
47
+ }
33
48
  for (const enumeration of file.enums) {
34
49
  generateEnum(f, enumeration);
35
50
  }
36
51
  for (const message of file.messages) {
52
+ collectMessages(message);
53
+ }
54
+ const sortedMessageTypes = topologicalSort(messageTypes, dependencies);
55
+ for (const message of sortedMessageTypes) {
37
56
  generateMessage(schema, f, message);
38
57
  }
39
58
  // We do not generate anything for services or extensions
40
59
  }
41
60
  }
42
61
  exports.generateTs = generateTs;
62
+ function topologicalSort(messages, dependencies) {
63
+ const result = [];
64
+ const visited = new Set();
65
+ const visit = (message) => {
66
+ if (visited.has(message))
67
+ return;
68
+ visited.add(message);
69
+ for (const dep of dependencies.get(message) ?? []) {
70
+ visit(dep);
71
+ }
72
+ result.push(message);
73
+ };
74
+ for (const message of messages) {
75
+ visit(message);
76
+ }
77
+ return result;
78
+ }
43
79
  // prettier-ignore
44
80
  function generateEnum(f, enumeration) {
45
81
  f.print(f.jsDoc(enumeration));
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.1.3",
4
+ "version": "0.1.4",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "url": "git+ssh://git@github.com/aperturerobotics/protobuf-es-lite.git"