2017-10-20 22:44:54 +03:00
|
|
|
'use strict';
|
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
var through = require('through');
|
|
|
|
|
|
|
|
// The elliptic package.json is only used for its version
|
|
|
|
var ellipticPackage = require('elliptic/package.json');
|
|
|
|
ellipticPackage = JSON.stringify({ version: ellipticPackage.version });
|
|
|
|
|
2017-11-13 00:39:41 +03:00
|
|
|
var versions = {
|
|
|
|
'ethers': require('./package.json').version,
|
|
|
|
};
|
|
|
|
|
|
|
|
var depVersions = require('./package.json').dependencies;
|
2017-10-23 00:47:17 +03:00
|
|
|
|
|
|
|
// Make sure the versions we are building a dist from are the most rescent
|
2017-10-20 22:44:54 +03:00
|
|
|
[ 'contracts', 'providers', 'utils', 'wallet'].forEach(function(name) {
|
|
|
|
var npmVersion = require('./node_modules/ethers-' + name + '/package.json').version;
|
|
|
|
var liveVersion = require('./' + name + '/package.json').version;
|
2017-11-13 00:39:41 +03:00
|
|
|
var depVersion = depVersions['ethers-' + name];
|
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
if (npmVersion !== liveVersion) {
|
2017-11-10 03:54:28 +03:00
|
|
|
console.log(name, ('npm=' + npmVersion), ('live=' + liveVersion));
|
2017-10-23 00:47:17 +03:00
|
|
|
throw new Error('version mismatch for ' + name + ' - redo npm install');
|
|
|
|
}
|
2017-12-05 11:25:08 +03:00
|
|
|
if (npmVersion !== depVersion) {
|
2017-11-13 00:39:41 +03:00
|
|
|
console.log(name, ('npm=' + npmVersion), ('depVersion=' + depVersion));
|
|
|
|
throw new Error('dependency version mismatch for ' + name + ' - update package.json');
|
|
|
|
}
|
|
|
|
|
|
|
|
versions[name] = liveVersion;
|
2017-10-23 00:47:17 +03:00
|
|
|
|
|
|
|
console.log('Including: ', name + '@' + npmVersion);
|
2017-10-20 22:44:54 +03:00
|
|
|
});
|
2017-02-27 08:08:48 +03:00
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
|
|
|
|
|
2017-02-27 08:08:48 +03:00
|
|
|
|
|
|
|
var undef = "module.exports = undefined;";
|
|
|
|
var empty = "module.exports = {};";
|
|
|
|
|
2017-02-28 01:35:23 +03:00
|
|
|
// We already have a random Uint8Array browser/node safe source
|
|
|
|
var brorand = "var randomBytes = require('ethers-utils').randomBytes; module.exports = function(length) { return randomBytes(length); };";
|
|
|
|
|
2017-02-27 08:08:48 +03:00
|
|
|
var transforms = {
|
2017-10-23 00:47:17 +03:00
|
|
|
// Remove the precomputed secp256k1 points
|
2017-02-28 01:35:23 +03:00
|
|
|
"elliptic/lib/elliptic/precomputed/secp256k1.js": undef,
|
2017-10-23 00:47:17 +03:00
|
|
|
|
|
|
|
// Remove curves we don't care about
|
2017-02-27 08:08:48 +03:00
|
|
|
"elliptic/curve/edwards.js": empty,
|
|
|
|
"elliptic/curve/mont.js": empty,
|
|
|
|
"elliptic/lib/elliptic/eddsa/.*": empty,
|
2017-10-23 00:47:17 +03:00
|
|
|
|
|
|
|
// We only use the version from this JSON package
|
2017-02-28 01:35:23 +03:00
|
|
|
"elliptic/package.json" : ellipticPackage,
|
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
// Remove RIPEMD160
|
2017-02-28 01:35:23 +03:00
|
|
|
"hash.js/lib/hash/ripemd.js": "module.exports = {ripemd160: null}",
|
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
// Swap out borland for the random bytes we already have
|
2017-02-28 01:35:23 +03:00
|
|
|
"brorand/index.js": brorand,
|
|
|
|
|
2017-10-23 00:47:17 +03:00
|
|
|
// Used by sha3 if it exists; (so make it no exist)
|
2017-02-27 08:08:48 +03:00
|
|
|
"process/.*": undef,
|
|
|
|
};
|
|
|
|
|
|
|
|
var modified = {};
|
|
|
|
var unmodified = {};
|
|
|
|
|
|
|
|
function transformFile(path) {
|
|
|
|
for (var pattern in transforms) {
|
2017-02-28 01:35:23 +03:00
|
|
|
if (path.match(new RegExp('/' + pattern + '$'))) {
|
2017-02-27 08:08:48 +03:00
|
|
|
modified[pattern] = true;
|
|
|
|
return transforms[pattern];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function transform(path, options) {
|
|
|
|
var data = '';
|
|
|
|
|
|
|
|
return through(function(chunk) {
|
|
|
|
data += chunk;
|
|
|
|
}, function () {
|
|
|
|
var transformed = transformFile(path);
|
|
|
|
if (transformed != null) {
|
|
|
|
data = transformed;
|
|
|
|
} else {
|
|
|
|
unmodified[path] = true;
|
|
|
|
}
|
|
|
|
this.queue(data);
|
|
|
|
this.queue(null);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-02-28 01:35:23 +03:00
|
|
|
var inflight = 0;
|
|
|
|
|
|
|
|
function preBundle(bundle) {
|
|
|
|
inflight++;
|
|
|
|
}
|
|
|
|
|
|
|
|
function postBundle(error, source, next) {
|
|
|
|
if (error) {
|
|
|
|
console.log(error);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// We setup the utils instance to be able to create a stand-alone package
|
|
|
|
source = source.toString();
|
|
|
|
var lengthBefore = source.length;
|
|
|
|
var source = source.replace(/"__STAND_ALONE_FALSE__"/g, '"__STAND_ALONE_TRUE__"');
|
|
|
|
if (lengthBefore - source.length !== 1) {
|
|
|
|
next(new Error('multiple stand-alone variables changed'));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inflight--
|
|
|
|
if (inflight === 0) {
|
|
|
|
|
|
|
|
// List all files that passed though unchanged
|
|
|
|
var preserved = {};
|
|
|
|
Object.keys(unmodified).forEach(function(filename) {
|
|
|
|
var match = filename.match(/(node_modules.*)$/);
|
|
|
|
if (!match) {
|
|
|
|
match = filename.match(/(ethers\.js.*)$/);
|
|
|
|
}
|
|
|
|
if (!match) {
|
|
|
|
match = [null, filename];
|
|
|
|
}
|
|
|
|
preserved[match[1]] = true;
|
2017-02-27 08:08:48 +03:00
|
|
|
});
|
2017-02-28 01:35:23 +03:00
|
|
|
preserved = Object.keys(preserved);
|
|
|
|
preserved.sort();
|
|
|
|
console.log('Preserved:');
|
|
|
|
preserved.forEach(function(path) {
|
2017-10-23 00:47:17 +03:00
|
|
|
console.log(' ', path);
|
2017-02-28 01:35:23 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
// Make sure there were no replacement patterns that went unused
|
|
|
|
var skipped = [];
|
|
|
|
for (var key in transforms) {
|
|
|
|
if (!modified[key]) { skipped.push(key); }
|
|
|
|
}
|
|
|
|
skipped.sort();
|
|
|
|
if (skipped.length) {
|
|
|
|
console.log('Unused Patterns:');
|
|
|
|
skipped.forEach(function(pattern) {
|
2017-10-23 00:47:17 +03:00
|
|
|
console.log(' ', pattern);
|
2017-02-28 01:35:23 +03:00
|
|
|
});
|
|
|
|
}
|
2017-02-27 08:08:48 +03:00
|
|
|
}
|
2017-02-28 01:35:23 +03:00
|
|
|
|
2017-02-27 08:08:48 +03:00
|
|
|
next(error, source);
|
|
|
|
}
|
|
|
|
|
2016-07-14 20:43:15 +03:00
|
|
|
module.exports = function(grunt) {
|
|
|
|
grunt.initConfig({
|
|
|
|
browserify: {
|
|
|
|
dist: {
|
|
|
|
files: {
|
2017-02-24 22:41:24 +03:00
|
|
|
'dist/ethers.js': './index.js',
|
|
|
|
'dist/ethers-contracts.js': './contracts/index.js',
|
2017-02-27 08:08:48 +03:00
|
|
|
'dist/ethers-providers.js': './providers/index.js',
|
2017-02-24 22:41:24 +03:00
|
|
|
'dist/ethers-utils.js': './utils/index.js',
|
|
|
|
'dist/ethers-wallet.js': './wallet/index.js',
|
2016-07-14 20:43:15 +03:00
|
|
|
},
|
|
|
|
options: {
|
2017-02-27 08:08:48 +03:00
|
|
|
transform: [
|
|
|
|
[ transform, { global: true } ],
|
|
|
|
],
|
2016-07-14 20:43:15 +03:00
|
|
|
browserifyOptions: {
|
2017-02-28 01:35:23 +03:00
|
|
|
//standalone: '_ethers',
|
2017-02-27 08:08:48 +03:00
|
|
|
},
|
2017-02-28 01:35:23 +03:00
|
|
|
preBundleCB: preBundle,
|
|
|
|
postBundleCB: postBundle
|
2017-02-24 22:41:24 +03:00
|
|
|
},
|
|
|
|
},
|
2016-07-14 20:43:15 +03:00
|
|
|
},
|
|
|
|
uglify: {
|
|
|
|
dist: {
|
|
|
|
files: {
|
2017-02-24 22:41:24 +03:00
|
|
|
'dist/ethers.min.js' : [ './dist/ethers.js' ],
|
|
|
|
'dist/ethers-contracts.min.js' : [ './dist/ethers-contracts.js' ],
|
2017-02-27 08:08:48 +03:00
|
|
|
'dist/ethers-providers.min.js' : [ './dist/ethers-providers.js' ],
|
2017-02-24 22:41:24 +03:00
|
|
|
'dist/ethers-utils.min.js' : [ './dist/ethers-utils.js' ],
|
|
|
|
'dist/ethers-wallet.min.js' : [ './dist/ethers-wallet.js' ],
|
2016-07-14 20:43:15 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
grunt.loadNpmTasks('grunt-browserify');
|
|
|
|
grunt.loadNpmTasks('grunt-contrib-uglify');
|
|
|
|
|
|
|
|
grunt.registerTask('dist', ['browserify', 'uglify']);
|
|
|
|
};
|