Urara-Blog/node_modules/.pnpm-store/v3/files/b9/6dd028a668dc37856829f499f4fb8e03811e31c0798169ab7505f387445d0fa3cd0c2e2154dc5e4719b7331307bae2023a5356a9aa5da3a3d8b644f0fb0b6a
2022-08-14 01:14:53 +08:00

38 lines
1,012 B
Text

/**
* Safari ~11 has an issue where variable declarations in a For statement throw if they shadow parameters.
* This is fixed by renaming any declarations in the left/init part of a For* statement so they don't shadow.
* @see https://bugs.webkit.org/show_bug.cgi?id=171041
*
* @example
* e => { for (let e of []) e } // throws
* e => { for (let _e of []) _e } // works
*/
function handle(declaration) {
if (!declaration.isVariableDeclaration()) return;
const fn = declaration.getFunctionParent();
const { name } = declaration.node.declarations[0].id;
// check if there is a shadowed binding coming from a parameter
if (
fn &&
fn.scope.hasOwnBinding(name) &&
fn.scope.getOwnBinding(name).kind === "param"
) {
declaration.scope.rename(name);
}
}
export default () => ({
name: "transform-safari-for-shadowing",
visitor: {
ForXStatement(path) {
handle(path.get("left"));
},
ForStatement(path) {
handle(path.get("init"));
},
},
});