diff --git a/packages/babel-plugin-transform-es2015-parameters/src/params.js b/packages/babel-plugin-transform-es2015-parameters/src/params.js index 73215cbd09..e5e4dc0105 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/params.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/params.js @@ -54,53 +54,41 @@ export default function convertFunctionParams(path, loose) { }; const body = []; - - let firstOptionalIndex = null; - - // const params = path.get("params"); - if (loose) { - const body = []; - for (let i = 0; i < params.length; ++i) { - const param = params[i]; - if (param.isAssignmentPattern()) { - const left = param.get("left"); - const right = param.get("right"); - - const undefinedNode = scope.buildUndefinedNode(); - - if (left.isIdentifier()) { - body.push( - buildLooseDefaultParam({ - ASSIGNMENT_IDENTIFIER: left.node, - DEFAULT_VALUE: right.node, - UNDEFINED: undefinedNode, - }), - ); - param.replaceWith(left.node); - } else if (left.isObjectPattern() || left.isArrayPattern()) { - const paramName = scope.generateUidIdentifier(); - body.push( - buildLooseDestructuredDefaultParam({ - ASSIGNMENT_IDENTIFIER: left.node, - DEFAULT_VALUE: right.node, - PARAMETER_NAME: paramName, - UNDEFINED: undefinedNode, - }), - ); - param.replaceWith(paramName); - } - } - } - path.get("body").unshiftContainer("body", body); - return; - } + let firstOptionalIndex = null; for (let i = 0; i < params.length; i++) { const param = params[i]; - if (param.isAssignmentPattern()) { + if (param.isAssignmentPattern() && loose) { + const left = param.get("left"); + const right = param.get("right"); + + const undefinedNode = scope.buildUndefinedNode(); + + if (left.isIdentifier()) { + body.push( + buildLooseDefaultParam({ + ASSIGNMENT_IDENTIFIER: left.node, + DEFAULT_VALUE: right.node, + UNDEFINED: undefinedNode, + }), + ); + param.replaceWith(left.node); + } else if (left.isObjectPattern() || left.isArrayPattern()) { + const paramName = scope.generateUidIdentifier(); + body.push( + buildLooseDestructuredDefaultParam({ + ASSIGNMENT_IDENTIFIER: left.node, + DEFAULT_VALUE: right.node, + PARAMETER_NAME: paramName, + UNDEFINED: undefinedNode, + }), + ); + param.replaceWith(paramName); + } + } else if (param.isAssignmentPattern()) { if (firstOptionalIndex === null) firstOptionalIndex = i; const left = param.get("left"); diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/actual.js new file mode 100644 index 0000000000..ea2ac402c2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/actual.js @@ -0,0 +1,8 @@ +function fn( + a1, + a2 = 4, + {a3, a4}, + a5, + {a6, a7} = {}) { + +} diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/expected.js new file mode 100644 index 0000000000..5db7bb23c0 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/default-rest-mix/expected.js @@ -0,0 +1,12 @@ +function fn(a1, a2, _ref, a5, _temp) { + if (a2 === void 0) { + a2 = 4; + } + + var a3 = _ref.a3, + a4 = _ref.a4; + + var _ref2 = _temp === void 0 ? {} : _temp, + a6 = _ref2.a6, + a7 = _ref2.a7; +} diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/actual.js new file mode 100644 index 0000000000..3b538fe704 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/actual.js @@ -0,0 +1,4 @@ +// #3861 +function t(x = "default", { a, b }, ...args) { + console.log(x, a, b, args); +} diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/expected.js new file mode 100644 index 0000000000..ba4ffd854e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/use-loose-option/destructuring-rest/expected.js @@ -0,0 +1,15 @@ +// #3861 +function t(x, _ref) { + if (x === void 0) { + x = "default"; + } + + var a = _ref.a, + b = _ref.b; + + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + console.log(x, a, b, args); +}