mangle-props

0.0.1 • Public • Published

Mangle Properties


By Mike Gieson www.gieson.com

Compresses / minifies / mangles javascript property names.

Mangle-props works with any javascript compress / minify package (not just UglifyJs), because I'm using a separate AST parser (Falafal).

Mangling is conducted on strings (not files). In other words, you're feeding mangle-props a string and receiving a mangled string in return. You're responsible for managing how the javascript files are opened and saved.

Since I couldn't get UglifyJs's mangle properties options to work, this script deals with property mangling separately in a way that's straight-forward, simple (and works).

Usage

Usage is pretty straigh-forward:

mangle(string [, regex, regexOptions]);

regex : a regex pattern WITHOUT the opening /and/ closing slashes Example: "^_" will search for identifiers that begin with and underscore regexOptions : Regex options such as ignore case (i), multi-line(m). These are kinda useless since variable/properties generally are single words, but it's there for you if you need it. Example: "im" returns : string

Here's and example of how to use Mangle-props with UglifyJs:

var fs = require("fs");
var ugly = require("uglify-js");
var mangle = require("mangle-props");

var path = "/Users/bob/Desktop/test/test.js";

// Open the javascript file:
var src = fs.readFileSync(path, "UTF-8");

// First pass using uglify
var ug = ugly.minify(src, {
    compress: true,
    fromString : true
});

// Second pass to mangle the properties
var result = mangle(ug.code, "^_");

// Save the results
var lastDot = path.lastIndexOf(".");
var outPath = path.substr(0, lastDot+1) + "min" + path.substr(lastDot);
fs.writeFileSync(outPath, result, "UTF-8");

Here's en example javascript that uses "_" to represent "private" variables:

(function(){
var Klass = function(){
    this.propA = "prop A ";
    this._propB = "prop B ";
    this.propC = "prop C ";
    this._propD = "prop D ";
}

var p = Klass.prototype;

    p.propA = "prop A ";
    p._propB = "prop B ";
    p.propC = "prop C ";
    p._propD = "prop D ";
    
    window.Klass = Klass;
    
})();

Using mangle-props, we can set the "regex" pattern to "^" so that all the properties that begin with "" will be mangled -- leaving others alone.

The resulting code would read as:

(function(){
var Klass = function(){
    this.propA = "prop A ";
    this.y = "prop B ";
    this.propC = "prop C ";
    this.z = "prop D ";
}

var p = Klass.prototype;

    p.propA = "prop A ";
    p.y = "prop B ";
    p.propC = "prop C ";
    p.z = "prop D ";
    
    window.Klass = Klass;
    
})();

Where mangle replaced _propB with a random character, in this example "x". Likewise _propD was repalced throughout the script with "z".

Mangle also replaced literal object properties as well. Example:

var obj = {
        objA : "object A ",
        _objB : "object B ",
        objC : "object C ",
        _objD : "object D "
    }

After using mangle(str, "^_"), the object would read as:

var obj = {
        objA : "object A ",
        y : "object B ",
        objC : "object C ",
        z : "object D "
    }

Where "y" and "z" are replacements made by mangle-props.

Package Sidebar

Install

npm i mangle-props

Weekly Downloads

1

Version

0.0.1

License

MIT

Last publish

Collaborators

  • mgieson