diff --git a/src/extract/resolve/module-classifiers.mjs b/src/extract/resolve/module-classifiers.mjs index c2aee3803..1c52450ae 100644 --- a/src/extract/resolve/module-classifiers.mjs +++ b/src/extract/resolve/module-classifiers.mjs @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { isAbsolute, resolve as path_resolve } from "node:path"; import { join as posix_join } from "node:path/posix"; import { isMatch } from "picomatch"; @@ -219,6 +220,8 @@ function stripIndex(pModulePath) { * * https://www.typescriptlang.org/docs/handbook/modules/reference.html#baseurl * + * Assumes the pModuleName is not relative. + * * @param {string} pModuleName * @param {string} pResolvedModuleName * @param {string} pTSConfigBaseURL @@ -228,7 +231,13 @@ function matchesTSConfigBaseURL( pResolvedModuleName, pTSConfigBaseURL, ) { - if (!pTSConfigBaseURL) { + // the pModuleName === pResolvedModuleName check is there to prevent + // false positives for core modules ('fs' resolved === 'fs') and modules that + // we couldn't resolve at all (e.g. 'this/does/not/exist' => 'this/does/not/exist') + // + // we could also check whether the moduleName is relative, but that's + // not efficient as that was already done before this function was called. + if (!pTSConfigBaseURL || pModuleName === pResolvedModuleName) { return false; } // "If baseUrl is set, TypeScript will resolve non-relative module names diff --git a/test/extract/resolve/module-classifiers.get-alias-types.spec.mjs b/test/extract/resolve/module-classifiers.get-alias-types.spec.mjs index 449f577fb..09dea134b 100644 --- a/test/extract/resolve/module-classifiers.get-alias-types.spec.mjs +++ b/test/extract/resolve/module-classifiers.get-alias-types.spec.mjs @@ -286,7 +286,7 @@ describe("[I] extract/resolve/module-classifiers - getAliasTypes", () => { ); }); - it("should return aliased and aliased-tsconfig for tsconfig alias", () => { + it("should return aliased, aliased-tsconfig and aliased-tsconfig-paths for tsconfig paths", () => { const lManifest = { name: "test", version: "1.0.0", @@ -312,4 +312,51 @@ describe("[I] extract/resolve/module-classifiers - getAliasTypes", () => { ["aliased", "aliased-tsconfig", "aliased-tsconfig-paths"], ); }); + + it("should return aliased, aliased-tsconfig and aliased-tsconfig-base-url when it matches tsconfig base urls", () => { + const lManifest = { + name: "test", + version: "1.0.0", + dependencies: {}, + }; + const lTranspileOptions = { + tsConfig: { + options: { + baseUrl: "./src", + paths: { + "@tsconfig/*": ["./something-else/*"], + }, + }, + }, + }; + deepEqual( + getAliasTypes( + "package", + "src/package/index.js", + {}, + lManifest, + lTranspileOptions, + ), + ["aliased", "aliased-tsconfig", "aliased-tsconfig-base-url"], + ); + }); + + it("should NOT return aliased, aliased-tsconfig and aliased-tsconfig-base-url when it's a core module", () => { + const lManifest = { + name: "test", + version: "1.0.0", + dependencies: {}, + }; + const lTranspileOptions = { + tsConfig: { + options: { + baseUrl: "./", + paths: { + "@tsconfig/*": ["./something-else/*"], + }, + }, + }, + }; + deepEqual(getAliasTypes("fs", "fs", {}, lManifest, lTranspileOptions), []); + }); });