diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 85a1353e939cf..ef8ba8c0cafd5 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -2703,7 +2703,7 @@ function loadModuleFromImportsOrExports(extensions: Extensions, state: ModuleRes const target = (lookupTable as { [idx: string]: unknown; })[moduleName]; return loadModuleFromTargetImportOrExport(target, /*subpath*/ "", /*pattern*/ false, moduleName); } - const expandingKeys = sort(filter(getOwnKeys(lookupTable as MapLike), k => k.includes("*") || endsWith(k, "/")), comparePatternKeys); + const expandingKeys = sort(filter(getOwnKeys(lookupTable as MapLike), k => hasOneAsterisk(k) || endsWith(k, "/")), comparePatternKeys); for (const potentialTarget of expandingKeys) { if (state.features & NodeResolutionFeatures.ExportsPatternTrailers && matchesPatternWithTrailer(potentialTarget, moduleName)) { const target = (lookupTable as { [idx: string]: unknown; })[potentialTarget]; @@ -2731,6 +2731,11 @@ function loadModuleFromImportsOrExports(extensions: Extensions, state: ModuleRes } } +function hasOneAsterisk(patternKey: string): boolean { + const firstStar = patternKey.indexOf("*"); + return firstStar !== -1 && firstStar === patternKey.lastIndexOf("*"); +} + /** * Gets the self-recursive function specialized to retrieving the targeted import/export element for the given resolution configuration */ diff --git a/tests/baselines/reference/nodeModulesExportsDoubleAsterisk.errors.txt b/tests/baselines/reference/nodeModulesExportsDoubleAsterisk.errors.txt new file mode 100644 index 0000000000000..1ab8b6bb276e0 --- /dev/null +++ b/tests/baselines/reference/nodeModulesExportsDoubleAsterisk.errors.txt @@ -0,0 +1,21 @@ +/main.mts(1,16): error TS2307: Cannot find module 'double-asterisk/a/*/b/*/c/*' or its corresponding type declarations. + + +==== /node_modules/double-asterisk/package.json (0 errors) ==== + { + "name": "double-asterisk", + "version": "1.0.0", + "type": "module", + "exports": { + "./a/*/b/*/c/*": "./example.js" + } + } + +==== /node_modules/double-asterisk/example.d.ts (0 errors) ==== + export {}; + +==== /main.mts (1 errors) ==== + import {} from "double-asterisk/a/*/b/*/c/*"; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2307: Cannot find module 'double-asterisk/a/*/b/*/c/*' or its corresponding type declarations. + \ No newline at end of file diff --git a/tests/cases/conformance/node/nodeModulesExportsDoubleAsterisk.ts b/tests/cases/conformance/node/nodeModulesExportsDoubleAsterisk.ts new file mode 100644 index 0000000000000..b74fa70750993 --- /dev/null +++ b/tests/cases/conformance/node/nodeModulesExportsDoubleAsterisk.ts @@ -0,0 +1,19 @@ +// @module: nodenext +// @noTypesAndSymbols: true +// @noEmit: true + +// @Filename: /node_modules/double-asterisk/package.json +{ + "name": "double-asterisk", + "version": "1.0.0", + "type": "module", + "exports": { + "./a/*/b/*/c/*": "./example.js" + } +} + +// @Filename: /node_modules/double-asterisk/example.d.ts +export {}; + +// @Filename: /main.mts +import {} from "double-asterisk/a/*/b/*/c/*";