utils.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. export function getExternalAccountAddresses() {
  24. const addresses = getProgramFolders().flatMap(
  25. (folder) =>
  26. getCargo(folder).package?.metadata?.solana?.["account-dependencies"] ?? []
  27. );
  28. return Array.from(new Set(addresses));
  29. }
  30. let didWarnAboutMissingPrograms = false;
  31. export function getProgramFolders() {
  32. let programs;
  33. if (process.env.PROGRAMS) {
  34. try {
  35. programs = JSON.parse(process.env.PROGRAMS);
  36. } catch (error) {
  37. programs = process.env.PROGRAMS.split(/\s+/);
  38. }
  39. } else {
  40. programs = getAllProgramFolders();
  41. }
  42. const filteredPrograms = programs.filter((program) =>
  43. fs.existsSync(path.join(workingDirectory, program))
  44. );
  45. if (
  46. filteredPrograms.length !== programs.length &&
  47. !didWarnAboutMissingPrograms
  48. ) {
  49. didWarnAboutMissingPrograms = true;
  50. programs
  51. .filter((program) => !filteredPrograms.includes(program))
  52. .forEach((program) => {
  53. echo(chalk.yellow(`Program not found: ${workingDirectory}/${program}`));
  54. });
  55. }
  56. return filteredPrograms;
  57. }
  58. export function getAllProgramFolders() {
  59. return getCargo().workspace.members.filter((member) =>
  60. (getCargo(member).lib?.['crate-type'] ?? []).includes('cdylib')
  61. );
  62. }
  63. export function getCargo(folder) {
  64. return parseToml(
  65. fs.readFileSync(
  66. path.join(workingDirectory, folder ? folder : '.', 'Cargo.toml'),
  67. 'utf8'
  68. )
  69. );
  70. }