From 8ca85a4f07acbec02d41077faacdd1f4a62e86a3 Mon Sep 17 00:00:00 2001 From: Daniel Stockman Date: Tue, 19 Nov 2019 11:07:54 -0800 Subject: [PATCH] fix(command): Do not mutate `argv` parameter See https://github.com/babel/babel/pull/10733 for details. Fixes #2348 --- core/command/__tests__/command.test.js | 9 +++++++++ core/command/index.js | 4 +++- core/command/package.json | 1 + package-lock.json | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/command/__tests__/command.test.js b/core/command/__tests__/command.test.js index 0724038ba2..fb8c10a205 100644 --- a/core/command/__tests__/command.test.js +++ b/core/command/__tests__/command.test.js @@ -264,6 +264,15 @@ describe("core-command", () => { } } + it("does not mutate argv parameter", async () => { + const argv = { cwd: testDir, onRejected }; + const instance = new TestACommand(argv); + await instance; + + expect(argv).toEqual({ cwd: testDir, onRejected }); + expect(instance.argv).not.toEqual(argv); + }); + it("should pick up global options", async () => { const instance = new TestACommand({ cwd: testDir, onRejected }); await instance; diff --git a/core/command/index.js b/core/command/index.js index 79a8b66d05..1ddafb6fcf 100644 --- a/core/command/index.js +++ b/core/command/index.js @@ -1,6 +1,7 @@ "use strict"; const _ = require("lodash"); +const cloneDeep = require("clone-deep"); const dedent = require("dedent"); const execa = require("execa"); const log = require("npmlog"); @@ -18,10 +19,11 @@ const warnIfHanging = require("./lib/warn-if-hanging"); const DEFAULT_CONCURRENCY = os.cpus().length; class Command { - constructor(argv) { + constructor(_argv) { log.pause(); log.heading = "lerna"; + const argv = cloneDeep(_argv); log.silly("argv", argv); // "FooCommand" => "foo" diff --git a/core/command/package.json b/core/command/package.json index 840afecc64..b9c33fde00 100644 --- a/core/command/package.json +++ b/core/command/package.json @@ -37,6 +37,7 @@ "@lerna/project": "file:../project", "@lerna/validation-error": "file:../validation-error", "@lerna/write-log-file": "file:../../utils/write-log-file", + "clone-deep": "^4.0.1", "dedent": "^0.7.0", "execa": "^1.0.0", "is-ci": "^2.0.0", diff --git a/package-lock.json b/package-lock.json index d5af9078e9..b3f3be1700 100644 --- a/package-lock.json +++ b/package-lock.json @@ -882,6 +882,7 @@ "@lerna/project": "file:core/project", "@lerna/validation-error": "file:core/validation-error", "@lerna/write-log-file": "file:utils/write-log-file", + "clone-deep": "^4.0.1", "dedent": "^0.7.0", "execa": "^1.0.0", "is-ci": "^2.0.0", @@ -2350,6 +2351,16 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -8134,6 +8145,14 @@ } } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",