inputArgs.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { parseArgs } from 'node:util';
  2. import { type Inputs } from './inputCore';
  3. import { kebabCase } from './strings';
  4. type ArgInputs = {
  5. address?: string;
  6. anchorProgram: boolean;
  7. clients: Array<'js' | 'rust'>;
  8. force: boolean;
  9. jsClientPackageName?: string;
  10. noClients: boolean;
  11. organizationName?: string;
  12. programCrateName?: string;
  13. programName?: string;
  14. rustClientCrateName?: string;
  15. rustVersion?: string;
  16. shankProgram: boolean;
  17. solanaVersion?: string;
  18. useDefaults: boolean;
  19. targetDirectoryName?: string;
  20. };
  21. export function getInputsFromArgs(): Partial<Inputs> {
  22. const args = process.argv.slice(2);
  23. const { values: options, positionals } = parseArgs({
  24. args,
  25. options: {
  26. address: { type: 'string' },
  27. anchor: { type: 'boolean' },
  28. client: { type: 'string', multiple: true },
  29. default: { type: 'boolean', short: 'd' },
  30. force: { type: 'boolean' },
  31. 'js-client-package-name': { type: 'string' },
  32. 'no-clients': { type: 'boolean' },
  33. org: { type: 'string' },
  34. 'program-crate-name': { type: 'string' },
  35. rust: { type: 'string' },
  36. 'rust-client-crate-name': { type: 'string' },
  37. shank: { type: 'boolean' },
  38. solana: { type: 'string' },
  39. },
  40. strict: false,
  41. });
  42. return parseArgInputs({
  43. address: options.address,
  44. anchorProgram: options.anchor ?? false,
  45. clients: options.client,
  46. force: options.force ?? false,
  47. jsClientPackageName: options['js-client-package-name'],
  48. noClients: options['no-clients'] ?? false,
  49. organizationName: options.org,
  50. programCrateName: options['program-crate-name'],
  51. programName: positionals[1],
  52. rustClientCrateName: options['rust-client-crate-name'],
  53. rustVersion: options.rust,
  54. shankProgram: options.shank ?? false,
  55. solanaVersion: options.solana,
  56. useDefaults: options.default ?? false,
  57. targetDirectoryName: positionals[0],
  58. } as ArgInputs);
  59. }
  60. function parseArgInputs(argInputs: ArgInputs): Partial<Inputs> {
  61. const inputs = {} as Partial<Inputs>;
  62. if (argInputs.address) inputs.programAddress = argInputs.address;
  63. if (argInputs.organizationName)
  64. inputs.organizationName = kebabCase(argInputs.organizationName);
  65. if (argInputs.programName)
  66. inputs.programName = kebabCase(argInputs.programName);
  67. if (argInputs.rustVersion) inputs.rustVersion = argInputs.rustVersion;
  68. if (argInputs.solanaVersion) inputs.solanaVersion = argInputs.solanaVersion;
  69. if (argInputs.targetDirectoryName)
  70. inputs.targetDirectoryName = argInputs.targetDirectoryName;
  71. if (argInputs.jsClientPackageName)
  72. inputs.jsClientPackageName = argInputs.jsClientPackageName;
  73. if (argInputs.programCrateName)
  74. inputs.programCrateName = argInputs.programCrateName;
  75. if (argInputs.rustClientCrateName)
  76. inputs.rustClientCrateName = argInputs.rustClientCrateName;
  77. if (argInputs.force) inputs.shouldOverride = true;
  78. if (argInputs.useDefaults) inputs.useDefaults = true;
  79. if (argInputs.anchorProgram) {
  80. inputs.programFramework = 'anchor';
  81. } else if (argInputs.shankProgram) {
  82. inputs.programFramework = 'shank';
  83. }
  84. if (argInputs.noClients) {
  85. inputs.jsClient = false;
  86. inputs.rustClient = false;
  87. } else if (argInputs.clients) {
  88. inputs.jsClient = argInputs.clients.includes('js');
  89. inputs.rustClient = argInputs.clients.includes('rust');
  90. }
  91. return inputs;
  92. }