GrpcToolsNodeProtocPlugin.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. "use strict";
  2. const os = require('os');
  3. const path = require('path');
  4. const fs = require('fs');
  5. const glob = require('glob');
  6. const execSync = require('child_process').execSync;
  7. function clearOutputDirectory(directory) {
  8. if (fs.existsSync(directory)) {
  9. console.log(`Clearing output directory: ${directory}`);
  10. const files = fs.readdirSync(directory);
  11. for (const file of files) {
  12. const filePath = path.join(directory, file);
  13. console.log(`Deleting file: ${filePath}`);
  14. fs.unlinkSync(filePath);
  15. }
  16. } else {
  17. console.log(`Output directory does not exist, no need to clear: ${directory}`);
  18. }
  19. }
  20. class GrpcToolsNodeProtocPlugin {
  21. constructor(options) {
  22. this.protoPaths = options.protoPaths || [];
  23. this.protoSources = options.protoSources || [];
  24. this.outputDir = options.outputDir || './';
  25. console.log('GrpcToolsNodeProtocPlugin initialized with options:', options);
  26. }
  27. apply(compiler) {
  28. compiler.hooks.environment.tap('GrpcToolsNodeProtocPlugin', () => {
  29. try {
  30. console.log("Cleaning existing files, if any");
  31. clearOutputDirectory(this.outputDir);
  32. console.log(`Preparing to compile protocol buffers into ${this.outputDir}`);
  33. const protocPath = this.resolveProtocExecutable();
  34. const protocGenJsPath = this.resolveProtocGenJsExecutable();
  35. const resolvedProtoPaths = this.protoPaths.map(p => path.resolve(__dirname, p));
  36. console.log('Resolved proto paths:', resolvedProtoPaths);
  37. const resolvedProtoSources = this.protoSources.flatMap(s => glob.sync(path.resolve(__dirname, s)));
  38. console.log('Resolved proto sources:', resolvedProtoSources);
  39. const protocArgs = [
  40. `--js_out=import_style=commonjs,binary:${this.outputDir}`,
  41. `--plugin=protoc-gen-js=${protocGenJsPath}`,
  42. ...resolvedProtoPaths.map(p => `--proto_path=${p}`),
  43. ...resolvedProtoSources
  44. ];
  45. const command = `${protocPath} ${protocArgs.join(' ')}`;
  46. console.log('Executing command:', command);
  47. execSync(command, { stdio: 'inherit' });
  48. console.log('Protocol buffer compilation completed successfully');
  49. } catch (error) {
  50. console.error('Error running grpc tools', error);
  51. }
  52. });
  53. }
  54. resolveProtocExecutable() {
  55. const isWindows = os.platform() === 'win32';
  56. const protocDir = isWindows ? 'tools/protobuf/win64/bin' : 'tools/protobuf/linux-x86_64/bin';
  57. const protocFileName = isWindows ? 'protoc.exe' : 'protoc';
  58. return path.resolve(__dirname, '../../../..', protocDir, protocFileName);
  59. }
  60. resolveProtocGenJsExecutable() {
  61. const isWindows = os.platform() === 'win32';
  62. const protocGenJsDir = isWindows ? 'tools/protobuf-javascript/win64/bin' : 'tools/protobuf-javascript/linux-x86_64/bin';
  63. const protocGenJsFileName = isWindows ? 'protoc-gen-js.exe' : 'protoc-gen-js';
  64. return path.resolve(__dirname, '../../../..', protocGenJsDir, protocGenJsFileName);
  65. }
  66. }
  67. module.exports = GrpcToolsNodeProtocPlugin;