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.
		
		
		
		
		
			
		
			
				
					185 lines
				
				4.7 KiB
			
		
		
			
		
	
	
					185 lines
				
				4.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/***********************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  A JavaScript tokenizer / parser / beautifier / compressor.
							 | 
						||
| 
								 | 
							
								  https://github.com/mishoo/UglifyJS2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  -------------------------------- (C) ---------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                           Author: Mihai Bazon
							 | 
						||
| 
								 | 
							
								                         <mihai.bazon@gmail.com>
							 | 
						||
| 
								 | 
							
								                       http://mihai.bazon.net/blog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Distributed under the BSD license:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								    modification, are permitted provided that the following conditions
							 | 
						||
| 
								 | 
							
								    are met:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        * Redistributions of source code must retain the above
							 | 
						||
| 
								 | 
							
								          copyright notice, this list of conditions and the following
							 | 
						||
| 
								 | 
							
								          disclaimer.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        * Redistributions in binary form must reproduce the above
							 | 
						||
| 
								 | 
							
								          copyright notice, this list of conditions and the following
							 | 
						||
| 
								 | 
							
								          disclaimer in the documentation and/or other materials
							 | 
						||
| 
								 | 
							
								          provided with the distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
							 | 
						||
| 
								 | 
							
								    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						||
| 
								 | 
							
								    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
							 | 
						||
| 
								 | 
							
								    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
							 | 
						||
| 
								 | 
							
								    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
							 | 
						||
| 
								 | 
							
								    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
							 | 
						||
| 
								 | 
							
								    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
							 | 
						||
| 
								 | 
							
								    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
							 | 
						||
| 
								 | 
							
								    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
							 | 
						||
| 
								 | 
							
								    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
							 | 
						||
| 
								 | 
							
								    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
							 | 
						||
| 
								 | 
							
								    SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 ***********************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { makePredicate } from "../utils/index.js";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Lists of native methods, useful for `unsafe` option which assumes they exist.
							 | 
						||
| 
								 | 
							
								// Note: Lots of methods and functions are missing here, in case they aren't pure
							 | 
						||
| 
								 | 
							
								// or not available in all JS environments.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function make_nested_lookup(obj) {
							 | 
						||
| 
								 | 
							
								    const out = new Map();
							 | 
						||
| 
								 | 
							
								    for (var key of Object.keys(obj)) {
							 | 
						||
| 
								 | 
							
								        out.set(key, makePredicate(obj[key]));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const does_have = (global_name, fname) => {
							 | 
						||
| 
								 | 
							
								        const inner_map = out.get(global_name);
							 | 
						||
| 
								 | 
							
								        return inner_map != null && inner_map.has(fname);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    return does_have;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Objects which are safe to access without throwing or causing a side effect.
							 | 
						||
| 
								 | 
							
								// Usually we'd check the `unsafe` option first but these are way too common for that
							 | 
						||
| 
								 | 
							
								export const pure_prop_access_globals = new Set([
							 | 
						||
| 
								 | 
							
								    "Number",
							 | 
						||
| 
								 | 
							
								    "String",
							 | 
						||
| 
								 | 
							
								    "Array",
							 | 
						||
| 
								 | 
							
								    "Object",
							 | 
						||
| 
								 | 
							
								    "Function",
							 | 
						||
| 
								 | 
							
								    "Promise",
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const object_methods = [
							 | 
						||
| 
								 | 
							
								    "constructor",
							 | 
						||
| 
								 | 
							
								    "toString",
							 | 
						||
| 
								 | 
							
								    "valueOf",
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export const is_pure_native_method = make_nested_lookup({
							 | 
						||
| 
								 | 
							
								    Array: [
							 | 
						||
| 
								 | 
							
								        "indexOf",
							 | 
						||
| 
								 | 
							
								        "join",
							 | 
						||
| 
								 | 
							
								        "lastIndexOf",
							 | 
						||
| 
								 | 
							
								        "slice",
							 | 
						||
| 
								 | 
							
								        ...object_methods,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Boolean: object_methods,
							 | 
						||
| 
								 | 
							
								    Function: object_methods,
							 | 
						||
| 
								 | 
							
								    Number: [
							 | 
						||
| 
								 | 
							
								        "toExponential",
							 | 
						||
| 
								 | 
							
								        "toFixed",
							 | 
						||
| 
								 | 
							
								        "toPrecision",
							 | 
						||
| 
								 | 
							
								        ...object_methods,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Object: object_methods,
							 | 
						||
| 
								 | 
							
								    RegExp: [
							 | 
						||
| 
								 | 
							
								        "test",
							 | 
						||
| 
								 | 
							
								        ...object_methods,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    String: [
							 | 
						||
| 
								 | 
							
								        "charAt",
							 | 
						||
| 
								 | 
							
								        "charCodeAt",
							 | 
						||
| 
								 | 
							
								        "concat",
							 | 
						||
| 
								 | 
							
								        "indexOf",
							 | 
						||
| 
								 | 
							
								        "italics",
							 | 
						||
| 
								 | 
							
								        "lastIndexOf",
							 | 
						||
| 
								 | 
							
								        "match",
							 | 
						||
| 
								 | 
							
								        "replace",
							 | 
						||
| 
								 | 
							
								        "search",
							 | 
						||
| 
								 | 
							
								        "slice",
							 | 
						||
| 
								 | 
							
								        "split",
							 | 
						||
| 
								 | 
							
								        "substr",
							 | 
						||
| 
								 | 
							
								        "substring",
							 | 
						||
| 
								 | 
							
								        "toLowerCase",
							 | 
						||
| 
								 | 
							
								        "toUpperCase",
							 | 
						||
| 
								 | 
							
								        "trim",
							 | 
						||
| 
								 | 
							
								        ...object_methods,
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export const is_pure_native_fn = make_nested_lookup({
							 | 
						||
| 
								 | 
							
								    Array: [
							 | 
						||
| 
								 | 
							
								        "isArray",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Math: [
							 | 
						||
| 
								 | 
							
								        "abs",
							 | 
						||
| 
								 | 
							
								        "acos",
							 | 
						||
| 
								 | 
							
								        "asin",
							 | 
						||
| 
								 | 
							
								        "atan",
							 | 
						||
| 
								 | 
							
								        "ceil",
							 | 
						||
| 
								 | 
							
								        "cos",
							 | 
						||
| 
								 | 
							
								        "exp",
							 | 
						||
| 
								 | 
							
								        "floor",
							 | 
						||
| 
								 | 
							
								        "log",
							 | 
						||
| 
								 | 
							
								        "round",
							 | 
						||
| 
								 | 
							
								        "sin",
							 | 
						||
| 
								 | 
							
								        "sqrt",
							 | 
						||
| 
								 | 
							
								        "tan",
							 | 
						||
| 
								 | 
							
								        "atan2",
							 | 
						||
| 
								 | 
							
								        "pow",
							 | 
						||
| 
								 | 
							
								        "max",
							 | 
						||
| 
								 | 
							
								        "min",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Number: [
							 | 
						||
| 
								 | 
							
								        "isFinite",
							 | 
						||
| 
								 | 
							
								        "isNaN",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Object: [
							 | 
						||
| 
								 | 
							
								        "create",
							 | 
						||
| 
								 | 
							
								        "getOwnPropertyDescriptor",
							 | 
						||
| 
								 | 
							
								        "getOwnPropertyNames",
							 | 
						||
| 
								 | 
							
								        "getPrototypeOf",
							 | 
						||
| 
								 | 
							
								        "isExtensible",
							 | 
						||
| 
								 | 
							
								        "isFrozen",
							 | 
						||
| 
								 | 
							
								        "isSealed",
							 | 
						||
| 
								 | 
							
								        "hasOwn",
							 | 
						||
| 
								 | 
							
								        "keys",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    String: [
							 | 
						||
| 
								 | 
							
								        "fromCharCode",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Known numeric values which come with JS environments
							 | 
						||
| 
								 | 
							
								export const is_pure_native_value = make_nested_lookup({
							 | 
						||
| 
								 | 
							
								    Math: [
							 | 
						||
| 
								 | 
							
								        "E",
							 | 
						||
| 
								 | 
							
								        "LN10",
							 | 
						||
| 
								 | 
							
								        "LN2",
							 | 
						||
| 
								 | 
							
								        "LOG2E",
							 | 
						||
| 
								 | 
							
								        "LOG10E",
							 | 
						||
| 
								 | 
							
								        "PI",
							 | 
						||
| 
								 | 
							
								        "SQRT1_2",
							 | 
						||
| 
								 | 
							
								        "SQRT2",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								    Number: [
							 | 
						||
| 
								 | 
							
								        "MAX_VALUE",
							 | 
						||
| 
								 | 
							
								        "MIN_VALUE",
							 | 
						||
| 
								 | 
							
								        "NaN",
							 | 
						||
| 
								 | 
							
								        "NEGATIVE_INFINITY",
							 | 
						||
| 
								 | 
							
								        "POSITIVE_INFINITY",
							 | 
						||
| 
								 | 
							
								    ],
							 | 
						||
| 
								 | 
							
								});
							 |