index.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/env node
  2. import * as fs from "node:fs";
  3. import * as path from "node:path";
  4. import { logBanner, logDone, logErrorAndExit, logStep } from "./utils/getLogs";
  5. import { RenderContext, getRenderContext } from "./utils/getRenderContext";
  6. import { renderTemplate } from "./utils/renderTemplates";
  7. import { generateKeypair } from "./utils/solanaCli";
  8. (async function init() {
  9. logBanner();
  10. // Get the args inputs, prompt inputs and computed values.
  11. const ctx = await getRenderContext();
  12. createOrEmptyTargetDirectory(ctx);
  13. // Generate a keypair if needed.
  14. if (!ctx.hasCustomProgramAddress) {
  15. await logStep(ctx.language.infos.generateKeypair, () =>
  16. generateKeypair(ctx)
  17. );
  18. }
  19. // Render the templates.
  20. await logStep(
  21. ctx.language.infos.scaffold.replace(
  22. "$targetDirectory",
  23. ctx.targetDirectoryName
  24. ),
  25. () => renderTemplates(ctx)
  26. );
  27. // Done.
  28. logDone(ctx);
  29. })().catch((e) => console.error(e));
  30. function renderTemplates(ctx: RenderContext) {
  31. const render = (templateName: string) => {
  32. const directory = path.resolve(ctx.templateDirectory, templateName);
  33. renderTemplate(ctx, directory, ctx.targetDirectory);
  34. };
  35. render("base");
  36. if (ctx.programFramework === "anchor") {
  37. render("programs/counter-anchor");
  38. } else {
  39. render("programs/counter-shank");
  40. }
  41. if (ctx.clients.length > 0) {
  42. render("clients/base");
  43. }
  44. ctx.clients.forEach((client) => {
  45. render(`clients/${client}`);
  46. });
  47. }
  48. function createOrEmptyTargetDirectory(ctx: RenderContext) {
  49. if (!fs.existsSync(ctx.targetDirectory)) {
  50. fs.mkdirSync(ctx.targetDirectory, { recursive: true });
  51. } else if (ctx.shouldOverride) {
  52. emptyDirectory(ctx.targetDirectory);
  53. } else {
  54. logErrorAndExit(
  55. ctx.language.errors.cannotOverrideDirectory.replace(
  56. "$targetDirectory",
  57. ctx.targetDirectoryName
  58. )
  59. );
  60. }
  61. }
  62. function emptyDirectory(directory: string) {
  63. for (const filename of fs.readdirSync(directory)) {
  64. if (filename === ".git") continue;
  65. const fullpath = path.resolve(directory, filename);
  66. fs.rmSync(fullpath, { recursive: true });
  67. }
  68. }