From 9a4788a6f8978a1d6c5d3b1b12ac91db84e93bdf Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Sun, 8 Jan 2023 02:07:30 +0800 Subject: [PATCH] feat: support peerDependenciesMeta closes https://github.com/cnpm/npminstall/issues/436 --- bin/install.js | 15 ++++++++++----- lib/install_package.js | 28 ++++++++++++---------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/bin/install.js b/bin/install.js index a687c761..4fcc33cb 100755 --- a/bin/install.js +++ b/bin/install.js @@ -361,6 +361,7 @@ debug('argv: %j, env: %j', argv, env); config.env.npm_rootpath = process.env.npm_rootpath || root; config.env.INIT_CWD = process.env.INIT_CWD || root; await installGlobal(config, context); + console.log(''); return; } @@ -521,13 +522,17 @@ debug('argv: %j, env: %j', argv, env); utils.exitWithError('npminstall', err); }); +let _versionSavePrefix = null; function getVersionSavePrefix() { - try { - return execSync('npm config get save-prefix').toString().trim(); - } catch (err) { - debug(`exec npm config get save-prefix ERROR: ${err.message}`); - return '^'; + if (_versionSavePrefix === null) { + try { + _versionSavePrefix = execSync('npm config get save-prefix').toString().trim(); + } catch (err) { + debug(`exec npm config get save-prefix ERROR: ${err.message}`); + _versionSavePrefix = '^'; + } } + return _versionSavePrefix; } function getStrictSSL() { diff --git a/lib/install_package.js b/lib/install_package.js index 2c6d3440..c51a02e5 100644 --- a/lib/install_package.js +++ b/lib/install_package.js @@ -226,6 +226,7 @@ async function _install(parentDir, pkg, ancestors, options, context) { const nodeModulesDir = path.join(realPkgDir, 'node_modules'); const peerDependencies = realPkg.peerDependencies || {}; + const peerDependenciesMeta = realPkg.peerDependenciesMeta || {}; const needLinkPeerDependencies = []; if (Object.keys(peerDependencies).length > 0) { const unmatched = {}; @@ -243,9 +244,9 @@ async function _install(parentDir, pkg, ancestors, options, context) { // check in reverse const res = await matchAncestorDependencies(childPkg, reverseAncestors, options, context); if (res) { - pkgs.push({ name, version: res.ancestorSpec, peer: true }); + pkgs.push({ name, version: res.ancestorSpec }); needLinkPeerDependencies.push({ name, version: res.ancestorSpec }); - } else { + } else if (peerDependenciesMeta[name]?.optional !== true) { unmatched[name] = version; } } @@ -392,20 +393,15 @@ function forceFlatten(pkg) { // link module and bin files async function linkModule(pkg, parentDir, realPkg, realPkgDir, options) { - if (!pkg.peer) { - // fix concurrent install same bin name error - try { - await bin(parentDir, realPkg, realPkgDir, options); - } catch (err) { - if (err.code !== 'EEXIST') { - throw err; - } - // retry - await bin(parentDir, realPkg, realPkgDir, options); + // fix concurrent install same bin name error + try { + await bin(parentDir, realPkg, realPkgDir, options); + } catch (err) { + if (err.code !== 'EEXIST') { + throw err; } - await link(parentDir, realPkg, realPkgDir, pkg.alias, options); - } else { - // peer dependencies will link after check root - options.linkPeerDependencies.push({ parentDir, realPkg, realPkgDir }); + // retry + await bin(parentDir, realPkg, realPkgDir, options); } + await link(parentDir, realPkg, realPkgDir, pkg.alias, options); }