123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- "use strict";
- function find_builtins() {
-
- var a = [
- "null",
- "true",
- "false",
- "Infinity",
- "-Infinity",
- "undefined",
- ];
- [ Object, Array, Function, Number,
- String, Boolean, Error, Math,
- Date, RegExp
- ].forEach(function(ctor){
- Object.getOwnPropertyNames(ctor).map(add);
- if (ctor.prototype) {
- Object.getOwnPropertyNames(ctor.prototype).map(add);
- }
- });
- function add(name) {
- push_uniq(a, name);
- }
- return a;
- }
- function mangle_properties(ast, options) {
- options = defaults(options, {
- cache: null,
- debug: false,
- ignore_quoted: false,
- only_cache: false,
- regex: null,
- reserved: null,
- });
- var reserved = options.reserved;
- if (reserved == null)
- reserved = find_builtins();
- var cache = options.cache;
- if (cache == null) {
- cache = {
- cname: -1,
- props: new Dictionary()
- };
- }
- var regex = options.regex;
- var ignore_quoted = options.ignore_quoted;
-
-
-
- var debug = (options.debug !== false);
- var debug_name_suffix;
- if (debug) {
- debug_name_suffix = (options.debug === true ? "" : options.debug);
- }
- var names_to_mangle = [];
- var unmangleable = [];
- var ignored = {};
-
- ast.walk(new TreeWalker(function(node){
- if (node instanceof AST_ObjectKeyVal) {
- add(node.key, ignore_quoted && node.quote);
- }
- else if (node instanceof AST_ObjectProperty) {
-
- add(node.key.name);
- }
- else if (node instanceof AST_Dot) {
- add(node.property);
- }
- else if (node instanceof AST_Sub) {
- addStrings(node.property, ignore_quoted);
- }
- }));
-
- return ast.transform(new TreeTransformer(function(node){
- if (node instanceof AST_ObjectKeyVal) {
- if (!(ignore_quoted && node.quote))
- node.key = mangle(node.key);
- }
- else if (node instanceof AST_ObjectProperty) {
-
- node.key.name = mangle(node.key.name);
- }
- else if (node instanceof AST_Dot) {
- node.property = mangle(node.property);
- }
- else if (node instanceof AST_Sub) {
- if (!ignore_quoted)
- node.property = mangleStrings(node.property);
- }
-
-
-
-
-
-
-
-
-
-
-
-
- }));
-
- function can_mangle(name) {
- if (unmangleable.indexOf(name) >= 0) return false;
- if (reserved.indexOf(name) >= 0) return false;
- if (options.only_cache) {
- return cache.props.has(name);
- }
- if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
- return true;
- }
- function should_mangle(name) {
- if (ignore_quoted && name in ignored) return false;
- if (regex && !regex.test(name)) return false;
- if (reserved.indexOf(name) >= 0) return false;
- return cache.props.has(name)
- || names_to_mangle.indexOf(name) >= 0;
- }
- function add(name, ignore) {
- if (ignore) {
- ignored[name] = true;
- return;
- }
- if (can_mangle(name))
- push_uniq(names_to_mangle, name);
- if (!should_mangle(name)) {
- push_uniq(unmangleable, name);
- }
- }
- function mangle(name) {
- if (!should_mangle(name)) {
- return name;
- }
- var mangled = cache.props.get(name);
- if (!mangled) {
- if (debug) {
-
- var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
- if (can_mangle(debug_mangled) && !(ignore_quoted && debug_mangled in ignored)) {
- mangled = debug_mangled;
- }
- }
-
- if (!mangled) {
-
-
-
- do {
- mangled = base54(++cache.cname);
- } while (!can_mangle(mangled) || (ignore_quoted && mangled in ignored));
- }
- cache.props.set(name, mangled);
- }
- return mangled;
- }
- function addStrings(node, ignore) {
- var out = {};
- try {
- (function walk(node){
- node.walk(new TreeWalker(function(node){
- if (node instanceof AST_Seq) {
- walk(node.cdr);
- return true;
- }
- if (node instanceof AST_String) {
- add(node.value, ignore);
- return true;
- }
- if (node instanceof AST_Conditional) {
- walk(node.consequent);
- walk(node.alternative);
- return true;
- }
- throw out;
- }));
- })(node);
- } catch(ex) {
- if (ex !== out) throw ex;
- }
- }
- function mangleStrings(node) {
- return node.transform(new TreeTransformer(function(node){
- if (node instanceof AST_Seq) {
- node.cdr = mangleStrings(node.cdr);
- }
- else if (node instanceof AST_String) {
- node.value = mangle(node.value);
- }
- else if (node instanceof AST_Conditional) {
- node.consequent = mangleStrings(node.consequent);
- node.alternative = mangleStrings(node.alternative);
- }
- return node;
- }));
- }
- }
|