From ed5828d0223089557ccc85205c6b4eeb9db7f620 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Mon, 7 Jun 2021 18:54:35 +0530 Subject: [PATCH 1/3] feat: add ability to specify a package manager of choice --- packages/generators/src/init-generator.ts | 11 ++++++-- .../lib/utils/get-available-installers.js | 25 +++++++++++++++++++ packages/webpack-cli/lib/utils/index.js | 4 +++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 packages/webpack-cli/lib/utils/get-available-installers.js 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"); }, From f473db5803ce2d582e6b8300cad5e50bd6da0d6a Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Mon, 7 Jun 2021 23:41:02 +0530 Subject: [PATCH 2/3] chore: choose default installer based on the lock file presence --- packages/generators/src/init-generator.ts | 4 +++- packages/webpack-cli/lib/utils/get-available-installers.js | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/generators/src/init-generator.ts b/packages/generators/src/init-generator.ts index 5692aaf0a9a..e820e367146 100644 --- a/packages/generators/src/init-generator.ts +++ b/packages/generators/src/init-generator.ts @@ -100,12 +100,14 @@ export default class InitGenerator extends CustomGenerator { } public async installPlugins(): Promise { + // Prompt for the package manager of choice + const defaultPackager = this.utils.getPackageManager(); const { packager } = await Question.List( this, "packager", "Pick a package manager:", this.utils.getAvailableInstallers(), - "npm", + defaultPackager, false, ); const opts: { diff --git a/packages/webpack-cli/lib/utils/get-available-installers.js b/packages/webpack-cli/lib/utils/get-available-installers.js index 900d7987ea6..d2ee92414c5 100644 --- a/packages/webpack-cli/lib/utils/get-available-installers.js +++ b/packages/webpack-cli/lib/utils/get-available-installers.js @@ -2,7 +2,7 @@ const { sync } = require("execa"); const utils = require("./"); -function isPmInstalled(packageManager) { +function hasPmInstalled(packageManager) { try { sync(packageManager, ["--version"]); return packageManager; @@ -13,7 +13,7 @@ function isPmInstalled(packageManager) { function getAvailableInstallers() { const installers = ["npm", "yarn", "pnpm"]; - const availableInstallers = installers.filter((installer) => isPmInstalled(installer)); + const availableInstallers = installers.filter((installer) => hasPmInstalled(installer)); if (!availableInstallers.length) { utils.logger.error("No package manager found."); From b4ef0650bbcb5e4b8349a44535d43b678bdf7af0 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 Date: Wed, 9 Jun 2021 19:25:40 +0530 Subject: [PATCH 3/3] test: update test suite --- packages/generators/src/init-generator.ts | 2 +- test/init/init.test.js | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/generators/src/init-generator.ts b/packages/generators/src/init-generator.ts index e820e367146..d8868052102 100644 --- a/packages/generators/src/init-generator.ts +++ b/packages/generators/src/init-generator.ts @@ -108,7 +108,7 @@ export default class InitGenerator extends CustomGenerator { "Pick a package manager:", this.utils.getAvailableInstallers(), defaultPackager, - false, + this.force, ); const opts: { dev?: boolean; diff --git a/test/init/init.test.js b/test/init/init.test.js index a8ef6cca672..c7221110496 100644 --- a/test/init/init.test.js +++ b/test/init/init.test.js @@ -144,7 +144,7 @@ describe("init command", () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ["init"], - [`${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, ENTER], + [`${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, ENTER, ENTER], ); expect(stdout).toContain("Project has been initialised with webpack!"); @@ -170,7 +170,7 @@ describe("init command", () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ["init"], - [`${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, ENTER], + [`${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, ENTER, ENTER], ); expect(stdout).toContain("Project has been initialised with webpack!"); @@ -205,6 +205,7 @@ describe("init command", () => { `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, + ENTER, ], ); @@ -239,6 +240,7 @@ describe("init command", () => { `n${ENTER}`, `y${ENTER}`, `n${ENTER}`, + ENTER, ], ); @@ -279,6 +281,7 @@ describe("init command", () => { `n${ENTER}`, `n${ENTER}`, `y${ENTER}`, + ENTER, ], ); @@ -313,6 +316,7 @@ describe("init command", () => { `y${ENTER}`, `y${ENTER}`, `n${ENTER}`, + ENTER, ], ); @@ -353,6 +357,7 @@ describe("init command", () => { `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, + ENTER, ], ); @@ -387,6 +392,7 @@ describe("init command", () => { `n${ENTER}`, `n${ENTER}`, `n${ENTER}`, + ENTER, ], ); @@ -412,7 +418,7 @@ describe("init command", () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ["init"], - [ENTER, ENTER, `n${ENTER}`, `n${ENTER}`, ENTER], + [ENTER, ENTER, `n${ENTER}`, `n${ENTER}`, ENTER, ENTER], ); expect(stdout).toContain("Do you want to use webpack-dev-server?"); @@ -445,6 +451,7 @@ describe("init command", () => { `${DOWN}${ENTER}`, ENTER, `n${ENTER}`, + ENTER, ], ); @@ -476,7 +483,7 @@ describe("init command", () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ["init"], - [ENTER, `n${ENTER}`, ENTER, `n${ENTER}`, ENTER], + [ENTER, `n${ENTER}`, ENTER, `n${ENTER}`, ENTER, ENTER], ); expect(stdout).toContain( @@ -504,7 +511,7 @@ describe("init command", () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ["init"], - [ENTER, `n${ENTER}`, ENTER, ENTER, ENTER], + [ENTER, `n${ENTER}`, ENTER, ENTER, ENTER, ENTER], ); expect(stdout).toContain("Do you want to add PWA support?");