@@ -54,18 +54,33 @@ const customResolver = nodeResolve({
54
54
preferBuiltins : true
55
55
} )
56
56
57
- function isAncestorsCjs ( resolvedId , parentId ) {
58
- let currNmIndex = resolvedId . indexOf ( SLASH_NODE_MODULES_SLASH )
57
+ function isAncestorsExternal ( id , depStats ) {
58
+ let currNmIndex = id . indexOf ( SLASH_NODE_MODULES_SLASH )
59
59
while ( currNmIndex !== - 1 ) {
60
- const nextNmIndex = resolvedId . indexOf (
61
- SLASH_NODE_MODULES_SLASH ,
62
- currNmIndex + 1
63
- )
64
- const currPkgName = resolvedId . slice (
60
+ const nextNmIndex = id . indexOf ( SLASH_NODE_MODULES_SLASH , currNmIndex + 1 )
61
+ const nameStart = currNmIndex + SLASH_NODE_MODULES_SLASH . length
62
+ const nameEnd = getPackageNameEnd ( id , nameStart )
63
+ const name = id . slice ( nameStart , nameEnd )
64
+ const nameSlashFilename = id . slice (
65
65
currNmIndex + SLASH_NODE_MODULES_SLASH . length ,
66
- nextNmIndex === - 1 ? resolvedId . length : nextNmIndex
66
+ nextNmIndex === - 1 ? id . length : nextNmIndex
67
67
)
68
- if ( isEsmId ( currPkgName , parentId ) ) {
68
+ if ( isEsmId ( nameSlashFilename , id ) ) {
69
+ return false
70
+ }
71
+ const {
72
+ version,
73
+ dependencies = { } ,
74
+ optionalDependencies = { } ,
75
+ peerDependencies = { }
76
+ } = readPackageJsonSync ( `${ id . slice ( 0 , nameEnd ) } /package.json` )
77
+ const range =
78
+ dependencies [ name ] ??
79
+ optionalDependencies [ name ] ??
80
+ peerDependencies [ name ] ??
81
+ version
82
+ const seenRange = pkgDeps [ name ] ?? depStats . external [ name ]
83
+ if ( seenRange && ! rangesIntersect ( seenRange , range ) ) {
69
84
return false
70
85
}
71
86
currNmIndex = nextNmIndex
@@ -93,22 +108,24 @@ export default (extendConfig = {}) => {
93
108
return true
94
109
}
95
110
const id = normalizeId ( id_ )
96
- if ( isRelative ( id ) ) {
111
+ if (
112
+ isRelative ( id ) ||
113
+ id . endsWith ( '.mjs' ) ||
114
+ id . endsWith ( '.mts' ) ||
115
+ id . endsWith ( '.ts' )
116
+ ) {
97
117
return false
98
118
}
99
- if ( id . endsWith ( '.cjs' ) ) {
100
- return true
101
- }
102
- if ( id . endsWith ( '.mjs' ) || id . endsWith ( '.mts' ) || id . endsWith ( '.ts' ) ) {
119
+ const parentId = parentId_ ? resolveId ( parentId_ ) : undefined
120
+ if ( parentId && ! isAncestorsExternal ( parentId , depStats ) ) {
103
121
return false
104
122
}
105
- const parentId = parentId_ ? resolveId ( parentId_ ) : undefined
106
123
const resolvedId = resolveId ( id , parentId )
107
- if ( resolvedId . endsWith ( '.json' ) ) {
108
- return isAncestorsCjs ( resolvedId , parentId )
124
+ if ( ! isAncestorsExternal ( resolvedId , depStats ) ) {
125
+ return false
109
126
}
110
127
const name = getPackageName ( id )
111
- if ( ! isValidPackageName ( name ) || name === '@babel/runtime' ) {
128
+ if ( name === '@babel/runtime' || ! isValidPackageName ( name ) ) {
112
129
return false
113
130
}
114
131
if ( isEsmId ( resolvedId , parentId ) ) {
@@ -123,16 +140,13 @@ export default (extendConfig = {}) => {
123
140
parentPkg ?. peerDependencies ?. [ name ] ??
124
141
readPackageUpSync ( { cwd : path . dirname ( resolvedId ) } ) ?. packageJson
125
142
?. version ??
126
- ''
143
+ 'latest '
127
144
return false
128
145
}
129
146
const parentNodeModulesIndex = parentId . lastIndexOf (
130
147
SLASH_NODE_MODULES_SLASH
131
148
)
132
149
if ( parentNodeModulesIndex !== - 1 ) {
133
- if ( isAncestorsCjs ( resolvedId , parentId ) ) {
134
- return true
135
- }
136
150
const parentNameStart =
137
151
parentNodeModulesIndex + SLASH_NODE_MODULES_SLASH . length
138
152
const parentNameEnd = getPackageNameEnd ( parentId , parentNameStart )
@@ -144,17 +158,17 @@ export default (extendConfig = {}) => {
144
158
} = readPackageJsonSync (
145
159
`${ parentId . slice ( 0 , parentNameEnd ) } /package.json`
146
160
)
147
- const curRange =
161
+ const range =
148
162
dependencies [ name ] ??
149
163
optionalDependencies [ name ] ??
150
164
peerDependencies [ name ] ??
151
165
version
152
166
const seenRange = pkgDeps [ name ] ?? depStats . external [ name ]
153
167
if ( seenRange ) {
154
- return rangesIntersect ( seenRange , curRange )
168
+ return rangesIntersect ( seenRange , range )
155
169
}
156
- depStats . external [ name ] = curRange
157
- depStats . transitives [ name ] = curRange
170
+ depStats . external [ name ] = range
171
+ depStats . transitives [ name ] = range
158
172
} else if ( pkgDeps [ name ] ) {
159
173
depStats . external [ name ] = pkgDeps [ name ]
160
174
depStats . dependencies [ name ] = pkgDeps [ name ]
0 commit comments