@aptre/protobuf-es-lite 0.1.2 → 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.
@@ -23,22 +23,59 @@ const libPkg = "@aptre/protobuf-es-lite";
23
23
  const MessageImport = (0, ecmascript_1.createImportSymbol)("Message", libPkg);
24
24
  const MessageTypeImport = (0, ecmascript_1.createImportSymbol)("MessageType", libPkg);
25
25
  const CreateMessageTypeImport = (0, ecmascript_1.createImportSymbol)("createMessageType", libPkg);
26
+ const PartialFieldInfo = (0, ecmascript_1.createImportSymbol)("PartialFieldInfo", libPkg);
26
27
  function generateTs(schema) {
27
28
  for (const file of schema.files) {
28
29
  const f = schema.generateFile(file.name + "_pb.ts");
29
30
  f.preamble(file);
30
31
  f.print(`export const protobufPackage = "${file.proto.package}";`);
31
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
+ }
32
48
  for (const enumeration of file.enums) {
33
49
  generateEnum(f, enumeration);
34
50
  }
35
51
  for (const message of file.messages) {
52
+ collectMessages(message);
53
+ }
54
+ const sortedMessageTypes = topologicalSort(messageTypes, dependencies);
55
+ for (const message of sortedMessageTypes) {
36
56
  generateMessage(schema, f, message);
37
57
  }
38
58
  // We do not generate anything for services or extensions
39
59
  }
40
60
  }
41
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
+ }
42
79
  // prettier-ignore
43
80
  function generateEnum(f, enumeration) {
44
81
  f.print(f.jsDoc(enumeration));
@@ -83,7 +120,7 @@ function generateMessage(schema, f, message) {
83
120
  for (const field of message.fields) {
84
121
  generateFieldInfo(f, field);
85
122
  }
86
- f.print(" ],");
123
+ f.print(" ] as readonly ", PartialFieldInfo, "[],");
87
124
  f.print(" packedByDefault: ", message.file.proto.syntax === "proto3", ",");
88
125
  f.print(" },");
89
126
  f.print(");");
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ "files": ["example_pb.ts"],
4
+ "compilerOptions": {
5
+ "paths": {"@aptre/protobuf-es-lite": ["../", "../dist"]}
6
+ }
7
+ }
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.2",
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"
@@ -34,6 +34,10 @@
34
34
  "scripts": {
35
35
  "clean": "rimraf ./dist",
36
36
  "build": "npm run clean && tsc --project tsconfig.json --outDir ./dist",
37
+ "release:version": "npm version patch -m \"release: v%s\" --no-git-tag-version",
38
+ "release:commit": "git reset && git add package.json && git commit -s -m \"release: v$npm_package_version\" && git tag v$npm_package_version",
39
+ "release:publish": "git push --follow-tags && npm run build && npm publish",
40
+ "release": "npm run release:version && npm run release:commit",
37
41
  "typecheck": "tsc --noEmit --project tsconfig.json --outDir ./dist",
38
42
  "example": "npm run build && protoc --plugin=./bin/protoc-gen-es-lite --es-lite_out=. --es-lite_opt target=ts --es-lite_opt ts_nocheck=false ./example/example.proto",
39
43
  "format": "prettier --write './src/**/(*.ts|*.tsx|*.html|*.css|*.scss)'"