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