snapshot.mjs 2.8 KB

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