feat: add support for browser es modules
This commit is contained in:
		
				
					committed by
					
						
						Justin Starry
					
				
			
			
				
	
			
			
			
						parent
						
							bbae23358c
						
					
				
				
					commit
					08ff2d12f2
				
			@@ -1,27 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "presets": [
 | 
					 | 
				
			||||||
    [ "@babel/preset-env", { "modules": false } ],
 | 
					 | 
				
			||||||
    "@babel/preset-flow",
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  "plugins": [
 | 
					 | 
				
			||||||
    ["module-resolver", {
 | 
					 | 
				
			||||||
      "root": ["./src"],
 | 
					 | 
				
			||||||
    }],
 | 
					 | 
				
			||||||
    "@babel/transform-runtime",
 | 
					 | 
				
			||||||
    "@babel/plugin-proposal-class-properties",
 | 
					 | 
				
			||||||
    "@babel/plugin-proposal-function-bind",
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  "env": {
 | 
					 | 
				
			||||||
    "test": {
 | 
					 | 
				
			||||||
      "plugins": [
 | 
					 | 
				
			||||||
        "@babel/transform-runtime",
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      "presets": [
 | 
					 | 
				
			||||||
        "@babel/preset-env",
 | 
					 | 
				
			||||||
        "@babel/preset-flow",
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -9,7 +9,7 @@ module.exports = {
 | 
				
			|||||||
    'plugin:import/errors',
 | 
					    'plugin:import/errors',
 | 
				
			||||||
    'plugin:import/warnings',
 | 
					    'plugin:import/warnings',
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  parser: 'babel-eslint',
 | 
					  parser: 'babel-eslint', // upgrade to @babel/eslint-parser blocked on eslint-plugin-flowtype
 | 
				
			||||||
  parserOptions: {
 | 
					  parserOptions: {
 | 
				
			||||||
    sourceType: 'module',
 | 
					    sourceType: 'module',
 | 
				
			||||||
    ecmaVersion: 8,
 | 
					    ecmaVersion: 8,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								web3.js/babel.config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								web3.js/babel.config.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "presets": [
 | 
				
			||||||
 | 
					    ["@babel/preset-env", {"targets": "> 0.25%, not dead"}],
 | 
				
			||||||
 | 
					    ["@babel/preset-flow"]
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "plugins": [
 | 
				
			||||||
 | 
					    "@babel/plugin-proposal-class-properties"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "env": {
 | 
				
			||||||
 | 
					    "test": {
 | 
				
			||||||
 | 
					      "plugins": ["@babel/plugin-transform-runtime"],
 | 
				
			||||||
 | 
					      "presets": ["@babel/preset-flow"]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
declare module 'keccak' {
 | 
					declare module 'js-sha3' {
 | 
				
			||||||
  // TODO: Fill in types
 | 
					  // TODO: Fill in types
 | 
				
			||||||
  declare module.exports: any;
 | 
					  declare module.exports: any;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								web3.js/module.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								web3.js/module.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,5 @@
 | 
				
			|||||||
declare module '@solana/web3.js' {
 | 
					declare module '@solana/web3.js' {
 | 
				
			||||||
 | 
					  import {Buffer} from 'buffer';
 | 
				
			||||||
  import * as BufferLayout from 'buffer-layout';
 | 
					  import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // === src/publickey.js ===
 | 
					  // === src/publickey.js ===
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12287
									
								
								web3.js/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12287
									
								
								web3.js/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -19,6 +19,7 @@
 | 
				
			|||||||
  "publishConfig": {
 | 
					  "publishConfig": {
 | 
				
			||||||
    "access": "public"
 | 
					    "access": "public"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  "browser": "lib/index.browser.esm.js",
 | 
				
			||||||
  "main": "lib/index.cjs.js",
 | 
					  "main": "lib/index.cjs.js",
 | 
				
			||||||
  "module": "lib/index.esm.js",
 | 
					  "module": "lib/index.esm.js",
 | 
				
			||||||
  "types": "lib/index.d.ts",
 | 
					  "types": "lib/index.d.ts",
 | 
				
			||||||
@@ -74,39 +75,37 @@
 | 
				
			|||||||
    "testEnvironment": "./jest-environment"
 | 
					    "testEnvironment": "./jest-environment"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@babel/runtime": "^7.3.1",
 | 
					    "@babel/runtime": "^7.12.5",
 | 
				
			||||||
    "bn.js": "^5.0.0",
 | 
					    "bn.js": "^5.0.0",
 | 
				
			||||||
    "bs58": "^4.0.1",
 | 
					    "bs58": "^4.0.1",
 | 
				
			||||||
    "buffer": "^6.0.1",
 | 
					    "buffer": "6.0.1",
 | 
				
			||||||
    "buffer-layout": "^1.2.0",
 | 
					    "buffer-layout": "^1.2.0",
 | 
				
			||||||
    "crypto-hash": "^1.2.2",
 | 
					    "crypto-hash": "^1.2.2",
 | 
				
			||||||
    "esdoc-inject-style-plugin": "^1.0.0",
 | 
					    "jayson": "^3.4.4",
 | 
				
			||||||
    "jayson": "^3.0.1",
 | 
					    "js-sha3": "^0.8.0",
 | 
				
			||||||
    "keccak": "^3.0.1",
 | 
					    "node-fetch": "^2.6.1",
 | 
				
			||||||
    "mz": "^2.7.0",
 | 
					 | 
				
			||||||
    "node-fetch": "^2.2.0",
 | 
					 | 
				
			||||||
    "npm-run-all": "^4.1.5",
 | 
					 | 
				
			||||||
    "rpc-websockets": "^7.4.2",
 | 
					    "rpc-websockets": "^7.4.2",
 | 
				
			||||||
    "secp256k1": "^4.0.2",
 | 
					    "secp256k1": "^4.0.2",
 | 
				
			||||||
    "superstruct": "^0.8.3",
 | 
					    "superstruct": "^0.8.3",
 | 
				
			||||||
    "tweetnacl": "^1.0.0",
 | 
					    "tweetnacl": "^1.0.0"
 | 
				
			||||||
    "ws": "^7.0.0"
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@babel/core": "^7.3.3",
 | 
					    "@babel/plugin-proposal-class-properties": "^7.12.1",
 | 
				
			||||||
    "@babel/plugin-proposal-class-properties": "^7.3.3",
 | 
					    "@babel/plugin-transform-runtime": "^7.12.10",
 | 
				
			||||||
    "@babel/plugin-proposal-function-bind": "^7.2.0",
 | 
					    "@babel/preset-env": "^7.12.11",
 | 
				
			||||||
    "@babel/plugin-transform-runtime": "^7.2.0",
 | 
					    "@babel/preset-flow": "^7.12.1",
 | 
				
			||||||
    "@babel/preset-env": "^7.3.1",
 | 
					 | 
				
			||||||
    "@babel/preset-flow": "^7.0.0",
 | 
					 | 
				
			||||||
    "@commitlint/config-conventional": "^11.0.0",
 | 
					    "@commitlint/config-conventional": "^11.0.0",
 | 
				
			||||||
    "@commitlint/travis-cli": "^11.0.0",
 | 
					    "@commitlint/travis-cli": "^11.0.0",
 | 
				
			||||||
 | 
					    "@rollup/plugin-babel": "^5.2.3",
 | 
				
			||||||
 | 
					    "@rollup/plugin-commonjs": "^17.1.0",
 | 
				
			||||||
 | 
					    "@rollup/plugin-json": "^4.1.0",
 | 
				
			||||||
 | 
					    "@rollup/plugin-node-resolve": "^11.1.1",
 | 
				
			||||||
 | 
					    "@rollup/plugin-replace": "^2.3.4",
 | 
				
			||||||
    "@solana/spl-token": "^0.0.13",
 | 
					    "@solana/spl-token": "^0.0.13",
 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^4.0.0",
 | 
					    "@typescript-eslint/eslint-plugin": "^4.14.2",
 | 
				
			||||||
    "@typescript-eslint/parser": "^3.10.1",
 | 
					    "@typescript-eslint/parser": "^4.14.2",
 | 
				
			||||||
    "acorn": "^8.0.1",
 | 
					    "acorn": "^8.0.1",
 | 
				
			||||||
    "babel-eslint": "10.1.0",
 | 
					    "babel-eslint": "^11.0.0-beta.2",
 | 
				
			||||||
    "babel-plugin-module-resolver": "4.0.0",
 | 
					 | 
				
			||||||
    "codecov": "^3.0.4",
 | 
					    "codecov": "^3.0.4",
 | 
				
			||||||
    "cross-env": "7.0.3",
 | 
					    "cross-env": "7.0.3",
 | 
				
			||||||
    "elfy": "^1.0.0",
 | 
					    "elfy": "^1.0.0",
 | 
				
			||||||
@@ -115,33 +114,35 @@
 | 
				
			|||||||
    "esdoc-ecmascript-proposal-plugin": "^1.0.0",
 | 
					    "esdoc-ecmascript-proposal-plugin": "^1.0.0",
 | 
				
			||||||
    "esdoc-flow-type-plugin": "^1.1.0",
 | 
					    "esdoc-flow-type-plugin": "^1.1.0",
 | 
				
			||||||
    "esdoc-importpath-plugin": "^1.0.2",
 | 
					    "esdoc-importpath-plugin": "^1.0.2",
 | 
				
			||||||
 | 
					    "esdoc-inject-style-plugin": "^1.0.0",
 | 
				
			||||||
    "esdoc-standard-plugin": "^1.0.0",
 | 
					    "esdoc-standard-plugin": "^1.0.0",
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
    "eslint": "7.19.0",
 | 
					    "eslint": "7.19.0",
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					    "eslint": "^7.19.0",
 | 
				
			||||||
 | 
					>>>>>>> 37215dbc2... feat: add support for browser es modules
 | 
				
			||||||
    "eslint-config-prettier": "^7.0.0",
 | 
					    "eslint-config-prettier": "^7.0.0",
 | 
				
			||||||
    "eslint-plugin-flowtype": "^5.2.0",
 | 
					    "eslint-plugin-flowtype": "^5.2.0",
 | 
				
			||||||
    "eslint-plugin-import": "2.22.1",
 | 
					    "eslint-plugin-import": "2.22.1",
 | 
				
			||||||
    "eslint-plugin-jest": "22.19.0",
 | 
					    "eslint-plugin-jest": "22.19.0",
 | 
				
			||||||
    "eslint-plugin-prettier": "^3.0.0",
 | 
					    "eslint-plugin-prettier": "^3.0.0",
 | 
				
			||||||
    "flow-bin": "0.130.0",
 | 
					    "flow-bin": "0.130.0",
 | 
				
			||||||
 | 
					    "flow-remove-types": "^2.143.1",
 | 
				
			||||||
    "flow-typed": "3.2.1",
 | 
					    "flow-typed": "3.2.1",
 | 
				
			||||||
    "fs-file-tree": "1.1.1",
 | 
					    "fs-file-tree": "1.1.1",
 | 
				
			||||||
    "jest": "26.6.3",
 | 
					    "jest": "26.6.3",
 | 
				
			||||||
    "marked": "^1.1.0",
 | 
					    "marked": "^1.1.0",
 | 
				
			||||||
 | 
					    "mz": "^2.7.0",
 | 
				
			||||||
 | 
					    "npm-run-all": "^4.1.5",
 | 
				
			||||||
    "prettier": "^2.0.0",
 | 
					    "prettier": "^2.0.0",
 | 
				
			||||||
    "rimraf": "3.0.2",
 | 
					    "rimraf": "3.0.2",
 | 
				
			||||||
    "rollup": "2.38.5",
 | 
					    "rollup": "2.38.5",
 | 
				
			||||||
    "rollup-plugin-babel": "^4.3.2",
 | 
					 | 
				
			||||||
    "rollup-plugin-commonjs": "^10.0.0",
 | 
					 | 
				
			||||||
    "rollup-plugin-copy": "^3.3.0",
 | 
					    "rollup-plugin-copy": "^3.3.0",
 | 
				
			||||||
    "rollup-plugin-json": "^4.0.0",
 | 
					    "rollup-plugin-node-polyfills": "^0.2.1",
 | 
				
			||||||
    "rollup-plugin-node-builtins": "^2.1.2",
 | 
					    "rollup-plugin-terser": "^7.0.2",
 | 
				
			||||||
    "rollup-plugin-node-globals": "^1.2.1",
 | 
					 | 
				
			||||||
    "rollup-plugin-node-resolve": "5.2.0",
 | 
					 | 
				
			||||||
    "rollup-plugin-replace": "2.2.0",
 | 
					 | 
				
			||||||
    "rollup-plugin-terser": "^7.0.0",
 | 
					 | 
				
			||||||
    "semantic-release": "^17.0.2",
 | 
					    "semantic-release": "^17.0.2",
 | 
				
			||||||
    "start-server-and-test": "^1.11.6",
 | 
					    "start-server-and-test": "^1.11.6",
 | 
				
			||||||
    "typescript": "^4.0.2",
 | 
					    "typescript": "^4.1.3",
 | 
				
			||||||
    "watch": "^1.0.2"
 | 
					    "watch": "^1.0.2"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,36 +1,80 @@
 | 
				
			|||||||
import babel from 'rollup-plugin-babel';
 | 
					import babel from '@rollup/plugin-babel';
 | 
				
			||||||
import builtins from 'rollup-plugin-node-builtins';
 | 
					import commonjs from '@rollup/plugin-commonjs';
 | 
				
			||||||
import commonjs from 'rollup-plugin-commonjs';
 | 
					 | 
				
			||||||
import copy from 'rollup-plugin-copy';
 | 
					import copy from 'rollup-plugin-copy';
 | 
				
			||||||
import globals from 'rollup-plugin-node-globals';
 | 
					import flowRemoveTypes from 'flow-remove-types';
 | 
				
			||||||
import json from 'rollup-plugin-json';
 | 
					import json from '@rollup/plugin-json';
 | 
				
			||||||
import nodeResolve from 'rollup-plugin-node-resolve';
 | 
					import nodeResolve from '@rollup/plugin-node-resolve';
 | 
				
			||||||
import replace from 'rollup-plugin-replace';
 | 
					import nodePolyfills from 'rollup-plugin-node-polyfills';
 | 
				
			||||||
 | 
					import replace from '@rollup/plugin-replace';
 | 
				
			||||||
import {terser} from 'rollup-plugin-terser';
 | 
					import {terser} from 'rollup-plugin-terser';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const env = process.env.NODE_ENV;
 | 
					const env = process.env.NODE_ENV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function generateConfig(configType) {
 | 
					function generateConfig(configType, format) {
 | 
				
			||||||
 | 
					  const browser = configType === 'browser';
 | 
				
			||||||
 | 
					  const bundle = format === 'iife';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const config = {
 | 
					  const config = {
 | 
				
			||||||
    input: 'src/index.js',
 | 
					    input: 'src/index.js',
 | 
				
			||||||
    plugins: [
 | 
					    plugins: [
 | 
				
			||||||
      json(),
 | 
					      flow(),
 | 
				
			||||||
 | 
					      commonjs(),
 | 
				
			||||||
 | 
					      nodeResolve({browser, preferBuiltins: !browser, dedupe: ['bn.js']}),
 | 
				
			||||||
      babel({
 | 
					      babel({
 | 
				
			||||||
        exclude: '**/node_modules/**',
 | 
					        exclude: '**/node_modules/**',
 | 
				
			||||||
        runtimeHelpers: true,
 | 
					        babelHelpers: bundle ? 'bundled' : 'runtime',
 | 
				
			||||||
 | 
					        plugins: bundle ? [] : ['@babel/plugin-transform-runtime'],
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
      replace({
 | 
					      replace({
 | 
				
			||||||
        'process.env.NODE_ENV': JSON.stringify(env),
 | 
					        'process.env.NODE_ENV': JSON.stringify(env),
 | 
				
			||||||
 | 
					        'process.env.BROWSER': JSON.stringify(browser),
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
      commonjs(),
 | 
					 | 
				
			||||||
      copy({
 | 
					      copy({
 | 
				
			||||||
        targets: [{src: 'module.d.ts', dest: 'lib', rename: 'index.d.ts'}],
 | 
					        targets: [{src: 'module.d.ts', dest: 'lib', rename: 'index.d.ts'}],
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					    onwarn: function (warning, rollupWarn) {
 | 
				
			||||||
 | 
					      if (warning.code !== 'CIRCULAR_DEPENDENCY') {
 | 
				
			||||||
 | 
					        rollupWarn(warning);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    treeshake: {
 | 
				
			||||||
 | 
					      moduleSideEffects: false,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (configType) {
 | 
					  switch (configType) {
 | 
				
			||||||
    case 'browser':
 | 
					    case 'browser':
 | 
				
			||||||
 | 
					      switch (format) {
 | 
				
			||||||
 | 
					        case 'esm': {
 | 
				
			||||||
 | 
					          config.output = [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              file: 'lib/index.browser.esm.js',
 | 
				
			||||||
 | 
					              format: 'es',
 | 
				
			||||||
 | 
					              sourcemap: true,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Prevent dependencies from being bundled
 | 
				
			||||||
 | 
					          config.external = [
 | 
				
			||||||
 | 
					            /@babel\/runtime/,
 | 
				
			||||||
 | 
					            'bn.js',
 | 
				
			||||||
 | 
					            'bs58',
 | 
				
			||||||
 | 
					            'buffer',
 | 
				
			||||||
 | 
					            'buffer-layout',
 | 
				
			||||||
 | 
					            'crypto-hash',
 | 
				
			||||||
 | 
					            'jayson/lib/client/browser',
 | 
				
			||||||
 | 
					            'js-sha3',
 | 
				
			||||||
 | 
					            'node-fetch',
 | 
				
			||||||
 | 
					            'rpc-websockets',
 | 
				
			||||||
 | 
					            'secp256k1',
 | 
				
			||||||
 | 
					            'superstruct',
 | 
				
			||||||
 | 
					            'tweetnacl',
 | 
				
			||||||
 | 
					          ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case 'iife': {
 | 
				
			||||||
          config.output = [
 | 
					          config.output = [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
              file: 'lib/index.iife.js',
 | 
					              file: 'lib/index.iife.js',
 | 
				
			||||||
@@ -38,23 +82,25 @@ function generateConfig(configType) {
 | 
				
			|||||||
              name: 'solanaWeb3',
 | 
					              name: 'solanaWeb3',
 | 
				
			||||||
              sourcemap: true,
 | 
					              sourcemap: true,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              file: 'lib/index.iife.min.js',
 | 
				
			||||||
 | 
					              format: 'iife',
 | 
				
			||||||
 | 
					              name: 'solanaWeb3',
 | 
				
			||||||
 | 
					              sourcemap: true,
 | 
				
			||||||
 | 
					              plugins: [terser({mangle: false, compress: false})],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
          ];
 | 
					          ];
 | 
				
			||||||
      config.plugins.push(builtins());
 | 
					 | 
				
			||||||
      config.plugins.push(globals());
 | 
					 | 
				
			||||||
      config.plugins.push(
 | 
					 | 
				
			||||||
        nodeResolve({
 | 
					 | 
				
			||||||
          browser: true,
 | 
					 | 
				
			||||||
        }),
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (env === 'production') {
 | 
					          break;
 | 
				
			||||||
        config.plugins.push(
 | 
					 | 
				
			||||||
          terser({
 | 
					 | 
				
			||||||
            mangle: false,
 | 
					 | 
				
			||||||
            compress: false,
 | 
					 | 
				
			||||||
          }),
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          throw new Error(`Unknown format: ${format}`);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // TODO: Find a workaround to avoid resolving the following JSON file:
 | 
				
			||||||
 | 
					      // `node_modules/secp256k1/node_modules/elliptic/package.json`
 | 
				
			||||||
 | 
					      config.plugins.push(json());
 | 
				
			||||||
 | 
					      config.plugins.push(nodePolyfills());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case 'node':
 | 
					    case 'node':
 | 
				
			||||||
@@ -71,43 +117,20 @@ function generateConfig(configType) {
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Quash 'Unresolved dependencies' complaints for modules listed in the
 | 
					      // Prevent dependencies from being bundled
 | 
				
			||||||
      // package.json "dependencies" section.  Unfortunately this list is manually
 | 
					 | 
				
			||||||
      // maintained.
 | 
					 | 
				
			||||||
      config.external = [
 | 
					      config.external = [
 | 
				
			||||||
        'assert',
 | 
					        /@babel\/runtime/,
 | 
				
			||||||
        '@babel/runtime/core-js/get-iterator',
 | 
					 | 
				
			||||||
        '@babel/runtime/core-js/json/stringify',
 | 
					 | 
				
			||||||
        '@babel/runtime/core-js/object/assign',
 | 
					 | 
				
			||||||
        '@babel/runtime/core-js/object/get-prototype-of',
 | 
					 | 
				
			||||||
        '@babel/runtime/core-js/object/keys',
 | 
					 | 
				
			||||||
        '@babel/runtime/core-js/promise',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/asyncToGenerator',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/classCallCheck',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/createClass',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/defineProperty',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/get',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/getPrototypeOf',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/inherits',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/possibleConstructorReturn',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/slicedToArray',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/toConsumableArray',
 | 
					 | 
				
			||||||
        '@babel/runtime/helpers/typeof',
 | 
					 | 
				
			||||||
        '@babel/runtime/regenerator',
 | 
					 | 
				
			||||||
        'bn.js',
 | 
					        'bn.js',
 | 
				
			||||||
        'bs58',
 | 
					        'bs58',
 | 
				
			||||||
        'buffer-layout',
 | 
					        'buffer-layout',
 | 
				
			||||||
        'crypto-hash',
 | 
					        'crypto-hash',
 | 
				
			||||||
        'http',
 | 
					 | 
				
			||||||
        'https',
 | 
					 | 
				
			||||||
        'jayson/lib/client/browser',
 | 
					        'jayson/lib/client/browser',
 | 
				
			||||||
 | 
					        'js-sha3',
 | 
				
			||||||
        'node-fetch',
 | 
					        'node-fetch',
 | 
				
			||||||
        'rpc-websockets',
 | 
					        'rpc-websockets',
 | 
				
			||||||
 | 
					        'secp256k1',
 | 
				
			||||||
        'superstruct',
 | 
					        'superstruct',
 | 
				
			||||||
        'tweetnacl',
 | 
					        'tweetnacl',
 | 
				
			||||||
        'url',
 | 
					 | 
				
			||||||
        'secp256k1',
 | 
					 | 
				
			||||||
        'keccak',
 | 
					 | 
				
			||||||
      ];
 | 
					      ];
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
@@ -117,4 +140,20 @@ function generateConfig(configType) {
 | 
				
			|||||||
  return config;
 | 
					  return config;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default [generateConfig('node'), generateConfig('browser')];
 | 
					export default [
 | 
				
			||||||
 | 
					  generateConfig('node'),
 | 
				
			||||||
 | 
					  generateConfig('browser', 'esm'),
 | 
				
			||||||
 | 
					  generateConfig('browser', 'iife'),
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Using this instead of rollup-plugin-flow due to
 | 
				
			||||||
 | 
					// https://github.com/leebyron/rollup-plugin-flow/issues/5
 | 
				
			||||||
 | 
					function flow() {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    name: 'flow-remove-types',
 | 
				
			||||||
 | 
					    transform: code => ({
 | 
				
			||||||
 | 
					      code: flowRemoveTypes(code).toString(),
 | 
				
			||||||
 | 
					      map: null,
 | 
				
			||||||
 | 
					    }),
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,9 +26,6 @@ export class AgentManager {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  requestStart(): http.Agent | https.Agent {
 | 
					  requestStart(): http.Agent | https.Agent {
 | 
				
			||||||
    // $FlowExpectedError - Don't manage agents in the browser
 | 
					 | 
				
			||||||
    if (process.browser) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this._activeRequests++;
 | 
					    this._activeRequests++;
 | 
				
			||||||
    clearTimeout(this._destroyTimeout);
 | 
					    clearTimeout(this._destroyTimeout);
 | 
				
			||||||
    this._destroyTimeout = null;
 | 
					    this._destroyTimeout = null;
 | 
				
			||||||
@@ -36,9 +33,6 @@ export class AgentManager {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  requestEnd() {
 | 
					  requestEnd() {
 | 
				
			||||||
    // $FlowExpectedError - Don't manage agents in the browser
 | 
					 | 
				
			||||||
    if (process.browser) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this._activeRequests--;
 | 
					    this._activeRequests--;
 | 
				
			||||||
    if (this._activeRequests === 0 && this._destroyTimeout === null) {
 | 
					    if (this._activeRequests === 0 && this._destroyTimeout === null) {
 | 
				
			||||||
      this._destroyTimeout = setTimeout(() => {
 | 
					      this._destroyTimeout = setTimeout(() => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,12 +2,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import assert from 'assert';
 | 
					import assert from 'assert';
 | 
				
			||||||
import bs58 from 'bs58';
 | 
					import bs58 from 'bs58';
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import {parse as urlParse, format as urlFormat} from 'url';
 | 
					import {parse as urlParse, format as urlFormat} from 'url';
 | 
				
			||||||
import fetch from 'node-fetch';
 | 
					import fetch from 'node-fetch';
 | 
				
			||||||
import jayson from 'jayson/lib/client/browser';
 | 
					import jayson from 'jayson/lib/client/browser';
 | 
				
			||||||
import {struct} from 'superstruct';
 | 
					import {struct} from 'superstruct';
 | 
				
			||||||
import {Client as RpcWebSocketClient} from 'rpc-websockets';
 | 
					import {Client as RpcWebSocketClient} from 'rpc-websockets';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {AgentManager} from './agent-manager';
 | 
				
			||||||
import {NonceAccount} from './nonce-account';
 | 
					import {NonceAccount} from './nonce-account';
 | 
				
			||||||
import {PublicKey} from './publickey';
 | 
					import {PublicKey} from './publickey';
 | 
				
			||||||
import {MS_PER_SLOT} from './timing';
 | 
					import {MS_PER_SLOT} from './timing';
 | 
				
			||||||
@@ -21,7 +23,6 @@ import type {FeeCalculator} from './fee-calculator';
 | 
				
			|||||||
import type {Account} from './account';
 | 
					import type {Account} from './account';
 | 
				
			||||||
import type {TransactionSignature} from './transaction';
 | 
					import type {TransactionSignature} from './transaction';
 | 
				
			||||||
import type {CompiledInstruction} from './message';
 | 
					import type {CompiledInstruction} from './message';
 | 
				
			||||||
import {AgentManager} from './agent-manager';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const BLOCKHASH_CACHE_TIMEOUT_MS = 30 * 1000;
 | 
					export const BLOCKHASH_CACHE_TIMEOUT_MS = 30 * 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -578,10 +579,13 @@ type PerfSample = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createRpcRequest(url: string, useHttps: boolean): RpcRequest {
 | 
					function createRpcRequest(url: string, useHttps: boolean): RpcRequest {
 | 
				
			||||||
  const agentManager = new AgentManager(useHttps);
 | 
					  let agentManager;
 | 
				
			||||||
 | 
					  if (!process.env.BROWSER) {
 | 
				
			||||||
 | 
					    agentManager = new AgentManager(useHttps);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const server = jayson(async (request, callback) => {
 | 
					  const server = jayson(async (request, callback) => {
 | 
				
			||||||
    const agent = agentManager.requestStart();
 | 
					    const agent = agentManager ? agentManager.requestStart() : undefined;
 | 
				
			||||||
    const options = {
 | 
					    const options = {
 | 
				
			||||||
      method: 'POST',
 | 
					      method: 'POST',
 | 
				
			||||||
      body: request,
 | 
					      body: request,
 | 
				
			||||||
@@ -620,7 +624,7 @@ function createRpcRequest(url: string, useHttps: boolean): RpcRequest {
 | 
				
			|||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
      callback(err);
 | 
					      callback(err);
 | 
				
			||||||
    } finally {
 | 
					    } finally {
 | 
				
			||||||
      agentManager.requestEnd();
 | 
					      agentManager && agentManager.requestEnd();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import * as BufferLayout from 'buffer-layout';
 | 
					import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Layout from './layout';
 | 
					import * as Layout from './layout';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import * as BufferLayout from 'buffer-layout';
 | 
					import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import * as BufferLayout from 'buffer-layout';
 | 
					import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {Account} from './account';
 | 
					import {Account} from './account';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import bs58 from 'bs58';
 | 
					import bs58 from 'bs58';
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import * as BufferLayout from 'buffer-layout';
 | 
					import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {PublicKey} from './publickey';
 | 
					import {PublicKey} from './publickey';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import BN from 'bn.js';
 | 
				
			|||||||
import bs58 from 'bs58';
 | 
					import bs58 from 'bs58';
 | 
				
			||||||
import nacl from 'tweetnacl';
 | 
					import nacl from 'tweetnacl';
 | 
				
			||||||
import {sha256} from 'crypto-hash';
 | 
					import {sha256} from 'crypto-hash';
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//$FlowFixMe
 | 
					//$FlowFixMe
 | 
				
			||||||
let naclLowLevel = nacl.lowlevel;
 | 
					let naclLowLevel = nacl.lowlevel;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,10 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import * as BufferLayout from 'buffer-layout';
 | 
					import * as BufferLayout from 'buffer-layout';
 | 
				
			||||||
import secp256k1 from 'secp256k1';
 | 
					import secp256k1 from 'secp256k1';
 | 
				
			||||||
import createKeccakHash from 'keccak';
 | 
					 | 
				
			||||||
import assert from 'assert';
 | 
					import assert from 'assert';
 | 
				
			||||||
 | 
					import {keccak_256} from 'js-sha3';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import {PublicKey} from './publickey';
 | 
					import {PublicKey} from './publickey';
 | 
				
			||||||
import {TransactionInstruction} from './transaction';
 | 
					import {TransactionInstruction} from './transaction';
 | 
				
			||||||
@@ -135,9 +136,9 @@ export class Secp256k1Program {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const publicKey = publicKeyCreate(privateKey, false);
 | 
					      const publicKey = publicKeyCreate(privateKey, false);
 | 
				
			||||||
      const messageHash = createKeccakHash('keccak256')
 | 
					      const messageHash = Buffer.from(
 | 
				
			||||||
        .update(toBuffer(message))
 | 
					        keccak_256.update(toBuffer(message)).digest(),
 | 
				
			||||||
        .digest();
 | 
					      );
 | 
				
			||||||
      const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey);
 | 
					      const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return this.createInstructionWithPublicKey({
 | 
					      return this.createInstructionWithPublicKey({
 | 
				
			||||||
@@ -152,11 +153,12 @@ export class Secp256k1Program {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function constructEthPubkey(
 | 
					function constructEthPubkey(
 | 
				
			||||||
  publicKey: Buffer | Uint8Array | Array<number>,
 | 
					  publicKey: Buffer | Uint8Array | Array<number>,
 | 
				
			||||||
): Buffer {
 | 
					): Buffer {
 | 
				
			||||||
  return createKeccakHash('keccak256')
 | 
					  return Buffer.from(
 | 
				
			||||||
 | 
					    keccak_256
 | 
				
			||||||
      .update(toBuffer(publicKey.slice(1))) // throw away leading byte
 | 
					      .update(toBuffer(publicKey.slice(1))) // throw away leading byte
 | 
				
			||||||
    .digest()
 | 
					      .digest(),
 | 
				
			||||||
    .slice(-HASHED_PUBKEY_SERIALIZED_SIZE);
 | 
					  ).slice(-HASHED_PUBKEY_SERIALIZED_SIZE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
import invariant from 'assert';
 | 
					import invariant from 'assert';
 | 
				
			||||||
import nacl from 'tweetnacl';
 | 
					import nacl from 'tweetnacl';
 | 
				
			||||||
import bs58 from 'bs58';
 | 
					import bs58 from 'bs58';
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import type {CompiledInstruction} from './message';
 | 
					import type {CompiledInstruction} from './message';
 | 
				
			||||||
import {Message} from './message';
 | 
					import {Message} from './message';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {
 | 
					export const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {
 | 
				
			||||||
  if (arr instanceof Buffer) {
 | 
					  if (arr instanceof Buffer) {
 | 
				
			||||||
    return arr;
 | 
					    return arr;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Buffer} from 'buffer';
 | 
				
			||||||
import {struct} from 'superstruct';
 | 
					import {struct} from 'superstruct';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Layout from './layout';
 | 
					import * as Layout from './layout';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
// @flow
 | 
					// @flow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import createKeccakHash from 'keccak';
 | 
					import {keccak_256} from 'js-sha3';
 | 
				
			||||||
import secp256k1 from 'secp256k1';
 | 
					import secp256k1 from 'secp256k1';
 | 
				
			||||||
import {randomBytes} from 'crypto';
 | 
					import {randomBytes} from 'crypto';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,7 +35,7 @@ test('live create secp256k1 instruction with public key', async () => {
 | 
				
			|||||||
  } while (!privateKeyVerify(privateKey));
 | 
					  } while (!privateKeyVerify(privateKey));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const publicKey = publicKeyCreate(privateKey, false);
 | 
					  const publicKey = publicKeyCreate(privateKey, false);
 | 
				
			||||||
  const messageHash = createKeccakHash('keccak256').update(message).digest();
 | 
					  const messageHash = Buffer.from(keccak_256.update(message).digest());
 | 
				
			||||||
  const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey);
 | 
					  const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const instruction = Secp256k1Program.createInstructionWithPublicKey({
 | 
					  const instruction = Secp256k1Program.createInstructionWithPublicKey({
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user