diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 45ba44eac4b00..26fbada55e7d4 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -659,7 +659,8 @@ function getNodeResolutionFeatures(options: CompilerOptions) { return features; } -function getConditions(options: CompilerOptions, esmMode?: boolean) { +/** @internal */ +export function getConditions(options: CompilerOptions, esmMode?: boolean) { // conditions are only used by the node16/nodenext/bundler resolvers - there's no priority order in the list, // it's essentially a set (priority is determined by object insertion order in the object we look at). const conditions = esmMode || getEmitModuleResolutionKind(options) === ModuleResolutionKind.Bundler diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index 6dbbcb3fae03f..cdddd048e4245 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -33,6 +33,7 @@ import { forEachAncestorDirectory, getBaseFileName, GetCanonicalFileName, + getConditions, getDirectoryPath, getEmitModuleResolutionKind, getModeForResolutionAtIndex, @@ -46,6 +47,7 @@ import { getPathsBasePath, getRelativePathFromDirectory, getRelativePathToDirectoryOrUrl, + getResolvePackageJsonExports, getSourceFileOfModule, getSupportedExtensions, getTextOfIdentifierOrLiteral, @@ -945,8 +947,8 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCan if (typeof cachedPackageJson === "object" || cachedPackageJson === undefined && host.fileExists(packageJsonPath)) { const packageJsonContent = cachedPackageJson?.contents.packageJsonContent || JSON.parse(host.readFile!(packageJsonPath)!); const importMode = overrideMode || importingSourceFile.impliedNodeFormat; - if (getEmitModuleResolutionKind(options) === ModuleResolutionKind.Node16 || getEmitModuleResolutionKind(options) === ModuleResolutionKind.NodeNext) { - const conditions = ["node", importMode === ModuleKind.ESNext ? "import" : "require", "types"]; + if (getResolvePackageJsonExports(options)) { + const conditions = getConditions(options, importMode === ModuleKind.ESNext); const fromExports = packageJsonContent.exports && typeof packageJsonContent.name === "string" ? tryGetModuleNameFromExports(options, path, packageRootPath, getPackageNameFromTypesPackageName(packageJsonContent.name), packageJsonContent.exports, conditions) : undefined; diff --git a/tests/cases/fourslash/autoImportBundlerExports.ts b/tests/cases/fourslash/autoImportBundlerExports.ts new file mode 100644 index 0000000000000..37a66bf09af72 --- /dev/null +++ b/tests/cases/fourslash/autoImportBundlerExports.ts @@ -0,0 +1,21 @@ +/// + +// @module: esnext +// @moduleResolution: bundler + +// @Filename: /node_modules/dep/package.json +//// { +//// "name": "dep", +//// "version": "1.0.0", +//// "exports": { +//// ".": "./dist/index.js" +//// } +//// } + +// @Filename: /node_modules/dep/dist/index.d.ts +//// export const dep: number; + +// @Filename: /index.ts +//// dep/**/ + +verify.importFixModuleSpecifiers("", ["dep"]); diff --git a/tests/cases/fourslash/autoImportsCustomConditions.ts b/tests/cases/fourslash/autoImportsCustomConditions.ts new file mode 100644 index 0000000000000..83e968ba2a801 --- /dev/null +++ b/tests/cases/fourslash/autoImportsCustomConditions.ts @@ -0,0 +1,24 @@ +/// + +// @module: esnext +// @moduleResolution: bundler +// @customConditions: custom + +// @Filename: /node_modules/dep/package.json +//// { +//// "name": "dep", +//// "version": "1.0.0", +//// "exports": { +//// ".": { +//// "custom": "./dist/index.js" +//// } +//// } +//// } + +// @Filename: /node_modules/dep/dist/index.d.ts +//// export const dep: number; + +// @Filename: /index.ts +//// dep/**/ + +verify.importFixModuleSpecifiers("", ["dep"]);