123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import { Compiler } from 'webpack';
- const grpcTools = require('grpc-tools');
- const { execSync } = require('child_process');
- const path = require('path');
- const fs = require('fs');
- const glob = require('glob');
- function ensureOutputDirectory(directory) {
- if (!fs.existsSync(directory)) {
- fs.mkdirSync(directory, { recursive: true });
- }
- }
- function clearOutputDirectory(directory:string) {
- if (fs.existsSync(directory)) {
- const files = fs.readdirSync(directory);
- for (const file of files) {
- const filePath = path.join(directory, file);
- fs.unlinkSync(filePath);
- }
- }
- }
- export = GrpcToolsNodeProtocPlugin;
- // Define the interface for the plugin options
- interface GrpcToolsNodeProtocPluginOptions {
- protoPaths?: string[];
- protoSources?: string[];
- outputDir?: string;
- }
-
- class GrpcToolsNodeProtocPlugin {
- private protoPaths: string[];
- private protoSources: string[];
- private outputDir: string;
-
- constructor(options: GrpcToolsNodeProtocPluginOptions) {
- this.protoPaths = options.protoPaths || []; // Array of proto_path directories
- this.protoSources = options.protoSources || []; // Array of proto source files or directories
- this.outputDir = options.outputDir || './'; // Output directory
- }
- apply(compiler:Compiler) {
- compiler.hooks.environment.tap('GrpcToolsNodeProtocPlugin', () => {
- try {
- console.log(`Cleaning existing files, if any`)
- clearOutputDirectory(this.outputDir);
- console.log(`Writing protocol buffer files into ${this.outputDir}`)
- // Resolve proto_path directories
- const resolvedProtoPaths = this.protoPaths.map(p => path.resolve(__dirname, p));
- var resolvedProtoSources:string[] = [];
- this.protoSources.forEach(function (s) {
- var matches = glob.sync(path.resolve(__dirname, s));
- resolvedProtoSources = resolvedProtoSources.concat(matches);
- });
- const protocArgs = [
- `--js_out=import_style=commonjs,binary:${this.outputDir}`,
- // `--grpc_out=generate_package_definition:${this.outputDir}`,
- ...resolvedProtoPaths.map(p => `--proto_path=${p}`),
- ...resolvedProtoSources
- ];
-
- const command = `npx grpc_tools_node_protoc ${protocArgs.join(' ')}`;
- execSync(command, { stdio: 'inherit' });
-
- } catch (error) {
- console.error('Error running grpc tools', error);
- }
- });
- }
- }
|