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. }