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", | ||
|  |     ], | ||
|  | }); |