einride / protoc-gen-typescript-http

Generate types and service clients from protobuf definitions annotated with http rules.
MIT License
44 stars 10 forks source link

[Bug] Missing field in Generated TypeScript Code Using buf with google.type.Decimal #157

Open jekabolt opened 9 months ago

jekabolt commented 9 months ago

Description When using buf to generate TypeScript HTTP code from .proto files, the max_price field defined as google.type.Decimal in FilterConditions is not being generated in the TypeScript code. This issue does not occur when google.type.Decimal is replaced with string. The problem seems specific to the handling of google.type.Decimal type for the max_price field.

Environment Go version: 1.21.4 darwin/arm64 TypeScript version: Version 5.1.3 OS: Darwin & Ubuntu

Steps to Reproduce Define min_price and max_price fields in FilterConditions message in common.proto using google.type.Decimal. Generate TypeScript code using buf.gen.yaml configuration. Observe that only minPrice is generated correctly in TypeScript, while maxPrice is missing. Expected Behavior Both minPrice and maxPrice fields should be generated in the TypeScript code, similar to how they are generated when defined as string types.

Actual Behavior Only the minPrice field is generated in the TypeScript code. The maxPrice field is missing when using google.type.Decimal type.

Additional Information admin.proto and common.proto files used for generating code. buf.gen.yaml configuration file. Examples of generated code with min_price and max_price as google.type.Decimal and as string. Example Files

test.proto

rpc GetProductsPaged(GetProductsPagedRequest) returns (GetProductsPagedResponse) {
    option (google.api.http) = {get: "/api/admin/product/paged"};
}

message GetProductsPagedRequest {
  int32 limit = 1;
  int32 offset = 2;
  FilterConditions filter_conditions = 3;
}

message FilterConditions {
  google.type.Decimal min_price = 1;
  google.type.Decimal max_price = 2;
}

buf.gen.yaml

version: v1
managed:
  enabled: true
plugins:
  - plugin: typescript-http
    out: src/api/proto-http
    opt: paths=source_relative

generated code with min/max google.type.Decimal

 if (request.filterConditions?.minPrice?.value) {
        queryParams.push(`filterConditions.minPrice.value=${encodeURIComponent(request.filterConditions.minPrice.value.toString())}`)
      }
      if (request.filterConditions?.onSale) {
        queryParams.push(`filterConditions.onSale=${encodeURIComponent(request.filterConditions.onSale.toString())}`)
      }
      if (request.filterConditions?.color) {
        queryParams.push(`filterConditions.color=${encodeURIComponent(request.filterConditions.color.toString())}`)
      }
      if (request.filterConditions?.categoryId) {
        queryParams.push(`filterConditions.categoryId=${encodeURIComponent(request.filterConditions.categoryId.toString())}`)
      }
      if (request.filterConditions?.sizesIds) {
        request.filterConditions.sizesIds.forEach((x) => {
          queryParams.push(`filterConditions.sizesIds=${encodeURIComponent(x.toString())}`)
        })
      }
      if (request.filterConditions?.preorder) {
        queryParams.push(`filterConditions.preorder=${encodeURIComponent(request.filterConditions.preorder.toString())}`)
      }
      if (request.filterConditions?.byTag) {
        queryParams.push(`filterConditions.byTag=${encodeURIComponent(request.filterConditions.byTag.toString())}`)
      }

generated code with min/max string


if (request.filterConditions?.minPrice) {
        queryParams.push(`filterConditions.minPrice=${encodeURIComponent(request.filterConditions.minPrice.toString())}`)
      }
      if (request.filterConditions?.maxPrice) {
        queryParams.push(`filterConditions.maxPrice=${encodeURIComponent(request.filterConditions.maxPrice.toString())}`)
      }
      if (request.filterConditions?.onSale) {
        queryParams.push(`filterConditions.onSale=${encodeURIComponent(request.filterConditions.onSale.toString())}`)
      }
      if (request.filterConditions?.color) {
        queryParams.push(`filterConditions.color=${encodeURIComponent(request.filterConditions.color.toString())}`)
      }
      if (request.filterConditions?.categoryId) {
        queryParams.push(`filterConditions.categoryId=${encodeURIComponent(request.filterConditions.categoryId.toString())}`)
      }
      if (request.filterConditions?.sizesIds) {
        request.filterConditions.sizesIds.forEach((x) => {
          queryParams.push(`filterConditions.sizesIds=${encodeURIComponent(x.toString())}`)
        })
      }
      if (request.filterConditions?.preorder) {
        queryParams.push(`filterConditions.preorder=${encodeURIComponent(request.filterConditions.preorder.toString())}`)
      }
      if (request.filterConditions?.byTag) {
        queryParams.push(`filterConditions.byTag=${encodeURIComponent(request.filterConditions.byTag.toString())}`)
      }