knip 2.20.0 → 2.21.0-op.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,6 +32,7 @@ export declare class DependencyDeputy {
32
32
  scripts: string[];
33
33
  dependencies: string[];
34
34
  peerDependencies: string[];
35
+ optionalPeerDependencies: string[];
35
36
  optionalDependencies: string[];
36
37
  devDependencies: string[];
37
38
  allDependencies: string[];
@@ -46,12 +47,14 @@ export declare class DependencyDeputy {
46
47
  addReferencedBinary(workspaceName: string, binaryName: string): void;
47
48
  addPeerDependencies(workspaceName: string, peerDependencies: Map<string, Set<string>>): void;
48
49
  getPeerDependenciesOf(workspaceName: string, dependency: string): string[];
50
+ getOptionalPeerDependencies(workspaceName: string): string[];
49
51
  maybeAddReferencedExternalDependency(workspace: Workspace, packageName: string): boolean;
50
52
  maybeAddReferencedBinary(workspace: Workspace, binaryName: string): boolean;
51
53
  private isInDependencies;
52
54
  settleDependencyIssues(): {
53
55
  dependencyIssues: Issue[];
54
56
  devDependencyIssues: Issue[];
57
+ optionalPeerDependencyIssues: Issue[];
55
58
  };
56
59
  getConfigurationHints(): {
57
60
  configurationHints: ConfigurationHints;
@@ -22,6 +22,11 @@ export class DependencyDeputy {
22
22
  const dependencies = Object.keys(manifest.dependencies ?? {});
23
23
  const peerDependencies = Object.keys(manifest.peerDependencies ?? {});
24
24
  const optionalDependencies = Object.keys(manifest.optionalDependencies ?? {});
25
+ const optionalPeerDependencies = manifest.peerDependenciesMeta
26
+ ? peerDependencies.filter(peerDependency => manifest.peerDependenciesMeta &&
27
+ peerDependency in manifest.peerDependenciesMeta &&
28
+ manifest.peerDependenciesMeta[peerDependency].optional)
29
+ : [];
25
30
  const devDependencies = Object.keys(manifest.devDependencies ?? {});
26
31
  const allDependencies = [...dependencies, ...devDependencies, ...peerDependencies, ...optionalDependencies];
27
32
  this._manifests.set(name, {
@@ -32,6 +37,7 @@ export class DependencyDeputy {
32
37
  scripts,
33
38
  dependencies,
34
39
  peerDependencies,
40
+ optionalPeerDependencies,
35
41
  optionalDependencies,
36
42
  devDependencies,
37
43
  allDependencies,
@@ -79,6 +85,12 @@ export class DependencyDeputy {
79
85
  getPeerDependenciesOf(workspaceName, dependency) {
80
86
  return Array.from(this.peerDependencies.get(workspaceName)?.get(dependency) ?? []);
81
87
  }
88
+ getOptionalPeerDependencies(workspaceName) {
89
+ const manifest = this._manifests.get(workspaceName);
90
+ if (!manifest)
91
+ return [];
92
+ return manifest.optionalPeerDependencies;
93
+ }
82
94
  maybeAddReferencedExternalDependency(workspace, packageName) {
83
95
  if (isBuiltin(packageName))
84
96
  return true;
@@ -133,6 +145,7 @@ export class DependencyDeputy {
133
145
  settleDependencyIssues() {
134
146
  const dependencyIssues = [];
135
147
  const devDependencyIssues = [];
148
+ const optionalPeerDependencyIssues = [];
136
149
  for (const [workspaceName, { manifestPath, ignoreDependencies, ignoreBinaries }] of this._manifests.entries()) {
137
150
  const referencedDependencies = this.referencedDependencies.get(workspaceName);
138
151
  const installedBinaries = this.getInstalledBinaries(workspaceName);
@@ -175,6 +188,7 @@ export class DependencyDeputy {
175
188
  const isNotReferencedDependency = (dependency) => !isReferencedDependency(dependency);
176
189
  const pd = this.getProductionDependencies(workspaceName);
177
190
  const dd = this.getDevDependencies(workspaceName);
191
+ const od = this.getOptionalPeerDependencies(workspaceName);
178
192
  pd.filter(isNotIgnoredDependency)
179
193
  .filter(isNotIgnoredBinary)
180
194
  .filter(isNotReferencedDependency)
@@ -183,8 +197,12 @@ export class DependencyDeputy {
183
197
  .filter(isNotIgnoredBinary)
184
198
  .filter(isNotReferencedDependency)
185
199
  .forEach(symbol => devDependencyIssues.push({ type: 'devDependencies', filePath: manifestPath, symbol }));
200
+ od.filter(isNotIgnoredDependency)
201
+ .filter(isNotIgnoredBinary)
202
+ .filter(p => isReferencedDependency(p))
203
+ .forEach(symbol => optionalPeerDependencyIssues.push({ type: 'optionalPeerDependencies', filePath: manifestPath, symbol }));
186
204
  }
187
- return { dependencyIssues, devDependencyIssues };
205
+ return { dependencyIssues, devDependencyIssues, optionalPeerDependencyIssues };
188
206
  }
189
207
  getConfigurationHints() {
190
208
  const configurationHints = new Set();
package/dist/constants.js CHANGED
@@ -59,6 +59,7 @@ export const ISSUE_TYPES = [
59
59
  'files',
60
60
  'dependencies',
61
61
  'devDependencies',
62
+ 'optionalPeerDependencies',
62
63
  'unlisted',
63
64
  'binaries',
64
65
  'unresolved',
@@ -74,6 +75,7 @@ export const ISSUE_TYPE_TITLE = {
74
75
  files: 'Unused files',
75
76
  dependencies: 'Unused dependencies',
76
77
  devDependencies: 'Unused devDependencies',
78
+ optionalPeerDependencies: 'Referenced optional peerDependencies',
77
79
  unlisted: 'Unlisted dependencies',
78
80
  binaries: 'Unlisted binaries',
79
81
  unresolved: 'Unresolved imports',
package/dist/index.js CHANGED
@@ -308,11 +308,12 @@ export const main = async (unresolvedConfiguration) => {
308
308
  }
309
309
  }
310
310
  if (isReportDependencies) {
311
- const { dependencyIssues, devDependencyIssues } = deputy.settleDependencyIssues();
311
+ const { dependencyIssues, devDependencyIssues, optionalPeerDependencyIssues } = deputy.settleDependencyIssues();
312
312
  const { configurationHints } = deputy.getConfigurationHints();
313
313
  dependencyIssues.forEach(issue => collector.addIssue(issue));
314
314
  if (!isProduction)
315
315
  devDependencyIssues.forEach(issue => collector.addIssue(issue));
316
+ optionalPeerDependencyIssues.forEach(issue => collector.addIssue(issue));
316
317
  configurationHints.forEach(hint => collector.addConfigurationHint(hint));
317
318
  }
318
319
  const unusedIgnoredWorkspaces = chief.getUnusedIgnoredWorkspaces();
@@ -22,6 +22,7 @@ export default async ({ report, issues, options }) => {
22
22
  ...(report.files && { files: false }),
23
23
  ...(report.dependencies && { dependencies: [] }),
24
24
  ...(report.devDependencies && { devDependencies: [] }),
25
+ ...(report.optionalPeerDependencies && { optionalPeerDependencies: [] }),
25
26
  ...(report.unlisted && { unlisted: [] }),
26
27
  ...(report.unresolved && { unresolved: [] }),
27
28
  ...((report.exports || report.nsExports) && { exports: [] }),
@@ -22,6 +22,7 @@ export type Issues = {
22
22
  files: IssueSet;
23
23
  dependencies: IssueRecords;
24
24
  devDependencies: IssueRecords;
25
+ optionalPeerDependencies: IssueRecords;
25
26
  unlisted: IssueRecords;
26
27
  binaries: IssueRecords;
27
28
  unresolved: IssueRecords;
@@ -4,6 +4,7 @@ type WorkspaceManifest = {
4
4
  scripts: string[];
5
5
  dependencies: string[];
6
6
  peerDependencies: string[];
7
+ optionalPeerDependencies: string[];
7
8
  optionalDependencies: string[];
8
9
  devDependencies: string[];
9
10
  allDependencies: string[];
@@ -1,7 +1,14 @@
1
1
  import { ISSUE_TYPES } from '../constants.js';
2
2
  export const getIncludedIssueTypes = (cliArgs, { include = [], exclude = [], isProduction = false } = {}) => {
3
3
  if (cliArgs.dependencies) {
4
- cliArgs.include = [...cliArgs.include, 'dependencies', 'unlisted', 'binaries', 'unresolved'];
4
+ cliArgs.include = [
5
+ ...cliArgs.include,
6
+ 'dependencies',
7
+ 'optionalPeerDependencies',
8
+ 'unlisted',
9
+ 'binaries',
10
+ 'unresolved',
11
+ ];
5
12
  }
6
13
  if (cliArgs.exports) {
7
14
  const exports = ['exports', 'nsExports', 'classMembers', 'types', 'nsTypes', 'enumMembers', 'duplicates'];
@@ -21,9 +28,9 @@ export const getIncludedIssueTypes = (cliArgs, { include = [], exclude = [], isP
21
28
  }
22
29
  else {
23
30
  if (_include.includes('dependencies'))
24
- _include.push('devDependencies');
31
+ _include.push('devDependencies', 'optionalPeerDependencies');
25
32
  if (_exclude.includes('dependencies'))
26
- _exclude.push('devDependencies');
33
+ _exclude.push('devDependencies', 'optionalPeerDependencies');
27
34
  }
28
35
  const included = (_include.length > 0 ? _include : ISSUE_TYPES).filter(group => !_exclude.includes(group));
29
36
  return ISSUE_TYPES.reduce((types, group) => ((types[group] = included.includes(group)), types), {});
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "2.20.0";
1
+ export declare const version = "2.21.0-op.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const version = '2.20.0';
1
+ export const version = '2.21.0-op.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "knip",
3
- "version": "2.20.0",
3
+ "version": "2.21.0-op.0",
4
4
  "description": "Find unused files, dependencies and exports in your TypeScript and JavaScript projects",
5
5
  "homepage": "https://github.com/webpro/knip",
6
6
  "repository": "github:webpro/knip",