da6f271d9b
fixes https://github.com/vercel/next.js/issues/34412 ## Bug - [x] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `yarn lint`
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { existsSync } from 'fs'
|
|
import { join, relative } from 'path'
|
|
|
|
export interface MissingDependency {
|
|
file: string
|
|
pkg: string
|
|
exportsRestrict: boolean
|
|
}
|
|
|
|
export type NecessaryDependencies = {
|
|
resolved: Map<string, string>
|
|
missing: MissingDependency[]
|
|
}
|
|
|
|
export async function hasNecessaryDependencies(
|
|
baseDir: string,
|
|
requiredPackages: MissingDependency[]
|
|
): Promise<NecessaryDependencies> {
|
|
let resolutions = new Map<string, string>()
|
|
const missingPackages = requiredPackages.filter((p) => {
|
|
try {
|
|
if (p.exportsRestrict) {
|
|
const pkgPath = require.resolve(`${p.pkg}/package.json`, {
|
|
paths: [baseDir],
|
|
})
|
|
const fileNameToVerify = relative(p.pkg, p.file)
|
|
if (fileNameToVerify) {
|
|
const fileToVerify = join(pkgPath, '..', fileNameToVerify)
|
|
if (existsSync(fileToVerify)) {
|
|
resolutions.set(p.pkg, join(pkgPath, '..'))
|
|
} else {
|
|
return true
|
|
}
|
|
} else {
|
|
resolutions.set(p.pkg, pkgPath)
|
|
}
|
|
} else {
|
|
resolutions.set(p.pkg, require.resolve(p.file, { paths: [baseDir] }))
|
|
}
|
|
return false
|
|
} catch (_) {
|
|
return true
|
|
}
|
|
})
|
|
|
|
return {
|
|
resolved: resolutions,
|
|
missing: missingPackages,
|
|
}
|
|
}
|