knip 5.62.0 → 5.63.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.
Files changed (64) hide show
  1. package/README.md +22 -24
  2. package/dist/ConfigurationChief.d.ts +3 -0
  3. package/dist/ConfigurationChief.js +12 -4
  4. package/dist/IssueCollector.js +1 -1
  5. package/dist/ProjectPrincipal.d.ts +1 -0
  6. package/dist/ProjectPrincipal.js +9 -3
  7. package/dist/binaries/fallback.js +4 -2
  8. package/dist/cli.js +3 -2
  9. package/dist/compilers/index.d.ts +20 -0
  10. package/dist/graph/analyze.js +1 -1
  11. package/dist/graph/build.js +18 -8
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.js +2 -1
  14. package/dist/plugins/astro/index.d.ts +1 -0
  15. package/dist/plugins/astro/index.js +4 -0
  16. package/dist/plugins/index.d.ts +19 -1
  17. package/dist/plugins/index.js +4 -0
  18. package/dist/plugins/lefthook/index.js +2 -0
  19. package/dist/plugins/node-modules-inspector/index.d.ts +12 -0
  20. package/dist/plugins/node-modules-inspector/index.js +17 -0
  21. package/dist/plugins/playwright/index.js +8 -1
  22. package/dist/plugins/playwright/types.d.ts +20 -14
  23. package/dist/plugins/preconstruct/index.js +2 -1
  24. package/dist/plugins/react-router/index.js +18 -8
  25. package/dist/plugins/rsbuild/index.js +11 -2
  26. package/dist/plugins/rsbuild/types.d.ts +8 -0
  27. package/dist/plugins/rslib/index.d.ts +10 -0
  28. package/dist/plugins/rslib/index.js +15 -0
  29. package/dist/plugins/rslib/types.d.ts +1 -0
  30. package/dist/plugins/rslib/types.js +1 -0
  31. package/dist/plugins/rspack/index.js +1 -1
  32. package/dist/plugins/typescript/index.d.ts +1 -1
  33. package/dist/reporters/symbols.js +3 -1
  34. package/dist/reporters/util/configuration-hints.d.ts +1 -1
  35. package/dist/reporters/util/configuration-hints.js +55 -19
  36. package/dist/reporters/util/util.d.ts +0 -2
  37. package/dist/reporters/util/util.js +2 -2
  38. package/dist/schema/configuration.d.ts +112 -0
  39. package/dist/schema/plugins.d.ts +46 -0
  40. package/dist/schema/plugins.js +2 -0
  41. package/dist/types/PluginNames.d.ts +2 -2
  42. package/dist/types/PluginNames.js +2 -0
  43. package/dist/types/entries.d.ts +3 -0
  44. package/dist/types/entries.js +1 -0
  45. package/dist/types/issues.d.ts +3 -1
  46. package/dist/types/package-json.d.ts +4 -0
  47. package/dist/types/tsconfig-json.d.ts +14 -0
  48. package/dist/types/tsconfig-json.js +1 -0
  49. package/dist/typescript/ast-helpers.js +1 -1
  50. package/dist/util/fs.d.ts +1 -1
  51. package/dist/util/glob-core.d.ts +1 -1
  52. package/dist/util/glob-core.js +8 -7
  53. package/dist/util/glob.d.ts +1 -0
  54. package/dist/util/glob.js +1 -1
  55. package/dist/util/is-identifier-referenced.js +17 -17
  56. package/dist/util/package-json.d.ts +2 -1
  57. package/dist/util/package-json.js +24 -12
  58. package/dist/util/parse-and-convert-gitignores.js +2 -0
  59. package/dist/util/reporter.js +3 -3
  60. package/dist/util/table.js +1 -3
  61. package/dist/version.d.ts +1 -1
  62. package/dist/version.js +1 -1
  63. package/package.json +9 -14
  64. package/schema.json +8 -0
@@ -50,6 +50,7 @@ export const pluginNames = [
50
50
  'netlify',
51
51
  'next',
52
52
  'node',
53
+ 'node-modules-inspector',
53
54
  'nodemon',
54
55
  'npm-package-json-lint',
55
56
  'nuxt',
@@ -73,6 +74,7 @@ export const pluginNames = [
73
74
  'remix',
74
75
  'rollup',
75
76
  'rsbuild',
77
+ 'rslib',
76
78
  'rspack',
77
79
  'semantic-release',
78
80
  'sentry',
@@ -0,0 +1,3 @@
1
+ export type Entries<T> = Array<{
2
+ [K in keyof T]: [K, T[K]];
3
+ }[keyof T]>;
@@ -0,0 +1 @@
1
+ export {};
@@ -69,16 +69,18 @@ export type ReporterOptions = {
69
69
  options: string;
70
70
  preprocessorOptions: string;
71
71
  includedWorkspaces: Workspace[];
72
+ configFilePath?: string;
72
73
  };
73
74
  export type Reporter = (options: ReporterOptions) => void;
74
75
  export type Preprocessor = (options: ReporterOptions) => ReporterOptions;
75
76
  export type IssueSeverity = 'error' | 'warn' | 'off';
76
77
  export type Rules = Record<IssueType, IssueSeverity>;
77
78
  export type ConfigurationHints = Set<ConfigurationHint>;
78
- export type ConfigurationHintType = 'ignoreBinaries' | 'ignoreDependencies' | 'ignoreUnresolved' | 'ignoreWorkspaces' | 'entry-redundant' | 'project-redundant' | 'entry-top-level' | 'project-top-level' | 'entry-empty' | 'project-empty' | 'workspace-unconfigured';
79
+ export type ConfigurationHintType = 'ignoreBinaries' | 'ignoreDependencies' | 'ignoreUnresolved' | 'ignoreWorkspaces' | 'entry-redundant' | 'project-redundant' | 'entry-top-level' | 'project-top-level' | 'entry-empty' | 'project-empty' | 'package-entry' | 'workspace-unconfigured';
79
80
  export type ConfigurationHint = {
80
81
  type: ConfigurationHintType;
81
82
  identifier: string | RegExp;
83
+ filePath?: string;
82
84
  workspaceName?: string;
83
85
  size?: number;
84
86
  };
@@ -9,6 +9,9 @@ type Exports = null | string | string[] | {
9
9
  } | {
10
10
  [key: string]: Exports;
11
11
  };
12
+ type Imports = {
13
+ [key: `#${string}`]: Exports;
14
+ };
12
15
  type PackageJsonPath<T> = T extends {
13
16
  packageJsonPath: infer P;
14
17
  } ? (P extends string ? P : never) : never;
@@ -29,6 +32,7 @@ export type PackageJson = {
29
32
  packages?: string[];
30
33
  };
31
34
  exports?: Exports;
35
+ imports?: Imports;
32
36
  scripts?: Scripts;
33
37
  dependencies?: Dependencies;
34
38
  devDependencies?: Dependencies;
@@ -0,0 +1,14 @@
1
+ export interface TsConfigJson {
2
+ extends?: string | string[];
3
+ compilerOptions?: {
4
+ types?: string[];
5
+ jsxImportSource?: string;
6
+ plugins?: Array<string | {
7
+ name: string;
8
+ }>;
9
+ [key: string]: unknown;
10
+ };
11
+ references?: Array<{
12
+ path: string;
13
+ }>;
14
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -177,7 +177,7 @@ export const isConsiderReferencedNS = (node) => ts.isPropertyAssignment(node.par
177
177
  ts.isArrayLiteralExpression(node.parent) ||
178
178
  ts.isExportAssignment(node.parent) ||
179
179
  (ts.isVariableDeclaration(node.parent) && node.parent.initializer === node) ||
180
- ts.isTypeQueryNode(node.parent);
180
+ ts.isTypeQueryNode(node.parent.parent);
181
181
  const objectEnumerationMethods = new Set(['keys', 'entries', 'values', 'getOwnPropertyNames']);
182
182
  export const isObjectEnumerationCallExpressionArgument = (node) => ts.isCallExpression(node.parent) &&
183
183
  node.parent.arguments.includes(node) &&
package/dist/util/fs.d.ts CHANGED
@@ -4,6 +4,6 @@ export declare const findFile: (workingDir: string, fileName: string) => string
4
4
  export declare const loadFile: (filePath: string) => Promise<string>;
5
5
  export declare const loadJSON: (filePath: string) => Promise<any>;
6
6
  export declare const loadYAML: (filePath: string) => Promise<unknown>;
7
- export declare const loadTOML: (filePath: string) => Promise<Record<string, import("smol-toml").TomlPrimitive>>;
7
+ export declare const loadTOML: (filePath: string) => Promise<import("smol-toml").TomlTable>;
8
8
  export declare const parseJSON: (filePath: string, contents: string) => Promise<any>;
9
9
  export declare const parseYAML: (contents: string) => unknown;
@@ -14,6 +14,6 @@ export declare const findAndParseGitignores: (cwd: string) => Promise<{
14
14
  ignores: Set<string>;
15
15
  unignores: string[];
16
16
  }>;
17
- export declare function glob(patterns: string | string[], options: GlobOptions): Promise<string[]>;
17
+ export declare function glob(_patterns: string[], options: GlobOptions): Promise<string[]>;
18
18
  export declare function getGitIgnoredHandler(options: Options): Promise<(path: string) => boolean>;
19
19
  export {};
@@ -5,7 +5,7 @@ import fg, {} from 'fast-glob';
5
5
  import picomatch from 'picomatch';
6
6
  import { GLOBAL_IGNORE_PATTERNS, ROOT_WORKSPACE_NAME } from '../constants.js';
7
7
  import { timerify } from './Performance.js';
8
- import { compact } from './array.js';
8
+ import { compact, partition } from './array.js';
9
9
  import { debugLogObject } from './debug.js';
10
10
  import { isDirectory, isFile } from './fs.js';
11
11
  import { parseAndConvertGitignorePatterns } from './parse-and-convert-gitignores.js';
@@ -126,13 +126,14 @@ export const findAndParseGitignores = async (cwd) => {
126
126
  return { gitignoreFiles, ignores, unignores };
127
127
  };
128
128
  const _parseFindGitignores = timerify(findAndParseGitignores);
129
- export async function glob(patterns, options) {
130
- if (Array.isArray(patterns) && patterns.length === 0)
129
+ export async function glob(_patterns, options) {
130
+ if (Array.isArray(_patterns) && _patterns.length === 0)
131
131
  return [];
132
132
  const hasCache = cachedGlobIgnores.has(options.dir);
133
133
  const willCache = !hasCache && options.gitignore && options.label;
134
134
  const cachedIgnores = options.gitignore ? cachedGlobIgnores.get(options.dir) : undefined;
135
- const _ignore = options.gitignore && Array.isArray(options.ignore) ? [...options.ignore] : [];
135
+ const _ignore = [];
136
+ const [negatedPatterns, patterns] = partition(_patterns, pattern => pattern.startsWith('!'));
136
137
  if (options.gitignore) {
137
138
  if (willCache) {
138
139
  let dir = options.dir;
@@ -151,16 +152,16 @@ export async function glob(patterns, options) {
151
152
  else {
152
153
  _ignore.push(...GLOBAL_IGNORE_PATTERNS);
153
154
  }
154
- const ignore = cachedIgnores || compact(_ignore);
155
155
  if (willCache)
156
156
  cachedGlobIgnores.set(options.dir, compact(_ignore));
157
- const { dir, label, ...fgOptions } = { ...options, ignore };
157
+ const ignorePatterns = (cachedIgnores || _ignore).concat(negatedPatterns);
158
+ const { dir, label, ...fgOptions } = { ...options, ignore: ignorePatterns };
158
159
  const paths = await fg.glob(patterns, fgOptions);
159
160
  const name = relative(options.cwd, dir) || ROOT_WORKSPACE_NAME;
160
161
  debugLogObject(name, label ? `Finding ${label}` : 'Finding paths', () => ({
161
162
  patterns,
162
163
  ...fgOptions,
163
- ignore: hasCache ? `// using cache from ${name}` : ignore,
164
+ ignore: hasCache ? `// using cache from ${name}` : ignorePatterns,
164
165
  paths,
165
166
  }));
166
167
  return paths;
@@ -6,6 +6,7 @@ interface GlobOptions {
6
6
  name?: boolean;
7
7
  label?: string;
8
8
  }
9
+ export declare const removeProductionSuffix: (pattern: string) => string;
9
10
  export declare const prependDirToPattern: (dir: string, pattern: string) => string;
10
11
  export declare const negate: (pattern: string) => string;
11
12
  export declare const hasProductionSuffix: (pattern: string) => boolean;
package/dist/util/glob.js CHANGED
@@ -9,7 +9,7 @@ const prependDirToPatterns = (cwd, dir, patterns) => {
9
9
  const relativePath = relative(cwd, dir);
10
10
  return compact([patterns].flat().map(p => removeProductionSuffix(prepend(p, relativePath)))).sort(negatedLast);
11
11
  };
12
- const removeProductionSuffix = (pattern) => pattern.replace(/!$/, '');
12
+ export const removeProductionSuffix = (pattern) => pattern.replace(/!$/, '');
13
13
  const negatedLast = (pattern) => (pattern.startsWith('!') ? 1 : -1);
14
14
  export const prependDirToPattern = (dir, pattern) => {
15
15
  if (pattern.startsWith('!'))
@@ -86,23 +86,6 @@ export const getIsIdentifierReferencedHandler = (graph, entryPaths) => {
86
86
  }
87
87
  }
88
88
  }
89
- const reExported = file.reExported.get(identifier) ?? file.reExported.get(IMPORT_STAR);
90
- if (reExported) {
91
- for (const byFilePath of reExported) {
92
- if (!seen.has(byFilePath)) {
93
- const child = createNode(byFilePath);
94
- traceNode.children.add(child);
95
- const result = isIdentifierReferenced(byFilePath, id, isIncludeEntryExports, child, seen);
96
- if (result.reExportingEntryFile)
97
- reExportingEntryFile = result.reExportingEntryFile;
98
- if (result.isReferenced) {
99
- isReferenced = true;
100
- if (!isTrace)
101
- return { isReferenced, reExportingEntryFile, traceNode };
102
- }
103
- }
104
- }
105
- }
106
89
  const reExportedAs = file.reExportedAs.get(identifier);
107
90
  if (reExportedAs) {
108
91
  for (const [alias, byFilePaths] of reExportedAs) {
@@ -123,6 +106,23 @@ export const getIsIdentifierReferencedHandler = (graph, entryPaths) => {
123
106
  }
124
107
  }
125
108
  }
109
+ const reExported = file.reExported.get(identifier) ?? file.reExported.get(IMPORT_STAR);
110
+ if (reExported) {
111
+ for (const byFilePath of reExported) {
112
+ if (!seen.has(byFilePath)) {
113
+ const child = createNode(byFilePath);
114
+ traceNode.children.add(child);
115
+ const result = isIdentifierReferenced(byFilePath, id, isIncludeEntryExports, child, seen);
116
+ if (result.reExportingEntryFile)
117
+ reExportingEntryFile = result.reExportingEntryFile;
118
+ if (result.isReferenced) {
119
+ isReferenced = true;
120
+ if (!isTrace)
121
+ return { isReferenced, reExportingEntryFile, traceNode };
122
+ }
123
+ }
124
+ }
125
+ }
126
126
  for (const [namespace, byFilePaths] of file.reExportedNs.entries()) {
127
127
  for (const byFilePath of byFilePaths) {
128
128
  if (!seen.has(byFilePath)) {
@@ -7,5 +7,6 @@ interface ExtendedPackageJson extends PackageJson {
7
7
  }
8
8
  export declare const load: (filePath: string) => Promise<ExtendedPackageJson>;
9
9
  export declare const save: (filePath: string, content: ExtendedPackageJson) => Promise<void>;
10
- export declare const getEntryPathsFromManifest: (manifest: PackageJson) => Set<string>;
10
+ export declare const getEntrySpecifiersFromManifest: (manifest: PackageJson) => Set<string>;
11
+ export declare const getManifestImportDependencies: (manifest: PackageJson) => Set<string>;
11
12
  export {};
@@ -45,7 +45,7 @@ export const save = async (filePath, content) => {
45
45
  const fileContent = `${JSON.stringify(content, null, space)}\n`.replace(/\n/g, EOL);
46
46
  await writeFile(filePath, fileContent);
47
47
  };
48
- export const getEntryPathsFromManifest = (manifest) => {
48
+ export const getEntrySpecifiersFromManifest = (manifest) => {
49
49
  const { main, module, browser, bin, exports, types, typings } = manifest;
50
50
  const entryPaths = new Set();
51
51
  if (typeof main === 'string')
@@ -54,13 +54,15 @@ export const getEntryPathsFromManifest = (manifest) => {
54
54
  entryPaths.add(module);
55
55
  if (typeof browser === 'string')
56
56
  entryPaths.add(browser);
57
- if (bin) {
58
- if (typeof bin === 'string')
59
- entryPaths.add(bin);
60
- if (typeof bin === 'object')
61
- for (const id of Object.values(bin))
62
- entryPaths.add(id);
63
- }
57
+ if (typeof bin === 'string')
58
+ entryPaths.add(bin);
59
+ if (bin && typeof bin === 'object')
60
+ for (const id of Object.values(bin))
61
+ entryPaths.add(id);
62
+ if (typeof types === 'string')
63
+ entryPaths.add(types);
64
+ if (typeof typings === 'string')
65
+ entryPaths.add(typings);
64
66
  if (exports) {
65
67
  for (const item of getEntriesFromExports(exports)) {
66
68
  if (item === './*')
@@ -72,9 +74,19 @@ export const getEntryPathsFromManifest = (manifest) => {
72
74
  entryPaths.add(expanded);
73
75
  }
74
76
  }
75
- if (typeof types === 'string')
76
- entryPaths.add(types);
77
- if (typeof typings === 'string')
78
- entryPaths.add(typings);
79
77
  return entryPaths;
80
78
  };
79
+ export const getManifestImportDependencies = (manifest) => {
80
+ const dependencies = new Set();
81
+ if (!manifest.imports)
82
+ return dependencies;
83
+ for (const [entry, exportValue] of Object.entries(manifest.imports)) {
84
+ if (!entry.startsWith('#'))
85
+ continue;
86
+ for (const item of getEntriesFromExports(exportValue)) {
87
+ if (!item.startsWith('.') && !item.startsWith('!'))
88
+ dependencies.add(item);
89
+ }
90
+ }
91
+ return dependencies;
92
+ };
@@ -7,6 +7,8 @@ export const convertGitignoreToPicomatchIgnorePatterns = (pattern) => {
7
7
  pattern = pattern.slice(0, -1);
8
8
  if (pattern.startsWith('*/**/'))
9
9
  pattern = pattern.slice(5);
10
+ if (pattern === '*' || pattern === '**')
11
+ return { negated, patterns: [pattern, pattern] };
10
12
  if (pattern.startsWith('/'))
11
13
  pattern = pattern.slice(1);
12
14
  else if (!pattern.startsWith('**/'))
@@ -1,8 +1,8 @@
1
1
  import internalReporters from '../reporters/index.js';
2
2
  import { _load } from './loader.js';
3
- import { isInternal, resolve } from './path.js';
3
+ import { isAbsolute, isInternal, resolve } from './path.js';
4
4
  export const runPreprocessors = async (processors, data) => {
5
- const preprocessors = await Promise.all(processors.map(proc => _load(isInternal(proc) ? resolve(proc) : proc)));
5
+ const preprocessors = await Promise.all(processors.map(proc => _load(isInternal(proc) && !isAbsolute(proc) ? resolve(proc) : proc)));
6
6
  return preprocessors.length === 0
7
7
  ? Promise.resolve(data)
8
8
  : runPreprocessors(preprocessors.slice(1), preprocessors[0](data));
@@ -11,7 +11,7 @@ export const runReporters = async (reporter, options) => {
11
11
  const reporters = await Promise.all(reporter.map(async (reporter) => {
12
12
  return reporter in internalReporters
13
13
  ? internalReporters[reporter]
14
- : await _load(isInternal(reporter) ? resolve(reporter) : reporter);
14
+ : await _load(isInternal(reporter) && !isAbsolute(reporter) ? resolve(reporter) : reporter);
15
15
  }));
16
16
  for (const reporter of reporters)
17
17
  await reporter(options);
@@ -55,9 +55,7 @@ export class Table {
55
55
  this.rows.unshift(headerRow);
56
56
  }
57
57
  const columnWidths = columns.reduce((acc, col) => {
58
- acc[col] = Math.max(...this.rows.map(row => row[col]?.formatted
59
- ? stripVTControlCharacters(row[col].formatted).length
60
- : String(row[col]?.value || '').length));
58
+ acc[col] = Math.max(...this.rows.map(row => stripVTControlCharacters(row[col]?.formatted ?? String(row[col].value || '')).length));
61
59
  return acc;
62
60
  }, {});
63
61
  const separatorWidth = (columns.length - 1) * COLUMN_SEPARATOR.length;
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "5.62.0";
1
+ export declare const version = "5.63.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const version = '5.62.0';
1
+ export const version = '5.63.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "knip",
3
- "version": "5.62.0",
3
+ "version": "5.63.0",
4
4
  "description": "Find and fix unused dependencies, exports and files in your TypeScript and JavaScript projects",
5
5
  "homepage": "https://knip.dev",
6
6
  "repository": {
@@ -22,10 +22,6 @@
22
22
  {
23
23
  "type": "opencollective",
24
24
  "url": "https://opencollective.com/knip"
25
- },
26
- {
27
- "type": "polar",
28
- "url": "https://polar.sh/webpro-nl"
29
25
  }
30
26
  ],
31
27
  "main": "./dist/index.js",
@@ -63,14 +59,14 @@
63
59
  "dependencies": {
64
60
  "@nodelib/fs.walk": "^1.2.3",
65
61
  "fast-glob": "^3.3.3",
66
- "formatly": "^0.2.4",
67
- "jiti": "^2.4.2",
62
+ "formatly": "^0.3.0",
63
+ "jiti": "^2.5.1",
68
64
  "js-yaml": "^4.1.0",
69
65
  "minimist": "^1.2.8",
70
- "oxc-resolver": "^11.1.0",
66
+ "oxc-resolver": "^11.6.2",
71
67
  "picocolors": "^1.1.1",
72
68
  "picomatch": "^4.0.1",
73
- "smol-toml": "^1.3.4",
69
+ "smol-toml": "^1.4.1",
74
70
  "strip-json-comments": "5.0.2",
75
71
  "zod": "^3.22.4",
76
72
  "zod-validation-error": "^3.0.3"
@@ -82,17 +78,16 @@
82
78
  "devDependencies": {
83
79
  "@jest/types": "^29.6.3",
84
80
  "@release-it/bumper": "^7.0.5",
85
- "@types/bun": "1.2.15",
81
+ "@types/bun": "1.2.19",
86
82
  "@types/js-yaml": "^4.0.9",
87
83
  "@types/minimist": "^1.2.5",
88
84
  "@types/picomatch": "3.0.1",
89
85
  "@types/webpack": "^5.28.5",
90
- "@wdio/types": "^9.15.0",
86
+ "@wdio/types": "^9.16.2",
91
87
  "codeclimate-types": "^0.3.1",
92
88
  "glob": "^11.0.2",
93
- "release-it": "^19.0.3",
94
- "tsx": "^4.19.4",
95
- "type-fest": "^4.31.0",
89
+ "release-it": "^19.0.4",
90
+ "tsx": "^4.20.3",
96
91
  "typescript": "^5.5.2"
97
92
  },
98
93
  "engines": {
package/schema.json CHANGED
@@ -499,6 +499,10 @@
499
499
  "title": "node plugin configuration (https://knip.dev/reference/plugins/node)",
500
500
  "$ref": "#/definitions/plugin"
501
501
  },
502
+ "node-modules-inspector": {
503
+ "title": "node-modules-inspector plugin configuration (https://knip.dev/reference/plugins/node-modules-inspector)",
504
+ "$ref": "#/definitions/plugin"
505
+ },
502
506
  "node-test-runner": {
503
507
  "title": "node-test-runner plugin configuration (https://knip.dev/reference/plugins/node-test-runner)",
504
508
  "$ref": "#/definitions/plugin"
@@ -591,6 +595,10 @@
591
595
  "title": "rsbuild plugin configuration (https://knip.dev/reference/plugins/rsbuild)",
592
596
  "$ref": "#/definitions/plugin"
593
597
  },
598
+ "rslib": {
599
+ "title": "rslib plugin configuration (https://knip.dev/reference/plugins/rslib)",
600
+ "$ref": "#/definitions/plugin"
601
+ },
594
602
  "rspack": {
595
603
  "title": "rspack plugin configuration (https://knip.dev/reference/plugins/rspack)",
596
604
  "$ref": "#/definitions/plugin"