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.
184 lines
4.7 KiB
184 lines
4.7 KiB
/*********************************************************************** |
|
|
|
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", |
|
], |
|
});
|
|
|