/
safeIsInnerLink.ts
40 lines (35 loc) · 1.08 KB
/
safeIsInnerLink.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import path from 'path'
import logger from '@pnpm/logger'
import isInnerLink from 'is-inner-link'
import isSubdir from 'is-subdir'
import renameOverwrite from 'rename-overwrite'
export default async function safeIsInnerLink (
projectModulesDir: string,
depName: string,
opts: {
hideAlienModules: boolean
projectDir: string
virtualStoreDir: string
}
): Promise<true | string> {
try {
const link = await isInnerLink(projectModulesDir, depName)
if (link.isInner) return true
if (isSubdir(opts.virtualStoreDir, link.target)) return true
return link.target as string
} catch (err: any) { // eslint-disable-line
if (err.code === 'ENOENT') return true
if (opts.hideAlienModules) {
logger.warn({
message: `Moving ${depName} that was installed by a different package manager to "node_modules/.ignored`,
prefix: opts.projectDir,
})
const ignoredDir = path.join(projectModulesDir, '.ignored', depName)
await renameOverwrite(
path.join(projectModulesDir, depName),
ignoredDir
)
}
return true
}
}