deeplay-io / nice-grpc

A TypeScript gRPC library that is nice to you

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Missing generated types

michal-kapala opened this issue · comments

I compiled auth.proto file with ts-proto as recommended in the docs, although there are no types such as AuthServiceImplementation, AuthServiceDefinition or AuthServiceClient inside of the generated code, which makes me unable to use anything. I'm not sure why that happens.

Codegen (Windows)

.\node_modules\.bin\grpc_tools_node_protoc \
--plugin=protoc-gen-ts_proto=.\node_modules\.bin\protoc-gen-ts_proto.cmd \
--ts_proto_out="D:\next\cve-dashboard\src\server\api\proto\compiled_proto \
--ts_proto_opt=outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false \
--proto_path=./src/server/api/proto \
./src/server/api/proto/auth.proto

auth.proto

syntax = "proto3";

package nice_grpc.auth;

// Authentication service.
service Auth {
  rpc Login (LoginRequest) returns (LoginResponse);
}

message LoginRequest {
  string user = 1;
  string pwd = 2;
}

message LoginResponse {
  string result = 1;
}

auth.ts

/* eslint-disable */
import * as _m0 from "protobufjs/minimal";

export const protobufPackage = "nice_grpc.auth";

export interface LoginRequest {
  user: string;
  pwd: string;
}

export interface LoginResponse {
  result: string;
}

function createBaseLoginRequest(): LoginRequest {
  return { user: "", pwd: "" };
}

export const LoginRequest = {
  encode(message: LoginRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.user !== "") {
      writer.uint32(10).string(message.user);
    }
    if (message.pwd !== "") {
      writer.uint32(18).string(message.pwd);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): LoginRequest {
    const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseLoginRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          message.user = reader.string();
          break;
        case 2:
          message.pwd = reader.string();
          break;
        default:
          reader.skipType(tag & 7);
          break;
      }
    }
    return message;
  },

  fromJSON(object: any): LoginRequest {
    return { user: isSet(object.user) ? String(object.user) : "", pwd: isSet(object.pwd) ? String(object.pwd) : "" };
  },

  toJSON(message: LoginRequest): unknown {
    const obj: any = {};
    message.user !== undefined && (obj.user = message.user);
    message.pwd !== undefined && (obj.pwd = message.pwd);
    return obj;
  },

  create<I extends Exact<DeepPartial<LoginRequest>, I>>(base?: I): LoginRequest {
    return LoginRequest.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<LoginRequest>, I>>(object: I): LoginRequest {
    const message = createBaseLoginRequest();
    message.user = object.user ?? "";
    message.pwd = object.pwd ?? "";
    return message;
  },
};

function createBaseLoginResponse(): LoginResponse {
  return { result: "" };
}

export const LoginResponse = {
  encode(message: LoginResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.result !== "") {
      writer.uint32(10).string(message.result);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): LoginResponse {
    const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseLoginResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          message.result = reader.string();
          break;
        default:
          reader.skipType(tag & 7);
          break;
      }
    }
    return message;
  },

  fromJSON(object: any): LoginResponse {
    return { result: isSet(object.result) ? String(object.result) : "" };
  },

  toJSON(message: LoginResponse): unknown {
    const obj: any = {};
    message.result !== undefined && (obj.result = message.result);
    return obj;
  },

  create<I extends Exact<DeepPartial<LoginResponse>, I>>(base?: I): LoginResponse {
    return LoginResponse.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<LoginResponse>, I>>(object: I): LoginResponse {
    const message = createBaseLoginResponse();
    message.result = object.result ?? "";
    return message;
  },
};

type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;

export type DeepPartial<T> = T extends Builtin ? T
  : T extends Array<infer U> ? Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>
  : T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }
  : Partial<T>;

type KeysOfUnion<T> = T extends T ? keyof T : never;
export type Exact<P, I extends P> = P extends Builtin ? P
  : P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };

function isSet(value: any): boolean {
  return value !== null && value !== undefined;
}

Hmm, it seems that ts-proto does not see any of the passed options, because the Exact types are not disabled as well.

Which versions of ts-proto and grpc-tools are you using?

Hmm, it seems that ts-proto does not see any of the passed options, because the Exact types are not disabled as well.

Which versions of ts-proto and grpc-tools are you using?

I'm using the latest versions downloaded yesterday; seems they were not the issue:

Package Version
ts-proto ^1.141.1
grpc-tools ^1.12.4

I solved this by wrapping --ts_proto_opt with double quotes, i think windows cmd (used cmd and powershell terminals) was just ignoring the option otherwise:

.\node_modules\.bin\grpc_tools_node_protoc \
--plugin=protoc-gen-ts_proto=.\node_modules\.bin\protoc-gen-ts_proto.cmd \
--ts_proto_out="D:\next\cve-dashboard\src\server\api\proto\compiled_proto" \
--ts_proto_opt="outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false" \
--proto_path=./src/server/api/proto \
./src/server/api/proto/auth.proto

Thanks for the hint, it would've probably taken me much longer to get it right

Oh, good job figuring it out! I will add it to the docs.