From 6fa863f2cca4427dbddd8f8f77e18ad63a65d974 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Wed, 16 Nov 2016 16:50:12 +0100 Subject: [PATCH 1/6] Make parity.js usable by Node and Browser #3471 --- js/package.json | 1 + js/src/parity.js | 34 +++++++++++++++++++++++++--------- js/webpack.libraries.js | 5 ++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index 200de6ee6..77d6e0351 100644 --- a/js/package.json +++ b/js/package.json @@ -138,6 +138,7 @@ "mobx-react": "^3.5.8", "mobx-react-devtools": "^4.2.9", "moment": "^2.14.1", + "node-fetch": "^1.6.3", "qs": "^6.3.0", "react": "^15.2.1", "react-ace": "^4.0.0", diff --git a/js/src/parity.js b/js/src/parity.js index 4e6184c6a..57afdb734 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -14,19 +14,35 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import 'babel-polyfill'; -import 'whatwg-fetch'; - +import 'babel-polyfill/dist/polyfill.js'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); -import Api from './api'; +try { + if (typeof self.window !== 'undefined') { + self.window.fetch = require('isomorphic-fetch'); + } +} catch (e) {} +try { + if (typeof global !== 'undefined') { + global.fetch = require('node-fetch'); + } +} catch (e) {} + +import Api from './api'; import './dev.parity.html'; -const api = new Api(new Api.Transport.Http('/rpc/')); +// commonjs +module.exports = { Api }; +// es6 default export compatibility +module.exports.default = module.exports; -window.parity = { - Api, - api -}; +if (typeof self !== 'undefined' && typeof self.window !== 'undefined') { + const api = new Api(new Api.Transport.Http('/rpc/')); + + self.window.parity = { + Api, + api + }; +} diff --git a/js/webpack.libraries.js b/js/webpack.libraries.js index bf54a933f..8e166fc54 100644 --- a/js/webpack.libraries.js +++ b/js/webpack.libraries.js @@ -26,6 +26,7 @@ const DEST = process.env.BUILD_DEST || '.build'; module.exports = { context: path.join(__dirname, './src'), + target: 'node', entry: { // library 'inject': ['./web3.js'], @@ -34,7 +35,9 @@ module.exports = { }, output: { path: path.join(__dirname, DEST), - filename: '[name].js' + filename: '[name].js', + library: '[name].js', + libraryTarget: 'umd' }, module: { loaders: [ From 3ad7e873e1bb22fcbcdd6643d5f91ff0f8e2d7b0 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Wed, 16 Nov 2016 19:16:55 +0100 Subject: [PATCH 2/6] Better use of Webpack #3471 --- js/package.json | 1 - js/parity.package.json | 3 ++- js/src/parity.js | 21 ++++++++++----------- js/webpack.libraries.js | 7 +++++++ 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/js/package.json b/js/package.json index 88063fee7..59b75c591 100644 --- a/js/package.json +++ b/js/package.json @@ -138,7 +138,6 @@ "mobx-react": "^3.5.8", "mobx-react-devtools": "^4.2.9", "moment": "^2.14.1", - "node-fetch": "^1.6.3", "qs": "^6.3.0", "react": "^15.2.1", "react-ace": "^4.0.0", diff --git a/js/parity.package.json b/js/parity.package.json index 7d18cc5ed..0974e072f 100644 --- a/js/parity.package.json +++ b/js/parity.package.json @@ -27,6 +27,7 @@ }, "dependencies": { "bignumber.js": "^2.3.0", - "js-sha3": "^0.5.2" + "js-sha3": "^0.5.2", + "node-fetch": "^1.6.3" } } diff --git a/js/src/parity.js b/js/src/parity.js index 57afdb734..23376d76e 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -18,17 +18,16 @@ import 'babel-polyfill/dist/polyfill.js'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); -try { - if (typeof self.window !== 'undefined') { - self.window.fetch = require('isomorphic-fetch'); - } -} catch (e) {} +const isNode = typeof global !== 'undefined' && typeof global !== 'undefined'; +const isBrowser = typeof self !== 'undefined' && typeof self.window !== 'undefined'; -try { - if (typeof global !== 'undefined') { - global.fetch = require('node-fetch'); - } -} catch (e) {} +if (isBrowser) { + require('whatwg-fetch'); +} + +if (isNode) { + global.fetch = require('node-fetch'); +} import Api from './api'; import './dev.parity.html'; @@ -38,7 +37,7 @@ module.exports = { Api }; // es6 default export compatibility module.exports.default = module.exports; -if (typeof self !== 'undefined' && typeof self.window !== 'undefined') { +if (isBrowser) { const api = new Api(new Api.Transport.Http('/rpc/')); self.window.parity = { diff --git a/js/webpack.libraries.js b/js/webpack.libraries.js index 8e166fc54..07e40957e 100644 --- a/js/webpack.libraries.js +++ b/js/webpack.libraries.js @@ -39,7 +39,14 @@ module.exports = { library: '[name].js', libraryTarget: 'umd' }, + externals: { + 'node-fetch': 'node-fetch', + 'vertx': 'vertx' + }, module: { + noParse: [ + /babel-polyfill/ + ], loaders: [ { test: /\.js$/, From 6fd17540f3ad3272e225cc0565ef35cead149677 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 17 Nov 2016 15:54:13 +0100 Subject: [PATCH 3/6] Use the right webpack file // Export to window.Parity #3471 --- js/src/library.js | 20 ++++++++++++++++---- js/src/parity.js | 33 +++++++++------------------------ js/webpack.npm.js | 12 +++++++++++- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/js/src/library.js b/js/src/library.js index fbbab2286..2b526c28e 100644 --- a/js/src/library.js +++ b/js/src/library.js @@ -14,10 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import 'babel-polyfill/dist/polyfill.js'; +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); + +const isNode = typeof global !== 'undefined' && typeof global !== 'undefined'; +const isBrowser = typeof self !== 'undefined' && typeof self.window !== 'undefined'; + +if (isBrowser) { + require('whatwg-fetch'); +} + +if (isNode) { + global.fetch = require('node-fetch'); +} + import Abi from './abi'; import Api from './api'; -export { - Abi, - Api -}; +module.exports = { Api, Abi }; diff --git a/js/src/parity.js b/js/src/parity.js index 23376d76e..4e6184c6a 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -14,34 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import 'babel-polyfill/dist/polyfill.js'; +import 'babel-polyfill'; +import 'whatwg-fetch'; + import es6Promise from 'es6-promise'; es6Promise.polyfill(); -const isNode = typeof global !== 'undefined' && typeof global !== 'undefined'; -const isBrowser = typeof self !== 'undefined' && typeof self.window !== 'undefined'; - -if (isBrowser) { - require('whatwg-fetch'); -} - -if (isNode) { - global.fetch = require('node-fetch'); -} - import Api from './api'; + import './dev.parity.html'; -// commonjs -module.exports = { Api }; -// es6 default export compatibility -module.exports.default = module.exports; +const api = new Api(new Api.Transport.Http('/rpc/')); -if (isBrowser) { - const api = new Api(new Api.Transport.Http('/rpc/')); - - self.window.parity = { - Api, - api - }; -} +window.parity = { + Api, + api +}; diff --git a/js/webpack.npm.js b/js/webpack.npm.js index 23e2b7939..80b6dd540 100644 --- a/js/webpack.npm.js +++ b/js/webpack.npm.js @@ -24,13 +24,23 @@ const isProd = ENV === 'production'; module.exports = { context: path.join(__dirname, './src'), + target: 'node', entry: 'library.js', output: { path: path.join(__dirname, '.npmjs'), filename: 'library.js', - libraryTarget: 'commonjs' + library: 'Parity', + libraryTarget: 'umd', + umdNamedDefine: true + }, + externals: { + 'node-fetch': 'node-fetch', + 'vertx': 'vertx' }, module: { + noParse: [ + /babel-polyfill/ + ], loaders: [ { test: /(\.jsx|\.js)$/, From 73b4b4d241902fe602d09e1f5101dbfa9bb3ca93 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 17 Nov 2016 16:39:36 +0100 Subject: [PATCH 4/6] Added library test (node only) #3471 --- js/package.json | 1 + js/test/npmLibrary.js | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 js/test/npmLibrary.js diff --git a/js/package.json b/js/package.json index 59b75c591..dca0e0e6d 100644 --- a/js/package.json +++ b/js/package.json @@ -43,6 +43,7 @@ "test": "mocha 'src/**/*.spec.js'", "test:coverage": "istanbul cover _mocha -- 'src/**/*.spec.js'", "test:e2e": "mocha 'src/**/*.e2e.js'", + "test:npm": "node test/npmLibrary", "prepush": "npm run lint:cached" }, "devDependencies": { diff --git a/js/test/npmLibrary.js b/js/test/npmLibrary.js new file mode 100644 index 000000000..63d8f9515 --- /dev/null +++ b/js/test/npmLibrary.js @@ -0,0 +1,45 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +try { + var Api = require('../.npmjs/library.js').Api; + var Abi = require('../.npmjs/library.js').Abi; + + if (typeof Api !== 'function') { + throw new Error('No Api'); + } + + if (typeof Abi !== 'function') { + throw new Error('No Abi'); + } + + var transport = new Api.Transport.Http('http://localhost:8545'); + var api = new Api(transport); + + api.eth + .blockNumber() + .then((block) => { + console.log('library working fine', '(block #' + block.toFormat() + ')'); + process.exit(0); + }) + .catch(() => { + console.log('library working fine (disconnected)'); + process.exit(0); + }); +} catch (e) { + console.error('An error occured:', e.toString().split('\n')[0]); + process.exit(1); +} From b633631f424b9d57ecd022c4e08d42c59ff26708 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 17 Nov 2016 16:43:41 +0100 Subject: [PATCH 5/6] Npm install in npm test --- js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/package.json b/js/package.json index dca0e0e6d..e52a4650a 100644 --- a/js/package.json +++ b/js/package.json @@ -43,7 +43,7 @@ "test": "mocha 'src/**/*.spec.js'", "test:coverage": "istanbul cover _mocha -- 'src/**/*.spec.js'", "test:e2e": "mocha 'src/**/*.e2e.js'", - "test:npm": "node test/npmLibrary", + "test:npm": "(cd .npmjs && npm i) && node test/npmLibrary", "prepush": "npm run lint:cached" }, "devDependencies": { From 4f50a63dbc21c07dbfe7ed762f2fa8b2f3e3936c Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 17 Nov 2016 16:44:19 +0100 Subject: [PATCH 6/6] Remove node_modules dir after tests --- js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/package.json b/js/package.json index e52a4650a..f0be8bd8b 100644 --- a/js/package.json +++ b/js/package.json @@ -43,7 +43,7 @@ "test": "mocha 'src/**/*.spec.js'", "test:coverage": "istanbul cover _mocha -- 'src/**/*.spec.js'", "test:e2e": "mocha 'src/**/*.e2e.js'", - "test:npm": "(cd .npmjs && npm i) && node test/npmLibrary", + "test:npm": "(cd .npmjs && npm i) && node test/npmLibrary && (rm -rf .npmjs/node_modules)", "prepush": "npm run lint:cached" }, "devDependencies": {