Skip to content

Commit

Permalink
recursive message fixes (#38)
Browse files Browse the repository at this point in the history
  • Loading branch information
tatethurston committed Jul 27, 2023
1 parent c3d2518 commit 383d9c5
Show file tree
Hide file tree
Showing 11 changed files with 472 additions and 392 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## v0.0.18

- Fix JSON deserializtion of recursive (self referencing) messages.
- Fix generated TypeScript types for repeated recursive (self referencing) messages.

## v0.0.17

- Omit `Uint8Array` from `PartialDeep` type. This fixes a type error for TypeScript users that use `bytes`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3822,7 +3822,7 @@ export const TestAllTypesProto3JSON = {
optionalAliasedEnum: TestAllTypesProto3.AliasedEnum._fromInt(0),
optionalStringPiece: "",
optionalCord: "",
recursiveMessage: TestAllTypesProto3JSON.initialize(),
recursiveMessage: undefined,
repeatedInt32: [],
repeatedInt64: [],
repeatedUint32: [],
Expand Down Expand Up @@ -5749,7 +5749,7 @@ export const TestAllTypesProto3JSON = {
initialize: function (): TestAllTypesProto3.NestedMessage {
return {
a: 0,
corecursive: TestAllTypesProto3JSON.initialize(),
corecursive: undefined,
};
},

Expand Down
49 changes: 49 additions & 0 deletions e2e/serialization/message.pb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ export interface Foo {
fieldEleven?: Bar | null | undefined;
fieldTwelve?: Bar | null | undefined;
fieldThirteen?: Bar | null | undefined;
fieldFourteen: Foo | null | undefined;
fieldFifteen: Foo[];
}

export declare namespace Foo {
Expand Down Expand Up @@ -141,6 +143,8 @@ export const Foo = {
fieldEleven: undefined,
fieldTwelve: undefined,
fieldThirteen: undefined,
fieldFourteen: undefined,
fieldFifteen: [],
};
},

Expand Down Expand Up @@ -200,6 +204,16 @@ export const Foo = {
if (msg.fieldThirteen != undefined) {
writer.writeMessage(13, msg.fieldThirteen, Bar._writeMessage);
}
if (msg.fieldFourteen) {
writer.writeMessage(14, msg.fieldFourteen, Foo._writeMessage);
}
if (msg.fieldFifteen?.length) {
writer.writeRepeatedMessage(
15,
msg.fieldFifteen as any,
Foo._writeMessage,
);
}
return writer;
},

Expand Down Expand Up @@ -277,6 +291,17 @@ export const Foo = {
reader.readMessage(msg.fieldThirteen, Bar._readMessage);
break;
}
case 14: {
msg.fieldFourteen = Foo.initialize();
reader.readMessage(msg.fieldFourteen, Foo._readMessage);
break;
}
case 15: {
const m = Foo.initialize();
reader.readMessage(m, Foo._readMessage);
msg.fieldFifteen.push(m);
break;
}
default: {
reader.skipField();
break;
Expand Down Expand Up @@ -679,6 +704,8 @@ export const FooJSON = {
fieldEleven: undefined,
fieldTwelve: undefined,
fieldThirteen: undefined,
fieldFourteen: undefined,
fieldFifteen: [],
};
},

Expand Down Expand Up @@ -740,6 +767,15 @@ export const FooJSON = {
const _fieldThirteen_ = BarJSON._writeMessage(msg.fieldThirteen);
json["fieldThirteen"] = _fieldThirteen_;
}
if (msg.fieldFourteen) {
const _fieldFourteen_ = FooJSON._writeMessage(msg.fieldFourteen);
if (Object.keys(_fieldFourteen_).length > 0) {
json["fieldFourteen"] = _fieldFourteen_;
}
}
if (msg.fieldFifteen?.length) {
json["fieldFifteen"] = msg.fieldFifteen.map(FooJSON._writeMessage);
}
return json;
},

Expand Down Expand Up @@ -812,6 +848,19 @@ export const FooJSON = {
msg.fieldThirteen = BarJSON.initialize();
BarJSON._readMessage(msg.fieldThirteen, _fieldThirteen_);
}
const _fieldFourteen_ = json["fieldFourteen"] ?? json["field_fourteen"];
if (_fieldFourteen_) {
msg.fieldFourteen = FooJSON.initialize();
FooJSON._readMessage(msg.fieldFourteen, _fieldFourteen_);
}
const _fieldFifteen_ = json["fieldFifteen"] ?? json["field_fifteen"];
if (_fieldFifteen_) {
for (const item of _fieldFifteen_) {
const m = FooJSON.initialize();
FooJSON._readMessage(m, item);
msg.fieldFifteen.push(m);
}
}
return msg;
},

Expand Down
2 changes: 2 additions & 0 deletions e2e/serialization/message.proto
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ message Foo {
optional Bar field_eleven = 11;
optional Bar field_twelve = 12;
optional Bar field_thirteen = 13;
Foo field_fourteen = 14;
repeated Foo field_fifteen = 15;
}

message Bar {
Expand Down
21 changes: 20 additions & 1 deletion e2e/serialization/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ const fullMessage: Foo = {
],

fieldFour: nestedMessage,

fieldFive: [1n, 2n],
fieldSix: Baz.BAR,
fieldSeven: [Baz.BAR, Baz.FOO],
Expand All @@ -51,6 +50,8 @@ const fullMessage: Foo = {
},
fieldTwelve: undefined,
fieldThirteen: nestedMessage,
fieldFourteen: undefined,
fieldFifteen: [],
};

const partialMessage: Partial<Foo> = {
Expand All @@ -65,12 +66,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": undefined,
"fieldSeven": [],
Expand All @@ -89,12 +92,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": 3,
"fieldSeven": [],
Expand All @@ -113,12 +118,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": undefined,
"fieldSeven": [],
Expand All @@ -141,6 +148,7 @@ describe("Serialization/Deserialization", () => {
"fieldThree": [],
"fieldTwo": {},
},
"fieldFifteen": [],
"fieldFive": [
1n,
2n,
Expand All @@ -157,6 +165,7 @@ describe("Serialization/Deserialization", () => {
"foo": 3n,
},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [
8,
7,
Expand Down Expand Up @@ -415,12 +424,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": undefined,
"fieldSeven": [],
Expand All @@ -440,12 +451,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": 3,
"fieldSeven": [],
Expand All @@ -465,12 +478,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": undefined,
"fieldSeven": [],
Expand All @@ -494,6 +509,7 @@ describe("Serialization/Deserialization", () => {
"fieldThree": [],
"fieldTwo": {},
},
"fieldFifteen": [],
"fieldFive": [
1n,
2n,
Expand All @@ -510,6 +526,7 @@ describe("Serialization/Deserialization", () => {
"foo": "3",
},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [
8,
7,
Expand Down Expand Up @@ -575,12 +592,14 @@ describe("Serialization/Deserialization", () => {
{
"fieldEight": 0n,
"fieldEleven": undefined,
"fieldFifteen": [],
"fieldFive": [],
"fieldFour": {
"fieldOne": "",
"fieldThree": [],
"fieldTwo": {},
},
"fieldFourteen": undefined,
"fieldNine": Uint8Array [],
"fieldOne": 3,
"fieldSeven": [],
Expand Down
2 changes: 1 addition & 1 deletion e2e/treeshaking/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"esbuild": "^0.18.16"
"esbuild": "^0.18.17"
}
}
2 changes: 1 addition & 1 deletion examples/typescript/src/user.pb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export const UserJSON = {
firstName: "",
lastName: "",
active: false,
manager: UserJSON.initialize(),
manager: undefined,
locations: [],
projects: {},
};
Expand Down
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@
"@babel/preset-typescript": "^7.22.5",
"@types/google-protobuf": "^3.15.6",
"@types/jest": "^29.5.3",
"@types/node": "^20.4.4",
"@typescript-eslint/eslint-plugin": "^6.1.0",
"@typescript-eslint/parser": "^6.1.0",
"@types/node": "^20.4.5",
"@typescript-eslint/eslint-plugin": "^6.2.0",
"@typescript-eslint/parser": "^6.2.0",
"babel-loader": "^9.1.3",
"codecov": "^3.8.3",
"esbuild": "^0.18.16",
"esbuild": "^0.18.17",
"eslint": "^8.45.0",
"eslint-config-prettier": "^8.8.0",
"eslint-config-prettier": "^8.9.0",
"husky": "^8.0.3",
"jest": "^29.6.1",
"jest": "^29.6.2",
"prettier": "^3.0.0",
"prettier-package-json": "^2.8.0",
"typescript": "^5.1.6"
Expand Down
2 changes: 1 addition & 1 deletion packages/protoscript/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "protoscript",
"version": "0.0.17",
"version": "0.0.18",
"description": "A Protobuf runtime and code generation tool for JavaScript and TypeScript",
"license": "MIT",
"author": "Tate <tatethurston@gmail.com>",
Expand Down
8 changes: 4 additions & 4 deletions packages/protoscript/src/codegen/autogenerate/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ function writeTypes(types: ProtoTypes[], parents: string[]): string {
result += `Record<string, ${tsType}['value'] | undefined>`;
} else {
result += tsType;
if (optional || mandatoryOptional) {
result += "| null | undefined";
} else if (repeated) {
if (repeated) {
result += "[]";
} else if (optional || mandatoryOptional) {
result += "| null | undefined";
}
}

Expand Down Expand Up @@ -503,7 +503,7 @@ function writeJSONSerializers(types: ProtoTypes[], parents: string[]): string {
return `${field.name}: [],`;
} else if (field.read === "readMessage" && !field.map) {
if (
cycleDetected(field.tsTypeJSON, [
cycleDetected(field.tsType, [
...parents,
node.content.name,
])
Expand Down
Loading

0 comments on commit 383d9c5

Please sign in to comment.