2020-02-26 12:48:12 +03:00
"use strict" ;
2020-04-18 09:46:52 +03:00
import path from "path" ;
2019-08-25 09:39:20 +03:00
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' ;
2020-04-18 09:46:52 +03:00
function Replacer ( basePath , options = { } ) {
2019-08-25 09:39:20 +03:00
const filter = createFilter ( options . include , options . exclude ) ;
2020-04-18 09:46:52 +03:00
const suffixes = Object . keys ( options . replace ) ;
const pathUp = path . resolve ( basePath , ".." ) ;
2019-08-25 09:39:20 +03:00
return {
name : "file-replacer" ,
transform ( code , id ) {
2019-09-06 19:25:17 +03:00
/ *
console . log ( "------" ) ;
console . log ( "NAME" , id , id . match ( "node-resolve:empty.js$" ) ) ;
console . log ( code ) ;
console . log ( "------" ) ;
* /
2019-08-25 09:39:20 +03:00
if ( ! filter ( id ) ) { return null ; }
2019-09-06 19:25:17 +03:00
2019-08-25 09:39:20 +03:00
for ( let i = 0 ; i < suffixes . length ; i ++ ) {
const suffix = suffixes [ i ] ;
if ( id . match ( new RegExp ( suffix ) ) ) {
2020-04-18 09:46:52 +03:00
const newCode = options . replace [ suffix ] ;
console . log ( ` Replace: ${ id . substring ( pathUp . length + 1 ) } ( ${ code . length } => ${ newCode . length } ) ` ) ;
2019-08-25 09:39:20 +03:00
return {
2019-09-06 19:25:17 +03:00
code : newCode ,
map : { mappings : '' }
2019-08-25 09:39:20 +03:00
} ;
}
2020-04-18 09:46:52 +03:00
}
if ( id . substring ( 0 , basePath . length ) !== basePath ) {
console . log ( ` Keep: ${ id . substring ( pathUp . length + 1 ) } ` ) ;
2019-08-25 09:39:20 +03:00
}
2020-04-18 09:46:52 +03:00
2019-08-25 09:39:20 +03:00
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 } ) ;
} ) ( ) ;
2020-04-18 09:46:52 +03:00
function getConfig ( minify , buildModule , testing ) {
2019-08-25 23:20:34 +03:00
let input = "packages/ethers/lib/index.js"
2019-08-25 09:39:20 +03:00
let output = [ "umd" ] ;
let format = "umd" ;
let mainFields = [ "browser" , "main" ] ;
if ( buildModule ) {
2019-08-25 23:20:34 +03:00
input = "packages/ethers/lib.esm/index.js" ;
2019-08-25 09:39:20 +03:00
output = [ "esm" ] ;
format = "esm" ;
mainFields = [ "browser" , "module" , "main" ] ;
}
2020-04-18 09:46:52 +03:00
const replacer = Replacer ( path . resolve ( "packages" ) , {
2019-08-25 09:39:20 +03:00
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" ] ,
2019-11-23 15:38:13 +03:00
"elliptic" : [ "ec" ] ,
2020-03-12 20:53:34 +03:00
"scrypt-js" : [ "scrypt" , "syncScrypt" ] ,
2019-09-06 19:25:17 +03:00
} ,
} ) ,
2019-08-25 09:39:20 +03:00
] ;
if ( minify ) {
output . push ( "min" ) ;
plugins . push ( terser ( ) ) ;
}
2020-04-18 09:46:52 +03:00
const outputFile = [
"packages" ,
( testing ? "tests" : "ethers" ) ,
( "/dist/ethers." + output . join ( "." ) + ".js" )
] . join ( "/" ) ;
2019-08-25 09:39:20 +03:00
return {
input : input ,
output : {
file : outputFile ,
format : format ,
2019-11-23 15:38:13 +03:00
name : "ethers" ,
exports : "named"
2019-08-25 09:39:20 +03:00
} ,
2019-11-23 15:38:13 +03:00
context : "window" ,
2019-08-25 09:39:20 +03:00
treeshake : false ,
plugins : plugins
} ;
}
2020-04-18 09:46:52 +03:00
export default commandLineArgs => {
const testing = commandLineArgs . configTest ;
if ( commandLineArgs . configAll ) {
return [
getConfig ( false , false , testing ) ,
getConfig ( false , true , testing ) ,
getConfig ( true , false , testing ) ,
getConfig ( true , true , testing )
] ;
}
return getConfig ( commandLineArgs . configMinify , commandLineArgs . configModule , testing ) ;
}