From a3b623500f982b80fa9d7e7f9ebf5fe35984a1da Mon Sep 17 00:00:00 2001 From: Hugo Dias Date: Tue, 26 Mar 2019 09:17:24 +0000 Subject: [PATCH] perf: reduce bundle size (#1959) * fix: remove sortby * fix: swap lodash flatten for just-flatten-it * fix: remove lodash isString and swap url for iso-url * fix: use dlv and merge-options * fix: more dlv, merge-options and remove lodash values * fix: more libs swaping * chore: clean up package.json --- package.json | 9 +++++---- src/cli/commands/add.js | 12 ++++++++++-- src/core/components/dag.js | 2 +- src/core/components/files-regular/add-from-url.js | 2 +- src/core/components/files-regular/add.js | 3 +-- src/core/components/init.js | 4 ++-- src/core/components/libp2p.js | 6 +++--- src/core/components/pre-start.js | 4 ++-- src/core/components/start.js | 2 +- src/core/components/swarm.js | 5 ++--- src/core/index.js | 4 ++-- src/core/runtime/libp2p-browser.js | 4 ++-- src/core/runtime/libp2p-nodejs.js | 4 ++-- src/http/api/resources/config.js | 13 ++++++++----- src/http/api/resources/pin.js | 11 +++++------ 15 files changed, 47 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 549858e93b..5d1c7a45c9 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,6 @@ "stream-to-promise": "^2.2.0" }, "dependencies": { - "@nodeutils/defaults-deep": "^1.1.0", "async": "^2.6.1", "bignumber.js": "^8.0.2", "binary-querystring": "~0.1.2", @@ -92,6 +91,7 @@ "datastore-core": "~0.6.0", "datastore-pubsub": "~0.1.1", "debug": "^4.1.0", + "dlv": "^1.1.2", "err-code": "^1.1.2", "file-type": "^10.2.0", "fnv1a": "^1.0.1", @@ -100,7 +100,6 @@ "glob": "^7.1.3", "hapi": "^18.0.0", "hapi-pino": "^5.2.0", - "hoek": "^6.1.2", "human-to-milliseconds": "^1.0.0", "interface-datastore": "~0.6.0", "ipfs-bitswap": "~0.23.0", @@ -124,9 +123,12 @@ "is-ipfs": "~0.6.0", "is-pull-stream": "~0.0.0", "is-stream": "^1.1.0", + "iso-url": "~0.4.6", "joi": "^14.3.0", "joi-browser": "^13.4.0", "joi-multiaddr": "^4.0.0", + "just-flatten-it": "^2.1.0", + "just-safe-set": "^2.1.0", "libp2p": "~0.25.0-rc.5", "libp2p-bootstrap": "~0.9.3", "libp2p-crypto": "~0.16.0", @@ -142,6 +144,7 @@ "libp2p-websockets": "~0.12.2", "lodash": "^4.17.11", "mafmt": "^6.0.2", + "merge-options": "^1.0.1", "mime-types": "^2.1.21", "mkdirp": "~0.5.1", "multiaddr": "^6.0.0", @@ -151,7 +154,6 @@ "multihashes": "~0.4.14", "multihashing-async": "~0.5.1", "node-fetch": "^2.3.0", - "once": "^1.4.0", "peer-book": "~0.9.0", "peer-id": "~0.12.0", "peer-info": "~0.15.0", @@ -167,7 +169,6 @@ "pull-sort": "^1.0.1", "pull-stream": "^3.6.9", "pull-stream-to-stream": "^1.3.4", - "pump": "^3.0.0", "readable-stream": "^3.1.1", "receptacle": "^1.3.2", "stream-to-pull-stream": "^1.7.3", diff --git a/src/cli/commands/add.js b/src/cli/commands/add.js index 11fc84c1ee..25eadad121 100644 --- a/src/cli/commands/add.js +++ b/src/cli/commands/add.js @@ -1,6 +1,5 @@ 'use strict' -const sortBy = require('lodash/sortBy') const pull = require('pull-stream') const promisify = require('promisify-es6') const getFolderSize = promisify(require('get-folder-size')) @@ -38,7 +37,16 @@ function addPipeline (source, addStream, options) { return resolve() } - sortBy(added, 'path') + added + .sort((a, b) => { + if (a.path > b.path) { + return 1 + } + if (a.path < b.path) { + return -1 + } + return 0 + }) .reverse() .map((file) => { const log = options.quiet ? [] : ['added'] diff --git a/src/core/components/dag.js b/src/core/components/dag.js index dc9ef2bdf5..ffc6ccfd0a 100644 --- a/src/core/components/dag.js +++ b/src/core/components/dag.js @@ -5,7 +5,7 @@ const CID = require('cids') const pull = require('pull-stream') const mapAsync = require('async/map') const setImmediate = require('async/setImmediate') -const flattenDeep = require('lodash/flattenDeep') +const flattenDeep = require('just-flatten-it') const errCode = require('err-code') module.exports = function dag (self) { diff --git a/src/core/components/files-regular/add-from-url.js b/src/core/components/files-regular/add-from-url.js index b486c569d3..73697aa2cf 100644 --- a/src/core/components/files-regular/add-from-url.js +++ b/src/core/components/files-regular/add-from-url.js @@ -1,6 +1,6 @@ 'use strict' -const { URL } = require('url') +const { URL } = require('iso-url') const fetch = require('../../runtime/fetch-nodejs') module.exports = (self) => { diff --git a/src/core/components/files-regular/add.js b/src/core/components/files-regular/add.js index 1c36b7d20a..174cf8d51a 100644 --- a/src/core/components/files-regular/add.js +++ b/src/core/components/files-regular/add.js @@ -5,7 +5,6 @@ const pull = require('pull-stream') const sort = require('pull-sort') const isStream = require('is-stream') const isSource = require('is-pull-stream').isSource -const isString = require('lodash/isString') module.exports = function (self) { const add = promisify((data, options, callback) => { @@ -24,7 +23,7 @@ module.exports = function (self) { // path is optional if content is present if (obj.content) return isBufferOrStream(obj.content) // path must be a non-empty string if no content - return Boolean(obj.path) && isString(obj.path) + return Boolean(obj.path) && typeof obj.path === 'string' } // An input atom: a buffer, stream or content object const isInput = obj => isBufferOrStream(obj) || isContentObject(obj) diff --git a/src/core/components/init.js b/src/core/components/init.js index 29cac89402..96b8572baf 100644 --- a/src/core/components/init.js +++ b/src/core/components/init.js @@ -1,10 +1,10 @@ 'use strict' const peerId = require('peer-id') +const mergeOptions = require('merge-options') const waterfall = require('async/waterfall') const parallel = require('async/parallel') const promisify = require('promisify-es6') -const defaultsDeep = require('@nodeutils/defaults-deep') const defaultConfig = require('../runtime/config-nodejs.js') const Keychain = require('libp2p-keychain') const { @@ -59,7 +59,7 @@ module.exports = function init (self) { opts.bits = Number(opts.bits) || 2048 opts.log = opts.log || function () {} - const config = defaultsDeep(self._options.config, defaultConfig()) + const config = mergeOptions(defaultConfig(), self._options.config) let privateKey waterfall([ diff --git a/src/core/components/libp2p.js b/src/core/components/libp2p.js index 931c711053..05cb693ba5 100644 --- a/src/core/components/libp2p.js +++ b/src/core/components/libp2p.js @@ -1,7 +1,7 @@ 'use strict' -const get = require('lodash/get') -const defaultsDeep = require('@nodeutils/defaults-deep') +const get = require('dlv') +const mergeOptions = require('merge-options') const ipnsUtils = require('../ipns/routing/utils') module.exports = function libp2p (self, config) { @@ -107,7 +107,7 @@ function defaultBundle ({ datastore, peerInfo, peerBook, options, config }) { }) } - const libp2pOptions = defaultsDeep(get(options, 'libp2p', {}), libp2pDefaults) + const libp2pOptions = mergeOptions(libp2pDefaults, get(options, 'libp2p', {})) // Required inline to reduce startup time // Note: libp2p-nodejs gets replaced by libp2p-browser when webpacked/browserified diff --git a/src/core/components/pre-start.js b/src/core/components/pre-start.js index 13d914acc4..e69f20845d 100644 --- a/src/core/components/pre-start.js +++ b/src/core/components/pre-start.js @@ -5,7 +5,7 @@ const PeerInfo = require('peer-info') const multiaddr = require('multiaddr') const waterfall = require('async/waterfall') const Keychain = require('libp2p-keychain') -const defaultsDeep = require('@nodeutils/defaults-deep') +const mergeOptions = require('merge-options') const NoKeychain = require('./no-keychain') /* * Load stuff from Repo into memory @@ -22,7 +22,7 @@ module.exports = function preStart (self) { return cb(null, config) } - config = defaultsDeep(self._options.config, config) + config = mergeOptions(config, self._options.config) self.config.replace(config, (err) => { if (err) { diff --git a/src/core/components/start.js b/src/core/components/start.js index dda2faf267..64ee8c73e0 100644 --- a/src/core/components/start.js +++ b/src/core/components/start.js @@ -2,7 +2,7 @@ const series = require('async/series') const Bitswap = require('ipfs-bitswap') -const get = require('lodash/get') +const get = require('dlv') const setImmediate = require('async/setImmediate') const promisify = require('promisify-es6') const { TieredDatastore } = require('datastore-core') diff --git a/src/core/components/swarm.js b/src/core/components/swarm.js index 62da0ac76e..4869cf2032 100644 --- a/src/core/components/swarm.js +++ b/src/core/components/swarm.js @@ -1,7 +1,6 @@ 'use strict' const promisify = require('promisify-es6') -const values = require('lodash/values') const OFFLINE_ERROR = require('../utils').OFFLINE_ERROR @@ -25,7 +24,7 @@ module.exports = function swarm (self) { const peers = [] - values(self._peerInfoBook.getAll()).forEach((peer) => { + Object.values(self._peerInfoBook.getAll()).forEach((peer) => { const connectedAddr = peer.isConnected() if (!connectedAddr) { return } @@ -50,7 +49,7 @@ module.exports = function swarm (self) { return callback(new Error(OFFLINE_ERROR)) } - const peers = values(self._peerInfoBook.getAll()) + const peers = Object.values(self._peerInfoBook.getAll()) callback(null, peers) }), diff --git a/src/core/index.js b/src/core/index.js index 8248a21765..2076d7cee7 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -13,7 +13,7 @@ const multibase = require('multibase') const multicodec = require('multicodec') const CID = require('cids') const debug = require('debug') -const defaultsDeep = require('@nodeutils/defaults-deep') +const mergeOptions = require('merge-options') const EventEmitter = require('events') const config = require('./config') @@ -78,7 +78,7 @@ class IPFS extends EventEmitter { options = config.validate(options || {}) - this._options = defaultsDeep(options, defaults) + this._options = mergeOptions(defaults, options) if (options.init === false) { this._options.init = false diff --git a/src/core/runtime/libp2p-browser.js b/src/core/runtime/libp2p-browser.js index 8fae1ae176..19fe27398b 100644 --- a/src/core/runtime/libp2p-browser.js +++ b/src/core/runtime/libp2p-browser.js @@ -8,7 +8,7 @@ const SECIO = require('libp2p-secio') const Bootstrap = require('libp2p-bootstrap') const KadDHT = require('libp2p-kad-dht') const libp2p = require('libp2p') -const defaultsDeep = require('@nodeutils/defaults-deep') +const mergeOptions = require('merge-options') const multiaddr = require('multiaddr') class Node extends libp2p { @@ -62,7 +62,7 @@ class Node extends libp2p { } } - super(defaultsDeep(_options, defaults)) + super(mergeOptions(defaults, _options)) } } diff --git a/src/core/runtime/libp2p-nodejs.js b/src/core/runtime/libp2p-nodejs.js index 01e7046e19..4f11036a86 100644 --- a/src/core/runtime/libp2p-nodejs.js +++ b/src/core/runtime/libp2p-nodejs.js @@ -9,7 +9,7 @@ const KadDHT = require('libp2p-kad-dht') const Multiplex = require('libp2p-mplex') const SECIO = require('libp2p-secio') const libp2p = require('libp2p') -const defaultsDeep = require('@nodeutils/defaults-deep') +const mergeOptions = require('merge-options') const multiaddr = require('multiaddr') class Node extends libp2p { @@ -65,7 +65,7 @@ class Node extends libp2p { } } - super(defaultsDeep(_options, defaults)) + super(mergeOptions(defaults, _options)) } } diff --git a/src/http/api/resources/config.js b/src/http/api/resources/config.js index 944d6058ba..d0ee5011b8 100644 --- a/src/http/api/resources/config.js +++ b/src/http/api/resources/config.js @@ -1,8 +1,8 @@ 'use strict' const debug = require('debug') -const get = require('lodash/get') -const set = require('lodash/set') +const get = require('dlv') +const set = require('just-safe-set') const log = debug('ipfs:http-api:config') log.error = debug('ipfs:http-api:config:error') const multipart = require('ipfs-multipart') @@ -74,11 +74,14 @@ exports.getOrSet = { } } else { // Set the new value of a given key - const updatedConfig = set(originalConfig, key, value) + const result = set(originalConfig, key, value) + if (!result) { + throw Boom.badRequest('Failed to set config value') + } try { - await ipfs.config.replace(updatedConfig) + await ipfs.config.replace(originalConfig) } catch (err) { - throw Boom.boomify(err, { message: 'Failed to get config value' }) + throw Boom.boomify(err, { message: 'Failed to replace config value' }) } } diff --git a/src/http/api/resources/pin.js b/src/http/api/resources/pin.js index b4232c6916..63ab61bf72 100644 --- a/src/http/api/resources/pin.js +++ b/src/http/api/resources/pin.js @@ -1,7 +1,5 @@ 'use strict' -const mapValues = require('lodash/mapValues') -const keyBy = require('lodash/keyBy') const multibase = require('multibase') const Joi = require('joi') const Boom = require('boom') @@ -63,10 +61,11 @@ exports.ls = { } return h.response({ - Keys: mapValues( - keyBy(result, obj => cidToString(obj.hash, { base: request.query['cid-base'] })), - obj => ({ Type: obj.type }) - ) + Keys: result.reduce((acc, v) => { + const prop = cidToString(v.hash, { base: request.query['cid-base'] }) + acc[prop] = { Type: v.type } + return acc + }, {}) }) } }