From a86f8a81a27d16cb7281a9dd2d10f3a2a64900b6 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 14 Mar 2018 14:49:09 +0100 Subject: Fix linter issuesx --- packages/monorepo-scripts/src/postpublish_utils.ts | 2 +- packages/subproviders/src/globals.d.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/monorepo-scripts/src/postpublish_utils.ts b/packages/monorepo-scripts/src/postpublish_utils.ts index d90d50fba..898b00c47 100644 --- a/packages/monorepo-scripts/src/postpublish_utils.ts +++ b/packages/monorepo-scripts/src/postpublish_utils.ts @@ -40,7 +40,7 @@ export const postpublishUtils = { assets: _.get(postpublishConfig, 'assets', []), docPublishConfigs: { fileIncludes: [ - ...(tsConfigJSON as any).include, + ...tsConfigJSON.include, ..._.get(postpublishConfig, 'docPublishConfigs.extraFileIncludes', []), ], s3BucketPath: _.get(postpublishConfig, 'docPublishConfigs.s3BucketPath'), diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts index b3dcd4ed3..2c86346f5 100644 --- a/packages/subproviders/src/globals.d.ts +++ b/packages/subproviders/src/globals.d.ts @@ -144,5 +144,6 @@ declare module 'ganache-core' { networkId: number; mnemonic: string; } + // tslint:disable-next-line:completed-docs export function provider(opts: GanacheOpts): Web3.Provider; } -- cgit v1.2.3 From 642a2cf165abe527bba015b3a923d9624d1b1a3d Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 14 Mar 2018 16:36:00 +0100 Subject: Added doc json generation and uploading to Web3Wrapper package --- packages/web3-wrapper/README.md | 2 +- packages/web3-wrapper/package.json | 14 +++++++++++++- packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts | 8 ++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md index 0d5defb1e..244e20708 100644 --- a/packages/web3-wrapper/README.md +++ b/packages/web3-wrapper/README.md @@ -1,6 +1,6 @@ ## @0xproject/web3-wrapper -Wrapped version of web3 with a nicer interface that is used across 0x projects and packages +Wrapped version of web3 with a nicer interface that is used across 0x projects and packages. Visit [the docs](0xproject.com/docs/web3_wrapper). ## Installation diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index 6e569b993..ae7ba8b26 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -8,7 +8,18 @@ "build:watch": "tsc -w", "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts", "clean": "shx rm -rf lib scripts", - "lint": "tslint --project . 'src/**/*.ts'" + "lint": "tslint --project . 'src/**/*.ts'", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" + }, + "config": { + "postpublish": { + "docPublishConfigs": { + "extraFileIncludes": ["../types/src/index.ts"], + "s3BucketPath": "s3://web3-wrapper-docs-json/", + "s3StagingBucketPath": "s3://staging-web3-wrapper-docs-json/" + } + } }, "license": "Apache-2.0", "repository": { @@ -27,6 +38,7 @@ "npm-run-all": "^4.1.2", "shx": "^0.2.2", "tslint": "5.8.0", + "typedoc": "0xProject/typedoc", "typescript": "2.7.1" }, "dependencies": { diff --git a/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts b/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); -- cgit v1.2.3 From 56eeea1e633b3d0b41b50df6dcd8f76d284d5c73 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 14 Mar 2018 16:37:09 +0100 Subject: Add fix to webpack for issue: https://github.com/trufflesuite/ganache-core/issues/84 and prettier the configs --- packages/website/webpack.config.js | 48 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/packages/website/webpack.config.js b/packages/website/webpack.config.js index c436888bd..e4cb1301c 100644 --- a/packages/website/webpack.config.js +++ b/packages/website/webpack.config.js @@ -11,10 +11,7 @@ module.exports = { }, devtool: 'source-map', resolve: { - modules: [ - path.join(__dirname, '/ts'), - 'node_modules', - ], + modules: [path.join(__dirname, '/ts'), 'node_modules'], extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.md'], alias: { ts: path.join(__dirname, '/ts'), @@ -22,6 +19,10 @@ module.exports = { md: path.join(__dirname, '/md'), }, }, + // HACK: Temporary fix for this issue: https://github.com/trufflesuite/ganache-core/issues/84 + node: { + fs: 'empty', + }, module: { rules: [ { @@ -62,25 +63,28 @@ module.exports = { from: /^\/docs\/.*$/, to: function() { return 'index.html'; - } - } - ] + }, + }, + ], }, disableHostCheck: true, }, - plugins: process.env.NODE_ENV === 'production' ? [ - // Since we do not use moment's locale feature, we exclude them from the bundle. - // This reduces the bundle size by 0.4MB. - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), - new webpack.DefinePlugin({ - 'process.env': { - 'NODE_ENV': JSON.stringify(process.env.NODE_ENV) - } - }), - new webpack.optimize.UglifyJsPlugin({ - mangle: { - except: ['BigNumber'] - } - }) - ] : [], + plugins: + process.env.NODE_ENV === 'production' + ? [ + // Since we do not use moment's locale feature, we exclude them from the bundle. + // This reduces the bundle size by 0.4MB. + new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + }, + }), + new webpack.optimize.UglifyJsPlugin({ + mangle: { + except: ['BigNumber'], + }, + }), + ] + : [], }; -- cgit v1.2.3 From 28d63ad8e12389b2a9fa23306e40f4b87be3b469 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 14 Mar 2018 16:37:24 +0100 Subject: Add Web3Wrapper docs to website --- .../website/md/docs/web3_wrapper/installation.md | 17 ++++ .../website/md/docs/web3_wrapper/introduction.md | 1 + packages/website/translations/chinese.json | 1 + packages/website/translations/english.json | 1 + packages/website/translations/korean.json | 1 + packages/website/translations/russian.json | 1 + packages/website/translations/spanish.json | 1 + packages/website/ts/components/sidebar_header.tsx | 1 + packages/website/ts/components/top_bar/top_bar.tsx | 23 ++++- .../ts/containers/web3_wrapper_documentation.ts | 103 +++++++++++++++++++++ packages/website/ts/index.tsx | 7 ++ .../website/ts/pages/documentation/doc_page.tsx | 2 + packages/website/ts/types.ts | 3 + 13 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 packages/website/md/docs/web3_wrapper/installation.md create mode 100644 packages/website/md/docs/web3_wrapper/introduction.md create mode 100644 packages/website/ts/containers/web3_wrapper_documentation.ts diff --git a/packages/website/md/docs/web3_wrapper/installation.md b/packages/website/md/docs/web3_wrapper/installation.md new file mode 100644 index 000000000..6e9b4cb59 --- /dev/null +++ b/packages/website/md/docs/web3_wrapper/installation.md @@ -0,0 +1,17 @@ +**Install** + +```bash +npm install @0xproject/web3-wrapper --save +``` + +**Import** + +```javascript +import { Web3Wrapper } from '@0xproject/web3-wrapper'; +``` + +or + +```javascript +var Web3Wrapper = require('@0xproject/web3-wrapper').Web3Wrapper; +``` diff --git a/packages/website/md/docs/web3_wrapper/introduction.md b/packages/website/md/docs/web3_wrapper/introduction.md new file mode 100644 index 000000000..ea2f4cf0d --- /dev/null +++ b/packages/website/md/docs/web3_wrapper/introduction.md @@ -0,0 +1 @@ +Welcome to the [Web3Wrapper](https://github.com/0xProject/0x-monorepo/tree/development/packages/web3-wrapper) documentation! Web3Wrapper is a convenience library that wraps Web3 v0.x, providing promise-based endpoints and a consistent API. diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json index f5f906d6c..9485de68c 100644 --- a/packages/website/translations/chinese.json +++ b/packages/website/translations/chinese.json @@ -61,6 +61,7 @@ "CONNECT": "0x 连接", "WHITEPAPER": "白皮书", "WIKI": "维基", + "WEB3_WRAPPER": "Web3Wrapper", "FAQ": "FAQ", "SMART_CONTRACTS": "0x 智能合约", "STANDARD_RELAYER_API": "中继方标准API", diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json index 9a1c9b2c8..2fbd17623 100644 --- a/packages/website/translations/english.json +++ b/packages/website/translations/english.json @@ -62,6 +62,7 @@ "CONNECT": "0x Connect", "WHITEPAPER": "whitepaper", "WIKI": "wiki", + "WEB3_WRAPPER": "Web3Wrapper", "FAQ": "FAQ", "SMART_CONTRACTS": "0x smart contracts", "STANDARD_RELAYER_API": "standard relayer API", diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json index b9be664e2..d63b200d7 100644 --- a/packages/website/translations/korean.json +++ b/packages/website/translations/korean.json @@ -61,6 +61,7 @@ "CONNECT": "0x Connect", "WHITEPAPER": "백서", "WIKI": "위키", + "WEB3_WRAPPER": "Web3Wrapper", "FAQ": "FAQ", "SMART_CONTRACTS": "0x 스마트 계약", "STANDARD_RELAYER_API": "Standard Relayer API", diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json index c103960c0..e660a43fc 100644 --- a/packages/website/translations/russian.json +++ b/packages/website/translations/russian.json @@ -61,6 +61,7 @@ "CONNECT": "0x Connect", "WHITEPAPER": "Whitepaper", "WIKI": "Вики", + "WEB3_WRAPPER": "Web3Wrapper", "FAQ": "Документация", "SMART_CONTRACTS": "0x Смарт-контракты ", "STANDARD_RELAYER_API": "standard relayer API", diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json index c2aaf384c..40f321e30 100644 --- a/packages/website/translations/spanish.json +++ b/packages/website/translations/spanish.json @@ -62,6 +62,7 @@ "CONNECT": "0x Connect", "WHITEPAPER": "documento técnico", "WIKI": "wiki", + "WEB3_WRAPPER": "Web3Wrapper", "FAQ": "preguntas frecuentes", "SMART_CONTRACTS": "0x contratos inteligentes", "STANDARD_RELAYER_API": "API de transmisión estándar", diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 519b23d80..24bd30207 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -6,6 +6,7 @@ const SHOW_DURATION_MS = 4000; const titleToIcon: { [title: string]: string } = { '0x.js': 'zeroExJs.png', + Web3Wrapper: 'zeroExJs.png', '0x Connect': 'connect.png', '0x Smart Contracts': 'contracts.png', Wiki: 'wiki.png', diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 29c68524c..ec8a69a9b 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -139,6 +139,12 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.Whitepaper, Deco.CapWords)} /> , + + + , ]; const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {}; const fullWidthClasses = isFullWidthPage ? 'pr4' : ''; @@ -277,6 +283,14 @@ export class TopBar extends React.Component { )} + {!this._isViewingWeb3WrapperDocs() && ( + + + {this.props.translate.get(Key.Web3Wrapper, Deco.Cap)}{' '} + {this.props.translate.get(Key.Docs, Deco.Cap)} + + + )} {!this._isViewingPortal() && ( @@ -304,7 +318,10 @@ export class TopBar extends React.Component { } private _renderDocsMenu(): React.ReactNode { if ( - (!this._isViewing0xjsDocs() && !this._isViewingSmartContractsDocs() && !this._isViewingConnectDocs()) || + (!this._isViewing0xjsDocs() && + !this._isViewingSmartContractsDocs() && + !this._isViewingWeb3WrapperDocs() && + !this._isViewingConnectDocs()) || _.isUndefined(this.props.menu) ) { return undefined; @@ -392,6 +409,9 @@ export class TopBar extends React.Component { private _isViewingSmartContractsDocs() { return _.includes(this.props.location.pathname, WebsitePaths.SmartContracts); } + private _isViewingWeb3WrapperDocs() { + return _.includes(this.props.location.pathname, WebsitePaths.Web3Wrapper); + } private _isViewingWiki() { return _.includes(this.props.location.pathname, WebsitePaths.Wiki); } @@ -401,6 +421,7 @@ export class TopBar extends React.Component { this._isViewing0xjsDocs() || this._isViewingFAQ() || this._isViewingSmartContractsDocs() || + this._isViewingWeb3WrapperDocs() || this._isViewingConnectDocs() ); } diff --git a/packages/website/ts/containers/web3_wrapper_documentation.ts b/packages/website/ts/containers/web3_wrapper_documentation.ts new file mode 100644 index 000000000..0a0911b80 --- /dev/null +++ b/packages/website/ts/containers/web3_wrapper_documentation.ts @@ -0,0 +1,103 @@ +import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { State } from 'ts/redux/reducer'; +import { DocPackages, Environments, WebsitePaths } from 'ts/types'; +import { configs } from 'ts/utils/configs'; +import { constants } from 'ts/utils/constants'; +import { Translate } from 'ts/utils/translate'; + +/* tslint:disable:no-var-requires */ +const IntroMarkdown = require('md/docs/web3_wrapper/introduction'); +const InstallationMarkdown = require('md/docs/web3_wrapper/installation'); +/* tslint:enable:no-var-requires */ + +const docSections = { + introduction: 'introduction', + installation: 'installation', + web3Wrapper: 'web3Wrapper', + types: docConstants.TYPES_SECTION_NAME, +}; + +const docsInfoConfig: DocsInfoConfig = { + id: DocPackages.Web3Wrapper, + type: SupportedDocJson.TypeDoc, + displayName: 'Web3Wrapper', + packageUrl: 'https://github.com/0xProject/0x-monorepo', + menu: { + introduction: [docSections.introduction], + install: [docSections.installation], + web3Wrapper: [docSections.web3Wrapper], + types: [docSections.types], + }, + sectionNameToMarkdown: { + [docSections.introduction]: IntroMarkdown, + [docSections.installation]: InstallationMarkdown, + }, + sectionNameToModulePath: { + [docSections.web3Wrapper]: ['"web3-wrapper/src/index"'], + [docSections.types]: ['"types/src/index"'], + }, + menuSubsectionToVersionWhenIntroduced: {}, + sections: docSections, + visibleConstructors: [docSections.web3Wrapper], + typeConfigs: { + // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is + // currently no way to extract the re-exported types from index.ts via TypeDoc :( + publicTypes: ['TxData', 'TransactionReceipt', 'RawLogEntry'], + typeNameToExternalLink: { + Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API', + Provider: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150', + BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127', + LogEntryEvent: 'http://mikemcl.github.io/bignumber.js', + CallData: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L348', + BlockWithoutTransactionData: + 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L314', + LogEntry: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L366', + FilterObject: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L109', + ['Web3.BlockParam']: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L278', + ['Web3.ContractAbi']: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L47', + }, + typeNameToPrefix: { + Provider: 'Web3', + CallData: 'Web3', + BlockWithoutTransactionData: 'Web3', + LogEntry: 'Web3', + FilterObject: 'Web3', + }, + typeNameToDocSection: { + Web3Wrapper: docSections.web3Wrapper, + }, + }, +}; +const docsInfo = new DocsInfo(docsInfoConfig); + +interface ConnectedState { + docsVersion: string; + availableDocVersions: string[]; + docsInfo: DocsInfo; + translate: Translate; +} + +interface ConnectedDispatch { + dispatcher: Dispatcher; +} + +const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({ + docsVersion: state.docsVersion, + availableDocVersions: state.availableDocVersions, + translate: state.translate, + docsInfo, +}); + +const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ + dispatcher: new Dispatcher(dispatch), +}); + +export const Documentation: React.ComponentClass = connect(mapStateToProps, mapDispatchToProps)( + DocPageComponent, +); diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index b24517e39..7f037934b 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -45,6 +45,9 @@ const LazySmartContractsDocumentation = createLazyComponent('Documentation', asy const LazyConnectDocumentation = createLazyComponent('Documentation', async () => System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/connect_documentation'), ); +const LazyWeb3WrapperDocumentation = createLazyComponent('Documentation', async () => + System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/web3_wrapper_documentation'), +); analytics.init(); // tslint:disable-next-line:no-floating-promises @@ -65,6 +68,10 @@ render( + Date: Wed, 14 Mar 2018 17:29:57 +0100 Subject: Ignore ganache-core from subproviders in a browser setting & remove previous hack --- packages/subproviders/package.json | 3 +++ packages/website/webpack.config.js | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index b49dfd67f..24dd4fb8f 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -62,5 +62,8 @@ }, "publishConfig": { "access": "public" + }, + "browser": { + "ganache-core": false } } diff --git a/packages/website/webpack.config.js b/packages/website/webpack.config.js index e4cb1301c..e28e9e064 100644 --- a/packages/website/webpack.config.js +++ b/packages/website/webpack.config.js @@ -19,10 +19,6 @@ module.exports = { md: path.join(__dirname, '/md'), }, }, - // HACK: Temporary fix for this issue: https://github.com/trufflesuite/ganache-core/issues/84 - node: { - fs: 'empty', - }, module: { rules: [ { -- cgit v1.2.3 From b145a17d11a8f5ac70170b605030c42e60a4260c Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 15 Mar 2018 19:22:57 +0100 Subject: Add pragma above command-line script --- packages/deployer/src/cli.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/deployer/src/cli.ts b/packages/deployer/src/cli.ts index 063366d47..7913c6344 100644 --- a/packages/deployer/src/cli.ts +++ b/packages/deployer/src/cli.ts @@ -1,3 +1,6 @@ +#!/usr/bin/env node +// We need the above pragma since this script will be run as a command-line tool. + import { BigNumber } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; -- cgit v1.2.3 From f9ad97b978ae4017adca032168ae7963c94e4157 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 15 Mar 2018 19:23:21 +0100 Subject: Add Deployer docs to website --- packages/contracts/package.json | 1 + packages/deployer/package.json | 15 ++- .../deployer/src/monorepo_scripts/stagedocs.ts | 8 ++ packages/website/md/docs/deployer/installation.md | 18 ++++ packages/website/md/docs/deployer/introduction.md | 17 ++++ packages/website/md/docs/deployer/usage.md | 52 +++++++++++ packages/website/translations/chinese.json | 1 + packages/website/translations/english.json | 1 + packages/website/translations/korean.json | 1 + packages/website/translations/russian.json | 1 + packages/website/translations/spanish.json | 1 + packages/website/ts/components/sidebar_header.tsx | 1 + packages/website/ts/components/top_bar/top_bar.tsx | 19 ++++ .../ts/containers/deployer_documentation.ts | 103 +++++++++++++++++++++ packages/website/ts/index.tsx | 4 + .../website/ts/pages/documentation/doc_page.tsx | 2 + packages/website/ts/types.ts | 3 + 17 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 packages/deployer/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/website/md/docs/deployer/installation.md create mode 100644 packages/website/md/docs/deployer/introduction.md create mode 100644 packages/website/md/docs/deployer/usage.md create mode 100644 packages/website/ts/containers/deployer_documentation.ts diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 05d305942..b16ec3fd0 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -59,6 +59,7 @@ "ethers-typescript-typings": "^0.0.2", "mocha": "^4.0.1", "npm-run-all": "^4.1.2", + "prettier": "^1.11.1", "shx": "^0.2.2", "solc": "^0.4.18", "tslint": "5.8.0", diff --git a/packages/deployer/package.json b/packages/deployer/package.json index 4bc739841..d99f6a44a 100644 --- a/packages/deployer/package.json +++ b/packages/deployer/package.json @@ -12,7 +12,19 @@ "clean": "shx rm -rf lib scripts", "migrate": "npm run build; node lib/src/cli.js migrate", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", - "test:circleci": "yarn test" + "test:circleci": "yarn test", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" + }, + "config": { + "postpublish": { + "assets": [], + "docPublishConfigs": { + "extraFileIncludes": ["../types/src/index.ts"], + "s3BucketPath": "s3://depoyer-docs-jsons/", + "s3StagingBucketPath": "s3://staging-depoyer-docs-jsons/" + } + } }, "bin": { "0x-deployer": "lib/src/cli.js" @@ -38,6 +50,7 @@ "shx": "^0.2.2", "tslint": "5.8.0", "types-bn": "^0.0.1", + "typedoc": "0xProject/typedoc", "typescript": "2.7.1", "web3-typescript-typings": "^0.10.0" }, diff --git a/packages/deployer/src/monorepo_scripts/stagedocs.ts b/packages/deployer/src/monorepo_scripts/stagedocs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/deployer/src/monorepo_scripts/stagedocs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/website/md/docs/deployer/installation.md b/packages/website/md/docs/deployer/installation.md new file mode 100644 index 000000000..9f3838054 --- /dev/null +++ b/packages/website/md/docs/deployer/installation.md @@ -0,0 +1,18 @@ +**Install** + +```bash +npm install @0xproject/deployer --save +``` + +**Import** + +```javascript +import { Deployer, Compiler } from '@0xproject/deployer'; +``` + +or + +```javascript +var Deployer = require('@0xproject/deployer').Deployer; +var Compiler = require('@0xproject/deployer').Compiler; +``` diff --git a/packages/website/md/docs/deployer/introduction.md b/packages/website/md/docs/deployer/introduction.md new file mode 100644 index 000000000..ba9d3735a --- /dev/null +++ b/packages/website/md/docs/deployer/introduction.md @@ -0,0 +1,17 @@ +Welcome to the [Deployer](https://github.com/0xProject/0x-monorepo/tree/development/packages/deployer) documentation! Deployer is a tool for compiling and deploying Solidity smart contracts with ease. + +It serves a similar purpose to the [Truffle framework](http://truffleframework.com/), but for intermediate to advanced Solidity developers that require greater configurability and reliability. + +Deployer has the following advantages over Truffle: + +* Deploy each smart contract with a specific version of Solidity +* Improved artifact files: + * Properly segregated artifacts to support storing different versions of smart contract deployed on different networks. + * Storage of contructor args and contract source code +* An easy to maintain codebase: TypeScript + Single package +* Allows you to specify the deployer address +* Migrations that work with `async/await` +* Migrations that can be written synchronously in order to guarentee deterministic contract addresses +* No race conditions when running migrations. + +Deployer can be used as a command-line tool or as an imported module. diff --git a/packages/website/md/docs/deployer/usage.md b/packages/website/md/docs/deployer/usage.md new file mode 100644 index 000000000..027389eac --- /dev/null +++ b/packages/website/md/docs/deployer/usage.md @@ -0,0 +1,52 @@ +### CLI Usage + +```bash +node ./node_modules/@0xproject/deployer/lib/cli.js --help +cli.js [command] + +Commands: + cli.js compile compile contracts + cli.js deploy deploy a single contract with provided arguments + +Options: + --version Show version number [boolean] + --contracts-dir path of contracts directory to compile + [string] [default: "/Users/leonidlogvinov/Dev/0x/contracts"] + --network-id mainnet=1, kovan=42, testrpc=50 [number] [default: 50] + --should-optimize enable optimizer [boolean] [default: false] + --artifacts-dir path to write contracts artifacts to + [string] [default: "/Users/leonidlogvinov/Dev/0x/build/artifacts/"] + --jsonrpc-port port connected to JSON RPC [number] [default: 8545] + --gas-price gasPrice to be used for transactions + [string] [default: "2000000000"] + --account account to use for deploying contracts [string] + --help Show help [boolean] +``` + +### API Usage + +#### Migrations + +You might want to write a migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started. + +```typescript +import { Deployer } from '@0xproject/deployer'; +import * as path from 'path'; + +const deployerOpts = { + artifactsDir: path.resolve('src', 'artifacts'), + jsonrpcUrl: 'http://localhost:8545', + networkId: 50, + defaults: { + gas: 1000000, + }, +}; + +const deployer = new Deployer(deployerOpts); + +(async () => { + const etherToken = await deployer.deployAndSaveAsync('WETH9'); +})().catch(console.log); +``` + +A more sophisticated example can be found [here](https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts/migrations) diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json index 9485de68c..f230754ec 100644 --- a/packages/website/translations/chinese.json +++ b/packages/website/translations/chinese.json @@ -56,6 +56,7 @@ "ABOUT": "关于我们", "CAREERS": "人才招聘", "CONTACT": "联系方式", + "DEPLOYER": "Deployer", "BLOG": "博客", "FORUM": "论坛", "CONNECT": "0x 连接", diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json index 2fbd17623..13d2c1842 100644 --- a/packages/website/translations/english.json +++ b/packages/website/translations/english.json @@ -57,6 +57,7 @@ "ABOUT": "about", "CAREERS": "careers", "CONTACT": "contact", + "DEPLOYER": "Deployer", "BLOG": "blog", "FORUM": "forum", "CONNECT": "0x Connect", diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json index d63b200d7..2d32e5c81 100644 --- a/packages/website/translations/korean.json +++ b/packages/website/translations/korean.json @@ -56,6 +56,7 @@ "ABOUT": "기업 정보", "CAREERS": "채용", "CONTACT": "문의", + "DEPLOYER": "Deployer", "BLOG": "블로그", "FORUM": "포럼", "CONNECT": "0x Connect", diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json index e660a43fc..9991bb4bc 100644 --- a/packages/website/translations/russian.json +++ b/packages/website/translations/russian.json @@ -56,6 +56,7 @@ "ABOUT": "Kоманда", "CAREERS": "Карьера", "CONTACT": "Связаться с нами", + "DEPLOYER": "Deployer", "BLOG": "Блог", "FORUM": "Форум", "CONNECT": "0x Connect", diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json index 40f321e30..121115260 100644 --- a/packages/website/translations/spanish.json +++ b/packages/website/translations/spanish.json @@ -57,6 +57,7 @@ "ABOUT": "equipo", "CAREERS": "empleo", "CONTACT": "contacto", + "DEPLOYER": "Deployer", "BLOG": "blog", "FORUM": "foro", "CONNECT": "0x Connect", diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 24bd30207..33c5ac857 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -7,6 +7,7 @@ const SHOW_DURATION_MS = 4000; const titleToIcon: { [title: string]: string } = { '0x.js': 'zeroExJs.png', Web3Wrapper: 'zeroExJs.png', + Deployer: 'zeroExJs.png', '0x Connect': 'connect.png', '0x Smart Contracts': 'contracts.png', Wiki: 'wiki.png', diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index ec8a69a9b..9cde5bf3f 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -145,6 +145,12 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.Web3Wrapper, Deco.CapWords)} /> , + + + , ]; const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {}; const fullWidthClasses = isFullWidthPage ? 'pr4' : ''; @@ -291,6 +297,14 @@ export class TopBar extends React.Component { )} + {!this._isViewingDeployerDocs() && ( + + + {this.props.translate.get(Key.Deployer, Deco.Cap)}{' '} + {this.props.translate.get(Key.Docs, Deco.Cap)} + + + )} {!this._isViewingPortal() && ( @@ -321,6 +335,7 @@ export class TopBar extends React.Component { (!this._isViewing0xjsDocs() && !this._isViewingSmartContractsDocs() && !this._isViewingWeb3WrapperDocs() && + !this._isViewingDeployerDocs() && !this._isViewingConnectDocs()) || _.isUndefined(this.props.menu) ) { @@ -412,6 +427,9 @@ export class TopBar extends React.Component { private _isViewingWeb3WrapperDocs() { return _.includes(this.props.location.pathname, WebsitePaths.Web3Wrapper); } + private _isViewingDeployerDocs() { + return _.includes(this.props.location.pathname, WebsitePaths.Deployer); + } private _isViewingWiki() { return _.includes(this.props.location.pathname, WebsitePaths.Wiki); } @@ -422,6 +440,7 @@ export class TopBar extends React.Component { this._isViewingFAQ() || this._isViewingSmartContractsDocs() || this._isViewingWeb3WrapperDocs() || + this._isViewingDeployerDocs() || this._isViewingConnectDocs() ); } diff --git a/packages/website/ts/containers/deployer_documentation.ts b/packages/website/ts/containers/deployer_documentation.ts new file mode 100644 index 000000000..13187f9eb --- /dev/null +++ b/packages/website/ts/containers/deployer_documentation.ts @@ -0,0 +1,103 @@ +import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { State } from 'ts/redux/reducer'; +import { DocPackages, Environments, WebsitePaths } from 'ts/types'; +import { configs } from 'ts/utils/configs'; +import { constants } from 'ts/utils/constants'; +import { Translate } from 'ts/utils/translate'; + +/* tslint:disable:no-var-requires */ +const IntroMarkdown = require('md/docs/deployer/introduction'); +const InstallationMarkdown = require('md/docs/deployer/installation'); +const UsageMarkdown = require('md/docs/deployer/usage'); +/* tslint:enable:no-var-requires */ + +const docSections = { + introduction: 'introduction', + installation: 'installation', + usage: 'usage', + compiler: 'compiler', + deployer: 'deployer', + types: docConstants.TYPES_SECTION_NAME, +}; + +const docsInfoConfig: DocsInfoConfig = { + id: DocPackages.Deployer, + type: SupportedDocJson.TypeDoc, + displayName: 'Deployer', + packageUrl: 'https://github.com/0xProject/0x-monorepo', + menu: { + introduction: [docSections.introduction], + install: [docSections.installation], + usage: [docSections.usage], + compiler: [docSections.compiler], + deployer: [docSections.deployer], + types: [docSections.types], + }, + sectionNameToMarkdown: { + [docSections.introduction]: IntroMarkdown, + [docSections.installation]: InstallationMarkdown, + [docSections.usage]: UsageMarkdown, + }, + sectionNameToModulePath: { + [docSections.compiler]: ['"deployer/src/compiler"'], + [docSections.deployer]: ['"deployer/src/deployer"'], + [docSections.types]: ['"deployer/src/utils/types"', '"types/src/index"'], + }, + menuSubsectionToVersionWhenIntroduced: {}, + sections: docSections, + visibleConstructors: [docSections.compiler, docSections.deployer], + typeConfigs: { + // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is + // currently no way to extract the re-exported types from index.ts via TypeDoc :( + publicTypes: [ + 'CompilerOptions', + 'DeployerOptions', + 'BaseDeployerOptions', + 'UrlDeployerOptions', + 'ProviderDeployerOptions', + 'TxData', + ], + typeNameToExternalLink: { + Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API', + BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127', + ContractInstance: + 'https://github.com/0xProject/0x-monorepo/blob/development/packages/web3-typescript-typings/index.d.ts#L101', + }, + typeNameToPrefix: { + ContractInstance: 'Web3', + }, + }, +}; +const docsInfo = new DocsInfo(docsInfoConfig); + +interface ConnectedState { + docsVersion: string; + availableDocVersions: string[]; + docsInfo: DocsInfo; + translate: Translate; +} + +interface ConnectedDispatch { + dispatcher: Dispatcher; +} + +const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({ + docsVersion: state.docsVersion, + availableDocVersions: state.availableDocVersions, + translate: state.translate, + docsInfo, +}); + +const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ + dispatcher: new Dispatcher(dispatch), +}); + +export const Documentation: React.ComponentClass = connect(mapStateToProps, mapDispatchToProps)( + DocPageComponent, +); diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index 7f037934b..cc09f2df3 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -48,6 +48,9 @@ const LazyConnectDocumentation = createLazyComponent('Documentation', async () = const LazyWeb3WrapperDocumentation = createLazyComponent('Documentation', async () => System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/web3_wrapper_documentation'), ); +const LazyDeployerDocumentation = createLazyComponent('Documentation', async () => + System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/deployer_documentation'), +); analytics.init(); // tslint:disable-next-line:no-floating-promises @@ -68,6 +71,7 @@ render( + Date: Fri, 16 Mar 2018 14:02:55 +0100 Subject: Handle reflection type in type rendering --- packages/react-docs/CHANGELOG.md | 1 + packages/react-docs/src/components/type.tsx | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md index a90cf19f0..7f860739f 100644 --- a/packages/react-docs/CHANGELOG.md +++ b/packages/react-docs/CHANGELOG.md @@ -4,3 +4,4 @@ * Move example out into a separate sub-package * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452) + * Handle `reflection` type rendering so that anonymous function type declarations render properly diff --git a/packages/react-docs/src/components/type.tsx b/packages/react-docs/src/components/type.tsx index 56425a5df..b253f0397 100644 --- a/packages/react-docs/src/components/type.tsx +++ b/packages/react-docs/src/components/type.tsx @@ -9,6 +9,7 @@ import { Type as TypeDef, TypeDefinitionByName, TypeDocTypes } from '../types'; import { constants } from '../utils/constants'; import { utils } from '../utils/utils'; +import { MethodSignature } from './method_signature'; import { TypeDefinition } from './type_definition'; const typeToSection: { [typeName: string]: string } = { @@ -101,6 +102,19 @@ export function Type(props: TypeProps): any { }); break; + case TypeDocTypes.Reflection: + typeName = ( + + ); + break; + case TypeDocTypes.TypeParameter: typeName = type.name; break; -- cgit v1.2.3 From 8243e73413a31a2e37c55bc7dd910b547b80ae65 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 14:03:50 +0100 Subject: Use named types and introduce `JSONRPCRequestPayloadWithMethod` type --- packages/subproviders/CHANGELOG.md | 1 + .../subproviders/src/subproviders/empty_wallet_subprovider.ts | 8 +++----- .../src/subproviders/fake_gas_estimate_subprovider.ts | 8 +++----- packages/subproviders/src/subproviders/ganache.ts | 8 +++----- packages/subproviders/src/subproviders/injected_web3.ts | 8 +++----- packages/subproviders/src/subproviders/ledger.ts | 3 ++- packages/subproviders/src/subproviders/redundant_rpc.ts | 6 ++++-- packages/subproviders/src/subproviders/subprovider.ts | 8 +++++--- 8 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index 76a757df5..d748b51a3 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -5,6 +5,7 @@ * Export `GanacheSubprovider` and `Subprovider` (#426) * Make all subproviders to derive from `Subprovider` (#426) * Add types for `NextCallback`, `OnNextCompleted` (#426) + * Introduce `JSONRPCRequestPayloadWithMethod` type ## v0.7.0 - _March 8, 2018_ diff --git a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts index f5983dd9b..d5d03a4ac 100644 --- a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts @@ -1,5 +1,7 @@ import * as Web3 from 'web3'; +import { Callback, ErrorCallback } from '../types'; + import { Subprovider } from './subprovider'; /* @@ -10,11 +12,7 @@ import { Subprovider } from './subprovider'; export class EmptyWalletSubprovider extends Subprovider { // This method needs to be here to satisfy the interface but linter wants it to be static. // tslint:disable-next-line:prefer-function-over-method - public handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: () => void, - end: (err: Error | null, result: any) => void, - ) { + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_accounts': end(null, []); diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts index 2421dcd02..faec2d9e5 100644 --- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts +++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts @@ -1,5 +1,7 @@ import * as Web3 from 'web3'; +import { Callback, ErrorCallback } from '../types'; + import { Subprovider } from './subprovider'; /* @@ -18,11 +20,7 @@ export class FakeGasEstimateSubprovider extends Subprovider { } // This method needs to be here to satisfy the interface but linter wants it to be static. // tslint:disable-next-line:prefer-function-over-method - public handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: () => void, - end: (err: Error | null, result: any) => void, - ) { + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_estimateGas': end(null, this._constantGasAmount); diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts index a979aecf4..6ff939674 100644 --- a/packages/subproviders/src/subproviders/ganache.ts +++ b/packages/subproviders/src/subproviders/ganache.ts @@ -1,6 +1,8 @@ import * as Ganache from 'ganache-core'; import * as Web3 from 'web3'; +import { Callback, ErrorCallback } from '../types'; + import { Subprovider } from './subprovider'; /* @@ -16,11 +18,7 @@ export class GanacheSubprovider extends Subprovider { } // This method needs to be here to satisfy the interface but linter wants it to be static. // tslint:disable-next-line:prefer-function-over-method - public handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: () => void, - end: (err: Error | null, result: any) => void, - ) { + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { this._ganacheProvider.sendAsync(payload, (err: Error | null, result: any) => { end(err, result && result.result); }); diff --git a/packages/subproviders/src/subproviders/injected_web3.ts b/packages/subproviders/src/subproviders/injected_web3.ts index 6d4e2b27b..ec7304cb7 100644 --- a/packages/subproviders/src/subproviders/injected_web3.ts +++ b/packages/subproviders/src/subproviders/injected_web3.ts @@ -1,6 +1,8 @@ import * as _ from 'lodash'; import * as Web3 from 'web3'; +import { Callback, ErrorCallback } from '../types'; + import { Subprovider } from './subprovider'; /* @@ -15,11 +17,7 @@ export class InjectedWeb3Subprovider extends Subprovider { super(); this._injectedWeb3 = new Web3(subprovider); } - public handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: () => void, - end: (err: Error | null, result: any) => void, - ) { + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'web3_clientVersion': this._injectedWeb3.version.getNode(end); diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index b67b49bee..95217c84d 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -8,6 +8,7 @@ import { Lock } from 'semaphore-async-await'; import * as Web3 from 'web3'; import { + Callback, LedgerEthereumClient, LedgerEthereumClientFactoryAsync, LedgerSubproviderConfigs, @@ -62,7 +63,7 @@ export class LedgerSubprovider extends Subprovider { // tslint:disable-next-line:async-suffix public async handleRequest( payload: Web3.JSONRPCRequestPayload, - next: () => void, + next: Callback, end: (err: Error | null, result?: any) => void, ) { let accounts; diff --git a/packages/subproviders/src/subproviders/redundant_rpc.ts b/packages/subproviders/src/subproviders/redundant_rpc.ts index 0df2f91f4..dacd1c2c5 100644 --- a/packages/subproviders/src/subproviders/redundant_rpc.ts +++ b/packages/subproviders/src/subproviders/redundant_rpc.ts @@ -3,6 +3,8 @@ import * as _ from 'lodash'; import * as Web3 from 'web3'; import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); +import { Callback } from '../types'; + import { Subprovider } from './subprovider'; export class RedundantRPCSubprovider extends Subprovider { @@ -10,7 +12,7 @@ export class RedundantRPCSubprovider extends Subprovider { private static async _firstSuccessAsync( rpcs: RpcSubprovider[], payload: Web3.JSONRPCRequestPayload, - next: () => void, + next: Callback, ): Promise { let lastErr: Error | undefined; for (const rpc of rpcs) { @@ -38,7 +40,7 @@ export class RedundantRPCSubprovider extends Subprovider { // tslint:disable-next-line:async-suffix public async handleRequest( payload: Web3.JSONRPCRequestPayload, - next: () => void, + next: Callback, end: (err: Error | null, data?: any) => void, ): Promise { const rpcsCopy = this._rpcs.slice(); diff --git a/packages/subproviders/src/subproviders/subprovider.ts b/packages/subproviders/src/subproviders/subprovider.ts index d4e0de67a..4a224fc4e 100644 --- a/packages/subproviders/src/subproviders/subprovider.ts +++ b/packages/subproviders/src/subproviders/subprovider.ts @@ -1,5 +1,7 @@ import promisify = require('es6-promisify'); import * as Web3 from 'web3'; + +import { JSONRPCRequestPayloadWithMethod } from '../types'; /* * A version of the base class Subprovider found in providerEngine * This one has an async/await `emitPayloadAsync` and also defined types. @@ -18,8 +20,8 @@ export class Subprovider { return datePart + extraPart; } private static _createFinalPayload( - payload: Partial & { method: string }, - ): Web3.JSONRPCRequestPayload { + payload: Partial, + ): Partial { const finalPayload = { // defaults id: Subprovider._getRandomId(), @@ -33,7 +35,7 @@ export class Subprovider { this._engine = engine; } public async emitPayloadAsync( - payload: Partial & { method: string }, + payload: Partial, ): Promise { const finalPayload = Subprovider._createFinalPayload(payload); const response = await promisify(this._engine.sendAsync, this._engine)(finalPayload); -- cgit v1.2.3 From 312a30578b7f2c21bce9bb9c339a73cdc569167c Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 14:04:08 +0100 Subject: Improve deployer docs --- packages/website/md/docs/deployer/installation.md | 10 ++++++-- packages/website/md/docs/deployer/introduction.md | 2 +- packages/website/md/docs/deployer/usage.md | 29 +++++++++++++---------- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/packages/website/md/docs/deployer/installation.md b/packages/website/md/docs/deployer/installation.md index 9f3838054..48dd52c1f 100644 --- a/packages/website/md/docs/deployer/installation.md +++ b/packages/website/md/docs/deployer/installation.md @@ -1,4 +1,10 @@ -**Install** +#### CLI Installation + +```bash +npm install @0xproject/deployer -g +``` + +#### API Installation ```bash npm install @0xproject/deployer --save @@ -6,7 +12,7 @@ npm install @0xproject/deployer --save **Import** -```javascript +```typescript import { Deployer, Compiler } from '@0xproject/deployer'; ``` diff --git a/packages/website/md/docs/deployer/introduction.md b/packages/website/md/docs/deployer/introduction.md index ba9d3735a..114b71bde 100644 --- a/packages/website/md/docs/deployer/introduction.md +++ b/packages/website/md/docs/deployer/introduction.md @@ -1,6 +1,6 @@ Welcome to the [Deployer](https://github.com/0xProject/0x-monorepo/tree/development/packages/deployer) documentation! Deployer is a tool for compiling and deploying Solidity smart contracts with ease. -It serves a similar purpose to the [Truffle framework](http://truffleframework.com/), but for intermediate to advanced Solidity developers that require greater configurability and reliability. +It serves a similar purpose as parts of the [Truffle framework](http://truffleframework.com/), but with the UNIX philosophy in mind: Make each program do one thing well. This tool is for intermediate to advanced Solidity developers that require greater configurability and reliability. Deployer has the following advantages over Truffle: diff --git a/packages/website/md/docs/deployer/usage.md b/packages/website/md/docs/deployer/usage.md index 027389eac..2cfd5ca37 100644 --- a/packages/website/md/docs/deployer/usage.md +++ b/packages/website/md/docs/deployer/usage.md @@ -1,33 +1,36 @@ -### CLI Usage +#### CLI Usage ```bash -node ./node_modules/@0xproject/deployer/lib/cli.js --help -cli.js [command] +$ 0x-deployer --help +0x-deployer [command] Commands: - cli.js compile compile contracts - cli.js deploy deploy a single contract with provided arguments + 0x-deployer compile compile contracts + 0x-deployer migrate compile and deploy contracts using migration scripts + 0x-deployer deploy deploy a single contract with provided arguments Options: --version Show version number [boolean] - --contracts-dir path of contracts directory to compile - [string] [default: "/Users/leonidlogvinov/Dev/0x/contracts"] + --contracts-dir path of contracts directory to compile [string] [default: + "/path/to/contracts"] --network-id mainnet=1, kovan=42, testrpc=50 [number] [default: 50] --should-optimize enable optimizer [boolean] [default: false] - --artifacts-dir path to write contracts artifacts to - [string] [default: "/Users/leonidlogvinov/Dev/0x/build/artifacts/"] + --artifacts-dir path to write contracts artifacts to [string] [default: + "/path/to/artifacts"] --jsonrpc-port port connected to JSON RPC [number] [default: 8545] --gas-price gasPrice to be used for transactions [string] [default: "2000000000"] --account account to use for deploying contracts [string] + --contracts comma separated list of contracts to compile + [string] [default: "*"] --help Show help [boolean] ``` -### API Usage +#### API Usage -#### Migrations +##### Migrations -You might want to write a migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started. +You can write migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started. ```typescript import { Deployer } from '@0xproject/deployer'; @@ -49,4 +52,6 @@ const deployer = new Deployer(deployerOpts); })().catch(console.log); ``` +**Tip:** Be sure to start an Ethereum node at the supplied `jsonrpcUrl`. We recommend testing with [Ganache-cli](https://github.com/trufflesuite/ganache-cli) + A more sophisticated example can be found [here](https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts/migrations) -- cgit v1.2.3 From 3574ab253fd56b40a1b417406416c94efdb0cd13 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 14:04:27 +0100 Subject: Add missing type to subproviders exports --- packages/subproviders/src/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index cafb50fe5..a8c2b5c17 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -12,7 +12,13 @@ export { LedgerSubprovider } from './subproviders/ledger'; export { GanacheSubprovider } from './subproviders/ganache'; export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; -export { ECSignature, LedgerWalletSubprovider, LedgerCommunicationClient, NonceSubproviderErrors } from './types'; +export { + ECSignature, + LedgerWalletSubprovider, + LedgerCommunicationClient, + NonceSubproviderErrors, + LedgerSubproviderConfigs, +} from './types'; /** * A factory method for creating a LedgerEthereumClient usable in a browser context. -- cgit v1.2.3 From b37076136b59ecff681377f6df5de762d44320f0 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 14:04:38 +0100 Subject: Add missing type --- packages/subproviders/src/types.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/subproviders/src/types.ts b/packages/subproviders/src/types.ts index 543da5947..09095a53d 100644 --- a/packages/subproviders/src/types.ts +++ b/packages/subproviders/src/types.ts @@ -1,4 +1,5 @@ import * as _ from 'lodash'; +import * as Web3 from 'web3'; export interface LedgerCommunicationClient { close: () => Promise; @@ -117,3 +118,7 @@ export type ErrorCallback = (err: Error | null, data?: any) => void; export type Callback = () => void; export type OnNextCompleted = (err: Error | null, result: any, cb: Callback) => void; export type NextCallback = (callback?: OnNextCompleted) => void; + +export interface JSONRPCRequestPayloadWithMethod extends Web3.JSONRPCRequestPayload { + method: string; +} -- cgit v1.2.3 From 5a827eb3d4aefc65f808865f2634108b62406278 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 14:05:05 +0100 Subject: Fix deployer external type link to point to specific commit --- packages/website/ts/containers/deployer_documentation.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/website/ts/containers/deployer_documentation.ts b/packages/website/ts/containers/deployer_documentation.ts index 13187f9eb..4e1c41f8c 100644 --- a/packages/website/ts/containers/deployer_documentation.ts +++ b/packages/website/ts/containers/deployer_documentation.ts @@ -66,8 +66,7 @@ const docsInfoConfig: DocsInfoConfig = { typeNameToExternalLink: { Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API', BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127', - ContractInstance: - 'https://github.com/0xProject/0x-monorepo/blob/development/packages/web3-typescript-typings/index.d.ts#L101', + ContractInstance: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L98', }, typeNameToPrefix: { ContractInstance: 'Web3', -- cgit v1.2.3 From d7bf003d511321ec6cb8814cb1549c46b4efba86 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Fri, 16 Mar 2018 16:56:53 +0100 Subject: Refactor all docJSON's to reside within the same S3 bucket under different folders --- packages/0x.js/package.json | 4 +- packages/connect/package.json | 4 +- packages/deployer/package.json | 4 +- packages/web3-wrapper/package.json | 4 +- .../website/ts/pages/documentation/doc_page.tsx | 28 +++++----- packages/website/ts/types.ts | 2 +- packages/website/ts/utils/constants.ts | 3 +- packages/website/ts/utils/doc_utils.ts | 60 +++++++++++++++++----- 8 files changed, 72 insertions(+), 37 deletions(-) diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 0cb01d352..4bc0cc193 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -36,8 +36,8 @@ "assets": ["_bundles/index.js", "_bundles/index.min.js"], "docPublishConfigs": { "extraFileIncludes": ["../types/src/index.ts"], - "s3BucketPath": "s3://0xjs-docs-jsons/", - "s3StagingBucketPath": "s3://staging-0xjs-docs-jsons/" + "s3BucketPath": "s3://doc-jsons/0xjs/", + "s3StagingBucketPath": "s3://staging-doc-jsons/0xjs/" } } }, diff --git a/packages/connect/package.json b/packages/connect/package.json index e0478b42a..b1b033621 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -29,8 +29,8 @@ "postpublish": { "assets": ["_bundles/index.js", "_bundles/index.min.js"], "docPublishConfigs": { - "s3BucketPath": "s3://connect-docs-jsons/", - "s3StagingBucketPath": "s3://staging-connect-docs-jsons/" + "s3BucketPath": "s3://doc-jsons/connect/", + "s3StagingBucketPath": "s3://staging-doc-jsons/connect/" } } }, diff --git a/packages/deployer/package.json b/packages/deployer/package.json index 64852e89d..346b967e2 100644 --- a/packages/deployer/package.json +++ b/packages/deployer/package.json @@ -23,8 +23,8 @@ "assets": [], "docPublishConfigs": { "extraFileIncludes": ["../types/src/index.ts"], - "s3BucketPath": "s3://depoyer-docs-jsons/", - "s3StagingBucketPath": "s3://staging-depoyer-docs-jsons/" + "s3BucketPath": "s3://doc-jsons/deployer/", + "s3StagingBucketPath": "s3://staging-doc-jsons/deployer/" } } }, diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index ae7ba8b26..9b41f1de6 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -16,8 +16,8 @@ "postpublish": { "docPublishConfigs": { "extraFileIncludes": ["../types/src/index.ts"], - "s3BucketPath": "s3://web3-wrapper-docs-json/", - "s3StagingBucketPath": "s3://staging-web3-wrapper-docs-json/" + "s3BucketPath": "s3://doc-jsons/web3-wrapper/", + "s3StagingBucketPath": "s3://staging-doc-jsons/web3-wrapper/" } } }, diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index ecae7147d..5f09ec9ef 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -17,13 +17,13 @@ import { utils } from 'ts/utils/utils'; const ZERO_EX_JS_VERSION_MISSING_TOPLEVEL_PATH = '0.32.4'; -const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; -const docIdToS3BucketName: { [id: string]: string } = { - [DocPackages.ZeroExJs]: isDevelopment ? 'staging-0xjs-docs-jsons' : '0xjs-docs-jsons', - [DocPackages.SmartContracts]: 'smart-contracts-docs-json', - [DocPackages.Connect]: isDevelopment ? 'staging-connect-docs-jsons' : 'connect-docs-jsons', - [DocPackages.Web3Wrapper]: isDevelopment ? 'staging-web3-wrapper-docs-json' : 'web3-wrapper-docs-json', - [DocPackages.Deployer]: isDevelopment ? 'staging-depoyer-docs-jsons' : 'depoyer-docs-jsons', +const isDevelopment = configs.ENVIRONMENT !== Environments.DEVELOPMENT; +const docIdToS3FolderName: { [id: string]: string } = { + [DocPackages.ZeroExJs]: '0xjs', + [DocPackages.SmartContracts]: 'smart-contracts', + [DocPackages.Connect]: 'connect', + [DocPackages.Web3Wrapper]: 'web3-wrapper', + [DocPackages.Deployer]: 'deployer', }; const docIdToSubpackageName: { [id: string]: string } = { @@ -101,25 +101,25 @@ export class DocPage extends React.Component { ); } private async _fetchJSONDocsFireAndForgetAsync(preferredVersionIfExists?: string): Promise { - const s3BucketName = docIdToS3BucketName[this.props.docsInfo.id]; - const docsJsonRoot = `${constants.S3_BUCKET_ROOT}/${s3BucketName}`; - const versionToFileName = await docUtils.getVersionToFileNameAsync(docsJsonRoot); - const versions = _.keys(versionToFileName); + const folderName = docIdToS3FolderName[this.props.docsInfo.id]; + const docBucketRoot = isDevelopment ? constants.S3_STAGING_DOC_BUCKET_ROOT : constants.S3_DOC_BUCKET_ROOT; + const versionToFilePath = await docUtils.getVersionToFilePathAsync(docBucketRoot, folderName); + const versions = _.keys(versionToFilePath); this.props.dispatcher.updateAvailableDocVersions(versions); const sortedVersions = semverSort.desc(versions); const latestVersion = sortedVersions[0]; let versionToFetch = latestVersion; if (!_.isUndefined(preferredVersionIfExists)) { - const preferredVersionFileNameIfExists = versionToFileName[preferredVersionIfExists]; + const preferredVersionFileNameIfExists = versionToFilePath[preferredVersionIfExists]; if (!_.isUndefined(preferredVersionFileNameIfExists)) { versionToFetch = preferredVersionIfExists; } } this.props.dispatcher.updateCurrentDocsVersion(versionToFetch); - const versionFileNameToFetch = versionToFileName[versionToFetch]; - const versionDocObj = await docUtils.getJSONDocFileAsync(versionFileNameToFetch, docsJsonRoot); + const versionFilePathToFetch = versionToFilePath[versionToFetch]; + const versionDocObj = await docUtils.getJSONDocFileAsync(versionFilePathToFetch, docBucketRoot); const docAgnosticFormat = this.props.docsInfo.convertToDocAgnosticFormat(versionDocObj); if (!this._isUnmounted) { diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts index 33a5f8229..4a3426b56 100644 --- a/packages/website/ts/types.ts +++ b/packages/website/ts/types.ts @@ -336,7 +336,7 @@ export enum TokenVisibility { TRACKED = 'TRACKED', } -export interface VersionToFileName { +export interface VersionToFilePath { [version: string]: string; } diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts index f63e8617e..42a2f44d0 100644 --- a/packages/website/ts/utils/constants.ts +++ b/packages/website/ts/utils/constants.ts @@ -29,7 +29,8 @@ export const constants = { PROVIDER_NAME_GENERIC: 'Injected Web3', PROVIDER_NAME_PUBLIC: '0x Public', ROLLBAR_ACCESS_TOKEN: 'a6619002b51c4464928201e6ea94de65', - S3_BUCKET_ROOT: 'https://s3.amazonaws.com', + S3_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/doc-jsons', + S3_STAGING_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/staging-doc-jsons', SUCCESS_STATUS: 200, UNAVAILABLE_STATUS: 503, TAKER_FEE: new BigNumber(0), diff --git a/packages/website/ts/utils/doc_utils.ts b/packages/website/ts/utils/doc_utils.ts index 6b3f5f378..2a599bcbe 100644 --- a/packages/website/ts/utils/doc_utils.ts +++ b/packages/website/ts/utils/doc_utils.ts @@ -2,21 +2,21 @@ import { DoxityDocObj, TypeDocNode } from '@0xproject/react-docs'; import { logUtils } from '@0xproject/utils'; import findVersions = require('find-versions'); import * as _ from 'lodash'; -import { S3FileObject, VersionToFileName } from 'ts/types'; +import { S3FileObject, VersionToFilePath } from 'ts/types'; import { utils } from 'ts/utils/utils'; import convert = require('xml-js'); export const docUtils = { - async getVersionToFileNameAsync(s3DocJsonRoot: string): Promise { - const versionFileNames = await this.getVersionFileNamesAsync(s3DocJsonRoot); - const versionToFileName: VersionToFileName = {}; - _.each(versionFileNames, fileName => { - const [version] = findVersions(fileName); - versionToFileName[version] = fileName; + async getVersionToFilePathAsync(s3DocJsonRoot: string, folderName: string): Promise { + const versionFilePaths = await this.getVersionFileNamesAsync(s3DocJsonRoot, folderName); + const versionToFilePath: VersionToFilePath = {}; + _.each(versionFilePaths, filePath => { + const [version] = findVersions(filePath); + versionToFilePath[version] = filePath; }); - return versionToFileName; + return versionToFilePath; }, - async getVersionFileNamesAsync(s3DocJsonRoot: string): Promise { + async getVersionFileNamesAsync(s3DocJsonRoot: string, folderName: string): Promise { const response = await fetch(s3DocJsonRoot); if (response.status !== 200) { // TODO: Show the user an error message when the docs fail to load @@ -33,13 +33,47 @@ export const docUtils = { ? (responseObj.ListBucketResult.Contents as S3FileObject[]) : [responseObj.ListBucketResult.Contents]; - const versionFileNames = _.map(fileObjs, fileObj => { + /* + * S3 simply pre-fixes files in "folders" with the folder name. Thus, since we + * store docJSONs for multiple packages in a single S3 bucket, we must filter out + * the versionFileNames for a given folder here (ignoring folder entries) + * + * Example S3 response: + * + * staging-doc-jsons + * + * + * 1000 + * false + * + * 0xjs/ + * 2018-03-16T13:17:46.000Z + * "d41d8cd98f00b204e9800998ecf8427e" + * 0 + * STANDARD + * + * + * 0xjs/v0.1.0.json + * 2018-03-16T13:18:23.000Z + * "b4f7f74913aab4a5ad1e6a58fcb3b274" + * 1039050 + * STANDARD + * + */ + const relevantObjs = _.filter(fileObjs, fileObj => { + const key = fileObj.Key._text; + const isInFolderOfInterest = _.includes(key, folderName); + const isFileEntry = !_.endsWith(key, '/'); + return isInFolderOfInterest && isFileEntry; + }); + + const versionFilePaths = _.map(relevantObjs, fileObj => { return fileObj.Key._text; }); - return versionFileNames; + return versionFilePaths; }, - async getJSONDocFileAsync(fileName: string, s3DocJsonRoot: string): Promise { - const endpoint = `${s3DocJsonRoot}/${fileName}`; + async getJSONDocFileAsync(filePath: string, s3DocJsonRoot: string): Promise { + const endpoint = `${s3DocJsonRoot}/${filePath}`; const response = await fetch(endpoint); if (response.status !== 200) { // TODO: Show the user an error message when the docs fail to load -- cgit v1.2.3 From c7302c46e57c4646dbbd0004e09e987b720b5815 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 14:54:12 +0100 Subject: Add JSON Schemas docs to website --- packages/json-schemas/package.json | 15 +++- .../json-schemas/src/monorepo_scripts/stagedocs.ts | 8 ++ .../website/md/docs/json_schemas/installation.md | 17 +++++ .../website/md/docs/json_schemas/introduction.md | 3 + packages/website/md/docs/json_schemas/schemas.md | 28 +++++++ packages/website/translations/chinese.json | 1 + packages/website/translations/english.json | 1 + packages/website/translations/korean.json | 1 + packages/website/translations/russian.json | 1 + packages/website/translations/spanish.json | 1 + packages/website/ts/components/sidebar_header.tsx | 1 + packages/website/ts/components/top_bar/top_bar.tsx | 19 +++++ .../ts/containers/json_schemas_documentation.ts | 85 ++++++++++++++++++++++ packages/website/ts/index.tsx | 7 ++ .../website/ts/pages/documentation/doc_page.tsx | 4 +- packages/website/ts/types.ts | 3 + 16 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 packages/json-schemas/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/website/md/docs/json_schemas/installation.md create mode 100644 packages/website/md/docs/json_schemas/introduction.md create mode 100644 packages/website/md/docs/json_schemas/schemas.md create mode 100644 packages/website/ts/containers/json_schemas_documentation.ts diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json index 84ed0c209..a63d435ab 100644 --- a/packages/json-schemas/package.json +++ b/packages/json-schemas/package.json @@ -13,7 +13,19 @@ "test:circleci": "yarn test:coverage", "run_mocha": "mocha lib/test/**/*_test.js", "clean": "shx rm -rf _bundles lib test_temp scripts", - "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts" + "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" + }, + "config": { + "postpublish": { + "assets": [], + "docPublishConfigs": { + "extraFileIncludes": ["../types/src/index.ts"], + "s3BucketPath": "s3://doc-jsons/json-schemas/", + "s3StagingBucketPath": "s3://staging-doc-jsons/json-schemas/" + } + } }, "repository": { "type": "git", @@ -46,6 +58,7 @@ "npm-run-all": "^4.1.2", "shx": "^0.2.2", "tslint": "5.8.0", + "typedoc": "0xProject/typedoc", "typescript": "2.7.1" }, "publishConfig": { diff --git a/packages/json-schemas/src/monorepo_scripts/stagedocs.ts b/packages/json-schemas/src/monorepo_scripts/stagedocs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/json-schemas/src/monorepo_scripts/stagedocs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/website/md/docs/json_schemas/installation.md b/packages/website/md/docs/json_schemas/installation.md new file mode 100644 index 000000000..53886b6b3 --- /dev/null +++ b/packages/website/md/docs/json_schemas/installation.md @@ -0,0 +1,17 @@ +**Install** + +```bash +npm install @0xproject/json-schemas --save +``` + +**Import** + +```javascript +import { schemas } from '@0xproject/json-schemas'; +``` + +or + +```javascript +var schemas = require('@0xproject/json-schemas').schemas; +``` diff --git a/packages/website/md/docs/json_schemas/introduction.md b/packages/website/md/docs/json_schemas/introduction.md new file mode 100644 index 000000000..a27f4b521 --- /dev/null +++ b/packages/website/md/docs/json_schemas/introduction.md @@ -0,0 +1,3 @@ +Welcome to the [@0xproject/json-schemas](https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas) documentation! This package provides JSON schemas for validating 0x Protocol & Standard Relayer API data structures. It provides both the raw JSON schemas and a schema validator class to interact with them from a JS project. + +If you are not using a Javascript-based language for your project, you can copy-paste the JSON schemas within this package and use them together with a [JSON Schema](http://json-schema.org/) implementation in your [language of choice](http://json-schema.org/implementations.html) (e.g Python, Haskell, Go, C, C++, Rust, Ruby, Scala, etc...). diff --git a/packages/website/md/docs/json_schemas/schemas.md b/packages/website/md/docs/json_schemas/schemas.md new file mode 100644 index 000000000..fcf5d8df6 --- /dev/null +++ b/packages/website/md/docs/json_schemas/schemas.md @@ -0,0 +1,28 @@ +0x Protocol Schemas + +* [Basic types](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/basic_type_schemas.ts) (e.g Ethereum address, number) +* [ECSignature](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/ec_signature_schema.ts) +* [Order/SignedOrder](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/order_schemas.ts) +* [OrderHash](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/order_hash_schema.ts) + +0x.js Schemas + +* [BlockRange](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/block_range_schema.ts) +* [IndexFilter Values](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/index_filter_values_schema.ts) +* [OrderFillRequests](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/order_fill_requests_schema.ts) +* [OrderCancellationRequests](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/order_cancel_schema.ts) +* [OrderFillOrKillRequests](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts) +* [SignedOrders](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/signed_orders_schema.ts) +* [Token](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/token_schema.ts) +* [TxData](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/tx_data_schema.ts) + +Standard Relayer API Schemas + +* [Error response](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_error_response_schema.ts) +* [Fees payload](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts) +* [Fees response](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts) +* [Orderbook channel subscribe](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts) +* [Orderbook channel snapshot](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts) +* [Orderbook channel update](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts) +* [Orderbook response](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts) +* [Token pairs response](https://github.com/0xProject/0x-monorepo/blob/d4c1b3b0bd26e730ce6687469cdf7283877543e1/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts) diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json index f230754ec..4b7b3f642 100644 --- a/packages/website/translations/chinese.json +++ b/packages/website/translations/chinese.json @@ -57,6 +57,7 @@ "CAREERS": "人才招聘", "CONTACT": "联系方式", "DEPLOYER": "Deployer", + "JSON_SCHEMAS": "JSON Schemas", "BLOG": "博客", "FORUM": "论坛", "CONNECT": "0x 连接", diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json index 13d2c1842..52bf0ac9d 100644 --- a/packages/website/translations/english.json +++ b/packages/website/translations/english.json @@ -58,6 +58,7 @@ "CAREERS": "careers", "CONTACT": "contact", "DEPLOYER": "Deployer", + "JSON_SCHEMAS": "JSON Schemas", "BLOG": "blog", "FORUM": "forum", "CONNECT": "0x Connect", diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json index 2d32e5c81..66e4db965 100644 --- a/packages/website/translations/korean.json +++ b/packages/website/translations/korean.json @@ -57,6 +57,7 @@ "CAREERS": "채용", "CONTACT": "문의", "DEPLOYER": "Deployer", + "JSON_SCHEMAS": "JSON Schemas", "BLOG": "블로그", "FORUM": "포럼", "CONNECT": "0x Connect", diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json index 9991bb4bc..09da6015a 100644 --- a/packages/website/translations/russian.json +++ b/packages/website/translations/russian.json @@ -57,6 +57,7 @@ "CAREERS": "Карьера", "CONTACT": "Связаться с нами", "DEPLOYER": "Deployer", + "JSON_SCHEMAS": "JSON Schemas", "BLOG": "Блог", "FORUM": "Форум", "CONNECT": "0x Connect", diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json index 121115260..236bda339 100644 --- a/packages/website/translations/spanish.json +++ b/packages/website/translations/spanish.json @@ -58,6 +58,7 @@ "CAREERS": "empleo", "CONTACT": "contacto", "DEPLOYER": "Deployer", + "JSON_SCHEMAS": "JSON Schemas", "BLOG": "blog", "FORUM": "foro", "CONNECT": "0x Connect", diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 33c5ac857..6216d2146 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -8,6 +8,7 @@ const titleToIcon: { [title: string]: string } = { '0x.js': 'zeroExJs.png', Web3Wrapper: 'zeroExJs.png', Deployer: 'zeroExJs.png', + 'JSON Schemas': 'zeroExJs.png', '0x Connect': 'connect.png', '0x Smart Contracts': 'contracts.png', Wiki: 'wiki.png', diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 9cde5bf3f..9474311b4 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -151,6 +151,12 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.Deployer, Deco.CapWords)} /> , + + + , ]; const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {}; const fullWidthClasses = isFullWidthPage ? 'pr4' : ''; @@ -305,6 +311,14 @@ export class TopBar extends React.Component { )} + {!this._isViewingJsonSchemasDocs() && ( + + + {this.props.translate.get(Key.JsonSchemas, Deco.Cap)}{' '} + {this.props.translate.get(Key.Docs, Deco.Cap)} + + + )} {!this._isViewingPortal() && ( @@ -336,6 +350,7 @@ export class TopBar extends React.Component { !this._isViewingSmartContractsDocs() && !this._isViewingWeb3WrapperDocs() && !this._isViewingDeployerDocs() && + !this._isViewingJsonSchemasDocs() && !this._isViewingConnectDocs()) || _.isUndefined(this.props.menu) ) { @@ -430,6 +445,9 @@ export class TopBar extends React.Component { private _isViewingDeployerDocs() { return _.includes(this.props.location.pathname, WebsitePaths.Deployer); } + private _isViewingJsonSchemasDocs() { + return _.includes(this.props.location.pathname, WebsitePaths.JSONSchemas); + } private _isViewingWiki() { return _.includes(this.props.location.pathname, WebsitePaths.Wiki); } @@ -441,6 +459,7 @@ export class TopBar extends React.Component { this._isViewingSmartContractsDocs() || this._isViewingWeb3WrapperDocs() || this._isViewingDeployerDocs() || + this._isViewingJsonSchemasDocs() || this._isViewingConnectDocs() ); } diff --git a/packages/website/ts/containers/json_schemas_documentation.ts b/packages/website/ts/containers/json_schemas_documentation.ts new file mode 100644 index 000000000..42e441212 --- /dev/null +++ b/packages/website/ts/containers/json_schemas_documentation.ts @@ -0,0 +1,85 @@ +import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { State } from 'ts/redux/reducer'; +import { DocPackages, Environments, WebsitePaths } from 'ts/types'; +import { configs } from 'ts/utils/configs'; +import { constants } from 'ts/utils/constants'; +import { Translate } from 'ts/utils/translate'; + +/* tslint:disable:no-var-requires */ +const IntroMarkdown = require('md/docs/json_schemas/introduction'); +const InstallationMarkdown = require('md/docs/json_schemas/installation'); +const SchemasMarkdown = require('md/docs/json_schemas/schemas'); +/* tslint:enable:no-var-requires */ + +const docSections = { + introduction: 'introduction', + installation: 'installation', + schemaValidator: 'schemaValidator', + schemas: 'schemas', +}; + +const docsInfoConfig: DocsInfoConfig = { + id: DocPackages.JSONSchemas, + type: SupportedDocJson.TypeDoc, + displayName: 'JSON Schemas', + packageUrl: 'https://github.com/0xProject/0x-monorepo', + menu: { + introduction: [docSections.introduction], + install: [docSections.installation], + schemaValidator: [docSections.schemaValidator], + schemas: [docSections.schemas], + }, + sectionNameToMarkdown: { + [docSections.introduction]: IntroMarkdown, + [docSections.installation]: InstallationMarkdown, + [docSections.schemas]: SchemasMarkdown, + }, + sectionNameToModulePath: { + [docSections.schemaValidator]: ['"json-schemas/src/schema_validator"'], + }, + menuSubsectionToVersionWhenIntroduced: {}, + sections: docSections, + visibleConstructors: [docSections.schemaValidator], + typeConfigs: { + // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is + // currently no way to extract the re-exported types from index.ts via TypeDoc :( + publicTypes: [], + typeNameToExternalLink: { + Schema: + 'https://github.com/tdegrunt/jsonschema/blob/5c2edd4baba149964aec0f23c87ad12c25a50dfb/lib/index.d.ts#L49', + }, + }, +}; +const docsInfo = new DocsInfo(docsInfoConfig); + +interface ConnectedState { + docsVersion: string; + availableDocVersions: string[]; + docsInfo: DocsInfo; + translate: Translate; +} + +interface ConnectedDispatch { + dispatcher: Dispatcher; +} + +const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({ + docsVersion: state.docsVersion, + availableDocVersions: state.availableDocVersions, + translate: state.translate, + docsInfo, +}); + +const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ + dispatcher: new Dispatcher(dispatch), +}); + +export const Documentation: React.ComponentClass = connect(mapStateToProps, mapDispatchToProps)( + DocPageComponent, +); diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index cc09f2df3..b5166ebca 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -51,6 +51,9 @@ const LazyWeb3WrapperDocumentation = createLazyComponent('Documentation', async const LazyDeployerDocumentation = createLazyComponent('Documentation', async () => System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/deployer_documentation'), ); +const LazyJSONSchemasDocumentation = createLazyComponent('Documentation', async () => + System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/json_schemas_documentation'), +); analytics.init(); // tslint:disable-next-line:no-floating-promises @@ -72,6 +75,10 @@ render( + Date: Sun, 18 Mar 2018 15:08:37 +0100 Subject: Standardize all doc commands and add `docs:stage` shortcut --- packages/0x.js/package.json | 7 ++++--- packages/connect/package.json | 7 ++++--- packages/deployer/package.json | 1 + packages/json-schemas/package.json | 1 + packages/web3-wrapper/package.json | 1 + 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 4bc0cc193..3c2322227 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -15,8 +15,6 @@ "build:watch": "tsc -w", "prebuild": "run-s clean generate_contract_wrappers", "build": "run-p build:umd:prod build:commonjs; exit 0;", - "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", - "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json", "generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", "test:circleci": "run-s test:coverage", @@ -28,7 +26,10 @@ "build:umd:prod": "NODE_ENV=production webpack", "build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", "test:commonjs": "run-s build:commonjs run_mocha", - "run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit" + "run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, "config": { "artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken", diff --git a/packages/connect/package.json b/packages/connect/package.json index 63ca61693..01806092d 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -15,15 +15,16 @@ "build:watch": "tsc -w", "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", "clean": "shx rm -rf _bundles lib test_temp scripts", - "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", - "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json", "copy_test_fixtures": "copyfiles -u 2 './test/fixtures/**/*.json' ./lib/test/fixtures", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", "run_mocha": "mocha lib/test/**/*_test.js", "test": "run-s clean build copy_test_fixtures run_mocha", "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov", "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info", - "test:circleci": "yarn test:coverage" + "test:circleci": "yarn test:coverage", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, "config": { "postpublish": { diff --git a/packages/deployer/package.json b/packages/deployer/package.json index 346b967e2..8194fffcd 100644 --- a/packages/deployer/package.json +++ b/packages/deployer/package.json @@ -15,6 +15,7 @@ "migrate": "npm run build; node lib/src/cli.js migrate", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", "test:circleci": "yarn test:coverage", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json index a63d435ab..09cad732b 100644 --- a/packages/json-schemas/package.json +++ b/packages/json-schemas/package.json @@ -14,6 +14,7 @@ "run_mocha": "mocha lib/test/**/*_test.js", "clean": "shx rm -rf _bundles lib test_temp scripts", "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index 9b41f1de6..58f3f1083 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -9,6 +9,7 @@ "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts", "clean": "shx rm -rf lib scripts", "lint": "tslint --project . 'src/**/*.ts'", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, -- cgit v1.2.3 From b40fab35f6c1989fa391ac02c81150960270fc53 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 15:08:52 +0100 Subject: Add doc setup to sol-cov --- packages/sol-cov/package.json | 16 +++++++++++++++- packages/sol-cov/src/monorepo_scripts/stagedocs.ts | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 packages/sol-cov/src/monorepo_scripts/stagedocs.ts diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json index f3de566c1..21852c908 100644 --- a/packages/sol-cov/package.json +++ b/packages/sol-cov/package.json @@ -13,7 +13,20 @@ "test:circleci": "yarn test:coverage", "run_mocha": "mocha lib/test/**/*_test.js", "clean": "shx rm -rf lib scripts", - "build": "copyfiles 'test/fixtures/**/*' ./lib && tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts" + "build": "copyfiles 'test/fixtures/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" + }, + "config": { + "postpublish": { + "assets": [], + "docPublishConfigs": { + "extraFileIncludes": ["../types/src/index.ts"], + "s3BucketPath": "s3://doc-jsons/sol-cov/", + "s3StagingBucketPath": "s3://staging-doc-jsons/sol-cov/" + } + } }, "repository": { "type": "git", @@ -53,6 +66,7 @@ "npm-run-all": "^4.1.2", "shx": "^0.2.2", "tslint": "5.8.0", + "typedoc": "0xProject/typedoc", "typescript": "2.7.1", "web3-typescript-typings": "^0.9.11" } diff --git a/packages/sol-cov/src/monorepo_scripts/stagedocs.ts b/packages/sol-cov/src/monorepo_scripts/stagedocs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/sol-cov/src/monorepo_scripts/stagedocs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); -- cgit v1.2.3 From ae04f558822b3c094901036e5dcfe0c6f6aae07b Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 16:09:08 +0100 Subject: Export ErrorCallback type from Subproviders package --- packages/subproviders/CHANGELOG.md | 1 + packages/subproviders/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index cb053b620..87a2787ae 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -7,6 +7,7 @@ * Add types for `NextCallback`, `OnNextCompleted` (#426) * Introduce `JSONRPCRequestPayloadWithMethod` type * Ignore `ganache-core` dependency when using package in a browser environment. + * Export `ErrorCallback` type. ## v0.7.0 - _March 8, 2018_ diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index a8c2b5c17..9c409e3d9 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -2,7 +2,7 @@ import Eth from '@ledgerhq/hw-app-eth'; import TransportU2F from '@ledgerhq/hw-transport-u2f'; import { LedgerEthereumClient } from './types'; -export { Callback, NextCallback } from './types'; +export { Callback, ErrorCallback, NextCallback } from './types'; export { EmptyWalletSubprovider } from './subproviders/empty_wallet_subprovider'; export { FakeGasEstimateSubprovider } from './subproviders/fake_gas_estimate_subprovider'; -- cgit v1.2.3 From db030016fa2e38d4135eb2d9ff16bc65aaa1fdd9 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 16:09:37 +0100 Subject: Refactor CoverageSubprovider to use subproviders types --- packages/sol-cov/src/coverage_subprovider.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 71d90bba7..bc59d5ef8 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -1,4 +1,4 @@ -import { Callback, NextCallback, Subprovider } from '@0xproject/subproviders'; +import { Callback, ErrorCallback, NextCallback, Subprovider } from '@0xproject/subproviders'; import { promisify } from '@0xproject/utils'; import * as _ from 'lodash'; import { Lock } from 'semaphore-async-await'; @@ -35,11 +35,7 @@ export class CoverageSubprovider extends Subprovider { this._getContractCodeAsync.bind(this), ); } - public handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: NextCallback, - end: (err: Error | null, result: any) => void, - ) { + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) { switch (payload.method) { case 'eth_sendTransaction': const txData = payload.params[0]; -- cgit v1.2.3 From c1d17c83f8ee246c60b277c9c76b4eb9db1dba05 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 16:10:02 +0100 Subject: Add sol-cov docs to website --- packages/sol-cov/package.json | 2 +- packages/website/md/docs/sol_cov/installation.md | 17 +++++ packages/website/md/docs/sol_cov/introduction.md | 1 + packages/website/md/docs/sol_cov/usage.md | 26 +++++++ packages/website/translations/chinese.json | 1 + packages/website/translations/english.json | 1 + packages/website/translations/korean.json | 1 + packages/website/translations/russian.json | 1 + packages/website/translations/spanish.json | 1 + packages/website/ts/components/sidebar_header.tsx | 1 + packages/website/ts/components/top_bar/top_bar.tsx | 19 +++++ .../website/ts/containers/sol_cov_documentation.ts | 89 ++++++++++++++++++++++ packages/website/ts/index.tsx | 4 + .../website/ts/pages/documentation/doc_page.tsx | 2 + packages/website/ts/types.ts | 3 + 15 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 packages/website/md/docs/sol_cov/installation.md create mode 100644 packages/website/md/docs/sol_cov/introduction.md create mode 100644 packages/website/md/docs/sol_cov/usage.md create mode 100644 packages/website/ts/containers/sol_cov_documentation.ts diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json index 21852c908..8f3b9d794 100644 --- a/packages/sol-cov/package.json +++ b/packages/sol-cov/package.json @@ -22,7 +22,7 @@ "postpublish": { "assets": [], "docPublishConfigs": { - "extraFileIncludes": ["../types/src/index.ts"], + "extraFileIncludes": ["../subproviders/src/types.ts"], "s3BucketPath": "s3://doc-jsons/sol-cov/", "s3StagingBucketPath": "s3://staging-doc-jsons/sol-cov/" } diff --git a/packages/website/md/docs/sol_cov/installation.md b/packages/website/md/docs/sol_cov/installation.md new file mode 100644 index 000000000..17362d89a --- /dev/null +++ b/packages/website/md/docs/sol_cov/installation.md @@ -0,0 +1,17 @@ +**Install** + +```bash +npm install @0xproject/sol-cov --save +``` + +**Import** + +```javascript +import { CoverageSubprovider } from '@0xproject/sol-cov'; +``` + +or + +```javascript +var CoverageSubprovider = require('@0xproject/sol-cov').CoverageSubprovider; +``` diff --git a/packages/website/md/docs/sol_cov/introduction.md b/packages/website/md/docs/sol_cov/introduction.md new file mode 100644 index 000000000..7064a3554 --- /dev/null +++ b/packages/website/md/docs/sol_cov/introduction.md @@ -0,0 +1 @@ +Welcome to the [@0xproject/sol-cov](https://github.com/0xProject/0x-monorepo/tree/development/packages/sol-cov) documentation! Sol-cov is a Solidity coverage tool for your smart contract tests. diff --git a/packages/website/md/docs/sol_cov/usage.md b/packages/website/md/docs/sol_cov/usage.md new file mode 100644 index 000000000..ea1982d97 --- /dev/null +++ b/packages/website/md/docs/sol_cov/usage.md @@ -0,0 +1,26 @@ +Sol-cov uses transaction traces in order to figure out which lines of Solidity source code have been covered by your tests. In order for it to gather these traces, you must add the `CoverageSubprovider` to the [ProviderEngine](https://github.com/MetaMask/provider-engine) instance you use when running your Solidity tests. If you're unfamiliar with ProviderEngine, please read the [Web3 Provider explained](https://0xproject.com/wiki#Web3-Provider-Explained) wiki article. + +The CoverageSubprovider eavesdrops on the `eth_sendTransaction` and `eth_call` RPC calls and collects traces after each call using `debug_traceTransaction`. `eth_call`'s' don't generate traces - so we take a snapshot, re-submit it as a transaction, get the trace and then revert the snapshot. + +```typescript +import { CoverageSubprovider } from '@0xproject/sol-cov'; + +const provider = new ProviderEngine(); + +const artifactsPath = 'src/artifacts'; +const contractsPath = 'src/contracts'; +const networkId = 50; +// Some calls might not have `from` address specified. Nevertheless - transactions need to be submitted from an address with at least some funds. defaultFromAddress is the address that will be used to submit those calls as transactions from. +const defaultFromAddress = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; +const coverageSubprovider = new CoverageSubprovider(artifactsPath, contractsPath, networkId, defaultFromAddress); + +provider.addProvider(coverageSubprovider); +``` + +After your test suite is complete (e.g global `after` hook), you'll need to call: + +```typescript +await coverageSubprovider.writeCoverageAsync(); +``` + +This will create a `coverage.json` file in the `coverage` directory. This file has an [Istanbul format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md) - so you can use any of the existing Instanbul reporters. diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json index 4b7b3f642..a46d12747 100644 --- a/packages/website/translations/chinese.json +++ b/packages/website/translations/chinese.json @@ -58,6 +58,7 @@ "CONTACT": "联系方式", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", + "SOL_COV": "Solidty Coverage", "BLOG": "博客", "FORUM": "论坛", "CONNECT": "0x 连接", diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json index 52bf0ac9d..3b9818909 100644 --- a/packages/website/translations/english.json +++ b/packages/website/translations/english.json @@ -59,6 +59,7 @@ "CONTACT": "contact", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", + "SOL_COV": "Solidty Coverage", "BLOG": "blog", "FORUM": "forum", "CONNECT": "0x Connect", diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json index 66e4db965..6bc78cd4f 100644 --- a/packages/website/translations/korean.json +++ b/packages/website/translations/korean.json @@ -58,6 +58,7 @@ "CONTACT": "문의", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", + "SOL_COV": "Solidty Coverage", "BLOG": "블로그", "FORUM": "포럼", "CONNECT": "0x Connect", diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json index 09da6015a..68ebed30b 100644 --- a/packages/website/translations/russian.json +++ b/packages/website/translations/russian.json @@ -58,6 +58,7 @@ "CONTACT": "Связаться с нами", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", + "SOL_COV": "Solidty Coverage", "BLOG": "Блог", "FORUM": "Форум", "CONNECT": "0x Connect", diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json index 236bda339..cd508f00a 100644 --- a/packages/website/translations/spanish.json +++ b/packages/website/translations/spanish.json @@ -59,6 +59,7 @@ "CONTACT": "contacto", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", + "SOL_COV": "Solidty Coverage", "BLOG": "blog", "FORUM": "foro", "CONNECT": "0x Connect", diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 6216d2146..6fae03691 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -8,6 +8,7 @@ const titleToIcon: { [title: string]: string } = { '0x.js': 'zeroExJs.png', Web3Wrapper: 'zeroExJs.png', Deployer: 'zeroExJs.png', + 'Sol-cov': 'zeroExJs.png', 'JSON Schemas': 'zeroExJs.png', '0x Connect': 'connect.png', '0x Smart Contracts': 'contracts.png', diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 9474311b4..fd33e8605 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -157,6 +157,12 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.JsonSchemas, Deco.CapWords)} /> , + + + , ]; const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {}; const fullWidthClasses = isFullWidthPage ? 'pr4' : ''; @@ -319,6 +325,14 @@ export class TopBar extends React.Component { )} + {!this._isViewingSolCovDocs() && ( + + + {this.props.translate.get(Key.SolCov, Deco.Cap)}{' '} + {this.props.translate.get(Key.Docs, Deco.Cap)} + + + )} {!this._isViewingPortal() && ( @@ -351,6 +365,7 @@ export class TopBar extends React.Component { !this._isViewingWeb3WrapperDocs() && !this._isViewingDeployerDocs() && !this._isViewingJsonSchemasDocs() && + !this._isViewingSolCovDocs() && !this._isViewingConnectDocs()) || _.isUndefined(this.props.menu) ) { @@ -448,6 +463,9 @@ export class TopBar extends React.Component { private _isViewingJsonSchemasDocs() { return _.includes(this.props.location.pathname, WebsitePaths.JSONSchemas); } + private _isViewingSolCovDocs() { + return _.includes(this.props.location.pathname, WebsitePaths.SolCov); + } private _isViewingWiki() { return _.includes(this.props.location.pathname, WebsitePaths.Wiki); } @@ -460,6 +478,7 @@ export class TopBar extends React.Component { this._isViewingWeb3WrapperDocs() || this._isViewingDeployerDocs() || this._isViewingJsonSchemasDocs() || + this._isViewingSolCovDocs() || this._isViewingConnectDocs() ); } diff --git a/packages/website/ts/containers/sol_cov_documentation.ts b/packages/website/ts/containers/sol_cov_documentation.ts new file mode 100644 index 000000000..2b901ec6f --- /dev/null +++ b/packages/website/ts/containers/sol_cov_documentation.ts @@ -0,0 +1,89 @@ +import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { State } from 'ts/redux/reducer'; +import { DocPackages, Environments, WebsitePaths } from 'ts/types'; +import { configs } from 'ts/utils/configs'; +import { constants } from 'ts/utils/constants'; +import { Translate } from 'ts/utils/translate'; + +/* tslint:disable:no-var-requires */ +const IntroMarkdown = require('md/docs/sol_cov/introduction'); +const InstallationMarkdown = require('md/docs/sol_cov/installation'); +const UsageMarkdown = require('md/docs/sol_cov/usage'); +/* tslint:enable:no-var-requires */ + +const docSections = { + introduction: 'introduction', + installation: 'installation', + usage: 'usage', + coverageSubprovider: 'coverageSubprovider', + types: docConstants.TYPES_SECTION_NAME, +}; + +const docsInfoConfig: DocsInfoConfig = { + id: DocPackages.SolCov, + type: SupportedDocJson.TypeDoc, + displayName: 'Sol-cov', + packageUrl: 'https://github.com/0xProject/0x-monorepo', + menu: { + introduction: [docSections.introduction], + install: [docSections.installation], + usage: [docSections.usage], + coverageSubprovider: [docSections.coverageSubprovider], + types: [docSections.types], + }, + sectionNameToMarkdown: { + [docSections.introduction]: IntroMarkdown, + [docSections.installation]: InstallationMarkdown, + [docSections.usage]: UsageMarkdown, + }, + sectionNameToModulePath: { + [docSections.coverageSubprovider]: ['"sol-cov/src/coverage_subprovider"'], + [docSections.types]: ['"subproviders/src/types"'], + }, + menuSubsectionToVersionWhenIntroduced: {}, + sections: docSections, + visibleConstructors: [docSections.coverageSubprovider], + typeConfigs: { + // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is + // currently no way to extract the re-exported types from index.ts via TypeDoc :( + publicTypes: ['NextCallback', 'OnNextCompleted', 'ErrorCallback'], + typeNameToExternalLink: {}, + typeNameToPrefix: { + JSONRPCRequestPayload: 'Web3', + }, + typeNameToDocSection: {}, + }, +}; +const docsInfo = new DocsInfo(docsInfoConfig); + +interface ConnectedState { + docsVersion: string; + availableDocVersions: string[]; + docsInfo: DocsInfo; + translate: Translate; +} + +interface ConnectedDispatch { + dispatcher: Dispatcher; +} + +const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({ + docsVersion: state.docsVersion, + availableDocVersions: state.availableDocVersions, + translate: state.translate, + docsInfo, +}); + +const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ + dispatcher: new Dispatcher(dispatch), +}); + +export const Documentation: React.ComponentClass = connect(mapStateToProps, mapDispatchToProps)( + DocPageComponent, +); diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index b5166ebca..1241c222b 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -54,6 +54,9 @@ const LazyDeployerDocumentation = createLazyComponent('Documentation', async () const LazyJSONSchemasDocumentation = createLazyComponent('Documentation', async () => System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/json_schemas_documentation'), ); +const LazySolCovDocumentation = createLazyComponent('Documentation', async () => + System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/sol_cov_documentation'), +); analytics.init(); // tslint:disable-next-line:no-floating-promises @@ -75,6 +78,7 @@ render( + Date: Sun, 18 Mar 2018 16:12:24 +0100 Subject: Re-order developers dropdown --- packages/website/ts/components/top_bar/top_bar.tsx | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index fd33e8605..66efe0d24 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -120,25 +120,6 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.StandardRelayerApi, Deco.CapWords)} /> , - - - , - - - , { primaryText={this.props.translate.get(Key.SolCov, Deco.CapWords)} /> , + + + , + + + , ]; const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {}; const fullWidthClasses = isFullWidthPage ? 'pr4' : ''; -- cgit v1.2.3 From 4941ffd354a7bbc4fb48cd66acd6db1e36d5ed87 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 18:43:38 +0100 Subject: Add functions to submenu in sidebar --- packages/react-docs/src/docs_info.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/react-docs/src/docs_info.ts b/packages/react-docs/src/docs_info.ts index 68bddef06..0030568a1 100644 --- a/packages/react-docs/src/docs_info.ts +++ b/packages/react-docs/src/docs_info.ts @@ -97,6 +97,9 @@ export class DocsInfo { const sortedMethodNames = _.sortBy(docSection.methods, 'name'); const methodNames = _.map(sortedMethodNames, m => m.name); menuSubsectionsBySection[sectionName] = [...methodNames, ...eventNames]; + const sortedFunctionNames = _.sortBy(docSection.functions, 'name'); + const functionNames = _.map(sortedFunctionNames, m => m.name); + menuSubsectionsBySection[sectionName] = [...eventNames, ...functionNames, ...methodNames]; } }); return menuSubsectionsBySection; -- cgit v1.2.3 From 794b155827868d67f1cec45bbe8c3a3e4be02597 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 18:44:52 +0100 Subject: Add support for displaying exported functions --- packages/react-docs/CHANGELOG.md | 3 + .../react-docs/src/components/documentation.tsx | 26 ++-- packages/react-docs/src/components/interface.tsx | 10 +- .../react-docs/src/components/method_block.tsx | 150 -------------------- .../react-docs/src/components/method_signature.tsx | 128 ----------------- packages/react-docs/src/components/signature.tsx | 131 ++++++++++++++++++ .../react-docs/src/components/signature_block.tsx | 154 +++++++++++++++++++++ packages/react-docs/src/components/type.tsx | 10 +- .../react-docs/src/components/type_definition.tsx | 10 +- packages/react-docs/src/index.ts | 4 +- packages/react-docs/src/types.ts | 16 +++ packages/react-docs/src/utils/typedoc_utils.ts | 52 ++++++- 12 files changed, 391 insertions(+), 303 deletions(-) delete mode 100644 packages/react-docs/src/components/method_block.tsx delete mode 100644 packages/react-docs/src/components/method_signature.tsx create mode 100644 packages/react-docs/src/components/signature.tsx create mode 100644 packages/react-docs/src/components/signature_block.tsx diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md index 7f860739f..aa1c3c210 100644 --- a/packages/react-docs/CHANGELOG.md +++ b/packages/react-docs/CHANGELOG.md @@ -5,3 +5,6 @@ * Move example out into a separate sub-package * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452) * Handle `reflection` type rendering so that anonymous function type declarations render properly + * Rename `MethodSignature` to `Signature` and change it's props so that it can be used to render method and function signatures. + * Rename `MethodBlock` to `SignatureBlock` since it is not used to render method and function signature blocks. + * Add support for documenting exported functions. diff --git a/packages/react-docs/src/components/documentation.tsx b/packages/react-docs/src/components/documentation.tsx index b46358159..67523dcc3 100644 --- a/packages/react-docs/src/components/documentation.tsx +++ b/packages/react-docs/src/components/documentation.tsx @@ -25,6 +25,7 @@ import { SolidityMethod, SupportedDocJson, TypeDefinitionByName, + TypescriptFunction, TypescriptMethod, } from '../types'; import { constants } from '../utils/constants'; @@ -33,7 +34,7 @@ import { utils } from '../utils/utils'; import { Badge } from './badge'; import { Comment } from './comment'; import { EventDefinition } from './event_definition'; -import { MethodBlock } from './method_block'; +import { SignatureBlock } from './signature_block'; import { SourceLink } from './source_link'; import { Type } from './type'; import { TypeDefinition } from './type_definition'; @@ -216,8 +217,12 @@ export class Documentation extends React.Component { - const isConstructor = false; - return this._renderMethodBlocks(method, sectionName, isConstructor, typeDefinitionByName); + return this._renderSignatureBlocks(method, sectionName, typeDefinitionByName); + }); + + const sortedFunctions = _.sortBy(docSection.functions, 'name'); + const functionDefs = _.map(sortedFunctions, func => { + return this._renderSignatureBlocks(func, sectionName, typeDefinitionByName); }); const sortedEvents = _.sortBy(docSection.events, 'name'); @@ -262,6 +267,12 @@ export class Documentation extends React.Component{methodDefs} )} + {docSection.functions.length > 0 && ( +
+

Functions

+
{functionDefs}
+
+ )} {!_.isUndefined(docSection.events) && docSection.events.length > 0 && (
@@ -318,7 +329,7 @@ export class Documentation extends React.Component { - return this._renderMethodBlocks(constructor, sectionName, constructor.isConstructor, typeDefinitionByName); + return this._renderSignatureBlocks(constructor, sectionName, typeDefinitionByName); }); return
{constructorDefs}
; } @@ -340,14 +351,13 @@ export class Documentation extends React.Component ); } - private _renderMethodBlocks( - method: SolidityMethod | TypescriptMethod, + private _renderSignatureBlocks( + method: SolidityMethod | TypescriptFunction | TypescriptMethod, sectionName: string, - isConstructor: boolean, typeDefinitionByName: TypeDefinitionByName, ): React.ReactNode { return ( - ) : ( - { - constructor(props: MethodBlockProps) { - super(props); - this.state = { - shouldShowAnchor: false, - }; - } - public render() { - const method = this.props.method; - if (typeDocUtils.isPrivateOrProtectedProperty(method.name)) { - return null; - } - - return ( -
- {!method.isConstructor && ( -
- {(method as TypescriptMethod).isStatic && this._renderChip('Static')} - {(method as SolidityMethod).isConstant && this._renderChip('Constant')} - {(method as SolidityMethod).isPayable && this._renderChip('Payable')} -
- -
-
- )} - - - - {(method as TypescriptMethod).source && ( - - )} - {method.comment && } - {method.parameters && - !_.isEmpty(method.parameters) && ( -
-

- ARGUMENTS -

- {this._renderParameterDescriptions(method.parameters)} -
- )} - {method.returnComment && ( -
-

- RETURNS -

- -
- )} -
- ); - } - private _renderChip(text: string) { - return ( -
- {text} -
- ); - } - private _renderParameterDescriptions(parameters: Parameter[]) { - const descriptions = _.map(parameters, parameter => { - const isOptional = parameter.isOptional; - return ( -
-
-
- {parameter.name} -
-
- {isOptional && 'optional'} -
-
-
- {parameter.comment && } -
-
- ); - }); - return descriptions; - } - private _setAnchorVisibility(shouldShowAnchor: boolean) { - this.setState({ - shouldShowAnchor, - }); - } -} diff --git a/packages/react-docs/src/components/method_signature.tsx b/packages/react-docs/src/components/method_signature.tsx deleted file mode 100644 index 1400182ea..000000000 --- a/packages/react-docs/src/components/method_signature.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import * as _ from 'lodash'; -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; - -import { DocsInfo } from '../docs_info'; -import { Parameter, SolidityMethod, TypeDefinitionByName, TypescriptMethod } from '../types'; -import { constants } from '../utils/constants'; - -import { Type } from './type'; - -export interface MethodSignatureProps { - method: TypescriptMethod | SolidityMethod; - sectionName: string; - shouldHideMethodName?: boolean; - shouldUseArrowSyntax?: boolean; - typeDefinitionByName?: TypeDefinitionByName; - docsInfo: DocsInfo; -} - -const defaultProps = { - shouldHideMethodName: false, - shouldUseArrowSyntax: false, -}; - -export const MethodSignature: React.SFC = (props: MethodSignatureProps) => { - const sectionName = constants.TYPES_SECTION_NAME; - const parameters = renderParameters(props.method, props.docsInfo, sectionName, props.typeDefinitionByName); - const paramStringArray: any[] = []; - // HACK: For now we don't put params on newlines if there are less then 2 of them. - // Ideally we would check the character length of the resulting method signature and - // if it exceeds the available space, put params on their own lines. - const hasMoreThenTwoParams = parameters.length > 2; - _.each(parameters, (param: React.ReactNode, i: number) => { - const finalParam = hasMoreThenTwoParams ? ( - - {param} - - ) : ( - param - ); - paramStringArray.push(finalParam); - const comma = hasMoreThenTwoParams ? ( - - ,
-
- ) : ( - ', ' - ); - paramStringArray.push(comma); - }); - if (!hasMoreThenTwoParams) { - paramStringArray.pop(); - } - const methodName = props.shouldHideMethodName ? '' : props.method.name; - const typeParameterIfExists = _.isUndefined((props.method as TypescriptMethod).typeParameter) - ? undefined - : renderTypeParameter(props.method, props.docsInfo, sectionName, props.typeDefinitionByName); - return ( - - {props.method.callPath} - {methodName} - {typeParameterIfExists}({hasMoreThenTwoParams &&
} - {paramStringArray}) - {props.method.returnType && ( - - {props.shouldUseArrowSyntax ? ' => ' : ': '}{' '} - - - )} -
- ); -}; - -MethodSignature.defaultProps = defaultProps; - -function renderParameters( - method: TypescriptMethod | SolidityMethod, - docsInfo: DocsInfo, - sectionName: string, - typeDefinitionByName?: TypeDefinitionByName, -) { - const parameters = method.parameters; - const params = _.map(parameters, (p: Parameter) => { - const isOptional = p.isOptional; - const type = ( - - ); - return ( - - {p.name} - {isOptional && '?'}: {type} - - ); - }); - return params; -} - -function renderTypeParameter( - method: TypescriptMethod, - docsInfo: DocsInfo, - sectionName: string, - typeDefinitionByName?: TypeDefinitionByName, -) { - const typeParameter = method.typeParameter; - const typeParam = ( - - {`<${typeParameter.name} extends `} - - {`>`} - - ); - return typeParam; -} diff --git a/packages/react-docs/src/components/signature.tsx b/packages/react-docs/src/components/signature.tsx new file mode 100644 index 000000000..83fb1e246 --- /dev/null +++ b/packages/react-docs/src/components/signature.tsx @@ -0,0 +1,131 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +import { DocsInfo } from '../docs_info'; +import { Parameter, Type as TypeDef, TypeDefinitionByName, TypeParameter } from '../types'; +import { constants } from '../utils/constants'; + +import { Type } from './type'; + +export interface SignatureProps { + name: string; + returnType: TypeDef; + parameters: Parameter[]; + sectionName: string; + shouldHideMethodName?: boolean; + shouldUseArrowSyntax?: boolean; + typeDefinitionByName?: TypeDefinitionByName; + typeParameter?: TypeParameter; + callPath?: string; + docsInfo: DocsInfo; +} + +const defaultProps = { + shouldHideMethodName: false, + shouldUseArrowSyntax: false, + callPath: '', +}; + +export const Signature: React.SFC = (props: SignatureProps) => { + const sectionName = constants.TYPES_SECTION_NAME; + const parameters = renderParameters(props.parameters, props.docsInfo, sectionName, props.typeDefinitionByName); + const paramStringArray: any[] = []; + // HACK: For now we don't put params on newlines if there are less then 2 of them. + // Ideally we would check the character length of the resulting method signature and + // if it exceeds the available space, put params on their own lines. + const hasMoreThenTwoParams = parameters.length > 2; + _.each(parameters, (param: React.ReactNode, i: number) => { + const finalParam = hasMoreThenTwoParams ? ( + + {param} + + ) : ( + param + ); + paramStringArray.push(finalParam); + const comma = hasMoreThenTwoParams ? ( + + ,
+
+ ) : ( + ', ' + ); + paramStringArray.push(comma); + }); + if (!hasMoreThenTwoParams) { + paramStringArray.pop(); + } + const methodName = props.shouldHideMethodName ? '' : props.name; + const typeParameterIfExists = _.isUndefined(props.typeParameter) + ? undefined + : renderTypeParameter(props.typeParameter, props.docsInfo, sectionName, props.typeDefinitionByName); + return ( + + {props.callPath} + {methodName} + {typeParameterIfExists}({hasMoreThenTwoParams &&
} + {paramStringArray}) + {props.returnType && ( + + {props.shouldUseArrowSyntax ? ' => ' : ': '}{' '} + + + )} +
+ ); +}; + +Signature.defaultProps = defaultProps; + +function renderParameters( + parameters: Parameter[], + docsInfo: DocsInfo, + sectionName: string, + typeDefinitionByName?: TypeDefinitionByName, +) { + const params = _.map(parameters, (p: Parameter) => { + const isOptional = p.isOptional; + const type = ( + + ); + return ( + + {p.name} + {isOptional && '?'}: {type} + + ); + }); + return params; +} + +function renderTypeParameter( + typeParameter: TypeParameter, + docsInfo: DocsInfo, + sectionName: string, + typeDefinitionByName?: TypeDefinitionByName, +) { + const typeParam = ( + + {`<${typeParameter.name} extends `} + + {`>`} + + ); + return typeParam; +} diff --git a/packages/react-docs/src/components/signature_block.tsx b/packages/react-docs/src/components/signature_block.tsx new file mode 100644 index 000000000..6475d3995 --- /dev/null +++ b/packages/react-docs/src/components/signature_block.tsx @@ -0,0 +1,154 @@ +import { AnchorTitle, colors, HeaderSizes, Styles } from '@0xproject/react-shared'; +import * as _ from 'lodash'; +import * as React from 'react'; + +import { DocsInfo } from '../docs_info'; +import { Parameter, SolidityMethod, TypeDefinitionByName, TypescriptFunction, TypescriptMethod } from '../types'; +import { constants } from '../utils/constants'; +import { typeDocUtils } from '../utils/typedoc_utils'; + +import { Comment } from './comment'; +import { Signature } from './signature'; +import { SourceLink } from './source_link'; + +export interface SignatureBlockProps { + method: SolidityMethod | TypescriptFunction | TypescriptMethod; + sectionName: string; + libraryVersion: string; + typeDefinitionByName: TypeDefinitionByName; + docsInfo: DocsInfo; + sourceUrl: string; +} + +export interface SignatureBlockState { + shouldShowAnchor: boolean; +} + +const styles: Styles = { + chip: { + fontSize: 13, + backgroundColor: colors.lightBlueA700, + color: colors.white, + height: 11, + borderRadius: 14, + lineHeight: 0.9, + }, +}; + +export class SignatureBlock extends React.Component { + constructor(props: SignatureBlockProps) { + super(props); + this.state = { + shouldShowAnchor: false, + }; + } + public render() { + const method = this.props.method; + if (typeDocUtils.isPrivateOrProtectedProperty(method.name)) { + return null; + } + + return ( +
+ {!(method as TypescriptMethod).isConstructor && ( +
+ {(method as TypescriptMethod).isStatic && this._renderChip('Static')} + {(method as SolidityMethod).isConstant && this._renderChip('Constant')} + {(method as SolidityMethod).isPayable && this._renderChip('Payable')} +
+ +
+
+ )} + + + + {(method as TypescriptMethod).source && ( + + )} + {method.comment && } + {method.parameters && + !_.isEmpty(method.parameters) && ( +
+

+ ARGUMENTS +

+ {this._renderParameterDescriptions(method.parameters)} +
+ )} + {method.returnComment && ( +
+

+ RETURNS +

+ +
+ )} +
+ ); + } + private _renderChip(text: string) { + return ( +
+ {text} +
+ ); + } + private _renderParameterDescriptions(parameters: Parameter[]) { + const descriptions = _.map(parameters, parameter => { + const isOptional = parameter.isOptional; + return ( +
+
+
+ {parameter.name} +
+
+ {isOptional && 'optional'} +
+
+
+ {parameter.comment && } +
+
+ ); + }); + return descriptions; + } + private _setAnchorVisibility(shouldShowAnchor: boolean) { + this.setState({ + shouldShowAnchor, + }); + } +} diff --git a/packages/react-docs/src/components/type.tsx b/packages/react-docs/src/components/type.tsx index b253f0397..fd4562ce3 100644 --- a/packages/react-docs/src/components/type.tsx +++ b/packages/react-docs/src/components/type.tsx @@ -9,7 +9,7 @@ import { Type as TypeDef, TypeDefinitionByName, TypeDocTypes } from '../types'; import { constants } from '../utils/constants'; import { utils } from '../utils/utils'; -import { MethodSignature } from './method_signature'; +import { Signature } from './signature'; import { TypeDefinition } from './type_definition'; const typeToSection: { [typeName: string]: string } = { @@ -104,8 +104,12 @@ export function Type(props: TypeProps): any { case TypeDocTypes.Reflection: typeName = ( - ) : ( - ; properties: Property[]; types: CustomType[]; + functions?: TypescriptFunction[]; events?: Event[]; } @@ -117,6 +120,11 @@ export interface TypescriptMethod extends BaseMethod { typeParameter?: TypeParameter; } +export interface TypescriptFunction extends BaseFunction { + source?: Source; + typeParameter?: TypeParameter; +} + export interface SolidityMethod extends BaseMethod { isConstant?: boolean; isPayable?: boolean; @@ -205,6 +213,14 @@ export interface BaseMethod { comment?: string; } +export interface BaseFunction { + name: string; + returnComment?: string | undefined; + parameters: Parameter[]; + returnType: Type; + comment?: string; +} + export interface TypeDefinitionByName { [typeName: string]: CustomType; } diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index e4cea1e40..4c7617234 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -15,6 +15,7 @@ import { TypeDocNode, TypeDocType, TypeParameter, + TypescriptFunction, TypescriptMethod, } from '../types'; import { utils } from '../utils/utils'; @@ -81,17 +82,16 @@ export const typeDocUtils = { } } - // Since the `types.ts` file is the only file that does not export a module/class but - // instead has each type export itself, we do not need to go down two levels of nesting - // for it. let entities; let packageComment = ''; - if (sectionName === docsInfo.sections.types) { - entities = packageDefinitionWithMergedChildren.children; - } else { + // HACK: We assume 1 exported class per file + const isClassExport = packageDefinitionWithMergedChildren.children[0].kindString === KindString.Class; + if (isClassExport) { entities = packageDefinitionWithMergedChildren.children[0].children; const commentObj = packageDefinitionWithMergedChildren.children[0].comment; packageComment = !_.isUndefined(commentObj) ? commentObj.shortText : packageComment; + } else { + entities = packageDefinitionWithMergedChildren.children; } const docSection = typeDocUtils._convertEntitiesToDocSection(entities, docsInfo, sectionName); @@ -105,6 +105,7 @@ export const typeDocUtils = { comment: '', constructors: [], methods: [], + functions: [], properties: [], types: [], }; @@ -124,6 +125,13 @@ export const typeDocUtils = { docSection.constructors.push(constructor); break; + case KindString.Function: + if (entity.flags.isExported) { + const func = typeDocUtils._convertFunction(entity, docsInfo.sections, sectionName, docsInfo.id); + docSection.functions.push(func); + } + break; + case KindString.Method: if (entity.flags.isPublic) { isConstructor = false; @@ -303,6 +311,38 @@ export const typeDocUtils = { }; return method; }, + _convertFunction( + entity: TypeDocNode, + sections: SectionsMap, + sectionName: string, + docId: string, + ): TypescriptFunction { + const signature = entity.signatures[0]; + const source = entity.sources[0]; + const hasComment = !_.isUndefined(signature.comment); + + const parameters = _.map(signature.parameters, param => { + return typeDocUtils._convertParameter(param, sections, sectionName, docId); + }); + const returnType = typeDocUtils._convertType(signature.type, sections, sectionName, docId); + const typeParameter = _.isUndefined(signature.typeParameter) + ? undefined + : typeDocUtils._convertTypeParameter(signature.typeParameter[0], sections, sectionName, docId); + + const func = { + name: signature.name, + comment: hasComment ? signature.comment.shortText : undefined, + returnComment: hasComment && signature.comment.returns ? signature.comment.returns : undefined, + source: { + fileName: source.fileName, + line: source.line, + }, + parameters, + returnType, + typeParameter, + }; + return func; + }, _convertTypeParameter( entity: TypeDocNode, sections: SectionsMap, -- cgit v1.2.3 From 87044313c2219f7130c1856f636f3db29b0fd1c4 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Sun, 18 Mar 2018 18:45:06 +0100 Subject: Capitalize rather then upper-case section headers --- packages/react-shared/src/components/section_header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-shared/src/components/section_header.tsx b/packages/react-shared/src/components/section_header.tsx index ee34a6c09..2ef5f61ee 100644 --- a/packages/react-shared/src/components/section_header.tsx +++ b/packages/react-shared/src/components/section_header.tsx @@ -48,7 +48,7 @@ export class SectionHeader extends React.Component Date: Sun, 18 Mar 2018 19:04:16 +0100 Subject: Add Subprovider docs to website --- packages/subproviders/package.json | 16 ++- .../subproviders/src/monorepo_scripts/stagedocs.ts | 8 ++ .../website/md/docs/subproviders/installation.md | 15 +++ .../website/md/docs/subproviders/introduction.md | 1 + packages/website/translations/chinese.json | 3 +- packages/website/translations/english.json | 3 +- packages/website/translations/korean.json | 3 +- packages/website/translations/russian.json | 3 +- packages/website/translations/spanish.json | 3 +- packages/website/ts/components/sidebar_header.tsx | 1 + packages/website/ts/components/top_bar/top_bar.tsx | 33 +++-- .../ts/containers/subproviders_documentation.ts | 137 +++++++++++++++++++++ packages/website/ts/index.tsx | 7 ++ .../website/ts/pages/documentation/doc_page.tsx | 2 + packages/website/ts/types.ts | 3 + 15 files changed, 225 insertions(+), 13 deletions(-) create mode 100644 packages/subproviders/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/website/md/docs/subproviders/installation.md create mode 100644 packages/website/md/docs/subproviders/introduction.md create mode 100644 packages/website/ts/containers/subproviders_documentation.ts diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index 58b518079..f6869c5c0 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -17,7 +17,20 @@ "test:circleci": "npm run test:unit:coverage", "test:all": "run-s test:unit test:integration", "test:unit": "run-s clean build run_mocha_unit", - "test:integration": "run-s clean build run_mocha_integration" + "test:integration": "run-s clean build run_mocha_integration", + "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", + "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" + }, + "config": { + "postpublish": { + "assets": [], + "docPublishConfigs": { + "extraFileIncludes": ["../types/src/index.ts"], + "s3BucketPath": "s3://doc-jsons/subproviders/", + "s3StagingBucketPath": "s3://staging-doc-jsons/subproviders/" + } + } }, "dependencies": { "@0xproject/assert": "^0.2.0", @@ -57,6 +70,7 @@ "tslint": "5.8.0", "types-bn": "^0.0.1", "types-ethereumjs-util": "0xProject/types-ethereumjs-util", + "typedoc": "0xProject/typedoc", "typescript": "2.7.1", "webpack": "^3.1.0" }, diff --git a/packages/subproviders/src/monorepo_scripts/stagedocs.ts b/packages/subproviders/src/monorepo_scripts/stagedocs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/subproviders/src/monorepo_scripts/stagedocs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/website/md/docs/subproviders/installation.md b/packages/website/md/docs/subproviders/installation.md new file mode 100644 index 000000000..a049ff0ec --- /dev/null +++ b/packages/website/md/docs/subproviders/installation.md @@ -0,0 +1,15 @@ +```bash +npm install @0xproject/subproviders --save +``` + +**Import** + +```typescript +import { LedgerSubprovider } from '@0xproject/subproviders'; +``` + +or + +```javascript +var LedgerSubprovider = require('@0xproject/subproviders').LedgerSubprovider; +``` diff --git a/packages/website/md/docs/subproviders/introduction.md b/packages/website/md/docs/subproviders/introduction.md new file mode 100644 index 000000000..835201064 --- /dev/null +++ b/packages/website/md/docs/subproviders/introduction.md @@ -0,0 +1 @@ +Welcome to the [Subproviders](https://github.com/0xProject/0x-monorepo/tree/development/packages/subproviders) documentation! Subproviders is a package containing useful [subproviders](https://0xproject.com/wiki#Web3-Provider-Explained) that can be used with the [Web3 Provider Engine](https://github.com/MetaMask/provider-engine) library. diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json index a46d12747..f610bf56c 100644 --- a/packages/website/translations/chinese.json +++ b/packages/website/translations/chinese.json @@ -58,7 +58,8 @@ "CONTACT": "联系方式", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", - "SOL_COV": "Solidty Coverage", + "SOL_COV": "Solidity Coverage", + "SUBPROVIDERS": "Subproviders", "BLOG": "博客", "FORUM": "论坛", "CONNECT": "0x 连接", diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json index 3b9818909..122d445cb 100644 --- a/packages/website/translations/english.json +++ b/packages/website/translations/english.json @@ -59,7 +59,8 @@ "CONTACT": "contact", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", - "SOL_COV": "Solidty Coverage", + "SOL_COV": "Solidity Coverage", + "SUBPROVIDERS": "Subproviders", "BLOG": "blog", "FORUM": "forum", "CONNECT": "0x Connect", diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json index 6bc78cd4f..dd5f19b16 100644 --- a/packages/website/translations/korean.json +++ b/packages/website/translations/korean.json @@ -58,7 +58,8 @@ "CONTACT": "문의", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", - "SOL_COV": "Solidty Coverage", + "SOL_COV": "Solidity Coverage", + "SUBPROVIDERS": "Subproviders", "BLOG": "블로그", "FORUM": "포럼", "CONNECT": "0x Connect", diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json index 68ebed30b..5a8e2c539 100644 --- a/packages/website/translations/russian.json +++ b/packages/website/translations/russian.json @@ -58,7 +58,8 @@ "CONTACT": "Связаться с нами", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", - "SOL_COV": "Solidty Coverage", + "SOL_COV": "Solidity Coverage", + "SUBPROVIDERS": "Subproviders", "BLOG": "Блог", "FORUM": "Форум", "CONNECT": "0x Connect", diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json index cd508f00a..dd34e805c 100644 --- a/packages/website/translations/spanish.json +++ b/packages/website/translations/spanish.json @@ -59,7 +59,8 @@ "CONTACT": "contacto", "DEPLOYER": "Deployer", "JSON_SCHEMAS": "JSON Schemas", - "SOL_COV": "Solidty Coverage", + "SOL_COV": "Solidity Coverage", + "SUBPROVIDERS": "Subproviders", "BLOG": "blog", "FORUM": "foro", "CONNECT": "0x Connect", diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 6fae03691..556243430 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -10,6 +10,7 @@ const titleToIcon: { [title: string]: string } = { Deployer: 'zeroExJs.png', 'Sol-cov': 'zeroExJs.png', 'JSON Schemas': 'zeroExJs.png', + Subproviders: 'zeroExJs.png', '0x Connect': 'connect.png', '0x Smart Contracts': 'contracts.png', Wiki: 'wiki.png', diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 66efe0d24..3a6ceed34 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -120,22 +120,28 @@ export class TopBar extends React.Component { primaryText={this.props.translate.get(Key.StandardRelayerApi, Deco.CapWords)} /> , - + , - + , - + + , + + , @@ -333,6 +339,14 @@ export class TopBar extends React.Component { )} + {!this._isViewingSubprovidersDocs() && ( + + + {this.props.translate.get(Key.Subproviders, Deco.Cap)}{' '} + {this.props.translate.get(Key.Docs, Deco.Cap)} + + + )} {!this._isViewingPortal() && ( @@ -366,6 +380,7 @@ export class TopBar extends React.Component { !this._isViewingDeployerDocs() && !this._isViewingJsonSchemasDocs() && !this._isViewingSolCovDocs() && + !this._isViewingSubprovidersDocs() && !this._isViewingConnectDocs()) || _.isUndefined(this.props.menu) ) { @@ -466,6 +481,9 @@ export class TopBar extends React.Component { private _isViewingSolCovDocs() { return _.includes(this.props.location.pathname, WebsitePaths.SolCov); } + private _isViewingSubprovidersDocs() { + return _.includes(this.props.location.pathname, WebsitePaths.Subproviders); + } private _isViewingWiki() { return _.includes(this.props.location.pathname, WebsitePaths.Wiki); } @@ -479,7 +497,8 @@ export class TopBar extends React.Component { this._isViewingDeployerDocs() || this._isViewingJsonSchemasDocs() || this._isViewingSolCovDocs() || + this._isViewingSubprovidersDocs() || this._isViewingConnectDocs() ); } -} +} // tslint:disable:max-file-line-count diff --git a/packages/website/ts/containers/subproviders_documentation.ts b/packages/website/ts/containers/subproviders_documentation.ts new file mode 100644 index 000000000..34a3d7da2 --- /dev/null +++ b/packages/website/ts/containers/subproviders_documentation.ts @@ -0,0 +1,137 @@ +import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs'; +import * as _ from 'lodash'; +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { State } from 'ts/redux/reducer'; +import { DocPackages, Environments, WebsitePaths } from 'ts/types'; +import { configs } from 'ts/utils/configs'; +import { constants } from 'ts/utils/constants'; +import { Translate } from 'ts/utils/translate'; + +/* tslint:disable:no-var-requires */ +const IntroMarkdown = require('md/docs/subproviders/introduction'); +const InstallationMarkdown = require('md/docs/subproviders/installation'); +/* tslint:enable:no-var-requires */ + +const docSections = { + introduction: 'introduction', + installation: 'installation', + subprovider: 'subprovider', + ledgerSubprovider: 'ledgerSubprovider', + factoryMethods: 'factory-methods', + emptyWalletSubprovider: 'emptyWalletSubprovider', + fakeGasEstimateSubprovider: 'fakeGasEstimateSubprovider', + injectedWeb3Subprovider: 'injectedWeb3Subprovider', + redundantRPCSubprovider: 'redundantRPCSubprovider', + ganacheSubprovider: 'ganacheSubprovider', + nonceTrackerSubprovider: 'nonceTrackerSubprovider', + types: docConstants.TYPES_SECTION_NAME, +}; + +const docsInfoConfig: DocsInfoConfig = { + id: DocPackages.Subproviders, + type: SupportedDocJson.TypeDoc, + displayName: 'Subproviders', + packageUrl: 'https://github.com/0xProject/0x-monorepo', + menu: { + introduction: [docSections.introduction], + install: [docSections.installation], + subprovider: [docSections.subprovider], + ['ledger-subprovider']: [docSections.ledgerSubprovider], + ['factory-methods']: [docSections.factoryMethods], + ['emptyWallet-subprovider']: [docSections.emptyWalletSubprovider], + ['fakeGasEstimate-subprovider']: [docSections.fakeGasEstimateSubprovider], + ['injectedWeb3-subprovider']: [docSections.injectedWeb3Subprovider], + ['redundantRPC-subprovider']: [docSections.redundantRPCSubprovider], + ['ganache-subprovider']: [docSections.ganacheSubprovider], + ['nonceTracker-subprovider']: [docSections.nonceTrackerSubprovider], + types: [docSections.types], + }, + sectionNameToMarkdown: { + [docSections.introduction]: IntroMarkdown, + [docSections.installation]: InstallationMarkdown, + }, + sectionNameToModulePath: { + [docSections.subprovider]: ['"subproviders/src/subproviders/subprovider"'], + [docSections.ledgerSubprovider]: ['"subproviders/src/subproviders/ledger"'], + [docSections.factoryMethods]: ['"subproviders/src/index"'], + [docSections.emptyWalletSubprovider]: ['"subproviders/src/subproviders/empty_wallet_subprovider"'], + [docSections.fakeGasEstimateSubprovider]: ['"subproviders/src/subproviders/fake_gas_estimate_subprovider"'], + [docSections.injectedWeb3Subprovider]: ['"subproviders/src/subproviders/injected_web3"'], + [docSections.redundantRPCSubprovider]: ['"subproviders/src/subproviders/redundant_rpc"'], + [docSections.ganacheSubprovider]: ['"subproviders/src/subproviders/ganache"'], + [docSections.nonceTrackerSubprovider]: ['"subproviders/src/subproviders/nonce_tracker"'], + [docSections.types]: ['"deployer/src/utils/types"', '"types/src/index"', '"subproviders/src/types"'], + }, + menuSubsectionToVersionWhenIntroduced: {}, + sections: docSections, + visibleConstructors: [ + docSections.subprovider, + docSections.ledgerSubprovider, + docSections.emptyWalletSubprovider, + docSections.fakeGasEstimateSubprovider, + docSections.injectedWeb3Subprovider, + docSections.redundantRPCSubprovider, + docSections.ganacheSubprovider, + docSections.nonceTrackerSubprovider, + ], + typeConfigs: { + // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is + // currently no way to extract the re-exported types from index.ts via TypeDoc :( + publicTypes: [ + 'Callback', + 'NextCallback', + 'ErrorCallback', + 'ECSignature', + 'JSONRPCRequestPayloadWithMethod', + 'JSONRPCResponsePayload', + 'AccountFetchingConfigs', + 'LedgerEthereumClientFactoryAsync', + 'PartialTxParams', + 'LedgerEthereumClient', + 'LedgerSubproviderConfigs', + ], + typeNameToExternalLink: { + Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API', + BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127', + JSONRPCRequestPayload: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L137', + JSONRPCResponsePayload: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L144', + Provider: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150', + }, + typeNameToPrefix: { + JSONRPCRequestPayload: 'Web3', + JSONRPCResponsePayload: 'Web3', + Provider: 'Web3', + }, + }, +}; +const docsInfo = new DocsInfo(docsInfoConfig); + +interface ConnectedState { + docsVersion: string; + availableDocVersions: string[]; + docsInfo: DocsInfo; + translate: Translate; +} + +interface ConnectedDispatch { + dispatcher: Dispatcher; +} + +const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({ + docsVersion: state.docsVersion, + availableDocVersions: state.availableDocVersions, + translate: state.translate, + docsInfo, +}); + +const mapDispatchToProps = (dispatch: Dispatch): ConnectedDispatch => ({ + dispatcher: new Dispatcher(dispatch), +}); + +export const Documentation: React.ComponentClass = connect(mapStateToProps, mapDispatchToProps)( + DocPageComponent, +); diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index 1241c222b..0d33e389f 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -57,6 +57,9 @@ const LazyJSONSchemasDocumentation = createLazyComponent('Documentation', async const LazySolCovDocumentation = createLazyComponent('Documentation', async () => System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/sol_cov_documentation'), ); +const LazySubprovidersDocumentation = createLazyComponent('Documentation', async () => + System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/subproviders_documentation'), +); analytics.init(); // tslint:disable-next-line:no-floating-promises @@ -83,6 +86,10 @@ render( path={`${WebsitePaths.JSONSchemas}/:version?`} component={LazyJSONSchemasDocumentation} /> + Date: Tue, 20 Mar 2018 12:00:22 +0000 Subject: Rename `stagedocs.ts` file to `stage_docs.ts` in keeping with our file naming conventions. `postpublish.ts` is the only exception and this is because it is dictated by Lerna --- packages/0x.js/package.json | 2 +- packages/0x.js/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/0x.js/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/connect/package.json | 2 +- packages/connect/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/connect/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/deployer/package.json | 2 +- packages/deployer/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/deployer/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/json-schemas/package.json | 2 +- packages/json-schemas/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/json-schemas/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/sol-cov/package.json | 2 +- packages/sol-cov/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/sol-cov/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/subproviders/package.json | 2 +- packages/subproviders/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/subproviders/src/monorepo_scripts/stagedocs.ts | 8 -------- packages/web3-wrapper/package.json | 2 +- packages/web3-wrapper/src/monorepo_scripts/stage_docs.ts | 8 ++++++++ packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts | 8 -------- 21 files changed, 63 insertions(+), 63 deletions(-) create mode 100644 packages/0x.js/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/0x.js/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/connect/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/connect/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/deployer/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/deployer/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/json-schemas/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/json-schemas/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/sol-cov/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/sol-cov/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/subproviders/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/subproviders/src/monorepo_scripts/stagedocs.ts create mode 100644 packages/web3-wrapper/src/monorepo_scripts/stage_docs.ts delete mode 100644 packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 0d988d0af..aaf465c04 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -27,7 +27,7 @@ "build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", "test:commonjs": "run-s build:commonjs run_mocha", "run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/0x.js/src/monorepo_scripts/stage_docs.ts b/packages/0x.js/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/0x.js/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/0x.js/src/monorepo_scripts/stagedocs.ts b/packages/0x.js/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/0x.js/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/connect/package.json b/packages/connect/package.json index 3f58d03b5..ae243f288 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -22,7 +22,7 @@ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov", "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info", "test:circleci": "yarn test:coverage", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/connect/src/monorepo_scripts/stage_docs.ts b/packages/connect/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/connect/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/connect/src/monorepo_scripts/stagedocs.ts b/packages/connect/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/connect/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/deployer/package.json b/packages/deployer/package.json index 304edbc9e..f44e803eb 100644 --- a/packages/deployer/package.json +++ b/packages/deployer/package.json @@ -15,7 +15,7 @@ "migrate": "npm run build; node lib/src/cli.js migrate", "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'", "test:circleci": "yarn test:coverage", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/deployer/src/monorepo_scripts/stage_docs.ts b/packages/deployer/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/deployer/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/deployer/src/monorepo_scripts/stagedocs.ts b/packages/deployer/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/deployer/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json index 1d40eb749..1266f964b 100644 --- a/packages/json-schemas/package.json +++ b/packages/json-schemas/package.json @@ -14,7 +14,7 @@ "run_mocha": "mocha lib/test/**/*_test.js", "clean": "shx rm -rf lib test_temp scripts", "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/json-schemas/src/monorepo_scripts/stage_docs.ts b/packages/json-schemas/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/json-schemas/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/json-schemas/src/monorepo_scripts/stagedocs.ts b/packages/json-schemas/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/json-schemas/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json index 967c83968..106c47d13 100644 --- a/packages/sol-cov/package.json +++ b/packages/sol-cov/package.json @@ -14,7 +14,7 @@ "run_mocha": "mocha lib/test/**/*_test.js", "clean": "shx rm -rf lib scripts", "build": "copyfiles 'test/fixtures/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/sol-cov/src/monorepo_scripts/stage_docs.ts b/packages/sol-cov/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/sol-cov/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/sol-cov/src/monorepo_scripts/stagedocs.ts b/packages/sol-cov/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/sol-cov/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index 5ce2a414f..96d3e7f00 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -18,7 +18,7 @@ "test:all": "run-s test:unit test:integration", "test:unit": "run-s clean build run_mocha_unit", "test:integration": "run-s clean build run_mocha_integration", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/subproviders/src/monorepo_scripts/stage_docs.ts b/packages/subproviders/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/subproviders/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/subproviders/src/monorepo_scripts/stagedocs.ts b/packages/subproviders/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/subproviders/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index a244b5fa9..176f796c8 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -9,7 +9,7 @@ "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts", "clean": "shx rm -rf lib scripts", "lint": "tslint --project . 'src/**/*.ts'", - "docs:stage": "yarn build && node ./scripts/stagedocs.js", + "docs:stage": "yarn build && node ./scripts/stage_docs.js", "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES", "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json" }, diff --git a/packages/web3-wrapper/src/monorepo_scripts/stage_docs.ts b/packages/web3-wrapper/src/monorepo_scripts/stage_docs.ts new file mode 100644 index 000000000..e732ac8eb --- /dev/null +++ b/packages/web3-wrapper/src/monorepo_scripts/stage_docs.ts @@ -0,0 +1,8 @@ +import { postpublishUtils } from '@0xproject/monorepo-scripts'; + +import * as packageJSON from '../package.json'; +import * as tsConfigJSON from '../tsconfig.json'; + +const cwd = `${__dirname}/..`; +// tslint:disable-next-line:no-floating-promises +postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); diff --git a/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts b/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts deleted file mode 100644 index e732ac8eb..000000000 --- a/packages/web3-wrapper/src/monorepo_scripts/stagedocs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { postpublishUtils } from '@0xproject/monorepo-scripts'; - -import * as packageJSON from '../package.json'; -import * as tsConfigJSON from '../tsconfig.json'; - -const cwd = `${__dirname}/..`; -// tslint:disable-next-line:no-floating-promises -postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd); -- cgit v1.2.3 From a3c31f4f4a4c1c6a79f3915753a5197988253f28 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 12:05:31 +0000 Subject: Fix changelog files and add PR number --- packages/react-docs/CHANGELOG.md | 11 +++++++---- packages/subproviders/CHANGELOG.md | 7 +++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md index cb42bb307..8ce3ef68c 100644 --- a/packages/react-docs/CHANGELOG.md +++ b/packages/react-docs/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## v0.0.4 - _TBD_ + + * Handle `reflection` type rendering so that anonymous function type declarations render properly (#465) + * Rename `MethodSignature` to `Signature` and change it's props so that it can be used to render method and function signatures. (#465) + * Rename `MethodBlock` to `SignatureBlock` since it is not used to render method and function signature blocks. (#465) + * Add support for documenting exported functions. (#465) + ## v0.0.3 - _March 18, 2018_ * Move TS typings from devDependencies to dependencies since they are needed by the package user. @@ -8,7 +15,3 @@ * Move example out into a separate sub-package * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452) - * Handle `reflection` type rendering so that anonymous function type declarations render properly - * Rename `MethodSignature` to `Signature` and change it's props so that it can be used to render method and function signatures. - * Rename `MethodBlock` to `SignatureBlock` since it is not used to render method and function signature blocks. - * Add support for documenting exported functions. diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index 874246ab1..1627a7840 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -1,13 +1,16 @@ # CHANGELOG +## v0.8.1 - _TBD_ + +* Introduce `JSONRPCRequestPayloadWithMethod` type (#465) +* Export `ErrorCallback` type. (#465) + ## v0.8.0 - _March 18, 2018_ * Export `GanacheSubprovider` and `Subprovider` (#426) * Make all subproviders to derive from `Subprovider` (#426) * Add types for `NextCallback`, `OnNextCompleted` (#426) - * Introduce `JSONRPCRequestPayloadWithMethod` type * Ignore `ganache-core` dependency when using package in a browser environment. - * Export `ErrorCallback` type. ## v0.7.0 - _March 8, 2018_ -- cgit v1.2.3 From 72671c10148d304fec072d0c62bcc9788b967f55 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 12:26:04 +0000 Subject: Refactor titleToIcon mapping to idToIcon and move to docPage --- packages/website/ts/components/sidebar_header.tsx | 15 ++------------- packages/website/ts/components/top_bar/top_bar.tsx | 5 +++-- packages/website/ts/pages/documentation/doc_page.tsx | 17 +++++++++++++++-- packages/website/ts/pages/wiki/wiki.tsx | 4 +++- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 556243430..51e8a59d5 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -4,20 +4,9 @@ import * as React from 'react'; const SHOW_DURATION_MS = 4000; -const titleToIcon: { [title: string]: string } = { - '0x.js': 'zeroExJs.png', - Web3Wrapper: 'zeroExJs.png', - Deployer: 'zeroExJs.png', - 'Sol-cov': 'zeroExJs.png', - 'JSON Schemas': 'zeroExJs.png', - Subproviders: 'zeroExJs.png', - '0x Connect': 'connect.png', - '0x Smart Contracts': 'contracts.png', - Wiki: 'wiki.png', -}; - interface SidebarHeaderProps { title: string; + iconUrl: string; } interface SidebarHeaderState {} @@ -37,7 +26,7 @@ export class SidebarHeader extends React.Component
- +
{this.props.title} diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 3a6ceed34..4b2e82119 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -39,6 +39,7 @@ interface TopBarProps { style?: React.CSSProperties; isNightVersion?: boolean; onVersionSelected?: (semver: string) => void; + sidebarHeader?: React.ReactNode; } interface TopBarState { @@ -393,7 +394,7 @@ export class TopBar extends React.Component { } + sidebarHeader={this.props.sidebarHeader} shouldDisplaySectionHeaders={false} onMenuItemClick={this._onMenuButtonClick.bind(this)} selectedVersion={this.props.docsVersion} @@ -413,7 +414,7 @@ export class TopBar extends React.Component { } + sidebarHeader={this.props.sidebarHeader} shouldDisplaySectionHeaders={false} onMenuItemClick={this._onMenuButtonClick.bind(this)} /> diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index 80c47ea5c..b6dfc04b2 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -15,9 +15,20 @@ import { docUtils } from 'ts/utils/doc_utils'; import { Translate } from 'ts/utils/translate'; import { utils } from 'ts/utils/utils'; +const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; const ZERO_EX_JS_VERSION_MISSING_TOPLEVEL_PATH = '0.32.4'; -const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; +const idToIcon: { [id: string]: string } = { + [DocPackages.ZeroExJs]: 'zeroExJs.png', + [DocPackages.Web3Wrapper]: 'zeroExJs.png', + [DocPackages.Deployer]: 'zeroExJs.png', + [DocPackages.SolCov]: 'zeroExJs.png', + [DocPackages.JSONSchemas]: 'zeroExJs.png', + [DocPackages.Subproviders]: 'zeroExJs.png', + [DocPackages.Connect]: 'connect.png', + [DocPackages.SmartContracts]: 'contracts.png', +}; + const docIdToS3FolderName: { [id: string]: string } = { [DocPackages.ZeroExJs]: '0xjs', [DocPackages.SmartContracts]: 'smart-contracts', @@ -79,6 +90,7 @@ export class DocPage extends React.Component { ? {} : this.props.docsInfo.getMenuSubsectionsBySection(this.state.docAgnosticFormat); const sourceUrl = this._getSourceUrl(); + const iconUrl = idToIcon[this.props.docsInfo.id]; return (
@@ -92,13 +104,14 @@ export class DocPage extends React.Component { docsInfo={this.props.docsInfo} translate={this.props.translate} onVersionSelected={this._onVersionSelected.bind(this)} + sidebarHeader={} /> } + sidebarHeader={} sourceUrl={sourceUrl} topBarHeight={60} onVersionSelected={this._onVersionSelected.bind(this)} diff --git a/packages/website/ts/pages/wiki/wiki.tsx b/packages/website/ts/pages/wiki/wiki.tsx index e2dd3a68e..a8d70029c 100644 --- a/packages/website/ts/pages/wiki/wiki.tsx +++ b/packages/website/ts/pages/wiki/wiki.tsx @@ -88,6 +88,7 @@ export class Wiki extends React.Component { ...styles.mainContainers, overflow: this.state.isHoveringSidebar ? 'auto' : 'hidden', }; + const sidebarHeader = ; return (
@@ -96,6 +97,7 @@ export class Wiki extends React.Component { location={this.props.location} menuSubsectionsBySection={menuSubsectionsBySection} translate={this.props.translate} + sidebarHeader={sidebarHeader} /> {_.isUndefined(this.state.articlesBySection) ? (
@@ -134,7 +136,7 @@ export class Wiki extends React.Component { } + sidebarHeader={sidebarHeader} />
-- cgit v1.2.3 From 4ca706d4e6404eaeb9e53494dbc98aabbf2e33f2 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 13:06:59 +0000 Subject: Remove duplicate ECSignature type def --- packages/subproviders/src/index.ts | 4 +++- packages/subproviders/src/types.ts | 9 +++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 9c409e3d9..0dc053286 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -2,7 +2,6 @@ import Eth from '@ledgerhq/hw-app-eth'; import TransportU2F from '@ledgerhq/hw-transport-u2f'; import { LedgerEthereumClient } from './types'; -export { Callback, ErrorCallback, NextCallback } from './types'; export { EmptyWalletSubprovider } from './subproviders/empty_wallet_subprovider'; export { FakeGasEstimateSubprovider } from './subproviders/fake_gas_estimate_subprovider'; @@ -13,6 +12,9 @@ export { GanacheSubprovider } from './subproviders/ganache'; export { Subprovider } from './subproviders/subprovider'; export { NonceTrackerSubprovider } from './subproviders/nonce_tracker'; export { + Callback, + ErrorCallback, + NextCallback, ECSignature, LedgerWalletSubprovider, LedgerCommunicationClient, diff --git a/packages/subproviders/src/types.ts b/packages/subproviders/src/types.ts index 09095a53d..9bb9ff696 100644 --- a/packages/subproviders/src/types.ts +++ b/packages/subproviders/src/types.ts @@ -1,6 +1,9 @@ +import { ECSignature } from '@0xproject/types'; import * as _ from 'lodash'; import * as Web3 from 'web3'; +export { ECSignature } from '@0xproject/types'; + export interface LedgerCommunicationClient { close: () => Promise; } @@ -29,12 +32,6 @@ export interface ECSignatureString { s: string; } -export interface ECSignature { - v: number; - r: string; - s: string; -} - export type LedgerEthereumClientFactoryAsync = () => Promise; /* -- cgit v1.2.3 From ec582d6e466986ca813aa2d0837e28151a07035b Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 15:28:25 +0000 Subject: Small doc fixes: remove duplicate types and add function array --- packages/react-docs/src/utils/doxity_utils.ts | 1 + packages/react-docs/src/utils/typedoc_utils.ts | 6 +++++- packages/react-shared/src/components/nested_sidebar_menu.tsx | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/react-docs/src/utils/doxity_utils.ts b/packages/react-docs/src/utils/doxity_utils.ts index 26dea6966..1b91690e0 100644 --- a/packages/react-docs/src/utils/doxity_utils.ts +++ b/packages/react-docs/src/utils/doxity_utils.ts @@ -116,6 +116,7 @@ export const doxityUtils = { methods, properties, types: [], + functions: [], events, }; docAgnosticFormat[contractName] = docSection; diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index 4c7617234..269bf7873 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -170,7 +170,11 @@ export const typeDocUtils = { sectionName, docsInfo.id, ); - docSection.types.push(customType); + const seenTypeNames = _.map(docSection.types, t => t.name); + const isUnseen = !_.includes(seenTypeNames, customType.name); + if (isUnseen) { + docSection.types.push(customType); + } } break; diff --git a/packages/react-shared/src/components/nested_sidebar_menu.tsx b/packages/react-shared/src/components/nested_sidebar_menu.tsx index 2225bd197..c4c87401a 100644 --- a/packages/react-shared/src/components/nested_sidebar_menu.tsx +++ b/packages/react-shared/src/components/nested_sidebar_menu.tsx @@ -122,7 +122,7 @@ export class NestedSidebarMenu extends React.Component +
  • Date: Tue, 20 Mar 2018 15:34:02 +0000 Subject: Remove duplicate switch case --- packages/react-docs/src/utils/typedoc_utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index 269bf7873..87b9e44ba 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -159,7 +159,6 @@ export const typeDocUtils = { break; case KindString.Interface: - case KindString.Function: case KindString.Variable: case KindString.Enumeration: case KindString.TypeAlias: -- cgit v1.2.3 From 27880a6059f282cdee833523a6144bcafa8c266b Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 15:35:48 +0000 Subject: Remove s3 mapping since s3 folder names are now identical to sub-package names --- packages/website/ts/pages/documentation/doc_page.tsx | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index b6dfc04b2..26a80c745 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -29,17 +29,6 @@ const idToIcon: { [id: string]: string } = { [DocPackages.SmartContracts]: 'contracts.png', }; -const docIdToS3FolderName: { [id: string]: string } = { - [DocPackages.ZeroExJs]: '0xjs', - [DocPackages.SmartContracts]: 'smart-contracts', - [DocPackages.Connect]: 'connect', - [DocPackages.Web3Wrapper]: 'web3-wrapper', - [DocPackages.Deployer]: 'deployer', - [DocPackages.JSONSchemas]: 'json-schemas', - [DocPackages.SolCov]: 'sol-cov', - [DocPackages.Subproviders]: 'subproviders', -}; - const docIdToSubpackageName: { [id: string]: string } = { [DocPackages.ZeroExJs]: '0x.js', [DocPackages.Connect]: 'connect', @@ -120,7 +109,7 @@ export class DocPage extends React.Component { ); } private async _fetchJSONDocsFireAndForgetAsync(preferredVersionIfExists?: string): Promise { - const folderName = docIdToS3FolderName[this.props.docsInfo.id]; + const folderName = docIdToSubpackageName[this.props.docsInfo.id]; const docBucketRoot = isDevelopment ? constants.S3_STAGING_DOC_BUCKET_ROOT : constants.S3_DOC_BUCKET_ROOT; const versionToFilePath = await docUtils.getVersionToFilePathAsync(docBucketRoot, folderName); const versions = _.keys(versionToFilePath); -- cgit v1.2.3 From 07de3a1d94e360cada1c5fc5754014e596865b55 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 15:39:32 +0000 Subject: Pass actual iconUrl and add default icon image --- packages/website/ts/components/sidebar_header.tsx | 2 +- packages/website/ts/pages/documentation/doc_page.tsx | 9 +++------ packages/website/ts/pages/wiki/wiki.tsx | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx index 51e8a59d5..a0ea869fb 100644 --- a/packages/website/ts/components/sidebar_header.tsx +++ b/packages/website/ts/components/sidebar_header.tsx @@ -26,7 +26,7 @@ export class SidebarHeader extends React.Component
    - +
    {this.props.title} diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index 26a80c745..e2fcca084 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -16,15 +16,11 @@ import { Translate } from 'ts/utils/translate'; import { utils } from 'ts/utils/utils'; const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; +const DEFAULT_ICON = 'zeroExJs.png'; const ZERO_EX_JS_VERSION_MISSING_TOPLEVEL_PATH = '0.32.4'; const idToIcon: { [id: string]: string } = { [DocPackages.ZeroExJs]: 'zeroExJs.png', - [DocPackages.Web3Wrapper]: 'zeroExJs.png', - [DocPackages.Deployer]: 'zeroExJs.png', - [DocPackages.SolCov]: 'zeroExJs.png', - [DocPackages.JSONSchemas]: 'zeroExJs.png', - [DocPackages.Subproviders]: 'zeroExJs.png', [DocPackages.Connect]: 'connect.png', [DocPackages.SmartContracts]: 'contracts.png', }; @@ -79,7 +75,8 @@ export class DocPage extends React.Component { ? {} : this.props.docsInfo.getMenuSubsectionsBySection(this.state.docAgnosticFormat); const sourceUrl = this._getSourceUrl(); - const iconUrl = idToIcon[this.props.docsInfo.id]; + const iconFileName = idToIcon[this.props.docsInfo.id] || DEFAULT_ICON; + const iconUrl = `/images/doc_icons/${iconFileName}`; return (
    diff --git a/packages/website/ts/pages/wiki/wiki.tsx b/packages/website/ts/pages/wiki/wiki.tsx index a8d70029c..23d1b52fb 100644 --- a/packages/website/ts/pages/wiki/wiki.tsx +++ b/packages/website/ts/pages/wiki/wiki.tsx @@ -88,7 +88,7 @@ export class Wiki extends React.Component { ...styles.mainContainers, overflow: this.state.isHoveringSidebar ? 'auto' : 'hidden', }; - const sidebarHeader = ; + const sidebarHeader = ; return (
    -- cgit v1.2.3 From 87cbbdad72c4a713e2444212b08290889b28995f Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 15:39:39 +0000 Subject: Update yarn.lock --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index ddc3e2bc6..a9a12e7e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -172,7 +172,7 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*", "@types/lodash@^4.14.37", "@types/lodash@^4.14.86": +"@types/lodash@*", "@types/lodash@4.14.104", "@types/lodash@^4.14.37": version "4.14.104" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80" -- cgit v1.2.3 From 2875cfa8c77ce478a0b72f4563b1f27caf3d88de Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 15:41:31 +0000 Subject: Move doc related types closer to one another --- packages/website/ts/types.ts | 66 ++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts index 262c96c76..24b4f5214 100644 --- a/packages/website/ts/types.ts +++ b/packages/website/ts/types.ts @@ -373,39 +373,6 @@ export enum DocPackages { Subproviders = 'SUBPROVIDERS', } -export interface TimestampMsRange { - startTimestampMs: number; - endTimestampMs: number; -} - -export interface OutdatedWrappedEtherByNetworkId { - [networkId: number]: { - address: string; - timestampMsRange: TimestampMsRange; - }; -} - -export enum SmartContractDocSections { - Introduction = 'Introduction', - Exchange = 'Exchange', - TokenTransferProxy = 'TokenTransferProxy', - TokenRegistry = 'TokenRegistry', - ZRXToken = 'ZRXToken', -} - -export interface MaterialUIPosition { - vertical: 'bottom' | 'top' | 'center'; - horizontal: 'left' | 'middle' | 'right'; -} - -export enum Language { - English = 'EN', - Spanish = 'ES', - Chinese = 'ZH', - Korean = 'KO', - Russian = 'RU', -} - export enum Key { TopHeader = 'TOP_HEADER', TopTagline = 'TOP_TAGLINE', @@ -473,15 +440,48 @@ export enum Key { RocketChat = 'ROCKETCHAT', } +export enum SmartContractDocSections { + Introduction = 'Introduction', + Exchange = 'Exchange', + TokenTransferProxy = 'TokenTransferProxy', + TokenRegistry = 'TokenRegistry', + ZRXToken = 'ZRXToken', +} + +export enum Language { + English = 'EN', + Spanish = 'ES', + Chinese = 'ZH', + Korean = 'KO', + Russian = 'RU', +} + export enum Deco { Cap, CapWords, Upper, } +export interface MaterialUIPosition { + vertical: 'bottom' | 'top' | 'center'; + horizontal: 'left' | 'middle' | 'right'; +} + export enum Providers { Parity = 'PARITY', Metamask = 'METAMASK', Mist = 'MIST', } + +export interface TimestampMsRange { + startTimestampMs: number; + endTimestampMs: number; +} + +export interface OutdatedWrappedEtherByNetworkId { + [networkId: number]: { + address: string; + timestampMsRange: TimestampMsRange; + }; +} // tslint:disable:max-file-line-count -- cgit v1.2.3 From 3cf2cb89bbec6a2cffd59aafdcb6d45aa55269d1 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Tue, 20 Mar 2018 09:34:55 -0700 Subject: Implement initial wallet interface --- packages/website/ts/components/portal.tsx | 40 ++- packages/website/ts/components/portal_menu.tsx | 13 +- packages/website/ts/components/wallet.tsx | 382 +++++++++++++++++++++++++ 3 files changed, 433 insertions(+), 2 deletions(-) create mode 100644 packages/website/ts/components/wallet.tsx diff --git a/packages/website/ts/components/portal.tsx b/packages/website/ts/components/portal.tsx index 5bdb5bde9..59eaca67e 100644 --- a/packages/website/ts/components/portal.tsx +++ b/packages/website/ts/components/portal.tsx @@ -19,12 +19,22 @@ import { TokenBalances } from 'ts/components/token_balances'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { TradeHistory } from 'ts/components/trade_history/trade_history'; import { FlashMessage } from 'ts/components/ui/flash_message'; +import { Wallet } from 'ts/components/wallet'; import { GenerateOrderForm } from 'ts/containers/generate_order_form'; import { localStorage } from 'ts/local_storage/local_storage'; import { Dispatcher } from 'ts/redux/dispatcher'; import { portalOrderSchema } from 'ts/schemas/portal_order_schema'; import { validator } from 'ts/schemas/validator'; -import { BlockchainErrs, HashData, Order, ProviderType, ScreenWidths, TokenByAddress, WebsitePaths } from 'ts/types'; +import { + BlockchainErrs, + Environments, + HashData, + Order, + ProviderType, + ScreenWidths, + TokenByAddress, + WebsitePaths, +} from 'ts/types'; import { configs } from 'ts/utils/configs'; import { constants } from 'ts/utils/constants'; import { Translate } from 'ts/utils/translate'; @@ -194,6 +204,12 @@ export class Portal extends React.Component {
    {this.props.blockchainIsLoaded ? ( + {configs.ENVIRONMENT === Environments.DEVELOPMENT && ( + + )} { isLedgerDialogOpen: !this.state.isLedgerDialogOpen, }); } + private _renderWallet() { + const allTokens = _.values(this.props.tokenByAddress); + const trackedTokens = _.filter(allTokens, t => t.isTracked); + return ( +
    +
    + +
    +
    + ); + } private _renderEthWrapper() { return ( {this._renderMenuItemWithIcon('Wrap ETH', 'zmdi-circle-o')} + {configs.ENVIRONMENT === Environments.DEVELOPMENT && ( + + {this._renderMenuItemWithIcon('Wallet', 'zmdi-balance-wallet')} + + )}
    ); } diff --git a/packages/website/ts/components/wallet.tsx b/packages/website/ts/components/wallet.tsx new file mode 100644 index 000000000..41c10c57a --- /dev/null +++ b/packages/website/ts/components/wallet.tsx @@ -0,0 +1,382 @@ +import { ZeroEx } from '0x.js'; +import { + constants as sharedConstants, + EtherscanLinkSuffixes, + Styles, + utils as sharedUtils, +} from '@0xproject/react-shared'; +import { BigNumber } from '@0xproject/utils'; +import * as _ from 'lodash'; +import FlatButton from 'material-ui/FlatButton'; +import { List, ListItem } from 'material-ui/List'; +import NavigationArrowDownward from 'material-ui/svg-icons/navigation/arrow-downward'; +import NavigationArrowUpward from 'material-ui/svg-icons/navigation/arrow-upward'; +import * as React from 'react'; +import ReactTooltip = require('react-tooltip'); +import firstBy = require('thenby'); + +import { Blockchain } from 'ts/blockchain'; +import { AllowanceToggle } from 'ts/components/inputs/allowance_toggle'; +import { Identicon } from 'ts/components/ui/identicon'; +import { TokenIcon } from 'ts/components/ui/token_icon'; +import { Dispatcher } from 'ts/redux/dispatcher'; +import { BalanceErrs, BlockchainErrs, Token, TokenByAddress } from 'ts/types'; +import { constants } from 'ts/utils/constants'; +import { utils } from 'ts/utils/utils'; + +export interface WalletProps { + userAddress?: string; + networkId?: number; + blockchain?: Blockchain; + blockchainIsLoaded: boolean; + blockchainErr: BlockchainErrs; + dispatcher: Dispatcher; + tokenByAddress: TokenByAddress; + trackedTokens: Token[]; + userEtherBalanceInWei: BigNumber; + lastForceTokenStateRefetch: number; +} + +interface WalletState { + trackedTokenStateByAddress: TokenStateByAddress; +} + +interface TokenStateByAddress { + [address: string]: TokenState; +} + +interface TokenState { + balance: BigNumber; + allowance: BigNumber; + isLoaded: boolean; +} + +enum WrappedEtherAction { + Wrap, + Unwrap, +} + +interface AllowanceToggleConfig { + token: Token; + tokenState: TokenState; +} + +interface AccessoryItemConfig { + wrappedEtherAction?: WrappedEtherAction; + allowanceToggleConfig?: AllowanceToggleConfig; +} + +const styles: Styles = { + wallet: { + width: 346, + backgroundColor: '#ffffff', + borderBottomRightRadius: 10, + borderBottomLeftRadius: 10, + borderTopRightRadius: 10, + borderTopLeftRadius: 10, + boxShadow: '0px 4px 6px rgba(56, 59, 137, 0.2)', + overflow: 'hidden', + }, + list: { + padding: '0px 0px 0px 0px', + }, + tokenItemInnerDiv: { + paddingLeft: 60, + }, + headerItemInnerDiv: { + paddingLeft: 65, + }, + footerItemInnerDiv: { + paddingLeft: 24, + }, + borderedItem: { + borderBottomColor: '#f5f5f6', + borderBottomStyle: 'solid', + borderWidth: 1, + }, + tokenItem: { + backgroundColor: '#fbfbfc', + paddingTop: 8, + paddingBottom: 8, + }, + headerItem: { + paddingTop: 8, + paddingBottom: 8, + }, + wrappedEtherButtonLabel: { + fontSize: 12, + }, + amountLabel: { + fontWeight: 'bold', + color: 'black', + }, +}; + +const ETHER_ICON_PATH = '/images/ether.png'; +const ETHER_TOKEN_SYMBOL = 'WETH'; +const ZRX_TOKEN_SYMBOL = 'ZRX'; +const ETHER_SYMBOL = 'ETH'; +const ICON_DIMENSION = 24; +const TOKEN_AMOUNT_DISPLAY_PRECISION = 3; + +export class Wallet extends React.Component { + private _isUnmounted: boolean; + constructor(props: WalletProps) { + super(props); + this._isUnmounted = false; + const initialTrackedTokenStateByAddress = this._getInitialTrackedTokenStateByAddress(props.trackedTokens); + this.state = { + trackedTokenStateByAddress: initialTrackedTokenStateByAddress, + }; + } + public componentWillMount() { + const trackedTokenAddresses = _.keys(this.state.trackedTokenStateByAddress); + // tslint:disable-next-line:no-floating-promises + this._fetchBalancesAndAllowancesAsync(trackedTokenAddresses); + } + public componentWillUnmount() { + this._isUnmounted = true; + } + public componentWillReceiveProps(nextProps: WalletProps) { + if ( + nextProps.userAddress !== this.props.userAddress || + nextProps.networkId !== this.props.networkId || + nextProps.lastForceTokenStateRefetch !== this.props.lastForceTokenStateRefetch + ) { + const trackedTokenAddresses = _.keys(this.state.trackedTokenStateByAddress); + // tslint:disable-next-line:no-floating-promises + this._fetchBalancesAndAllowancesAsync(trackedTokenAddresses); + } + if (!_.isEqual(nextProps.trackedTokens, this.props.trackedTokens)) { + const newTokens = _.difference(nextProps.trackedTokens, this.props.trackedTokens); + const newTokenAddresses = _.map(newTokens, token => token.address); + // Add placeholder entry for this token to the state, since fetching the + // balance/allowance is asynchronous + const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress; + for (const tokenAddress of newTokenAddresses) { + trackedTokenStateByAddress[tokenAddress] = { + balance: new BigNumber(0), + allowance: new BigNumber(0), + isLoaded: false, + }; + } + this.setState({ + trackedTokenStateByAddress, + }); + // Fetch the actual balance/allowance. + // tslint:disable-next-line:no-floating-promises + this._fetchBalancesAndAllowancesAsync(newTokenAddresses); + } + } + public render() { + const isReadyToRender = this.props.blockchainIsLoaded && this.props.blockchainErr === BlockchainErrs.NoError; + return
    {isReadyToRender ? this._renderRows() :
    }
    ; + } + private _renderRows() { + return ( + + {_.concat( + this._renderHeaderRows(), + this._renderEthRows(), + this._renderTokenRows(), + this._renderFooterRows(), + )} + + ); + } + private _renderHeaderRows() { + const userAddress = this.props.userAddress; + const primaryText = utils.getAddressBeginAndEnd(userAddress); + return ( + } + style={{ ...styles.headerItem, ...styles.borderedItem }} + innerDivStyle={styles.headerItemInnerDiv} + /> + ); + } + private _renderFooterRows() { + const primaryText = '+ other tokens'; + return ( + + ); + } + private _renderEthRows() { + const primaryText = this._renderAmount( + this.props.userEtherBalanceInWei, + constants.DECIMAL_PLACES_ETH, + ETHER_SYMBOL, + ); + const accessoryItemConfig = { + wrappedEtherAction: WrappedEtherAction.Wrap, + }; + return ( + } + rightAvatar={this._renderAccessoryItems(accessoryItemConfig)} + style={{ ...styles.tokenItem, ...styles.borderedItem }} + innerDivStyle={styles.tokenItemInnerDiv} + /> + ); + } + private _renderTokenRows() { + const trackedTokens = this.props.trackedTokens; + const trackedTokensStartingWithEtherToken = trackedTokens.sort( + firstBy((t: Token) => t.symbol !== ETHER_TOKEN_SYMBOL) + .thenBy((t: Token) => t.symbol !== ZRX_TOKEN_SYMBOL) + .thenBy('address'), + ); + return _.map(trackedTokensStartingWithEtherToken, this._renderTokenRow.bind(this)); + } + private _renderTokenRow(token: Token) { + const tokenState = this.state.trackedTokenStateByAddress[token.address]; + const tokenLink = sharedUtils.getEtherScanLinkIfExists( + token.address, + this.props.networkId, + EtherscanLinkSuffixes.Address, + ); + const amount = this._renderAmount(tokenState.balance, token.decimals, token.symbol); + const wrappedEtherAction = token.symbol === ETHER_TOKEN_SYMBOL ? WrappedEtherAction.Unwrap : undefined; + const accessoryItemConfig: AccessoryItemConfig = { + wrappedEtherAction, + allowanceToggleConfig: { + token, + tokenState, + }, + }; + return ( + + ); + } + private _renderAccessoryItems(config: AccessoryItemConfig) { + const shouldShowWrappedEtherAction = !_.isUndefined(config.wrappedEtherAction); + const shouldShowToggle = !_.isUndefined(config.allowanceToggleConfig); + return ( +
    +
    +
    + {shouldShowWrappedEtherAction && this._renderWrappedEtherButton(config.wrappedEtherAction)} +
    +
    + {shouldShowToggle && this._renderAllowanceToggle(config.allowanceToggleConfig)} +
    +
    +
    + ); + } + private _renderAllowanceToggle(config: AllowanceToggleConfig) { + return ( + + ); + } + private _renderAmount(amount: BigNumber, decimals: number, symbol: string) { + const unitAmount = ZeroEx.toUnitAmount(amount, decimals); + const formattedAmount = unitAmount.toPrecision(TOKEN_AMOUNT_DISPLAY_PRECISION); + const result = `${formattedAmount} ${symbol}`; + return
    {result}
    ; + } + private _renderTokenIcon(token: Token, tokenLink?: string) { + const tooltipId = `tooltip-${token.address}`; + const tokenIcon = ; + if (_.isUndefined(tokenLink)) { + return tokenIcon; + } else { + return ( + + {tokenIcon} + + ); + } + } + private _renderWrappedEtherButton(action: WrappedEtherAction) { + let buttonLabel; + let buttonIcon; + switch (action) { + case WrappedEtherAction.Wrap: + buttonLabel = 'wrap'; + buttonIcon = ; + break; + case WrappedEtherAction.Unwrap: + buttonLabel = 'unwrap'; + buttonIcon = ; + break; + default: + throw utils.spawnSwitchErr('wrappedEtherAction', action); + } + return ( + + ); + } + private _getInitialTrackedTokenStateByAddress(trackedTokens: Token[]) { + const trackedTokenStateByAddress: TokenStateByAddress = {}; + _.each(trackedTokens, token => { + trackedTokenStateByAddress[token.address] = { + balance: new BigNumber(0), + allowance: new BigNumber(0), + isLoaded: false, + }; + }); + return trackedTokenStateByAddress; + } + private async _fetchBalancesAndAllowancesAsync(tokenAddresses: string[]) { + const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress; + const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress; + for (const tokenAddress of tokenAddresses) { + const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync( + userAddressIfExists, + tokenAddress, + ); + trackedTokenStateByAddress[tokenAddress] = { + balance, + allowance, + isLoaded: true, + }; + } + if (!this._isUnmounted) { + this.setState({ + trackedTokenStateByAddress, + }); + } + } + private async _refetchTokenStateAsync(tokenAddress: string) { + const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress; + const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync( + userAddressIfExists, + tokenAddress, + ); + this.setState({ + trackedTokenStateByAddress: { + ...this.state.trackedTokenStateByAddress, + [tokenAddress]: { + balance, + allowance, + isLoaded: true, + }, + }, + }); + } +} -- cgit v1.2.3 From 9991ddecc28f562539645a27c12707fc43f811ca Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 21:39:08 +0000 Subject: Fix var name typo --- packages/web3-wrapper/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index 02d5e4f7b..6cd068be1 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -141,8 +141,8 @@ export class Web3Wrapper { return gas; } public async callAsync(callData: Web3.CallData, defaultBlock?: Web3.BlockParam): Promise { - const rawCalllResult = await promisify(this._web3.eth.call)(callData, defaultBlock); - return rawCalllResult; + const rawCallResult = await promisify(this._web3.eth.call)(callData, defaultBlock); + return rawCallResult; } public async sendTransactionAsync(txData: Web3.TxData): Promise { const txHash = await promisify(this._web3.eth.sendTransaction)(txData); -- cgit v1.2.3 From 4f76bb2a12e7741be4fbed0455e53de798efa12e Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 21:39:41 +0000 Subject: Remove duplicate method --- packages/0x.js/test/0x.js_test.ts | 6 +++--- packages/web3-wrapper/src/index.ts | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/0x.js/test/0x.js_test.ts b/packages/0x.js/test/0x.js_test.ts index d1f601c92..d61847d1d 100644 --- a/packages/0x.js/test/0x.js_test.ts +++ b/packages/0x.js/test/0x.js_test.ts @@ -41,11 +41,11 @@ describe('ZeroEx library', () => { expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined(); // Check that all nested web3 wrapper instances return the updated provider - const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getCurrentProvider(); + const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getProvider(); expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number'); - const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getCurrentProvider(); + const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getProvider(); expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number'); - const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getCurrentProvider(); + const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getProvider(); expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number'); }); }); diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index 6cd068be1..e508c4f5b 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -54,9 +54,6 @@ export class Web3Wrapper { } return transactionReceipt; } - public getCurrentProvider(): Web3.Provider { - return this._web3.currentProvider; - } public toWei(ethAmount: BigNumber): BigNumber { const balanceWei = this._web3.toWei(ethAmount, 'ether'); return balanceWei; -- cgit v1.2.3 From 647bc5a63ecccdcaaad5390d5c7dd5a8d3d07996 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 21:41:21 +0000 Subject: Rename method for clarity --- packages/0x.js/src/0x.ts | 2 +- packages/web3-wrapper/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts index 09da4b046..3f323546c 100644 --- a/packages/0x.js/src/0x.ts +++ b/packages/0x.js/src/0x.ts @@ -260,7 +260,7 @@ export class ZeroEx { msgHashHex = ethUtil.bufferToHex(msgHashBuff); } - const signature = await this._web3Wrapper.signTransactionAsync(normalizedSignerAddress, msgHashHex); + const signature = await this._web3Wrapper.signMessageAsync(normalizedSignerAddress, msgHashHex); // HACK: There is no consensus on whether the signatureHex string should be formatted as // v + r + s OR r + s + v, and different clients (even different versions of the same client) diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index e508c4f5b..975649a75 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -70,7 +70,7 @@ export class Web3Wrapper { const codeIsEmpty = /^0x0{0,40}$/i.test(code); return !codeIsEmpty; } - public async signTransactionAsync(address: string, message: string): Promise { + public async signMessageAsync(address: string, message: string): Promise { const signData = await promisify(this._web3.eth.sign)(address, message); return signData; } -- cgit v1.2.3 From 6693540f432d5004339799de5a18c66eabbd12cc Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 21:41:36 +0000 Subject: Add changelog entry --- packages/web3-wrapper/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/web3-wrapper/CHANGELOG.md b/packages/web3-wrapper/CHANGELOG.md index 5f6523209..9fbc9021c 100644 --- a/packages/web3-wrapper/CHANGELOG.md +++ b/packages/web3-wrapper/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## v0.4.0 _TBD_ + + * Rename `signTransactionAsync` to `signMessageAsync` for clarity (#465) + ## v0.3.0 _March 18, 2018_ * Add `web3Wrapper.takeSnapshotAsync`, `web3Wrapper.revertSnapshotAsync`, `web3Wrapper.mineBlockAsync`, `web3Wrapper.increaseTimeAsync` (#426) -- cgit v1.2.3 From 3cd7bce0a3a3c49858917122970a0a6e283fba37 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 21:41:59 +0000 Subject: Add DocComments to Web3Wrapper --- packages/web3-wrapper/src/index.ts | 133 ++++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index 975649a75..895df509a 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -3,12 +3,25 @@ import { BigNumber, promisify } from '@0xproject/utils'; import * as _ from 'lodash'; import * as Web3 from 'web3'; +/** + * A wrapper around the Web3.js 0.x library that provides a consistent, clean promise-based interface. + */ export class Web3Wrapper { - // This is here purely to reliably distinguish it from other objects in runtime (like BigNumber.isBigNumber) + /** + * This is here purely to reliably distinguish it from other objects in runtime + * Similar to: BigNumber.isBigNumber + */ public isZeroExWeb3Wrapper = true; private _web3: Web3; private _defaults: Partial; private _jsonRpcRequestId: number; + /** + * Instantiates a new Web3Wrapper. + * @param provider The Web3 provider instance you would like the Web3Wrapper to use for interacting with + * the Ethereum network. + * @param defaults Override TxData defaults sent with RPC requests to the backing Ethereum node. + * @return An instance of the Web3Wrapper class. + */ constructor(provider: Web3.Provider, defaults?: Partial) { if (_.isUndefined((provider as any).sendAsync)) { // Web3@1.0 provider doesn't support synchronous http requests, @@ -21,32 +34,69 @@ export class Web3Wrapper { this._defaults = defaults || {}; this._jsonRpcRequestId = 0; } + /** + * Get the contract defaults set to the Web3Wrapper instance + * @return TxData defaults (e.g gas, gasPrice, nonce, etc...) + */ public getContractDefaults(): Partial { return this._defaults; } + /** + * Retrieve the Web3 provider + * @return Web3 provider instance + */ public getProvider(): Web3.Provider { return this._web3.currentProvider; } + /** + * Update the used Web3 provider + * @param provider The new Web3 provider to be set + */ public setProvider(provider: Web3.Provider) { this._web3.setProvider(provider); } + /** + * Check if an address is a valid Ethereum address + * @param address Address to check + * @returns Whether the address is a valid Ethereum address + */ public isAddress(address: string): boolean { return this._web3.isAddress(address); } + /** + * Check whether an address is available through the backing provider. This can be + * useful if you want to know whether a user can sign messages or transactions from + * a given Ethereum address. + * @param senderAddress Address to check availability for + * @returns Whether the address is available through the provider. + */ public async isSenderAddressAvailableAsync(senderAddress: string): Promise { const addresses = await this.getAvailableAddressesAsync(); const normalizedAddress = senderAddress.toLowerCase(); return _.includes(addresses, normalizedAddress); } + /** + * Fetch the backing Ethereum node's version string e.g `MetaMask/v4.2.0` + * @returns Ethereum node's version string + */ public async getNodeVersionAsync(): Promise { const nodeVersion = await promisify(this._web3.version.getNode)(); return nodeVersion; } + /** + * Fetches the networkId of the backing Ethereum node + * @returns The networkId + */ public async getNetworkIdAsync(): Promise { const networkIdStr = await promisify(this._web3.version.getNetwork)(); const networkId = _.parseInt(networkIdStr); return networkId; } + /** + * Retrieves the transaction receipt for a given transaction hash + * @param txHash Transaction hash + * @returns The transaction receipt, including it's status (0: failed, 1: succeeded or undefined: not found) + */ public async getTransactionReceiptAsync(txHash: string): Promise { const transactionReceipt = await promisify(this._web3.eth.getTransactionReceipt)(txHash); if (!_.isNull(transactionReceipt)) { @@ -54,57 +104,117 @@ export class Web3Wrapper { } return transactionReceipt; } + /** + * Convert an Ether amount from ETH to Wei + * @param ethAmount Amount of Ether to convert to wei + * @returns Amount in wei + */ public toWei(ethAmount: BigNumber): BigNumber { const balanceWei = this._web3.toWei(ethAmount, 'ether'); return balanceWei; } + /** + * Retrieves an accounts Ether balance in wei + * @param owner Account whose balance you wish to check + * @returns Balance in wei + */ public async getBalanceInWeiAsync(owner: string): Promise { let balanceInWei = await promisify(this._web3.eth.getBalance)(owner); // Rewrap in a new BigNumber balanceInWei = new BigNumber(balanceInWei); return balanceInWei; } + /** + * Check if a contract exists at a given address + * @param address Account address to check + * @returns Whether or not contract code was found at the supplied address + */ public async doesContractExistAtAddressAsync(address: string): Promise { const code = await promisify(this._web3.eth.getCode)(address); // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients const codeIsEmpty = /^0x0{0,40}$/i.test(code); return !codeIsEmpty; } + /** + * Sign a message with a specific address's private key (`eth_sign`) + * @param address Address of signer + * @param message Message to sign + * @returns Signature string (might be VRS or RSV depending on the Signer) + */ public async signMessageAsync(address: string, message: string): Promise { const signData = await promisify(this._web3.eth.sign)(address, message); return signData; } + /** + * Fetches the latest blockNumber + * @returns Block number + */ public async getBlockNumberAsync(): Promise { const blockNumber = await promisify(this._web3.eth.getBlockNumber)(); return blockNumber; } + /** + * Fetch a specific Ethereum block + * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral) + * @returns The requested block without transaction data + */ public async getBlockAsync(blockParam: string | Web3.BlockParam): Promise { const block = await promisify(this._web3.eth.getBlock)(blockParam); return block; } + /** + * Fetch a block's timestamp + * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral) + * @returns The timestamp the block was mined + */ public async getBlockTimestampAsync(blockParam: string | Web3.BlockParam): Promise { const { timestamp } = await this.getBlockAsync(blockParam); return timestamp; } + /** + * Retrieve the user addresses available through the provider + * @returns Available user addresses + */ public async getAvailableAddressesAsync(): Promise { const addresses = await promisify(this._web3.eth.getAccounts)(); const normalizedAddresses = _.map(addresses, address => address.toLowerCase()); return normalizedAddresses; } + /** + * Take a snapshot of the blockchain state on a TestRPC/Ganache local node + * @returns The snapshot Id. This can be used to revert to this snapshot + */ public async takeSnapshotAsync(): Promise { const snapshotId = Number(await this._sendRawPayloadAsync({ method: 'evm_snapshot', params: [] })); return snapshotId; } + /** + * Revert the blockchain state to a previous snapshot state on TestRPC/Ganache local node + * @param snapshotId snapshot Id to revert to + * @returns Whether the revert was successful + */ public async revertSnapshotAsync(snapshotId: number): Promise { const didRevert = await this._sendRawPayloadAsync({ method: 'evm_revert', params: [snapshotId] }); return didRevert; } + /** + * Mine a block on a TestRPC/Ganache local node + */ public async mineBlockAsync(): Promise { await this._sendRawPayloadAsync({ method: 'evm_mine', params: [] }); } + /** + * Increase the next blocks timestamp on TestRPC/Ganache local node + * @param timeDelta Amount of time to add in seconds + */ public async increaseTimeAsync(timeDelta: number): Promise { await this._sendRawPayloadAsync({ method: 'evm_increaseTime', params: [timeDelta] }); } + /** + * Retrieve smart contract logs for a given filter + * @param filter Parameters by which to filter which logs to retrieve + * @returns The corresponding log entries + */ public async getLogsAsync(filter: Web3.FilterObject): Promise { let fromBlock = filter.fromBlock; if (_.isNumber(fromBlock)) { @@ -129,18 +239,39 @@ export class Web3Wrapper { const formattedLogs = _.map(rawLogs, this._formatLog.bind(this)); return formattedLogs; } + /** + * Get a Web3 contract factory instance for a given ABI + * @param abi Smart contract ABI + * @returns Web3 contract factory which can create Web3 Contract instances for the supplied ABI + */ public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract { const web3Contract = this._web3.eth.contract(abi); return web3Contract; } + /** + * Calculate the estimated gas cost for a given transaction + * @param txData Transaction data + * @returns Estimated gas cost + */ public async estimateGasAsync(txData: Partial): Promise { const gas = await promisify(this._web3.eth.estimateGas)(txData); return gas; } + /** + * Call a smart contract method at a given block height + * @param callData Call data + * @param defaultBlock Block height at which to make the call + * @returns The raw call result + */ public async callAsync(callData: Web3.CallData, defaultBlock?: Web3.BlockParam): Promise { const rawCallResult = await promisify(this._web3.eth.call)(callData, defaultBlock); return rawCallResult; } + /** + * Send a transaction + * @param txData Transaction data + * @returns Transaction hash + */ public async sendTransactionAsync(txData: Web3.TxData): Promise { const txHash = await promisify(this._web3.eth.sendTransaction)(txData); return txHash; -- cgit v1.2.3 From 6a410b03ff644ed46b4ae1e6f8bf81203deb1663 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 22:17:39 +0000 Subject: Improve comments --- packages/web3-wrapper/src/index.ts | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts index 895df509a..2ce2580ee 100644 --- a/packages/web3-wrapper/src/index.ts +++ b/packages/web3-wrapper/src/index.ts @@ -8,8 +8,7 @@ import * as Web3 from 'web3'; */ export class Web3Wrapper { /** - * This is here purely to reliably distinguish it from other objects in runtime - * Similar to: BigNumber.isBigNumber + * Flag to check if this instance is of type Web3Wrapper */ public isZeroExWeb3Wrapper = true; private _web3: Web3; @@ -18,7 +17,7 @@ export class Web3Wrapper { /** * Instantiates a new Web3Wrapper. * @param provider The Web3 provider instance you would like the Web3Wrapper to use for interacting with - * the Ethereum network. + * the backing Ethereum node. * @param defaults Override TxData defaults sent with RPC requests to the backing Ethereum node. * @return An instance of the Web3Wrapper class. */ @@ -76,7 +75,7 @@ export class Web3Wrapper { return _.includes(addresses, normalizedAddress); } /** - * Fetch the backing Ethereum node's version string e.g `MetaMask/v4.2.0` + * Fetch the backing Ethereum node's version string (e.g `MetaMask/v4.2.0`) * @returns Ethereum node's version string */ public async getNodeVersionAsync(): Promise { @@ -85,7 +84,7 @@ export class Web3Wrapper { } /** * Fetches the networkId of the backing Ethereum node - * @returns The networkId + * @returns The network id */ public async getNetworkIdAsync(): Promise { const networkIdStr = await promisify(this._web3.version.getNetwork)(); @@ -126,7 +125,7 @@ export class Web3Wrapper { } /** * Check if a contract exists at a given address - * @param address Account address to check + * @param address Address to which to check * @returns Whether or not contract code was found at the supplied address */ public async doesContractExistAtAddressAsync(address: string): Promise { @@ -146,7 +145,7 @@ export class Web3Wrapper { return signData; } /** - * Fetches the latest blockNumber + * Fetches the latest block number * @returns Block number */ public async getBlockNumberAsync(): Promise { @@ -165,14 +164,14 @@ export class Web3Wrapper { /** * Fetch a block's timestamp * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral) - * @returns The timestamp the block was mined + * @returns The block's timestamp */ public async getBlockTimestampAsync(blockParam: string | Web3.BlockParam): Promise { const { timestamp } = await this.getBlockAsync(blockParam); return timestamp; } /** - * Retrieve the user addresses available through the provider + * Retrieve the user addresses available through the backing provider * @returns Available user addresses */ public async getAvailableAddressesAsync(): Promise { @@ -182,7 +181,7 @@ export class Web3Wrapper { } /** * Take a snapshot of the blockchain state on a TestRPC/Ganache local node - * @returns The snapshot Id. This can be used to revert to this snapshot + * @returns The snapshot id. This can be used to revert to this snapshot */ public async takeSnapshotAsync(): Promise { const snapshotId = Number(await this._sendRawPayloadAsync({ method: 'evm_snapshot', params: [] })); @@ -190,7 +189,7 @@ export class Web3Wrapper { } /** * Revert the blockchain state to a previous snapshot state on TestRPC/Ganache local node - * @param snapshotId snapshot Id to revert to + * @param snapshotId snapshot id to revert to * @returns Whether the revert was successful */ public async revertSnapshotAsync(snapshotId: number): Promise { @@ -242,7 +241,7 @@ export class Web3Wrapper { /** * Get a Web3 contract factory instance for a given ABI * @param abi Smart contract ABI - * @returns Web3 contract factory which can create Web3 Contract instances for the supplied ABI + * @returns Web3 contract factory which can create Web3 Contract instances from the supplied ABI */ public getContractFromAbi(abi: Web3.ContractAbi): Web3.Contract { const web3Contract = this._web3.eth.contract(abi); @@ -260,7 +259,7 @@ export class Web3Wrapper { /** * Call a smart contract method at a given block height * @param callData Call data - * @param defaultBlock Block height at which to make the call + * @param defaultBlock Block height at which to make the call. Defaults to `latest` * @returns The raw call result */ public async callAsync(callData: Web3.CallData, defaultBlock?: Web3.BlockParam): Promise { -- cgit v1.2.3 From 38f716bd77c46e55ad117cfef8cb42474e61a7c0 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Tue, 20 Mar 2018 22:24:26 +0000 Subject: Make docs link more discoverable in README, move docs out of README --- packages/web3-wrapper/README.md | 14 +++----------- packages/website/md/docs/web3_wrapper/installation.md | 8 ++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md index 244e20708..c63982703 100644 --- a/packages/web3-wrapper/README.md +++ b/packages/web3-wrapper/README.md @@ -1,6 +1,8 @@ ## @0xproject/web3-wrapper -Wrapped version of web3 with a nicer interface that is used across 0x projects and packages. Visit [the docs](0xproject.com/docs/web3_wrapper). +Wrapped version of web3 with a nicer interface that is used across 0x projects and packages. + +### Read the [ Documentation](0xproject.com/docs/web3_wrapper). ## Installation @@ -16,16 +18,6 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ] ``` -## Usage - -```typescript -import {Web3Wrapper} from '@0xproject/web3-wrapper'; - -const web3 = ...; -const web3Wrapper = new Web3Wrapper(web3.currentProvider); -const availableAddresses = await web3Wrapper.getAvailableAddressesAsync(); -``` - ## Contributing We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. diff --git a/packages/website/md/docs/web3_wrapper/installation.md b/packages/website/md/docs/web3_wrapper/installation.md index 6e9b4cb59..92794d9b0 100644 --- a/packages/website/md/docs/web3_wrapper/installation.md +++ b/packages/website/md/docs/web3_wrapper/installation.md @@ -15,3 +15,11 @@ or ```javascript var Web3Wrapper = require('@0xproject/web3-wrapper').Web3Wrapper; ``` + +If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`: + +``` +"include": [ + "./node_modules/web3-typescript-typings/index.d.ts", +] +``` -- cgit v1.2.3 From 07fa01528b5b5febf6852fb439a41c0e892cf830 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 12:32:53 +0000 Subject: Move usage out of README and add add link to docs --- packages/deployer/README.md | 62 ++++++++++------------------------------- packages/web3-wrapper/README.md | 2 +- 2 files changed, 16 insertions(+), 48 deletions(-) diff --git a/packages/deployer/README.md b/packages/deployer/README.md index 9abcfa6fe..c65571e83 100644 --- a/packages/deployer/README.md +++ b/packages/deployer/README.md @@ -2,66 +2,34 @@ This repository contains a CLI tool that facilitates compiling and deployment of smart contracts. +### Read the [Documentation](0xproject.com/docs/deployer). + ## Installation +#### CLI Installation + ```bash -yarn add @0xproject/deployer +npm install @0xproject/deployer -g ``` -## Usage - -### CLI Usage +#### API Installation ```bash -node ./node_modules/@0xproject/deployer/lib/cli.js --help -cli.js [command] - -Commands: - cli.js compile compile contracts - cli.js deploy deploy a single contract with provided arguments - -Options: - --version Show version number [boolean] - --contracts-dir path of contracts directory to compile - [string] [default: "/Users/leonidlogvinov/Dev/0x/contracts"] - --network-id mainnet=1, kovan=42, testrpc=50 [number] [default: 50] - --should-optimize enable optimizer [boolean] [default: false] - --artifacts-dir path to write contracts artifacts to - [string] [default: "/Users/leonidlogvinov/Dev/0x/build/artifacts/"] - --jsonrpc-port port connected to JSON RPC [number] [default: 8545] - --gas-price gasPrice to be used for transactions - [string] [default: "2000000000"] - --account account to use for deploying contracts [string] - --help Show help [boolean] +npm install @0xproject/deployer --save ``` -### API Usage - -## Migrations - -You might want to write a migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started. +**Import** ```typescript -import { Deployer } from '@0xproject/deployer'; -import * as path from 'path'; - -const deployerOpts = { - artifactsDir: path.resolve('src', 'artifacts'), - jsonrpcUrl: 'http://localhost:8545', - networkId: 50, - defaults: { - gas: 1000000, - }, -}; - -const deployer = new Deployer(deployerOpts); - -(async () => { - const etherToken = await deployer.deployAndSaveAsync('WETH9'); -})().catch(console.log); +import { Deployer, Compiler } from '@0xproject/deployer'; ``` -A more sophisticated example can be found [here](https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts/migrations) +or + +```javascript +var Deployer = require('@0xproject/deployer').Deployer; +var Compiler = require('@0xproject/deployer').Compiler; +``` ## Contributing diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md index c63982703..1fed11407 100644 --- a/packages/web3-wrapper/README.md +++ b/packages/web3-wrapper/README.md @@ -2,7 +2,7 @@ Wrapped version of web3 with a nicer interface that is used across 0x projects and packages. -### Read the [ Documentation](0xproject.com/docs/web3_wrapper). +### Read the [Documentation](0xproject.com/docs/web3_wrapper). ## Installation -- cgit v1.2.3 From af21ad1615c9b0cd1e12b4dfee73c6beb6e57cc0 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 12:33:07 +0000 Subject: Add missing DocComments to Deployer package --- packages/deployer/src/compiler.ts | 6 +++++- packages/deployer/src/deployer.ts | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/deployer/src/compiler.ts b/packages/deployer/src/compiler.ts index 83977709b..e840ed572 100644 --- a/packages/deployer/src/compiler.ts +++ b/packages/deployer/src/compiler.ts @@ -28,6 +28,10 @@ const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/; const IMPORT_REGEX = /(import\s)/; const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js +/** + * The Compiler facilitates compiling Solidity smart contracts and saves the results + * to artifact files. + */ export class Compiler { private _contractsDir: string; private _networkId: number; @@ -148,7 +152,7 @@ export class Compiler { this._specifiedContracts = opts.specifiedContracts; } /** - * Compiles all Solidity files found in contractsDir and writes JSON artifacts to artifactsDir. + * Compiles all Solidity files found in `contractsDir` and writes JSON artifacts to `artifactsDir`. */ public async compileAllAsync(): Promise { await this._createArtifactsDirIfDoesNotExistAsync(); diff --git a/packages/deployer/src/deployer.ts b/packages/deployer/src/deployer.ts index 6c247d328..68518a931 100644 --- a/packages/deployer/src/deployer.ts +++ b/packages/deployer/src/deployer.ts @@ -19,12 +19,21 @@ import { utils } from './utils/utils'; // Gas added to gas estimate to make sure there is sufficient gas for deployment. const EXTRA_GAS = 200000; +/** + * The Deployer facilitates deploying Solidity smart contracts to the blockchain. + * It can be used to build custom migration scripts. + */ export class Deployer { public web3Wrapper: Web3Wrapper; private _artifactsDir: string; private _networkId: number; private _defaults: Partial; + /** + * Instantiate a new instance of the Deployer class. + * @param opts Deployer options, including either an RPC url or Provider instance. + * @returns A Deployer instance + */ constructor(opts: DeployerOptions) { this._artifactsDir = opts.artifactsDir; this._networkId = opts.networkId; @@ -42,8 +51,8 @@ export class Deployer { this.web3Wrapper = new Web3Wrapper(web3Provider, this._defaults); } /** - * Loads contract artifact and deploys contract with given arguments. - * @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory. + * Loads a contract's corresponding artifacts and deploys it with the supplied constructor arguments. + * @param contractName Name of the contract to deploy. Must match name of an artifact in supplied artifacts directory. * @param args Array of contract constructor arguments. * @return Deployed contract instance. */ @@ -80,7 +89,8 @@ export class Deployer { return contractInstance; } /** - * Loads contract artifact, deploys with given arguments, and saves updated data to artifact. + * Loads a contract's artifact, deploys it with supplied constructor arguments, and saves the updated data + * back to the artifact file. * @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory. * @param args Array of contract constructor arguments. * @return Deployed contract instance. -- cgit v1.2.3 From 1dda8c146816a6b7fe1ab17a437a4349dece674c Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 21 Mar 2018 14:51:24 +0100 Subject: Fix a bug causing fillOrdersUpTo validation to fail because of some extra orders being passed --- packages/0x.js/CHANGELOG.md | 1 + packages/0x.js/src/contract_wrappers/exchange_wrapper.ts | 3 +++ packages/0x.js/test/exchange_wrapper_test.ts | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md index 7ce7126cb..fa3b3db91 100644 --- a/packages/0x.js/CHANGELOG.md +++ b/packages/0x.js/CHANGELOG.md @@ -3,6 +3,7 @@ ## v0.34.0 - _TBD_ * Update Kovan EtherToken artifact address to match TokenRegistry. + * Fix the bug causing `zeroEx.exchange.fillOrdersUpToAsync` validation to fail if there were some extra orders passed (#470) ## v0.33.2 - _March 18, 2018_ diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts index 6414985e6..124750d81 100644 --- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts @@ -281,6 +281,9 @@ export class ExchangeWrapper extends ContractWrapper { zrxTokenAddress, ); filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount); + if (filledTakerTokenAmount.eq(fillTakerTokenAmount)) { + break; + } } } diff --git a/packages/0x.js/test/exchange_wrapper_test.ts b/packages/0x.js/test/exchange_wrapper_test.ts index 0a4ea608d..cfc390bae 100644 --- a/packages/0x.js/test/exchange_wrapper_test.ts +++ b/packages/0x.js/test/exchange_wrapper_test.ts @@ -596,6 +596,19 @@ describe('ExchangeWrapper', () => { const remainingFillAmount = fillableAmount.minus(1); expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount); }); + it('should successfully fill up to specified amount and leave the rest of the orders untouched', async () => { + const txHash = await zeroEx.exchange.fillOrdersUpToAsync( + signedOrders, + fillableAmount, + shouldThrowOnInsufficientBalanceOrAllowance, + takerAddress, + ); + await zeroEx.awaitTransactionMinedAsync(txHash); + const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex); + const zeroAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex); + expect(filledAmount).to.be.bignumber.equal(fillableAmount); + expect(zeroAmount).to.be.bignumber.equal(0); + }); it('should successfully fill up to specified amount even if filling all orders would fail', async () => { const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9, // but won't have 10 to fully fill all orders in a batch. -- cgit v1.2.3 From c55e7fa91adc3ca870f0a90e10d1048167301ec3 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 17:38:02 +0000 Subject: Improve all the comments for the subproviders public methods --- packages/subproviders/src/index.ts | 2 +- .../src/subproviders/empty_wallet_subprovider.ts | 11 +- .../subproviders/fake_gas_estimate_subprovider.ts | 23 ++- packages/subproviders/src/subproviders/ganache.ts | 15 +- .../subproviders/src/subproviders/injected_web3.ts | 22 ++- packages/subproviders/src/subproviders/ledger.ts | 189 +++++++++++++-------- .../subproviders/src/subproviders/nonce_tracker.ts | 16 +- .../subproviders/src/subproviders/redundant_rpc.ts | 13 +- .../subproviders/src/subproviders/subprovider.ts | 23 ++- 9 files changed, 199 insertions(+), 115 deletions(-) diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts index 0dc053286..d88792fd0 100644 --- a/packages/subproviders/src/index.ts +++ b/packages/subproviders/src/index.ts @@ -24,7 +24,7 @@ export { /** * A factory method for creating a LedgerEthereumClient usable in a browser context. - * @return LedgerEthereumClient A browser client + * @return LedgerEthereumClient A browser client for the LedgerSubprovider */ export async function ledgerEthereumBrowserClientFactoryAsync(): Promise { const ledgerConnection = await TransportU2F.create(); diff --git a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts index d5d03a4ac..38972b6cf 100644 --- a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts @@ -4,15 +4,14 @@ import { Callback, ErrorCallback } from '../types'; import { Subprovider } from './subprovider'; -/* - * This class implements the web3-provider-engine subprovider interface and returns - * that the provider has no addresses when queried. - * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It intercepts the `eth_accounts` JSON RPC requests and never returns any addresses when queried. */ export class EmptyWalletSubprovider extends Subprovider { // This method needs to be here to satisfy the interface but linter wants it to be static. - // tslint:disable-next-line:prefer-function-over-method - public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_accounts': end(null, []); diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts index faec2d9e5..8241e58f2 100644 --- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts +++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts @@ -4,23 +4,28 @@ import { Callback, ErrorCallback } from '../types'; import { Subprovider } from './subprovider'; -/* - * This class implements the web3-provider-engine subprovider interface and returns - * the constant gas estimate when queried. - * HACK: We need this so that our tests don't use testrpc gas estimation which sometimes kills the node. - * Source: https://github.com/trufflesuite/ganache-cli/issues/417 - * Source: https://github.com/trufflesuite/ganache-cli/issues/437 - * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js +// HACK: We need this so that our tests don't use testrpc gas estimation which sometimes kills the node. +// Source: https://github.com/trufflesuite/ganache-cli/issues/417 +// Source: https://github.com/trufflesuite/ganache-cli/issues/437 +// Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js + +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It intercepts the `eth_estimateGas` JSON RPC call and always returns a constant gas amount when queried. */ export class FakeGasEstimateSubprovider extends Subprovider { private _constantGasAmount: number; + /** + * Instantiates an instance of the FakeGasEstimateSubprovider + * @param constantGasAmount The constant gas amount you want returned + */ constructor(constantGasAmount: number) { super(); this._constantGasAmount = constantGasAmount; } // This method needs to be here to satisfy the interface but linter wants it to be static. - // tslint:disable-next-line:prefer-function-over-method - public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_estimateGas': end(null, this._constantGasAmount); diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts index 6ff939674..22ac5e1e2 100644 --- a/packages/subproviders/src/subproviders/ganache.ts +++ b/packages/subproviders/src/subproviders/ganache.ts @@ -5,20 +5,23 @@ import { Callback, ErrorCallback } from '../types'; import { Subprovider } from './subprovider'; -/* - * This class implements the web3-provider-engine subprovider interface and returns - * the provider connected to a in-process ganache. - * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It intercepts all JSON RPC requests and relays them to an in-process ganache instance. */ export class GanacheSubprovider extends Subprovider { private _ganacheProvider: Web3.Provider; + /** + * Instantiates a GanacheSubprovider + * @param opts The desired opts with which to instantiate the Ganache provider + */ constructor(opts: any) { super(); this._ganacheProvider = Ganache.provider(opts); } // This method needs to be here to satisfy the interface but linter wants it to be static. - // tslint:disable-next-line:prefer-function-over-method - public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { this._ganacheProvider.sendAsync(payload, (err: Error | null, result: any) => { end(err, result && result.result); }); diff --git a/packages/subproviders/src/subproviders/injected_web3.ts b/packages/subproviders/src/subproviders/injected_web3.ts index ec7304cb7..3e3744d5c 100644 --- a/packages/subproviders/src/subproviders/injected_web3.ts +++ b/packages/subproviders/src/subproviders/injected_web3.ts @@ -5,19 +5,25 @@ import { Callback, ErrorCallback } from '../types'; import { Subprovider } from './subprovider'; -/* - * This class implements the web3-provider-engine subprovider interface and forwards - * requests involving user accounts (getAccounts, sendTransaction, etc...) to the injected - * provider instance in their browser. - * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) + * subprovider interface. It forwards JSON RPC requests involving user accounts (getAccounts, + * sendTransaction, etc...) to the provider instance supplied at instantiation. All other requests + * are passed onwards for subsequent subproviders to handle. */ export class InjectedWeb3Subprovider extends Subprovider { private _injectedWeb3: Web3; - constructor(subprovider: Web3.Provider) { + /** + * Instantiates a new InjectedWeb3Subprovider + * @param provider Web3 provider that should handle all user account related requests + */ + constructor(provider: Web3.Provider) { super(); - this._injectedWeb3 = new Web3(subprovider); + this._injectedWeb3 = new Web3(provider); } - public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + // This method needs to be here to satisfy the interface but linter wants it to be static. + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'web3_clientVersion': this._injectedWeb3.version.getNode(end); diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index 95217c84d..75c73c4de 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -24,6 +24,11 @@ const DEFAULT_NUM_ADDRESSES_TO_FETCH = 10; const ASK_FOR_ON_DEVICE_CONFIRMATION = false; const SHOULD_GET_CHAIN_CODE = true; +/** + * Subprovider for interfacing with a user's [Ledger Nano S](https://www.ledgerwallet.com/products/ledger-nano-s). + * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and + * re-routes them to a Ledger device plugged into the users computer. + */ export class LedgerSubprovider extends Subprovider { private _nonceLock = new Lock(); private _connectionLock = new Lock(); @@ -38,6 +43,11 @@ export class LedgerSubprovider extends Subprovider { throw new Error(LedgerSubproviderErrors.SenderInvalidOrNotSupplied); } } + /** + * Instantiates a LedgerSubprovider + * @param config Several available configurations + * @return LedgerSubprovider instance + */ constructor(config: LedgerSubproviderConfigs) { super(); this._networkId = config.networkId; @@ -50,84 +60,38 @@ export class LedgerSubprovider extends Subprovider { : ASK_FOR_ON_DEVICE_CONFIRMATION; this._derivationPathIndex = 0; } + /** + * Retrieve the set derivation path + * @returns derivation path + */ public getPath(): string { return this._derivationPath; } + /** + * Set a desired derivation path when computing the available user addresses + * @param derivationPath The desired derivation path (e.g `44'/60'/0'`) + */ public setPath(derivationPath: string) { this._derivationPath = derivationPath; } + /** + * Set the final derivation path index. If a user wishes to sign a message with the + * 6th address in a derivation path, before calling `signPersonalMessageAsync`, you must + * call this method with pathIndex `6`. + * @param pathIndex Desired derivation path index + */ public setPathIndex(pathIndex: number) { this._derivationPathIndex = pathIndex; } - // Required to implement this public interface which doesn't conform to our linting rule. - // tslint:disable-next-line:async-suffix - public async handleRequest( - payload: Web3.JSONRPCRequestPayload, - next: Callback, - end: (err: Error | null, result?: any) => void, - ) { - let accounts; - let txParams; - switch (payload.method) { - case 'eth_coinbase': - try { - accounts = await this.getAccountsAsync(); - end(null, accounts[0]); - } catch (err) { - end(err); - } - return; - - case 'eth_accounts': - try { - accounts = await this.getAccountsAsync(); - end(null, accounts); - } catch (err) { - end(err); - } - return; - - case 'eth_sendTransaction': - txParams = payload.params[0]; - try { - LedgerSubprovider._validateSender(txParams.from); - const result = await this._sendTransactionAsync(txParams); - end(null, result); - } catch (err) { - end(err); - } - return; - - case 'eth_signTransaction': - txParams = payload.params[0]; - try { - const result = await this._signTransactionWithoutSendingAsync(txParams); - end(null, result); - } catch (err) { - end(err); - } - return; - - case 'eth_sign': - case 'personal_sign': - const data = payload.method === 'eth_sign' ? payload.params[1] : payload.params[0]; - try { - if (_.isUndefined(data)) { - throw new Error(LedgerSubproviderErrors.DataMissingForSignPersonalMessage); - } - assert.isHexString('data', data); - const ecSignatureHex = await this.signPersonalMessageAsync(data); - end(null, ecSignatureHex); - } catch (err) { - end(err); - } - return; - - default: - next(); - return; - } - } + /** + * Retrieve a users Ledger accounts. The accounts are derived from the derivationPath, + * master public key and chainCode. Because of this, you can request as many accounts + * as you wish and it only requires a single request to the Ledger device. This method + * is automatically called when issuing a `eth_accounts` JSON RPC request via your providerEngine + * instance. + * @param numberOfAccounts Number of accounts to retrieve (default: 10) + * @return An array of accounts + */ public async getAccountsAsync(numberOfAccounts: number = DEFAULT_NUM_ADDRESSES_TO_FETCH): Promise { this._ledgerClientIfExists = await this._createLedgerClientAsync(); @@ -159,6 +123,14 @@ export class LedgerSubprovider extends Subprovider { } return accounts; } + /** + * Sign a transaction with the Ledger. If you've added the LedgerSubprovider to your + * app's provider, you can simply send an `eth_sendTransaction` JSON RPC request, and + * this method will be called auto-magically. If you are not using this via a ProviderEngine + * instance, you can call it directly. + * @param txParams Parameters of the transaction to sign + * @return Signed transaction hex string + */ public async signTransactionAsync(txParams: PartialTxParams): Promise { this._ledgerClientIfExists = await this._createLedgerClientAsync(); @@ -194,6 +166,16 @@ export class LedgerSubprovider extends Subprovider { throw err; } } + /** + * Sign a personal Ethereum signed message. The signing address will be to one + * retrieved given a derivationPath and pathIndex set on the subprovider. + * The Ledger adds the Ethereum signed message prefix on-device. If you've added + * the LedgerSubprovider to your app's provider, you can simply send an `eth_sign` + * or `personal_sign` JSON RPC request, and this method will be called auto-magically. + * If you are not using this via a ProviderEngine instance, you can call it directly. + * @param data Message to sign + * @return Signature hex string (order: rsv) + */ public async signPersonalMessageAsync(data: string): Promise { this._ledgerClientIfExists = await this._createLedgerClientAsync(); try { @@ -215,6 +197,75 @@ export class LedgerSubprovider extends Subprovider { throw err; } } + // Required to implement this public interface which doesn't conform to our linting rule. + // tslint:disable-next-line:async-suffix underscore-private-and-protected + private async handleRequest( + payload: Web3.JSONRPCRequestPayload, + next: Callback, + end: (err: Error | null, result?: any) => void, + ) { + let accounts; + let txParams; + switch (payload.method) { + case 'eth_coinbase': + try { + accounts = await this.getAccountsAsync(); + end(null, accounts[0]); + } catch (err) { + end(err); + } + return; + + case 'eth_accounts': + try { + accounts = await this.getAccountsAsync(); + end(null, accounts); + } catch (err) { + end(err); + } + return; + + case 'eth_sendTransaction': + txParams = payload.params[0]; + try { + LedgerSubprovider._validateSender(txParams.from); + const result = await this._sendTransactionAsync(txParams); + end(null, result); + } catch (err) { + end(err); + } + return; + + case 'eth_signTransaction': + txParams = payload.params[0]; + try { + const result = await this._signTransactionWithoutSendingAsync(txParams); + end(null, result); + } catch (err) { + end(err); + } + return; + + case 'eth_sign': + case 'personal_sign': + const data = payload.method === 'eth_sign' ? payload.params[1] : payload.params[0]; + try { + if (_.isUndefined(data)) { + throw new Error(LedgerSubproviderErrors.DataMissingForSignPersonalMessage); + } + assert.isHexString('data', data); + const ecSignatureHex = await this.signPersonalMessageAsync(data); + end(null, ecSignatureHex); + } catch (err) { + end(err); + } + return; + + default: + next(); + return; + } + } private _getDerivationPath() { const derivationPath = `${this.getPath()}/${this._derivationPathIndex}`; return derivationPath; diff --git a/packages/subproviders/src/subproviders/nonce_tracker.ts b/packages/subproviders/src/subproviders/nonce_tracker.ts index 82eab4a9a..b51ba4ac8 100644 --- a/packages/subproviders/src/subproviders/nonce_tracker.ts +++ b/packages/subproviders/src/subproviders/nonce_tracker.ts @@ -10,13 +10,13 @@ import { Callback, ErrorCallback, NextCallback, NonceSubproviderErrors } from '. import { Subprovider } from './subprovider'; -// We do not export this since this is not our error, and we do not throw this error const NONCE_TOO_LOW_ERROR_MESSAGE = 'Transaction nonce is too low'; -/* - This class is heavily inspiried by the Web3ProviderEngine NonceSubprovider - We have added the additional feature of clearing any nonce balues when an error message - describes a nonce value being too low. -*/ + +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It is heavily inspired by the [NonceSubprovider](https://github.com/MetaMask/provider-engine/blob/master/subproviders/nonce-tracker.js). + * We added the additional feature of clearing the cached nonce value when a `nonce value too low` error occurs. + */ export class NonceTrackerSubprovider extends Subprovider { private _nonceCache: { [address: string]: string } = {}; private static _reconstructTransaction(payload: Web3.JSONRPCRequestPayload): EthereumTx { @@ -47,8 +47,8 @@ export class NonceTrackerSubprovider extends Subprovider { } } // Required to implement this public interface which doesn't conform to our linting rule. - // tslint:disable-next-line:async-suffix - public async handleRequest( + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private async handleRequest( payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback, diff --git a/packages/subproviders/src/subproviders/redundant_rpc.ts b/packages/subproviders/src/subproviders/redundant_rpc.ts index dacd1c2c5..2b84d223b 100644 --- a/packages/subproviders/src/subproviders/redundant_rpc.ts +++ b/packages/subproviders/src/subproviders/redundant_rpc.ts @@ -7,6 +7,11 @@ import { Callback } from '../types'; import { Subprovider } from './subprovider'; +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It attempts to handle each JSON RPC request by sequentially attempting to receive a valid response from one of a + * set of JSON RPC endpoints. + */ export class RedundantRPCSubprovider extends Subprovider { private _rpcs: RpcSubprovider[]; private static async _firstSuccessAsync( @@ -28,6 +33,10 @@ export class RedundantRPCSubprovider extends Subprovider { throw lastErr; } } + /** + * Instantiates a new RedundantRPCSubprovider + * @param endpoints JSON RPC endpoints to attempt. Attempts are made in the order of the endpoints. + */ constructor(endpoints: string[]) { super(); this._rpcs = _.map(endpoints, endpoint => { @@ -37,8 +46,8 @@ export class RedundantRPCSubprovider extends Subprovider { }); } // Required to implement this public interface which doesn't conform to our linting rule. - // tslint:disable-next-line:async-suffix - public async handleRequest( + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private async handleRequest( payload: Web3.JSONRPCRequestPayload, next: Callback, end: (err: Error | null, data?: any) => void, diff --git a/packages/subproviders/src/subproviders/subprovider.ts b/packages/subproviders/src/subproviders/subprovider.ts index 4a224fc4e..0b30c6397 100644 --- a/packages/subproviders/src/subproviders/subprovider.ts +++ b/packages/subproviders/src/subproviders/subprovider.ts @@ -2,10 +2,9 @@ import promisify = require('es6-promisify'); import * as Web3 from 'web3'; import { JSONRPCRequestPayloadWithMethod } from '../types'; -/* - * A version of the base class Subprovider found in providerEngine +/** + * A altered version of the base class Subprovider found in [web3-provider-engine](https://github.com/MetaMask/provider-engine). * This one has an async/await `emitPayloadAsync` and also defined types. - * Altered version of: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js */ export class Subprovider { private _engine: any; @@ -31,9 +30,13 @@ export class Subprovider { }; return finalPayload; } - public setEngine(engine: any): void { - this._engine = engine; - } + /** + * Emits a JSON RPC payload that will then be handled by the ProviderEngine instance + * this subprovider is a part of. The payload will cascade down the subprovider middleware + * stack until finding the responsible entity for handling the request. + * @param payload JSON RPC payload + * @returns JSON RPC response payload + */ public async emitPayloadAsync( payload: Partial, ): Promise { @@ -41,4 +44,12 @@ export class Subprovider { const response = await promisify(this._engine.sendAsync, this._engine)(finalPayload); return response; } + /** + * Set's the subprovider's engine to the ProviderEngine it is added to. + * This is only called within the ProviderEngine source code + */ + // tslint:disable-next-line:underscore-private-and-protected + private setEngine(engine: any): void { + this._engine = engine; + } } -- cgit v1.2.3 From ac25764d12711172aa6221c6d4ff3faa732997a6 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 17:38:23 +0000 Subject: Add changelog entry for making `handleRequest` private --- packages/subproviders/CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index 1627a7840..2947bb32e 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -2,8 +2,10 @@ ## v0.8.1 - _TBD_ -* Introduce `JSONRPCRequestPayloadWithMethod` type (#465) -* Export `ErrorCallback` type. (#465) + * Introduce `JSONRPCRequestPayloadWithMethod` type (#465) + * Export `ErrorCallback` type. (#465) + * Make `handleRequest` private in `LedgerSubprovider` since it should only be used + internally by the providerEngine. (#465) ## v0.8.0 - _March 18, 2018_ -- cgit v1.2.3 From 18d3e5458a31e7d2368e506e8cf14f190e19b7ff Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:04:27 +0000 Subject: Fix sectionName and menuItemName to display with spaces rather then dashes --- packages/react-shared/CHANGELOG.md | 4 +++- packages/react-shared/src/components/markdown_section.tsx | 3 ++- packages/react-shared/src/components/nested_sidebar_menu.tsx | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/react-shared/CHANGELOG.md b/packages/react-shared/CHANGELOG.md index 43b92d58a..ae13588dc 100644 --- a/packages/react-shared/CHANGELOG.md +++ b/packages/react-shared/CHANGELOG.md @@ -1,3 +1,5 @@ # CHANGELOG -## v0.0.1 - _March 8, 2018_ +## v0.0.2 - _TBD_ + + * Fix section and menuItem text display to replace dashes with spaces. diff --git a/packages/react-shared/src/components/markdown_section.tsx b/packages/react-shared/src/components/markdown_section.tsx index d24a43dcb..e895afd2a 100644 --- a/packages/react-shared/src/components/markdown_section.tsx +++ b/packages/react-shared/src/components/markdown_section.tsx @@ -43,6 +43,7 @@ export class MarkdownSection extends React.Component diff --git a/packages/react-shared/src/components/nested_sidebar_menu.tsx b/packages/react-shared/src/components/nested_sidebar_menu.tsx index c4c87401a..d81bd3c3d 100644 --- a/packages/react-shared/src/components/nested_sidebar_menu.tsx +++ b/packages/react-shared/src/components/nested_sidebar_menu.tsx @@ -85,6 +85,7 @@ export class NestedSidebarMenu extends React.Component { + const finalMenuItemName = menuItemName.replace(/-/g, ' '); const id = utils.getIdFromName(menuItemName); return (
    @@ -96,11 +97,11 @@ export class NestedSidebarMenu extends React.Component - {menuItemName} + {finalMenuItemName} {this._renderMenuItemSubsections(menuItemName)} -- cgit v1.2.3 From 78e9c4880358621cb5a4393d7e32d81bfba1ae6d Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:04:48 +0000 Subject: Move docs from README into docs page and add a link to it. --- packages/subproviders/README.md | 56 +--------------------- packages/subproviders/src/subproviders/ledger.ts | 3 +- .../md/docs/subproviders/ledger_node_hid.md | 17 +++++++ .../ts/containers/subproviders_documentation.ts | 4 ++ 4 files changed, 25 insertions(+), 55 deletions(-) create mode 100644 packages/website/md/docs/subproviders/ledger_node_hid.md diff --git a/packages/subproviders/README.md b/packages/subproviders/README.md index 4614342b2..a2bf75768 100644 --- a/packages/subproviders/README.md +++ b/packages/subproviders/README.md @@ -4,6 +4,8 @@ A few useful web3 subproviders including a LedgerSubprovider useful for adding L We have written up a [Wiki](https://0xproject.com/wiki#Web3-Provider-Examples) article detailing some use cases of this subprovider package. +### Read the [Documentation](0xproject.com/docs/subproviders). + ## Installation ``` @@ -18,60 +20,6 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol ] ``` -## Usage - -Simply import the subprovider you are interested in using: - -```javascript -import { - ledgerEthereumBrowserClientFactoryAsync as ledgerEthereumClientFactoryAsync, - LedgerSubprovider, -} from '@0xproject/subproviders'; - -const ledgerSubprovider = new LedgerSubprovider({ - networkId, - ledgerEthereumClientFactoryAsync, -}); - -const accounts = await ledgerSubprovider.getAccountsAsync(); -``` - -### Subproviders - -#### Ledger Nano S subprovider - -A subprovider that enables your dApp to send signing requests to a user's Ledger Nano S hardware wallet. These can be requests to sign transactions or messages. - -Ledger Nano (and this library) by default uses a derivation path of `44'/60'/0'`. This is different to TestRPC which by default uses `m/44'/60'/0'/0`. This is a configuration option in the Ledger Subprovider package. - -##### Ledger Nano S + Node-hid (usb) - -By default, node-hid transport support is an optional dependency. This is due to the requirement of native usb developer packages on the host system. If these aren't installed the entire `npm install` fails. We also no longer export node-hid transport client factories. To re-create this see our integration tests or follow the example below: - -```typescript -import Eth from '@ledgerhq/hw-app-eth'; -import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'; -async function ledgerEthereumNodeJsClientFactoryAsync(): Promise { - const ledgerConnection = await TransportNodeHid.create(); - const ledgerEthClient = new Eth(ledgerConnection); - return ledgerEthClient; -} - -// Create a LedgerSubprovider with the node-hid transport -ledgerSubprovider = new LedgerSubprovider({ - networkId, - ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync, -}); -``` - -#### Redundant RPC subprovider - -A subprovider which attempts to send an RPC call to a list of RPC endpoints sequentially, until one of them returns a successful response. - -#### Injected Web3 subprovider - -A subprovider that relays all signing related requests to a particular provider (in our case the provider injected onto the web page), while sending all other requests to a different provider (perhaps your own backing Ethereum node or Infura). - ## Contributing We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository. diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index 75c73c4de..3a63ff80f 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -44,7 +44,8 @@ export class LedgerSubprovider extends Subprovider { } } /** - * Instantiates a LedgerSubprovider + * Instantiates a LedgerSubprovider. Defaults to derivationPath set to `44'/60'/0'`. + * TestRPC/Ganache defaults to `m/44'/60'/0'/0`, so set this in the configs if desired. * @param config Several available configurations * @return LedgerSubprovider instance */ diff --git a/packages/website/md/docs/subproviders/ledger_node_hid.md b/packages/website/md/docs/subproviders/ledger_node_hid.md new file mode 100644 index 000000000..3089817af --- /dev/null +++ b/packages/website/md/docs/subproviders/ledger_node_hid.md @@ -0,0 +1,17 @@ +By default, node-hid transport support is an optional dependency. This is due to the requirement of native usb developer packages on the host system. If these aren't installed the entire `npm install` fails. We also no longer export node-hid transport client factories. To re-create this see our integration tests or follow the example below: + +```typescript +import Eth from '@ledgerhq/hw-app-eth'; +import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'; +async function ledgerEthereumNodeJsClientFactoryAsync(): Promise { + const ledgerConnection = await TransportNodeHid.create(); + const ledgerEthClient = new Eth(ledgerConnection); + return ledgerEthClient; +} + +// Create a LedgerSubprovider with the node-hid transport +ledgerSubprovider = new LedgerSubprovider({ + networkId, + ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync, +}); +``` diff --git a/packages/website/ts/containers/subproviders_documentation.ts b/packages/website/ts/containers/subproviders_documentation.ts index 34a3d7da2..7aa05f9a5 100644 --- a/packages/website/ts/containers/subproviders_documentation.ts +++ b/packages/website/ts/containers/subproviders_documentation.ts @@ -14,6 +14,7 @@ import { Translate } from 'ts/utils/translate'; /* tslint:disable:no-var-requires */ const IntroMarkdown = require('md/docs/subproviders/introduction'); const InstallationMarkdown = require('md/docs/subproviders/installation'); +const LedgerNodeHidMarkdown = require('md/docs/subproviders/ledger_node_hid'); /* tslint:enable:no-var-requires */ const docSections = { @@ -21,6 +22,7 @@ const docSections = { installation: 'installation', subprovider: 'subprovider', ledgerSubprovider: 'ledgerSubprovider', + ledgerNodeHid: 'ledger-node-hid-issue', factoryMethods: 'factory-methods', emptyWalletSubprovider: 'emptyWalletSubprovider', fakeGasEstimateSubprovider: 'fakeGasEstimateSubprovider', @@ -41,6 +43,7 @@ const docsInfoConfig: DocsInfoConfig = { install: [docSections.installation], subprovider: [docSections.subprovider], ['ledger-subprovider']: [docSections.ledgerSubprovider], + ['ledger-node-hid-issue']: [docSections.ledgerNodeHid], ['factory-methods']: [docSections.factoryMethods], ['emptyWallet-subprovider']: [docSections.emptyWalletSubprovider], ['fakeGasEstimate-subprovider']: [docSections.fakeGasEstimateSubprovider], @@ -53,6 +56,7 @@ const docsInfoConfig: DocsInfoConfig = { sectionNameToMarkdown: { [docSections.introduction]: IntroMarkdown, [docSections.installation]: InstallationMarkdown, + [docSections.ledgerNodeHid]: LedgerNodeHidMarkdown, }, sectionNameToModulePath: { [docSections.subprovider]: ['"subproviders/src/subproviders/subprovider"'], -- cgit v1.2.3 From a555a8a374743c4e4be3647110e664dd3d799432 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:24:45 +0000 Subject: Improve subproviders comment --- packages/subproviders/src/subproviders/empty_wallet_subprovider.ts | 2 +- packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts | 2 +- packages/subproviders/src/subproviders/ganache.ts | 2 +- packages/subproviders/src/subproviders/injected_web3.ts | 2 +- packages/subproviders/src/subproviders/nonce_tracker.ts | 2 +- packages/subproviders/src/subproviders/redundant_rpc.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts index 38972b6cf..4cf3ece69 100644 --- a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts @@ -9,7 +9,7 @@ import { Subprovider } from './subprovider'; * It intercepts the `eth_accounts` JSON RPC requests and never returns any addresses when queried. */ export class EmptyWalletSubprovider extends Subprovider { - // This method needs to be here to satisfy the interface but linter wants it to be static. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts index 8241e58f2..eff4439b4 100644 --- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts +++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts @@ -23,7 +23,7 @@ export class FakeGasEstimateSubprovider extends Subprovider { super(); this._constantGasAmount = constantGasAmount; } - // This method needs to be here to satisfy the interface but linter wants it to be static. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts index 22ac5e1e2..feb17f8c5 100644 --- a/packages/subproviders/src/subproviders/ganache.ts +++ b/packages/subproviders/src/subproviders/ganache.ts @@ -19,7 +19,7 @@ export class GanacheSubprovider extends Subprovider { super(); this._ganacheProvider = Ganache.provider(opts); } - // This method needs to be here to satisfy the interface but linter wants it to be static. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { this._ganacheProvider.sendAsync(payload, (err: Error | null, result: any) => { diff --git a/packages/subproviders/src/subproviders/injected_web3.ts b/packages/subproviders/src/subproviders/injected_web3.ts index 3e3744d5c..73c7e59db 100644 --- a/packages/subproviders/src/subproviders/injected_web3.ts +++ b/packages/subproviders/src/subproviders/injected_web3.ts @@ -21,7 +21,7 @@ export class InjectedWeb3Subprovider extends Subprovider { super(); this._injectedWeb3 = new Web3(provider); } - // This method needs to be here to satisfy the interface but linter wants it to be static. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { diff --git a/packages/subproviders/src/subproviders/nonce_tracker.ts b/packages/subproviders/src/subproviders/nonce_tracker.ts index b51ba4ac8..919aa861f 100644 --- a/packages/subproviders/src/subproviders/nonce_tracker.ts +++ b/packages/subproviders/src/subproviders/nonce_tracker.ts @@ -46,7 +46,7 @@ export class NonceTrackerSubprovider extends Subprovider { throw new Error(NonceSubproviderErrors.CannotDetermineAddressFromPayload); } } - // Required to implement this public interface which doesn't conform to our linting rule. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private async handleRequest( payload: Web3.JSONRPCRequestPayload, diff --git a/packages/subproviders/src/subproviders/redundant_rpc.ts b/packages/subproviders/src/subproviders/redundant_rpc.ts index 2b84d223b..55b4128f4 100644 --- a/packages/subproviders/src/subproviders/redundant_rpc.ts +++ b/packages/subproviders/src/subproviders/redundant_rpc.ts @@ -45,7 +45,7 @@ export class RedundantRPCSubprovider extends Subprovider { }); }); } - // Required to implement this public interface which doesn't conform to our linting rule. + // This method must conform to the web3-provider-engine interface // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected private async handleRequest( payload: Web3.JSONRPCRequestPayload, -- cgit v1.2.3 From ec219fc3959cb4721a559472a872598f8dbee719 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:24:54 +0000 Subject: Add comments to sol-cov --- packages/sol-cov/src/coverage_subprovider.ts | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index bc59d5ef8..1d3f263b0 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -12,18 +12,25 @@ interface MaybeFakeTxData extends Web3.TxData { isFakeTransaction?: boolean; } -/* - * This class implements the web3-provider-engine subprovider interface and collects traces of all transactions that were sent and all calls that were executed. - * Because there is no notion of call trace in the rpc - we collect them in rather non-obvious/hacky way. +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC. + * Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way. * On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot. - * That allows us to not influence the test behaviour. - * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js + * That allows us to avoid influencing test behaviour. */ export class CoverageSubprovider extends Subprovider { // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise private _lock: Lock; private _coverageManager: CoverageManager; private _defaultFromAddress: string; + /** + * Instantiates a CoverageSubprovider + * @param artifactsPath Path to the smart contract artifacts + * @param sourcePath Path to the smart contract source files + * @param networkId network id + * @param defaultFromAddress default from address to use when sending transactions + */ constructor(artifactsPath: string, sourcesPath: string, networkId: number, defaultFromAddress: string) { super(); this._lock = new Lock(); @@ -35,7 +42,12 @@ export class CoverageSubprovider extends Subprovider { this._getContractCodeAsync.bind(this), ); } - public handleRequest(payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) { + public async writeCoverageAsync(): Promise { + await this._coverageManager.writeCoverageAsync(); + } + // This method must conform to the web3-provider-engine interface + // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected + private handleRequest(payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) { switch (payload.method) { case 'eth_sendTransaction': const txData = payload.params[0]; @@ -53,9 +65,6 @@ export class CoverageSubprovider extends Subprovider { return; } } - public async writeCoverageAsync(): Promise { - await this._coverageManager.writeCoverageAsync(); - } private async _onTransactionSentAsync( txData: MaybeFakeTxData, err: Error | null, -- cgit v1.2.3 From 6fef533fffba7e1ff559fb139be2dd29760db884 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:38:45 +0000 Subject: Improve comments --- packages/sol-cov/src/coverage_subprovider.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 1d3f263b0..fc06720de 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -12,12 +12,13 @@ interface MaybeFakeTxData extends Web3.TxData { isFakeTransaction?: boolean; } +// Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way. +// On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot. +// That allows us to avoid influencing test behaviour. + /** * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC. - * Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way. - * On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot. - * That allows us to avoid influencing test behaviour. */ export class CoverageSubprovider extends Subprovider { // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise @@ -25,9 +26,9 @@ export class CoverageSubprovider extends Subprovider { private _coverageManager: CoverageManager; private _defaultFromAddress: string; /** - * Instantiates a CoverageSubprovider + * Instantiates a CoverageSubprovider instance * @param artifactsPath Path to the smart contract artifacts - * @param sourcePath Path to the smart contract source files + * @param sourcesPath Path to the smart contract source files * @param networkId network id * @param defaultFromAddress default from address to use when sending transactions */ @@ -42,6 +43,9 @@ export class CoverageSubprovider extends Subprovider { this._getContractCodeAsync.bind(this), ); } + /** + * Write the test coverage results to a file in Istanbul format. + */ public async writeCoverageAsync(): Promise { await this._coverageManager.writeCoverageAsync(); } -- cgit v1.2.3 From 542b46a22feb6187e483aa4e9ccee344a9b64ec6 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:40:59 +0000 Subject: Move usage out of README and replace with link to Docs --- packages/sol-cov/README.md | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/packages/sol-cov/README.md b/packages/sol-cov/README.md index 6a98346f9..466595f4e 100644 --- a/packages/sol-cov/README.md +++ b/packages/sol-cov/README.md @@ -2,41 +2,26 @@ A Solidity code coverage tool. +### Read the [Documentation](0xproject.com/docs/sol-cov). + ## Installation ```bash -yarn add -D @0xproject/sol-cov +npm install @0xproject/sol-cov --save ``` -## Usage - -Sol-cov uses transaction traces in order to figure out which lines of Solidity source code have been covered by your tests. In order for it to gather these traces, you must add the `CoverageSubprovider` to the [ProviderEngine](https://github.com/MetaMask/provider-engine) instance you use when running your Solidity tests. If you're unfamiliar with ProviderEngine, please read the [Web3 Provider explained](https://0xproject.com/wiki#Web3-Provider-Explained) wiki article. +**Import** -The CoverageSubprovider eavesdrops on the `eth_sendTransaction` and `eth_call` RPC calls and collects traces after each call using `debug_traceTransaction`. `eth_call`'s' don't generate traces - so we take a snapshot, re-submit it as a transaction, get the trace and then revert the snapshot. - -```typescript +```javascript import { CoverageSubprovider } from '@0xproject/sol-cov'; - -const provider = new ProviderEngine(); - -const artifactsPath = 'src/artifacts'; -const contractsPath = 'src/contracts'; -const networkId = 50; -// Some calls might not have `from` address specified. Nevertheless - transactions need to be submitted from an address with at least some funds. defaultFromAddress is the address that will be used to submit those calls as transactions from. -const defaultFromAddress = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; -const coverageSubprovider = new CoverageSubprovider(artifactsPath, contractsPath, networkId, defaultFromAddress); - -provider.addProvider(coverageSubprovider); ``` -After your test suite is complete (e.g global `after` hook), you'll need to call: +or -```typescript -await coverageSubprovider.writeCoverageAsync(); +```javascript +var CoverageSubprovider = require('@0xproject/sol-cov').CoverageSubprovider; ``` -This will create a `coverage.json` file in the `coverage` directory. This file has an [Istanbul format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md) - so you can use any of the existing Instanbul reporters. - ## Contributing We strongly encourage the community to help us make improvements. To report bugs within this package, please create an issue in this repository. -- cgit v1.2.3 From d437a660198a36c585f6cd5fe1bd13643da52ecb Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:51:17 +0000 Subject: Add comments to JSON-schemas public methods --- packages/json-schemas/src/schema_validator.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/json-schemas/src/schema_validator.ts b/packages/json-schemas/src/schema_validator.ts index e13326d2a..38ae766e6 100644 --- a/packages/json-schemas/src/schema_validator.ts +++ b/packages/json-schemas/src/schema_validator.ts @@ -3,14 +3,26 @@ import values = require('lodash.values'); import { schemas } from './schemas'; +/** + * A validator for [JSON-schemas](http://json-schema.org/) + */ export class SchemaValidator { private _validator: Validator; + /** + * Instantiates a SchemaValidator instance + */ constructor() { this._validator = new Validator(); for (const schema of values(schemas)) { this._validator.addSchema(schema, schema.id); } } + /** + * Add a schema to the validator. All schemas and sub-schemas must be added to + * the validator before the `validate` and `isValid` methods can be called with + * instances of that schema. + * @param schema The schema to add + */ public addSchema(schema: Schema) { this._validator.addSchema(schema, schema.id); } @@ -18,10 +30,22 @@ export class SchemaValidator { // sub-types (e.g BigNumber) with a simpler string representation. Since BigNumber and other // complex types implement the `toString` method, we can stringify the object and // then parse it. The resultant object can then be checked using jsonschema. + /** + * Validate the JS object conforms to a specific JSON schema + * @param instance JS object in question + * @param schema Schema to check against + * @returns The results of the validation + */ public validate(instance: any, schema: Schema): ValidatorResult { const jsonSchemaCompatibleObject = JSON.parse(JSON.stringify(instance)); return this._validator.validate(jsonSchemaCompatibleObject, schema); } + /** + * Check whether an instance properly adheres to a JSON schema + * @param instance JS object in question + * @param schema Schema to check against + * @returns Whether or not the instance adheres to the schema + */ public isValid(instance: any, schema: Schema): boolean { const isValid = this.validate(instance, schema).errors.length === 0; return isValid; -- cgit v1.2.3 From e1341bc6d957d70a386c858cbdb64af5f284fd07 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 21 Mar 2018 18:55:59 +0000 Subject: Move docs to page and add link to docs to README --- packages/json-schemas/README.md | 19 +++++++++---------- packages/website/md/docs/json_schemas/usage.md | 14 ++++++++++++++ .../ts/containers/json_schemas_documentation.ts | 4 ++++ 3 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 packages/website/md/docs/json_schemas/usage.md diff --git a/packages/json-schemas/README.md b/packages/json-schemas/README.md index 754ce4e95..961c3746d 100644 --- a/packages/json-schemas/README.md +++ b/packages/json-schemas/README.md @@ -2,25 +2,24 @@ Contains 0x-related json schemas +### Read the [Documentation](0xproject.com/docs/json-schemas). + ## Installation ```bash -yarn add @0xproject/json-schemas +npm install @0xproject/json-schemas --save ``` -## Usage +**Import** ```javascript -import {SchemaValidator, ValidatorResult, schemas} from '@0xproject/json-schemas'; +import { schemas } from '@0xproject/json-schemas'; +``` -const {orderSchema} = schemas; -const validator = new SchemaValidator(); +or -const order = { - ... -}; -const validatorResult: ValidatorResult = validator.validate(order, orderSchema); // Contains all errors -const isValid: boolean = validator.isValid(order, orderSchema); // Only returns boolean +```javascript +var schemas = require('@0xproject/json-schemas').schemas; ``` ## Contributing diff --git a/packages/website/md/docs/json_schemas/usage.md b/packages/website/md/docs/json_schemas/usage.md new file mode 100644 index 000000000..372c0b541 --- /dev/null +++ b/packages/website/md/docs/json_schemas/usage.md @@ -0,0 +1,14 @@ +The following example shows you how to validate an 0x order using the `@0xproject/json-schemas` package. + +```javascript +import {SchemaValidator, ValidatorResult, schemas} from '@0xproject/json-schemas'; + +const {orderSchema} = schemas; +const validator = new SchemaValidator(); + +const order = { + ... +}; +const validatorResult: ValidatorResult = validator.validate(order, orderSchema); // Contains all errors +const isValid: boolean = validator.isValid(order, orderSchema); // Only returns boolean +``` diff --git a/packages/website/ts/containers/json_schemas_documentation.ts b/packages/website/ts/containers/json_schemas_documentation.ts index 42e441212..154c65ffc 100644 --- a/packages/website/ts/containers/json_schemas_documentation.ts +++ b/packages/website/ts/containers/json_schemas_documentation.ts @@ -14,12 +14,14 @@ import { Translate } from 'ts/utils/translate'; /* tslint:disable:no-var-requires */ const IntroMarkdown = require('md/docs/json_schemas/introduction'); const InstallationMarkdown = require('md/docs/json_schemas/installation'); +const UsageMarkdown = require('md/docs/json_schemas/usage'); const SchemasMarkdown = require('md/docs/json_schemas/schemas'); /* tslint:enable:no-var-requires */ const docSections = { introduction: 'introduction', installation: 'installation', + usage: 'usage', schemaValidator: 'schemaValidator', schemas: 'schemas', }; @@ -32,6 +34,7 @@ const docsInfoConfig: DocsInfoConfig = { menu: { introduction: [docSections.introduction], install: [docSections.installation], + usage: [docSections.usage], schemaValidator: [docSections.schemaValidator], schemas: [docSections.schemas], }, @@ -39,6 +42,7 @@ const docsInfoConfig: DocsInfoConfig = { [docSections.introduction]: IntroMarkdown, [docSections.installation]: InstallationMarkdown, [docSections.schemas]: SchemasMarkdown, + [docSections.usage]: UsageMarkdown, }, sectionNameToModulePath: { [docSections.schemaValidator]: ['"json-schemas/src/schema_validator"'], -- cgit v1.2.3 From 4e5cd472c2b784ca2314eea76b1a106fd04ef0ad Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Wed, 21 Mar 2018 12:57:16 -0700 Subject: Refactor TokenState type --- packages/website/ts/components/eth_wrappers.tsx | 59 +++++++++++------------ packages/website/ts/components/token_balances.tsx | 9 +--- packages/website/ts/components/wallet.tsx | 12 +---- packages/website/ts/types.ts | 15 ++++-- 4 files changed, 40 insertions(+), 55 deletions(-) diff --git a/packages/website/ts/components/eth_wrappers.tsx b/packages/website/ts/components/eth_wrappers.tsx index b12c637e5..59afeb50b 100644 --- a/packages/website/ts/components/eth_wrappers.tsx +++ b/packages/website/ts/components/eth_wrappers.tsx @@ -10,7 +10,14 @@ import ReactTooltip = require('react-tooltip'); import { Blockchain } from 'ts/blockchain'; import { EthWethConversionButton } from 'ts/components/eth_weth_conversion_button'; import { Dispatcher } from 'ts/redux/dispatcher'; -import { OutdatedWrappedEtherByNetworkId, Side, Token, TokenByAddress, TokenState } from 'ts/types'; +import { + OutdatedWrappedEtherByNetworkId, + Side, + Token, + TokenByAddress, + TokenState, + TokenStateByAddress, +} from 'ts/types'; import { configs } from 'ts/utils/configs'; import { constants } from 'ts/utils/constants'; import { utils } from 'ts/utils/utils'; @@ -20,13 +27,6 @@ const ICON_DIMENSION = 40; const ETHER_ICON_PATH = '/images/ether.png'; const OUTDATED_WETH_ICON_PATH = '/images/wrapped_eth_gray.png'; -interface OutdatedWETHAddressToIsStateLoaded { - [address: string]: boolean; -} -interface OutdatedWETHStateByAddress { - [address: string]: TokenState; -} - interface EthWrappersProps { networkId: number; blockchain: Blockchain; @@ -39,9 +39,7 @@ interface EthWrappersProps { interface EthWrappersState { ethTokenState: TokenState; - isWethStateLoaded: boolean; - outdatedWETHAddressToIsStateLoaded: OutdatedWETHAddressToIsStateLoaded; - outdatedWETHStateByAddress: OutdatedWETHStateByAddress; + outdatedWETHStateByAddress: TokenStateByAddress; } export class EthWrappers extends React.Component { @@ -50,22 +48,20 @@ export class EthWrappers extends React.Component { - outdatedWETHAddressToIsStateLoaded[outdatedWETHAddress] = false; outdatedWETHStateByAddress[outdatedWETHAddress] = { balance: new BigNumber(0), allowance: new BigNumber(0), + isLoaded: false, }; }); this.state = { - outdatedWETHAddressToIsStateLoaded, outdatedWETHStateByAddress, - isWethStateLoaded: false, ethTokenState: { balance: new BigNumber(0), allowance: new BigNumber(0), + isLoaded: false, }, }; } @@ -169,7 +165,7 @@ export class EthWrappers extends React.Component - {this.state.isWethStateLoaded ? ( + {this.state.ethTokenState.isLoaded ? ( `${wethBalance.toFixed(configs.AMOUNT_DISPLAY_PRECSION)} WETH` ) : ( @@ -183,7 +179,7 @@ export class EthWrappers extends React.Component Date: Wed, 21 Mar 2018 14:13:16 -0700 Subject: Updated padding and colors --- packages/react-shared/CHANGELOG.md | 4 ++++ packages/react-shared/src/utils/colors.ts | 3 +++ packages/website/ts/components/wallet.tsx | 13 +++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/react-shared/CHANGELOG.md b/packages/react-shared/CHANGELOG.md index 43b92d58a..bf0fb7ab1 100644 --- a/packages/react-shared/CHANGELOG.md +++ b/packages/react-shared/CHANGELOG.md @@ -1,3 +1,7 @@ # CHANGELOG +## v0.1.0 - _TBD, 2018_ + + * Added new colors (#468) + ## v0.0.1 - _March 8, 2018_ diff --git a/packages/react-shared/src/utils/colors.ts b/packages/react-shared/src/utils/colors.ts index 2eead95c7..ea0165305 100644 --- a/packages/react-shared/src/utils/colors.ts +++ b/packages/react-shared/src/utils/colors.ts @@ -45,4 +45,7 @@ export const colors = { orange: '#E69D00', amber800: '#FF8F00', darkYellow: '#caca03', + walletBoxShadow: 'rgba(56, 59, 137, 0.2)', + walletBorder: '#f5f5f6', + walletDefaultItemBackground: '#fbfbfc', }; diff --git a/packages/website/ts/components/wallet.tsx b/packages/website/ts/components/wallet.tsx index 4e7d0776e..a3ba92ee1 100644 --- a/packages/website/ts/components/wallet.tsx +++ b/packages/website/ts/components/wallet.tsx @@ -1,5 +1,6 @@ import { ZeroEx } from '0x.js'; import { + colors, constants as sharedConstants, EtherscanLinkSuffixes, Styles, @@ -59,16 +60,16 @@ interface AccessoryItemConfig { const styles: Styles = { wallet: { width: 346, - backgroundColor: '#ffffff', + backgroundColor: colors.white, borderBottomRightRadius: 10, borderBottomLeftRadius: 10, borderTopRightRadius: 10, borderTopLeftRadius: 10, - boxShadow: '0px 4px 6px rgba(56, 59, 137, 0.2)', + boxShadow: `0px 4px 6px ${colors.walletBoxShadow}`, overflow: 'hidden', }, list: { - padding: '0px 0px 0px 0px', + padding: 0, }, tokenItemInnerDiv: { paddingLeft: 60, @@ -80,12 +81,12 @@ const styles: Styles = { paddingLeft: 24, }, borderedItem: { - borderBottomColor: '#f5f5f6', + borderBottomColor: colors.walletBorder, borderBottomStyle: 'solid', borderWidth: 1, }, tokenItem: { - backgroundColor: '#fbfbfc', + backgroundColor: colors.walletDefaultItemBackground, paddingTop: 8, paddingBottom: 8, }, @@ -98,7 +99,7 @@ const styles: Styles = { }, amountLabel: { fontWeight: 'bold', - color: 'black', + color: colors.black, }, }; -- cgit v1.2.3 From 3916383dd007debc647dc9ac67878cff66f6ea94 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Wed, 21 Mar 2018 14:21:19 -0700 Subject: Other style changes --- packages/website/ts/components/wallet.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/website/ts/components/wallet.tsx b/packages/website/ts/components/wallet.tsx index a3ba92ee1..738f18330 100644 --- a/packages/website/ts/components/wallet.tsx +++ b/packages/website/ts/components/wallet.tsx @@ -144,13 +144,13 @@ export class Wallet extends React.Component { // Add placeholder entry for this token to the state, since fetching the // balance/allowance is asynchronous const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress; - for (const tokenAddress of newTokenAddresses) { + _.each(newTokenAddresses, (tokenAddress: string) => { trackedTokenStateByAddress[tokenAddress] = { balance: new BigNumber(0), allowance: new BigNumber(0), isLoaded: false, }; - } + }); this.setState({ trackedTokenStateByAddress, }); @@ -161,7 +161,7 @@ export class Wallet extends React.Component { } public render() { const isReadyToRender = this.props.blockchainIsLoaded && this.props.blockchainErr === BlockchainErrs.NoError; - return
    {isReadyToRender ? this._renderRows() :
    }
    ; + return
    {isReadyToRender && this._renderRows()}
    ; } private _renderRows() { return ( -- cgit v1.2.3 From 9f8e41cbfacf98f381bb388180f1134c01501321 Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Wed, 21 Mar 2018 15:45:11 -0700 Subject: Change blockchain prop to not optional --- packages/website/ts/components/wallet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/ts/components/wallet.tsx b/packages/website/ts/components/wallet.tsx index 738f18330..8c6ef9cad 100644 --- a/packages/website/ts/components/wallet.tsx +++ b/packages/website/ts/components/wallet.tsx @@ -28,7 +28,7 @@ import { utils } from 'ts/utils/utils'; export interface WalletProps { userAddress?: string; networkId?: number; - blockchain?: Blockchain; + blockchain: Blockchain; blockchainIsLoaded: boolean; blockchainErr: BlockchainErrs; dispatcher: Dispatcher; -- cgit v1.2.3 From 46b7fecafe283e814e2088373ec857747e4cf314 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 11:56:12 +0000 Subject: Create helper function for converting dashes names for display --- packages/react-shared/src/components/markdown_section.tsx | 2 +- packages/react-shared/src/components/nested_sidebar_menu.tsx | 4 ++-- packages/react-shared/src/components/section_header.tsx | 2 +- packages/react-shared/src/utils/utils.ts | 3 +++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/react-shared/src/components/markdown_section.tsx b/packages/react-shared/src/components/markdown_section.tsx index e895afd2a..449e8a045 100644 --- a/packages/react-shared/src/components/markdown_section.tsx +++ b/packages/react-shared/src/components/markdown_section.tsx @@ -43,7 +43,7 @@ export class MarkdownSection extends React.Component { - const finalSectionName = sectionName.replace(/-/g, ' '); + const finalSectionName = utils.convertDashesToSpaces(sectionName); if (this.props.shouldDisplaySectionHeaders) { const id = utils.getIdFromName(sectionName); return ( @@ -85,7 +85,7 @@ export class NestedSidebarMenu extends React.Component { - const finalMenuItemName = menuItemName.replace(/-/g, ' '); + const finalMenuItemName = utils.convertDashesToSpaces(menuItemName); const id = utils.getIdFromName(menuItemName); return (
    diff --git a/packages/react-shared/src/components/section_header.tsx b/packages/react-shared/src/components/section_header.tsx index 2ef5f61ee..0224c2127 100644 --- a/packages/react-shared/src/components/section_header.tsx +++ b/packages/react-shared/src/components/section_header.tsx @@ -35,7 +35,7 @@ export class SectionHeader extends React.Component Date: Thu, 22 Mar 2018 12:46:52 +0000 Subject: Add default docs icon --- packages/website/public/images/doc_icons/docs.png | Bin 0 -> 578 bytes packages/website/ts/pages/documentation/doc_page.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/website/public/images/doc_icons/docs.png diff --git a/packages/website/public/images/doc_icons/docs.png b/packages/website/public/images/doc_icons/docs.png new file mode 100644 index 000000000..17df04310 Binary files /dev/null and b/packages/website/public/images/doc_icons/docs.png differ diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index e2fcca084..030c37438 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -16,7 +16,7 @@ import { Translate } from 'ts/utils/translate'; import { utils } from 'ts/utils/utils'; const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT; -const DEFAULT_ICON = 'zeroExJs.png'; +const DEFAULT_ICON = 'docs.png'; const ZERO_EX_JS_VERSION_MISSING_TOPLEVEL_PATH = '0.32.4'; const idToIcon: { [id: string]: string } = { -- cgit v1.2.3 From c570f3865f7c83f9b05d448c480fd37b77e2c35a Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 12:53:41 +0000 Subject: Use yarn instead of npm --- packages/deployer/README.md | 4 ++-- packages/json-schemas/README.md | 2 +- packages/website/md/docs/deployer/installation.md | 4 ++-- packages/website/md/docs/json_schemas/installation.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/deployer/README.md b/packages/deployer/README.md index c65571e83..8fe82f59e 100644 --- a/packages/deployer/README.md +++ b/packages/deployer/README.md @@ -9,13 +9,13 @@ This repository contains a CLI tool that facilitates compiling and deployment of #### CLI Installation ```bash -npm install @0xproject/deployer -g +yarn global add @0xproject/deployer ``` #### API Installation ```bash -npm install @0xproject/deployer --save +yarn add @0xproject/deployer ``` **Import** diff --git a/packages/json-schemas/README.md b/packages/json-schemas/README.md index 961c3746d..f320196e9 100644 --- a/packages/json-schemas/README.md +++ b/packages/json-schemas/README.md @@ -7,7 +7,7 @@ Contains 0x-related json schemas ## Installation ```bash -npm install @0xproject/json-schemas --save +yarn add @0xproject/json-schemas ``` **Import** diff --git a/packages/website/md/docs/deployer/installation.md b/packages/website/md/docs/deployer/installation.md index 48dd52c1f..c02dbadc6 100644 --- a/packages/website/md/docs/deployer/installation.md +++ b/packages/website/md/docs/deployer/installation.md @@ -1,13 +1,13 @@ #### CLI Installation ```bash -npm install @0xproject/deployer -g +yarn global add @0xproject/deployer ``` #### API Installation ```bash -npm install @0xproject/deployer --save +yarn add @0xproject/deployer ``` **Import** diff --git a/packages/website/md/docs/json_schemas/installation.md b/packages/website/md/docs/json_schemas/installation.md index 53886b6b3..50a37bae1 100644 --- a/packages/website/md/docs/json_schemas/installation.md +++ b/packages/website/md/docs/json_schemas/installation.md @@ -1,7 +1,7 @@ **Install** ```bash -npm install @0xproject/json-schemas --save +yarn add @0xproject/json-schemas ``` **Import** -- cgit v1.2.3 From 54ae94dde01af6324cf7e91538f93e5bd3418c1e Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 12:53:51 +0000 Subject: Fix benefits list --- packages/website/md/docs/deployer/introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/website/md/docs/deployer/introduction.md b/packages/website/md/docs/deployer/introduction.md index 114b71bde..c2e2ab24b 100644 --- a/packages/website/md/docs/deployer/introduction.md +++ b/packages/website/md/docs/deployer/introduction.md @@ -8,8 +8,8 @@ Deployer has the following advantages over Truffle: * Improved artifact files: * Properly segregated artifacts to support storing different versions of smart contract deployed on different networks. * Storage of contructor args and contract source code -* An easy to maintain codebase: TypeScript + Single package -* Allows you to specify the deployer address +* An easy to maintain codebase: TypeScript + Single repo +* Allows you to specify the deployer RPC address * Migrations that work with `async/await` * Migrations that can be written synchronously in order to guarentee deterministic contract addresses * No race conditions when running migrations. -- cgit v1.2.3 From 6af0f08dfc4b161637fe51b131a1c497494355eb Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 12:54:03 +0000 Subject: Remove no longer existent command --- packages/website/md/docs/deployer/usage.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/website/md/docs/deployer/usage.md b/packages/website/md/docs/deployer/usage.md index 2cfd5ca37..295af55e1 100644 --- a/packages/website/md/docs/deployer/usage.md +++ b/packages/website/md/docs/deployer/usage.md @@ -6,7 +6,6 @@ $ 0x-deployer --help Commands: 0x-deployer compile compile contracts - 0x-deployer migrate compile and deploy contracts using migration scripts 0x-deployer deploy deploy a single contract with provided arguments Options: -- cgit v1.2.3 From 8743c40911c98fad781de631af0348d0120fc153 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 13:32:14 +0000 Subject: Use isEmpty --- packages/react-docs/src/components/documentation.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-docs/src/components/documentation.tsx b/packages/react-docs/src/components/documentation.tsx index 67523dcc3..14fe175cf 100644 --- a/packages/react-docs/src/components/documentation.tsx +++ b/packages/react-docs/src/components/documentation.tsx @@ -248,26 +248,26 @@ export class Documentation extends React.Component {docSection.comment && } - {docSection.constructors.length > 0 && + {!_.isEmpty(docSection.constructors) && this.props.docsInfo.isVisibleConstructor(sectionName) && (

    Constructor

    {this._renderConstructors(docSection.constructors, sectionName, typeDefinitionByName)}
    )} - {docSection.properties.length > 0 && ( + {!_.isEmpty(docSection.properties) && (

    Properties

    {propertyDefs}
    )} - {docSection.methods.length > 0 && ( + {!_.isEmpty(docSection.methods) && (

    Methods

    {methodDefs}
    )} - {docSection.functions.length > 0 && ( + {!_.isEmpty(docSection.functions) && (

    Functions

    {functionDefs}
    -- cgit v1.2.3 From a7c24a17f4c9a4cba6a8c57cf901449169785489 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 14:33:40 +0000 Subject: Fix lint rules directory --- packages/tslint-config/tslint.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tslint-config/tslint.json b/packages/tslint-config/tslint.json index 3266b022f..aacfb6d59 100644 --- a/packages/tslint-config/tslint.json +++ b/packages/tslint-config/tslint.json @@ -96,5 +96,5 @@ "jsx-wrap-multiline": false, "jsx-no-bind": false }, - "rulesDirectory": "lib" + "rulesDirectory": "lib/rules" } -- cgit v1.2.3 From 5779ffd01b6925f56778601ff54df4f39289d1c7 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:52:40 +0000 Subject: Add assertion to notify any developer trying to render a package with files containing multiple classes --- packages/react-docs/src/utils/typedoc_utils.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index 87b9e44ba..fff27a834 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -85,6 +85,16 @@ export const typeDocUtils = { let entities; let packageComment = ''; // HACK: We assume 1 exported class per file + const numClassChildren = _.reduce( + packageDefinitionWithMergedChildren.children, + (sum: number, child: TypeDocNode) => { + const nextSum = child.kindString === KindString.Class ? sum + 1 : sum; + return nextSum; + }, + ); + if (numClassChildren > 1) { + throw new Error('`react-docs` only supports projects with 1 exported class per file'); + } const isClassExport = packageDefinitionWithMergedChildren.children[0].kindString === KindString.Class; if (isClassExport) { entities = packageDefinitionWithMergedChildren.children[0].children; -- cgit v1.2.3 From 552b14b1fa3b2c75e3f4519743174609f45ba498 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:53:13 +0000 Subject: npm -> yarn --- packages/sol-cov/README.md | 2 +- packages/website/md/docs/sol_cov/installation.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sol-cov/README.md b/packages/sol-cov/README.md index 466595f4e..5591b9731 100644 --- a/packages/sol-cov/README.md +++ b/packages/sol-cov/README.md @@ -7,7 +7,7 @@ A Solidity code coverage tool. ## Installation ```bash -npm install @0xproject/sol-cov --save +yarn add @0xproject/sol-cov ``` **Import** diff --git a/packages/website/md/docs/sol_cov/installation.md b/packages/website/md/docs/sol_cov/installation.md index 17362d89a..b9ce25a5f 100644 --- a/packages/website/md/docs/sol_cov/installation.md +++ b/packages/website/md/docs/sol_cov/installation.md @@ -1,7 +1,7 @@ **Install** ```bash -npm install @0xproject/sol-cov --save +yarn add @0xproject/sol-cov ``` **Import** -- cgit v1.2.3 From b39d87f357a785ce68d65477f024f24d44cd0dac Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:53:20 +0000 Subject: Remove space --- packages/website/ts/pages/documentation/doc_page.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx index 030c37438..8ec1a023d 100644 --- a/packages/website/ts/pages/documentation/doc_page.tsx +++ b/packages/website/ts/pages/documentation/doc_page.tsx @@ -69,7 +69,6 @@ export class DocPage extends React.Component { public componentWillUnmount() { this._isUnmounted = true; } - public render() { const menuSubsectionsBySection = _.isUndefined(this.state.docAgnosticFormat) ? {} -- cgit v1.2.3 From 7c874472412126b82a6e302f8dbc5f17baaa8e8f Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:53:39 +0000 Subject: Fix lazy load so each doc page is a separate bundle --- packages/website/ts/index.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx index 0d33e389f..d542bd804 100644 --- a/packages/website/ts/index.tsx +++ b/packages/website/ts/index.tsx @@ -46,19 +46,19 @@ const LazyConnectDocumentation = createLazyComponent('Documentation', async () = System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/connect_documentation'), ); const LazyWeb3WrapperDocumentation = createLazyComponent('Documentation', async () => - System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/web3_wrapper_documentation'), + System.import(/* webpackChunkName: "web3WrapperDocs" */ 'ts/containers/web3_wrapper_documentation'), ); const LazyDeployerDocumentation = createLazyComponent('Documentation', async () => - System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/deployer_documentation'), + System.import(/* webpackChunkName: "deployerDocs" */ 'ts/containers/deployer_documentation'), ); const LazyJSONSchemasDocumentation = createLazyComponent('Documentation', async () => - System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/json_schemas_documentation'), + System.import(/* webpackChunkName: "jsonSchemasDocs" */ 'ts/containers/json_schemas_documentation'), ); const LazySolCovDocumentation = createLazyComponent('Documentation', async () => - System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/sol_cov_documentation'), + System.import(/* webpackChunkName: "solCovDocs" */ 'ts/containers/sol_cov_documentation'), ); const LazySubprovidersDocumentation = createLazyComponent('Documentation', async () => - System.import(/* webpackChunkName: "connectDocs" */ 'ts/containers/subproviders_documentation'), + System.import(/* webpackChunkName: "subproviderDocs" */ 'ts/containers/subproviders_documentation'), ); analytics.init(); -- cgit v1.2.3 From bcb9ee4cc2531660847046c575b9a4e57f82ced7 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:53:54 +0000 Subject: Make setEngine public --- packages/subproviders/src/subproviders/subprovider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/subproviders/src/subproviders/subprovider.ts b/packages/subproviders/src/subproviders/subprovider.ts index 0b30c6397..4fa351e11 100644 --- a/packages/subproviders/src/subproviders/subprovider.ts +++ b/packages/subproviders/src/subproviders/subprovider.ts @@ -46,10 +46,10 @@ export class Subprovider { } /** * Set's the subprovider's engine to the ProviderEngine it is added to. - * This is only called within the ProviderEngine source code + * This is only called within the ProviderEngine source code, do not call + * directly. */ - // tslint:disable-next-line:underscore-private-and-protected - private setEngine(engine: any): void { + public setEngine(engine: any): void { this._engine = engine; } } -- cgit v1.2.3 From de8450d5c93c5b46d227325ca225eadce9610af0 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 15:54:13 +0000 Subject: Make handleRequest public and add comment for it --- packages/sol-cov/src/coverage_subprovider.ts | 13 ++++++++++--- packages/subproviders/CHANGELOG.md | 2 -- .../src/subproviders/empty_wallet_subprovider.ts | 13 ++++++++++--- .../src/subproviders/fake_gas_estimate_subprovider.ts | 13 ++++++++++--- packages/subproviders/src/subproviders/ganache.ts | 13 ++++++++++--- packages/subproviders/src/subproviders/injected_web3.ts | 13 ++++++++++--- packages/subproviders/src/subproviders/ledger.ts | 13 ++++++++++--- packages/subproviders/src/subproviders/nonce_tracker.ts | 13 ++++++++++--- packages/subproviders/src/subproviders/redundant_rpc.ts | 13 ++++++++++--- 9 files changed, 80 insertions(+), 26 deletions(-) diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index fc06720de..37682c45f 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -49,9 +49,16 @@ export class CoverageSubprovider extends Subprovider { public async writeCoverageAsync(): Promise { await this._coverageManager.writeCoverageAsync(); } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private handleRequest(payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) { + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:prefer-function-over-method + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) { switch (payload.method) { case 'eth_sendTransaction': const txData = payload.params[0]; diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index 2947bb32e..cdf98cba3 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -4,8 +4,6 @@ * Introduce `JSONRPCRequestPayloadWithMethod` type (#465) * Export `ErrorCallback` type. (#465) - * Make `handleRequest` private in `LedgerSubprovider` since it should only be used - internally by the providerEngine. (#465) ## v0.8.0 - _March 18, 2018_ diff --git a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts index 4cf3ece69..dc570b152 100644 --- a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts +++ b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts @@ -9,9 +9,16 @@ import { Subprovider } from './subprovider'; * It intercepts the `eth_accounts` JSON RPC requests and never returns any addresses when queried. */ export class EmptyWalletSubprovider extends Subprovider { - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:prefer-function-over-method + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_accounts': end(null, []); diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts index eff4439b4..a6f978db1 100644 --- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts +++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts @@ -23,9 +23,16 @@ export class FakeGasEstimateSubprovider extends Subprovider { super(); this._constantGasAmount = constantGasAmount; } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:prefer-function-over-method + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'eth_estimateGas': end(null, this._constantGasAmount); diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts index feb17f8c5..fc0b9c3d2 100644 --- a/packages/subproviders/src/subproviders/ganache.ts +++ b/packages/subproviders/src/subproviders/ganache.ts @@ -19,9 +19,16 @@ export class GanacheSubprovider extends Subprovider { super(); this._ganacheProvider = Ganache.provider(opts); } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:prefer-function-over-method + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { this._ganacheProvider.sendAsync(payload, (err: Error | null, result: any) => { end(err, result && result.result); }); diff --git a/packages/subproviders/src/subproviders/injected_web3.ts b/packages/subproviders/src/subproviders/injected_web3.ts index 73c7e59db..cd9b0b603 100644 --- a/packages/subproviders/src/subproviders/injected_web3.ts +++ b/packages/subproviders/src/subproviders/injected_web3.ts @@ -21,9 +21,16 @@ export class InjectedWeb3Subprovider extends Subprovider { super(); this._injectedWeb3 = new Web3(provider); } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:prefer-function-over-method + public handleRequest(payload: Web3.JSONRPCRequestPayload, next: Callback, end: ErrorCallback) { switch (payload.method) { case 'web3_clientVersion': this._injectedWeb3.version.getNode(end); diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts index 3a63ff80f..8bc70d8b6 100644 --- a/packages/subproviders/src/subproviders/ledger.ts +++ b/packages/subproviders/src/subproviders/ledger.ts @@ -198,9 +198,16 @@ export class LedgerSubprovider extends Subprovider { throw err; } } - // Required to implement this public interface which doesn't conform to our linting rule. - // tslint:disable-next-line:async-suffix underscore-private-and-protected - private async handleRequest( + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:async-suffix + public async handleRequest( payload: Web3.JSONRPCRequestPayload, next: Callback, end: (err: Error | null, result?: any) => void, diff --git a/packages/subproviders/src/subproviders/nonce_tracker.ts b/packages/subproviders/src/subproviders/nonce_tracker.ts index 919aa861f..249f16199 100644 --- a/packages/subproviders/src/subproviders/nonce_tracker.ts +++ b/packages/subproviders/src/subproviders/nonce_tracker.ts @@ -46,9 +46,16 @@ export class NonceTrackerSubprovider extends Subprovider { throw new Error(NonceSubproviderErrors.CannotDetermineAddressFromPayload); } } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private async handleRequest( + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:async-suffix + public async handleRequest( payload: Web3.JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback, diff --git a/packages/subproviders/src/subproviders/redundant_rpc.ts b/packages/subproviders/src/subproviders/redundant_rpc.ts index 55b4128f4..ace2ed3c8 100644 --- a/packages/subproviders/src/subproviders/redundant_rpc.ts +++ b/packages/subproviders/src/subproviders/redundant_rpc.ts @@ -45,9 +45,16 @@ export class RedundantRPCSubprovider extends Subprovider { }); }); } - // This method must conform to the web3-provider-engine interface - // tslint:disable-next-line:prefer-function-over-method underscore-private-and-protected - private async handleRequest( + /** + * This method conforms to the web3-provider-engine interface. + * It is called internally by the ProviderEngine when it is this subproviders + * turn to handle a JSON RPC request. + * @param payload JSON RPC payload + * @param next Callback to call if this subprovider decides not to handle the request + * @param end Callback to call if subprovider handled the request and wants to pass back the request. + */ + // tslint:disable-next-line:async-suffix + public async handleRequest( payload: Web3.JSONRPCRequestPayload, next: Callback, end: (err: Error | null, data?: any) => void, -- cgit v1.2.3 From 21b797c3f98e66b0a13b96975df723946ff30999 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:00:55 +0000 Subject: Improve list of improvements --- packages/website/md/docs/deployer/introduction.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/website/md/docs/deployer/introduction.md b/packages/website/md/docs/deployer/introduction.md index c2e2ab24b..7ebd26a3c 100644 --- a/packages/website/md/docs/deployer/introduction.md +++ b/packages/website/md/docs/deployer/introduction.md @@ -4,14 +4,15 @@ It serves a similar purpose as parts of the [Truffle framework](http://trufflefr Deployer has the following advantages over Truffle: -* Deploy each smart contract with a specific version of Solidity +* Deploy each smart contract with a specific version of Solidity. * Improved artifact files: * Properly segregated artifacts to support storing different versions of smart contract deployed on different networks. - * Storage of contructor args and contract source code -* An easy to maintain codebase: TypeScript + Single repo -* Allows you to specify the deployer RPC address -* Migrations that work with `async/await` -* Migrations that can be written synchronously in order to guarentee deterministic contract addresses -* No race conditions when running migrations. + * Storage of constructor args, source maps and paths to all requisite source files. + * An easy to maintain codebase: TypeScript + Single repo. + * Allows you to specify the deployer RPC address. + * Supports Solidity version ranges - contract compiled with latest Solidity version that satisfies the range. + * Migrations that work with `async/await`. + * Migrations that can be written synchronously in order to guarentee deterministic contract addresses. + * No race conditions when running migrations. Deployer can be used as a command-line tool or as an imported module. -- cgit v1.2.3 From 81f6487865faad641108a566f3f717311ee43a0b Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:10:01 +0000 Subject: Use _.filter instead of _.reduce --- packages/react-docs/src/utils/typedoc_utils.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index fff27a834..21f2dcabb 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -85,14 +85,10 @@ export const typeDocUtils = { let entities; let packageComment = ''; // HACK: We assume 1 exported class per file - const numClassChildren = _.reduce( - packageDefinitionWithMergedChildren.children, - (sum: number, child: TypeDocNode) => { - const nextSum = child.kindString === KindString.Class ? sum + 1 : sum; - return nextSum; - }, - ); - if (numClassChildren > 1) { + const classChildren = _.filter(packageDefinitionWithMergedChildren.children, (child: TypeDocNode) => { + return child.kindString === KindString.Class; + }); + if (classChildren.length > 1) { throw new Error('`react-docs` only supports projects with 1 exported class per file'); } const isClassExport = packageDefinitionWithMergedChildren.children[0].kindString === KindString.Class; -- cgit v1.2.3 From 5791632933fb054bdc210eab9181bc530b77d5cb Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:19:59 +0000 Subject: Fix Ethfinex link, looks like they have their own domain now --- packages/website/ts/utils/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts index 42a2f44d0..0584938eb 100644 --- a/packages/website/ts/utils/constants.ts +++ b/packages/website/ts/utils/constants.ts @@ -35,7 +35,7 @@ export const constants = { UNAVAILABLE_STATUS: 503, TAKER_FEE: new BigNumber(0), TESTNET_NAME: 'Kovan', - PROJECT_URL_ETHFINEX: 'https://www.bitfinex.com/ethfinex', + PROJECT_URL_ETHFINEX: 'https://www.ethfinex.com/', PROJECT_URL_AMADEUS: 'http://amadeusrelay.org', PROJECT_URL_DDEX: 'https://ddex.io', PROJECT_URL_DECENT_EX: 'https://decent.exchange', -- cgit v1.2.3 From 36986fe9c9dd581b28ced4caf65d06fd58abe7cf Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:22:52 +0000 Subject: Replace Auctus with ERCDEX in projects section --- packages/website/ts/pages/landing/landing.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/website/ts/pages/landing/landing.tsx b/packages/website/ts/pages/landing/landing.tsx index 6699e4e6f..c943e3d79 100644 --- a/packages/website/ts/pages/landing/landing.tsx +++ b/packages/website/ts/pages/landing/landing.tsx @@ -40,8 +40,8 @@ const THROTTLE_TIMEOUT = 100; const relayersAndDappProjects: Project[] = [ { - logoFileName: 'ethfinex.png', - projectUrl: constants.PROJECT_URL_ETHFINEX, + logoFileName: 'ercdex.png', + projectUrl: constants.PROJECT_URL_ERC_DEX, }, { logoFileName: 'radar_relay.png', @@ -59,6 +59,10 @@ const relayersAndDappProjects: Project[] = [ logoFileName: 'dydx.png', projectUrl: constants.PROJECT_URL_DYDX, }, + { + logoFileName: 'ethfinex.png', + projectUrl: constants.PROJECT_URL_ETHFINEX, + }, { logoFileName: 'melonport.png', projectUrl: constants.PROJECT_URL_MELONPORT, @@ -99,10 +103,6 @@ const relayersAndDappProjects: Project[] = [ logoFileName: 'anx.png', projectUrl: constants.PROJECT_URL_OPEN_ANX, }, - { - logoFileName: 'auctus.png', - projectUrl: constants.PROJECT_URL_AUCTUS, - }, ]; const relayerProjects: Project[] = [ -- cgit v1.2.3 From 81deb68c8e8cbfea8c0a2d04d1ea4d9b35500ae6 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:37:23 +0000 Subject: Use past tense in FAQ --- packages/website/ts/pages/faq/faq.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/website/ts/pages/faq/faq.tsx b/packages/website/ts/pages/faq/faq.tsx index 1be3c3565..701031d44 100644 --- a/packages/website/ts/pages/faq/faq.tsx +++ b/packages/website/ts/pages/faq/faq.tsx @@ -238,8 +238,8 @@ const sections: FAQSection[] = [ answer:
    1,000,000,000 ZRX. Fixed supply.
    , }, { - prompt: 'When is the Token Launch? will there be a pre-sale?', - answer:
    The token launch will be on August 15th, 2017. There will not be a pre-sale.
    , + prompt: 'When was the token launch? Was there a pre-sale?', + answer:
    The token launch was on August 15th, 2017. There was no pre-sale.
    , }, { prompt: 'What will the token launch proceeds be used for?', -- cgit v1.2.3 From 538914aa523115c7be5ac8c03cc9f5afc262ead3 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 16:58:20 +0000 Subject: Fix S3 bucket name --- packages/0x.js/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index aaf465c04..77f360cd3 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -40,8 +40,8 @@ ], "docPublishConfigs": { "extraFileIncludes": ["../types/src/index.ts"], - "s3BucketPath": "s3://doc-jsons/0xjs/", - "s3StagingBucketPath": "s3://staging-doc-jsons/0xjs/" + "s3BucketPath": "s3://doc-jsons/0x.js/", + "s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/" } } }, -- cgit v1.2.3 From 170e5589f95e33298212ec708ee538a711dcd133 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 20:03:42 +0000 Subject: Fix 0x.js docs to include types from generated contract wrappers --- packages/0x.js/package.json | 2 +- packages/react-docs/src/utils/typedoc_utils.ts | 8 +++++++- packages/website/ts/containers/zero_ex_js_documentation.ts | 9 ++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 77f360cd3..5f5b32aac 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -39,7 +39,7 @@ "packages/0x.js/_bundles/index.min.js" ], "docPublishConfigs": { - "extraFileIncludes": ["../types/src/index.ts"], + "extraFileIncludes": ["../types/src/index.ts", "./src/contract_wrappers/generated/ether_token.ts", "./src/contract_wrappers/generated/token.ts", "./src/contract_wrappers/generated/exchange.ts"], "s3BucketPath": "s3://doc-jsons/0x.js/", "s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/" } diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts index 21f2dcabb..02f5b4049 100644 --- a/packages/react-docs/src/utils/typedoc_utils.ts +++ b/packages/react-docs/src/utils/typedoc_utils.ts @@ -88,7 +88,7 @@ export const typeDocUtils = { const classChildren = _.filter(packageDefinitionWithMergedChildren.children, (child: TypeDocNode) => { return child.kindString === KindString.Class; }); - if (classChildren.length > 1) { + if (classChildren.length > 1 && sectionName !== 'types') { throw new Error('`react-docs` only supports projects with 1 exported class per file'); } const isClassExport = packageDefinitionWithMergedChildren.children[0].kindString === KindString.Class; @@ -183,6 +183,12 @@ export const typeDocUtils = { } break; + case KindString.Class: + // We currently do not support more then a single class per file + // except for the types section, where we ignore classes since we + // only want to render type definitions. + break; + default: throw utils.spawnSwitchErr('kindString', entity.kindString); } diff --git a/packages/website/ts/containers/zero_ex_js_documentation.ts b/packages/website/ts/containers/zero_ex_js_documentation.ts index ec30780c3..3107a2a82 100644 --- a/packages/website/ts/containers/zero_ex_js_documentation.ts +++ b/packages/website/ts/containers/zero_ex_js_documentation.ts @@ -90,7 +90,14 @@ const docsInfoConfig: DocsInfoConfig = { '"0x.js/src/order_watcher/order_state_watcher"', '"src/order_watcher/order_state_watcher"', ], - [zeroExJsDocSections.types]: ['"0x.js/src/types"', '"src/types"', '"types/src/index"'], + [zeroExJsDocSections.types]: [ + '"0x.js/src/types"', + '"src/types"', + '"types/src/index"', + '"0x.js/src/contract_wrappers/generated/ether_token"', + '"0x.js/src/contract_wrappers/generated/token"', + '"0x.js/src/contract_wrappers/generated/exchange"', + ], }, menuSubsectionToVersionWhenIntroduced: { [zeroExJsDocSections.etherToken]: '0.7.1', -- cgit v1.2.3 From 05daab5deaf77949b305f66efbe7c4dbf49003d9 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 20:13:25 +0000 Subject: Fix typos --- packages/0x.js/src/0x.ts | 2 +- packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts | 4 ++-- packages/0x.js/src/contract_wrappers/exchange_wrapper.ts | 2 +- packages/0x.js/src/contract_wrappers/token_wrapper.ts | 2 +- packages/0x.js/src/order_watcher/order_state_watcher.ts | 2 +- packages/0x.js/test/ether_token_wrapper_test.ts | 2 +- packages/website/md/docs/json_schemas/usage.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts index 3f323546c..0dd728ff1 100644 --- a/packages/0x.js/src/0x.ts +++ b/packages/0x.js/src/0x.ts @@ -83,7 +83,7 @@ export class ZeroEx { } /** * Generates a pseudo-random 256-bit salt. - * The salt can be included in an 0x order, ensuring that the order generates a unique orderHash + * The salt can be included in a 0x order, ensuring that the order generates a unique orderHash * and will not collide with other outstanding orders that are identical in all other parameters. * @return A pseudo-random 256-bit number that can be used as a salt. */ diff --git a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts index 42f8213a2..4a4da116b 100644 --- a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts @@ -64,7 +64,7 @@ export class EtherTokenWrapper extends ContractWrapper { * equivalent number of wrapped ETH tokens. * @param etherTokenAddress EtherToken address you wish to withdraw from. * @param amountInWei Amount of ETH in Wei the caller wishes to withdraw. - * @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawl. + * @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawal. * @param txOpts Transaction parameters. * @return Transaction hash. */ @@ -96,7 +96,7 @@ export class EtherTokenWrapper extends ContractWrapper { } /** * Gets historical logs without creating a subscription - * @param etherTokenAddress An address of the ether token that emmited the logs. + * @param etherTokenAddress An address of the ether token that emitted the logs. * @param eventName The ether token contract event you would like to subscribe to. * @param blockRange Block range to get logs from. * @param indexFilterValues An object where the keys are indexed args returned by the event and diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts index 124750d81..59bd4db6b 100644 --- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts @@ -860,7 +860,7 @@ export class ExchangeWrapper extends ContractWrapper { return isRoundingError; } /** - * Checks if logs contain LogError, which is emmited by Exchange contract on transaction failure. + * Checks if logs contain LogError, which is emitted by Exchange contract on transaction failure. * @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync` */ public throwLogErrorsAsErrors(logs: Array | Web3.LogEntry>): void { diff --git a/packages/0x.js/src/contract_wrappers/token_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_wrapper.ts index 0f688cb71..e350dfb92 100644 --- a/packages/0x.js/src/contract_wrappers/token_wrapper.ts +++ b/packages/0x.js/src/contract_wrappers/token_wrapper.ts @@ -385,7 +385,7 @@ export class TokenWrapper extends ContractWrapper { } /** * Gets historical logs without creating a subscription - * @param tokenAddress An address of the token that emmited the logs. + * @param tokenAddress An address of the token that emitted the logs. * @param eventName The token contract event you would like to subscribe to. * @param blockRange Block range to get logs from. * @param indexFilterValues An object where the keys are indexed args returned by the event and diff --git a/packages/0x.js/src/order_watcher/order_state_watcher.ts b/packages/0x.js/src/order_watcher/order_state_watcher.ts index f7515e59e..9cccadb7f 100644 --- a/packages/0x.js/src/order_watcher/order_state_watcher.ts +++ b/packages/0x.js/src/order_watcher/order_state_watcher.ts @@ -59,7 +59,7 @@ const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h /** * This class includes all the functionality related to watching a set of orders * for potential changes in order validity/fillability. The orderWatcher notifies - * the subscriber of these changes so that a final decison can be made on whether + * the subscriber of these changes so that a final decision can be made on whether * the order should be deemed invalid. */ export class OrderStateWatcher { diff --git a/packages/0x.js/test/ether_token_wrapper_test.ts b/packages/0x.js/test/ether_token_wrapper_test.ts index da6d95d07..6237ccf23 100644 --- a/packages/0x.js/test/ether_token_wrapper_test.ts +++ b/packages/0x.js/test/ether_token_wrapper_test.ts @@ -137,7 +137,7 @@ describe('EtherTokenWrapper', () => { gasCost = expectedETHBalance.minus(postETHBalance); expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI); }); - it('should throw if user has insufficient WETH balance for withdrawl', async () => { + it('should throw if user has insufficient WETH balance for withdrawal', async () => { const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH); expect(preWETHBalance).to.be.bignumber.equal(0); diff --git a/packages/website/md/docs/json_schemas/usage.md b/packages/website/md/docs/json_schemas/usage.md index 372c0b541..68b801153 100644 --- a/packages/website/md/docs/json_schemas/usage.md +++ b/packages/website/md/docs/json_schemas/usage.md @@ -1,4 +1,4 @@ -The following example shows you how to validate an 0x order using the `@0xproject/json-schemas` package. +The following example shows you how to validate a 0x order using the `@0xproject/json-schemas` package. ```javascript import {SchemaValidator, ValidatorResult, schemas} from '@0xproject/json-schemas'; -- cgit v1.2.3 From bed7d87b7ff64989051e6b2115a1c77e1e72ff55 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Thu, 22 Mar 2018 21:05:09 +0000 Subject: Get LogEntry type to show up correctly as a Web3 type --- packages/website/ts/containers/zero_ex_js_documentation.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/website/ts/containers/zero_ex_js_documentation.ts b/packages/website/ts/containers/zero_ex_js_documentation.ts index 3107a2a82..6e893133f 100644 --- a/packages/website/ts/containers/zero_ex_js_documentation.ts +++ b/packages/website/ts/containers/zero_ex_js_documentation.ts @@ -158,7 +158,6 @@ const docsInfoConfig: DocsInfoConfig = { 'TransactionOpts', 'ContractEventArg', 'LogEvent', - 'LogEntry', 'DecodedLogEvent', 'EventWatcherCallback', 'OnOrderStateChangeCallback', @@ -174,6 +173,7 @@ const docsInfoConfig: DocsInfoConfig = { DecodedLogEntryEvent: 'Web3', LogEntryEvent: 'Web3', CallData: 'Web3', + LogEntry: 'Web3', }, typeNameToExternalLink: { Web3: constants.URL_WEB3_DOCS, @@ -181,6 +181,7 @@ const docsInfoConfig: DocsInfoConfig = { BigNumber: constants.URL_BIGNUMBERJS_GITHUB, DecodedLogEntryEvent: constants.URL_WEB3_DECODED_LOG_ENTRY_EVENT, LogEntryEvent: constants.URL_WEB3_LOG_ENTRY_EVENT, + LogEntry: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L366', }, typeNameToDocSection: { ExchangeWrapper: 'exchange', -- cgit v1.2.3