From 9a1690857d66445477b6c90f08ef61abf3866956 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 2 Feb 2022 11:41:56 -0500 Subject: [PATCH] refactor: updated package-install.js exports style, new exported method 'getPackageManager' for use in cases where nconf is unreliable, fix bug where nconf was not correctly set up in cli tools, proper installation of dev dependencies based on global env value --- src/cli/package-install.js | 99 +++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/src/cli/package-install.js b/src/cli/package-install.js index 0a2c8469ac..1fce27b591 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -6,7 +6,18 @@ const cproc = require('child_process'); const { paths, pluginNamePattern } = require('../constants'); -function updatePackageFile() { +const pkgInstall = module.exports; + +function sortDependencies(dependencies) { + return Object.entries(dependencies) + .sort((a, b) => (a < b ? -1 : 1)) + .reduce((memo, pkg) => { + memo[pkg[0]] = pkg[1]; + return memo; + }, {}); +} + +pkgInstall.updatePackageFile = () => { let oldPackageContents = {}; try { @@ -32,45 +43,58 @@ function updatePackageFile() { const packageContents = { ...oldPackageContents, ...defaultPackageContents, dependencies: dependencies }; fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2)); -} - -exports.updatePackageFile = updatePackageFile; +}; -exports.supportedPackageManager = [ +pkgInstall.supportedPackageManager = [ 'npm', 'cnpm', 'pnpm', 'yarn', ]; -function installAll() { - const prod = global.env !== 'development'; - let command = 'npm install'; +pkgInstall.getPackageManager = () => { + // Use this method if you can't reliably require('nconf') directly try { + // Quick & dirty nconf setup fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK); - const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js - const packageManager = require('nconf').get('package_manager'); - if (supportedPackageManagerList.indexOf(packageManager) >= 0) { - switch (packageManager) { - case 'yarn': - command = 'yarn'; - break; - case 'pnpm': - command = 'pnpm install'; - break; - case 'cnpm': - command = 'cnpm install'; - break; - default: - break; - } - } + const nconf = require('nconf'); + const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json'); + nconf.env().file({ // not sure why adding .argv() causes the process to terminate + file: configFile, + }); + + return nconf.get('package_manager') || 'npm'; } catch (e) { - // No error handling is required here. - // If nconf is not installed, regular package installation via npm is carried out. + // nconf not install or other unexpected error/exception + return 'npm'; } +}; + +pkgInstall.installAll = () => { + const prod = process.env.NODE_ENV !== 'development'; + let command = 'npm install'; + + const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js + const packageManager = pkgInstall.getPackageManager(); + if (supportedPackageManagerList.indexOf(packageManager) >= 0) { + switch (packageManager) { + case 'yarn': + command = `yarn${prod ? ' --production' : ''}`; + break; + case 'pnpm': + command = 'pnpm install'; // pnpm checks NODE_ENV + break; + case 'cnpm': + command = `cnpm install ${prod ? ' --production' : ''}`; + break; + default: + command += prod ? ' --production' : ''; + break; + } + } + try { - cproc.execSync(command + (prod ? ' --production' : ''), { + cproc.execSync(command, { cwd: path.join(__dirname, '../../'), stdio: [0, 1, 2], }); @@ -81,11 +105,9 @@ function installAll() { console.log(`stderr: ${e.stderr}`); throw e; } -} +}; -exports.installAll = installAll; - -function preserveExtraneousPlugins() { +pkgInstall.preserveExtraneousPlugins = () => { // Skip if `node_modules/` is not found or inaccessible try { fs.accessSync(paths.nodeModules, fs.constants.R_OK); @@ -117,15 +139,4 @@ function preserveExtraneousPlugins() { packageContents.dependencies = sortDependencies({ ...packageContents.dependencies, ...extraneous }); fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2)); -} - -function sortDependencies(dependencies) { - return Object.entries(dependencies) - .sort((a, b) => (a < b ? -1 : 1)) - .reduce((memo, pkg) => { - memo[pkg[0]] = pkg[1]; - return memo; - }, {}); -} - -exports.preserveExtraneousPlugins = preserveExtraneousPlugins; +};