UNPKG

@augment-vir/node

Version:

A collection of augments, helpers types, functions, and classes only for Node.js (backend) JavaScript environments.

51 lines (50 loc) 2.32 kB
import { check } from '@augment-vir/assert'; import { filterMap, getEnumValues, getObjectTypedEntries, getOrSet } from '@augment-vir/common'; import { readJsonFile } from '../fs/json.js'; import { findAllPackageJsonFilePaths } from './package-json.js'; /** * All `package.json` keys that are parsed as direct dependencies. * * @category Internal */ export var PackageJsonDependencyKey; (function (PackageJsonDependencyKey) { PackageJsonDependencyKey["DevDependencies"] = "devDependencies"; PackageJsonDependencyKey["Dependencies"] = "dependencies"; PackageJsonDependencyKey["PeerDependencies"] = "peerDependencies"; PackageJsonDependencyKey["Overrides"] = "overrides"; })(PackageJsonDependencyKey || (PackageJsonDependencyKey = {})); /** * Finds all direct deps for the workspace at, or that contains, the given dir path. * * @category Node : Npm * @category Package : @augment-vir/node * @throws If no directory with a `package-lock.json` file is found. * @package [`@augment-vir/node`](https://www.npmjs.com/package/@augment-vir/node) */ export async function listAllDirectNpmDeps(startDirPath) { const packageJsonFilePaths = await findAllPackageJsonFilePaths(startDirPath); const deps = {}; const packageJsonFiles = await Promise.all(packageJsonFilePaths.map(async (packageJsonFilePath) => { return { packageJsonFilePath, packageJson: (await readJsonFile(packageJsonFilePath)), }; })); const allWorkspacePackageNames = filterMap(packageJsonFiles, (packageJsonFile) => packageJsonFile.packageJson.name, check.isTruthy); packageJsonFiles.forEach(({ packageJson, packageJsonFilePath }) => { getEnumValues(PackageJsonDependencyKey).forEach((dependencyKey) => { getObjectTypedEntries(packageJson[dependencyKey] || {}).forEach(([dependencyName, versionValue,]) => { if (typeof versionValue === 'string') { getOrSet(deps, dependencyName, () => []).push({ dependencyKey, requiredBy: packageJsonFilePath, versionValue, isWorkspace: allWorkspacePackageNames.includes(dependencyName), }); } }); }); }); return deps; }