Skip to content

Commit

Permalink
feat(react-hot-loader): Preinstall react and react-dom for -r option
Browse files Browse the repository at this point in the history
  • Loading branch information
d4rkr00t committed Feb 6, 2017
1 parent 93eac9a commit 3307231
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 1 deletion.
26 changes: 26 additions & 0 deletions lib/dev-server-command.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = [
exports.requestCreatingAnEntryPoint = requestCreatingAnEntryPoint;
exports.createFile = createFile;

var _child_process = require('child_process');

var _fs = require('fs');

var _fs2 = _interopRequireDefault(_fs);
Expand All @@ -23,6 +25,10 @@ var _opn2 = _interopRequireDefault(_opn);

var _fsExtra = require('fs-extra');

var _resolve = require('resolve');

var _resolve2 = _interopRequireDefault(_resolve);

var _webpackDevServer = require('./webpack-dev-server');

var _webpackDevServer2 = _interopRequireDefault(_webpackDevServer);
Expand Down Expand Up @@ -72,6 +78,20 @@ function createFile(filename) {
});
}

function installModule(moduleName) {
return new Promise(resolve => {
try {
_resolve2.default.sync(moduleName, { basedir: process.cwd() });
(0, _messages.devServerSkipInstallingModuleMsg)(moduleName);
} catch (e) {
(0, _child_process.execSync)(`npm install ${moduleName} --silent`, { cwd: process.cwd() });
(0, _messages.devServerInstallingModuleMsg)(moduleName);
}

resolve();
});
}

/**
* Aik dev server command
*/
Expand All @@ -96,6 +116,12 @@ exports.default = (() => {

(0, _messages.devServerInvalidBuildMsg)();

if (flags.react) {
(0, _messages.devServerReactRequired)();
yield installModule('react');
yield installModule('react-dom');
}

const ngrokUrl = flags.ngrok && (yield (0, _ngrok2.default)(flags));
const params = (0, _params2.default)(filename, flags, ngrokUrl, false);
yield (0, _webpackDevServer2.default)(filename, flags, params);
Expand Down
15 changes: 15 additions & 0 deletions lib/utils/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ exports.devServerCompiledWithWarningsMsg = devServerCompiledWithWarningsMsg;
exports.devServerFileDoesNotExistMsg = devServerFileDoesNotExistMsg;
exports.devServerRestartMsg = devServerRestartMsg;
exports.devServerModuleDoesntExists = devServerModuleDoesntExists;
exports.devServerReactRequired = devServerReactRequired;
exports.devServerInstallingModuleMsg = devServerInstallingModuleMsg;
exports.devServerSkipInstallingModuleMsg = devServerSkipInstallingModuleMsg;
exports.builderBanner = builderBanner;
exports.builderRemovingDistMsg = builderRemovingDistMsg;
exports.builderRunningBuildMsg = builderRunningBuildMsg;
Expand Down Expand Up @@ -160,6 +163,18 @@ function devServerModuleDoesntExists(module, filename) {
return print([errorBadge() + ' ' + _chalk2.default.red(`Module '${module}' doesn't exists.`), '', `Error in ${filename}`, '', `Webpack tried to resolve module ${_chalk2.default.bgYellow.black(' ' + module + ' ')} which doesn't exist.`, '', `It's likely caused by ${_chalk2.default.yellow('typo')} in the module name.`, '']);
}

function devServerReactRequired() {
return print([warningBadge() + ' ' + _chalk2.default.yellow(`"react" required.`), '', 'In order to make "react-hot-loader" work, "react" and "react-dom" are required.', '', _chalk2.default.blue('Installing required modules...'), '']);
}

function devServerInstallingModuleMsg(moduleName) {
return print([`Installing module "${_chalk2.default.yellow(moduleName)}" ...`]);
}

function devServerSkipInstallingModuleMsg(moduleName) {
return print([`Module "${_chalk2.default.yellow(moduleName)}" has already been installed ${_chalk2.default.dim('[skipping].')}`]);
}

/**
*
* Build Messages
Expand Down
27 changes: 26 additions & 1 deletion src/dev-server-command.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
/* @flow */

import { execSync } from 'child_process';
import fs from 'fs';
import readline from 'readline';
import opn from 'opn';
import { outputFile } from 'fs-extra';
import resolveModule from 'resolve';
import createWebpackDevServer from './webpack-dev-server';
import createNgrokTunnel from './ngrok';
import createParams from './utils/params';
import { devServerFileDoesNotExistMsg, devServerInvalidBuildMsg, fileDoesNotExistMsg } from './utils/messages';
import {
devServerFileDoesNotExistMsg, devServerInvalidBuildMsg, fileDoesNotExistMsg,
devServerReactRequired, devServerInstallingModuleMsg, devServerSkipInstallingModuleMsg
} from './utils/messages';

export function requestCreatingAnEntryPoint(filename: string): Promise<boolean> {
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -40,6 +45,20 @@ export function createFile(filename: string): Promise<*> {
});
}

function installModule(moduleName: string) {
return new Promise(resolve => {
try {
resolveModule.sync(moduleName, { basedir: process.cwd() });
devServerSkipInstallingModuleMsg(moduleName);
} catch (e) {
execSync(`npm install ${moduleName} --silent`, { cwd: process.cwd() });
devServerInstallingModuleMsg(moduleName);
}

resolve();
});
}

/**
* Aik dev server command
*/
Expand All @@ -59,6 +78,12 @@ export default async function aikDevServer(input: string[], flags: CLIFlags): Pr

devServerInvalidBuildMsg();

if (flags.react) {
devServerReactRequired();
await installModule('react');
await installModule('react-dom');
}

const ngrokUrl: NgrokUrl = flags.ngrok && await createNgrokTunnel(flags);
const params: AikParams = createParams(filename, flags, ngrokUrl, false);
await createWebpackDevServer(filename, flags, params);
Expand Down
20 changes: 20 additions & 0 deletions src/utils/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,26 @@ export function devServerModuleDoesntExists(module: string, filename: string) {
]);
}

export function devServerReactRequired() {
return print([
warningBadge() + ' ' + chalk.yellow(`"react" required.`),
'',
'In order to make "react-hot-loader" work, "react" and "react-dom" are required.',
'',
chalk.blue('Installing required modules...'),
''
]);
}

export function devServerInstallingModuleMsg(moduleName: string) {
return print([`Installing module "${chalk.yellow(moduleName)}" ...`]);
}

export function devServerSkipInstallingModuleMsg(moduleName: string) {
return print([`Module "${chalk.yellow(moduleName)}" has already been installed ${chalk.dim('[skipping].')}`]);
}


/**
*
* Build Messages
Expand Down

0 comments on commit 3307231

Please sign in to comment.