123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- "use strict";
- const inquirer = require("inquirer");
- const path = require("path");
- const chalk = require("chalk");
- const spawn = require("cross-spawn");
- const List = require("webpack-addons").List;
- const processPromise = require("../utils/resolve-packages").processPromise;
- /**
- *
- * Installs WDS using NPM with --save --dev etc
- *
- * @param {Object} cmd - arg to spawn with
- * @returns {Void}
- */
- const spawnNPMWithArg = cmd =>
- spawn.sync("npm", ["install", "webpack-dev-server", cmd], {
- stdio: "inherit"
- });
- /**
- *
- * Installs WDS using Yarn with add etc
- *
- * @param {Object} cmd - arg to spawn with
- * @returns {Void}
- */
- const spawnYarnWithArg = cmd =>
- spawn.sync("yarn", ["add", "webpack-dev-server", cmd], {
- stdio: "inherit"
- });
- /**
- *
- * Find the path of a given module
- *
- * @param {Object} dep - dependency to find
- * @returns {String} string with given path
- */
- const getRootPathModule = dep => path.resolve(process.cwd(), dep);
- /**
- *
- * Prompts for installing the devServer and running it
- *
- * @param {Object} args - args processed from the CLI
- * @returns {Function} invokes the devServer API
- */
- function serve() {
- let packageJSONPath = getRootPathModule("package.json");
- if (!packageJSONPath) {
- console.log(
- "\n",
- chalk.red("✖ Could not find your package.json file"),
- "\n"
- );
- process.exit(1);
- }
- let packageJSON = require(packageJSONPath);
- /*
- * We gotta do this, cause some configs might not have devdep,
- * dep or optional dep, so we'd need sanity checks for each
- */
- let hasDevServerDep = packageJSON
- ? Object.keys(packageJSON).filter(p => packageJSON[p]["webpack-dev-server"])
- : [];
- if (hasDevServerDep.length) {
- let WDSPath = getRootPathModule(
- "node_modules/webpack-dev-server/bin/webpack-dev-server.js"
- );
- if (!WDSPath) {
- console.log(
- "\n",
- chalk.red(
- "✖ Could not find the webpack-dev-server dependency in node_modules root path"
- )
- );
- console.log(
- chalk.bold.green(" ✔︎"),
- "Try this command:",
- chalk.bold.green("rm -rf node_modules && npm install")
- );
- process.exit(1);
- }
- return require(WDSPath);
- } else {
- process.stdout.write(
- "\n" +
- chalk.bold(
- "✖ We didn't find any webpack-dev-server dependency in your project,"
- ) +
- "\n" +
- chalk.bold.green(" 'webpack serve'") +
- " " +
- chalk.bold("requires you to have it installed ") +
- "\n\n"
- );
- return inquirer
- .prompt([
- {
- type: "confirm",
- name: "confirmDevserver",
- message: "Do you want to install it? (default: Y)",
- default: "Y"
- }
- ])
- .then(answer => {
- if (answer["confirmDevserver"]) {
- return inquirer
- .prompt(
- List(
- "confirmDepType",
- "What kind of dependency do you want it to be under? (default: devDependency)",
- ["devDependency", "optionalDependency", "dependency"]
- )
- )
- .then(depTypeAns => {
- const packager = getRootPathModule("package-lock.json")
- ? "npm"
- : "yarn";
- let spawnAction;
- if (depTypeAns["confirmDepType"] === "devDependency") {
- if (packager === "yarn") {
- spawnAction = _ => spawnYarnWithArg("--dev");
- } else {
- spawnAction = _ => spawnNPMWithArg("--save-dev");
- }
- }
- if (depTypeAns["confirmDepType"] === "dependency") {
- if (packager === "yarn") {
- spawnAction = _ => spawnYarnWithArg(" ");
- } else {
- spawnAction = _ => spawnNPMWithArg("--save");
- }
- }
- if (depTypeAns["confirmDepType"] === "optionalDependency") {
- if (packager === "yarn") {
- spawnAction = _ => spawnYarnWithArg("--optional");
- } else {
- spawnAction = _ => spawnNPMWithArg("--save-optional");
- }
- }
- return processPromise(spawnAction()).then(_ => {
- // Recursion doesn't work well with require call being cached
- delete require.cache[require.resolve(packageJSONPath)];
- return serve();
- });
- });
- } else {
- console.log(chalk.bold.red("✖ Serve aborted due cancelling"));
- process.exitCode = 1;
- }
- })
- .catch(err => {
- console.log(chalk.red("✖ Serve aborted due to some errors"));
- console.error(err);
- process.exitCode = 1;
- });
- }
- }
- module.exports = {
- serve,
- getRootPathModule,
- spawnNPMWithArg,
- spawnYarnWithArg
- };
|