diff --git a/packages/generators/src/init-generator.ts b/packages/generators/src/init-generator.ts index 1006e2aeb5a..5692aaf0a9a 100644 --- a/packages/generators/src/init-generator.ts +++ b/packages/generators/src/init-generator.ts @@ -99,8 +99,15 @@ export default class InitGenerator extends CustomGenerator { } } - public installPlugins(): void { - const packager = this.utils.getPackageManager(); + public async installPlugins(): Promise { + const { packager } = await Question.List( + this, + "packager", + "Pick a package manager:", + this.utils.getAvailableInstallers(), + "npm", + false, + ); const opts: { dev?: boolean; "save-dev"?: boolean; diff --git a/packages/webpack-cli/lib/utils/get-available-installers.js b/packages/webpack-cli/lib/utils/get-available-installers.js new file mode 100644 index 00000000000..900d7987ea6 --- /dev/null +++ b/packages/webpack-cli/lib/utils/get-available-installers.js @@ -0,0 +1,25 @@ +const { sync } = require("execa"); + +const utils = require("./"); + +function isPmInstalled(packageManager) { + try { + sync(packageManager, ["--version"]); + return packageManager; + } catch (err) { + return false; + } +} + +function getAvailableInstallers() { + const installers = ["npm", "yarn", "pnpm"]; + const availableInstallers = installers.filter((installer) => isPmInstalled(installer)); + + if (!availableInstallers.length) { + utils.logger.error("No package manager found."); + process.exit(2); + } + return availableInstallers; +} + +module.exports = getAvailableInstallers; diff --git a/packages/webpack-cli/lib/utils/index.js b/packages/webpack-cli/lib/utils/index.js index 800174bec22..e5ac14c3407 100644 --- a/packages/webpack-cli/lib/utils/index.js +++ b/packages/webpack-cli/lib/utils/index.js @@ -23,6 +23,10 @@ module.exports = { return require("./dynamic-import-loader"); }, + get getAvailableInstallers() { + return require("./get-available-installers"); + }, + get getPackageManager() { return require("./get-package-manager"); },