From 2fc43fbe43a40069ecdf0071edfb057a510890c4 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 18 Dec 2018 02:28:09 +0100 Subject: [PATCH] lib: switch to object spread where possible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the object spread notation instead of using Object.assign. It is not only easier to read it is also faster as of V8 6.8. PR-URL: https://github.com/nodejs/node/pull/25104 Reviewed-By: Gus Caplan Reviewed-By: Michaƫl Zasso Reviewed-By: Yuta Hiroto Reviewed-By: Minwoo Jung Reviewed-By: Denys Otrishko Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Luigi Pinca --- lib/.eslintrc.yaml | 1 + lib/_tls_wrap.js | 2 +- lib/child_process.js | 4 ++-- lib/console.js | 8 +++++--- lib/internal/child_process.js | 2 +- lib/internal/console/constructor.js | 9 +++++---- lib/internal/http2/compat.js | 2 +- lib/internal/http2/core.js | 20 ++++++++++---------- lib/repl.js | 5 ++--- lib/tls.js | 10 +++++++--- lib/util.js | 7 ++++--- lib/vm.js | 8 ++------ 12 files changed, 41 insertions(+), 37 deletions(-) diff --git a/lib/.eslintrc.yaml b/lib/.eslintrc.yaml index 65c7c88ba0cbe7..a7a1c15e90b3fb 100644 --- a/lib/.eslintrc.yaml +++ b/lib/.eslintrc.yaml @@ -1,4 +1,5 @@ rules: + prefer-object-spread: error no-restricted-syntax: # Config copied from .eslintrc.js - error diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 55cfc440dd4fa6..6d760c19ed281e 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -289,7 +289,7 @@ function initRead(tls, wrapped) { */ function TLSSocket(socket, opts) { - const tlsOptions = Object.assign({}, opts); + const tlsOptions = { ...opts }; if (tlsOptions.ALPNProtocols) tls.convertALPNProtocols(tlsOptions.ALPNProtocols, tlsOptions); diff --git a/lib/child_process.js b/lib/child_process.js index 222df8aed7e8fd..2691de70198a42 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -136,7 +136,7 @@ function normalizeExecArgs(command, options, callback) { } // Make a shallow copy so we don't clobber the user's options object. - options = Object.assign({}, options); + options = { ...options }; options.shell = typeof options.shell === 'string' ? options.shell : true; return { @@ -470,7 +470,7 @@ function normalizeSpawnArguments(file, args, options) { } // Make a shallow copy so we don't clobber the user's options object. - options = Object.assign({}, options); + options = { ...options }; if (options.shell) { const command = [file].concat(args).join(' '); diff --git a/lib/console.js b/lib/console.js index 59c51b368a819d..496280d72c3a83 100644 --- a/lib/console.js +++ b/lib/console.js @@ -225,9 +225,11 @@ Console.prototype.warn = function warn(...args) { Console.prototype.error = Console.prototype.warn; Console.prototype.dir = function dir(object, options) { - options = Object.assign({ - customInspect: false - }, this[kGetInspectOptions](this._stdout), options); + options = { + customInspect: false, + ...this[kGetInspectOptions](this._stdout), + ...options + }; write(this._ignoreErrors, this._stdout, util.inspect(object, options), diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 0c93b4d0e6fe80..f41e31785b467c 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -636,7 +636,7 @@ function setupChannel(target, channel) { throw new ERR_INVALID_ARG_TYPE('options', 'Object', options); } - options = Object.assign({ swallowErrors: false }, options); + options = { swallowErrors: false, ...options }; if (this.connected) { return this._send(message, handle, options, callback); diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js index 6ed173210387a4..1090f8fde68d1f 100644 --- a/lib/internal/console/constructor.js +++ b/lib/internal/console/constructor.js @@ -271,10 +271,11 @@ Console.prototype.warn = function warn(...args) { Console.prototype.error = Console.prototype.warn; Console.prototype.dir = function dir(object, options) { - options = Object.assign({ - customInspect: false - }, this[kGetInspectOptions](this._stdout), options); - this[kWriteToConsole](kUseStdout, util.inspect(object, options)); + this[kWriteToConsole](kUseStdout, util.inspect(object, { + customInspect: false, + ...this[kGetInspectOptions](this._stdout), + ...options + })); }; Console.prototype.time = function time(label = 'default') { diff --git a/lib/internal/http2/compat.js b/lib/internal/http2/compat.js index 927504621d0a1d..23c4e2e0f08893 100644 --- a/lib/internal/http2/compat.js +++ b/lib/internal/http2/compat.js @@ -512,7 +512,7 @@ class Http2ServerResponse extends Stream { } getHeaders() { - return Object.assign({}, this[kHeaders]); + return { ...this[kHeaders] }; } hasHeader(name) { diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 887a234758b044..6bc82789a35cc8 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -790,7 +790,7 @@ function pingCallback(cb) { // 6. enablePush must be a boolean // All settings are optional and may be left undefined function validateSettings(settings) { - settings = Object.assign({}, settings); + settings = { ...settings }; assertWithinRange('headerTableSize', settings.headerTableSize, 0, kMaxInt); @@ -1443,7 +1443,7 @@ class ClientHttp2Session extends Http2Session { assertIsObject(options, 'options'); headers = Object.assign(Object.create(null), headers); - options = Object.assign({}, options); + options = { ...options }; if (headers[HTTP2_HEADER_METHOD] === undefined) headers[HTTP2_HEADER_METHOD] = HTTP2_METHOD_GET; @@ -1848,7 +1848,7 @@ class Http2Stream extends Duplex { throw new ERR_HTTP2_INVALID_STREAM(); assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; validatePriorityOptions(options); const priorityFn = submitPriority.bind(this, options); @@ -2257,7 +2257,7 @@ class ServerHttp2Stream extends Http2Stream { throw new ERR_INVALID_CALLBACK(); assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; options.endStream = !!options.endStream; assertIsObject(headers, 'headers'); @@ -2322,7 +2322,7 @@ class ServerHttp2Stream extends Http2Stream { const state = this[kState]; assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; const session = this[kSession]; debug(`Http2Stream ${this[kID]} [Http2Session ` + @@ -2378,7 +2378,7 @@ class ServerHttp2Stream extends Http2Stream { const session = this[kSession]; assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; if (options.offset !== undefined && typeof options.offset !== 'number') throw new ERR_INVALID_OPT_VALUE('offset', options.offset); @@ -2441,7 +2441,7 @@ class ServerHttp2Stream extends Http2Stream { throw new ERR_HTTP2_HEADERS_SENT(); assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; if (options.offset !== undefined && typeof options.offset !== 'number') throw new ERR_INVALID_OPT_VALUE('offset', options.offset); @@ -2667,10 +2667,10 @@ function connectionListener(socket) { function initializeOptions(options) { assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; options.allowHalfOpen = true; assertIsObject(options.settings, 'options.settings'); - options.settings = Object.assign({}, options.settings); + options.settings = { ...options.settings }; // Used only with allowHTTP1 options.Http1IncomingMessage = options.Http1IncomingMessage || @@ -2775,7 +2775,7 @@ function connect(authority, options, listener) { } assertIsObject(options, 'options'); - options = Object.assign({}, options); + options = { ...options }; if (typeof authority === 'string') authority = new URL(authority); diff --git a/lib/repl.js b/lib/repl.js index 3e9a933e214efa..9172931280f46f 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -130,8 +130,7 @@ function hasOwnProperty(obj, prop) { // and it can be overridden by custom print functions, such as `probe` or // `eyes.js`. const writer = exports.writer = (obj) => util.inspect(obj, writer.options); -writer.options = - Object.assign({}, util.inspect.defaultOptions, { showProxy: true }); +writer.options = { ...util.inspect.defaultOptions, showProxy: true }; exports._builtinLibs = builtinLibs; @@ -510,7 +509,7 @@ function REPLServer(prompt, if (self.useColors && self.writer === writer) { // Turn on ANSI coloring. self.writer = (obj) => util.inspect(obj, self.writer.options); - self.writer.options = Object.assign({}, writer.options, { colors: true }); + self.writer.options = { ...writer.options, colors: true }; } function filterInternalStackFrames(structuredStack) { diff --git a/lib/tls.js b/lib/tls.js index 88feab319e9c01..65eb8ae9834deb 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -264,9 +264,13 @@ class SecurePair extends EventEmitter { this.credentials = secureContext; this.encrypted = socket1; - this.cleartext = new exports.TLSSocket(socket2, Object.assign({ - secureContext, isServer, requestCert, rejectUnauthorized - }, options)); + this.cleartext = new exports.TLSSocket(socket2, { + secureContext, + isServer, + requestCert, + rejectUnauthorized, + ...options + }); this.cleartext.once('secure', () => this.emit('secure')); } diff --git a/lib/util.js b/lib/util.js index 922a01f357e408..06ce842934505a 100644 --- a/lib/util.js +++ b/lib/util.js @@ -123,11 +123,12 @@ function formatWithOptions(inspectOptions, f) { break; case 111: // 'o' { - const opts = Object.assign({}, inspectOptions, { + const opts = { showHidden: true, showProxy: true, - depth: 4 - }); + depth: 4, + ...inspectOptions + }; tempStr = inspect(arguments[a++], opts); break; } diff --git a/lib/vm.js b/lib/vm.js index e50b08d336b9b5..12c4efa1a29d4f 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -290,9 +290,7 @@ function runInContext(code, contextifiedSandbox, options) { [kParsingContext]: contextifiedSandbox }; } else { - options = Object.assign({}, options, { - [kParsingContext]: contextifiedSandbox - }); + options = { ...options, [kParsingContext]: contextifiedSandbox }; } return createScript(code, options) .runInContext(contextifiedSandbox, options); @@ -303,9 +301,7 @@ function runInNewContext(code, sandbox, options) { options = { filename: options }; } sandbox = createContext(sandbox, getContextOptions(options)); - options = Object.assign({}, options, { - [kParsingContext]: sandbox - }); + options = { ...options, [kParsingContext]: sandbox }; return createScript(code, options).runInNewContext(sandbox, options); }