@@ -218,7 +218,7 @@ export function DepsPlugin(
218218 if ( chunk . type === 'asset' ) continue
219219
220220 for ( const id of chunk . moduleIds ) {
221- const parsed = await parseBundledDep ( id )
221+ const parsed = await readBundledDepInfo ( id )
222222 if ( ! parsed ) continue
223223
224224 deps . add ( parsed . name )
@@ -314,13 +314,13 @@ export function DepsPlugin(
314314
315315 if ( deps ) {
316316 if ( deps . includes ( id ) || deps . some ( ( dep ) => id . startsWith ( `${ dep } /` ) ) ) {
317- const resolvedDep = await resolveDepPath ( id , resolved )
317+ const resolvedDep = await resolveDepSubpath ( id , resolved )
318318 return resolvedDep ? [ true , resolvedDep ] : true
319319 }
320320
321321 if ( importer && RE_DTS . test ( importer ) && ! id . startsWith ( '@types/' ) ) {
322- const typesName = `@types/ ${ id . replace ( / ^ @ / , '' ) . replaceAll ( '/' , '__' ) } `
323- if ( deps . includes ( typesName ) ) {
322+ const typesName = getTypesPackageName ( id )
323+ if ( typesName && deps . includes ( typesName ) ) {
324324 return true
325325 }
326326 }
@@ -330,35 +330,35 @@ export function DepsPlugin(
330330 }
331331}
332332
333- function parseDepPath (
333+ export function parsePackageSpecifier ( id : string ) : [ name : string , subpath : string ] {
334+ const [ first , second ] = id . split ( '/' , 3 )
335+
336+ const name = first [ 0 ] === '@' && second ? `${ first } /${ second } ` : first
337+ const subpath = id . slice ( name . length )
338+
339+ return [ name , subpath ]
340+ }
341+
342+ const NODE_MODULES = '/node_modules/'
343+ export function parseNodeModulesPath (
334344 id : string ,
335345) : [ name : string , subpath : string , root : string ] | undefined {
336346 const slashed = slash ( id )
337- const lastNmIdx = slashed . lastIndexOf ( '/node_modules/' )
347+ const lastNmIdx = slashed . lastIndexOf ( NODE_MODULES )
338348 if ( lastNmIdx === - 1 ) return
339349
340- const afterNm = slashed . slice ( lastNmIdx + 14 /* '/node_modules/'.length */ )
341- const parts = afterNm . split ( '/' )
350+ const afterNm = slashed . slice ( lastNmIdx + NODE_MODULES . length )
342351
343- let name : string
344- if ( parts [ 0 ] [ 0 ] === '@' ) {
345- name = `${ parts [ 0 ] } /${ parts [ 1 ] } `
346- } else {
347- name = parts [ 0 ]
348- }
352+ const [ name , subpath ] = parsePackageSpecifier ( afterNm )
353+ const root = slashed . slice ( 0 , lastNmIdx + NODE_MODULES . length + name . length )
349354
350- const root = slashed . slice (
351- 0 ,
352- lastNmIdx + 14 /* '/node_modules/'.length */ + name . length ,
353- )
354-
355- return [ name , afterNm . slice ( name . length ) , root ]
355+ return [ name , subpath , root ]
356356}
357357
358- async function parseBundledDep (
358+ async function readBundledDepInfo (
359359 moduleId : string ,
360360) : Promise < { name : string ; pkgName : string ; version : string } | undefined > {
361- const parsed = parseDepPath ( moduleId )
361+ const parsed = parseNodeModulesPath ( moduleId )
362362 if ( ! parsed ) return
363363
364364 const [ name , , root ] = parsed
@@ -371,7 +371,14 @@ async function parseBundledDep(
371371 } catch { }
372372}
373373
374- async function resolveDepPath ( id : string , resolved : ResolvedId | null ) {
374+ export function getTypesPackageName ( id : string ) : string | undefined {
375+ const name = parsePackageSpecifier ( id ) [ 0 ]
376+ if ( ! name ) return
377+
378+ return `@types/${ name . replace ( / ^ @ / , '' ) . replace ( '/' , '__' ) } `
379+ }
380+
381+ async function resolveDepSubpath ( id : string , resolved : ResolvedId | null ) {
375382 if ( ! resolved ?. packageJsonPath ) return
376383
377384 const parts = id . split ( '/' )
@@ -390,7 +397,7 @@ async function resolveDepPath(id: string, resolved: ResolvedId | null) {
390397 // no `exports` field
391398 if ( pkgJson . exports ) return
392399
393- const parsed = parseDepPath ( resolved . id )
400+ const parsed = parseNodeModulesPath ( resolved . id )
394401 if ( ! parsed ) return
395402
396403 const result = parsed [ 0 ] + parsed [ 1 ]
0 commit comments