inputCore.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import * as fs from 'node:fs';
  2. import { Language } from './localization';
  3. import { kebabCase } from './strings';
  4. export const allClients = ['js', 'rust'] as const;
  5. export type Client = (typeof allClients)[number];
  6. export type Inputs = {
  7. jsClient: boolean;
  8. jsClientPackageName: string;
  9. organizationName: string;
  10. programAddress?: string;
  11. programCrateName: string;
  12. programFramework: 'shank' | 'anchor';
  13. programName: string;
  14. rustClient: boolean;
  15. rustClientCrateName: string;
  16. rustVersion?: string;
  17. shouldOverride: boolean;
  18. solanaVersion?: string;
  19. targetDirectoryName: string;
  20. useDefaults: boolean;
  21. };
  22. // export async function getInputs(language: Language): Promise<Inputs> {
  23. // const argInputs = getInputsFromArgs();
  24. // const defaultInputs = getDefaultInputs(argInputs);
  25. // if (argInputs.useDefaults) {
  26. // return defaultInputs;
  27. // }
  28. // return getInputsFromPrompts(language, argInputs);
  29. // }
  30. export function getDefaultInputs(partialInputs: Partial<Inputs>): Inputs {
  31. const organizationName = kebabCase(
  32. partialInputs.organizationName ?? 'solana-program'
  33. );
  34. const parsedTargetDirectoryName = partialInputs.targetDirectoryName
  35. ? partialInputs.targetDirectoryName.split('/').pop()
  36. : '';
  37. const programName = kebabCase(
  38. partialInputs.programName ?? (parsedTargetDirectoryName || 'my-program')
  39. );
  40. const programCrateName =
  41. partialInputs.programCrateName ?? `${organizationName}-${programName}`;
  42. return {
  43. jsClient: true,
  44. jsClientPackageName: `@${organizationName}/${programName}`,
  45. organizationName,
  46. programCrateName,
  47. programFramework: 'shank',
  48. programName,
  49. rustClient: true,
  50. rustClientCrateName: `${programCrateName}-client`,
  51. shouldOverride: false,
  52. targetDirectoryName: programName,
  53. useDefaults: false,
  54. ...partialInputs,
  55. };
  56. }
  57. function canSkipEmptying(dir: fs.PathLike) {
  58. if (!fs.existsSync(dir)) {
  59. return true;
  60. }
  61. const files = fs.readdirSync(dir);
  62. if (files.length === 0) {
  63. return true;
  64. }
  65. if (files.length === 1 && files[0] === '.git') {
  66. return true;
  67. }
  68. return false;
  69. }