shared.mts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import 'zx/globals';
  2. import { JsonMap, parse as parseToml } from '@iarna/toml';
  3. process.env.FORCE_COLOR = '3';
  4. process.env.CARGO_TERM_COLOR = 'always';
  5. export const workingDirectory = (await $`pwd`.quiet()).toString().trim();
  6. export function getCargo(folder?: string): JsonMap {
  7. return parseToml(
  8. fs.readFileSync(
  9. path.resolve(
  10. workingDirectory,
  11. path.join(folder ? folder : '.', 'Cargo.toml')
  12. ),
  13. 'utf8'
  14. )
  15. );
  16. }
  17. export function getCargoMetadata(folder?: string) {
  18. const cargo = getCargo(folder);
  19. return folder ? cargo?.package?.['metadata'] : cargo?.workspace?.['metadata'];
  20. }
  21. export function getSolanaVersion(): string {
  22. return getCargoMetadata()?.cli?.solana;
  23. }
  24. export function getToolchain(operation): string {
  25. return getCargoMetadata()?.toolchains?.[operation];
  26. }
  27. export function getToolchainArgument(operation): string {
  28. const channel = getToolchain(operation);
  29. return channel ? `+${channel}` : '';
  30. }
  31. export function cliArguments(): string[] {
  32. return process.argv.slice(2);
  33. }
  34. export function popArgument(args: string[], arg: string) {
  35. const index = args.indexOf(arg);
  36. if (index >= 0) {
  37. args.splice(index, 1);
  38. }
  39. return index >= 0;
  40. }
  41. export function partitionArguments(
  42. args: string[],
  43. delimiter: string,
  44. defaultArgs?: string[]
  45. ): [string[], string[]] {
  46. const index = args.indexOf(delimiter);
  47. const [providedCargoArgs, providedCommandArgs] =
  48. index >= 0 ? [args.slice(0, index), args.slice(index + 1)] : [args, []];
  49. if (defaultArgs) {
  50. const [defaultCargoArgs, defaultCommandArgs] = partitionArguments(
  51. defaultArgs,
  52. delimiter
  53. );
  54. return [
  55. [...defaultCargoArgs, ...providedCargoArgs],
  56. [...defaultCommandArgs, ...providedCommandArgs],
  57. ];
  58. }
  59. return [providedCargoArgs, providedCommandArgs];
  60. }
  61. export async function getInstalledSolanaVersion(): Promise<string | undefined> {
  62. try {
  63. const { stdout } = await $`solana --version`.quiet();
  64. return stdout.match(/(\d+\.\d+\.\d+)/)?.[1];
  65. } catch (error) {
  66. return '';
  67. }
  68. }
  69. export function parseCliArguments(): {
  70. command: string;
  71. libraryPath: string;
  72. args: string[];
  73. } {
  74. const command = process.argv[2];
  75. const args = process.argv.slice(3);
  76. // Extract the relative crate directory from the command-line arguments. This
  77. // is the only required argument.
  78. const relativePath = args.shift();
  79. if (!relativePath) {
  80. throw new Error('Missing relative manifest path');
  81. }
  82. return {
  83. command,
  84. libraryPath: path.join(workingDirectory, relativePath),
  85. args,
  86. };
  87. }