ethers.js/rollup.config.js

146 lines
4.2 KiB
JavaScript

"use strict";
import path from "path";
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import json from 'rollup-plugin-json';
import { terser } from "rollup-plugin-terser";
import { createFilter } from 'rollup-pluginutils';
function Replacer(basePath, options = {}) {
const filter = createFilter(options.include, options.exclude);
const suffixes = Object.keys(options.replace);
const pathUp = path.resolve(basePath, "..");
return {
name: "file-replacer",
transform(code, id) {
/*
console.log("------");
console.log("NAME", id, id.match("node-resolve:empty.js$"));
console.log(code);
console.log("------");
*/
if (!filter(id)) { return null; }
for (let i = 0; i < suffixes.length; i++) {
const suffix = suffixes[i];
if (id.match(new RegExp(suffix))) {
const newCode = options.replace[suffix];
console.log(`Replace: ${ id.substring(pathUp.length + 1) } (${ code.length } => ${ newCode.length })`);
return {
code: newCode,
map: { mappings: '' }
};
}
}
if (id.substring(0, basePath.length) !== basePath) {
console.log(`Keep: ${ id.substring(pathUp.length + 1) }`);
}
return null;
}
};
}
const undef = "module.exports = undefined;";
const empty = "module.exports = {};";
const brorand = "module.exports = function(length) { var result = new Uint8Array(length); (global.crypto || global.msCrypto).getRandomValues(result); return result; }";
const ellipticPackage = (function() {
const ellipticPackage = require('./node_modules/elliptic/package.json');
return JSON.stringify({ version: ellipticPackage.version });
})();
function getConfig(minify, buildModule, testing) {
let input = "packages/ethers/lib/index.js"
let output = [ "umd" ];
let format = "umd";
let mainFields = [ "browser", "main" ];
if (buildModule) {
input = "packages/ethers/lib.esm/index.js";
output = [ "esm" ];
format = "esm";
mainFields = [ "browser", "module", "main" ];
}
const replacer = Replacer(path.resolve("packages"), {
replace: {
// 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,
}
});
const plugins = [
replacer,
json(),
resolve({
mainFields: mainFields
}),
commonjs({
namedExports: {
"bn.js": [ "BN" ],
"hash.js": [ "hmac", "ripemd160", "sha256", "sha512" ],
"elliptic": [ "ec" ],
"scrypt-js": [ "scrypt", "syncScrypt" ],
},
}),
];
if (minify) {
output.push("min");
plugins.push(terser());
}
const outputFile = [
"packages",
(testing ? "tests": "ethers"),
("/dist/ethers." + output.join(".") + ".js")
].join("/");
return {
input: input,
output: {
file: outputFile,
format: format,
name: "ethers",
exports: "named"
},
context: "window",
treeshake: false,
plugins: plugins
};
}
export default commandLineArgs => {
const testing = commandLineArgs.configTest;
const buildModule = commandLineArgs.configModule;
return [
getConfig(false, buildModule, testing),
getConfig(true, buildModule, testing),
];
}