@aptre/protobuf-es-lite 0.1.4 → 0.1.6
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/dist/typescript.js +36 -20
- package/example/example.proto +4 -1
- package/package.json +7 -2
package/dist/typescript.js
CHANGED
|
@@ -30,27 +30,30 @@ function generateTs(schema) {
|
|
|
30
30
|
f.preamble(file);
|
|
31
31
|
f.print(`export const protobufPackage = "${file.proto.package}";`);
|
|
32
32
|
f.print();
|
|
33
|
+
for (const enumeration of file.enums) {
|
|
34
|
+
generateEnum(f, enumeration);
|
|
35
|
+
}
|
|
33
36
|
const messageTypes = [];
|
|
34
37
|
const dependencies = new Map();
|
|
35
38
|
function collectMessages(message) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
if (message.file === file) {
|
|
40
|
+
messageTypes.push(message);
|
|
41
|
+
const deps = new Set();
|
|
42
|
+
for (const field of message.fields) {
|
|
43
|
+
if (field.fieldKind === "message" && field.message.file === file) {
|
|
44
|
+
deps.add(field.message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
dependencies.set(message, deps);
|
|
48
|
+
for (const nestedMessage of message.nestedMessages) {
|
|
49
|
+
collectMessages(nestedMessage);
|
|
41
50
|
}
|
|
42
51
|
}
|
|
43
|
-
dependencies.set(message, deps);
|
|
44
|
-
for (const nestedMessage of message.nestedMessages) {
|
|
45
|
-
collectMessages(nestedMessage);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
for (const enumeration of file.enums) {
|
|
49
|
-
generateEnum(f, enumeration);
|
|
50
52
|
}
|
|
51
53
|
for (const message of file.messages) {
|
|
52
54
|
collectMessages(message);
|
|
53
55
|
}
|
|
56
|
+
// Topological sort toensure consts are declared in the right order.
|
|
54
57
|
const sortedMessageTypes = topologicalSort(messageTypes, dependencies);
|
|
55
58
|
for (const message of sortedMessageTypes) {
|
|
56
59
|
generateMessage(schema, f, message);
|
|
@@ -59,10 +62,11 @@ function generateTs(schema) {
|
|
|
59
62
|
}
|
|
60
63
|
}
|
|
61
64
|
exports.generateTs = generateTs;
|
|
65
|
+
// topologicalSort sorts the list of messages by dependency order.
|
|
62
66
|
function topologicalSort(messages, dependencies) {
|
|
63
67
|
const result = [];
|
|
64
68
|
const visited = new Set();
|
|
65
|
-
|
|
69
|
+
function visit(message) {
|
|
66
70
|
if (visited.has(message))
|
|
67
71
|
return;
|
|
68
72
|
visited.add(message);
|
|
@@ -70,7 +74,7 @@ function topologicalSort(messages, dependencies) {
|
|
|
70
74
|
visit(dep);
|
|
71
75
|
}
|
|
72
76
|
result.push(message);
|
|
73
|
-
}
|
|
77
|
+
}
|
|
74
78
|
for (const message of messages) {
|
|
75
79
|
visit(message);
|
|
76
80
|
}
|
|
@@ -103,14 +107,15 @@ function generateMessage(schema, f, message) {
|
|
|
103
107
|
(0, editions_js_1.getNonEditionRuntime)(schema, message.file);
|
|
104
108
|
f.print(f.jsDoc(message));
|
|
105
109
|
f.print(f.exportDecl("interface", message), " extends ", MessageImport, "<", message, "> {");
|
|
106
|
-
for (const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
generateField(f, member);
|
|
110
|
-
break;
|
|
110
|
+
for (const field of message.fields) {
|
|
111
|
+
if (!field.oneof) {
|
|
112
|
+
generateField(f, field);
|
|
111
113
|
}
|
|
112
|
-
f.print();
|
|
113
114
|
}
|
|
115
|
+
for (const oneof of message.oneofs) {
|
|
116
|
+
generateOneof(f, oneof);
|
|
117
|
+
}
|
|
118
|
+
f.print();
|
|
114
119
|
f.print("}");
|
|
115
120
|
f.print();
|
|
116
121
|
f.print(f.exportDecl("const", message), ": ", MessageTypeImport, "<", message, "> = ", CreateMessageTypeImport, "(");
|
|
@@ -139,6 +144,17 @@ function generateField(f, field) {
|
|
|
139
144
|
f.print(" ", (0, ecmascript_1.localName)(field), ": ", typing, ";");
|
|
140
145
|
}
|
|
141
146
|
// prettier-ignore
|
|
147
|
+
function generateOneof(f, oneof) {
|
|
148
|
+
f.print();
|
|
149
|
+
f.print(f.jsDoc(oneof, " "));
|
|
150
|
+
var oneOfCases = oneof.fields.map((field) => {
|
|
151
|
+
const { typing } = (0, util_js_1.getFieldTypeInfo)(field);
|
|
152
|
+
const doc = f.jsDoc(field, " ");
|
|
153
|
+
return [` | {\n`, doc, `\n value: `, typing, `;\n case: "`, (0, ecmascript_1.localName)(field), `";\n }`];
|
|
154
|
+
}).flat();
|
|
155
|
+
f.print(" ", oneof.name, ": {\n value?: undefined,\n case: undefined\n }", oneOfCases, ";");
|
|
156
|
+
}
|
|
157
|
+
// prettier-ignore
|
|
142
158
|
function generateFieldInfo(f, field) {
|
|
143
159
|
f.print(" ", getFieldInfoLiteral(field), ",");
|
|
144
160
|
}
|
package/example/example.proto
CHANGED
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.
|
|
4
|
+
"version": "0.1.6",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"url": "git+ssh://git@github.com/aperturerobotics/protobuf-es-lite.git"
|
|
@@ -40,9 +40,13 @@
|
|
|
40
40
|
"release": "npm run release:version && npm run release:commit",
|
|
41
41
|
"typecheck": "tsc --noEmit --project tsconfig.json --outDir ./dist",
|
|
42
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",
|
|
43
|
-
"format": "prettier --write './src/**/(*.ts|*.tsx|*.html|*.css|*.scss)'"
|
|
43
|
+
"format": "prettier --write './src/**/(*.ts|*.tsx|*.html|*.css|*.scss)'",
|
|
44
|
+
"precommit": "npm run format"
|
|
44
45
|
},
|
|
45
46
|
"preferUnplugged": true,
|
|
47
|
+
"pre-commit": [
|
|
48
|
+
"precommit"
|
|
49
|
+
],
|
|
46
50
|
"dependencies": {
|
|
47
51
|
"@bufbuild/protobuf": "^1.9.0",
|
|
48
52
|
"@bufbuild/protoplugin": "1.9.0"
|
|
@@ -56,6 +60,7 @@
|
|
|
56
60
|
}
|
|
57
61
|
},
|
|
58
62
|
"devDependencies": {
|
|
63
|
+
"pre-commit": "^1.2.2",
|
|
59
64
|
"prettier": "^3.2.5",
|
|
60
65
|
"rimraf": "^5.0.5",
|
|
61
66
|
"typescript": "^5.4.5"
|