monorepo.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import type { Package } from '@manypkg/get-packages';
  2. import { existsSync } from 'node:fs';
  3. import { dirname, join, resolve } from 'node:path';
  4. import * as manypkg from '@manypkg/get-packages';
  5. const { getPackages: getPackagesFunc, getPackagesSync: getPackagesSyncFunc } =
  6. manypkg;
  7. /**
  8. * 查找大仓的根目录
  9. * @param cwd
  10. */
  11. function findMonorepoRoot(cwd: string = process.cwd()) {
  12. let currentDir = resolve(cwd);
  13. while (true) {
  14. if (existsSync(join(currentDir, 'pnpm-lock.yaml'))) {
  15. return currentDir;
  16. }
  17. const parentDir = dirname(currentDir);
  18. if (parentDir === currentDir) {
  19. return '';
  20. }
  21. currentDir = parentDir;
  22. }
  23. }
  24. /**
  25. * 获取大仓的所有包
  26. */
  27. function getPackagesSync() {
  28. const root = findMonorepoRoot();
  29. return getPackagesSyncFunc(root);
  30. }
  31. /**
  32. * 获取大仓的所有包
  33. */
  34. async function getPackages() {
  35. const root = findMonorepoRoot();
  36. return await getPackagesFunc(root);
  37. }
  38. /**
  39. * 获取大仓指定的包
  40. */
  41. async function getPackage(pkgName: string) {
  42. const { packages } = await getPackages();
  43. return packages.find((pkg: Package) => pkg.packageJson.name === pkgName);
  44. }
  45. export { findMonorepoRoot, getPackage, getPackages, getPackagesSync };