| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 | // workaround for tty output truncation upon process.exit()[process.stdout, process.stderr].forEach(function(stream){    if (stream._handle && stream._handle.setBlocking)        stream._handle.setBlocking(true);});var path = require("path");var fs = require("fs");var UglifyJS = exports;var FILES = UglifyJS.FILES = [    "../lib/utils.js",    "../lib/ast.js",    "../lib/parse.js",    "../lib/transform.js",    "../lib/scope.js",    "../lib/output.js",    "../lib/compress.js",    "../lib/sourcemap.js",    "../lib/mozilla-ast.js",    "../lib/propmangle.js",    "./exports.js",].map(function(file){    return require.resolve(file);});new Function("MOZ_SourceMap", "exports", FILES.map(function(file){    return fs.readFileSync(file, "utf8");}).join("\n\n"))(    require("source-map"),    UglifyJS);UglifyJS.AST_Node.warn_function = function(txt) {    console.error("WARN: %s", txt);};function read_source_map(code) {    var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);    if (!match) {        UglifyJS.AST_Node.warn("inline source map not found");        return null;    }    return JSON.parse(new Buffer(match[2], "base64"));}UglifyJS.minify = function(files, options) {    options = UglifyJS.defaults(options, {        compress         : {},        fromString       : false,        inSourceMap      : null,        mangle           : {},        mangleProperties : false,        nameCache        : null,        outFileName      : null,        output           : null,        outSourceMap     : null,        parse            : {},        sourceMapInline  : false,        sourceMapUrl     : null,        sourceRoot       : null,        spidermonkey     : false,        warnings         : false,    });    UglifyJS.base54.reset();    var inMap = options.inSourceMap;    if (typeof inMap == "string" && inMap != "inline") {        inMap = JSON.parse(fs.readFileSync(inMap, "utf8"));    }    // 1. parse    var toplevel = null,        sourcesContent = {};    if (options.spidermonkey) {        if (inMap == "inline") {            throw new Error("inline source map only works with built-in parser");        }        toplevel = UglifyJS.AST_Node.from_mozilla_ast(files);    } else {        function addFile(file, fileUrl) {            var code = options.fromString                ? file                : fs.readFileSync(file, "utf8");            if (inMap == "inline") {                inMap = read_source_map(code);            }            sourcesContent[fileUrl] = code;            toplevel = UglifyJS.parse(code, {                filename: fileUrl,                toplevel: toplevel,                bare_returns: options.parse ? options.parse.bare_returns : undefined            });        }        if (!options.fromString) {            files = UglifyJS.simple_glob(files);            if (inMap == "inline" && files.length > 1) {                throw new Error("inline source map only works with singular input");            }        }        [].concat(files).forEach(function (files, i) {            if (typeof files === 'string') {                addFile(files, options.fromString ? i : files);            } else {                for (var fileUrl in files) {                    addFile(files[fileUrl], fileUrl);                }            }        });    }    if (options.wrap) {      toplevel = toplevel.wrap_commonjs(options.wrap, options.exportAll);    }    // 2. compress    if (options.compress) {        var compress = { warnings: options.warnings };        UglifyJS.merge(compress, options.compress);        toplevel.figure_out_scope(options.mangle);        var sq = UglifyJS.Compressor(compress);        toplevel = sq.compress(toplevel);    }    // 3. mangle properties    if (options.mangleProperties || options.nameCache) {        options.mangleProperties.cache = UglifyJS.readNameCache(options.nameCache, "props");        toplevel = UglifyJS.mangle_properties(toplevel, options.mangleProperties);        UglifyJS.writeNameCache(options.nameCache, "props", options.mangleProperties.cache);    }    // 4. mangle    if (options.mangle) {        toplevel.figure_out_scope(options.mangle);        toplevel.compute_char_frequency(options.mangle);        toplevel.mangle_names(options.mangle);    }    // 5. output    var output = { max_line_len: 32000 };    if (options.outSourceMap || options.sourceMapInline) {        output.source_map = UglifyJS.SourceMap({            // prefer outFileName, otherwise use outSourceMap without .map suffix            file: options.outFileName || (typeof options.outSourceMap === 'string' ? options.outSourceMap.replace(/\.map$/i, '') : null),            orig: inMap,            root: options.sourceRoot        });        if (options.sourceMapIncludeSources) {            for (var file in sourcesContent) {                if (sourcesContent.hasOwnProperty(file)) {                    output.source_map.get().setSourceContent(file, sourcesContent[file]);                }            }        }    }    if (options.output) {        UglifyJS.merge(output, options.output);    }    var stream = UglifyJS.OutputStream(output);    toplevel.print(stream);    var source_map = output.source_map;    if (source_map) {        source_map = source_map + "";    }    var mappingUrlPrefix = "\n//# sourceMappingURL=";    if (options.sourceMapInline) {        stream += mappingUrlPrefix + "data:application/json;charset=utf-8;base64," + new Buffer(source_map).toString("base64");    } else if (options.outSourceMap && typeof options.outSourceMap === "string" && options.sourceMapUrl !== false) {        stream += mappingUrlPrefix + (typeof options.sourceMapUrl === "string" ? options.sourceMapUrl : options.outSourceMap);    }    return {        code : stream + "",        map  : source_map    };};// UglifyJS.describe_ast = function() {//     function doitem(ctor) {//         var sub = {};//         ctor.SUBCLASSES.forEach(function(ctor){//             sub[ctor.TYPE] = doitem(ctor);//         });//         var ret = {};//         if (ctor.SELF_PROPS.length > 0) ret.props = ctor.SELF_PROPS;//         if (ctor.SUBCLASSES.length > 0) ret.sub = sub;//         return ret;//     }//     return doitem(UglifyJS.AST_Node).sub;// }UglifyJS.describe_ast = function() {    var out = UglifyJS.OutputStream({ beautify: true });    function doitem(ctor) {        out.print("AST_" + ctor.TYPE);        var props = ctor.SELF_PROPS.filter(function(prop){            return !/^\$/.test(prop);        });        if (props.length > 0) {            out.space();            out.with_parens(function(){                props.forEach(function(prop, i){                    if (i) out.space();                    out.print(prop);                });            });        }        if (ctor.documentation) {            out.space();            out.print_string(ctor.documentation);        }        if (ctor.SUBCLASSES.length > 0) {            out.space();            out.with_block(function(){                ctor.SUBCLASSES.forEach(function(ctor, i){                    out.indent();                    doitem(ctor);                    out.newline();                });            });        }    };    doitem(UglifyJS.AST_Node);    return out + "";};function readReservedFile(filename, reserved) {    if (!reserved) {        reserved = { vars: [], props: [] };    }    var data = fs.readFileSync(filename, "utf8");    data = JSON.parse(data);    if (data.vars) {        data.vars.forEach(function(name){            UglifyJS.push_uniq(reserved.vars, name);        });    }    if (data.props) {        data.props.forEach(function(name){            UglifyJS.push_uniq(reserved.props, name);        });    }    return reserved;}UglifyJS.readReservedFile = readReservedFile;UglifyJS.readDefaultReservedFile = function(reserved) {    return readReservedFile(require.resolve("./domprops.json"), reserved);};UglifyJS.readNameCache = function(filename, key) {    var cache = null;    if (filename) {        try {            var cache = fs.readFileSync(filename, "utf8");            cache = JSON.parse(cache)[key];            if (!cache) throw "init";            cache.props = UglifyJS.Dictionary.fromObject(cache.props);        } catch(ex) {            cache = {                cname: -1,                props: new UglifyJS.Dictionary()            };        }    }    return cache;};UglifyJS.writeNameCache = function(filename, key, cache) {    if (filename) {        var data;        try {            data = fs.readFileSync(filename, "utf8");            data = JSON.parse(data);        } catch(ex) {            data = {};        }        data[key] = {            cname: cache.cname,            props: cache.props.toObject()        };        fs.writeFileSync(filename, JSON.stringify(data, null, 2), "utf8");    }};// A file glob function that only supports "*" and "?" wildcards in the basename.// Example: "foo/bar/*baz??.*.js"// Argument `glob` may be a string or an array of strings.// Returns an array of strings. Garbage in, garbage out.UglifyJS.simple_glob = function simple_glob(glob) {    if (Array.isArray(glob)) {        return [].concat.apply([], glob.map(simple_glob));    }    if (glob.match(/\*|\?/)) {        var dir = path.dirname(glob);        try {            var entries = fs.readdirSync(dir);        } catch (ex) {}        if (entries) {            var pattern = "^" + path.basename(glob)                .replace(/[.+^$[\]\\(){}]/g, "\\$&")                .replace(/\*/g, "[^/\\\\]*")                .replace(/\?/g, "[^/\\\\]") + "$";            var mod = process.platform === "win32" ? "i" : "";            var rx = new RegExp(pattern, mod);            var results = entries.filter(function(name) {                return rx.test(name);            }).map(function(name) {                return path.join(dir, name);            });            if (results.length) return results;        }    }    return [ glob ];};
 |