Skip to content

Commit d654ec7

Browse files
committed
Resolve imports satisfied via transitive peerDeps
1 parent f78246a commit d654ec7

9 files changed

Lines changed: 66 additions & 1 deletion

File tree

packages/knip/fixtures/peer-transitive/node_modules/host/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/knip/fixtures/peer-transitive/node_modules/host/package.json

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/knip/fixtures/peer-transitive/node_modules/transitive-peer/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/knip/fixtures/peer-transitive/node_modules/transitive-peer/package.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "@fixtures/peer-transitive",
3+
"private": true,
4+
"workspaces": ["packages/*"]
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "consumer",
3+
"peerDependencies": {
4+
"host": ">=1"
5+
}
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { thing } from 'transitive-peer';
2+
import 'host';
3+
export { thing };

packages/knip/src/DependencyDeputy.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export class DependencyDeputy {
9696

9797
const packageNames = [
9898
...dependencies,
99-
...(this.isStrict ? peerDependencies : []),
99+
...peerDependencies,
100100
...(this.isProduction ? [] : devDependencies),
101101
];
102102

@@ -236,6 +236,18 @@ export class DependencyDeputy {
236236

237237
if (this._manifests.get(workspace.name)?.engines[packageName]) return true;
238238

239+
if (!this.isStrict) {
240+
for (const name of workspaceNames) {
241+
const hosts = this.getHostDependenciesFor(name, packageName);
242+
if (hosts.length === 0) continue;
243+
const m = this._manifests.get(name);
244+
if (m && hosts.some(h => m.allDependencies.has(h.name))) {
245+
this.addReferencedDependency(name, packageName);
246+
return true;
247+
}
248+
}
249+
}
250+
239251
this.addReferencedDependency(workspace.name, packageName);
240252

241253
return false;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import assert from 'node:assert/strict';
2+
import test from 'node:test';
3+
import { main } from '../src/index.ts';
4+
import baseCounters from './helpers/baseCounters.ts';
5+
import { createOptions } from './helpers/create-options.ts';
6+
import { resolve } from './helpers/resolve.ts';
7+
8+
test('import resolved transitively via a declared peer is not flagged unlisted', async () => {
9+
const cwd = resolve('fixtures/peer-transitive');
10+
const options = await createOptions({ cwd });
11+
const { issues, counters } = await main(options);
12+
13+
assert(!issues.unlisted['packages/consumer/src/index.ts']?.['transitive-peer']);
14+
15+
assert.deepEqual(counters, {
16+
...baseCounters,
17+
processed: 1,
18+
total: 1,
19+
});
20+
});
21+
22+
test('strict mode still flags transitive-peer imports as unlisted', async () => {
23+
const cwd = resolve('fixtures/peer-transitive');
24+
const options = await createOptions({ cwd, isStrict: true, isProduction: false });
25+
const { issues } = await main(options);
26+
27+
assert(issues.unlisted['packages/consumer/src/index.ts']?.['transitive-peer']);
28+
});

0 commit comments

Comments
 (0)