Skip to content

Commit

Permalink
feat(core): prune pnpm time field
Browse files Browse the repository at this point in the history
  • Loading branch information
meeroslav committed Nov 17, 2022
1 parent 9868110 commit 2ad91e5
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 22 deletions.
2 changes: 1 addition & 1 deletion packages/nx/src/utils/lock-file/__fixtures__/pnpm.lock.ts
Expand Up @@ -8660,7 +8660,7 @@ packages:
* save-workspace-protocol=rolling
*/

export const lockFileWithWorkspaces = `lockfileVersion: 5.4
export const lockFileWithWorkspacesAndTime = `lockfileVersion: 5.4
importers:
Expand Down
20 changes: 18 additions & 2 deletions packages/nx/src/utils/lock-file/pnpm.spec.ts
Expand Up @@ -7,6 +7,8 @@ import {
lockFile,
lockFileJustTypescript,
lockFileWithInlineSpecifiers,
lockFileWithInlineSpecifiersAndWorkspaces,
lockFileWithWorkspacesAndTime,
lockFileYargsAndDevkit,
} from './__fixtures__/pnpm.lock';

Expand Down Expand Up @@ -139,7 +141,14 @@ describe('pnpm LockFile utility', () => {
});
});

it('should parse lockfile with time-based resolution and workspaces', () => {});
it('should parse lockfile with time-based resolution and workspaces', () => {
const parsedLockFile = parsePnpmLockFile(lockFileWithWorkspacesAndTime);
expect(parsedLockFile.lockFileMetadata.time).toBeDefined();

expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(
lockFileWithWorkspacesAndTime
);
});

describe('lock file with inline specifiers', () => {
const parsedLockFile = parsePnpmLockFile(lockFileWithInlineSpecifiers);
Expand Down Expand Up @@ -235,5 +244,12 @@ describe('pnpm LockFile utility', () => {
});
});

it('should parse lockfile with inline specifiers and workspaces', () => {});
it('should parse lockfile with inline specifiers and workspaces', () => {
const parsedLockFile = parsePnpmLockFile(
lockFileWithInlineSpecifiersAndWorkspaces
);
expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(
lockFileWithInlineSpecifiersAndWorkspaces
);
});
});
48 changes: 45 additions & 3 deletions packages/nx/src/utils/lock-file/pnpm.ts
@@ -1,4 +1,8 @@
import { LockFileData, PackageDependency } from './lock-file-type';
import {
LockFileData,
PackageDependency,
PackageVersions,
} from './lock-file-type';
import { load, dump } from '@zkochan/js-yaml';
import {
sortObject,
Expand All @@ -8,6 +12,7 @@ import {
generatePrunnedHash,
} from './utils';
import { satisfies } from 'semver';
import { dematerialize } from 'rxjs/operators';

type PackageMeta = {
key: string;
Expand Down Expand Up @@ -314,7 +319,7 @@ function unmapLockFile(lockFileData: LockFileData): PnpmLockFile {
>;

return {
...(lockFileData.lockFileMetadata as { lockfileVersion: number }),
...(lockFileMetatada as { lockfileVersion: number }),
specifiers: sortObject(specifiers),
dependencies: sortObject(dependencies),
devDependencies: sortObject(devDependencies),
Expand Down Expand Up @@ -358,7 +363,10 @@ export function prunePnpmLockFile(
projectName
);
const prunedLockFileData = {
lockFileMetadata: lockFileData.lockFileMetadata,
lockFileMetadata: pruneMetadata(
lockFileData.lockFileMetadata,
dependencies
),
dependencies,
hash: generatePrunnedHash(lockFileData.hash, packages, projectName),
};
Expand Down Expand Up @@ -409,6 +417,40 @@ function pruneDependencies(
return result;
}

function pruneMetadata(
lockFileMetadata: LockFileData['lockFileMetadata'],
prunedDependencies: Record<string, PackageVersions>
): LockFileData['lockFileMetadata'] {
// These should be removed from the lock file metadata since we don't have them in the package.json
// overrides, patchedDependencies, neverBuiltDependencies, onlyBuiltDependencies, packageExtensionsChecksum
return {
lockfileVersion: lockFileMetadata.lockfileVersion,
...(lockFileMetadata.time && {
time: pruneTime(lockFileMetadata.time, prunedDependencies),
}),
};
}

function pruneTime(
time: Record<string, string>,
prunedDependencies: Record<string, PackageVersions>
): Record<string, string> {
const result: Record<string, string> = {};

Object.entries(time).forEach(([key, value]) => {
const packageName = key.slice(1, key.lastIndexOf('/'));
const version = key.slice(key.lastIndexOf('/'));
if (
prunedDependencies[packageName] &&
prunedDependencies[packageName][`${packageName}@${version}`]
) {
result[key] = value;
}
});

return result;
}

// find all transitive dependencies of already pruned packages
// and adds them to the collection
// recursively prune their dependencies
Expand Down
16 changes: 0 additions & 16 deletions packages/nx/src/utils/lock-file/utils.ts
@@ -1,4 +1,3 @@
import { satisfies } from 'semver';
import { defaultHashing } from '../../hasher/hashing-impl';
import {
LockFileData,
Expand Down Expand Up @@ -47,21 +46,6 @@ export function hashString(fileContent: string): string {
return defaultHashing.hashArray([fileContent]);
}

export function findMatchingVersion(
packageName: string,
packageVersions: PackageVersions,
version: string
): string {
// if it's fixed version, just return it
if (packageVersions[`${packageName}@${version}`]) {
return version;
}
// otherwise search for the matching version
return Object.values(packageVersions).find((v) =>
satisfies(v.version, version)
)?.version;
}

export function isRootVersion(packageName: string, version: string): boolean {
const fullPath = `${workspaceRoot}/node_modules/${packageName}/package.json`;
if (existsSync(fullPath)) {
Expand Down

0 comments on commit 2ad91e5

Please sign in to comment.