protoc-gen-grpc
Version:
Protocol Buffers Compiler (protoc) plugin for generating grpc interfaces in TypeScript..
53 lines (52 loc) • 2.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/**
* This is the ProtoC compiler plugin.
*
* It only accepts stdin/stdout output according to the protocol
* specified in [plugin.proto](https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/plugin.proto).
*
* source code copy from [ts-protoc-gen](https://github.com/improbable-eng/ts-protoc-gen/blob/master/src/index.ts)
*/
const plugin_pb_1 = require("google-protobuf/google/protobuf/compiler/plugin_pb");
const Utility_1 = require("./lib/Utility");
const EntryMap_1 = require("./lib/EntryMap");
const FileDescriptorMSG_1 = require("./lib/descriptor/FileDescriptorMSG");
const FileDescriptorGRPC_1 = require("./lib/descriptor/FileDescriptorGRPC");
Utility_1.Utility.withAllStdIn((input) => {
try {
const binary = new Uint8Array(input.length);
binary.set(input);
const request = plugin_pb_1.CodeGeneratorRequest.deserializeBinary(binary);
const response = new plugin_pb_1.CodeGeneratorResponse();
const isGrpcJs = ['generate_package_definition', 'grpc_js'].indexOf(request.getParameter()) !== -1;
// Parse request proto file
const fileNameToDescriptor = {};
const entryMap = new EntryMap_1.EntryMap();
request.getProtoFileList().forEach((fileDescriptor) => {
fileNameToDescriptor[fileDescriptor.getName()] = fileDescriptor;
entryMap.parseFileDescriptor(fileDescriptor);
});
// Generate *_pb.d.ts && *_grpc_pb.d.ts
request.getFileToGenerateList().forEach(fileName => {
const outputFileName = Utility_1.Utility.filePathFromProtoWithoutExtension(fileName);
const outputFile = new plugin_pb_1.CodeGeneratorResponse.File();
outputFile.setName(outputFileName + '.d.ts');
outputFile.setContent(FileDescriptorMSG_1.FileDescriptorMSG.print(fileNameToDescriptor[fileName], entryMap));
response.addFile(outputFile);
const fileDescriptorOutput = FileDescriptorGRPC_1.FileDescriptorGRPC.print(fileNameToDescriptor[fileName], entryMap, isGrpcJs);
if (fileDescriptorOutput !== '') {
const thisServiceFileName = Utility_1.Utility.svcFilePathFromProtoWithoutExtension(fileName);
const thisServiceFile = new plugin_pb_1.CodeGeneratorResponse.File();
thisServiceFile.setName(thisServiceFileName + '.d.ts');
thisServiceFile.setContent(fileDescriptorOutput);
response.addFile(thisServiceFile);
}
});
process.stdout.write(Buffer.from(response.serializeBinary()));
}
catch (err) {
console.error('error: ' + err.stack + '\n');
process.exit(1);
}
});