@elora-cloud/elora-cli
Version:
elora build cli 前端打包脚手架
62 lines (59 loc) • 2.15 kB
JavaScript
import { parse, join, dirname } from 'node:path';
import process from 'node:process';
import { filterPackagesFromDir } from '@pnpm/filter-workspace-packages';
import { findWorkspaceDir } from '@pnpm/find-workspace-dir';
import fse from 'fs-extra';
import { CWD } from './constant.mjs';
async function findGitRoot(startPath) {
let currentPath = startPath;
while (currentPath !== parse(currentPath).root) {
if (await fse.pathExists(join(currentPath, '.git'))) {
return currentPath;
}
currentPath = dirname(currentPath);
}
return null;
}
function isMonorepo() {
return process.env.ELORA_CLI_IS_MONOREPO === 'monorepo';
}
function getMonorepoDir() {
return process.env.ELORA_CLI_IS_MONOREPO_DIR;
}
// 判断当前是不是一个monorepo的项目
async function isMonorepoProject() {
const pnpmWorkspacePkgs = await findWorkspaceDir(CWD);
// git的目录要和pnpm的目录一致
if (pnpmWorkspacePkgs && pnpmWorkspacePkgs === (await findGitRoot(CWD))) {
process.env.ELORA_CLI_IS_MONOREPO = 'monorepo';
process.env.ELORA_CLI_IS_MONOREPO_DIR = pnpmWorkspacePkgs;
}
return !!pnpmWorkspacePkgs;
}
async function filterMonorepoPkg(filter) {
if (isMonorepo()) {
// 判断哪些是需要忽略的哪些是需要包含的
const pkgSelectors = [];
if (filter) {
pkgSelectors.push({
filter,
followProdDepsOnly: true,
});
}
const { selectedProjectsGraph } = await filterPackagesFromDir(getMonorepoDir() || CWD, pkgSelectors, {});
// 转为数组
return Object.entries(selectedProjectsGraph).map(v => ({
dir: v[1].package.rootDir,
name: v[1].package.manifest.name,
version: v[1].package.manifest.version,
}));
}
return false;
}
function setPublishRegistry(r) {
process.env.ELORA_CLI_PUBLISH_REGISTRY = r;
}
function setPublishTag(t) {
process.env.ELORA_CLI_PUBLISH_TAG = t;
}
export { filterMonorepoPkg, getMonorepoDir, isMonorepo, isMonorepoProject, setPublishRegistry, setPublishTag };