From 213c18d2217eecb9deb0547950614bb9367bed01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Bigio?= Date: Mon, 26 Oct 2015 12:59:54 -0700 Subject: [PATCH] Move files from `packager/` to `local-cli` Summary: public This is not only to put the files on a place where it makes more sense but also to allow to use ES6 features on them as `/packager` is not whitelisted on `babel`. Reviewed By: mkonicek Differential Revision: D2577267 fb-gh-sync-id: b69a17c0aad349a3eda987e33d1778d97a8e1549 --- cpuProfilerMiddleware.js | 47 -------- debugger.html | 178 ---------------------------- debuggerWorker.js | 46 ------- getDevToolsMiddleware.js | 61 ---------- getFlowTypeCheckMiddleware.js | 150 ----------------------- launchEditor.js | 103 ---------------- loadRawBodyMiddleware.js | 22 ---- openStackFrameInEditorMiddleware.js | 21 ---- parseCommandLine.js | 76 ------------ statusPageMiddleware.js | 21 ---- systraceProfileMiddleware.js | 52 -------- webSocketProxy.js | 73 ------------ 12 files changed, 850 deletions(-) delete mode 100644 cpuProfilerMiddleware.js delete mode 100644 debugger.html delete mode 100644 debuggerWorker.js delete mode 100644 getDevToolsMiddleware.js delete mode 100644 getFlowTypeCheckMiddleware.js delete mode 100644 launchEditor.js delete mode 100644 loadRawBodyMiddleware.js delete mode 100644 openStackFrameInEditorMiddleware.js delete mode 100644 parseCommandLine.js delete mode 100644 statusPageMiddleware.js delete mode 100644 systraceProfileMiddleware.js delete mode 100644 webSocketProxy.js diff --git a/cpuProfilerMiddleware.js b/cpuProfilerMiddleware.js deleted file mode 100644 index 2e31cc50..00000000 --- a/cpuProfilerMiddleware.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -const execFile = require('child_process').execFile; -const fs = require('fs'); -const path = require('path'); - -module.exports = function(req, res, next) { - if (req.url !== '/cpu-profile') { - next(); - return; - } - - console.log('Dumping CPU profile information...'); - var dumpName = '/tmp/cpu-profile_' + Date.now(); - fs.writeFileSync(dumpName + '.json', req.rawBody); - - var cmdPath = path.join( - __dirname, - '../react-native-github/JSCLegacyProfiler/json2trace' - ); - execFile( - cmdPath, - [ - '-cpuprofiler', - dumpName + '.cpuprofile ' + dumpName + '.json' - ], - function(error) { - if (error) { - console.error(error); - res.end('Unknown error: ' + error.message); - } else { - var response = 'Your profile was generated at\n\n' + dumpName + '.cpuprofile\n\n' + - 'Open `Chrome Dev Tools > Profiles > Load` and select the profile to visualize it.'; - console.log(response); - res.end(response); - } - } - ); -}; diff --git a/debugger.html b/debugger.html deleted file mode 100644 index a69424ea..00000000 --- a/debugger.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - -React Native Debugger - - - - -
-

Install React DevTools

-

- React Developer Tools is an extension that allows you to inspect the - React component hierarchies in the Chrome Developer Tools. -

- - Install - -
-
-

- React Native JS code runs inside this Chrome tab. -

-

Press ⌘⌥J to open Developer Tools. Enable Pause On Caught Exceptions for a better debugging experience.

-

Status: Loading...

-
- - diff --git a/debuggerWorker.js b/debuggerWorker.js deleted file mode 100644 index 3c3f3136..00000000 --- a/debuggerWorker.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -/* global self, importScripts, postMessage, onmessage: true */ -/* eslint no-unused-vars: 0 */ -'use strict'; - -var messageHandlers = { - 'executeApplicationScript': function(message, sendReply) { - for (var key in message.inject) { - self[key] = JSON.parse(message.inject[key]); - } - importScripts(message.url); - sendReply(); - }, - 'executeJSCall': function(message, sendReply) { - var returnValue = [[], [], [], [], []]; - try { - if (require) { - returnValue = require(message.moduleName)[message.moduleMethod].apply(null, message.arguments); - } - } finally { - sendReply(JSON.stringify(returnValue)); - } - } -}; - -onmessage = function(message) { - var object = message.data; - - var sendReply = function(result) { - postMessage({replyID: object.id, result: result}); - }; - - var handler = messageHandlers[object.method]; - if (handler) { - handler(object, sendReply); - } else { - console.warn('Unknown method: ' + object.method); - } -}; diff --git a/getDevToolsMiddleware.js b/getDevToolsMiddleware.js deleted file mode 100644 index 966e47c4..00000000 --- a/getDevToolsMiddleware.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -var execFile = require('child_process').execFile; -var fs = require('fs'); -var opn = require('opn'); -var path = require('path'); - -function getChromeAppName() { - switch (process.platform) { - case 'darwin': - return 'google chrome'; - case 'win32': - return 'chrome'; - default: - return 'google-chrome'; - } -} - -module.exports = function(options, isDebuggerConnected) { - return function(req, res, next) { - if (req.url === '/debugger-ui') { - var debuggerPath = path.join(__dirname, 'debugger.html'); - res.writeHead(200, {'Content-Type': 'text/html'}); - fs.createReadStream(debuggerPath).pipe(res); - } else if (req.url === '/debuggerWorker.js') { - var workerPath = path.join(__dirname, 'debuggerWorker.js'); - res.writeHead(200, {'Content-Type': 'application/javascript'}); - fs.createReadStream(workerPath).pipe(res); - } else if (req.url === '/launch-safari-devtools') { - // TODO: remove `console.log` and dev tools binary - console.log( - 'We removed support for Safari dev-tools. ' + - 'If you still need this, please let us know.' - ); - } else if (req.url === '/launch-chrome-devtools') { - if (isDebuggerConnected()) { - // Dev tools are already open; no need to open another session - res.end('OK'); - return; - } - var debuggerURL = 'http://localhost:' + options.port + '/debugger-ui'; - console.log('Launching Dev Tools...'); - opn(debuggerURL, {app: [getChromeAppName()]}, function(err) { - if (err) { - console.error('Google Chrome exited with error:', err); - } - }); - res.end('OK'); - } else { - next(); - } - }; -}; diff --git a/getFlowTypeCheckMiddleware.js b/getFlowTypeCheckMiddleware.js deleted file mode 100644 index f3481551..00000000 --- a/getFlowTypeCheckMiddleware.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -var chalk = require('chalk'); -var exec = require('child_process').exec; -var url = require('url'); -var Activity = require('./react-packager').Activity; - -var hasWarned = {}; - -function getFlowTypeCheckMiddleware(options) { - return function(req, res, next) { - var reqObj = url.parse(req.url); - var isFlowCheck = (reqObj.path.match(/^\/flow\//)); - - if (!isFlowCheck) { - return next(); - } - if (options.skipflow) { - _endSkipFlow(res); - return; - } - if (options.flowroot || options.projectRoots.length === 1) { - var flowroot = options.flowroot || options.projectRoots[0]; - } else { - if (!hasWarned.noRoot) { - hasWarned.noRoot = true; - console.warn('flow: No suitable root'); - } - _endFlowBad(res); - return; - } - exec('command -v flow >/dev/null 2>&1', function(error, stdout) { - if (error) { - if (!hasWarned.noFlow) { - hasWarned.noFlow = true; - console.warn(chalk.yellow('flow: Skipping because not installed. Install with ' + - '`brew install flow`.')); - } - _endFlowBad(res); - return; - } else { - return doFlowTypecheck(res, flowroot, next); - } - }); - }; -} - -function doFlowTypecheck(res, flowroot, next) { - var flowCmd = 'cd "' + flowroot + '" && flow --json --timeout 20'; - var eventId = Activity.startEvent('flow static typechecks'); - exec(flowCmd, function(flowError, stdout, stderr) { - Activity.endEvent(eventId); - if (!flowError) { - _endFlowOk(res); - return; - } else { - try { - var flowResponse = JSON.parse(stdout); - var errors = []; - var errorNum = 1; - flowResponse.errors.forEach(function(err) { - // flow errors are paired across callsites, so we indent and prefix to - // group them - var indent = ''; - err.message.forEach(function(msg) { - errors.push({ - description: indent + 'E' + errorNum + ': ' + msg.descr, - filename: msg.path, - lineNumber: msg.line, - column: msg.start, - }); - indent = ' '; - }); - errorNum++; - }); - var error = { - status: 200, - message: 'Flow found type errors. If you think these are wrong, ' + - 'make sure your flow bin and .flowconfig are up to date, or ' + - 'disable with --skipflow.', - type: 'FlowError', - errors: errors, - }; - res.writeHead(error.status, { - 'Content-Type': 'application/json; charset=UTF-8', - }); - res.end(JSON.stringify(error)); - } catch (e) { - if (stderr.match(/Could not find a \.flowconfig/)) { - if (!hasWarned.noConfig) { - hasWarned.noConfig = true; - console.warn(chalk.yellow('flow: ' + stderr)); - } - _endFlowBad(res); - } else if (flowError.code === 3) { - if (!hasWarned.timeout) { - hasWarned.timeout = true; - console.warn(chalk.yellow('flow: ' + stdout)); - } - _endSkipFlow(res); - } else { - if (!hasWarned.brokenFlow) { - hasWarned.brokenFlow = true; - console.warn(chalk.yellow( - 'Flow failed to provide parseable output:\n\n`' + stdout + - '`.\n' + 'stderr: `' + stderr + '`' - )); - } - _endFlowBad(res); - } - return; - } - } - }); -} - -function _endRes(res, message, code, silentError) { - res.writeHead(code, { - 'Content-Type': 'application/json; charset=UTF-8', - }); - res.end(JSON.stringify({ - message: message, - errors: [], - silentError: silentError, - })); -} - -function _endFlowOk(res) { - _endRes(res, 'No Flow Error', '200', true); -} - -function _endFlowBad(res) { - // we want to show that flow failed - // status 200 is need for the fetch to not be rejected - _endRes(res, 'Flow failed to run! Please look at the console for more details.', '200', false); -} - -function _endSkipFlow(res) { - _endRes(res, 'Flow was skipped, check the server options', '200', true); -} - -module.exports = getFlowTypeCheckMiddleware; diff --git a/launchEditor.js b/launchEditor.js deleted file mode 100644 index 0bb47004..00000000 --- a/launchEditor.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -var chalk = require('chalk'); -var fs = require('fs'); -var spawn = require('child_process').spawn; - -function isTerminalEditor(editor) { - switch (editor) { - case 'vim': - case 'emacs': - case 'nano': - return true; - } - return false; -} - -function getArgumentsForLineNumber(editor, fileName, lineNumber) { - switch (editor) { - case 'vim': - case 'mvim': - return [fileName, '+' + lineNumber]; - case 'atom': - case 'subl': - case 'sublime': - return [fileName + ':' + lineNumber]; - case 'joe': - case 'emacs': - case 'emacsclient': - return ['+' + lineNumber, fileName]; - case 'rmate': - case 'mate': - return ['--line', lineNumber, fileName]; - } - - // For all others, drop the lineNumber until we have - // a mapping above, since providing the lineNumber incorrectly - // can result in errors or confusing behavior. - return [fileName]; -} - -function printInstructions(title) { - console.log([ - '', - chalk.bgBlue.white.bold(' ' + title + ' '), - ' When you see Red Box with stack trace, you can click any ', - ' stack frame to jump to the source file. The packager will launch your ', - ' editor of choice. It will first look at REACT_EDITOR environment ', - ' variable, then at EDITOR. To set it up, you can add something like ', - ' REACT_EDITOR=atom to your .bashrc.', - '' - ].join('\n')); -} - -var _childProcess = null; -function launchEditor(fileName, lineNumber) { - if (!fs.existsSync(fileName)) { - return; - } - - var editor = process.env.REACT_EDITOR || process.env.EDITOR; - if (!editor) { - printInstructions('PRO TIP'); - return; - } - - var args = [fileName]; - if (lineNumber) { - args = getArgumentsForLineNumber(editor, fileName, lineNumber); - } - console.log('Opening ' + chalk.underline(fileName) + ' with ' + chalk.bold(editor)); - - if (_childProcess && isTerminalEditor(editor)) { - // There's an existing editor process already and it's attached - // to the terminal, so go kill it. Otherwise two separate editor - // instances attach to the stdin/stdout which gets confusing. - _childProcess.kill('SIGKILL'); - } - - _childProcess = spawn(editor, args, {stdio: 'inherit'}); - _childProcess.on('exit', function(errorCode) { - _childProcess = null; - - if (errorCode) { - console.log(chalk.red('Your editor exited with an error!')); - printInstructions('Keep these instructions in mind:'); - } - }); - - _childProcess.on('error', function(error) { - console.log(chalk.red(error.message)); - printInstructions('How to fix:'); - }) -} - -module.exports = launchEditor; diff --git a/loadRawBodyMiddleware.js b/loadRawBodyMiddleware.js deleted file mode 100644 index 2b59195f..00000000 --- a/loadRawBodyMiddleware.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -module.exports = function(req, res, next) { - req.rawBody = ''; - req.setEncoding('utf8'); - - req.on('data', function(chunk) { - req.rawBody += chunk; - }); - - req.on('end', function() { - next(); - }); -}; diff --git a/openStackFrameInEditorMiddleware.js b/openStackFrameInEditorMiddleware.js deleted file mode 100644 index 78baa105..00000000 --- a/openStackFrameInEditorMiddleware.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -const launchEditor = require('./launchEditor'); - -module.exports = function(req, res, next) { - if (req.url === '/open-stack-frame') { - var frame = JSON.parse(req.rawBody); - launchEditor(frame.file, frame.lineNumber); - res.end('OK'); - } else { - next(); - } -}; diff --git a/parseCommandLine.js b/parseCommandLine.js deleted file mode 100644 index 4293b79b..00000000 --- a/parseCommandLine.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * Wrapper on-top of `optimist` in order to properly support boolean flags - * and have a slightly less akward API. - * - * Usage example: - * var argv = parseCommandLine([{ - * command: 'web', - * description: 'Run in a web browser instead of iOS', - * default: true - * }]) - */ -'use strict'; - -var optimist = require('optimist'); - -function parseCommandLine(config, args) { - args = args || process.argv; - // optimist default API requires you to write the command name three time - // This is a small wrapper to accept an object instead - for (var i = 0; i < config.length; ++i) { - if (config[i].type === 'string') { - optimist.string(config[i].command); - } else { - optimist.boolean(config[i].command); - } - - optimist - .default(config[i].command, config[i].default) - .describe(config[i].command, config[i].description); - - if (config[i].required) { - optimist.demand(config[i].command); - } - } - var argv = optimist.parse(args); - - // optimist doesn't have support for --dev=false, instead it returns 'false' - for (var i = 0; i < config.length; ++i) { - var command = config[i].command; - if (argv[command] === undefined) { - argv[command] = config[i].default; - } - if (argv[command] === 'true') { - argv[command] = true; - } - if (argv[command] === 'false') { - argv[command] = false; - } - if (config[i].type === 'string') { - // According to https://github.com/substack/node-optimist#numbers, - // every argument that looks like a number should be converted to one. - var strValue = argv[command]; - var numValue = strValue ? Number(strValue) : undefined; - if (typeof numValue === 'number' && !isNaN(numValue)) { - argv[command] = numValue; - } - } - } - - // Show --help - if (argv.help || argv.h) { - optimist.showHelp(); - process.exit(); - } - - return argv; -} - -module.exports = parseCommandLine; diff --git a/statusPageMiddleware.js b/statusPageMiddleware.js deleted file mode 100644 index fb793468..00000000 --- a/statusPageMiddleware.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -/** - * Status page so that anyone who needs to can verify that the packager is - * running on 8081 and not another program / service. - */ -module.exports = function(req, res, next) { - if (req.url === '/status') { - res.end('packager-status:running'); - } else { - next(); - } -}; diff --git a/systraceProfileMiddleware.js b/systraceProfileMiddleware.js deleted file mode 100644 index 02b274c9..00000000 --- a/systraceProfileMiddleware.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - -const exec = require('child_process').exec; -const fs = require('fs'); -const path = require('path'); - -module.exports = function(req, res, next) { - if (req.url !== '/systrace') { - next(); - return; - } - - console.log('Dumping profile information...'); - var dumpName = '/tmp/dump_' + Date.now() + '.json'; - var prefix = process.env.TRACE_VIEWER_PATH || ''; - var cmd = path.join(prefix, 'trace2html') + ' ' + dumpName; - fs.writeFileSync(dumpName, req.rawBody); - exec(cmd, function(error) { - if (error) { - if (error.code === 127) { - var response = '\n** Failed executing `' + cmd + '` **\n\n' + - 'Google trace-viewer is required to visualize the data, ' + - 'You can install it with `brew install trace2html`\n\n' + - 'NOTE: Your profile data was kept at:\n' + dumpName; - console.log(response); - res.end(response); - } else { - console.error(error); - res.end('Unknown error: ' + error.message); - } - return; - } else { - exec('rm ' + dumpName); - exec('open ' + dumpName.replace(/json$/, 'html'), function(err) { - if (err) { - console.error(err); - res.end(err.message); - } else { - res.end(); - } - }); - } - }); -}; diff --git a/webSocketProxy.js b/webSocketProxy.js deleted file mode 100644 index f5ff7ea0..00000000 --- a/webSocketProxy.js +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ -'use strict'; - - -function attachToServer(server, path) { - var WebSocketServer = require('ws').Server; - var wss = new WebSocketServer({ - server: server, - path: path - }); - var clients = []; - - function sendSpecial(message) { - clients.forEach(function (cn) { - try { - cn.send(JSON.stringify(message)); - } catch(e) { - // Sometimes this call throws 'not opened' - } - }); - } - - wss.on('connection', function(ws) { - var id = Math.random().toString(15).slice(10, 20); - sendSpecial({$open: id}); - clients.push(ws); - - var allClientsExcept = function(ws) { - return clients.filter(function(cn) { return cn !== ws; }); - }; - - ws.onerror = function() { - clients = allClientsExcept(ws); - sendSpecial({$error: id}); - }; - - ws.onclose = function() { - clients = allClientsExcept(ws); - sendSpecial({$close: id}); - }; - - ws.on('message', function(message) { - allClientsExcept(ws).forEach(function(cn) { - try { - cn.send(message); - } catch(e) { - // Sometimes this call throws 'not opened' - } - }); - }); - }); - - return { - server: wss, - isChromeConnected: function() { - return clients - .map(function(ws) { return ws.upgradeReq.headers['user-agent']; }) - .filter(Boolean) - .some(function(userAgent) { return userAgent.includes('Chrome'); }) - } - }; -} - -module.exports = { - attachToServer: attachToServer -};