Skip to content

Commit f3088ca

Browse files
committed
Tweak external detection for rollup bundle
1 parent b784873 commit f3088ca

File tree

4 files changed

+65
-60
lines changed

4 files changed

+65
-60
lines changed

.config/rollup.base.config.mjs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,33 @@ const customResolver = nodeResolve({
5454
preferBuiltins: true
5555
})
5656

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)
5959
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(
6565
currNmIndex + SLASH_NODE_MODULES_SLASH.length,
66-
nextNmIndex === -1 ? resolvedId.length : nextNmIndex
66+
nextNmIndex === -1 ? id.length : nextNmIndex
6767
)
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)) {
6984
return false
7085
}
7186
currNmIndex = nextNmIndex
@@ -93,22 +108,24 @@ export default (extendConfig = {}) => {
93108
return true
94109
}
95110
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+
) {
97117
return false
98118
}
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)) {
103121
return false
104122
}
105-
const parentId = parentId_ ? resolveId(parentId_) : undefined
106123
const resolvedId = resolveId(id, parentId)
107-
if (resolvedId.endsWith('.json')) {
108-
return isAncestorsCjs(resolvedId, parentId)
124+
if (!isAncestorsExternal(resolvedId, depStats)) {
125+
return false
109126
}
110127
const name = getPackageName(id)
111-
if (!isValidPackageName(name) || name === '@babel/runtime') {
128+
if (name === '@babel/runtime' || !isValidPackageName(name)) {
112129
return false
113130
}
114131
if (isEsmId(resolvedId, parentId)) {
@@ -123,16 +140,13 @@ export default (extendConfig = {}) => {
123140
parentPkg?.peerDependencies?.[name] ??
124141
readPackageUpSync({ cwd: path.dirname(resolvedId) })?.packageJson
125142
?.version ??
126-
''
143+
'latest'
127144
return false
128145
}
129146
const parentNodeModulesIndex = parentId.lastIndexOf(
130147
SLASH_NODE_MODULES_SLASH
131148
)
132149
if (parentNodeModulesIndex !== -1) {
133-
if (isAncestorsCjs(resolvedId, parentId)) {
134-
return true
135-
}
136150
const parentNameStart =
137151
parentNodeModulesIndex + SLASH_NODE_MODULES_SLASH.length
138152
const parentNameEnd = getPackageNameEnd(parentId, parentNameStart)
@@ -144,17 +158,17 @@ export default (extendConfig = {}) => {
144158
} = readPackageJsonSync(
145159
`${parentId.slice(0, parentNameEnd)}/package.json`
146160
)
147-
const curRange =
161+
const range =
148162
dependencies[name] ??
149163
optionalDependencies[name] ??
150164
peerDependencies[name] ??
151165
version
152166
const seenRange = pkgDeps[name] ?? depStats.external[name]
153167
if (seenRange) {
154-
return rangesIntersect(seenRange, curRange)
168+
return rangesIntersect(seenRange, range)
155169
}
156-
depStats.external[name] = curRange
157-
depStats.transitives[name] = curRange
170+
depStats.external[name] = range
171+
depStats.transitives[name] = range
158172
} else if (pkgDeps[name]) {
159173
depStats.external[name] = pkgDeps[name]
160174
depStats.dependencies[name] = pkgDeps[name]

.dep-stats.json

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
},
2929
"devDependencies": {},
3030
"esm": {
31-
"ansi-escapes": "^5.0.0",
3231
"bundle-name": "^4.1.0",
3332
"default-browser": "^5.2.1",
3433
"default-browser-id": "^5.0.0",
@@ -61,16 +60,13 @@
6160
"blessed-contrib": "^4.11.0",
6261
"browserslist": "4.24.2",
6362
"chalk-table": "^1.0.2",
64-
"cli-spinners": "^3.2.0",
65-
"emoji-regex": "^10.4.0",
63+
"has-flag": "^4.0.0",
6664
"hpagent": "^1.2.0",
6765
"ignore": "^6.0.2",
6866
"micromatch": "^4.0.8",
6967
"npm-package-arg": "^12.0.0",
7068
"pony-cause": "^2.1.11",
7169
"semver": "^7.6.3",
72-
"signal-exit": "^4.1.0",
73-
"supports-hyperlinks": "^3.1.0",
7470
"synp": "^1.9.13",
7571
"tinyglobby": "^0.2.10",
7672
"which": "^5.0.0",
@@ -79,9 +75,6 @@
7975
"yoctocolors-cjs": "^2.1.2"
8076
},
8177
"transitives": {
82-
"cli-spinners": "^3.2.0",
83-
"emoji-regex": "^10.4.0",
84-
"signal-exit": "^4.1.0",
85-
"supports-hyperlinks": "^3.1.0"
78+
"has-flag": "^4.0.0"
8679
}
8780
}

package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,13 @@
5252
"blessed-contrib": "^4.11.0",
5353
"browserslist": "4.24.2",
5454
"chalk-table": "^1.0.2",
55-
"cli-spinners": "^3.2.0",
56-
"emoji-regex": "^10.4.0",
55+
"has-flag": "^4.0.0",
5756
"hpagent": "^1.2.0",
5857
"ignore": "^6.0.2",
5958
"micromatch": "^4.0.8",
6059
"npm-package-arg": "^12.0.0",
6160
"pony-cause": "^2.1.11",
6261
"semver": "^7.6.3",
63-
"signal-exit": "^4.1.0",
64-
"supports-hyperlinks": "^3.1.0",
6562
"synp": "^1.9.13",
6663
"tinyglobby": "^0.2.10",
6764
"which": "^5.0.0",

scripts/utils/packages.js

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,28 +90,29 @@ function isEsmId(id_, parentId_) {
9090
} else if (parentId && isRelative(resolvedId)) {
9191
filepath = path.join(path.dirname(parentId), resolvedId)
9292
}
93-
if (filepath) {
94-
const pkgJsonPath = findUpSync('package.json', {
95-
cwd: path.dirname(resolvedId)
96-
})
97-
if (pkgJsonPath) {
98-
const pkgJson = require(pkgJsonPath)
99-
const { exports: entryExports } = pkgJson
100-
if (
101-
pkgJson.type === 'module' &&
102-
!entryExports?.require &&
103-
!entryExports?.node?.default?.endsWith('.cjs')
104-
) {
105-
return true
106-
}
93+
if (!filepath) {
94+
return false
95+
}
96+
const pkgJsonPath = findUpSync('package.json', {
97+
cwd: path.dirname(resolvedId)
98+
})
99+
if (pkgJsonPath) {
100+
const pkgJson = require(pkgJsonPath)
101+
const { exports: entryExports } = pkgJson
102+
if (
103+
pkgJson.type === 'module' &&
104+
!entryExports?.require &&
105+
!entryExports?.node?.default?.endsWith('.cjs')
106+
) {
107+
return true
107108
}
108-
try {
109-
// eslint-disable-next-line no-new
110-
new vm.Script(fs.readFileSync(resolvedId, 'utf8'))
111-
} catch (e) {
112-
if (e instanceof SyntaxError) {
113-
return true
114-
}
109+
}
110+
try {
111+
// eslint-disable-next-line no-new
112+
new vm.Script(fs.readFileSync(resolvedId, 'utf8'))
113+
} catch (e) {
114+
if (e instanceof SyntaxError) {
115+
return true
115116
}
116117
}
117118
return false

0 commit comments

Comments
 (0)