47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
exports.__esModule = true;
 | 
						|
exports.default = _default;
 | 
						|
 | 
						|
/**
 | 
						|
 * Fixes block-shadowed let/const bindings in Safari 10/11.
 | 
						|
 * https://kangax.github.io/compat-table/es6/#test-let_scope_shadow_resolution
 | 
						|
 */
 | 
						|
function _default({
 | 
						|
  types: t
 | 
						|
}) {
 | 
						|
  return {
 | 
						|
    name: "transform-safari-block-shadowing",
 | 
						|
    visitor: {
 | 
						|
      VariableDeclarator(path) {
 | 
						|
        // the issue only affects let and const bindings:
 | 
						|
        const kind = path.parent.kind;
 | 
						|
        if (kind !== "let" && kind !== "const") return; // ignore non-block-scoped bindings:
 | 
						|
 | 
						|
        const block = path.scope.block;
 | 
						|
        if (t.isFunction(block) || t.isProgram(block)) return;
 | 
						|
        const bindings = t.getOuterBindingIdentifiers(path.node.id);
 | 
						|
 | 
						|
        for (const name of Object.keys(bindings)) {
 | 
						|
          let scope = path.scope; // ignore parent bindings (note: impossible due to let/const?)
 | 
						|
 | 
						|
          if (!scope.hasOwnBinding(name)) continue; // check if shadowed within the nearest function/program boundary
 | 
						|
 | 
						|
          while (scope = scope.parent) {
 | 
						|
            if (scope.hasOwnBinding(name)) {
 | 
						|
              path.scope.rename(name);
 | 
						|
              break;
 | 
						|
            }
 | 
						|
 | 
						|
            if (t.isFunction(scope.block) || t.isProgram(scope.block)) {
 | 
						|
              break;
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
module.exports = exports.default; |