Issue 1:
💻

Would you like to work on a fix?

How are you using Babel?

@babel/cli

Input code

https://babeljs.io/repl#?browsers=%3E%201%25&build=&builtIns=false&corejs=false&spec=false&loose=false&code_lz=DYUwLgBA3hAeCsAuaEDu8A0EB0uCe8EAvsRALwQBmArgHYDGYAlgPa0DCAhsMACoAWnMAEkAzgBFqAB2BN6QkABMAFAEoA3EA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=true&fileSize=true&timeTravel=false&sourceType=module&lineWrap=true&presets=env%2Ctypescript&prettier=false&targets=&version=7.13.17&externalPlugins=%40babel%2Fplugin-proposal-object-rest-spread%407.14.7&assumptions=%7B%7D

I've also made a reproducible test case in this branch https://github.com/dan-kez/babel/tree/duplicate_function_call_in_variable_destructuring

Configuration file name

babel.config.json

Configuration

No response

Current and expected behavior

Current Behavior:

As shown in the repl above the functionCallThatIsDuplicated function is called twice in the compiled code. This is not expected as in the original code the api call is only made once.

Expected Behavior:

When using @babel/plugin-proposal-object-rest-spread right hand operation is called once and only once to match the original code.

Environment

(Reproducible in the REPL link above)

Below is my project environment but the minimal reproducible example in the REPL link shows the same error

System:
OS: macOS 10.15.7
Binaries:
Node: 14.17.5 - ~/.nvm/versions/node/v14.17.5/bin/node
Yarn: 1.22.11 - ~/.nvm/versions/node/v14.17.5/bin/yarn
npm: 6.14.14 - ~/.nvm/versions/node/v14.17.5/bin/npm
Monorepos:
Yarn Workspaces: 1.22.11
Lerna: 3.20.2
npmPackages:
@babel/cli: 7.12.1 => 7.12.1
@babel/core: 7.12.3 => 7.12.3
@babel/helper-compilation-targets: 7.12.1 => 7.12.1
@babel/plugin-proposal-class-properties: 7.12.1 => 7.12.1
@babel/plugin-proposal-decorators: 7.12.1 => 7.12.1
@babel/plugin-proposal-object-rest-spread: 7.12.1 => 7.12.1
@babel/plugin-syntax-dynamic-import: 7.8.3 => 7.8.3
@babel/plugin-transform-react-jsx: 7.12.1 => 7.12.1
@babel/plugin-transform-regenerator: 7.12.1 => 7.12.1
@babel/preset-env: 7.12.1 => 7.12.1
@babel/preset-react: 7.12.1 => 7.12.1
@babel/preset-typescript: 7.12.1 => 7.12.1
@babel/runtime: 7.12.1 => 7.12.1
babel-eslint: 10.1.0 => 10.1.0
babel-jest: 26.6.3 => 26.6.3
babel-loader: 8.2.2 => 8.2.2
babel-plugin-lodash: 3.3.4 => 3.3.4
babel-plugin-module-resolver: 4.0.0 => 4.0.0
babel-plugin-react-docgen: 4.2.1 => 4.2.1
babel-plugin-require-context-hook: 1.0.0 => 1.0.0
babel-plugin-styled-components: 1.11.1 => 1.11.1
babel-plugin-transform-dynamic-import: 2.1.0 => 2.1.0
babel-plugin-transform-react-remove-prop-types: 0.4.24 => 0.4.24
eslint: 7.32.0 => 7.32.0
eslint-import-resolver-babel-module: 5.3.1 => 5.3.1
jest: 26.6.3 => 26.6.3
lerna: 3.20.2 => 3.20.2
webpack: 4.46.0 => 4.46.0

Possible solution

I'm not familiar with the internal implementation of @babel/plugin-proposal-object-rest-spread but it would be possible to first assign the result of the right hand assignment to a temporary variable and then use that temporary variable in subsequent calls to _objectWithoutProperties

Additional context

No response

Issue 2:
Feature Request

I would like to work on this feature!

Is your feature request related to a problem? Please describe.

Dependency scanners may report CVE-2019-20149 for projects that depend on @babel/cli@7.8.4. This is due to dependency on an version of kind-of because of this dependency chain: chokidar@^2.1.8 → braces (2.3.2) → is-number (3.0.0) → kind-of (3.2.2)

Describe the solution you'd like

Upgrade to chokidar@^3.4.0. This should remove the dependency on is-number and kind-of.

Note that chokidar@^3.4.0 requires "node": ">= 8.10.0". What is babel 7's policy for minimum supported node version?

Describe alternatives you've considered

Perhaps overriding the @babel/cli on chokidar dependency via "resolutions" could solve the problem within my code-base. Alternatively, we could maintain a fork with the chokdiar version upgraded.

Teachability, Documentation, Adoption, Migration Strategy

Upgrade chokidar version, pulling along interface changes.