Socket
Socket
Sign inDemoInstall

@pnpm/link-bins

Package Overview
Dependencies
Maintainers
3
Versions
145
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@pnpm/link-bins - npm Package Compare versions

Comparing version 5.2.1 to 5.3.0

8

lib/index.d.ts
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",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc