You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					47 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					47 lines
				
				1.3 KiB
			| 
											3 years ago
										 | "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; |