babel-private-properties

A babel plugin which will convert all private properties (identifiers) to md5 hashes.

Usage no npm install needed!

<script type="module">
  import babelPrivateProperties from 'https://cdn.skypack.dev/babel-private-properties';
</script>

README

npm version

babel-private-properties

When building a library it is common practice to mark properties as private by prefixing them with an underscore.

This plugin appends a few characters to any properties that are prefixed with an underscore to make it even clearer that these properties are intended for internal use only. The characters are the first part of an md5 hash of the identifier. You can provide a custom salt making it possible to generate different hashes for each build.

Install

npm install --save-dev babel-private-properties

Example

Transforms

function HelloLib(name) {
    // don't want users to access this directly
    this._name = name;
}

// don't want users to call this directly
HelloLib.prototype._getName = function() {
    return this._name;
};

// This method is public and should be called externally
HelloLib.prototype.sayHello = function() {
    var name = this._getName();
    console.log("Hello "+name+"!");
};

module.exports = HelloLib;

to

function HelloLib(name) {
    // don't want users to access this directly
    this._name9aca = name;
}

// don't want users to call this directly
HelloLib.prototype._getName411c = function () {
    return this._name9aca;
};

// This method is public and should be called externally
HelloLib.prototype.sayHello = function () {
    var name = this._getName411c();
    console.log("Hello " + name + "!");
};

module.exports = HelloLib;

Usage

.babelrc
{
  "plugins": ["babel-private-properties"]
}

Set plugin options using an array of [pluginName, optionsObject].

{
  "plugins": [["babel-private-properties", {
    "prefix": "_",
    "salt": "salt",
    "hashLength": 4,
    "replaceCompletely": false
  }]]
}
webpack.config.js
'module': {
  'loaders': [{
    'loader': 'babel-loader',
    'test': /\.js$/,
    'exclude': /node_modules/,
    'query': {
      'plugins': ['babel-private-properties']
    }
  }]
}

If the replaceCompletely option is true the identifiers will be replaced completley with its hash. This isn't recommended as even though it's incredibly unlikely a hash collision could occur. Keeping the original text prevents this.

Vary Hashes Per Build

If you supply the config with webpack you can change the salt dynamically.

'module': {
  'loaders': [{
    'loader': 'babel-loader',
    'test': /\.js$/,
    'exclude': /node_modules/,
    'query': {
      'plugins': [["babel-private-properties", {
        "salt": Math.random() // Each build will have unique private property names
      }]]
    }
  }]
}