Skip to content

Commit

Permalink
cleanup(core): cleanup lock file functions
Browse files Browse the repository at this point in the history
  • Loading branch information
meeroslav committed Oct 5, 2022
1 parent 6845d2a commit 7da42ee
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 77 deletions.
91 changes: 15 additions & 76 deletions packages/nx/src/utils/lock-file/lock-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ import {
import { LockFileData, PackageVersions } from './lock-file-type';
import { workspaceRoot } from '../workspace-root';
import { join } from 'path';
import { findMatchingVersion, hashString } from './utils';
import {
findMatchingVersion,
getNodeName,
hashString,
mapExternalNodeDependencies,
} from './utils';
import {
ProjectGraph,
ProjectGraphExternalNode,
Expand Down Expand Up @@ -113,21 +118,6 @@ export function mapLockFileDataToPartialGraph(
Object.keys(versions).forEach((nameVersion) => {
const packageVersion = versions[nameVersion];

// map packages' transitive dependencies and peer dependencies to external nodes' versions
const combinedDependencies =
packageVersion.dependencies || packageVersion.peerDependencies
? {
...(packageVersion.dependencies || {}),
...(packageVersion.peerDependencies || {}),
}
: undefined;

const dependencies = mapTransitiveDependencies(
lockFileData.dependencies,
combinedDependencies,
versionCache
);

// save external node
const nodeName = getNodeName(
dep,
Expand All @@ -143,68 +133,17 @@ export function mapLockFileDataToPartialGraph(
},
};

// map transitive dependencies to dependencies hash map
dependencies.forEach((dep) => {
result.dependencies[nodeName] = result.dependencies[nodeName] || [];
result.dependencies[nodeName].push({
type: 'static',
source: nodeName,
target: dep,
});
});
});
});
return result;
}

function getNodeName(
dep: string,
version: string,
rootVersion: boolean
): `npm:${string}` {
return rootVersion ? `npm:${dep}` : `npm:${dep}@${version}`;
}

// Finds the maching version of each dependency of the package and
// maps each {package}:{versionRange} pair to "npm:{package}@{version}"
function mapTransitiveDependencies(
packages: Record<string, PackageVersions>,
dependencies: Record<string, string>,
versionCache: Record<string, string>
): string[] {
if (!dependencies) {
return [];
}
const result: string[] = [];

Object.keys(dependencies).forEach((packageName) => {
const key = `${packageName}@${dependencies[packageName]}`;

// some of the peer dependencies might not be installed,
// we don't have them as nodes in externalNodes
// so there's no need to map them as dependencies
if (!packages[packageName]) {
return;
}

// if we already processed this dependency, use the version from the cache
if (versionCache[key]) {
result.push(versionCache[key]);
} else {
const versions = packages[packageName];
const version =
findMatchingVersion(packageName, versions, dependencies[packageName]) ||
dependencies[packageName];
const nodeName = getNodeName(
packageName,
version,
versions[version]?.rootVersion
const dependencies = mapExternalNodeDependencies(
nodeName,
packageVersion,
lockFileData.dependencies,
versionCache
);
result.push(nodeName);
versionCache[key] = nodeName;
}
if (dependencies.length) {
result.dependencies[nodeName] = dependencies;
}
});
});

return result;
}

Expand Down
88 changes: 87 additions & 1 deletion packages/nx/src/utils/lock-file/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { satisfies } from 'semver';
import { defaultHashing } from '../../hasher/hashing-impl';
import { PackageVersions } from './lock-file-type';
import { PackageDependency, PackageVersions } from './lock-file-type';
import { workspaceRoot } from '../workspace-root';
import { existsSync, readFileSync } from 'fs';

Expand Down Expand Up @@ -63,3 +63,89 @@ export function isRootVersion(packageName: string, version: string): boolean {
}
return true;
}

/**
* Returns node name depending whether it's root version or nested
*/
export function getNodeName(
dep: string,
version: string,
rootVersion: boolean
): `npm:${string}` {
return rootVersion ? `npm:${dep}` : `npm:${dep}@${version}`;
}

export function mapExternalNodeDependencies(
nodeName: string,
packageVersion: PackageDependency,
dependencies: Record<string, PackageVersions>,
versionCache: Record<string, string>
) {
const result = [];

const combinedDependencies =
packageVersion.dependencies || packageVersion.peerDependencies
? {
...(packageVersion.dependencies || {}),
...(packageVersion.peerDependencies || {}),
}
: undefined;
const transitiveDeps = mapTransitiveDependencies(
dependencies,
combinedDependencies,
versionCache
);
// map transitive dependencies to dependencies hash map
transitiveDeps.forEach((dep) => {
result.push({
type: 'static',
source: nodeName,
target: dep,
});
});

return result;
}

// Finds the maching version of each dependency of the package and
// maps each {package}:{versionRange} pair to "npm:{package}@{version}" (when transitive) or "npm:{package}" (when root)
function mapTransitiveDependencies(
packages: Record<string, PackageVersions>,
dependencies: Record<string, string>,
versionCache: Record<string, string>
): string[] {
if (!dependencies) {
return [];
}
const result: string[] = [];

Object.keys(dependencies).forEach((packageName) => {
const key = `${packageName}@${dependencies[packageName]}`;

// some of the peer dependencies might not be installed,
// we don't have them as nodes in externalNodes
// so there's no need to map them as dependencies
if (!packages[packageName]) {
return;
}

// if we already processed this dependency, use the version from the cache
if (versionCache[key]) {
result.push(versionCache[key]);
} else {
const versions = packages[packageName];
const version =
findMatchingVersion(packageName, versions, dependencies[packageName]) ||
dependencies[packageName];
const nodeName = getNodeName(
packageName,
version,
versions[version]?.rootVersion
);
result.push(nodeName);
versionCache[key] = nodeName;
}
});

return result;
}

0 comments on commit 7da42ee

Please sign in to comment.