diff --git a/tsc/internal/module/resolver.go b/tsc/internal/module/resolver.go index 367884c90698a..4286b20720927 100644 --- a/tsc/internal/module/resolver.go +++ b/tsc/internal/module/resolver.go @@ -694,6 +694,10 @@ func (r *resolutionState) loadModuleFromExportsOrImports( scope *packagejson.InfoCacheEntry, isImports bool, ) *resolved { + if lookupTable == nil { + return continueSearching() + } + if !strings.HasSuffix(moduleName, "/") && !strings.Contains(moduleName, "*") { if target, ok := lookupTable.Get(moduleName); ok { return r.loadModuleFromTargetExportOrImport(extensions, moduleName, scope, isImports, target, "", false /*isPattern*/, moduleName) diff --git a/tsc/testdata/tests/cases/compiler/packageJsonExportsTrailingSlashNoCrash.ts b/tsc/testdata/tests/cases/compiler/packageJsonExportsTrailingSlashNoCrash.ts new file mode 100644 index 0000000000000..42a618f755d34 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/packageJsonExportsTrailingSlashNoCrash.ts @@ -0,0 +1,23 @@ +// @module: nodenext +// @moduleResolution: nodenext +// @noEmit: true +// @noTypesAndSymbols: true + +// @filename: /node_modules/pkg/package.json +{ + "name": "pkg", + "exports": { + "./": "./" + } +} + +// @filename: /node_modules/pkg/subpath.d.ts +export declare const value: number; + +// @filename: /src/a.ts +import { value } from "pkg/subpath.js"; +value; + +// @filename: /src/b.ts +import { value } from "pkg/subpath.js"; +value;