From a269b0c793ac45127468ba65291b330ff24338ac Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Thu, 11 Jul 2024 12:40:18 +0200 Subject: [PATCH] Support subpath import with arbitrary extensions Stop reporting unresolved filesfor subpath imports with arbitrary extensions (e.g. `import "#src/foo.ext"`). This already worked for path mappings defined in `tsconfig.json` but now it also works for mappings defined in `package.json`. The implementation drops `tsconfig-paths` and reverts back to using virtual declaration files, albeit much simpler. --- bun.lockb | Bin 388968 -> 388504 bytes .../fixtures/subpath-patterns/package.json | 4 +- .../fixtures/subpath-patterns/src/entry.ts | 2 + .../subpath-patterns/src/internals/used.alt | 0 .../subpath-patterns/src/internals/used.ext | 1 + packages/knip/package.json | 1 - .../knip/src/typescript/resolveModuleNames.ts | 80 ++++++++++++------ 7 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 packages/knip/fixtures/subpath-patterns/src/internals/used.alt create mode 100644 packages/knip/fixtures/subpath-patterns/src/internals/used.ext diff --git a/bun.lockb b/bun.lockb index 8a4805ad8347540ca14005509e62df74b9ee7b83..0a565db65e6ea13f688dbe4d90b39d9b94b5c947 100755 GIT binary patch delta 67839 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 delta 67824 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 gjpL%|u-fK5@@3UcM&~nYee)ab%7 diff --git a/packages/knip/fixtures/subpath-patterns/package.json b/packages/knip/fixtures/subpath-patterns/package.json index 1092b9902..8d0cec4e2 100644 --- a/packages/knip/fixtures/subpath-patterns/package.json +++ b/packages/knip/fixtures/subpath-patterns/package.json @@ -1,6 +1,8 @@ { "name": "my-package", "imports": { - "#internals/*": "./src/internals/*.ts" + "#internals/*": "./src/internals/*.ts", + "#internals-explicit-ext/*": "./src/internals/*", + "#internals-alias/used.alt": "./src/internals/used.alt" } } diff --git a/packages/knip/fixtures/subpath-patterns/src/entry.ts b/packages/knip/fixtures/subpath-patterns/src/entry.ts index 59e56df9c..c53a0026f 100644 --- a/packages/knip/fixtures/subpath-patterns/src/entry.ts +++ b/packages/knip/fixtures/subpath-patterns/src/entry.ts @@ -1,2 +1,4 @@ import used from '#internals/used'; +import '#internals-explicit-ext/used.ext'; +import '#internals-alias/used.alt'; used; diff --git a/packages/knip/fixtures/subpath-patterns/src/internals/used.alt b/packages/knip/fixtures/subpath-patterns/src/internals/used.alt new file mode 100644 index 000000000..e69de29bb diff --git a/packages/knip/fixtures/subpath-patterns/src/internals/used.ext b/packages/knip/fixtures/subpath-patterns/src/internals/used.ext new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/packages/knip/fixtures/subpath-patterns/src/internals/used.ext @@ -0,0 +1 @@ + diff --git a/packages/knip/package.json b/packages/knip/package.json index bd73fb664..b534edbc5 100644 --- a/packages/knip/package.json +++ b/packages/knip/package.json @@ -75,7 +75,6 @@ "smol-toml": "^1.1.4", "strip-json-comments": "5.0.1", "summary": "2.1.0", - "tsconfig-paths": "^4.2.0", "zod": "^3.22.4", "zod-validation-error": "^3.0.3" }, diff --git a/packages/knip/src/typescript/resolveModuleNames.ts b/packages/knip/src/typescript/resolveModuleNames.ts index f756da846..93e6c1568 100644 --- a/packages/knip/src/typescript/resolveModuleNames.ts +++ b/packages/knip/src/typescript/resolveModuleNames.ts @@ -1,11 +1,10 @@ import { existsSync } from 'node:fs'; import { isBuiltin } from 'node:module'; -import { createMatchPath } from 'tsconfig-paths'; import ts from 'typescript'; import { DEFAULT_EXTENSIONS } from '../constants.js'; import { timerify } from '../util/Performance.js'; import { sanitizeSpecifier } from '../util/modules.js'; -import { dirname, extname, isAbsolute, isInNodeModules, join, toPosix } from '../util/path.js'; +import { dirname, extname, isAbsolute, isInNodeModules, join } from '../util/path.js'; import { resolveSync } from '../util/resolve.js'; import type { ToSourceFilePath } from '../util/to-source-path.js'; import { isDeclarationFileExtension } from './ast-helpers.js'; @@ -35,6 +34,32 @@ export function createCustomModuleResolver( const customCompilerExtensionsSet = new Set(customCompilerExtensions); const extensions = [...DEFAULT_EXTENSIONS, ...customCompilerExtensions]; + const virtualDeclarationFiles = new Map(); + + const tsSys: ts.System = { + ...ts.sys, + // We trick TypeScript into resolving paths with arbitrary extensions. When + // a module "./module.ext" is imported TypeScript only tries to resolve it to + // "./module.d.ext.ts". TypeScript never checks whether "./module.ext" itself exists. + // So, if TypeScript checks whether "./module.d.ext.ts" exists and the file + // does not exist we can assume the compiler wants to resolve `./module.ext`. + // If the latter exists we return true and record this fact in + // `virtualDeclarationFiles`. + fileExists(path: string) { + if (ts.sys.fileExists(path)) { + return true; + } + + const original = originalFromDeclarationPath(path); + if (original && ts.sys.fileExists(original.path)) { + virtualDeclarationFiles.set(path, original); + return true; + } + + return false; + }, + }; + function resolveModuleNames(moduleNames: string[], containingFile: string): Array { return moduleNames.map(moduleName => { if (!useCache) return resolveModuleName(moduleName, containingFile); @@ -54,13 +79,6 @@ export function createCustomModuleResolver( }); } - const tsMatchPath = createMatchPath( - // If `baseUrl` is undefined we have already modified `paths` so that all - // entries are absolute. See `mergePaths` in `src/PrincipalFactory.ts`. - compilerOptions.baseUrl ?? '/', - compilerOptions.paths || {} - ); - /** * - Virtual files have built-in or custom compiler, return as JS * - Foreign files have path resolved verbatim (file manager will return empty source file) @@ -97,29 +115,11 @@ export function createCustomModuleResolver( }; } - const pathMappedFileName = tsMatchPath( - sanitizedSpecifier, - undefined, - undefined, - // Leave extensions empty and let `ts.resolveModuleName()` handle that. - // `tsMatchPath` will strip extensions from the returned specifier which - // means we don’t get the actual file path. - [] - ); - if (pathMappedFileName) { - const ext = extname(pathMappedFileName); - return { - resolvedFileName: toPosix(pathMappedFileName), - extension: customCompilerExtensionsSet.has(ext) ? ts.Extension.Js : ext, - isExternalLibraryImport: false, - }; - } - const tsResolvedModule = ts.resolveModuleName( sanitizedSpecifier, containingFile, compilerOptions, - ts.sys + tsSys ).resolvedModule; if (tsResolvedModule) { @@ -135,6 +135,14 @@ export function createCustomModuleResolver( }; } } + const original = virtualDeclarationFiles.get(tsResolvedModule.resolvedFileName); + if (original) { + return { + ...tsResolvedModule, + resolvedFileName: original.path, + extension: customCompilerExtensionsSet.has(original.ext) ? ts.Extension.Js : original.ext, + }; + } return tsResolvedModule; } @@ -147,3 +155,19 @@ export function createCustomModuleResolver( return timerify(resolveModuleNames); } + +const declarationPathRe = /^(.*)\.d(\.[^.]+)\.ts$/; + +/** + * For paths that look like `.../module.d.yyy.ts` returns path `.../module.yyy` and + * ext `yyy`. + */ +function originalFromDeclarationPath(path: string): { path: string; ext: string } | undefined { + const match = declarationPathRe.exec(path); + if (match) { + return { + path: match[1] + match[2], + ext: match[2], + }; + } +}