diff --git a/packages/babel-plugin-transform-parameters/src/params.js b/packages/babel-plugin-transform-parameters/src/params.js index 0a85bfbd884c..041e0bf90bb7 100644 --- a/packages/babel-plugin-transform-parameters/src/params.js +++ b/packages/babel-plugin-transform-parameters/src/params.js @@ -181,6 +181,13 @@ export default function convertFunctionParams(path, loose) { const bodyPath = path.get("body.body"); const arrowPath = bodyPath[bodyPath.length - 1].get("argument.callee"); arrowPath.arrowFunctionToExpression(); + + arrowPath.node.generator = path.node.generator; + arrowPath.node.async = path.node.async; + + // We don't reset "async" because if the default value of a parameter + // throws, it must reject asynchronously. + path.node.generator = false; } else { path.get("body").unshiftContainer("body", body); } diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/exec.js new file mode 100644 index 000000000000..005e1dc68b19 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/exec.js @@ -0,0 +1,13 @@ +const err = new Error(); + +async function f(a = (() => { throw err })()) { + throw 1; + var a = await a; + return a; +} + +return (async () => { + let p; + expect(() => { p = f() }).not.toThrow(); + await expect(p).rejects.toThrow(err); +})(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/options.json b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/options.json new file mode 100644 index 000000000000..a4560df366eb --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/options.json @@ -0,0 +1,9 @@ +{ + "plugins": [ + "transform-parameters" + ], + "parserOpts": { + "allowReturnOutsideFunction": true + }, + "minNodeVersion": "8.0.0" +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/input.js b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/input.js new file mode 100644 index 000000000000..e46127c51439 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/input.js @@ -0,0 +1,14 @@ +function* f(a = 1) { + var a = yield a; + return a; +} + +async function g(a = 1) { + var a = await a; + return a; +} + +async function* h(a = 1) { + var a = await (yield a); + return a; +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/options.json b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/options.json new file mode 100644 index 000000000000..3a9f55e6405f --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + "transform-parameters" + ] +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/output.js new file mode 100644 index 000000000000..1df77b61c2c0 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/output.js @@ -0,0 +1,23 @@ +function f() { + let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + return function* (a) { + var a = yield a; + return a; + }(a); +} + +async function g() { + let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + return async function (a) { + var a = await a; + return a; + }(a); +} + +async function h() { + let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + return async function* (a) { + var a = await (yield a); + return a; + }(a); +}