Skip to content

Commit

Permalink
fix: stops failure on npm <v7 with peer deps
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesPatrickGill committed Apr 22, 2021
1 parent f9a9758 commit 346b191
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 3 deletions.
12 changes: 11 additions & 1 deletion lib/parsers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Yarn2Lock } from './yarn2-lock-parser';
export interface Dep {
name: string;
version: string;
isPeerDep?: boolean;
dev?: boolean;
}

Expand Down Expand Up @@ -105,7 +106,6 @@ export function getTopLevelDeps(
const dependenciesIterator = Object.entries({
...targetFile.dependencies,
...(includeDev ? targetFile.devDependencies : null),
...(targetFile.peerDependencies || {}),
...(targetFile.optionalDependencies || {}),
});

Expand All @@ -120,6 +120,16 @@ export function getTopLevelDeps(
});
}

if (targetFile.peerDependencies) {
for (const [name, version] of Object.entries(targetFile.peerDependencies)) {
dependencies.push({
name,
version,
isPeerDep: true,
});
}
}

return dependencies;
}

Expand Down
11 changes: 11 additions & 0 deletions lib/parsers/lock-parser-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
OutOfSyncError,
TreeSizeLimitError,
} from '../errors';
import { PackageLock } from './package-lock-parser';

export interface PackageLockDeps {
[depName: string]: PackageLockDep;
Expand Down Expand Up @@ -148,6 +149,8 @@ export abstract class LockParserBase implements LockfileParser {
} else if (/^file:/.test(dep.version)) {
depTree.dependencies[dep.name] = createDepTreeDepFromDep(dep);
treeSize++;
} else if (isPeerDepInLockfileV1(lockfile, dep)) {
continue;
} else {
// TODO: also check the package version
// for a stricter check
Expand Down Expand Up @@ -417,3 +420,11 @@ export abstract class LockParserBase implements LockfileParser {
throw new Error('Not implemented');
}
}

// Checks for the case of using npm version 6 or less
// in conjunction with peer deps. This is needed as npm 6
// does not auto install peerDeps so we dont need to worry
// about them.
function isPeerDepInLockfileV1(lockfile: Lockfile, dep: Dep) {
return (lockfile as PackageLock).lockfileVersion === 1 && dep.isPeerDep;
}
31 changes: 31 additions & 0 deletions test/lib/fixtures/peer-deps/npm6/expected-tree.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"dependencies": {
"adm-zip": {
"labels": {
"scope": "prod"
},
"name": "adm-zip",
"version": "0.4.7"
},
"debug": {
"labels": {
"scope": "prod"
},
"name": "debug",
"version": "2.6.9",
"dependencies": {
"ms": {
"labels": {
"scope": "prod"
},
"name": "ms",
"version": "2.0.0"
}
}
}
},
"hasDevDependencies": false,
"name": "goof",
"size": 4,
"version": "0.0.3"
}
28 changes: 28 additions & 0 deletions test/lib/fixtures/peer-deps/npm6/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes.
13 changes: 13 additions & 0 deletions test/lib/fixtures/peer-deps/npm7/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "goof",
"version": "0.0.3",
"dependencies": {
"adm-zip": "0.4.7"
},
"peerDependencies": {
"has": "^1.0.0"
},
"optionalDependencies": {
"debug": "^2.2.0"
}
}
15 changes: 13 additions & 2 deletions test/lib/package-lock-depTree.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -254,11 +254,22 @@ test('`package.json` with file as version', async (t) => {
t.deepEqual(depTree, expectedDepTree, 'Tree generated as expected');
});

test('`package.json` with peer and optionals (npm6)', async (t) => {
const expectedDepTree = load('peer-deps/npm6/expected-tree.json');

const depTree = await buildDepTreeFromFiles(
`${__dirname}/fixtures/peer-deps/npm6`,
'package.json',
'package-lock.json',
);

t.deepEqual(depTree, expectedDepTree, 'Tree generated as expected');
});
test('`package.json` with peer and optionals (npm7)', async (t) => {
const expectedDepTree = load('peer-deps/expected-tree.json');
const expectedDepTree = load('peer-deps/npm7/expected-tree.json');

const depTree = await buildDepTreeFromFiles(
`${__dirname}/fixtures/peer-deps/`,
`${__dirname}/fixtures/peer-deps/npm7`,
'package.json',
'package-lock.json',
);
Expand Down

0 comments on commit 346b191

Please sign in to comment.