diff --git a/packages/proto-loader/bin/proto-loader-gen-types.ts b/packages/proto-loader/bin/proto-loader-gen-types.ts index 74e95ac5..a01004ef 100644 --- a/packages/proto-loader/bin/proto-loader-gen-types.ts +++ b/packages/proto-loader/bin/proto-loader-gen-types.ts @@ -81,7 +81,12 @@ function stripLeadingPeriod(name: string) { return name.startsWith('.') ? name.substring(1) : name; } -function getImportPath(to: Protobuf.Type | Protobuf.Enum | Protobuf.Service) { +function getImportPath(to: Protobuf.Type | Protobuf.Enum | Protobuf.Service): string { + /* If the thing we are importing is defined in a message, it is generated in + * the same file as that message. */ + if (to.parent instanceof Protobuf.Type) { + return getImportPath(to.parent); + } return stripLeadingPeriod(to.fullName).replace(/\./g, '/'); } @@ -110,14 +115,28 @@ function getImportLine(dependency: Protobuf.Type | Protobuf.Enum | Protobuf.Serv const filePath = from === undefined ? './' + getImportPath(dependency) : getRelativeImportPath(from, dependency); const typeInterfaceName = getTypeInterfaceName(dependency); let importedTypes: string; - if (dependency instanceof Protobuf.Type) { - importedTypes = `${dependency.name} as ${typeInterfaceName}, ${dependency.name}__Output as ${typeInterfaceName}__Output`; - } else if (dependency instanceof Protobuf.Enum) { - importedTypes = `${dependency.name} as ${typeInterfaceName}`; - } else if (dependency instanceof Protobuf.Service) { - importedTypes = `${dependency.name}Client as ${typeInterfaceName}Client`; + /* If the dependenc is defined within a message, it will be generated in that + * message's file and exported using its typeInterfaceName. */ + if (dependency.parent instanceof Protobuf.Type) { + if (dependency instanceof Protobuf.Type) { + importedTypes = `${typeInterfaceName}, ${typeInterfaceName}__Output`; + } else if (dependency instanceof Protobuf.Enum) { + importedTypes = `${typeInterfaceName}`; + } else if (dependency instanceof Protobuf.Service) { + importedTypes = `${typeInterfaceName}Client`; + } else { + throw new Error('Invalid object passed to getImportLine'); + } } else { - throw new Error('Invalid object passed to getImportLine'); + if (dependency instanceof Protobuf.Type) { + importedTypes = `${dependency.name} as ${typeInterfaceName}, ${dependency.name}__Output as ${typeInterfaceName}__Output`; + } else if (dependency instanceof Protobuf.Enum) { + importedTypes = `${dependency.name} as ${typeInterfaceName}`; + } else if (dependency instanceof Protobuf.Service) { + importedTypes = `${dependency.name}Client as ${typeInterfaceName}Client`; + } else { + throw new Error('Invalid object passed to getImportLine'); + } } return `import { ${importedTypes} } from '${filePath}';` } @@ -585,7 +604,7 @@ function generateRootFile(formatter: TextFormatter, root: Protobuf.Root, options formatter.writeLine('type ConstructorArguments = Constructor extends new (...args: infer Args) => any ? Args: never;'); formatter.writeLine('type SubtypeConstructor = {'); formatter.writeLine(' new(...args: ConstructorArguments): Subtype;'); - formatter.writeLine('}'); + formatter.writeLine('};'); formatter.writeLine(''); formatter.writeLine('export interface ProtoGrpcType {'); diff --git a/packages/proto-loader/golden-generated/echo.ts b/packages/proto-loader/golden-generated/echo.ts index f4b07e5a..e875e507 100644 --- a/packages/proto-loader/golden-generated/echo.ts +++ b/packages/proto-loader/golden-generated/echo.ts @@ -7,7 +7,7 @@ import { EchoClient as _google_showcase_v1beta1_EchoClient } from './google/show type ConstructorArguments = Constructor extends new (...args: infer Args) => any ? Args: never; type SubtypeConstructor = { new(...args: ConstructorArguments): Subtype; -} +}; export interface ProtoGrpcType { google: { diff --git a/packages/proto-loader/package.json b/packages/proto-loader/package.json index 7dbb89d0..a5fda110 100644 --- a/packages/proto-loader/package.json +++ b/packages/proto-loader/package.json @@ -1,6 +1,6 @@ { "name": "@grpc/proto-loader", - "version": "0.6.0-pre11", + "version": "0.6.0-pre12", "author": "Google Inc.", "contributors": [ {