@@ -1106,7 +1106,8 @@ function tryResolveBrowserMapping(
1106
1106
externalize ?: boolean
1107
1107
) {
1108
1108
let res : string | undefined
1109
- const pkg = importer && idToPkgMap . get ( importer )
1109
+ const pkg =
1110
+ importer && ( idToPkgMap . get ( importer ) || resolvePkg ( importer , options ) )
1110
1111
if ( pkg && isObject ( pkg . data . browser ) ) {
1111
1112
const mapId = isFilePath ? './' + slash ( path . relative ( pkg . dir , id ) ) : id
1112
1113
const browserMappedPath = mapWithBrowserField ( mapId , pkg . data . browser )
@@ -1165,3 +1166,40 @@ function getRealPath(resolved: string, preserveSymlinks?: boolean): string {
1165
1166
}
1166
1167
return normalizePath ( resolved )
1167
1168
}
1169
+
1170
+ /**
1171
+ * if importer was not resolved by vite's resolver previously
1172
+ * (when esbuild resolved it)
1173
+ * resolve importer's pkg and add to idToPkgMap
1174
+ */
1175
+ function resolvePkg ( importer : string , options : InternalResolveOptions ) {
1176
+ const { root, preserveSymlinks, packageCache } = options
1177
+
1178
+ if ( importer . includes ( '\x00' ) ) {
1179
+ return null
1180
+ }
1181
+
1182
+ const possiblePkgIds : string [ ] = [ ]
1183
+ for ( let prevSlashIndex = - 1 ; ; ) {
1184
+ const slashIndex = importer . indexOf ( isWindows ? '\\' : '/' , prevSlashIndex )
1185
+ if ( slashIndex < 0 ) {
1186
+ break
1187
+ }
1188
+
1189
+ prevSlashIndex = slashIndex + 1
1190
+
1191
+ const possiblePkgId = importer . slice ( 0 , slashIndex )
1192
+ possiblePkgIds . push ( possiblePkgId )
1193
+ }
1194
+
1195
+ let pkg : PackageData | undefined
1196
+ possiblePkgIds . reverse ( ) . find ( ( pkgId ) => {
1197
+ pkg = resolvePackageData ( pkgId , root , preserveSymlinks , packageCache ) !
1198
+ return pkg
1199
+ } ) !
1200
+
1201
+ if ( pkg ) {
1202
+ idToPkgMap . set ( importer , pkg )
1203
+ }
1204
+ return pkg
1205
+ }
0 commit comments