diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/package.json b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/package.json index 0035c2b449af..175e7e6d3fd6 100644 --- a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/package.json +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "@babel/core": "workspace:^", + "@babel/helper-function-name": "workspace:^", "@babel/helper-plugin-test-runner": "workspace:^", "@babel/traverse": "workspace:^" }, diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/src/util.ts b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/src/util.ts index e884f47fd85a..e0bfc8b108ed 100644 --- a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/src/util.ts +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/src/util.ts @@ -18,16 +18,16 @@ export function shouldTransform( // On collision, `getOwnBinding` returns the param binding // with the id binding be registered as constant violation const paramNameBinding = path.scope.getOwnBinding(name); - const constantViolations = paramNameBinding.constantViolations; - if (constantViolations.length === 0) { - // the function scope has no such collided bindings + if (paramNameBinding === undefined) { + // Case 1: the function id is injected by babel-helper-name-function, which + // assigns `NOT_LOCAL_BINDING` to the `functionId` and thus not registering id + // in scope tracking + // Case 2: the function id is injected by a third party plugin which does not update the + // scope info return false; } - const firstViolation = constantViolations[0]; - - if (firstViolation.node !== node) { - // the violation does not happen in id - // e.g. (function a() { var a; }) + if (paramNameBinding.kind !== "param") { + // the function id does not reproduce in params return false; } diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/input.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/input.mjs new file mode 100644 index 000000000000..9e21f507dd79 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/input.mjs @@ -0,0 +1 @@ +var a = function ([a]) { a }; diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/options.json b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/options.json new file mode 100644 index 000000000000..da9603fd6474 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "./plugin.js", + "bugfix-safari-id-destructuring-collision-in-function-expression" + ] +} diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/output.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/output.mjs new file mode 100644 index 000000000000..e0d2bf61a39d --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/output.mjs @@ -0,0 +1,3 @@ +var a = function a([_a]) { + _a; +}; diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/plugin.js b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/plugin.js new file mode 100644 index 000000000000..7514cb9cbb6f --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/helper-function-name/plugin.js @@ -0,0 +1,10 @@ +const nameFunction = require("@babel/helper-function-name").default; + +module.exports = api => ({ + visitor: { + FunctionExpression(path) { + const replacement = nameFunction(path); + if (replacement) path.replaceWith(replacement); + }, + }, +}); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/input.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/input.mjs new file mode 100644 index 000000000000..7e1a437eca13 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/input.mjs @@ -0,0 +1 @@ +(function ([a]) { a }); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/options.json b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/options.json new file mode 100644 index 000000000000..2189309e1ceb --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "bugfix-safari-id-destructuring-collision-in-function-expression", + "./plugin.js" + ] +} diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/output.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/output.mjs new file mode 100644 index 000000000000..ff62417bb00f --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/output.mjs @@ -0,0 +1,3 @@ +(function a([_a]) { + _a; +}); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/plugin.js b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/plugin.js new file mode 100644 index 000000000000..70f80a85f857 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-after/plugin.js @@ -0,0 +1,11 @@ +module.exports = ({ types: { identifier } }) => ({ + visitor: { + FunctionExpression(path) { + const { node } = path; + if (!node.id) { + node.id = identifier("a"); + path.requeue(); + } + }, + }, +}); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/input.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/input.mjs new file mode 100644 index 000000000000..7e1a437eca13 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/input.mjs @@ -0,0 +1 @@ +(function ([a]) { a }); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/options.json b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/options.json new file mode 100644 index 000000000000..da9603fd6474 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "./plugin.js", + "bugfix-safari-id-destructuring-collision-in-function-expression" + ] +} diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/output.mjs b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/output.mjs new file mode 100644 index 000000000000..ff62417bb00f --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/output.mjs @@ -0,0 +1,3 @@ +(function a([_a]) { + _a; +}); diff --git a/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/plugin.js b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/plugin.js new file mode 100644 index 000000000000..70f80a85f857 --- /dev/null +++ b/packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression/test/fixtures/integration/plugin-injecting-function-id-before/plugin.js @@ -0,0 +1,11 @@ +module.exports = ({ types: { identifier } }) => ({ + visitor: { + FunctionExpression(path) { + const { node } = path; + if (!node.id) { + node.id = identifier("a"); + path.requeue(); + } + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index 742828b9991e..0f11ef2ddada 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1047,6 +1047,7 @@ __metadata: resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@workspace:packages/babel-plugin-bugfix-safari-id-destructuring-collision-in-function-expression" dependencies: "@babel/core": "workspace:^" + "@babel/helper-function-name": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-plugin-utils": "workspace:^" "@babel/traverse": "workspace:^"