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;
							 |