Skip to content

Commit ddb8de2

Browse files
authored
Merge pull request #2573 from murgatroid99/proto-loader_no_grpc_library
proto-loader: Allow the `grpcLib` option to be omitted in the type generator
2 parents f68ceaa + ab02dc0 commit ddb8de2

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

packages/proto-loader/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ Options:
8787
-I, --includeDirs Directories to search for included files [array]
8888
-O, --outDir Directory in which to output files [string] [required]
8989
--grpcLib The gRPC implementation library that these types will
90-
be used with [string] [required]
90+
be used with. If not provided, some types will not be
91+
generated [string]
9192
--inputTemplate Template for mapping input or "permissive" type names
9293
[string] [default: "%s"]
9394
--outputTemplate Template for mapping output or "restricted" type names

packages/proto-loader/bin/proto-loader-gen-types.ts

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const useNameFmter = ({outputTemplate, inputTemplate}: GeneratorOptions) => {
3939

4040
type GeneratorOptions = Protobuf.IParseOptions & Protobuf.IConversionOptions & {
4141
includeDirs?: string[];
42-
grpcLib: string;
42+
grpcLib?: string;
4343
outDir: string;
4444
verbose?: boolean;
4545
includeComments?: boolean;
@@ -522,12 +522,12 @@ function generateEnumInterface(formatter: TextFormatter, enumType: Protobuf.Enum
522522
* We always generate two service client methods per service method: one camel
523523
* cased, and one with the original casing. So we will still generate one
524524
* service client method for any conflicting name.
525-
*
525+
*
526526
* Technically, at runtime conflicting name in the service client method
527527
* actually shadows the original method, but TypeScript does not have a good
528528
* way to represent that. So this change is not 100% accurate, but it gets the
529529
* generated code to compile.
530-
*
530+
*
531531
* This is just a list of the methods in the Client class definitions in
532532
533533
*/
@@ -640,7 +640,11 @@ function generateServiceHandlerInterface(formatter: TextFormatter, serviceType:
640640

641641
function generateServiceDefinitionInterface(formatter: TextFormatter, serviceType: Protobuf.Service, options: GeneratorOptions) {
642642
const {inputName, outputName} = useNameFmter(options);
643-
formatter.writeLine(`export interface ${serviceType.name}Definition extends grpc.ServiceDefinition {`);
643+
if (options.grpcLib) {
644+
formatter.writeLine(`export interface ${serviceType.name}Definition extends grpc.ServiceDefinition {`);
645+
} else {
646+
formatter.writeLine(`export interface ${serviceType.name}Definition {`);
647+
}
644648
formatter.indent();
645649
for (const methodName of Object.keys(serviceType.methods).sort()) {
646650
const method = serviceType.methods[methodName];
@@ -655,8 +659,10 @@ function generateServiceDefinitionInterface(formatter: TextFormatter, serviceTyp
655659
function generateServiceInterfaces(formatter: TextFormatter, serviceType: Protobuf.Service, options: GeneratorOptions) {
656660
formatter.writeLine(`// Original file: ${(serviceType.filename ?? 'null')?.replace(/\\/g, '/')}`);
657661
formatter.writeLine('');
658-
const grpcImportPath = options.grpcLib.startsWith('.') ? getPathToRoot(serviceType) + options.grpcLib : options.grpcLib;
659-
formatter.writeLine(`import type * as grpc from '${grpcImportPath}'`);
662+
if (options.grpcLib) {
663+
const grpcImportPath = options.grpcLib.startsWith('.') ? getPathToRoot(serviceType) + options.grpcLib : options.grpcLib;
664+
formatter.writeLine(`import type * as grpc from '${grpcImportPath}'`);
665+
}
660666
formatter.writeLine(`import type { MethodDefinition } from '@grpc/proto-loader'`)
661667
const dependencies: Set<Protobuf.Type> = new Set<Protobuf.Type>();
662668
for (const method of serviceType.methodsArray) {
@@ -668,11 +674,13 @@ function generateServiceInterfaces(formatter: TextFormatter, serviceType: Protob
668674
}
669675
formatter.writeLine('');
670676

671-
generateServiceClientInterface(formatter, serviceType, options);
672-
formatter.writeLine('');
677+
if (options.grpcLib) {
678+
generateServiceClientInterface(formatter, serviceType, options);
679+
formatter.writeLine('');
673680

674-
generateServiceHandlerInterface(formatter, serviceType, options);
675-
formatter.writeLine('');
681+
generateServiceHandlerInterface(formatter, serviceType, options);
682+
formatter.writeLine('');
683+
}
676684

677685
generateServiceDefinitionInterface(formatter, serviceType, options);
678686
}
@@ -742,6 +750,9 @@ function generateLoadedDefinitionTypes(formatter: TextFormatter, namespace: Prot
742750
}
743751

744752
function generateRootFile(formatter: TextFormatter, root: Protobuf.Root, options: GeneratorOptions) {
753+
if (!options.grpcLib) {
754+
return;
755+
}
745756
formatter.writeLine(`import type * as grpc from '${options.grpcLib}';`);
746757
generateDefinitionImports(formatter, root, options);
747758
formatter.writeLine('');
@@ -802,11 +813,13 @@ function writeFilesForRoot(root: Protobuf.Root, masterFileName: string, options:
802813
const filePromises: Promise<void>[] = [];
803814

804815
const masterFileFormatter = new TextFormatter();
805-
generateRootFile(masterFileFormatter, root, options);
806-
if (options.verbose) {
807-
console.log(`Writing ${options.outDir}/${masterFileName}`);
816+
if (options.grpcLib) {
817+
generateRootFile(masterFileFormatter, root, options);
818+
if (options.verbose) {
819+
console.log(`Writing ${options.outDir}/${masterFileName}`);
820+
}
821+
filePromises.push(writeFile(`${options.outDir}/${masterFileName}`, masterFileFormatter.getFullText()));
808822
}
809-
filePromises.push(writeFile(`${options.outDir}/${masterFileName}`, masterFileFormatter.getFullText()));
810823

811824
filePromises.push(...generateFilesForNamespace(root, options));
812825

@@ -898,12 +911,12 @@ async function runScript() {
898911
includeComments: 'Generate doc comments from comments in the original files',
899912
includeDirs: 'Directories to search for included files',
900913
outDir: 'Directory in which to output files',
901-
grpcLib: 'The gRPC implementation library that these types will be used with',
914+
grpcLib: 'The gRPC implementation library that these types will be used with. If not provided, some types will not be generated',
902915
inputTemplate: 'Template for mapping input or "permissive" type names',
903916
outputTemplate: 'Template for mapping output or "restricted" type names',
904917
inputBranded: 'Output property for branded type for "permissive" types with fullName of the Message as its value',
905918
outputBranded: 'Output property for branded type for "restricted" types with fullName of the Message as its value',
906-
}).demandOption(['outDir', 'grpcLib'])
919+
}).demandOption(['outDir'])
907920
.demand(1)
908921
.usage('$0 [options] filenames...')
909922
.epilogue('WARNING: This tool is in alpha. The CLI and generated code are subject to change')

packages/proto-loader/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grpc/proto-loader",
3-
"version": "0.7.9",
3+
"version": "0.7.10",
44
"author": "Google Inc.",
55
"contributors": [
66
{

0 commit comments

Comments
 (0)