diff --git a/local-cli/server/formatBanner.js b/local-cli/server/formatBanner.js index f54095b0540..9ae49a65e36 100644 --- a/local-cli/server/formatBanner.js +++ b/local-cli/server/formatBanner.js @@ -8,7 +8,7 @@ */ 'use strict'; -var _ = require('underscore'); +var _ = require('lodash'); var wordwrap = require('wordwrap'); var HORIZONTAL_LINE = '\u2500'; @@ -45,7 +45,7 @@ var BOTTOM_RIGHT = '\u2518'; function formatBanner(message, options) { options = options || {}; _.defaults(options, { - chalkFunction: _.identity, + chalkFunction: (fn) => fn, width: 80, marginLeft: 0, marginRight: 0, @@ -71,7 +71,7 @@ function formatBanner(message, options) { var left = spaces(marginLeft) + VERTICAL_LINE + spaces(paddingLeft); var right = spaces(paddingRight) + VERTICAL_LINE + spaces(marginRight); - var bodyLines = _.flatten([ + var bodyLines = _.flattenDeep([ arrayOf('', paddingTop), body.split('\n'), arrayOf('', paddingBottom), @@ -88,7 +88,7 @@ function formatBanner(message, options) { spaces(marginRight); var bottom = spaces(marginLeft) + BOTTOM_LEFT + horizontalBorderLine + BOTTOM_RIGHT + spaces(marginRight); - return _.flatten([top, bodyLines, bottom]).join('\n'); + return _.flattenDeep([top, bodyLines, bottom]).join('\n'); } function spaces(number) { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 6315c5f659a..830a3defa14 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -2167,9 +2167,9 @@ } }, "flow-bin": { - "version": "0.21.0", - "from": "flow-bin@>=0.21.0 <0.22.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.21.0.tgz", + "version": "0.22.1", + "from": "flow-bin@latest", + "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.22.1.tgz", "dependencies": { "bin-wrapper": { "version": "2.1.3", @@ -2330,7 +2330,7 @@ }, "is-absolute": { "version": "0.1.7", - "from": "is-absolute@>=0.1.4 <0.2.0", + "from": "is-absolute@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "dependencies": { "is-relative": { @@ -2417,7 +2417,7 @@ "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "ansi-regex@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } @@ -2429,7 +2429,7 @@ "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "ansi-regex@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } @@ -2508,7 +2508,7 @@ }, "is-absolute": { "version": "0.1.7", - "from": "is-absolute@>=0.1.4 <0.2.0", + "from": "is-absolute@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "dependencies": { "is-relative": { @@ -2585,7 +2585,7 @@ }, "is-absolute": { "version": "0.1.7", - "from": "is-absolute@>=0.1.5 <0.2.0", + "from": "is-absolute@>=0.1.7 <0.2.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "dependencies": { "is-relative": { @@ -3224,7 +3224,7 @@ "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "ansi-regex@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } @@ -3236,7 +3236,7 @@ "dependencies": { "ansi-regex": { "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", + "from": "ansi-regex@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" } } @@ -3250,7 +3250,7 @@ }, "lpad-align": { "version": "1.1.0", - "from": "lpad-align@>=1.0.1 <2.0.0", + "from": "lpad-align@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.0.tgz", "dependencies": { "lpad": { @@ -3324,9 +3324,9 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { - "version": "7.0.0", + "version": "7.0.3", "from": "glob@>=7.0.0 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz" + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz" } } } @@ -3539,16 +3539,16 @@ "from": "boom@^2.8.x", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, - "brace-expansion": { - "version": "1.1.1", - "from": "brace-expansion@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz" - }, "caseless": { "version": "0.11.0", "from": "caseless@~0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz" + }, "chalk": { "version": "1.1.1", "from": "chalk@^1.1.1", @@ -3639,16 +3639,16 @@ "from": "generate-function@^2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, - "generate-object-property": { - "version": "1.2.0", - "from": "generate-object-property@^1.1.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" - }, "graceful-fs": { "version": "4.1.2", "from": "graceful-fs@4.1", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@^1.1.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + }, "graceful-readlink": { "version": "1.0.1", "from": "graceful-readlink@>= 1.0.0", @@ -3684,11 +3684,6 @@ "from": "http-signature@~0.11.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz" }, - "inherits": { - "version": "2.0.1", - "from": "inherits@*", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, "ini": { "version": "1.3.4", "from": "ini@~1.3.0", @@ -3699,21 +3694,26 @@ "from": "is-my-json-valid@^2.12.2", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz" }, + "inherits": { + "version": "2.0.1", + "from": "inherits@*", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, "is-property": { "version": "1.0.2", "from": "is-property@^1.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" }, - "isstream": { - "version": "0.1.2", - "from": "isstream@~0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, + "isstream": { + "version": "0.1.2", + "from": "isstream@~0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@~5.0.1", @@ -3729,16 +3729,16 @@ "from": "lodash._basetostring@^3.0.0", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz" }, - "lodash.pad": { - "version": "3.1.1", - "from": "lodash.pad@^3.0.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz" - }, "lodash._createpadding": { "version": "3.6.1", "from": "lodash._createpadding@^3.0.0", "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz" }, + "lodash.pad": { + "version": "3.1.1", + "from": "lodash.pad@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz" + }, "lodash.padleft": { "version": "3.1.1", "from": "lodash.padleft@^3.0.0", @@ -3774,16 +3774,16 @@ "from": "mkdirp@>=0.3.0 <0.4.0||>=0.4.0 <0.5.0||>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, - "npmlog": { - "version": "1.2.1", - "from": "npmlog@~1.2.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" - }, "node-uuid": { "version": "1.4.3", "from": "node-uuid@~1.4.3", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" }, + "npmlog": { + "version": "1.2.1", + "from": "npmlog@~1.2.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" + }, "oauth-sign": { "version": "0.8.0", "from": "oauth-sign@~0.8.0", @@ -3839,31 +3839,31 @@ "from": "string_decoder@~0.10.x", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, - "strip-ansi": { - "version": "3.0.0", - "from": "strip-ansi@^3.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" - }, "stringstream": { "version": "0.0.5", "from": "stringstream@~0.0.4", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@^3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" + }, "strip-json-comments": { "version": "0.1.3", "from": "strip-json-comments@0.1.x", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" }, - "supports-color": { - "version": "2.0.0", - "from": "supports-color@^2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, "tar": { "version": "2.2.1", "from": "tar@~2.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@^2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, "tough-cookie": { "version": "2.2.0", "from": "tough-cookie@~2.2.0", @@ -5147,7 +5147,7 @@ }, "lodash": { "version": "3.10.1", - "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "from": "lodash@>=3.10.1 <4.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, "lodash._baseassign": { @@ -6349,11 +6349,6 @@ "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, - "underscore": { - "version": "1.8.3", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" - }, "user-home": { "version": "1.1.1", "from": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", diff --git a/package.json b/package.json index 54925a9da9c..9d926ceca5a 100644 --- a/package.json +++ b/package.json @@ -151,6 +151,7 @@ "json-stable-stringify": "^1.0.1", "json5": "^0.4.0", "jstransform": "^11.0.3", + "lodash": "^3.10.1", "mkdirp": "^0.5.1", "module-deps": "^3.9.1", "node-fetch": "^1.3.3", @@ -169,7 +170,6 @@ "stacktrace-parser": "^0.1.3", "temp": "0.8.3", "uglify-js": "^2.6.2", - "underscore": "^1.8.3", "wordwrap": "^1.0.0", "worker-farm": "^1.3.1", "ws": "^0.8.0", diff --git a/packager/react-packager/index.js b/packager/react-packager/index.js index a392bdf5dd9..dce805c8b95 100644 --- a/packager/react-packager/index.js +++ b/packager/react-packager/index.js @@ -14,7 +14,6 @@ require('fast-path').replace(); useGracefulFs(); var debug = require('debug'); -var omit = require('underscore').omit; var Activity = require('./src/Activity'); exports.createServer = createServer; @@ -118,6 +117,16 @@ function createNonPersistentServer(options) { return createServer(options); } +function omit(obj, blacklistedKeys) { + return Object.keys(obj).reduce((clone, key) => { + if (blacklistedKeys.indexOf(key) === -1) { + clone[key] = obj[key]; + } + + return clone; + }, {}); +} + // we need to listen on a socket as soon as a server is created, but only once. // This file also serves as entry point when spawning a socket server; in that // case we need to start the server immediately. diff --git a/packager/react-packager/src/Bundler/Bundle.js b/packager/react-packager/src/Bundler/Bundle.js index f424702722e..e53d3c3a9d9 100644 --- a/packager/react-packager/src/Bundler/Bundle.js +++ b/packager/react-packager/src/Bundler/Bundle.js @@ -8,7 +8,7 @@ */ 'use strict'; -const _ = require('underscore'); +const _ = require('lodash'); const base64VLQ = require('./base64-vlq'); const BundleBase = require('./BundleBase'); const ModuleTransport = require('../lib/ModuleTransport'); @@ -143,7 +143,7 @@ class Bundle extends BundleBase { if (options.excludeSource) { if (map.sourcesContent && map.sourcesContent.length) { - map = _.extend({}, map, {sourcesContent: []}); + map = Object.assign({}, map, {sourcesContent: []}); } } diff --git a/packager/react-packager/src/Bundler/BundleBase.js b/packager/react-packager/src/Bundler/BundleBase.js index d3794a433c2..b2f2d251aeb 100644 --- a/packager/react-packager/src/Bundler/BundleBase.js +++ b/packager/react-packager/src/Bundler/BundleBase.js @@ -8,7 +8,6 @@ */ 'use strict'; -const _ = require('underscore'); const ModuleTransport = require('../lib/ModuleTransport'); class BundleBase { @@ -66,7 +65,7 @@ class BundleBase { return this._source; } - this._source = _.pluck(this._modules, 'code').join('\n'); + this._source = this._modules.map((module) => module.code).join('\n'); return this._source; } diff --git a/packager/react-packager/src/Bundler/HMRBundle.js b/packager/react-packager/src/Bundler/HMRBundle.js index d9725eea166..90d6e3b3d57 100644 --- a/packager/react-packager/src/Bundler/HMRBundle.js +++ b/packager/react-packager/src/Bundler/HMRBundle.js @@ -8,7 +8,6 @@ */ 'use strict'; -const _ = require('underscore'); const BundleBase = require('./BundleBase'); const ModuleTransport = require('../lib/ModuleTransport'); diff --git a/packager/react-packager/src/Bundler/__tests__/Bundler-test.js b/packager/react-packager/src/Bundler/__tests__/Bundler-test.js index e108177e279..ac37db89689 100644 --- a/packager/react-packager/src/Bundler/__tests__/Bundler-test.js +++ b/packager/react-packager/src/Bundler/__tests__/Bundler-test.js @@ -11,7 +11,7 @@ jest .setMock('worker-farm', () => () => undefined) .dontMock('node-haste/node_modules/throat') - .dontMock('underscore') + .dontMock('lodash') .dontMock('../../lib/ModuleTransport') .setMock('uglify-js') .dontMock('../'); diff --git a/packager/react-packager/src/JSTransformer/__mocks__/underscore.js b/packager/react-packager/src/JSTransformer/__mocks__/lodash.js similarity index 89% rename from packager/react-packager/src/JSTransformer/__mocks__/underscore.js rename to packager/react-packager/src/JSTransformer/__mocks__/lodash.js index 45754e1a547..ac8224e6042 100644 --- a/packager/react-packager/src/JSTransformer/__mocks__/underscore.js +++ b/packager/react-packager/src/JSTransformer/__mocks__/lodash.js @@ -10,4 +10,4 @@ // Bug with Jest because we're going to the node_modules that is a sibling // of what jest thinks our root (the dir with the package.json) should be. -module.exports = require.requireActual('underscore'); +module.exports = require.requireActual('lodash'); diff --git a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js index df6f609e898..286dc9ebd50 100644 --- a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js +++ b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js @@ -8,16 +8,13 @@ */ 'use strict'; -jest.dontMock('../') - .dontMock('underscore'); - +jest.dontMock('../'); jest.mock('path'); const Promise = require('promise'); const Resolver = require('../'); const path = require('path'); -const _ = require('underscore'); let DependencyGraph = jest.genMockFn(); jest.setMock('node-haste', DependencyGraph); @@ -126,9 +123,9 @@ describe('Resolver', function() { .then(function(result) { expect(result.mainModuleId).toEqual('index'); expect(result.dependencies[result.dependencies.length - 1]).toBe(module); - expect(_.pluck(DependencyGraph.prototype.createPolyfill.mock.calls, 0)).toEqual([ - { file: 'polyfills/polyfills.js', - id: 'polyfills/polyfills.js', + expect(DependencyGraph.prototype.createPolyfill.mock.calls.map((call) => call[0])).toEqual([ + { id: 'polyfills/polyfills.js', + file: 'polyfills/polyfills.js', dependencies: [] }, { id: 'polyfills/console.js', diff --git a/packager/react-packager/src/Server/__tests__/Server-test.js b/packager/react-packager/src/Server/__tests__/Server-test.js index 796f281a402..ce91842e1a7 100644 --- a/packager/react-packager/src/Server/__tests__/Server-test.js +++ b/packager/react-packager/src/Server/__tests__/Server-test.js @@ -11,7 +11,7 @@ jest.setMock('worker-farm', function() { return () => {}; }) .dontMock('node-haste/node_modules/throat') .dontMock('os') - .dontMock('underscore') + .dontMock('lodash') .dontMock('path') .dontMock('url') .setMock('timers', { setImmediate: (fn) => setTimeout(fn, 0) }) diff --git a/packager/react-packager/src/Server/index.js b/packager/react-packager/src/Server/index.js index 985516be737..fe49ebbb354 100644 --- a/packager/react-packager/src/Server/index.js +++ b/packager/react-packager/src/Server/index.js @@ -15,7 +15,7 @@ const getPlatformExtension = require('node-haste').getPlatformExtension; const Bundler = require('../Bundler'); const Promise = require('promise'); -const _ = require('underscore'); +const _ = require('lodash'); const declareOpts = require('../lib/declareOpts'); const path = require('path'); const url = require('url'); @@ -492,7 +492,7 @@ class Server { return true; }).join('.') + '.js'; - const sourceMapUrlObj = _.clone(urlObj); + const sourceMapUrlObj = Object.assign({}, urlObj); sourceMapUrlObj.pathname = pathname.replace(/\.bundle$/, '.map'); // try to get the platform from the url diff --git a/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js b/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js index b5a7b91605a..4c1aa812c57 100644 --- a/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js +++ b/packager/react-packager/src/SocketInterface/__tests__/SocketInterface-test.js @@ -10,7 +10,6 @@ jest.setMock('uglify-js') .mock('child_process') - .dontMock('underscore') .dontMock('../'); var SocketInterface = require('../'); diff --git a/packager/react-packager/src/SocketInterface/index.js b/packager/react-packager/src/SocketInterface/index.js index 69b52a4f957..f9f3a77b67c 100644 --- a/packager/react-packager/src/SocketInterface/index.js +++ b/packager/react-packager/src/SocketInterface/index.js @@ -11,7 +11,6 @@ const Promise = require('promise'); const SocketClient = require('./SocketClient'); const SocketServer = require('./SocketServer'); -const _ = require('underscore'); const crypto = require('crypto'); const debug = require('debug')('ReactNativePackager:SocketInterface'); const fs = require('fs'); @@ -99,7 +98,7 @@ function createServer(resolve, reject, options, sockPath) { const log = fs.openSync(logPath, 'a'); // Enable server debugging by default since it's going to a log file. - const env = _.clone(process.env); + const env = Object.assign({}, process.env); env.DEBUG = 'ReactNativePackager:SocketServer'; // We have to go through the main entry point to make sure