Skip to content

Commit cdf51b4

Browse files
committed
Add option to suppress permissive types
Fixes grpc#2839
1 parent 6732205 commit cdf51b4

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

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

+29-16
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type GeneratorOptions = Protobuf.IParseOptions & Protobuf.IConversionOptions & {
4747
outputTemplate: string;
4848
inputBranded: boolean;
4949
outputBranded: boolean;
50+
suppressPermissiveTypes: boolean;
5051
}
5152

5253
class TextFormatter {
@@ -146,7 +147,11 @@ function getImportLine(dependency: Protobuf.Type | Protobuf.Enum | Protobuf.Serv
146147
}
147148
} else {
148149
if (dependency instanceof Protobuf.Type || dependency instanceof Protobuf.Enum) {
149-
importedTypes = `${inputName(dependency.name)} as ${inputName(typeInterfaceName)}, ${outputName(dependency.name)} as ${outputName(typeInterfaceName)}`;
150+
if (options.suppressPermissiveTypes) {
151+
importedTypes = `${outputName(dependency.name)} as ${outputName(typeInterfaceName)}`;
152+
} else {
153+
importedTypes = `${inputName(dependency.name)} as ${inputName(typeInterfaceName)}, ${outputName(dependency.name)} as ${outputName(typeInterfaceName)}`;
154+
}
150155
} else if (dependency instanceof Protobuf.Service) {
151156
importedTypes = `${dependency.name}Client as ${typeInterfaceName}Client, ${dependency.name}Definition as ${typeInterfaceName}Definition`;
152157
} else {
@@ -457,17 +462,21 @@ function generateMessageInterfaces(formatter: TextFormatter, messageType: Protob
457462
for (const childType of childTypes.sort(compareName)) {
458463
const nameOverride = getTypeInterfaceName(childType);
459464
if (childType instanceof Protobuf.Type) {
460-
generatePermissiveMessageInterface(formatter, childType, options, nameOverride);
461-
formatter.writeLine('');
465+
if (!options.suppressPermissiveTypes) {
466+
generatePermissiveMessageInterface(formatter, childType, options, nameOverride);
467+
formatter.writeLine('');
468+
}
462469
generateRestrictedMessageInterface(formatter, childType, options, nameOverride);
463470
} else {
464471
generateEnumInterface(formatter, childType, options, nameOverride);
465472
}
466473
formatter.writeLine('');
467474
}
468475

469-
generatePermissiveMessageInterface(formatter, messageType, options);
470-
formatter.writeLine('');
476+
if (!options.suppressPermissiveTypes) {
477+
generatePermissiveMessageInterface(formatter, messageType, options);
478+
formatter.writeLine('');
479+
}
471480
generateRestrictedMessageInterface(formatter, messageType, options);
472481
}
473482

@@ -491,20 +500,22 @@ function generateEnumInterface(formatter: TextFormatter, enumType: Protobuf.Enum
491500
formatter.writeLine('} as const;');
492501

493502
// Permissive Type
494-
formatter.writeLine('');
495-
if (options.includeComments) {
496-
formatComment(formatter, enumType.comment, enumType.options);
497-
}
498-
formatter.writeLine(`export type ${inputName(name)} =`)
499-
formatter.indent();
500-
for (const key of Object.keys(enumType.values)) {
503+
if (!options.suppressPermissiveTypes) {
504+
formatter.writeLine('');
501505
if (options.includeComments) {
502-
formatComment(formatter, enumType.comments[key]);
506+
formatComment(formatter, enumType.comment, enumType.options);
503507
}
504-
formatter.writeLine(`| '${key}'`);
505-
formatter.writeLine(`| ${enumType.values[key]}`);
508+
formatter.writeLine(`export type ${inputName(name)} =`)
509+
formatter.indent();
510+
for (const key of Object.keys(enumType.values)) {
511+
if (options.includeComments) {
512+
formatComment(formatter, enumType.comments[key]);
513+
}
514+
formatter.writeLine(`| '${key}'`);
515+
formatter.writeLine(`| ${enumType.values[key]}`);
516+
}
517+
formatter.unindent();
506518
}
507-
formatter.unindent();
508519

509520
// Restrictive Type
510521
formatter.writeLine('');
@@ -877,6 +888,7 @@ async function runScript() {
877888
.option('outputTemplate', { string: true, default: `${templateStr}__Output` })
878889
.option('inputBranded', boolDefaultFalseOption)
879890
.option('outputBranded', boolDefaultFalseOption)
891+
.option('suppressPermissiveTypes', boolDefaultFalseOption)
880892
.coerce('longs', value => {
881893
switch (value) {
882894
case 'String': return String;
@@ -916,6 +928,7 @@ async function runScript() {
916928
outputTemplate: 'Template for mapping output or "restricted" type names',
917929
inputBranded: 'Output property for branded type for "permissive" types with fullName of the Message as its value',
918930
outputBranded: 'Output property for branded type for "restricted" types with fullName of the Message as its value',
931+
suppressPermissiveTypes: `Don't output "permissive" types`,
919932
}).demandOption(['outDir'])
920933
.demand(1)
921934
.usage('$0 [options] filenames...')

0 commit comments

Comments
 (0)