From 976a358208287dda4d93cb430a11a431ecc65cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 28 Mar 2020 15:12:39 +0100 Subject: [PATCH 1/3] Set correct async/generator in IIFE for params --- .../src/params.js | 6 +++++ .../regression/scope-gen-async/input.js | 14 +++++++++++ .../regression/scope-gen-async/options.json | 5 ++++ .../regression/scope-gen-async/output.js | 23 +++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/input.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/options.json create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-gen-async/output.js diff --git a/packages/babel-plugin-transform-parameters/src/params.js b/packages/babel-plugin-transform-parameters/src/params.js index 0a85bfbd884c..15bd162cb9b2 100644 --- a/packages/babel-plugin-transform-parameters/src/params.js +++ b/packages/babel-plugin-transform-parameters/src/params.js @@ -181,6 +181,12 @@ 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; + + path.node.generator = false; + path.node.async = false; } else { path.get("body").unshiftContainer("body", body); } 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..6e0c0ccce8c9 --- /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); +} + +function g() { + let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; + return async function (a) { + var a = await a; + return a; + }(a); +} + +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); +} From 61b800a7e6716487a8a0d2e032d41423a182479a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 28 Mar 2020 23:09:03 +0100 Subject: [PATCH 2/3] Reject in async params --- .../babel-plugin-transform-parameters/src/params.js | 3 ++- .../scope-async-param-error-async/exec.js | 13 +++++++++++++ .../scope-async-param-error-async/options.json | 8 ++++++++ .../fixtures/regression/scope-gen-async/output.js | 4 ++-- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/options.json diff --git a/packages/babel-plugin-transform-parameters/src/params.js b/packages/babel-plugin-transform-parameters/src/params.js index 15bd162cb9b2..041e0bf90bb7 100644 --- a/packages/babel-plugin-transform-parameters/src/params.js +++ b/packages/babel-plugin-transform-parameters/src/params.js @@ -185,8 +185,9 @@ export default function convertFunctionParams(path, loose) { 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; - path.node.async = 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..d0a9ccc00f71 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/scope-async-param-error-async/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "transform-parameters" + ], + "parserOpts": { + "allowReturnOutsideFunction": true + } +} 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 index 6e0c0ccce8c9..1df77b61c2c0 100644 --- 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 @@ -6,7 +6,7 @@ function f() { }(a); } -function g() { +async function g() { let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; return async function (a) { var a = await a; @@ -14,7 +14,7 @@ function g() { }(a); } -function h() { +async function h() { let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; return async function* (a) { var a = await (yield a); From 6a031b4242236c9b96bc855a4963288386b25d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 28 Mar 2020 23:40:59 +0100 Subject: [PATCH 3/3] Skip async test on node 6 (it doesn't support async fns) --- .../regression/scope-async-param-error-async/options.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index d0a9ccc00f71..a4560df366eb 100644 --- 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 @@ -4,5 +4,6 @@ ], "parserOpts": { "allowReturnOutsideFunction": true - } + }, + "minNodeVersion": "8.0.0" }