snapshot.mjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/env zx
  2. import "zx/globals";
  3. $.verbose = false;
  4. const CLIENTS = ["js", "rust"];
  5. const PROJECTS = {
  6. "counter-shank": ["--shank"],
  7. "counter-anchor": ["--shank"],
  8. };
  9. // Parse CLI arguments.
  10. const selectedProjects = argv._;
  11. const projects =
  12. selectedProjects.length > 0
  13. ? Object.keys(PROJECTS).filter((project) =>
  14. selectedProjects.includes(project)
  15. )
  16. : Object.keys(PROJECTS);
  17. const runTests = !!argv.test;
  18. // Resolve paths.
  19. const bin = path.resolve(__dirname, "../outfile.cjs");
  20. const submodulesDirectory = path.resolve(__dirname, "../submodules/");
  21. if (!fs.existsSync(submodulesDirectory)) {
  22. fs.mkdirSync(submodulesDirectory);
  23. }
  24. for (const projectName of projects) {
  25. // Go the submodules directory before creating each project.
  26. cd(submodulesDirectory);
  27. // Remove the project if it already exists.
  28. const projectExists = fs.existsSync(projectName);
  29. if (projectExists) {
  30. fs.rmSync(projectName, { recursive: true, force: true });
  31. }
  32. // Log project start.
  33. echo(chalk.blue(chalk.bold(`${projectName}:`)));
  34. // Scaffold the project.
  35. const args = [projectName, ...PROJECTS[projectName]];
  36. await executeStep(
  37. "scaffold the project",
  38. () => $`node ${[bin, ...args, "--force", "--default"]}`
  39. );
  40. // Go inside the created project.
  41. const projectDirectory = path.resolve(submodulesDirectory, projectName);
  42. cd(projectDirectory);
  43. const pkg = require(path.resolve(projectDirectory, "package.json"));
  44. // Install project's dependencies.
  45. await executeStep("install NPM dependencies", async () => {
  46. await $`pnpm install`;
  47. });
  48. // Generate IDLs.
  49. if ("generate:idls" in pkg.scripts) {
  50. await executeStep("generate IDLs", async () => {
  51. await $`pnpm generate:idls`;
  52. });
  53. }
  54. // Generate clients.
  55. if ("generate:clients" in pkg.scripts) {
  56. await executeStep("generate clients", async () => {
  57. await $`pnpm generate:clients`;
  58. });
  59. }
  60. if (runTests) {
  61. // Test programs.
  62. if ("programs:test" in pkg.scripts) {
  63. await executeStep("test programs", async () => {
  64. await $`pnpm programs:test`;
  65. });
  66. }
  67. // Test clients.
  68. for (const client of CLIENTS) {
  69. if (`clients:${client}:test` in pkg.scripts) {
  70. await executeStep(`test ${client} clients`, async () => {
  71. await $`pnpm clients:${client}:test`;
  72. });
  73. }
  74. }
  75. }
  76. // Add line break between projects.
  77. echo("");
  78. }
  79. echo(chalk.green("All projects were created successfully!"));
  80. async function executeStep(title, fn) {
  81. try {
  82. const capitalizedTitle = title.charAt(0).toUpperCase() + title.slice(1);
  83. await spinner(`${capitalizedTitle}...`, fn);
  84. echo(chalk.green("✔︎") + ` ${capitalizedTitle}.`);
  85. } catch (e) {
  86. echo(chalk.red("✘") + ` Failed to ${title}.\n`);
  87. echo(e);
  88. process.exit(1);
  89. }
  90. }