knip 5.63.0 → 5.64.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.
- package/dist/CacheConsultant.d.ts +3 -9
- package/dist/CacheConsultant.js +5 -5
- package/dist/ConfigurationChief.d.ts +597 -38
- package/dist/ConfigurationChief.js +33 -122
- package/dist/ConsoleStreamer.d.ts +2 -3
- package/dist/ConsoleStreamer.js +2 -2
- package/dist/DependencyDeputy.d.ts +2 -6
- package/dist/DependencyDeputy.js +3 -2
- package/dist/IssueCollector.d.ts +4 -12
- package/dist/IssueCollector.js +9 -9
- package/dist/IssueFixer.d.ts +3 -14
- package/dist/IssueFixer.js +14 -22
- package/dist/PrincipalFactory.d.ts +3 -2
- package/dist/PrincipalFactory.js +11 -11
- package/dist/ProjectPrincipal.d.ts +4 -3
- package/dist/ProjectPrincipal.js +8 -8
- package/dist/WorkspaceWorker.d.ts +4 -9
- package/dist/WorkspaceWorker.js +8 -12
- package/dist/binaries/bash-parser.d.ts +1 -0
- package/dist/binaries/bash-parser.js +4 -1
- package/dist/binaries/fallback.js +3 -2
- package/dist/binaries/package-manager/bun.js +1 -0
- package/dist/binaries/package-manager/pnpm.js +6 -1
- package/dist/binaries/plugins.js +3 -1
- package/dist/cli.js +43 -61
- package/dist/compilers/index.d.ts +34 -4
- package/dist/constants.js +2 -0
- package/dist/graph/analyze.d.ts +3 -8
- package/dist/graph/analyze.js +31 -31
- package/dist/graph/build.d.ts +3 -17
- package/dist/graph/build.js +49 -46
- package/dist/index.d.ts +3 -7
- package/dist/index.js +22 -62
- package/dist/plugins/angular/index.js +2 -3
- package/dist/plugins/bumpp/index.d.ts +8 -0
- package/dist/plugins/bumpp/index.js +11 -0
- package/dist/plugins/eslint/index.d.ts +7 -0
- package/dist/plugins/eslint/index.js +12 -0
- package/dist/plugins/glob/index.d.ts +0 -1
- package/dist/plugins/glob/index.js +0 -1
- package/dist/plugins/index.d.ts +24 -7
- package/dist/plugins/index.js +6 -0
- package/dist/plugins/karma/helpers.js +1 -1
- package/dist/plugins/node-modules-inspector/index.d.ts +0 -1
- package/dist/plugins/node-modules-inspector/index.js +0 -1
- package/dist/plugins/nuxt/index.js +10 -3
- package/dist/plugins/nuxt/types.d.ts +3 -2
- package/dist/plugins/oxlint/index.d.ts +0 -1
- package/dist/plugins/oxlint/index.js +0 -1
- package/dist/plugins/playwright/index.d.ts +0 -1
- package/dist/plugins/playwright/index.js +0 -1
- package/dist/plugins/playwright-test/index.d.ts +0 -1
- package/dist/plugins/playwright-test/index.js +0 -1
- package/dist/plugins/pnpm/index.d.ts +8 -0
- package/dist/plugins/pnpm/index.js +12 -0
- package/dist/plugins/prisma/index.d.ts +0 -1
- package/dist/plugins/prisma/index.js +0 -1
- package/dist/plugins/rsbuild/index.js +23 -6
- package/dist/plugins/rsbuild/types.d.ts +3 -0
- package/dist/plugins/rslib/index.js +1 -1
- package/dist/plugins/rstest/index.d.ts +10 -0
- package/dist/plugins/rstest/index.js +29 -0
- package/dist/plugins/rstest/types.d.ts +6 -0
- package/dist/plugins/ts-node/index.d.ts +0 -1
- package/dist/plugins/ts-node/index.js +0 -1
- package/dist/plugins.js +3 -2
- package/dist/reporters/codeclimate.d.ts +1 -1
- package/dist/reporters/codeclimate.js +10 -10
- package/dist/reporters/codeowners.d.ts +1 -1
- package/dist/reporters/codeowners.js +5 -5
- package/dist/reporters/compact.d.ts +1 -1
- package/dist/reporters/compact.js +7 -7
- package/dist/reporters/disclosure.d.ts +1 -1
- package/dist/reporters/disclosure.js +2 -2
- package/dist/reporters/githubActions.d.ts +3 -0
- package/dist/reporters/githubActions.js +94 -0
- package/dist/reporters/index.d.ts +7 -6
- package/dist/reporters/index.js +2 -0
- package/dist/reporters/json.d.ts +1 -1
- package/dist/reporters/json.js +4 -4
- package/dist/reporters/markdown.d.ts +1 -1
- package/dist/reporters/markdown.js +4 -4
- package/dist/reporters/symbols.js +1 -1
- package/dist/reporters/util/configuration-hints.d.ts +14 -2
- package/dist/reporters/util/configuration-hints.js +7 -7
- package/dist/reporters/util/util.d.ts +2 -2
- package/dist/reporters/util/util.js +4 -4
- package/dist/reporters/watch.d.ts +3 -4
- package/dist/reporters/watch.js +5 -5
- package/dist/schema/configuration.d.ts +176 -8
- package/dist/schema/plugins.d.ts +69 -0
- package/dist/schema/plugins.js +3 -0
- package/dist/types/PluginNames.d.ts +2 -2
- package/dist/types/PluginNames.js +3 -0
- package/dist/types/args.d.ts +2 -0
- package/dist/types/config.d.ts +4 -10
- package/dist/types/exports.d.ts +1 -1
- package/dist/types/imports.d.ts +1 -1
- package/dist/types/issues.d.ts +1 -2
- package/dist/types/module-graph.d.ts +5 -4
- package/dist/types/{cli.d.ts → options.d.ts} +2 -2
- package/dist/types/options.js +1 -0
- package/dist/types/package-json.d.ts +1 -0
- package/dist/types/project.d.ts +1 -7
- package/dist/typescript/SourceFile.d.ts +2 -2
- package/dist/typescript/ast-helpers.d.ts +4 -0
- package/dist/typescript/ast-helpers.js +29 -0
- package/dist/typescript/find-internal-references.js +10 -1
- package/dist/typescript/get-imports-and-exports.d.ts +2 -2
- package/dist/typescript/get-imports-and-exports.js +32 -23
- package/dist/typescript/visitors/dynamic-imports/importCall.js +6 -1
- package/dist/util/Performance.js +16 -6
- package/dist/util/cli-arguments.d.ts +3 -3
- package/dist/util/cli-arguments.js +4 -14
- package/dist/util/create-options.d.ts +1238 -0
- package/dist/util/create-options.js +112 -0
- package/dist/util/debug.js +3 -4
- package/dist/util/errors.d.ts +1 -1
- package/dist/util/file-entry-cache.js +3 -3
- package/dist/util/get-included-issue-types.d.ts +9 -13
- package/dist/util/get-included-issue-types.js +10 -16
- package/dist/util/get-referenced-inputs.js +1 -1
- package/dist/util/input.d.ts +1 -1
- package/dist/util/input.js +1 -1
- package/dist/util/is-identifier-referenced.d.ts +1 -1
- package/dist/util/is-identifier-referenced.js +2 -2
- package/dist/util/load-config.d.ts +2 -0
- package/dist/util/load-config.js +24 -0
- package/dist/util/modules.js +18 -7
- package/dist/util/path.d.ts +4 -4
- package/dist/util/path.js +5 -7
- package/dist/util/require.js +1 -2
- package/dist/util/tag.d.ts +1 -1
- package/dist/util/to-source-path.d.ts +1 -1
- package/dist/util/to-source-path.js +5 -5
- package/dist/util/trace.d.ts +6 -6
- package/dist/util/trace.js +18 -22
- package/dist/util/watch.d.ts +2 -5
- package/dist/util/watch.js +3 -3
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/schema.json +12 -0
- package/dist/util/unwrap-function.d.ts +0 -1
- package/dist/util/unwrap-function.js +0 -13
- /package/dist/{types/cli.js → plugins/rstest/types.js} +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { partitionCompilers } from '../compilers/index.js';
|
|
2
|
+
import { KNIP_CONFIG_LOCATIONS } from '../constants.js';
|
|
3
|
+
import { knipConfigurationSchema } from '../schema/configuration.js';
|
|
4
|
+
import { ConfigurationError } from './errors.js';
|
|
5
|
+
import { findFile, loadJSON } from './fs.js';
|
|
6
|
+
import { getIncludedIssueTypes, shorthandDeps, shorthandFiles, shorthandTypes } from './get-included-issue-types.js';
|
|
7
|
+
import { defaultRules } from './issue-initializers.js';
|
|
8
|
+
import { loadResolvedConfigFile } from './load-config.js';
|
|
9
|
+
import { _load } from './loader.js';
|
|
10
|
+
import { getKeysByValue } from './object.js';
|
|
11
|
+
import { isAbsolute, join, normalize, toAbsolute, toPosix } from './path.js';
|
|
12
|
+
import { splitTags } from './tag.js';
|
|
13
|
+
const pcwd = process.cwd();
|
|
14
|
+
export const createOptions = async (options) => {
|
|
15
|
+
const { parsedCLIArgs = {}, ...rest } = options;
|
|
16
|
+
const cwd = normalize(toPosix(toAbsolute(options.cwd ?? parsedCLIArgs.directory ?? pcwd, pcwd)));
|
|
17
|
+
const manifestPath = findFile(cwd, 'package.json');
|
|
18
|
+
const manifest = manifestPath && (await loadJSON(manifestPath));
|
|
19
|
+
if (!(manifestPath && manifest)) {
|
|
20
|
+
throw new ConfigurationError('Unable to find package.json');
|
|
21
|
+
}
|
|
22
|
+
let configFilePath;
|
|
23
|
+
for (const configPath of parsedCLIArgs.config ? [parsedCLIArgs.config] : KNIP_CONFIG_LOCATIONS) {
|
|
24
|
+
const resolvedConfigFilePath = isAbsolute(configPath) ? configPath : findFile(cwd, configPath);
|
|
25
|
+
if (resolvedConfigFilePath) {
|
|
26
|
+
configFilePath = resolvedConfigFilePath;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (parsedCLIArgs.config && !configFilePath && !manifest.knip) {
|
|
31
|
+
throw new ConfigurationError(`Unable to find ${parsedCLIArgs.config} or package.json#knip`);
|
|
32
|
+
}
|
|
33
|
+
const loadedConfig = Object.assign({}, manifest.knip, configFilePath ? await loadResolvedConfigFile(configFilePath, parsedCLIArgs) : {});
|
|
34
|
+
const parsedConfig = knipConfigurationSchema.parse(partitionCompilers(loadedConfig));
|
|
35
|
+
if (!configFilePath && manifest.knip)
|
|
36
|
+
configFilePath = manifestPath;
|
|
37
|
+
const pnpmWorkspacesPath = findFile(cwd, 'pnpm-workspace.yaml');
|
|
38
|
+
const pnpmWorkspaces = pnpmWorkspacesPath && (await _load(pnpmWorkspacesPath));
|
|
39
|
+
const workspaces = pnpmWorkspaces?.packages ??
|
|
40
|
+
(manifest.workspaces
|
|
41
|
+
? Array.isArray(manifest.workspaces)
|
|
42
|
+
? manifest.workspaces
|
|
43
|
+
: (manifest.workspaces.packages ?? [])
|
|
44
|
+
: []);
|
|
45
|
+
const isStrict = rest.isStrict ?? parsedCLIArgs.strict ?? false;
|
|
46
|
+
const isProduction = rest.isProduction ?? parsedCLIArgs.production ?? isStrict;
|
|
47
|
+
const rules = { ...defaultRules, ...parsedConfig.rules };
|
|
48
|
+
const excludesFromRules = getKeysByValue(rules, 'off');
|
|
49
|
+
const includedIssueTypes = getIncludedIssueTypes({
|
|
50
|
+
isProduction,
|
|
51
|
+
exclude: [...excludesFromRules, ...(parsedConfig.exclude ?? [])],
|
|
52
|
+
include: parsedConfig.include ?? [],
|
|
53
|
+
excludeOverrides: rest.excludedIssueTypes ?? parsedCLIArgs.exclude ?? [],
|
|
54
|
+
includeOverrides: [
|
|
55
|
+
...(rest.includedIssueTypes ?? parsedCLIArgs.include ?? []),
|
|
56
|
+
...(parsedCLIArgs.dependencies ? shorthandDeps : []),
|
|
57
|
+
...(parsedCLIArgs.exports ? shorthandTypes : []),
|
|
58
|
+
...(parsedCLIArgs.files ? shorthandFiles : []),
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
const fixTypes = rest.fixTypes ?? parsedCLIArgs['fix-type'] ?? [];
|
|
62
|
+
const isFixFiles = parsedCLIArgs['allow-remove-files'] && (fixTypes.length === 0 || fixTypes.includes('files'));
|
|
63
|
+
const isIncludeLibs = parsedCLIArgs['include-libs'] ?? rest.isIncludeLibs ?? false;
|
|
64
|
+
const isReportClassMembers = includedIssueTypes.classMembers;
|
|
65
|
+
const tags = splitTags(parsedCLIArgs.tags ?? rest.tags ?? parsedConfig.tags ?? parsedCLIArgs['experimental-tags'] ?? []);
|
|
66
|
+
return {
|
|
67
|
+
cacheLocation: parsedCLIArgs['cache-location'] ?? join(cwd, 'node_modules', '.cache', 'knip'),
|
|
68
|
+
config: parsedCLIArgs.config,
|
|
69
|
+
configFilePath,
|
|
70
|
+
cwd,
|
|
71
|
+
dependencies: parsedCLIArgs.dependencies ?? false,
|
|
72
|
+
experimentalTags: tags,
|
|
73
|
+
exports: parsedCLIArgs.exports ?? false,
|
|
74
|
+
files: parsedCLIArgs.files ?? false,
|
|
75
|
+
fixTypes,
|
|
76
|
+
gitignore: parsedCLIArgs['no-gitignore'] ? false : (rest.gitignore ?? true),
|
|
77
|
+
includedIssueTypes,
|
|
78
|
+
isCache: parsedCLIArgs.cache ?? false,
|
|
79
|
+
isDebug: parsedCLIArgs.debug ?? false,
|
|
80
|
+
isDisableConfigHints: parsedCLIArgs['no-config-hints'] || isProduction || Boolean(parsedCLIArgs.workspace),
|
|
81
|
+
isFix: parsedCLIArgs.fix ?? rest.isFix ?? false,
|
|
82
|
+
isFixDependencies: fixTypes.length === 0 || fixTypes.includes('dependencies'),
|
|
83
|
+
isFixFiles,
|
|
84
|
+
isFixUnusedExports: fixTypes.length === 0 || fixTypes.includes('exports'),
|
|
85
|
+
isFixUnusedTypes: fixTypes.length === 0 || fixTypes.includes('types'),
|
|
86
|
+
isFormat: parsedCLIArgs.format ?? rest.isFormat ?? false,
|
|
87
|
+
isIncludeEntryExports: parsedCLIArgs['include-entry-exports'] ?? rest.isIncludeEntryExports ?? false,
|
|
88
|
+
isIsolateWorkspaces: rest.isIsolateWorkspaces ?? parsedCLIArgs['isolate-workspaces'] ?? false,
|
|
89
|
+
isProduction,
|
|
90
|
+
isReportClassMembers,
|
|
91
|
+
isReportDependencies: includedIssueTypes.dependencies ||
|
|
92
|
+
includedIssueTypes.unlisted ||
|
|
93
|
+
includedIssueTypes.unresolved ||
|
|
94
|
+
includedIssueTypes.binaries,
|
|
95
|
+
isReportTypes: includedIssueTypes.types || includedIssueTypes.nsTypes || includedIssueTypes.enumMembers,
|
|
96
|
+
isReportValues: includedIssueTypes.exports || includedIssueTypes.nsExports || isReportClassMembers,
|
|
97
|
+
isShowProgress: parsedCLIArgs['no-progress'] === false && process.stdout.isTTY && typeof process.stdout.cursorTo === 'function',
|
|
98
|
+
isSkipLibs: !(isIncludeLibs || includedIssueTypes.classMembers),
|
|
99
|
+
isStrict,
|
|
100
|
+
isTrace: parsedCLIArgs.trace ?? false,
|
|
101
|
+
isTreatConfigHintsAsErrors: parsedCLIArgs['treat-config-hints-as-errors'] ?? parsedConfig.treatConfigHintsAsErrors ?? false,
|
|
102
|
+
isWatch: parsedCLIArgs.watch ?? rest.isWatch ?? false,
|
|
103
|
+
parsedConfig,
|
|
104
|
+
rules,
|
|
105
|
+
tags,
|
|
106
|
+
traceExport: parsedCLIArgs['trace-export'],
|
|
107
|
+
traceFile: parsedCLIArgs['trace-file'],
|
|
108
|
+
tsConfigFile: parsedCLIArgs.tsConfig,
|
|
109
|
+
workspace: rest.workspace ?? parsedCLIArgs.workspace,
|
|
110
|
+
workspaces,
|
|
111
|
+
};
|
|
112
|
+
};
|
package/dist/util/debug.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import util from 'node:util';
|
|
1
|
+
import util, { parseArgs } from 'node:util';
|
|
2
2
|
import picocolors from 'picocolors';
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const IS_DEBUG_ENABLED = debug ?? false;
|
|
3
|
+
const { values } = parseArgs({ strict: false, options: { debug: { type: 'boolean' } } });
|
|
4
|
+
const IS_DEBUG_ENABLED = values.debug ?? false;
|
|
6
5
|
const IS_COLORS = !process.env.NO_COLOR;
|
|
7
6
|
const noop = () => { };
|
|
8
7
|
const inspectOptions = { maxArrayLength: null, depth: null, colors: IS_COLORS };
|
package/dist/util/errors.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare class ConfigurationError extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class LoaderError extends Error {
|
|
8
8
|
}
|
|
9
|
-
export declare const isKnownError: (error: Error) => error is
|
|
9
|
+
export declare const isKnownError: (error: Error) => error is ZodError<any> | ConfigurationError | LoaderError;
|
|
10
10
|
export declare const isDisplayReason: (error: Error) => error is ErrorWithCause;
|
|
11
11
|
export declare const isConfigurationError: (error: Error) => error is ConfigurationError;
|
|
12
12
|
export declare const getKnownError: (error: Error) => Error;
|
|
@@ -4,7 +4,7 @@ import { deserialize, serialize } from 'node:v8';
|
|
|
4
4
|
import { timerify } from './Performance.js';
|
|
5
5
|
import { debugLog } from './debug.js';
|
|
6
6
|
import { isDirectory, isFile } from './fs.js';
|
|
7
|
-
import {
|
|
7
|
+
import { dirname, isAbsolute, resolve } from './path.js';
|
|
8
8
|
const createCache = (filePath) => {
|
|
9
9
|
try {
|
|
10
10
|
return deserialize(fs.readFileSync(filePath));
|
|
@@ -19,7 +19,7 @@ export class FileEntryCache {
|
|
|
19
19
|
cache = new Map();
|
|
20
20
|
normalizedEntries = new Map();
|
|
21
21
|
constructor(cacheId, _path) {
|
|
22
|
-
this.filePath =
|
|
22
|
+
this.filePath = path.resolve(_path, cacheId);
|
|
23
23
|
if (isFile(this.filePath))
|
|
24
24
|
this.cache = create(this.filePath);
|
|
25
25
|
this.removeNotFoundFiles();
|
|
@@ -72,7 +72,7 @@ export class FileEntryCache {
|
|
|
72
72
|
}
|
|
73
73
|
removeEntry(entryName) {
|
|
74
74
|
if (!isAbsolute(entryName))
|
|
75
|
-
entryName = resolve(
|
|
75
|
+
entryName = resolve(entryName);
|
|
76
76
|
this.normalizedEntries.delete(entryName);
|
|
77
77
|
this.cache.delete(entryName);
|
|
78
78
|
}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import type { Report } from '../types/issues.js';
|
|
2
|
-
|
|
3
|
-
includedIssueTypes: string[];
|
|
4
|
-
excludedIssueTypes: string[];
|
|
5
|
-
isDependenciesShorthand: boolean;
|
|
6
|
-
isExportsShorthand: boolean;
|
|
7
|
-
isFilesShorthand: boolean;
|
|
8
|
-
};
|
|
9
|
-
type Options = {
|
|
2
|
+
type GetIncludedIssueTypesOptions = {
|
|
10
3
|
isProduction?: boolean;
|
|
11
|
-
include
|
|
12
|
-
exclude
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
include: string[];
|
|
5
|
+
exclude: string[];
|
|
6
|
+
includeOverrides?: string[];
|
|
7
|
+
excludeOverrides?: string[];
|
|
15
8
|
};
|
|
16
9
|
export declare const defaultExcludedIssueTypes: string[];
|
|
17
|
-
export declare const
|
|
10
|
+
export declare const shorthandDeps: string[];
|
|
11
|
+
export declare const shorthandTypes: string[];
|
|
12
|
+
export declare const shorthandFiles: string[];
|
|
13
|
+
export declare const getIncludedIssueTypes: (options: GetIncludedIssueTypesOptions) => Report;
|
|
18
14
|
export {};
|
|
@@ -3,27 +3,21 @@ import { ConfigurationError } from './errors.js';
|
|
|
3
3
|
export const defaultExcludedIssueTypes = ['classMembers', 'nsExports', 'nsTypes'];
|
|
4
4
|
const defaultIssueTypes = ISSUE_TYPES.filter(type => !defaultExcludedIssueTypes.includes(type));
|
|
5
5
|
const normalize = (values) => values.flatMap(value => value.split(','));
|
|
6
|
-
export const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
export const shorthandDeps = ['dependencies', 'optionalPeerDependencies', 'unlisted', 'binaries', 'unresolved'];
|
|
7
|
+
export const shorthandTypes = ['types', 'nsTypes', 'enumMembers', 'duplicates'];
|
|
8
|
+
export const shorthandFiles = ['files'];
|
|
9
|
+
export const getIncludedIssueTypes = (options) => {
|
|
10
|
+
const incl = normalize(options.includeOverrides ?? []);
|
|
11
|
+
const excl = normalize(options.excludeOverrides ?? []);
|
|
12
|
+
for (const type of [...incl, ...excl, ...options.include, ...options.exclude]) {
|
|
10
13
|
if (!ISSUE_TYPES.includes(type))
|
|
11
14
|
throw new ConfigurationError(`Invalid issue type: ${type}`);
|
|
12
15
|
}
|
|
13
|
-
const excludes = exclude.filter(exclude => !incl.includes(exclude));
|
|
14
|
-
const includes = include.filter(include => !excl.includes(include));
|
|
15
|
-
if (cliArgs.isDependenciesShorthand) {
|
|
16
|
-
incl = [...incl, 'dependencies', 'optionalPeerDependencies', 'unlisted', 'binaries', 'unresolved'];
|
|
17
|
-
}
|
|
18
|
-
if (cliArgs.isExportsShorthand) {
|
|
19
|
-
incl = [...incl, 'exports', 'types', 'enumMembers', 'duplicates'];
|
|
20
|
-
}
|
|
21
|
-
if (cliArgs.isFilesShorthand) {
|
|
22
|
-
incl = [...incl, 'files'];
|
|
23
|
-
}
|
|
16
|
+
const excludes = options.exclude.filter(exclude => !incl.includes(exclude));
|
|
17
|
+
const includes = options.include.filter(include => !excl.includes(include));
|
|
24
18
|
const _include = [...incl, ...includes];
|
|
25
19
|
const _exclude = [...excl, ...excludes];
|
|
26
|
-
if (isProduction) {
|
|
20
|
+
if (options.isProduction) {
|
|
27
21
|
_exclude.push('devDependencies');
|
|
28
22
|
}
|
|
29
23
|
else {
|
|
@@ -83,7 +83,7 @@ export const getReferencedInputsHandler = (collector, deputy, chief, isGitIgnore
|
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
else {
|
|
86
|
-
debugLog(workspace.name, `Unable to resolve ${toDebugString(input)}`);
|
|
86
|
+
debugLog(workspace.name, `Unable to resolve ${toDebugString(input, chief.cwd)}`);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
};
|
package/dist/util/input.d.ts
CHANGED
|
@@ -54,5 +54,5 @@ export declare const toAlias: (specifier: string, prefix: string | string[], opt
|
|
|
54
54
|
export declare const isAlias: (input: Input) => input is AliasInput;
|
|
55
55
|
export declare const toIgnore: (specifier: string, issueType: IssueType) => IgnoreInput;
|
|
56
56
|
export declare const isIgnore: (input: Input) => input is IgnoreInput;
|
|
57
|
-
export declare const toDebugString: (input: Input) => string;
|
|
57
|
+
export declare const toDebugString: (input: Input, cwd: string) => string;
|
|
58
58
|
export {};
|
package/dist/util/input.js
CHANGED
|
@@ -67,4 +67,4 @@ export const toIgnore = (specifier, issueType) => ({
|
|
|
67
67
|
issueType,
|
|
68
68
|
});
|
|
69
69
|
export const isIgnore = (input) => input.type === 'ignore';
|
|
70
|
-
export const toDebugString = (input) => `${input.type}:${isAbsolute(input.specifier) ? toRelative(input.specifier) : input.specifier}${input.containingFilePath ? ` (${toRelative(input.containingFilePath)})` : ''}`;
|
|
70
|
+
export const toDebugString = (input, cwd) => `${input.type}:${isAbsolute(input.specifier) ? toRelative(input.specifier, cwd) : input.specifier}${input.containingFilePath ? ` (${toRelative(input.containingFilePath, cwd)})` : ''}`;
|
|
@@ -5,5 +5,5 @@ type Result = {
|
|
|
5
5
|
reExportingEntryFile: undefined | string;
|
|
6
6
|
traceNode: TraceNode;
|
|
7
7
|
};
|
|
8
|
-
export declare const getIsIdentifierReferencedHandler: (graph: ModuleGraph, entryPaths: Set<string
|
|
8
|
+
export declare const getIsIdentifierReferencedHandler: (graph: ModuleGraph, entryPaths: Set<string>, isTrace: boolean) => (filePath: string, id: string, isIncludeEntryExports?: boolean, traceNode?: TraceNode, seen?: Set<string>) => Result;
|
|
9
9
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMPORT_STAR } from '../constants.js';
|
|
2
|
-
import { addNodes, createNode
|
|
3
|
-
export const getIsIdentifierReferencedHandler = (graph, entryPaths) => {
|
|
2
|
+
import { addNodes, createNode } from './trace.js';
|
|
3
|
+
export const getIsIdentifierReferencedHandler = (graph, entryPaths, isTrace) => {
|
|
4
4
|
const isIdentifierReferenced = (filePath, id, isIncludeEntryExports = false, traceNode = createNode(filePath), seen = new Set()) => {
|
|
5
5
|
let isReferenced = false;
|
|
6
6
|
let reExportingEntryFile = entryPaths.has(filePath) ? filePath : undefined;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { debugLogObject } from './debug.js';
|
|
2
|
+
import { ConfigurationError } from './errors.js';
|
|
3
|
+
import { _load } from './loader.js';
|
|
4
|
+
const unwrapFunction = async (maybeFunction, options) => {
|
|
5
|
+
if (typeof maybeFunction === 'function') {
|
|
6
|
+
try {
|
|
7
|
+
return await maybeFunction(options);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
debugLogObject('*', 'Error executing function:', error);
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return maybeFunction;
|
|
15
|
+
};
|
|
16
|
+
export async function loadResolvedConfigFile(configPath, options) {
|
|
17
|
+
const loadedValue = await _load(configPath);
|
|
18
|
+
try {
|
|
19
|
+
return await unwrapFunction(loadedValue, options);
|
|
20
|
+
}
|
|
21
|
+
catch (_error) {
|
|
22
|
+
throw new ConfigurationError(`Error running the function from ${configPath}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
package/dist/util/modules.js
CHANGED
|
@@ -38,13 +38,24 @@ export const getPackageFromDefinitelyTyped = (typedDependency) => {
|
|
|
38
38
|
}
|
|
39
39
|
return typedDependency;
|
|
40
40
|
};
|
|
41
|
-
const matchDirectives = /^([?!|-]+)?([^!?:]+).*/;
|
|
42
41
|
export const sanitizeSpecifier = (specifier) => {
|
|
43
|
-
if (isBuiltin(specifier))
|
|
42
|
+
if (isBuiltin(specifier) || isAbsolute(specifier) || specifier.startsWith(PROTOCOL_VIRTUAL))
|
|
44
43
|
return specifier;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
let s = specifier;
|
|
45
|
+
let end = s.length;
|
|
46
|
+
let i = 0;
|
|
47
|
+
while (i < s.length && (s[i] === '!' || s[i] === '-'))
|
|
48
|
+
i++;
|
|
49
|
+
s = s.substring(i);
|
|
50
|
+
for (let j = 0; j < s.length; j++) {
|
|
51
|
+
const char = s[j];
|
|
52
|
+
if (char === '!' || char === '?' || (char === '#' && j > 0)) {
|
|
53
|
+
end = j;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
s = s.substring(0, end);
|
|
58
|
+
if (s.includes(':') && !s.includes('/'))
|
|
59
|
+
s = s.split(':')[0];
|
|
60
|
+
return s;
|
|
50
61
|
};
|
package/dist/util/path.d.ts
CHANGED
|
@@ -4,10 +4,10 @@ export declare const extname: (path: string) => string;
|
|
|
4
4
|
export declare const basename: (path: string, suffix?: string) => string;
|
|
5
5
|
export declare const join: (...paths: string[]) => string;
|
|
6
6
|
export declare const toPosix: (value: string) => string;
|
|
7
|
-
export declare const cwd: string;
|
|
8
7
|
export declare const resolve: (...paths: string[]) => string;
|
|
9
|
-
export declare const relative: (from: string, to
|
|
8
|
+
export declare const relative: (from: string, to: string) => string;
|
|
10
9
|
export declare const isInNodeModules: (filePath: string) => boolean;
|
|
11
|
-
export declare const toAbsolute: (id: string, base
|
|
12
|
-
export declare const toRelative: (id: string) => string;
|
|
10
|
+
export declare const toAbsolute: (id: string, base: string) => string;
|
|
11
|
+
export declare const toRelative: (id: string, base: string) => string;
|
|
13
12
|
export declare const isInternal: (id: string) => boolean;
|
|
13
|
+
export declare const normalize: (path: string) => string;
|
package/dist/util/path.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import parsedArgValues from './cli-arguments.js';
|
|
3
|
-
const { directory } = parsedArgValues;
|
|
4
2
|
export const isAbsolute = path.isAbsolute;
|
|
5
3
|
export const dirname = path.posix.dirname;
|
|
6
4
|
export const extname = path.posix.extname;
|
|
7
5
|
export const basename = path.posix.basename;
|
|
8
6
|
export const join = path.posix.join;
|
|
9
7
|
export const toPosix = (value) => value.split(path.sep).join(path.posix.sep);
|
|
10
|
-
export const
|
|
11
|
-
export const
|
|
12
|
-
export const relative = (from, to) => toPosix(path.relative(to ? from : cwd, to ?? from));
|
|
8
|
+
export const resolve = path.posix.resolve;
|
|
9
|
+
export const relative = (from, to) => toPosix(path.relative(from, to));
|
|
13
10
|
export const isInNodeModules = (filePath) => filePath.includes('node_modules');
|
|
14
|
-
export const toAbsolute = (id, base
|
|
15
|
-
export const toRelative = (id) => (isAbsolute(id) ? relative(id) : id);
|
|
11
|
+
export const toAbsolute = (id, base) => (isAbsolute(id) ? id : join(base, id));
|
|
12
|
+
export const toRelative = (id, base) => (isAbsolute(id) ? relative(base, id) : id);
|
|
16
13
|
export const isInternal = (id) => (id.startsWith('.') || isAbsolute(id)) && !isInNodeModules(id);
|
|
14
|
+
export const normalize = path.posix.normalize;
|
package/dist/util/require.js
CHANGED
package/dist/util/tag.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Tags } from '../types/
|
|
1
|
+
import type { Tags } from '../types/options.js';
|
|
2
2
|
export declare const splitTags: (rawTags: string[]) => Tags;
|
|
3
3
|
export declare const shouldIgnore: (jsDocTags: Set<string>, tags: Tags) => boolean;
|
|
4
4
|
export declare const getShouldIgnoreHandler: (isProduction: boolean) => (jsDocTags: Set<string>) => boolean;
|
|
@@ -2,5 +2,5 @@ import type { CompilerOptions } from 'typescript';
|
|
|
2
2
|
import type { ConfigurationChief, Workspace } from '../ConfigurationChief.js';
|
|
3
3
|
export declare const augmentWorkspace: (workspace: Workspace, dir: string, compilerOptions: CompilerOptions) => void;
|
|
4
4
|
export declare const getToSourcePathHandler: (chief: ConfigurationChief) => (filePath: string) => string | undefined;
|
|
5
|
-
export declare const getToSourcePathsHandler: (chief: ConfigurationChief) => (specifiers: Set<string>,
|
|
5
|
+
export declare const getToSourcePathsHandler: (chief: ConfigurationChief) => (specifiers: Set<string>, dir: string, extensions?: string) => Promise<string[]>;
|
|
6
6
|
export type ToSourceFilePath = ReturnType<typeof getToSourcePathHandler>;
|
|
@@ -27,7 +27,7 @@ export const getToSourcePathHandler = (chief) => {
|
|
|
27
27
|
const srcFilePath = _syncGlob({ patterns: pattern })[0];
|
|
28
28
|
toSourceMapCache.set(filePath, srcFilePath);
|
|
29
29
|
if (srcFilePath && srcFilePath !== filePath) {
|
|
30
|
-
debugLog('*', `Source mapping ${toRelative(filePath)} → ${toRelative(srcFilePath)}`);
|
|
30
|
+
debugLog('*', `Source mapping ${toRelative(filePath, chief.cwd)} → ${toRelative(srcFilePath, chief.cwd)}`);
|
|
31
31
|
return srcFilePath;
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -35,10 +35,10 @@ export const getToSourcePathHandler = (chief) => {
|
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
export const getToSourcePathsHandler = (chief) => {
|
|
38
|
-
return async (specifiers,
|
|
38
|
+
return async (specifiers, dir, extensions = defaultExtensions) => {
|
|
39
39
|
const patterns = new Set();
|
|
40
40
|
for (const specifier of specifiers) {
|
|
41
|
-
const absSpecifier = isAbsolute(specifier) ? specifier : join(
|
|
41
|
+
const absSpecifier = isAbsolute(specifier) ? specifier : join(dir, specifier);
|
|
42
42
|
const ws = chief.findWorkspaceByFilePath(absSpecifier);
|
|
43
43
|
if (ws?.srcDir && ws.outDir && !absSpecifier.startsWith(ws.srcDir) && absSpecifier.startsWith(ws.outDir)) {
|
|
44
44
|
const pattern = absSpecifier.replace(ws.outDir, ws.srcDir).replace(matchExt, extensions);
|
|
@@ -48,8 +48,8 @@ export const getToSourcePathsHandler = (chief) => {
|
|
|
48
48
|
patterns.add(absSpecifier);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
const filePaths = await _glob({ patterns: Array.from(patterns), cwd });
|
|
52
|
-
debugLogArray(toRelative(cwd), 'Source mapping (package.json)', filePaths);
|
|
51
|
+
const filePaths = await _glob({ patterns: Array.from(patterns), cwd: dir });
|
|
52
|
+
debugLogArray(toRelative(dir, chief.cwd), 'Source mapping (package.json)', filePaths);
|
|
53
53
|
return filePaths;
|
|
54
54
|
};
|
|
55
55
|
};
|
package/dist/util/trace.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ModuleGraph } from '../types/module-graph.js';
|
|
2
|
-
|
|
3
|
-
type
|
|
2
|
+
import type { MainOptions } from './create-options.js';
|
|
3
|
+
type CreateNodeOpts = {
|
|
4
4
|
identifier?: string;
|
|
5
5
|
hasRef?: boolean;
|
|
6
6
|
isEntry?: boolean;
|
|
7
7
|
};
|
|
8
|
-
type Create = (filePath: string, options?:
|
|
8
|
+
type Create = (filePath: string, options?: CreateNodeOpts) => TraceNode;
|
|
9
9
|
export type TraceNode = {
|
|
10
10
|
filePath: string;
|
|
11
11
|
identifier?: string;
|
|
@@ -13,8 +13,8 @@ export type TraceNode = {
|
|
|
13
13
|
isEntry: boolean;
|
|
14
14
|
children: Set<TraceNode>;
|
|
15
15
|
};
|
|
16
|
-
export
|
|
17
|
-
export declare const printTrace: (node: TraceNode, filePath: string, identifier?: string) => void;
|
|
16
|
+
export declare const printTrace: (node: TraceNode, filePath: string, options: MainOptions, identifier?: string) => void;
|
|
18
17
|
export declare const createNode: Create;
|
|
19
18
|
export declare const addNodes: (node: TraceNode, id: string, importedSymbols: ModuleGraph, filePaths?: Set<string>) => void;
|
|
20
|
-
export declare const createAndPrintTrace: (filePath: string, options?:
|
|
19
|
+
export declare const createAndPrintTrace: (filePath: string, options: MainOptions, opts?: CreateNodeOpts) => void;
|
|
20
|
+
export {};
|
package/dist/util/trace.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import picocolors from 'picocolors';
|
|
2
|
-
import parsedArgValues from './cli-arguments.js';
|
|
3
2
|
import { toAbsolute, toRelative } from './path.js';
|
|
4
3
|
const IS_ENTRY = ' ◯';
|
|
5
4
|
const HAS_REF = ' ✓';
|
|
6
5
|
const HAS_NO_REF = ' x';
|
|
7
|
-
const { 'trace-export': traceExport, 'trace-file': traceFile, trace } = parsedArgValues;
|
|
8
|
-
const isTrace = Boolean(trace || traceExport || traceFile);
|
|
9
|
-
export { isTrace };
|
|
10
6
|
const getPadding = (level, levels) => {
|
|
11
7
|
let padding = '';
|
|
12
8
|
for (let i = 0; i < level; i++)
|
|
@@ -20,7 +16,7 @@ const renderTrace = (node, level = 0, levels = new Set()) => {
|
|
|
20
16
|
for (const child of node.children) {
|
|
21
17
|
const isLast = ++index === size;
|
|
22
18
|
const hasRef = child.hasRef === true;
|
|
23
|
-
const rel =
|
|
19
|
+
const rel = child.filePath;
|
|
24
20
|
const file = hasRef ? rel : picocolors.dim(rel);
|
|
25
21
|
const suffix = (hasRef ? HAS_REF : '') + (child.isEntry ? IS_ENTRY : '');
|
|
26
22
|
const text = `${padding}${picocolors.dim(isLast ? '└─' : '├─')} ${file}${suffix}`;
|
|
@@ -34,19 +30,19 @@ const renderTrace = (node, level = 0, levels = new Set()) => {
|
|
|
34
30
|
}
|
|
35
31
|
}
|
|
36
32
|
};
|
|
37
|
-
export const printTrace =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
33
|
+
export const printTrace = (node, filePath, options, identifier) => {
|
|
34
|
+
if (!options.isTrace)
|
|
35
|
+
return;
|
|
36
|
+
if (options.traceExport && identifier && identifier !== options.traceExport)
|
|
37
|
+
return;
|
|
38
|
+
if (options.traceFile && filePath !== toAbsolute(options.traceFile, options.cwd))
|
|
39
|
+
return;
|
|
40
|
+
const suffix = (node.isEntry ? IS_ENTRY : '') + (node.children.size === 0 ? HAS_NO_REF : '');
|
|
41
|
+
const header = `${toRelative(filePath, options.cwd)}${identifier ? `:${identifier}` : ''}${suffix}`;
|
|
42
|
+
console.log(header);
|
|
43
|
+
renderTrace(node);
|
|
44
|
+
console.log();
|
|
45
|
+
};
|
|
50
46
|
export const createNode = (filePath, { hasRef = false, isEntry = false, identifier } = {}) => ({
|
|
51
47
|
filePath,
|
|
52
48
|
identifier,
|
|
@@ -66,9 +62,9 @@ export const addNodes = (node, id, importedSymbols, filePaths) => {
|
|
|
66
62
|
addNode(node, filePath, { hasRef: Boolean(importedSymbols.get(filePath)?.traceRefs?.has(id)) });
|
|
67
63
|
}
|
|
68
64
|
};
|
|
69
|
-
export const createAndPrintTrace = (filePath, options = {}) => {
|
|
70
|
-
if (!isTrace
|
|
65
|
+
export const createAndPrintTrace = (filePath, options, opts = {}) => {
|
|
66
|
+
if (!options.isTrace)
|
|
71
67
|
return;
|
|
72
|
-
const traceNode = createNode(filePath,
|
|
73
|
-
printTrace(traceNode, filePath, options.identifier);
|
|
68
|
+
const traceNode = createNode(filePath, opts);
|
|
69
|
+
printTrace(traceNode, filePath, options, opts.identifier);
|
|
74
70
|
};
|
package/dist/util/watch.d.ts
CHANGED
|
@@ -4,22 +4,19 @@ import type { ConsoleStreamer } from '../ConsoleStreamer.js';
|
|
|
4
4
|
import type { IssueCollector } from '../IssueCollector.js';
|
|
5
5
|
import type { PrincipalFactory } from '../PrincipalFactory.js';
|
|
6
6
|
import type { ProjectPrincipal } from '../ProjectPrincipal.js';
|
|
7
|
-
import type { Report } from '../types/issues.js';
|
|
8
7
|
import type { ModuleGraph } from '../types/module-graph.js';
|
|
8
|
+
import type { MainOptions } from './create-options.js';
|
|
9
9
|
type Watch = {
|
|
10
10
|
analyzedFiles: Set<string>;
|
|
11
11
|
analyzeSourceFile: (filePath: string, principal: ProjectPrincipal) => void;
|
|
12
12
|
chief: ConfigurationChief;
|
|
13
13
|
collector: IssueCollector;
|
|
14
14
|
analyze: () => Promise<void>;
|
|
15
|
-
cwd: string;
|
|
16
15
|
factory: PrincipalFactory;
|
|
17
16
|
graph: ModuleGraph;
|
|
18
|
-
isDebug: boolean;
|
|
19
17
|
isIgnored: (path: string) => boolean;
|
|
20
|
-
report: Report;
|
|
21
18
|
streamer: ConsoleStreamer;
|
|
22
19
|
unreferencedFiles: Set<string>;
|
|
23
20
|
};
|
|
24
|
-
export declare const getWatchHandler: ({ analyzedFiles, analyzeSourceFile, chief, collector, analyze,
|
|
21
|
+
export declare const getWatchHandler: (options: MainOptions, { analyzedFiles, analyzeSourceFile, chief, collector, analyze, factory, graph, isIgnored, streamer, unreferencedFiles, }: Watch) => Promise<WatchListener<string | Buffer<ArrayBufferLike>>>;
|
|
25
22
|
export {};
|
package/dist/util/watch.js
CHANGED
|
@@ -3,16 +3,16 @@ import { debugLog } from './debug.js';
|
|
|
3
3
|
import { isFile } from './fs.js';
|
|
4
4
|
import { updateImportMap } from './module-graph.js';
|
|
5
5
|
import { join, toPosix } from './path.js';
|
|
6
|
-
export const getWatchHandler = async ({ analyzedFiles, analyzeSourceFile, chief, collector, analyze,
|
|
6
|
+
export const getWatchHandler = async (options, { analyzedFiles, analyzeSourceFile, chief, collector, analyze, factory, graph, isIgnored, streamer, unreferencedFiles, }) => {
|
|
7
7
|
const reportIssues = async (startTime) => {
|
|
8
8
|
const { issues } = collector.getIssues();
|
|
9
|
-
watchReporter({
|
|
9
|
+
watchReporter(options, { issues, streamer, startTime, size: analyzedFiles.size });
|
|
10
10
|
};
|
|
11
11
|
const listener = async (eventType, filename) => {
|
|
12
12
|
debugLog('*', `(raw) ${eventType} ${filename}`);
|
|
13
13
|
if (typeof filename === 'string') {
|
|
14
14
|
const startTime = performance.now();
|
|
15
|
-
const filePath = join(cwd, toPosix(filename));
|
|
15
|
+
const filePath = join(options.cwd, toPosix(filename));
|
|
16
16
|
if (isIgnored(filePath)) {
|
|
17
17
|
debugLog('*', `ignoring ${eventType} ${filename}`);
|
|
18
18
|
return;
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "5.
|
|
1
|
+
export declare const version = "5.64.0";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.
|
|
1
|
+
export const version = '5.64.0';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "knip",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.64.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": {
|
|
@@ -63,12 +63,12 @@
|
|
|
63
63
|
"jiti": "^2.5.1",
|
|
64
64
|
"js-yaml": "^4.1.0",
|
|
65
65
|
"minimist": "^1.2.8",
|
|
66
|
-
"oxc-resolver": "^11.
|
|
66
|
+
"oxc-resolver": "^11.8.2",
|
|
67
67
|
"picocolors": "^1.1.1",
|
|
68
68
|
"picomatch": "^4.0.1",
|
|
69
69
|
"smol-toml": "^1.4.1",
|
|
70
70
|
"strip-json-comments": "5.0.2",
|
|
71
|
-
"zod": "^3.
|
|
71
|
+
"zod": "^3.25.0",
|
|
72
72
|
"zod-validation-error": "^3.0.3"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"@wdio/types": "^9.16.2",
|
|
87
87
|
"codeclimate-types": "^0.3.1",
|
|
88
88
|
"glob": "^11.0.2",
|
|
89
|
-
"release-it": "^19.0.
|
|
89
|
+
"release-it": "^19.0.5",
|
|
90
90
|
"tsx": "^4.20.3",
|
|
91
91
|
"typescript": "^5.5.2"
|
|
92
92
|
},
|