207 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /***********************************************************************
 | |
| 
 | |
|   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: [
 | |
|         "at",
 | |
|         "flat",
 | |
|         "includes",
 | |
|         "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: [
 | |
|         "at",
 | |
|         "charAt",
 | |
|         "charCodeAt",
 | |
|         "charPointAt",
 | |
|         "concat",
 | |
|         "endsWith",
 | |
|         "fromCharCode",
 | |
|         "fromCodePoint",
 | |
|         "includes",
 | |
|         "indexOf",
 | |
|         "italics",
 | |
|         "lastIndexOf",
 | |
|         "localeCompare",
 | |
|         "match",
 | |
|         "matchAll",
 | |
|         "normalize",
 | |
|         "padStart",
 | |
|         "padEnd",
 | |
|         "repeat",
 | |
|         "replace",
 | |
|         "replaceAll",
 | |
|         "search",
 | |
|         "slice",
 | |
|         "split",
 | |
|         "startsWith",
 | |
|         "substr",
 | |
|         "substring",
 | |
|         "repeat",
 | |
|         "toLocaleLowerCase",
 | |
|         "toLocaleUpperCase",
 | |
|         "toLowerCase",
 | |
|         "toUpperCase",
 | |
|         "trim",
 | |
|         "trimEnd",
 | |
|         "trimStart",
 | |
|         ...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",
 | |
|     ],
 | |
| });
 |