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
			| 
											3 years ago
										 | "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; |