UNPKG

@alexaegis/workspace-tools

Version:

Tools for working with javascript workspaces

110 lines (109 loc) 4.25 kB
import { normalizeRegExpLikeToRegExp, asyncFilterMap } from "@alexaegis/common"; import { normalizeCwdOption, readJson, readYaml } from "@alexaegis/fs"; import { match } from "@alexaegis/match"; import { globby } from "globby"; import { join, relative } from "node:path"; import { g as getWorkspaceRoot, P as PACKAGE_JSON_NAME, a as PNPM_WORKSPACE_FILE_NAME, N as NODE_MODULES_DIRECTORY_NAME } from "./get-workspace-root.function-BIw0sIyQ.js"; import { normalizeLoggerOption } from "@alexaegis/logging"; import { n as normalizePackageJsonWorkspacesField } from "./normalize-package-json-workspaces-field.function-c4DpIRCW.js"; const normalizeGetRootPackageJsonOptions = (options) => { return { ...normalizeCwdOption(options), ...normalizeLoggerOption(options) }; }; const getRootPackageJson = async (rawOptions) => { const options = normalizeGetRootPackageJsonOptions(rawOptions); const rootWorkspace = getWorkspaceRoot(options); if (!rootWorkspace) { options.logger.error("No package json was found! Cannot collect workspace packages!"); return void 0; } const packageJsonPath = join(rootWorkspace, PACKAGE_JSON_NAME); const packageJson = await readJson(packageJsonPath).catch(() => void 0); if (!packageJson) { options.logger.error("Failed to read packageJson!", packageJsonPath); return void 0; } let workspaces = normalizePackageJsonWorkspacesField(packageJson.workspaces); const pnpmWorkspace = await readYaml( join(rootWorkspace, PNPM_WORKSPACE_FILE_NAME) ); if (pnpmWorkspace?.packages) { workspaces = [...workspaces, ...pnpmWorkspace.packages]; } return { packageJson, packageKind: "root", workspacePackagePatterns: workspaces, packageJsonPath, packagePath: rootWorkspace, packagePathFromRootPackage: "." }; }; const normalizeCollectWorkspacePackagesOptions = (options) => { return { ...normalizeGetRootPackageJsonOptions(options), onlyWorkspaceRoot: options?.onlyWorkspaceRoot ?? false, skipWorkspaceRoot: options?.skipWorkspaceRoot ?? false, dependencyCriteria: options?.dependencyCriteria?.map(normalizeRegExpLikeToRegExp) ?? [], packageJsonMatcher: options?.packageJsonMatcher }; }; const collectWorkspacePackages = async (rawOptions) => { const options = normalizeCollectWorkspacePackagesOptions(rawOptions); const rootPackage = await getRootPackageJson(options); if (!rootPackage) { options.logger.error("No package json was found! Cannot collect workspace packages!"); return []; } let result = []; if (rootPackage.workspacePackagePatterns.length > 0) { const paths = await globby(rootPackage.workspacePackagePatterns, { gitignore: true, onlyDirectories: true, ignore: [NODE_MODULES_DIRECTORY_NAME], absolute: true, cwd: rootPackage.packagePath }); const subPackages = await asyncFilterMap(paths, (path) => { const packageJsonPath = join(path, PACKAGE_JSON_NAME); return readJson(packageJsonPath).catch(() => void 0).then( (packageJson) => packageJson ? { packageKind: "regular", packageJson, packagePath: path, packagePathFromRootPackage: relative(rootPackage.packagePath, path), packageJsonPath } : void 0 ); }); if (!options.onlyWorkspaceRoot) { result.push(...subPackages); } } if (!options.skipWorkspaceRoot || rootPackage.workspacePackagePatterns.length === 0) { result.unshift(rootPackage); } if (options.packageJsonMatcher) { result = result.filter( (relativePackage) => match(relativePackage.packageJson, options.packageJsonMatcher) ); } if (options.dependencyCriteria.length > 0) { result = result.filter((relativePackage) => { const packageDependencies = [ ...Object.keys(relativePackage.packageJson.dependencies ?? {}), ...Object.keys(relativePackage.packageJson.devDependencies ?? {}) ]; return options.dependencyCriteria.every( (dependencyCriteria) => packageDependencies.some((dependency) => dependencyCriteria.test(dependency)) ); }); } return result; }; export { collectWorkspacePackages as c, normalizeCollectWorkspacePackagesOptions as n };