snapshot.mjs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env zx
  2. import 'zx/globals';
  3. import { CLIENTS, PROJECTS, executeStep } from './utils.mjs';
  4. $.verbose = false;
  5. // Parse CLI arguments.
  6. const selectedProjects = argv._;
  7. const projects =
  8. selectedProjects.length > 0
  9. ? Object.keys(PROJECTS).filter((project) =>
  10. selectedProjects.includes(project)
  11. )
  12. : Object.keys(PROJECTS);
  13. const runTests = !!argv.test;
  14. // Resolve paths.
  15. const bin = path.resolve(__dirname, '../outfile.cjs');
  16. const projectsDirectory = path.resolve(__dirname, '../projects/');
  17. if (!fs.existsSync(projectsDirectory)) {
  18. fs.mkdirSync(projectsDirectory);
  19. }
  20. for (const projectName of projects) {
  21. // Go the submodules directory before creating each project.
  22. cd(projectsDirectory);
  23. // Log project start.
  24. echo(chalk.blue(chalk.bold(`${projectName}:`)));
  25. // Scaffold the project.
  26. const args = [projectName, ...PROJECTS[projectName]];
  27. await executeStep(
  28. 'scaffold the project',
  29. () => $`node ${[bin, ...args, '--force', '--default']}`
  30. );
  31. // Go inside the created project.
  32. const projectDirectory = path.resolve(projectsDirectory, projectName);
  33. cd(projectDirectory);
  34. const pkg = await fs.readJSON(path.resolve(projectDirectory, 'package.json'));
  35. // Install project's dependencies.
  36. await executeStep('install NPM dependencies', async () => {
  37. await $`pnpm install`;
  38. });
  39. // Generate IDLs.
  40. if ('generate:idls' in pkg.scripts) {
  41. await executeStep('generate IDLs', async () => {
  42. await $`pnpm generate:idls`;
  43. });
  44. }
  45. // Generate clients.
  46. if ('generate:clients' in pkg.scripts) {
  47. await executeStep('generate clients', async () => {
  48. await $`pnpm generate:clients`;
  49. });
  50. }
  51. if (runTests) {
  52. // Test programs.
  53. if ('programs:test' in pkg.scripts) {
  54. await executeStep('test programs', async () => {
  55. await $`pnpm programs:test`;
  56. });
  57. }
  58. // Test clients.
  59. for (const client of CLIENTS) {
  60. if (`clients:${client}:test` in pkg.scripts) {
  61. await executeStep(`test ${client} clients`, async () => {
  62. await $`pnpm clients:${client}:test`;
  63. });
  64. }
  65. }
  66. }
  67. // Add line break between projects.
  68. echo('');
  69. }
  70. echo(chalk.green('All projects were created successfully!'));