index.ts 1.9 KB

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