diff --git a/generator/template.go b/generator/template.go index 6c8070e..7d907d2 100644 --- a/generator/template.go +++ b/generator/template.go @@ -355,15 +355,6 @@ function isPrimitive(value: unknown): boolean { return ["string", "number", "boolean"].some(t => typeof value === t); } -/** - * Checks if given primitive is zero-value - * @param {Primitive} value - * @return {boolean} - */ -function isZeroValuePrimitive(value: Primitive): boolean { - return value === false || value === 0 || value === ""; -} - /** * Flattens a deeply nested request payload and returns an object * with only primitive values and non-empty array of primitive values @@ -386,14 +377,11 @@ function flattenRequestPayload( value.every(v => isPrimitive(v)) && value.length > 0; - const isNonZeroValuePrimitive = - isPrimitive(value) && !isZeroValuePrimitive(value as Primitive); - let objectToMerge = {}; if (isPlainObject(value)) { objectToMerge = flattenRequestPayload(value as RequestPayload, newPath); - } else if (isNonZeroValuePrimitive || isNonEmptyPrimitiveArray) { + } else if (isPrimitive(value) || isNonEmptyPrimitiveArray) { objectToMerge = { [newPath]: value }; } @@ -546,7 +534,9 @@ func tsType(r *registry.Registry, fieldType data.Type) string { } typeStr := "" - if strings.Index(info.Type, ".") != 0 { + if mapWellKnownType(info.Type) != "" { + typeStr = mapWellKnownType(info.Type) + } else if strings.Index(info.Type, ".") != 0 { typeStr = mapScalaType(info.Type) } else if !info.IsExternal { typeStr = typeInfo.PackageIdentifier @@ -560,6 +550,24 @@ func tsType(r *registry.Registry, fieldType data.Type) string { return typeStr } +func mapWellKnownType(protoType string) string { + switch protoType { + case ".google.protobuf.BoolValue": + return "boolean | undefined" + case ".google.protobuf.StringValue": + return "string | undefined" + case ".google.protobuf.DoubleValue", + ".google.protobuf.FloatValue", + ".google.protobuf.Int32Value", + ".google.protobuf.Int64Value", + ".google.protobuf.UInt32Value", + ".google.protobuf.UInt64Value": + return "number | undefined" + } + + return "" +} + func mapScalaType(protoType string) string { switch protoType { case "uint64", "sint64", "int64", "fixed64", "sfixed64", "string": diff --git a/registry/registry.go b/registry/registry.go index fdb05a9..af8ce2b 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -332,6 +332,11 @@ func (r *Registry) collectExternalDependenciesFromData(filesData map[string]*dat if !ok { return errors.Errorf("cannot find type info for %s, $v", typeName) } + if typeInfo.File == "google/protobuf/wrappers.proto" { + // Skip well-known wrapper types without importing them as an external dependency, + // since their types are converted to native TypeScript types by mapWellKnownType. + continue + } identifier := typeInfo.Package + "|" + typeInfo.File if _, ok := dependencies[identifier]; !ok {