@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
JavaScript
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;
}