solanaCli.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { Language } from './getLanguage';
  2. import {
  3. hasCommand,
  4. readStdout,
  5. spawnCommand,
  6. waitForCommand,
  7. } from './runCommands';
  8. export async function detectSolanaVersion(language: Language): Promise<string> {
  9. const hasSolanaCli = await hasCommand('solana');
  10. if (!hasSolanaCli) {
  11. throw new Error(
  12. language.errors.solanaCliNotFound.replace('$command', 'solana')
  13. );
  14. }
  15. const child = spawnCommand('solana', ['--version']);
  16. const [stdout] = await Promise.all([
  17. readStdout(child),
  18. waitForCommand(child),
  19. ]);
  20. const version = stdout.join('').match(/(\d+\.\d+\.\d+)/)?.[1];
  21. return version!;
  22. }
  23. export function toMinorSolanaVersion(
  24. language: Language,
  25. version: string
  26. ): string {
  27. const validVersion = version.match(/^(\d+\.\d+)/);
  28. if (!validVersion) {
  29. throw new Error(
  30. language.errors.invalidSolanaVersion.replace('$version', version)
  31. );
  32. }
  33. return validVersion[0];
  34. }
  35. export async function generateKeypair(
  36. language: Language,
  37. outfile: string
  38. ): Promise<string> {
  39. const hasSolanaKeygen = await hasCommand('solana-keygen');
  40. if (!hasSolanaKeygen) {
  41. throw new Error(
  42. language.errors.solanaCliNotFound.replace('$command', 'solana-keygen')
  43. );
  44. }
  45. // Run the solana-keygen command to generate a new keypair.
  46. const child = spawnCommand('solana-keygen', [
  47. 'new',
  48. '--no-bip39-passphrase',
  49. '--outfile',
  50. outfile,
  51. ]);
  52. // Wait for the command to finish and read the stdout.
  53. const [stdout] = await Promise.all([
  54. readStdout(child),
  55. waitForCommand(child),
  56. ]);
  57. // Update the render context with the generated address.
  58. const address = stdout.join('').match(/pubkey: (\w+)/)?.[1];
  59. if (!address) {
  60. throw new Error(language.errors.solanaKeygenFailed);
  61. }
  62. return address;
  63. }