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.
		
		
		
		
		
			
		
			
				
					
					
						
							145 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							145 lines
						
					
					
						
							3.5 KiB
						
					
					
				| "use strict";
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.default = void 0;
 | |
| 
 | |
| var _helperPluginUtils = require("@babel/helper-plugin-utils");
 | |
| 
 | |
| var _core = require("@babel/core");
 | |
| 
 | |
| var _default = (0, _helperPluginUtils.declare)(api => {
 | |
|   api.assertVersion(7);
 | |
|   const surrogate = /[\ud800-\udfff]/g;
 | |
|   const unicodeEscape = /(\\+)u\{([0-9a-fA-F]+)\}/g;
 | |
| 
 | |
|   function escape(code) {
 | |
|     let str = code.toString(16);
 | |
| 
 | |
|     while (str.length < 4) str = "0" + str;
 | |
| 
 | |
|     return "\\u" + str;
 | |
|   }
 | |
| 
 | |
|   function replacer(match, backslashes, code) {
 | |
|     if (backslashes.length % 2 === 0) {
 | |
|       return match;
 | |
|     }
 | |
| 
 | |
|     const char = String.fromCodePoint(parseInt(code, 16));
 | |
|     const escaped = backslashes.slice(0, -1) + escape(char.charCodeAt(0));
 | |
|     return char.length === 1 ? escaped : escaped + escape(char.charCodeAt(1));
 | |
|   }
 | |
| 
 | |
|   function replaceUnicodeEscapes(str) {
 | |
|     return str.replace(unicodeEscape, replacer);
 | |
|   }
 | |
| 
 | |
|   function getUnicodeEscape(str) {
 | |
|     let match;
 | |
| 
 | |
|     while (match = unicodeEscape.exec(str)) {
 | |
|       if (match[1].length % 2 === 0) continue;
 | |
|       unicodeEscape.lastIndex = 0;
 | |
|       return match[0];
 | |
|     }
 | |
| 
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     name: "transform-unicode-escapes",
 | |
| 
 | |
|     manipulateOptions({
 | |
|       generatorOpts
 | |
|     }) {
 | |
|       var _generatorOpts$jsescO, _generatorOpts$jsescO2;
 | |
| 
 | |
|       if (!generatorOpts.jsescOption) {
 | |
|         generatorOpts.jsescOption = {};
 | |
|       }
 | |
| 
 | |
|       (_generatorOpts$jsescO2 = (_generatorOpts$jsescO = generatorOpts.jsescOption).minimal) != null ? _generatorOpts$jsescO2 : _generatorOpts$jsescO.minimal = false;
 | |
|     },
 | |
| 
 | |
|     visitor: {
 | |
|       Identifier(path) {
 | |
|         const {
 | |
|           node,
 | |
|           key
 | |
|         } = path;
 | |
|         const {
 | |
|           name
 | |
|         } = node;
 | |
|         const replaced = name.replace(surrogate, c => {
 | |
|           return `_u${c.charCodeAt(0).toString(16)}`;
 | |
|         });
 | |
|         if (name === replaced) return;
 | |
| 
 | |
|         const str = _core.types.inherits(_core.types.stringLiteral(name), node);
 | |
| 
 | |
|         if (key === "key") {
 | |
|           path.replaceWith(str);
 | |
|           return;
 | |
|         }
 | |
| 
 | |
|         const {
 | |
|           parentPath,
 | |
|           scope
 | |
|         } = path;
 | |
| 
 | |
|         if (parentPath.isMemberExpression({
 | |
|           property: node
 | |
|         }) || parentPath.isOptionalMemberExpression({
 | |
|           property: node
 | |
|         })) {
 | |
|           parentPath.node.computed = true;
 | |
|           path.replaceWith(str);
 | |
|           return;
 | |
|         }
 | |
| 
 | |
|         const binding = scope.getBinding(name);
 | |
| 
 | |
|         if (binding) {
 | |
|           scope.rename(name, scope.generateUid(replaced));
 | |
|           return;
 | |
|         }
 | |
| 
 | |
|         throw path.buildCodeFrameError(`Can't reference '${name}' as a bare identifier`);
 | |
|       },
 | |
| 
 | |
|       "StringLiteral|DirectiveLiteral"(path) {
 | |
|         const {
 | |
|           node
 | |
|         } = path;
 | |
|         const {
 | |
|           extra
 | |
|         } = node;
 | |
|         if (extra != null && extra.raw) extra.raw = replaceUnicodeEscapes(extra.raw);
 | |
|       },
 | |
| 
 | |
|       TemplateElement(path) {
 | |
|         const {
 | |
|           node,
 | |
|           parentPath
 | |
|         } = path;
 | |
|         const {
 | |
|           value
 | |
|         } = node;
 | |
|         const firstEscape = getUnicodeEscape(value.raw);
 | |
|         if (!firstEscape) return;
 | |
|         const grandParent = parentPath.parentPath;
 | |
| 
 | |
|         if (grandParent.isTaggedTemplateExpression()) {
 | |
|           throw path.buildCodeFrameError(`Can't replace Unicode escape '${firstEscape}' inside tagged template literals. You can enable '@babel/plugin-transform-template-literals' to compile them to classic strings.`);
 | |
|         }
 | |
| 
 | |
|         value.raw = replaceUnicodeEscapes(value.raw);
 | |
|       }
 | |
| 
 | |
|     }
 | |
|   };
 | |
| });
 | |
| 
 | |
| exports.default = _default; |