1
0

utils.mjs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import 'zx/globals';
  2. import { 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 getAllProgramIdls() {
  7. return getAllProgramFolders().map((folder) =>
  8. path.join(workingDirectory, folder, 'idl.json')
  9. );
  10. }
  11. export function getExternalProgramOutputDir() {
  12. const config =
  13. getCargo().workspace?.metadata?.solana?.['external-programs-output'];
  14. return path.join(workingDirectory, config ?? 'target/deploy');
  15. }
  16. export function getExternalProgramAddresses() {
  17. const addresses = getProgramFolders().flatMap(
  18. (folder) =>
  19. getCargo(folder).package?.metadata?.solana?.['program-dependencies'] ?? []
  20. );
  21. return Array.from(new Set(addresses));
  22. }
  23. let didWarnAboutMissingPrograms = false;
  24. export function getProgramFolders() {
  25. const programs = process.env.PROGRAMS
  26. ? process.env.PROGRAMS.split(/\s+/)
  27. : getAllProgramFolders();
  28. const filteredPrograms = programs.filter((program) =>
  29. fs.existsSync(path.join(workingDirectory, program))
  30. );
  31. if (
  32. filteredPrograms.length !== programs.length &&
  33. !didWarnAboutMissingPrograms
  34. ) {
  35. didWarnAboutMissingPrograms = true;
  36. programs
  37. .filter((program) => !filteredPrograms.includes(program))
  38. .forEach((program) => {
  39. echo(chalk.yellow(`Program not found: ${workingDirectory}/${program}`));
  40. });
  41. }
  42. return filteredPrograms;
  43. }
  44. export function getAllProgramFolders() {
  45. return getCargo().workspace.members.filter((member) =>
  46. (getCargo(member).lib?.['crate-type'] ?? []).includes('cdylib')
  47. );
  48. }
  49. export function getCargo(folder) {
  50. return parseToml(
  51. fs.readFileSync(
  52. path.join(workingDirectory, folder ? folder : '.', 'Cargo.toml'),
  53. 'utf8'
  54. )
  55. );
  56. }