@pnpm/link-bins
Advanced tools
Comparing version 5.2.1 to 5.3.0
import { DependencyManifest } from '@pnpm/types'; | ||
declare const _default: (modules: string, binPath: string, opts: { | ||
export declare type WarningCode = 'BINARIES_CONFLICT' | 'EMPTY_BIN'; | ||
export declare type WarnFunction = (msg: string, code: WarningCode) => void; | ||
declare const _default: (modulesDir: string, binsDir: string, opts: { | ||
allowExoticManifests?: boolean | undefined; | ||
warn: (msg: string) => void; | ||
warn: WarnFunction; | ||
}) => Promise<string[] | undefined>; | ||
@@ -11,3 +13,3 @@ export default _default; | ||
}>, binsTarget: string, opts: { | ||
warn: (msg: string) => void; | ||
warn: WarnFunction; | ||
}): Promise<string[] | undefined>; |
@@ -21,6 +21,6 @@ "use strict"; | ||
const POWER_SHELL_IS_SUPPORTED = IS_WINDOWS; | ||
exports.default = async (modules, binPath, opts) => { | ||
const pkgDirs = await read_modules_dir_1.default(modules); | ||
exports.default = async (modulesDir, binsDir, opts) => { | ||
const allDeps = await read_modules_dir_1.default(modulesDir); | ||
// If the modules dir does not exist, do nothing | ||
if (pkgDirs === null) | ||
if (allDeps === null) | ||
return; | ||
@@ -31,9 +31,9 @@ const pkgBinOpts = { | ||
}; | ||
const allCmds = R.unnest((await Promise.all(pkgDirs | ||
.map((dir) => path.resolve(modules, dir)) | ||
.filter((dir) => !isSubdir(dir, binPath)) // Don't link own bins | ||
.map((dir) => normalizePath(dir)) | ||
.map((target) => getPackageBins(target, pkgBinOpts)))) | ||
const allCmds = R.unnest((await Promise.all(allDeps | ||
.map((depName) => path.resolve(modulesDir, depName)) | ||
.filter((depDir) => !isSubdir(depDir, binsDir)) // Don't link own bins | ||
.map((depDir) => normalizePath(depDir)) | ||
.map(getPackageBins.bind(null, pkgBinOpts)))) | ||
.filter((cmds) => cmds.length)); | ||
return linkBins(allCmds, binPath, opts); | ||
return linkBins(allCmds, binsDir, opts); | ||
}; | ||
@@ -44,3 +44,3 @@ async function linkBinsOfPackages(pkgs, binsTarget, opts) { | ||
const allCmds = R.unnest((await Promise.all(pkgs | ||
.map((pkg) => getPackageBinsFromPackageJson(pkg.manifest, pkg.location)))) | ||
.map((pkg) => getPackageBinsFromManifest(pkg.manifest, pkg.location)))) | ||
.filter((cmds) => cmds.length)); | ||
@@ -50,16 +50,16 @@ return linkBins(allCmds, binsTarget, opts); | ||
exports.linkBinsOfPackages = linkBinsOfPackages; | ||
async function linkBins(allCmds, binPath, opts) { | ||
async function linkBins(allCmds, binsDir, opts) { | ||
if (!allCmds.length) | ||
return []; | ||
await makeDir(binPath); | ||
const [cmdsWithOwnName, cmdsWithOtherNames] = R.partition((cmd) => cmd.ownName, allCmds); | ||
const results1 = await pSettle(cmdsWithOwnName.map((cmd) => linkBin(cmd, binPath))); | ||
await makeDir(binsDir); | ||
const [cmdsWithOwnName, cmdsWithOtherNames] = R.partition(({ ownName }) => ownName, allCmds); | ||
const results1 = await pSettle(cmdsWithOwnName.map((cmd) => linkBin(cmd, binsDir))); | ||
const usedNames = R.fromPairs(cmdsWithOwnName.map((cmd) => [cmd.name, cmd.name])); | ||
const results2 = await pSettle(cmdsWithOtherNames.map((cmd) => { | ||
if (usedNames[cmd.name]) { | ||
opts.warn(`Cannot link bin "${cmd.name}" of "${cmd.pkgName}" to "${binPath}". A package called "${usedNames[cmd.name]}" already has its bin linked.`); | ||
opts.warn(`Cannot link binary '${cmd.name}' of '${cmd.pkgName}' to '${binsDir}': binary of '${usedNames[cmd.name]}' is already linked`, 'BINARIES_CONFLICT'); | ||
return Promise.resolve(undefined); | ||
} | ||
usedNames[cmd.name] = cmd.pkgName; | ||
return linkBin(cmd, binPath); | ||
return linkBin(cmd, binsDir); | ||
})); | ||
@@ -78,5 +78,6 @@ // We want to create all commands that we can create before throwing an exception | ||
} | ||
async function getPackageBins(target, opts) { | ||
const pkg = opts.allowExoticManifests ? await safeReadProjectManifestOnly(target) : await safeReadPkg(target); | ||
if (!pkg) { | ||
async function getPackageBins(opts, target) { | ||
const manifest = opts.allowExoticManifests | ||
? await safeReadProjectManifestOnly(target) : await safeReadPkgJson(target); | ||
if (!manifest) { | ||
// There's a directory in node_modules without package.json: ${target}. | ||
@@ -86,20 +87,20 @@ // This used to be a warning but it didn't really cause any issues. | ||
} | ||
if (R.isEmpty(pkg.bin) && !await isFromModules(target)) { | ||
opts.warn(`Package in ${target} must have a non-empty bin field to get bin linked.`); | ||
if (R.isEmpty(manifest.bin) && !await isFromModules(target)) { | ||
opts.warn(`Package in ${target} must have a non-empty bin field to get bin linked.`, 'EMPTY_BIN'); | ||
} | ||
if (typeof pkg.bin === 'string' && !pkg.name) { | ||
if (typeof manifest.bin === 'string' && !manifest.name) { | ||
throw new error_1.default('INVALID_PACKAGE_NAME', `Package in ${target} must have a name to get bin linked.`); | ||
} | ||
return getPackageBinsFromPackageJson(pkg, target); | ||
return getPackageBinsFromManifest(manifest, target); | ||
} | ||
async function getPackageBinsFromPackageJson(pkgJson, pkgPath) { | ||
const cmds = await package_bins_1.default(pkgJson, pkgPath); | ||
async function getPackageBinsFromManifest(manifest, pkgDir) { | ||
const cmds = await package_bins_1.default(manifest, pkgDir); | ||
return cmds.map((cmd) => ({ | ||
...cmd, | ||
ownName: cmd.name === pkgJson.name, | ||
pkgName: pkgJson.name, | ||
ownName: cmd.name === manifest.name, | ||
pkgName: manifest.name, | ||
})); | ||
} | ||
async function linkBin(cmd, binPath) { | ||
const externalBinPath = path.join(binPath, cmd.name); | ||
async function linkBin(cmd, binsDir) { | ||
const externalBinPath = path.join(binsDir, cmd.name); | ||
if (EXECUTABLE_SHEBANG_SUPPORTED) { | ||
@@ -118,5 +119,5 @@ await fs.chmod(cmd.path, 0o755); | ||
} | ||
async function safeReadPkg(pkgPath) { | ||
async function safeReadPkgJson(pkgDir) { | ||
try { | ||
return await read_package_json_1.fromDir(pkgPath); | ||
return await read_package_json_1.fromDir(pkgDir); | ||
} | ||
@@ -123,0 +124,0 @@ catch (err) { |
{ | ||
"name": "@pnpm/link-bins", | ||
"version": "5.2.1", | ||
"version": "5.3.0", | ||
"description": "Link bins to node_modules/.bin", | ||
@@ -40,3 +40,3 @@ "main": "lib/index.js", | ||
"@pnpm/read-package-json": "3.0.2", | ||
"@pnpm/read-project-manifest": "1.0.2", | ||
"@pnpm/read-project-manifest": "1.0.3", | ||
"@pnpm/types": "5.0.0", | ||
@@ -49,3 +49,3 @@ "@zkochan/cmd-shim": "4.3.0", | ||
"normalize-path": "3.0.0", | ||
"p-settle": "4.0.0", | ||
"p-settle": "4.0.1", | ||
"ramda": "0.27.0" | ||
@@ -58,5 +58,5 @@ }, | ||
"@types/ncp": "^2.0.3", | ||
"@types/node": "^12.12.30", | ||
"@types/node": "^12.12.32", | ||
"@types/normalize-path": "^3.0.0", | ||
"@types/ramda": "^0.26.44", | ||
"@types/ramda": "^0.27.0", | ||
"@types/sinon": "^7.5.2", | ||
@@ -63,0 +63,0 @@ "@types/tape": "^4.2.34", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9785
148
+ Added@pnpm/read-project-manifest@1.0.3(transitive)
+ Added@pnpm/write-project-manifest@1.0.1(transitive)
+ Addedp-settle@4.0.1(transitive)
+ Addedpify@5.0.0(transitive)
+ Addedread-yaml-file@2.0.0(transitive)
+ Addedwrite-yaml-file@4.0.0(transitive)
- Removed@pnpm/read-project-manifest@1.0.2(transitive)
- Removed@pnpm/write-project-manifest@1.0.0(transitive)
- Removedp-settle@4.0.0(transitive)
- Removedpify@4.0.1(transitive)
- Removedread-yaml-file@1.1.0(transitive)
- Removedstrip-bom@3.0.0(transitive)
- Removedwrite-yaml-file@3.0.1(transitive)
Updatedp-settle@4.0.1