Skip to content

Commit

Permalink
feat: Ensure strict(er) TS compliance for the generated code (#868)
Browse files Browse the repository at this point in the history
* Ensure strict(er) TS compliance for the generated code

- Add a new `tsc:check` script to ensure that there are no TS files with
  undetected errors.
- Split the TS configs in `integrations` so the compiled proto TS files can
  underly much stricter configuration requirements than the test files
  themselves.
- Add `DOM` to `compilerOptions.lib` for integration tests to have DOM's
  `AbortSignal` in scope.
- Apply the strictest TS preset there is to the compiled proto TS files (with
  a few exceptions that may be resolved later).
- Update the generated code to adhere to the stricter TS config.
- Modernise a few areas of the generated code.
- Add `tsc:check` to the CI script

* fixup! Ensure strict(er) TS compliance for the generated code

* fixup! Ensure strict(er) TS compliance for the generated code

* fixup! Ensure strict(er) TS compliance for the generated code

* fixup! Ensure strict(er) TS compliance for the generated code

* fixup! Ensure strict(er) TS compliance for the generated code
  • Loading branch information
threema-lenny committed Jul 10, 2023
1 parent 5ec618c commit 1405d4b
Show file tree
Hide file tree
Showing 99 changed files with 674 additions and 618 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:

strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
node-version: [16.x, 18.x, 20.x]

steps:
- uses: actions/checkout@v3
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:

strategy:
matrix:
node-version: [14.x]
node-version: [20.x]

steps:
- uses: actions/checkout@v3
Expand All @@ -21,7 +21,16 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: install dependencies
run: yarn install || echo "ignore failure"
run: yarn install
- name: Prepare Integration
run: ./integration/pbjs.sh
# This will fail if any git-tracked file has changed
- name: Codegen
run: yarn bin2ts
- name: TypeScript
run: yarn tsc:check
env:
CI: true
- name: Prettier
run: yarn format:check
env:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,7 @@ export class EntityServiceClientImpl<Context extends DataLoaders> implements Ent
return new DataLoader<string, Entity>((ids) => {
const request = { ids };
return this.BatchMapQuery(ctx, request).then((res) => {
return ids.map((key) => res.entities[key]);
return ids.map((key) => res.entities[key] ?? fail());
});
}, { cacheKeyFn: hash, ...ctx.rpcDataLoaderOptions });
});
Expand Down Expand Up @@ -770,3 +770,7 @@ function isObject(value: any): boolean {
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}

function fail(message?: string): never {
throw new Error(message ?? "Failed");
}
6 changes: 5 additions & 1 deletion integration/batching-with-context/batching.ts
Original file line number Diff line number Diff line change
Expand Up @@ -705,7 +705,7 @@ export class EntityServiceClientImpl<Context extends DataLoaders> implements Ent
return new DataLoader<string, Entity>((ids) => {
const request = { ids };
return this.BatchMapQuery(ctx, request).then((res) => {
return ids.map((key) => res.entities[key]);
return ids.map((key) => res.entities[key] ?? fail());
});
}, { cacheKeyFn: hash, ...ctx.rpcDataLoaderOptions });
});
Expand Down Expand Up @@ -770,3 +770,7 @@ function isObject(value: any): boolean {
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}

function fail(message?: string): never {
throw new Error(message ?? "Failed");
}
8 changes: 4 additions & 4 deletions integration/bytes-as-base64/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ export const Message = {
},
};

declare var self: any | undefined;
declare var window: any | undefined;
declare var global: any | undefined;
var tsProtoGlobalThis: any = (() => {
declare const self: any | undefined;
declare const window: any | undefined;
declare const global: any | undefined;
const tsProtoGlobalThis: any = (() => {
if (typeof globalThis !== "undefined") {
return globalThis;
}
Expand Down
8 changes: 4 additions & 4 deletions integration/bytes-node/google/protobuf/wrappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -599,10 +599,10 @@ export const BytesValue = {
},
};

declare var self: any | undefined;
declare var window: any | undefined;
declare var global: any | undefined;
var tsProtoGlobalThis: any = (() => {
declare const self: any | undefined;
declare const window: any | undefined;
declare const global: any | undefined;
const tsProtoGlobalThis: any = (() => {
if (typeof globalThis !== "undefined") {
return globalThis;
}
Expand Down
8 changes: 4 additions & 4 deletions integration/bytes-node/point.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@ export const Point = {
},
};

declare var self: any | undefined;
declare var window: any | undefined;
declare var global: any | undefined;
var tsProtoGlobalThis: any = (() => {
declare const self: any | undefined;
declare const window: any | undefined;
declare const global: any | undefined;
const tsProtoGlobalThis: any = (() => {
if (typeof globalThis !== "undefined") {
return globalThis;
}
Expand Down
45 changes: 23 additions & 22 deletions integration/extensions/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,19 @@ export function enumToJSON(object: Enum): string {
}

export interface Extendable {
field?: string;
_unknownFields?: { [key: number]: Uint8Array[] };
field?: string | undefined;
_unknownFields?: { [key: number]: Uint8Array[] } | undefined;
}

export interface Nested {
field?: string;
_unknownFields?: { [key: number]: Uint8Array[] };
field?: string | undefined;
_unknownFields?: { [key: number]: Uint8Array[] } | undefined;
}

export interface Group {
name?: string;
value?: string;
_unknownFields?: { [key: number]: Uint8Array[] };
name?: string | undefined;
value?: string | undefined;
_unknownFields?: { [key: number]: Uint8Array[] } | undefined;
}

function createBaseExtendable(): Extendable {
Expand All @@ -69,8 +69,7 @@ export const Extendable = {
writer.uint32(10).string(message.field);
}
if (message._unknownFields !== undefined) {
for (const key in message._unknownFields) {
const values = message._unknownFields[key];
for (const [key, values] of Object.entries(message._unknownFields)) {
const tag = parseInt(key, 10);
for (const value of values) {
writer.uint32(tag);
Expand Down Expand Up @@ -216,7 +215,7 @@ export const Nested = {
},
decode: (tag: number, input: Uint8Array[]): Nested[] => {
const values: Nested[] = [];
for (var buffer of input) {
for (const buffer of input) {
const reader = _m0.Reader.create(buffer);
values.push(Nested.decode(reader, reader.uint32()));
}
Expand All @@ -230,8 +229,7 @@ export const Nested = {
writer.uint32(10).string(message.field);
}
if (message._unknownFields !== undefined) {
for (const key in message._unknownFields) {
const values = message._unknownFields[key];
for (const [key, values] of Object.entries(message._unknownFields)) {
const tag = parseInt(key, 10);
for (const value of values) {
writer.uint32(tag);
Expand Down Expand Up @@ -317,8 +315,7 @@ export const Group = {
writer.uint32(18).string(message.value);
}
if (message._unknownFields !== undefined) {
for (const key in message._unknownFields) {
const values = message._unknownFields[key];
for (const [key, values] of Object.entries(message._unknownFields)) {
const tag = parseInt(key, 10);
for (const value of values) {
writer.uint32(tag);
Expand Down Expand Up @@ -422,7 +419,7 @@ export const packed: Extension<number[]> = {
},
decode: (tag: number, input: Uint8Array[]): number[] => {
const values: number[] = [];
for (var buffer of input) {
for (const buffer of input) {
const reader = _m0.Reader.create(buffer);
if (tag == 42) {
const end2 = reader.uint32() + reader.pos;
Expand Down Expand Up @@ -457,7 +454,7 @@ export const repeated: Extension<number[]> = {
},
decode: (tag: number, input: Uint8Array[]): number[] => {
const values: number[] = [];
for (var buffer of input) {
for (const buffer of input) {
const reader = _m0.Reader.create(buffer);
if (tag == 50) {
const end2 = reader.uint32() + reader.pos;
Expand Down Expand Up @@ -488,7 +485,7 @@ export const bytes: Extension<Uint8Array> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): Uint8Array => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return reader.bytes();
},
};
Expand All @@ -508,7 +505,7 @@ export const string: Extension<string> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): string => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return reader.string();
},
};
Expand All @@ -528,7 +525,7 @@ export const long: Extension<Long> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): Long => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return reader.int64() as Long;
},
};
Expand All @@ -548,7 +545,7 @@ export const fixed: Extension<Long> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): Long => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return reader.fixed64() as Long;
},
};
Expand All @@ -568,7 +565,7 @@ export const enumField: Extension<Enum> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): Enum => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return reader.int32() as any;
},
};
Expand All @@ -586,7 +583,7 @@ export const group: Extension<Group> = {
return encoded;
},
decode: (tag: number, input: Uint8Array[]): Group => {
const reader = _m0.Reader.create(input[input.length - 1]);
const reader = _m0.Reader.create(input[input.length - 1] ?? fail());
return Group.decode(reader);
},
};
Expand Down Expand Up @@ -623,3 +620,7 @@ export interface Extension<T> {
repeated: boolean;
packed: boolean;
}

function fail(message?: string): never {
throw new Error(message ?? "Failed");
}
8 changes: 4 additions & 4 deletions integration/file-suffix/google/protobuf/timestamp.pb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,10 @@ export const Timestamp = {
},
};

declare var self: any | undefined;
declare var window: any | undefined;
declare var global: any | undefined;
var tsProtoGlobalThis: any = (() => {
declare const self: any | undefined;
declare const window: any | undefined;
declare const global: any | undefined;
const tsProtoGlobalThis: any = (() => {
if (typeof globalThis !== "undefined") {
return globalThis;
}
Expand Down
16 changes: 8 additions & 8 deletions integration/from-partial-no-initialize/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ import * as _m0 from "protobufjs/minimal";
export const protobufPackage = "";

export interface TPartialMessage {
field?: string;
field?: string | undefined;
}

export interface TPartial {
number?: number;
string?: string;
map?: { [key: string]: string };
message?: TPartialMessage;
repeatedMessage?: TPartialMessage[];
repeatedString?: string[];
repeatedNumber?: number[];
number?: number | undefined;
string?: string | undefined;
map?: { [key: string]: string } | undefined;
message?: TPartialMessage | undefined;
repeatedMessage?: TPartialMessage[] | undefined;
repeatedString?: string[] | undefined;
repeatedNumber?: number[] | undefined;
}

export interface TPartial_MapEntry {
Expand Down
3 changes: 3 additions & 0 deletions integration/generic-metadata/some-file.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface Foo {
foo: "bar";
}

0 comments on commit 1405d4b

Please sign in to comment.