diff --git a/bin/injectServer.js b/bin/injectServer.js new file mode 100644 index 0000000..5236338 --- /dev/null +++ b/bin/injectServer.js @@ -0,0 +1,57 @@ +var fs = require('fs'); +var path = require('path'); + +var name = 'remotedev-server'; +var startFlag = '/* ' + name + ' start */'; +var endFlag = '/* ' + name + ' end */'; +var serverFlag = ' _server(argv, config, resolve, reject);'; + +exports.dir = 'local-cli/server'; +exports.file = 'server.js'; +exports.fullPath = path.join(exports.dir, exports.file); + +exports.inject = function(modulePath, options) { + var filePath = path.join(modulePath, exports.fullPath); + if (!fs.existsSync(filePath)) return false; + + var code = [ + startFlag, + ' require("' + name + '")(' + JSON.stringify(options) + ')', + ' .then(_remotedev =>', + ' _remotedev.on("ready", () => {', + ' if (!_remotedev.portAlreadyUsed) console.log("-".repeat(80));', + ' ' + serverFlag, + ' })', + ' );', + endFlag, + ].join('\n'); + + var serverCode = fs.readFileSync(filePath, 'utf-8'); + var start = serverCode.indexOf(startFlag); // already injected ? + var end = serverCode.indexOf(endFlag) + endFlag.length; + if (start === -1) { + start = serverCode.indexOf(serverFlag); + end = start + serverFlag.length; + } + fs.writeFileSync( + filePath, + serverCode.substr(0, start) + code + serverCode.substr(end, serverCode.length) + ); + return true; +}; + +exports.revert = function(modulePath) { + var filePath = path.join(modulePath, exports.fullPath); + if (!fs.existsSync(filePath)) return false; + + var serverCode = fs.readFileSync(filePath, 'utf-8'); + var start = serverCode.indexOf(startFlag); // already injected ? + var end = serverCode.indexOf(endFlag) + endFlag.length; + if (start !== -1) { + fs.writeFileSync( + filePath, + serverCode.substr(0, start) + serverFlag + serverCode.substr(end, serverCode.length) + ); + } + return true; +}; \ No newline at end of file diff --git a/bin/remotedev.js b/bin/remotedev.js index 7788057..d16df6f 100755 --- a/bin/remotedev.js +++ b/bin/remotedev.js @@ -2,6 +2,9 @@ var fs = require('fs'); var path = require('path'); var argv = require('minimist')(process.argv.slice(2)); +var chalk = require('chalk'); +var getOptions = require('./getOptions'); +var injectServer = require('./injectServer'); function readFile(filePath) { return fs.readFileSync(path.resolve(process.cwd(), filePath), 'utf-8'); @@ -12,4 +15,42 @@ if (argv.protocol === 'https') { argv.cert = argv.cert ? readFile(argv.cert) : null; } +function log(pass, msg) { + var prefix = pass ? chalk.green.bgBlack('PASS') : chalk.red.bgBlack('FAIL'); + var color = pass ? chalk.blue : chalk.red; + console.log(prefix, color(msg)); +}; + +function getModuleName(type) { + switch (type) { + case 'desktop': + return 'react-native-desktop'; + case 'reactnative': + default: + return 'react-native'; + } +} + +function getModulePath(type) { + var moduleName = getModuleName(type); + return path.join(process.cwd(), 'node_modules', moduleName); +} + +if (argv.revert) { + var pass = injectServer.revert(getModulePath(argv.revert)); + var msg = 'Revert injection of RemoteDev server from React Native local server'; + log(pass, msg + (!pass ? ', the file `' + injectServer.fullPath + '` not found.' : '.')); + + process.exit(pass ? 0 : 1); +} + +if (argv.injectserver) { + var options = getOptions(argv); + var pass = injectServer.inject(getModulePath(argv.injectserver), options); + var msg = 'Inject RemoteDev server into React Native local server'; + log(pass, msg + (pass ? '.' : ', the file `' + injectServer.fullPath + '` not found.')); + + process.exit(pass ? 0 : 1); +} + require('./server')(argv); diff --git a/package.json b/package.json index 36d7fb5..81e6e02 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "homepage": "https://github.com/zalmoxisus/remotedev-server", "dependencies": { "body-parser": "^1.15.0", + "chalk": "^1.1.3", "cors": "^2.7.1", "ejs": "^2.4.1", "express": "^4.13.3",