112 lines
4.0 KiB
JavaScript
112 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const through = require('through');
|
|
|
|
let show = { transformed: true, preserved: true };
|
|
|
|
// The elliptic package.json is only used for its version
|
|
var ellipticPackage = require('elliptic/package.json');
|
|
ellipticPackage = JSON.stringify({ version: ellipticPackage.version });
|
|
|
|
var version = require('../package.json').version;
|
|
|
|
var undef = "module.exports = undefined;";
|
|
var empty = "module.exports = {};";
|
|
|
|
// This is only used in getKeyPair, which we do not use; but we'll
|
|
// leave it in tact using the browser crypto functions
|
|
var brorand = "module.exports = function(length) { var result = new Uint8Array(length); (global.crypto || global.msCrypto).getRandomValues(result); return result; }";
|
|
|
|
// setImmediate is installed globally by our src.browser/shims.ts, loaded from src.ts/index.ts
|
|
var process = "module.exports = { browser: true };";
|
|
var timers = "module.exports = { setImmediate: global.setImmediate }; ";
|
|
|
|
function readShim(filename) {
|
|
return fs.readFileSync('./shims/' + filename + '.js').toString();
|
|
}
|
|
|
|
var transforms = {
|
|
|
|
// Remove the precomputed secp256k1 points
|
|
"elliptic/lib/elliptic/precomputed/secp256k1.js": undef,
|
|
|
|
// Remove curves we don't care about
|
|
"elliptic/curve/edwards.js": empty,
|
|
"elliptic/curve/mont.js": empty,
|
|
"elliptic/lib/elliptic/eddsa/.*": empty,
|
|
|
|
// We only use the version from this JSON package
|
|
"elliptic/package.json" : ellipticPackage,
|
|
|
|
// Remove unneeded hashing algorithms
|
|
"hash.js/lib/hash/sha/1.js": empty,
|
|
"hash.js/lib/hash/sha/224.js": empty,
|
|
"hash.js/lib/hash/sha/384.js": empty,
|
|
|
|
// Swap out borland for the random bytes we already have
|
|
"brorand/index.js": brorand,
|
|
|
|
// Used by sha3 if it exists; (so make it not exist)
|
|
"process/browser.js": process,
|
|
"timers-browserify/main.js": timers,
|
|
|
|
"ethers/platform.js": '"use strict";\n\nexports.platform = "browser\"',
|
|
};
|
|
|
|
function padding(length) {
|
|
let pad = '';
|
|
while (pad.length < length) { pad += ' '; }
|
|
return pad;
|
|
}
|
|
|
|
function transformFile(path) {
|
|
for (var pattern in transforms) {
|
|
if (path.match(new RegExp('/' + pattern + '$'))) {
|
|
return transforms[pattern];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
const dirname = path.resolve(__dirname, '../../..');
|
|
module.exports = function(pathname, options) {
|
|
let data = '';
|
|
return through(function(chunk) {
|
|
data += chunk;
|
|
}, function () {
|
|
var contents = fs.readFileSync(pathname).toString();
|
|
/*
|
|
[ 'Buffer' ].forEach((word) => {
|
|
if (contents.indexOf(word) !== -1) {
|
|
console.log("Found Bad Word:", word, "in", pathname)
|
|
}
|
|
});
|
|
*/
|
|
var transformed = transformFile(pathname);
|
|
var shortPath = pathname;
|
|
if (shortPath.substring(0, dirname.length) == dirname) {
|
|
shortPath = shortPath.substring(dirname.length);
|
|
}
|
|
var size = fs.readFileSync(pathname).length;
|
|
if (transformed != null) {
|
|
if (show.transformed) {
|
|
console.log('Transformed:', shortPath, padding(70 - shortPath.length), size, padding(6 - String(size).length), '=>', transformed.length);
|
|
}
|
|
data = transformed;
|
|
} else if (shortPath === '/src.ts/utils/wordlist.ts') {
|
|
data += '\n\nexportWordlist = true;'
|
|
if (show.transformed) {
|
|
console.log('Transformed:', shortPath, padding(70 - shortPath.length), size, padding(6 - String(size).length), '=>', data.length);
|
|
}
|
|
} else {
|
|
if (show.preserved) {
|
|
console.log('Preserved: ', shortPath, padding(70 - shortPath.length), size);
|
|
}
|
|
} this.queue(data);
|
|
|
|
this.queue(null);
|
|
});
|
|
}
|