Remove packages/dev-tools-pages folder and update yarn.lock
1
packages/dev-tools-pages/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
public
|
||||
@@ -1,88 +0,0 @@
|
||||
## Dev tools pages
|
||||
|
||||
This repository contains our dev tools pages.
|
||||
|
||||
## Local Dev Setup
|
||||
|
||||
Requires Node version 6.9.5 or higher & yarn v1.9.4
|
||||
|
||||
### 1. Install dependencies for monorepo:
|
||||
|
||||
Make sure you install Yarn v1.9.4 (npm won't work!). We rely on our `yarn.lock` file and on Yarn's support for `workspaces` in our monorepo setup.
|
||||
|
||||
```bash
|
||||
yarn install
|
||||
```
|
||||
|
||||
### 2. Initial setup
|
||||
|
||||
To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
|
||||
|
||||
```bash
|
||||
PKG=@0x/dev-tools-pages yarn build
|
||||
```
|
||||
|
||||
Note: Ignore the `WARNING in asset size limit` and `WARNING in entrypoint size limit` warnings.
|
||||
|
||||
### 3. Run dev server
|
||||
|
||||
```bash
|
||||
cd packages/dev-tools-pages
|
||||
yarn dev
|
||||
```
|
||||
|
||||
Visit [http://localhost:3572/](http://localhost:3572/) in your browser.
|
||||
|
||||
The webpage will refresh when source code is changed.
|
||||
|
||||
### 4. Code!
|
||||
|
||||
There are some basic primitives we'd like you to use:
|
||||
|
||||
1. `<Container>Stuff</Container>`: Use containers instead of divs,spans,etc... and use it's props instead of inline styles (e.g `style={{margin: 3}}` should be `margin="3px"`
|
||||
|
||||
2. `<Text>Look ma, text!</Text>`: Use text components whenever rendering text. It has props for manipulating texts, so again no in-line styles. Use `fontColor="red"`, not `style={{color: 'red'}}`.
|
||||
|
||||
3. Styled-components: See the `ui/button.tsx` file for an example of how to use these.
|
||||
|
||||
4. BassCss: This library gives you access to a bunch of [classes](http://basscss.com/) that apply styles in a browser-compatible way, has affordances for responsiveness and alleviates the need for inline styles or LESS/CSS files.
|
||||
|
||||
With the above 4 tools and following the React paradigm, you shouldn't need CSS/LESS files. IF there are special occasions where you do, these is a `all.less` file, but this is a solution of last resort. Use it sparingly.
|
||||
|
||||
### Clean
|
||||
|
||||
```bash
|
||||
yarn clean
|
||||
```
|
||||
|
||||
### Lint
|
||||
|
||||
```bash
|
||||
yarn lint
|
||||
```
|
||||
|
||||
### Prettier
|
||||
|
||||
Run from the monorepo root directory:
|
||||
|
||||
```
|
||||
yarn prettier
|
||||
```
|
||||
|
||||
### Resources
|
||||
|
||||
##### Toolkit
|
||||
|
||||
- [Styled Components](https://www.styled-components.com/)
|
||||
- [BassCSS](http://basscss.com/)
|
||||
|
||||
##### Recommended Atom packages:
|
||||
|
||||
- [atom-typescript](https://atom.io/packages/atom-typescript)
|
||||
- [linter-tslint](https://atom.io/packages/linter-tslint)
|
||||
|
||||
## 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.
|
||||
|
||||
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
|
||||
@@ -1,17 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<ul>
|
||||
<li><a href="/compiler">Compiler</a></li>
|
||||
<li><a href="/coverage">Coverage</a></li>
|
||||
<li><a href="/profiler">Profiler</a></li>
|
||||
<li><a href="/trace">Trace</a></li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,70 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<link rel="preload" href="/fonts/MaisonNeue-Book-subset.woff2" as="font" type="font/woff2" crossorigin />
|
||||
<link rel="preload" href="/fonts/MaisonNeue-Bold-subset.woff2" as="font" type="font/woff2" crossorigin />
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Heap SDK -->
|
||||
<script type="text/javascript">
|
||||
if ('<%= htmlWebpackPlugin.options.environment %>' !== 'development') {
|
||||
(window.heap = window.heap || []),
|
||||
(heap.load = function(e, t) {
|
||||
(window.heap.appid = e), (window.heap.config = t = t || {});
|
||||
var r = t.forceSSL || 'https:' === document.location.protocol,
|
||||
a = document.createElement('script');
|
||||
(a.type = 'text/javascript'),
|
||||
(a.async = !0),
|
||||
(a.src = (r ? 'https:' : 'http:') + '//cdn.heapanalytics.com/js/heap-' + e + '.js');
|
||||
var n = document.getElementsByTagName('script')[0];
|
||||
n.parentNode.insertBefore(a, n);
|
||||
for (
|
||||
var o = function(e) {
|
||||
return function() {
|
||||
heap.push([e].concat(Array.prototype.slice.call(arguments, 0)));
|
||||
};
|
||||
},
|
||||
p = [
|
||||
'addEventProperties',
|
||||
'addUserProperties',
|
||||
'clearEventProperties',
|
||||
'identify',
|
||||
'resetIdentity',
|
||||
'removeEventProperty',
|
||||
'setEventProperties',
|
||||
'track',
|
||||
'unsetEventProperty',
|
||||
],
|
||||
c = 0;
|
||||
c < p.length;
|
||||
c++
|
||||
)
|
||||
heap[p[c]] = o(p[c]);
|
||||
});
|
||||
heap.load('<%= htmlWebpackPlugin.options.heapAnalyticsId %>');
|
||||
}
|
||||
</script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script
|
||||
async
|
||||
src="https://www.googletagmanager.com/gtag/js?id=<%= htmlWebpackPlugin.options.googleAnalyticsId %>"
|
||||
></script>
|
||||
<script>
|
||||
if ('<%= htmlWebpackPlugin.options.environment %>' !== 'development') {
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', '<%= htmlWebpackPlugin.options.googleAnalyticsId %>');
|
||||
}
|
||||
</script>
|
||||
<!-- End Google Analytics -->
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,78 +0,0 @@
|
||||
{
|
||||
"name": "@0x/dev-tools-pages",
|
||||
"version": "0.0.29",
|
||||
"engines": {
|
||||
"node": ">=6.12"
|
||||
},
|
||||
"private": true,
|
||||
"description": "0x Dev tools pages",
|
||||
"scripts": {
|
||||
"build": "node --max_old_space_size=8192 ../../node_modules/.bin/webpack --mode production",
|
||||
"build:ci": "yarn build",
|
||||
"build:dev": "../../node_modules/.bin/webpack --mode development",
|
||||
"clean": "shx rm -f public/bundle*",
|
||||
"lint": "tslint --format stylish --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
|
||||
"fix": "tslint --fix --format stylish --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
|
||||
"dev": "webpack-dev-server --mode development --content-base public",
|
||||
"deploy:all": "npm run build; npm run deploy:compiler; npm run deploy:compiler:index; npm run deploy:coverage; npm run deploy:coverage:index; npm run deploy:profiler; npm run deploy:profiler:index; npm run deploy:trace; npm run deploy:trace:index;",
|
||||
"deploy:compiler": "DIR_NAME=./public/. BUCKET=s3://sol-compiler.com yarn s3:sync --exclude 'bundle-cov*' --exclude 'bundle-trace*' --exclude 'bundle-profiler*'",
|
||||
"deploy:coverage": "DIR_NAME=./public/. BUCKET=s3://sol-coverage.com yarn s3:sync --exclude 'bundle-compiler*' --exclude 'bundle-trace*' --exclude 'bundle-profiler*'",
|
||||
"deploy:profiler": "DIR_NAME=./public/. BUCKET=s3://sol-profiler.com yarn s3:sync --exclude 'bundle-cov*' --exclude 'bundle-trace*' --exclude 'bundle-compiler*'",
|
||||
"deploy:trace": "DIR_NAME=./public/. BUCKET=s3://sol-trace.com yarn s3:sync --exclude 'bundle-cov*' --exclude 'bundle-compiler*' --exclude 'bundle-profiler*'",
|
||||
"deploy:compiler:index": "DIR_NAME=./public/compiler/. BUCKET=s3://sol-compiler.com yarn s3:sync",
|
||||
"deploy:coverage:index": "DIR_NAME=./public/coverage/. BUCKET=s3://sol-coverage.com yarn s3:sync",
|
||||
"deploy:profiler:index": "DIR_NAME=./public/profiler/. BUCKET=s3://sol-profiler.com yarn s3:sync",
|
||||
"deploy:trace:index": "DIR_NAME=./public/trace/. BUCKET=s3://sol-trace.com yarn s3:sync",
|
||||
"s3:sync": "aws s3 sync $DIR_NAME $BUCKET --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude *.map.js --exclude 'profiler/*' --exclude 'trace/*' --exclude 'coverage/*' --exclude 'compiler/*'"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"basscss": "^8.0.3",
|
||||
"bowser": "^1.9.4",
|
||||
"highlight.js": "^9.13.1",
|
||||
"less": "^2.7.2",
|
||||
"polished": "^1.9.2",
|
||||
"react": "^16.5.2",
|
||||
"react-dom": "^16.5.2",
|
||||
"react-loadable": "^5.5.0",
|
||||
"react-lottie": "^1.2.3",
|
||||
"react-tabs": "^2.3.0",
|
||||
"styled-components": "^4.1.1",
|
||||
"styled-normalize": "^8.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/highlight.js": "^9.12.3",
|
||||
"@types/lodash": "4.14.104",
|
||||
"@types/node": "*",
|
||||
"@types/react": "^16.4.2",
|
||||
"@types/react-dom": "^16.0.7",
|
||||
"@types/react-loadable": "^5.4.2",
|
||||
"@types/react-lottie": "^1.2.0",
|
||||
"@types/react-router-dom": "^4.0.4",
|
||||
"@types/react-tabs": "^2.3.0",
|
||||
"@types/react-tap-event-plugin": "0.0.30",
|
||||
"@types/styled-components": "4.1.1",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"clean-webpack-plugin": "^0.1.19",
|
||||
"copy-webpack-plugin": "^4.5.4",
|
||||
"copyfiles": "^2.0.0",
|
||||
"css-loader": "0.23.x",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"less-loader": "^4.1.0",
|
||||
"make-promises-safe": "^1.1.0",
|
||||
"raw-loader": "^0.5.1",
|
||||
"react-svg-loader": "^2.1.0",
|
||||
"shx": "^0.2.2",
|
||||
"source-map-loader": "^0.2.4",
|
||||
"style-loader": "0.23.x",
|
||||
"terser-webpack-plugin": "^1.1.0",
|
||||
"tslint": "5.11.0",
|
||||
"tslint-config-0xproject": "^0.0.2",
|
||||
"typescript": "3.0.1",
|
||||
"uglifyjs-webpack-plugin": "^2.0.1",
|
||||
"webpack": "^4.20.2",
|
||||
"webpack-bundle-analyzer": "^3.0.3",
|
||||
"webpack-cli": "3.1.2",
|
||||
"webpack-dev-server": "^3.1.9"
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
const pages = [
|
||||
{
|
||||
title: 'sol-compiler',
|
||||
filename: 'compiler/index.html',
|
||||
template: 'assets/index.html',
|
||||
chunks: ['compiler'],
|
||||
favicon: 'assets/favicons/compiler.ico',
|
||||
minify: true,
|
||||
meta: {
|
||||
description: 'Solidity compilation that just works',
|
||||
'og-title': { property: 'og:title', content: 'sol-compiler' },
|
||||
'og-description': { property: 'og:description', content: 'Solidity compilation that just works' },
|
||||
'og-type': { property: 'og:type', content: 'website' },
|
||||
'og-image': { property: 'og:image', content: '/images/og-compiler.png' },
|
||||
'twitter:site': '@0xproject',
|
||||
'twitter:image': '/images/og-compiler.png',
|
||||
},
|
||||
googleAnalyticsId: 'UA-98720122-4',
|
||||
heapAnalyticsId: '3772819976',
|
||||
},
|
||||
{
|
||||
title: 'sol-coverage',
|
||||
filename: 'coverage/index.html',
|
||||
template: 'assets/index.html',
|
||||
chunks: ['coverage'],
|
||||
favicon: 'assets/favicons/cov.ico',
|
||||
minify: true,
|
||||
meta: {
|
||||
description: 'Solidity code coverage',
|
||||
'og-title': { property: 'og:title', content: 'sol-coverage' },
|
||||
'og-description': { property: 'og:description', content: 'Solidity code coverage' },
|
||||
'og-type': { property: 'og:type', content: 'website' },
|
||||
'og-image': { property: 'og:image', content: '/images/og-cov.png' },
|
||||
'twitter:site': '@0xproject',
|
||||
'twitter:image': '/images/og-cov.png',
|
||||
},
|
||||
googleAnalyticsId: 'UA-98720122-3',
|
||||
heapAnalyticsId: '3386971671',
|
||||
},
|
||||
{
|
||||
title: 'sol-profiler',
|
||||
filename: 'profiler/index.html',
|
||||
template: 'assets/index.html',
|
||||
chunks: ['profiler'],
|
||||
favicon: 'assets/favicons/profiler.ico',
|
||||
minify: true,
|
||||
meta: {
|
||||
description: 'Gas profiling for Solidity',
|
||||
'og-title': { property: 'og:title', content: 'sol-profiler' },
|
||||
'og-description': { property: 'og:description', content: 'Gas profiling for Solidity' },
|
||||
'og-type': { property: 'og:type', content: 'website' },
|
||||
'og-image': { property: 'og:image', content: '/images/og-profiler.png' },
|
||||
'twitter:site': '@0xproject',
|
||||
'twitter:image': '/images/og-profiler.png',
|
||||
},
|
||||
googleAnalyticsId: 'UA-98720122-5',
|
||||
heapAnalyticsId: '3776009943',
|
||||
},
|
||||
{
|
||||
title: 'sol-trace',
|
||||
filename: 'trace/index.html',
|
||||
template: 'assets/index.html',
|
||||
chunks: ['trace'],
|
||||
favicon: 'assets/favicons/trace.ico',
|
||||
minify: true,
|
||||
meta: {
|
||||
description: 'Human-readable stack traces',
|
||||
'og-title': { property: 'og:title', content: 'sol-trace' },
|
||||
'og-description': { property: 'og:description', content: 'Human-readable stack traces' },
|
||||
'og-type': { property: 'og:type', content: 'website' },
|
||||
'og-image': { property: 'og:image', content: '/images/og-trace.png' },
|
||||
'twitter:site': '@0xproject',
|
||||
'twitter:image': '/images/og-trace.png',
|
||||
},
|
||||
googleAnalyticsId: 'UA-98720122-6',
|
||||
heapAnalyticsId: '4172106583',
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = pages;
|
||||
@@ -1,11 +0,0 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { BaseAnimation } from '../index';
|
||||
|
||||
import * as animationData from './data.json';
|
||||
|
||||
const CompilerAnimation: React.StatelessComponent<{}> = () => (
|
||||
<BaseAnimation animationData={animationData} width={2150} height={700} />
|
||||
);
|
||||
|
||||
export { CompilerAnimation };
|
||||
@@ -1,11 +0,0 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { BaseAnimation } from '../index';
|
||||
|
||||
import * as animationData from './data.json';
|
||||
|
||||
const CovAnimation: React.StatelessComponent<{}> = () => (
|
||||
<BaseAnimation animationData={animationData} width={1981} height={660} />
|
||||
);
|
||||
|
||||
export { CovAnimation };
|
||||
@@ -1,93 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import Lottie from 'react-lottie';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
interface AnimationProps {
|
||||
animationData: object;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
interface AnimationState {
|
||||
width?: number | undefined;
|
||||
height?: number | undefined;
|
||||
}
|
||||
|
||||
class BaseAnimation extends React.PureComponent<AnimationProps, AnimationState> {
|
||||
public state: AnimationState = {
|
||||
height: undefined,
|
||||
width: undefined,
|
||||
};
|
||||
private _timeout = undefined as number;
|
||||
public componentDidMount(): void {
|
||||
this._updateAnimationSize();
|
||||
window.addEventListener('resize', this._handleResize.bind(this));
|
||||
}
|
||||
public componentWillUnmount(): void {
|
||||
window.removeEventListener('resize', this._handleResize.bind(this));
|
||||
}
|
||||
public render(): React.ReactNode {
|
||||
const { animationData } = this.props;
|
||||
const height = this.state.height || this.props.height;
|
||||
const width = this.state.width || this.props.width;
|
||||
|
||||
return (
|
||||
<Container height={height}>
|
||||
<InnerContainer>
|
||||
<Lottie
|
||||
width={width}
|
||||
height={height}
|
||||
options={{
|
||||
loop: true,
|
||||
autoplay: true,
|
||||
animationData,
|
||||
}}
|
||||
/>
|
||||
</InnerContainer>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
private _handleResize(): void {
|
||||
clearTimeout(this._timeout);
|
||||
this._timeout = window.setTimeout(this._updateAnimationSize.bind(this), 50);
|
||||
}
|
||||
private _updateAnimationSize(): void {
|
||||
const windowWidth = window.innerWidth;
|
||||
let width;
|
||||
let height;
|
||||
if (windowWidth <= 1000) {
|
||||
const maxWidth = windowWidth + 250;
|
||||
const ratio = maxWidth / this.props.width;
|
||||
|
||||
height = Math.round(this.props.height * ratio);
|
||||
width = Math.round(this.props.width * ratio);
|
||||
}
|
||||
|
||||
this.setState({ width, height });
|
||||
}
|
||||
}
|
||||
|
||||
const Container = styled.div<AnimationProps>`
|
||||
width: 100%;
|
||||
height: ${props => props.height}px;
|
||||
position: absolute;
|
||||
top: 40%;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
overflow: hidden;
|
||||
${media.large`
|
||||
top: 100%;
|
||||
transform: translateY(-50%);
|
||||
`};
|
||||
`;
|
||||
|
||||
const InnerContainer = styled.div`
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
`;
|
||||
|
||||
export { BaseAnimation };
|
||||
@@ -1,11 +0,0 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { BaseAnimation } from '../index';
|
||||
|
||||
import * as animationData from './data.json';
|
||||
|
||||
const ProfilerAnimation: React.StatelessComponent<{}> = () => (
|
||||
<BaseAnimation animationData={animationData} width={1985} height={657} />
|
||||
);
|
||||
|
||||
export { ProfilerAnimation };
|
||||
@@ -1,11 +0,0 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { BaseAnimation } from '../index';
|
||||
|
||||
import * as animationData from './data.json';
|
||||
|
||||
const TraceAnimation: React.StatelessComponent<{}> = () => (
|
||||
<BaseAnimation animationData={animationData} width={2241} height={610} />
|
||||
);
|
||||
|
||||
export { TraceAnimation };
|
||||
@@ -1,26 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { ThemeProvider } from 'styled-components';
|
||||
|
||||
import { Footer } from 'ts/components/footer';
|
||||
import { Header } from 'ts/components/header';
|
||||
import { ThemeContext } from 'ts/context';
|
||||
import { GlobalStyles } from 'ts/globalStyles';
|
||||
|
||||
interface BaseProps {
|
||||
context: any;
|
||||
}
|
||||
|
||||
const Base: React.StatelessComponent<BaseProps> = props => (
|
||||
<ThemeContext.Provider value={props.context}>
|
||||
<ThemeProvider theme={props.context}>
|
||||
<React.Fragment>
|
||||
<GlobalStyles colors={props.context.colors} />
|
||||
<Header />
|
||||
{props.children}
|
||||
<Footer />
|
||||
</React.Fragment>
|
||||
</ThemeProvider>
|
||||
</ThemeContext.Provider>
|
||||
);
|
||||
|
||||
export { Base };
|
||||
@@ -1,12 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
const Breakout = styled.div`
|
||||
${media.small`
|
||||
margin-left: -2.5rem;
|
||||
width: calc(100% + 5rem);
|
||||
`};
|
||||
`;
|
||||
|
||||
export { Breakout };
|
||||
@@ -1,52 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors, media } from 'ts/variables';
|
||||
|
||||
interface ButtonProps {
|
||||
large?: boolean;
|
||||
}
|
||||
|
||||
const Button = styled.button<ButtonProps>`
|
||||
font-family: inherit;
|
||||
line-height: 1;
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
background-color: ${props => props.theme.colors.secondary};
|
||||
color: ${colors.black};
|
||||
border: 0;
|
||||
border-radius: 5rem;
|
||||
display: inline-flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
${props =>
|
||||
props.large
|
||||
? `
|
||||
font-size: 1rem;
|
||||
padding: 1.1875rem 2.375rem 1.0625rem;
|
||||
`
|
||||
: `
|
||||
font-size: .875rem;
|
||||
padding: .5625rem 1.25rem;
|
||||
`}
|
||||
|
||||
:hover, :focus {
|
||||
background-color: ${props => props.theme.colors.secondary_alt};
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
${media.small`
|
||||
font-size: .875rem;
|
||||
padding: .5625rem 1.25rem;
|
||||
`}
|
||||
|
||||
${props =>
|
||||
props.large &&
|
||||
media.small`
|
||||
font-size: 1rem;
|
||||
padding: 1rem 1.5rem .75rem;
|
||||
`}
|
||||
`;
|
||||
|
||||
export { Button };
|
||||
@@ -1,40 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { ContextInterface, ThemeContext } from 'ts/context';
|
||||
|
||||
import { Button } from './button';
|
||||
|
||||
const CallToAction: React.StatelessComponent<ContextInterface> = ({ children }) => (
|
||||
<ThemeContext.Consumer>
|
||||
{({ docLink }: ContextInterface) => (
|
||||
<StyledCallToAction>
|
||||
<CallToActionContainer>
|
||||
<Button as="a" href={docLink} target="_blank" large={true}>
|
||||
Read the Docs
|
||||
</Button>
|
||||
</CallToActionContainer>
|
||||
{children}
|
||||
</StyledCallToAction>
|
||||
)}
|
||||
</ThemeContext.Consumer>
|
||||
);
|
||||
|
||||
const StyledCallToAction = styled.section`
|
||||
text-align: center;
|
||||
padding-top: 0;
|
||||
padding-bottom: 1rem;
|
||||
padding-left: 2.5rem;
|
||||
padding-right: 2.5rem;
|
||||
min-height: min-content;
|
||||
max-height: 37.5rem;
|
||||
height: 20vh;
|
||||
position: relative;
|
||||
`;
|
||||
|
||||
const CallToActionContainer = styled.div`
|
||||
margin: 0 auto;
|
||||
max-width: 590px;
|
||||
`;
|
||||
|
||||
export { CallToAction };
|
||||
@@ -1,196 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors } from 'ts/variables';
|
||||
|
||||
import { Button as BaseButton } from './button';
|
||||
|
||||
const isTouch = Boolean(
|
||||
'ontouchstart' in window ||
|
||||
(window as any).navigator.maxTouchPoints > 0 ||
|
||||
(window as any).navigator.msMaxTouchPoints > 0,
|
||||
);
|
||||
|
||||
interface CodeProps {
|
||||
language?: string;
|
||||
isLight?: boolean;
|
||||
isDiff?: boolean;
|
||||
gutter?: Array<number | undefined>;
|
||||
gutterLength?: number;
|
||||
canCopy?: boolean;
|
||||
isEtc?: boolean;
|
||||
}
|
||||
|
||||
interface CodeState {
|
||||
hlCode?: string;
|
||||
didCopy?: boolean;
|
||||
}
|
||||
|
||||
const Button = styled(BaseButton)`
|
||||
opacity: ${isTouch ? '1' : '0'};
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
right: 1rem;
|
||||
transition: opacity 0.2s;
|
||||
:focus {
|
||||
opacity: 1;
|
||||
}
|
||||
`;
|
||||
|
||||
const Container = styled.div`
|
||||
position: relative;
|
||||
&:hover ${Button} {
|
||||
opacity: 1;
|
||||
}
|
||||
`;
|
||||
|
||||
const Base = styled.div<CodeProps>`
|
||||
font-size: 0.875rem;
|
||||
color: ${props => (props.language === undefined ? colors.white : 'inherit')};
|
||||
background-color: ${props =>
|
||||
props.isLight ? 'rgba(255,255,255,.15)' : props.language === undefined ? colors.black : '#F1F4F5'};
|
||||
white-space: ${props => (props.language === undefined ? 'nowrap' : '')};
|
||||
position: relative;
|
||||
|
||||
${props =>
|
||||
props.isDiff
|
||||
? `
|
||||
background-color: #E9ECED;
|
||||
display: flex;
|
||||
padding-top: 1.5rem;
|
||||
padding-bottom: 1.5rem;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
`
|
||||
: ``}
|
||||
`;
|
||||
|
||||
const CodeDiff: React.StatelessComponent<any> = ({ gutterLength, ...props }) => <code {...props} />;
|
||||
const StyledCodeDiff = styled(CodeDiff)`
|
||||
::before {
|
||||
content: '';
|
||||
width: calc(0.75rem + ${props => props.gutterLength}ch);
|
||||
background-color: #e2e5e6;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
[class^='line-'] {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
padding-right: 1.5rem;
|
||||
padding-left: calc(2.25rem + ${props => props.gutterLength}ch);
|
||||
|
||||
::before {
|
||||
content: attr(data-gutter);
|
||||
|
||||
width: ${props => props.gutterLength};
|
||||
padding-left: 0.375rem;
|
||||
padding-right: 0.375rem;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translateY(-50%);
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.line-addition {
|
||||
background-color: rgba(0, 202, 105, 0.1);
|
||||
}
|
||||
.line-deletion {
|
||||
background-color: rgba(255, 0, 0, 0.07);
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledPre = styled.pre<CodeProps>`
|
||||
margin: 0;
|
||||
${props =>
|
||||
!props.isDiff
|
||||
? `
|
||||
padding: 1.5rem;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
`
|
||||
: ``};
|
||||
`;
|
||||
|
||||
const StyledCopyInput = styled.textarea`
|
||||
opacity: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: -1;
|
||||
`;
|
||||
|
||||
class Code extends React.Component<CodeProps, CodeState> {
|
||||
public state: CodeState = {};
|
||||
private readonly _code = React.createRef<HTMLTextAreaElement>();
|
||||
public componentDidMount(): void {
|
||||
// _onMountAsync is only setting state, so no point in handling the promise
|
||||
// tslint:disable-next-line:no-floating-promises
|
||||
this._onMountAsync();
|
||||
}
|
||||
public render(): React.ReactNode {
|
||||
const { language, isLight, isDiff, children, gutterLength, canCopy } = this.props;
|
||||
const { hlCode } = this.state;
|
||||
return (
|
||||
<Container>
|
||||
<Base language={language} isDiff={isDiff} isLight={isLight}>
|
||||
<StyledPre isDiff={isDiff}>
|
||||
{hlCode === undefined ? (
|
||||
<code>{children}</code>
|
||||
) : (
|
||||
<StyledCodeDiff
|
||||
gutterLength={gutterLength}
|
||||
dangerouslySetInnerHTML={hlCode ? { __html: this.state.hlCode } : null}
|
||||
/>
|
||||
)}
|
||||
</StyledPre>
|
||||
{!('clipboard' in navigator) ? (
|
||||
<StyledCopyInput readOnly={true} aria-hidden="true" ref={this._code} value={children} />
|
||||
) : null}
|
||||
</Base>
|
||||
{canCopy ? (
|
||||
<Button onClick={this._handleCopyAsync.bind(this)}>{this.state.didCopy ? 'Copied' : 'Copy'}</Button>
|
||||
) : null}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
private async _onMountAsync(): Promise<void> {
|
||||
const { language, children, isDiff, gutter, isEtc } = this.props;
|
||||
|
||||
const code = children as string;
|
||||
|
||||
if (language !== undefined) {
|
||||
const { highlight } = await System.import(/* webpackChunkName: 'highlightjs' */ 'ts/highlight');
|
||||
|
||||
this.setState({
|
||||
hlCode: highlight({ language, code, isDiff, gutter, isEtc }),
|
||||
});
|
||||
}
|
||||
}
|
||||
private async _handleCopyAsync(): Promise<void> {
|
||||
try {
|
||||
if ('clipboard' in navigator) {
|
||||
await (navigator as any).clipboard.writeText(this.props.children);
|
||||
this.setState({ didCopy: true });
|
||||
} else {
|
||||
const lastActive = document.activeElement as HTMLElement;
|
||||
this._code.current.focus();
|
||||
this._code.current.select();
|
||||
document.execCommand('copy');
|
||||
lastActive.focus();
|
||||
this.setState({ didCopy: true });
|
||||
}
|
||||
} catch (error) {
|
||||
this.setState({ didCopy: false });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export { Code };
|
||||
@@ -1,94 +0,0 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors, media } from 'ts/variables';
|
||||
|
||||
import { Breakout } from './breakout';
|
||||
import { Container } from './container';
|
||||
import { InlineCode } from './inline-code';
|
||||
|
||||
const Cards = styled.dl`
|
||||
column-count: 3;
|
||||
column-gap: 1.25rem;
|
||||
|
||||
${media.medium`
|
||||
column-count: 1;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Card = styled.div`
|
||||
background-color: ${colors.lightGray};
|
||||
padding: 3.125rem;
|
||||
padding-bottom: 2.5rem;
|
||||
display: inline-block;
|
||||
margin-bottom: 1.25rem;
|
||||
width: 100%;
|
||||
|
||||
${media.medium`
|
||||
padding: 1.875rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Dt = styled.dt`
|
||||
font-weight: 500;
|
||||
display: inline;
|
||||
::after {
|
||||
content: '. ';
|
||||
}
|
||||
`;
|
||||
|
||||
const Dd = styled.dd`
|
||||
display: inline;
|
||||
margin-left: 0;
|
||||
`;
|
||||
|
||||
const cards = [
|
||||
{
|
||||
title: 'Project-centric',
|
||||
body: (
|
||||
<React.Fragment>
|
||||
Compiles an entire project instead of only individual <InlineCode isAlt={true}>.sol</InlineCode> files.
|
||||
</React.Fragment>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: 'Incremental builds',
|
||||
body: 'Only recompiles smart contracts that have been modified.',
|
||||
},
|
||||
{
|
||||
title: 'Customizable artifacts',
|
||||
body:
|
||||
'Stores only the required compiler output in your artifacts, so you can have complete control over your bundle size.',
|
||||
},
|
||||
{
|
||||
title: 'Seamless',
|
||||
body: 'Fetches and caches the required compiler binaries for the Solidity versions you use.',
|
||||
},
|
||||
{
|
||||
title: 'Versioning',
|
||||
body:
|
||||
'Compiles each contract with the Solidity version specified at the top of its file (it even supports version ranges!).',
|
||||
},
|
||||
{
|
||||
title: 'Watch mode',
|
||||
body: 'Have your contracts instantly recompile on file save.',
|
||||
},
|
||||
];
|
||||
|
||||
const Compiler: React.StatelessComponent<{}> = () => (
|
||||
<Container>
|
||||
<Breakout>
|
||||
<Cards>
|
||||
{_.map(cards, card => (
|
||||
<Card key={card.title.split(' ').join('-')}>
|
||||
<Dt>{card.title}</Dt>
|
||||
<Dd>{card.body}</Dd>
|
||||
</Card>
|
||||
))}
|
||||
</Cards>
|
||||
</Breakout>
|
||||
</Container>
|
||||
);
|
||||
|
||||
export { Compiler };
|
||||
@@ -1,13 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
|
||||
interface ContainerProps {
|
||||
wide?: boolean;
|
||||
}
|
||||
|
||||
const Container = styled.div<ContainerProps>`
|
||||
max-width: 77.5rem;
|
||||
margin: 0 auto;
|
||||
width: ${props => (props.wide ? '100%' : 'calc(100% - 5rem)')};
|
||||
`;
|
||||
|
||||
export { Container };
|
||||
@@ -1,78 +0,0 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { ContextInterface } from 'ts/context';
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
import { Alpha, Beta } from './typography';
|
||||
|
||||
const Base = styled.div`
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
:not(:last-of-type) {
|
||||
margin-bottom: 6.25rem;
|
||||
}
|
||||
${Beta} {
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
${media.small`
|
||||
display: block;
|
||||
:not(:last-of-type) {
|
||||
margin-bottom: 3.125rem;
|
||||
}
|
||||
`};
|
||||
`;
|
||||
|
||||
const Content = styled.div`
|
||||
width: 66.693548387%;
|
||||
${media.small`
|
||||
width: 100%;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Item = styled.div`
|
||||
p {
|
||||
max-width: 31.25rem;
|
||||
}
|
||||
|
||||
&:not(:last-of-type) {
|
||||
margin-bottom: 2.5rem;
|
||||
${media.small`
|
||||
margin-bottom: 1.875rem;
|
||||
`};
|
||||
}
|
||||
`;
|
||||
|
||||
const StyledTitle = styled(Alpha)`
|
||||
color: ${props => props.color};
|
||||
${media.small`
|
||||
& + div {
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
`};
|
||||
`;
|
||||
|
||||
interface ContentBlockProps extends ContextInterface {
|
||||
title: string;
|
||||
main?: boolean;
|
||||
children?: React.ReactNode;
|
||||
}
|
||||
|
||||
const ContentBlock: React.StatelessComponent<ContentBlockProps> = props => {
|
||||
const children = React.Children.map(props.children, child => {
|
||||
return <Item>{child}</Item>;
|
||||
});
|
||||
|
||||
const Title = props.main ? StyledTitle : Beta;
|
||||
|
||||
return (
|
||||
<Base>
|
||||
<Title color={props.colors}>{props.title}</Title>
|
||||
{children === undefined ? null : <Content>{children}</Content>}
|
||||
</Base>
|
||||
);
|
||||
};
|
||||
|
||||
export { ContentBlock };
|
||||
@@ -1,31 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { Container } from './container';
|
||||
|
||||
const StyledMain = styled.div<MainProps>`
|
||||
padding-top: 6.25rem;
|
||||
padding-bottom: 6.25rem;
|
||||
${props =>
|
||||
props.dark
|
||||
? `
|
||||
background-color: #000;
|
||||
color: #fff;
|
||||
p:not([class]) {
|
||||
color: #CCC;
|
||||
}
|
||||
`
|
||||
: ''};
|
||||
`;
|
||||
|
||||
interface MainProps {
|
||||
dark?: boolean;
|
||||
}
|
||||
|
||||
const Content: React.StatelessComponent<MainProps> = props => (
|
||||
<StyledMain dark={props.dark}>
|
||||
<Container>{props.children}</Container>
|
||||
</StyledMain>
|
||||
);
|
||||
|
||||
export { Content };
|
||||
@@ -1,137 +0,0 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { context as compiler } from 'ts/context/compiler';
|
||||
import { context as coverage } from 'ts/context/coverage';
|
||||
import { context as profiler } from 'ts/context/profiler';
|
||||
import { context as trace } from 'ts/context/trace';
|
||||
import MainIcon from 'ts/icons/logos/0x.svg';
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
import { Container } from './container';
|
||||
import { Alpha, Beta } from './typography';
|
||||
|
||||
const tools = [trace, coverage, compiler, profiler];
|
||||
|
||||
const Footer: React.StatelessComponent<{}> = () => (
|
||||
<StyledFooter>
|
||||
<Container>
|
||||
<Top>
|
||||
<Alpha>Other tools by 0x</Alpha>
|
||||
<List>
|
||||
{_.map(tools, ({ title, subtitle, icon, name }) => (
|
||||
<ListItem key={title}>
|
||||
<ListLink href={`https://sol-${name}.com`}>
|
||||
<Icon as={icon as 'svg'} />
|
||||
<div>
|
||||
<Beta>{title}</Beta>
|
||||
<p>{subtitle}</p>
|
||||
</div>
|
||||
</ListLink>
|
||||
</ListItem>
|
||||
))}
|
||||
</List>
|
||||
</Top>
|
||||
<Media as="aside">
|
||||
<Icon as={MainIcon} />
|
||||
<Small>
|
||||
0x is an open, permissionless protocol allowing for tokens to be traded on the Ethereum blockchain.
|
||||
Interested in joining our team?{' '}
|
||||
<a href="https://0x.org/careers" target="_blank">
|
||||
We're hiring
|
||||
</a>
|
||||
</Small>
|
||||
</Media>
|
||||
</Container>
|
||||
</StyledFooter>
|
||||
);
|
||||
|
||||
const StyledFooter = styled.footer`
|
||||
background-color: ${props => props.theme.colors.secondary};
|
||||
padding-top: 6.25rem;
|
||||
padding-bottom: 5.4375rem;
|
||||
|
||||
${media.small`padding-top: 2.5rem;`};
|
||||
`;
|
||||
|
||||
const Top = styled.div`
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 9.375rem;
|
||||
|
||||
${media.medium`
|
||||
display: block;
|
||||
margin-bottom: 5.3125rem;
|
||||
`};
|
||||
|
||||
${Alpha} {
|
||||
${media.medium`margin-bottom: 3.8125rem;`};
|
||||
}
|
||||
`;
|
||||
|
||||
const Icon = styled.div`
|
||||
margin-right: 1.3125rem;
|
||||
flex-shrink: 0;
|
||||
${media.small`margin-right: 0.9375rem`};
|
||||
`;
|
||||
|
||||
const Media = styled.div`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
${Icon} {
|
||||
margin-top: 0.5rem;
|
||||
align-self: flex-start;
|
||||
}
|
||||
`;
|
||||
|
||||
const List = styled.ul`
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 66.693548387%;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
${media.medium`
|
||||
width: 100%;
|
||||
`};
|
||||
|
||||
${media.small`
|
||||
display: block;
|
||||
`};
|
||||
`;
|
||||
|
||||
const ListItem = styled.li`
|
||||
margin-bottom: 3.3125rem;
|
||||
padding-right: 1rem;
|
||||
flex-basis: 50%;
|
||||
:nth-last-of-type(-n + 2) {
|
||||
margin-bottom: 0;
|
||||
|
||||
${media.small`margin-bottom: 1.875rem`};
|
||||
}
|
||||
|
||||
${media.small`
|
||||
margin-bottom: 1.875rem
|
||||
:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
`};
|
||||
`;
|
||||
|
||||
const ListLink = styled.a`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
:hover {
|
||||
color: ${props => props.theme.colors.dark};
|
||||
}
|
||||
`;
|
||||
|
||||
const Small = styled.small`
|
||||
font-size: 1em;
|
||||
max-width: 37.5rem;
|
||||
`;
|
||||
|
||||
export { Footer };
|
||||
@@ -1,76 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { ContextInterface, ThemeContext } from 'ts/context';
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
import { Container } from './container';
|
||||
import { Small } from './typography';
|
||||
|
||||
const Header: React.StatelessComponent<{}> = () => (
|
||||
<ThemeContext.Consumer>
|
||||
{({ icon, title }: ContextInterface) => (
|
||||
<StyledHeader>
|
||||
<Container>
|
||||
<LogoMark>
|
||||
<Logo as={icon as 'svg'} />
|
||||
<Title>{title}</Title>
|
||||
</LogoMark>
|
||||
|
||||
<Link as="a" href="https://0x.org/" target="_blank">
|
||||
Built by 0x
|
||||
</Link>
|
||||
</Container>
|
||||
</StyledHeader>
|
||||
)}
|
||||
</ThemeContext.Consumer>
|
||||
);
|
||||
|
||||
const StyledHeader = styled.header`
|
||||
padding-top: 3.75rem;
|
||||
padding-bottom: 0.875rem;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
${Container} {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
${media.small`padding-top: 2.125rem;`};
|
||||
`;
|
||||
|
||||
const LogoMark = styled.div`
|
||||
position: relative;
|
||||
height: 1.75rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
`;
|
||||
|
||||
const Logo = styled.div`
|
||||
color: ${props => props.theme.colors.main};
|
||||
width: 1.75rem;
|
||||
height: 100%;
|
||||
`;
|
||||
|
||||
const Title = styled.h1`
|
||||
font-size: 1.5rem;
|
||||
line-height: 1;
|
||||
white-space: nowrap;
|
||||
margin-top: 2px;
|
||||
margin-bottom: 0;
|
||||
margin-left: 0.8125rem;
|
||||
|
||||
${media.small`font-size: 1.25rem;`};
|
||||
`;
|
||||
|
||||
const Link = styled(Small)`
|
||||
:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
`;
|
||||
|
||||
export { Header };
|
||||
@@ -1,63 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { ContextInterface, ThemeContext } from 'ts/context';
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
import { Button } from './button';
|
||||
import { Beta } from './typography';
|
||||
|
||||
const Hero: React.StatelessComponent<ContextInterface> = ({ children }) => (
|
||||
<ThemeContext.Consumer>
|
||||
{({ subtitle, tagline, docLink }: ContextInterface) => (
|
||||
<StyledHero>
|
||||
<HeroContainer>
|
||||
<Subtitle>{subtitle}</Subtitle>
|
||||
<Tagline as="p">{tagline}</Tagline>
|
||||
<Button as="a" href={docLink} target="_blank" large={true}>
|
||||
Read the Docs
|
||||
</Button>
|
||||
</HeroContainer>
|
||||
{children}
|
||||
</StyledHero>
|
||||
)}
|
||||
</ThemeContext.Consumer>
|
||||
);
|
||||
|
||||
const StyledHero = styled.section`
|
||||
text-align: center;
|
||||
padding-top: 9.375rem;
|
||||
padding-bottom: 2rem;
|
||||
padding-left: 2.5rem;
|
||||
padding-right: 2.5rem;
|
||||
min-height: min-content;
|
||||
max-height: 37.5rem;
|
||||
height: 80vh;
|
||||
position: relative;
|
||||
`;
|
||||
|
||||
const HeroContainer = styled.div`
|
||||
margin: 0 auto;
|
||||
max-width: 590px;
|
||||
`;
|
||||
|
||||
const Subtitle = styled.h2`
|
||||
font-size: 3.75rem;
|
||||
line-height: 1.16;
|
||||
margin-bottom: 1.5rem;
|
||||
|
||||
${media.small`
|
||||
font-size: 2.25rem;
|
||||
line-height: 1.1;
|
||||
margin-bottom: 1.375rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Tagline = styled(Beta)`
|
||||
margin-bottom: 2rem;
|
||||
${media.small`
|
||||
margin-bottom: 1.25rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
export { Hero };
|
||||
@@ -1,20 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors } from '../variables';
|
||||
|
||||
interface InlineCodeProps {
|
||||
isAlt?: boolean;
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
const Code: React.StatelessComponent<InlineCodeProps> = ({ isAlt, children, ...props }) => (
|
||||
<code {...props}>{children}</code>
|
||||
);
|
||||
|
||||
const InlineCode = styled(Code)`
|
||||
background-color: ${props => (props.isAlt ? '#E5E8E9' : colors.blueGray)};
|
||||
padding: 0.3125rem;
|
||||
`;
|
||||
|
||||
export { InlineCode };
|
||||
@@ -1,70 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors, media } from 'ts/variables';
|
||||
|
||||
import { Breakout } from './breakout';
|
||||
import { Container } from './container';
|
||||
import { Alpha, Lead } from './typography';
|
||||
|
||||
const Main = styled.div`
|
||||
background-color: ${colors.lightGray};
|
||||
padding: 6.25rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
${media.large`
|
||||
padding: 2.5rem;
|
||||
`};
|
||||
${media.medium`
|
||||
display: block;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Title = styled(Alpha)`
|
||||
margin-bottom: 2.5rem;
|
||||
|
||||
${media.medium`margin-bottom: 2.25rem;`};
|
||||
`;
|
||||
|
||||
const StyledIntroLead = styled(Lead)`
|
||||
max-width: 25.9375rem;
|
||||
margin-right: 2rem;
|
||||
${media.medium`
|
||||
max-width: 100%;
|
||||
margin-bottom: 1.5625rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
const StyledIntroAside = styled.div`
|
||||
max-width: 32.5rem;
|
||||
position: relative;
|
||||
${media.medium`
|
||||
max-width: 100%;
|
||||
`};
|
||||
`;
|
||||
|
||||
interface IntroLeadProps {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const IntroLead: React.StatelessComponent<IntroLeadProps> = props => (
|
||||
<StyledIntroLead as="div">
|
||||
<Title>{props.title}</Title>
|
||||
{props.children}
|
||||
</StyledIntroLead>
|
||||
);
|
||||
|
||||
const IntroAside: React.StatelessComponent<{}> = props => (
|
||||
<Breakout>
|
||||
<StyledIntroAside>{props.children}</StyledIntroAside>
|
||||
</Breakout>
|
||||
);
|
||||
|
||||
const Intro: React.StatelessComponent<{}> = props => (
|
||||
<Container wide={true}>
|
||||
<Main>{props.children}</Main>
|
||||
</Container>
|
||||
);
|
||||
|
||||
export { IntroLead, IntroAside, Intro };
|
||||
@@ -1,50 +0,0 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
const StyledList = styled.ul`
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
`;
|
||||
|
||||
const StyledItem = styled.li`
|
||||
position: relative;
|
||||
padding-left: 1.625rem;
|
||||
|
||||
:before {
|
||||
content: '';
|
||||
border: 1px solid black;
|
||||
width: 0.625rem;
|
||||
height: 0.625rem;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
margin-top: 2px;
|
||||
top: 0.3125rem;
|
||||
left: 0;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
:not(:last-child) {
|
||||
margin-bottom: 0.5625rem;
|
||||
${media.small`
|
||||
margin-bottom: 0.375rem;
|
||||
`};
|
||||
}
|
||||
`;
|
||||
|
||||
interface ListProps {
|
||||
items?: [];
|
||||
}
|
||||
|
||||
const List: React.StatelessComponent<ListProps> = props => (
|
||||
<StyledList>
|
||||
{props.children !== undefined
|
||||
? props.children
|
||||
: _.map(props.items, (bullet, index) => <StyledItem key={index}>{bullet}</StyledItem>)}
|
||||
</StyledList>
|
||||
);
|
||||
|
||||
export { List, StyledItem as ListItem };
|
||||
@@ -1,66 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { Tab, TabList, TabPanel, Tabs as ReactTabs } from 'react-tabs';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { colors } from 'ts/variables';
|
||||
|
||||
import { Breakout } from './breakout';
|
||||
|
||||
const StyledTabList = styled(TabList)`
|
||||
text-transform: uppercase;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
`;
|
||||
|
||||
const StyledTab = styled(Tab)`
|
||||
background-color: ${props => props.theme.colors.secondary};
|
||||
height: 2.5rem;
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
float: left;
|
||||
&:not(:first-of-type) {
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
|
||||
&[aria-selected='true'] {
|
||||
background-color: ${colors.gray};
|
||||
}
|
||||
|
||||
&[aria-selected='false']:focus,
|
||||
&[aria-selected='false']:hover {
|
||||
background-color: ${props => props.theme.colors.secondary_alt};
|
||||
cursor: pointer;
|
||||
}
|
||||
`;
|
||||
|
||||
const Tabs: React.StatelessComponent<{}> = props => (
|
||||
<Breakout>
|
||||
<ReactTabs>
|
||||
<StyledTabList>
|
||||
{React.Children.map(props.children, child => {
|
||||
const { title } = React.cloneElement(child as React.ReactElement<any>).props;
|
||||
return <StyledTab>{title}</StyledTab>;
|
||||
})}
|
||||
</StyledTabList>
|
||||
|
||||
{React.Children.map(props.children, child => (
|
||||
<TabPanel>{child}</TabPanel>
|
||||
))}
|
||||
</ReactTabs>
|
||||
</Breakout>
|
||||
);
|
||||
|
||||
interface TabBlockProps {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const TabBlock: React.StatelessComponent<TabBlockProps> = props => <React.Fragment>{props.children}</React.Fragment>;
|
||||
|
||||
const ContextTabs = Tabs;
|
||||
|
||||
export { ContextTabs as Tabs, TabBlock };
|
||||
@@ -1,213 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { ContextInterface, ThemeContext } from 'ts/context';
|
||||
import ExactLocation from 'ts/icons/exact-location.svg';
|
||||
import NoLocation from 'ts/icons/no-location.svg';
|
||||
import TimeConsuming from 'ts/icons/time-consuming.svg';
|
||||
import TimeSaving from 'ts/icons/time-saving.svg';
|
||||
import { colors, media } from 'ts/variables';
|
||||
|
||||
import { Breakout } from './breakout';
|
||||
import { Code } from './code';
|
||||
import { Container } from './container';
|
||||
import { Alpha, Gamma, Lead } from './typography';
|
||||
|
||||
const Trace: React.StatelessComponent<{}> = () => (
|
||||
<ThemeContext.Consumer>
|
||||
{(props: ContextInterface) => (
|
||||
<StyledSection background={props.colors.secondary}>
|
||||
<Wrapper>
|
||||
<Block>
|
||||
<Alpha>The Issue</Alpha>
|
||||
<MainCopy>
|
||||
Every time an Ethereum transaction fails, it's extremely hard to trace down the
|
||||
troublemaking line of code. The only hint you'll get is a generic error.
|
||||
</MainCopy>
|
||||
<Breakout>
|
||||
<Code isLight={true}>Error: VM Exception while processing transaction: revert</Code>
|
||||
</Breakout>
|
||||
|
||||
<List>
|
||||
<Item>
|
||||
<Copy dark={true}>
|
||||
<Gamma as="h3">No location</Gamma>
|
||||
<p>
|
||||
The error basically says "anything could have gone wrong here", which keeps you
|
||||
completely in the dark about its exact location.
|
||||
</p>
|
||||
</Copy>
|
||||
<Icon as={NoLocation} />
|
||||
</Item>
|
||||
|
||||
<Item>
|
||||
<Copy dark={true}>
|
||||
<Gamma as="h3">Time-consuming</Gamma>
|
||||
<p>
|
||||
Working within a large code-base that contains many smart contracts, finding the
|
||||
failing line of code quickly becomes a daunting task.
|
||||
</p>
|
||||
</Copy>
|
||||
<Icon as={TimeConsuming} />
|
||||
</Item>
|
||||
</List>
|
||||
</Block>
|
||||
|
||||
<Block background={props.colors.secondary}>
|
||||
<Alpha>The Fix</Alpha>
|
||||
<MainCopy>
|
||||
Sol-trace will give you full stack traces, including contract names, line numbers and code
|
||||
snippets, every time you encounter an error.
|
||||
</MainCopy>
|
||||
<Breakout>
|
||||
<Code isLight={true} language="javascript">
|
||||
{`contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol:51:8
|
||||
require(
|
||||
isValidSignature(
|
||||
hash,
|
||||
signerAddress,
|
||||
signature
|
||||
),
|
||||
"INVALID_SIGNATURE"
|
||||
)`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
|
||||
<List>
|
||||
<Item>
|
||||
<Copy>
|
||||
<Gamma as="h3">Exact location</Gamma>
|
||||
<p>
|
||||
It shows you the exact location of the offending line and where it was called
|
||||
from.
|
||||
</p>
|
||||
</Copy>
|
||||
<Icon as={ExactLocation} />
|
||||
</Item>
|
||||
|
||||
<Item>
|
||||
<Copy>
|
||||
<Gamma as="h3">Time-saving</Gamma>
|
||||
<p>
|
||||
Turning "Your code failed somewhere, good luck debugging it" into "Your code
|
||||
failed on line X of contract Y", drastically improves the developer experience.
|
||||
</p>
|
||||
</Copy>
|
||||
<Icon as={TimeSaving} />
|
||||
</Item>
|
||||
</List>
|
||||
</Block>
|
||||
</Wrapper>
|
||||
</StyledSection>
|
||||
)}
|
||||
</ThemeContext.Consumer>
|
||||
);
|
||||
|
||||
interface TraceProps {
|
||||
background?: string;
|
||||
}
|
||||
|
||||
const StyledSection = styled.section<TraceProps>`
|
||||
max-width: 90rem;
|
||||
margin: 0 auto;
|
||||
background: linear-gradient(to right, ${colors.black} 50%, ${props => props.background} 50%);
|
||||
overflow: hidden;
|
||||
${media.large`
|
||||
background: none
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Wrapper = styled(Container)`
|
||||
display: flex;
|
||||
|
||||
${Alpha} {
|
||||
padding-bottom: 2.5rem;
|
||||
|
||||
${media.small`padding-bottom: 1.875rem;`};
|
||||
}
|
||||
|
||||
${media.large`
|
||||
display: block;
|
||||
width: 100%;
|
||||
`};
|
||||
`;
|
||||
|
||||
const Block = styled.div<TraceProps>`
|
||||
width: 50%;
|
||||
background: ${props => (props.background ? props.background : colors.black)};
|
||||
color: ${props => (props.background ? 'inherit' : colors.white)};
|
||||
padding-top: 6.25rem;
|
||||
padding-bottom: 5.25rem;
|
||||
|
||||
:first-of-type {
|
||||
padding-right: 6.25rem;
|
||||
}
|
||||
:last-of-type {
|
||||
padding-left: 6.25rem;
|
||||
}
|
||||
|
||||
${media.xlarge`
|
||||
:first-of-type {
|
||||
padding-right: 2.5rem;
|
||||
}
|
||||
:last-of-type {
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
`}
|
||||
${media.large`
|
||||
width: 100%;
|
||||
padding: 2.5rem;
|
||||
`}
|
||||
|
||||
${media.small`
|
||||
padding-left: 1.875rem;
|
||||
padding-right: 1.875rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
const MainCopy = styled(Lead)`
|
||||
margin-bottom: 3.1875rem;
|
||||
${media.small`
|
||||
margin-bottom: 1.125rem;
|
||||
`};
|
||||
`;
|
||||
|
||||
const List = styled.ul`
|
||||
margin-top: 6.25rem;
|
||||
margin-bottom: 0;
|
||||
padding: 0;
|
||||
|
||||
${media.small`margin-top: 3.4375rem;`};
|
||||
`;
|
||||
|
||||
const Item = styled.li`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
:not(:last-child) {
|
||||
margin-bottom: 4.4375rem;
|
||||
|
||||
${media.small`margin-bottom: 3.4375rem;`};
|
||||
}
|
||||
`;
|
||||
|
||||
const Copy = styled.div<{ dark: boolean }>`
|
||||
margin-right: 5.875rem;
|
||||
${props =>
|
||||
props.dark &&
|
||||
`
|
||||
p {
|
||||
color: #ccc;
|
||||
}
|
||||
`}
|
||||
|
||||
${media.small`margin-right: 2.0625rem;`};
|
||||
`;
|
||||
|
||||
const Icon = styled.div`
|
||||
flex-shrink: 0;
|
||||
`;
|
||||
|
||||
export { Trace };
|
||||
@@ -1,33 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
|
||||
import { media } from '../variables';
|
||||
|
||||
const Alpha = styled.h2`
|
||||
font-size: 1.75rem;
|
||||
line-height: 1;
|
||||
|
||||
${media.small`font-size: 1.5rem;`};
|
||||
`;
|
||||
|
||||
const Beta = styled.h3`
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.65;
|
||||
`;
|
||||
|
||||
const Gamma = styled.h4`
|
||||
font-size: 1rem;
|
||||
|
||||
${media.small`font-size: 0.875rem;`};
|
||||
`;
|
||||
|
||||
const Lead = styled.p`
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.6;
|
||||
${media.small`font-size: 1rem;`};
|
||||
`;
|
||||
|
||||
const Small = styled.p`
|
||||
font-size: 0.875rem;
|
||||
`;
|
||||
|
||||
export { Alpha, Beta, Gamma, Lead, Small };
|
||||
@@ -1,20 +0,0 @@
|
||||
import Icon from 'ts/icons/logos/compiler.svg';
|
||||
|
||||
import { ContextInterface } from './index';
|
||||
|
||||
export const context: ContextInterface = {
|
||||
title: 'sol-compiler',
|
||||
name: 'compiler',
|
||||
docLink: 'https://0x.org/docs/sol-compiler',
|
||||
subtitle: 'Solidity compilation that just works',
|
||||
tagline: 'Seamlessly compile an entire solidity project and generate customisable artifacts',
|
||||
icon: Icon,
|
||||
colors: {
|
||||
main: '#1EADCD',
|
||||
secondary: '#D1F4FC',
|
||||
secondary_alt: '#C4F2FC',
|
||||
type: '#30C3E3',
|
||||
type_alt: '#16A9C9',
|
||||
dark: '#4B818D',
|
||||
},
|
||||
};
|
||||
@@ -1,20 +0,0 @@
|
||||
import Icon from 'ts/icons/logos/cov.svg';
|
||||
|
||||
import { ContextInterface } from './index';
|
||||
|
||||
export const context: ContextInterface = {
|
||||
title: 'sol-coverage',
|
||||
name: 'coverage',
|
||||
subtitle: 'Solidity code coverage',
|
||||
docLink: 'https://0x.org/docs/sol-coverage',
|
||||
tagline: 'Measure Solidity code coverage',
|
||||
icon: Icon,
|
||||
colors: {
|
||||
main: '#BB9200',
|
||||
secondary: '#F1DB8D',
|
||||
secondary_alt: '#F1D882',
|
||||
type: '#D7AE1B',
|
||||
type_alt: '#BD9406',
|
||||
dark: '#817033',
|
||||
},
|
||||
};
|
||||
@@ -1,22 +0,0 @@
|
||||
import { createContext } from 'react';
|
||||
|
||||
interface ContextInterface {
|
||||
title?: string;
|
||||
name?: string;
|
||||
docLink?: string;
|
||||
subtitle?: string;
|
||||
tagline?: string;
|
||||
icon?: React.ReactNode;
|
||||
colors?: {
|
||||
main: string;
|
||||
secondary: string;
|
||||
secondary_alt: string;
|
||||
type: string;
|
||||
type_alt: string;
|
||||
dark: string;
|
||||
};
|
||||
}
|
||||
|
||||
const ThemeContext = createContext({});
|
||||
|
||||
export { ThemeContext, ContextInterface };
|
||||
@@ -1,20 +0,0 @@
|
||||
import Icon from 'ts/icons/logos/profiler.svg';
|
||||
|
||||
import { ContextInterface } from './index';
|
||||
|
||||
export const context: ContextInterface = {
|
||||
title: 'sol-profiler',
|
||||
name: 'profiler',
|
||||
docLink: 'https://0x.org/docs/sol-profiler',
|
||||
subtitle: 'Gas profiling for Solidity',
|
||||
tagline: "Implement data-guided optimizations by profiling your contract's gas usage",
|
||||
icon: Icon,
|
||||
colors: {
|
||||
main: '#FF7144',
|
||||
secondary: '#FED7CB',
|
||||
secondary_alt: '#FECEBE',
|
||||
type: '#EB8666',
|
||||
type_alt: '#D16745',
|
||||
dark: '#985C49',
|
||||
},
|
||||
};
|
||||
@@ -1,20 +0,0 @@
|
||||
import Icon from 'ts/icons/logos/trace.svg';
|
||||
|
||||
import { ContextInterface } from './index';
|
||||
|
||||
export const context: ContextInterface = {
|
||||
title: 'sol-trace',
|
||||
name: 'trace',
|
||||
subtitle: 'Human-readable stack traces',
|
||||
docLink: 'https://0x.org/docs/sol-trace',
|
||||
tagline: 'Immediately locate Solidity errors and rapidly debug failed transactions',
|
||||
icon: Icon,
|
||||
colors: {
|
||||
main: '#4F76FF',
|
||||
secondary: '#CDD8FF',
|
||||
secondary_alt: '#BFCDFF',
|
||||
type: '#7090FF',
|
||||
type_alt: '#355CE5',
|
||||
dark: '#2A4ABC',
|
||||
},
|
||||
};
|
||||
@@ -1,87 +0,0 @@
|
||||
import hljsStyles from 'highlight.js/styles/github-gist.css';
|
||||
import { createGlobalStyle } from 'styled-components';
|
||||
import styledNormalize from 'styled-normalize';
|
||||
|
||||
import { ContextInterface } from 'ts/context';
|
||||
import { media } from 'ts/variables';
|
||||
|
||||
const GlobalStyles = createGlobalStyle<ContextInterface>`
|
||||
${styledNormalize}
|
||||
${hljsStyles}
|
||||
|
||||
@font-face {
|
||||
font-family: "Maison Neue";
|
||||
src: url("/fonts/MaisonNeue-Book-subset.woff2") format("woff2"), url("/fonts/MaisonNeue-Book-subset.woff") format("woff");
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
unicode-range: U+20-7E;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Maison Neue";
|
||||
src: url("/fonts/MaisonNeue-Bold-subset.woff2") format("woff2"), url("/fonts/MaisonNeue-Bold-subset.woff") format("woff");
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
unicode-range: U+20-7E;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Maison Neue Mono";
|
||||
src: url("/fonts/MaisonNeue-Mono-subset.woff2") format("woff2"), url("/fonts/MaisonNeue-Mono-subset.woff") format("woff");
|
||||
font-weight: 300;
|
||||
font-display: optional;
|
||||
unicode-range: U+20-7E;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "Maison Neue", system-ui, sans-serif;
|
||||
font-weight: 300;
|
||||
font-size: 1rem;
|
||||
line-height: 1.8;
|
||||
|
||||
${media.small`font-size: 0.875rem;`};
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:not([class]) {
|
||||
color: ${props => props.colors.type_alt};
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: ${props => props.colors.type_alt};
|
||||
}
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-weight: 500;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
&:not([class]):last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: "Maison Neue Mono", monospace;
|
||||
${media.small`
|
||||
font-size: .75rem;
|
||||
`}
|
||||
}
|
||||
`;
|
||||
|
||||
export { GlobalStyles };
|
||||
24
packages/dev-tools-pages/ts/globals.d.ts
vendored
@@ -1,24 +0,0 @@
|
||||
declare module 'whatwg-fetch';
|
||||
declare module 'react-document-title';
|
||||
declare module 'highlight.js/lib/highlight';
|
||||
declare module 'highlight.js/lib/languages/javascript';
|
||||
declare module 'highlight.js/lib/languages/json';
|
||||
|
||||
declare var System: any;
|
||||
|
||||
declare module '*.json' {
|
||||
const json: any;
|
||||
/* tslint:disable */
|
||||
export default json;
|
||||
/* tslint:enable */
|
||||
}
|
||||
|
||||
declare module '*.css' {
|
||||
const css: any;
|
||||
export default css;
|
||||
}
|
||||
|
||||
declare module '*.svg' {
|
||||
const svg: any;
|
||||
export default svg;
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
import * as hljs from 'highlight.js/lib/highlight';
|
||||
import * as javascript from 'highlight.js/lib/languages/javascript';
|
||||
import * as json from 'highlight.js/lib/languages/json';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
hljs.registerLanguage('javascript', javascript);
|
||||
hljs.registerLanguage('json', json);
|
||||
|
||||
interface PatchInterface {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
const PATCH_TYPES: PatchInterface = {
|
||||
'+': 'addition',
|
||||
'-': 'deletion',
|
||||
'!': 'change',
|
||||
};
|
||||
|
||||
function diffHighlight(language: string, code: any, gutter: any): string {
|
||||
return _.map(code.split(/\r?\n/g), (line: string, index: number) => {
|
||||
let type;
|
||||
let currentLine = line;
|
||||
|
||||
if (/^-{3} [^-]+ -{4}$|^\*{3} [^*]+ \*{4}$|^@@ [^@]+ @@$/.test(currentLine)) {
|
||||
type = 'chunk';
|
||||
} else if (/^Index: |^[+\-*]{3}|^[*=]{5,}$/.test(currentLine)) {
|
||||
type = 'header';
|
||||
} else {
|
||||
type = PATCH_TYPES[currentLine[0]] || 'null';
|
||||
currentLine = currentLine.replace(/^[+\-! ]/, '');
|
||||
}
|
||||
|
||||
const g = gutter[index];
|
||||
|
||||
return `<span data-gutter="${g !== undefined ? `${g}x` : ''}" class="line-${type}">${
|
||||
hljs.highlight(language, currentLine).value
|
||||
}</span>`;
|
||||
}).join('\n');
|
||||
}
|
||||
|
||||
interface HighlightProps {
|
||||
language: string;
|
||||
code: string;
|
||||
isDiff?: boolean;
|
||||
gutter?: [];
|
||||
isEtc?: boolean;
|
||||
}
|
||||
|
||||
function highlight({ language, code, isDiff, gutter, isEtc }: HighlightProps): string {
|
||||
if (isDiff) {
|
||||
return diffHighlight(language, code, gutter);
|
||||
}
|
||||
|
||||
const hlCode = hljs.highlight(language, code).value;
|
||||
|
||||
if (!isEtc) {
|
||||
return hlCode;
|
||||
}
|
||||
|
||||
const hc = hlCode.split(/\r?\n/g);
|
||||
hc.splice(1, 0, ' ...');
|
||||
hc.splice(hc.length - 1, 0, ' ...');
|
||||
|
||||
return hc.join('\n');
|
||||
}
|
||||
|
||||
export { highlight };
|
||||
@@ -1 +0,0 @@
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M80 33.6772c0 5.1116-1.8855 10.4454-4.7935 15.617-2.9036 5.1637-6.7886 10.0987-10.6962 14.3941-3.9047 4.2922-7.8128 7.9248-10.746 10.4851-1.4659 1.2795-2.6866 2.2897-3.5393 2.9788-.2841.2296-.5273.4235-.725.5798-.1977-.1563-.4409-.3502-.725-.5798-.8527-.6891-2.0734-1.6993-3.5393-2.9788-2.9332-2.5603-6.8413-6.1929-10.746-10.4851-3.9076-4.2954-7.7926-9.2304-10.6962-14.3941C20.8855 44.1226 19 38.7888 19 33.6772 19 16.7294 32.6606 3 49.5 3 66.3394 3 80 16.7294 80 33.6772z" stroke="#fff" stroke-width="2"/><path d="M50 98V55M27.5 77H73" stroke="#000" stroke-width="2"/><circle cx="50" cy="34" r="10" stroke="#fff" stroke-width="2"/></svg>
|
||||
|
Before Width: | Height: | Size: 746 B |
1
packages/dev-tools-pages/ts/icons/logos/0x.svg
generated
@@ -1 +0,0 @@
|
||||
<svg width="37" height="37" viewBox="0 0 37 37" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M9.20465 34.4904c2.38415 1.3926 5.13725 2.2736 8.08905 2.4725 4.0871.2558 7.9188-.8242 11.1261-2.8704 1.5894-1.0232 3.0085-2.2737 4.229-3.7231-.9934-1.3926-2.0719-2.842-3.2072-4.3199-.3123-.3979-.6245-.7958-.9367-1.1937-1.1921 1.9042-2.9518 3.4389-4.9953 4.4052l-3.1789-3.0978-11.12605 8.3272zM2.44955 9.30988C1.08718 11.6972.235696 14.3971.0370167 17.3244-.218428 21.417.860116 25.2821 2.90368 28.4652c1.02177 1.5916 2.27062 3.0126 3.71814 4.2347 1.39075-.9947 2.83827-2.0747 4.31418-3.2115.3974-.3127.7947-.6253 1.1921-.9379-1.9017-1.2221-3.43434-2.9841-4.39936-5.0304l3.12206-3.1831L2.44955 9.30988zM27.7954 2.51741C25.4112 1.12481 22.6581.243776 19.7063.0448336 15.6192-.23937 11.7591.840605 8.55184 2.91529 6.96241 3.93843 5.54327 5.18893 4.32281 6.63837c.9934 1.3926 2.07194 2.84204 3.20725 4.31993.31221.3979.62442.7957.93663 1.1936 1.22046-1.9041 2.95181-3.43884 5.02371-4.40514l2.9802 2.87044 11.3248-8.09979zM34.5788 27.6126c1.334-2.3589 2.1855-5.0304 2.3842-7.9293.2554-4.0925-.8231-7.9293-2.8667-11.14077-1.0218-1.59154-2.2706-3.01256-3.7181-4.23464-1.3908.99472-2.8383 2.07469-4.3142 3.21151-.3974.31262-.7947.62525-1.1921.93787 1.9301 1.22208 3.4627 2.98413 4.4277 5.03043l.0284.0568-3.0085 3.1263 8.2593 10.9418z"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,3 +0,0 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 28V15V0H15H28V15V28H15H0ZM26 13V2H15V13H26ZM15 15H26V26H15V15ZM13 13V2H2V13H13ZM2 15H13V26H2V15Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 264 B |
3
packages/dev-tools-pages/ts/icons/logos/cov.svg
generated
@@ -1,3 +0,0 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 0H28V28H0V0ZM2 2V26H26V16H12V2H2ZM14 2V14H26V2H14Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 217 B |
@@ -1,3 +0,0 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2 2H26V9H2V2ZM2 11V26H26V11H2ZM0 0H2H26H28V2V26V28H26H2H0V26V2V0Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 231 B |
@@ -1 +0,0 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M10 15H2V2h24v13H10zm0 2H2v9h8v-9zm2 9h14v-9H12v9zm-2 2H0V0h28v28H10z"/></svg>
|
||||
|
Before Width: | Height: | Size: 230 B |
@@ -1 +0,0 @@
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M88.2609 41.4937c0 6.4322-2.3631 13.1253-5.9866 19.5928-3.6191 6.4597-8.4581 12.6276-13.3196 17.9909-4.8586 5.3602-9.7205 9.8958-13.3691 13.0921-1.8236 1.5975-3.3423 2.8589-4.4037 3.7198-.4285.3475-.7823.6297-1.0515.8423-.2692-.2126-.623-.4948-1.0514-.8423-1.0614-.8609-2.5802-2.1223-4.4038-3.7198-3.6486-3.1963-8.5105-7.7319-13.3691-13.0921-4.8614-5.3633-9.7004-11.5312-13.3196-17.9909C14.363 54.619 12 47.9259 12 41.4937 12 20.2255 29.0803 3 50.1304 3c21.0502 0 38.1305 17.2255 38.1305 38.4937z" stroke="#CDD8FF" stroke-width="2"/><circle opacity=".5" cx="50" cy="42" r="18" stroke="#CDD8FF" stroke-width="2"/><path d="M22.5 69.5L78 14" stroke="#fff" stroke-width="2"/></svg>
|
||||
|
Before Width: | Height: | Size: 798 B |
@@ -1 +0,0 @@
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><circle opacity=".5" cx="50" cy="50" r="42" stroke="#CDD8FF" stroke-width="2"/><path opacity=".5" d="M34.6621 79.4343c6.9918 3.5363 15.2613 4.61 23.4252 2.4225 8.1639-2.1875 14.7886-7.2521 19.0755-13.8105M33.8711 58c2.9454 5.9269 9.0615 10 16.129 10 1.5538 0 3.0617-.1969 4.5-.5671M30 25.0185C35.4784 20.6269 42.4324 18 50 18c13.4295 0 24.9268 8.2727 29.6739 20" stroke="#CDD8FF" stroke-width="2"/><path d="M35 64l17.5-12.5L37.5 9" stroke="#fff" stroke-width="2"/></svg>
|
||||
|
Before Width: | Height: | Size: 569 B |
@@ -1 +0,0 @@
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="49.9092" cy="49.7499" r="40.4824" transform="rotate(45 49.9092 49.7499)" stroke="#fff" stroke-width="2"/><path d="M21.5991 79.4236l8.5269-8.5269M71.3965 29.6267l8.5268-8.5268M69.6914 70.8967l8.5269 8.5269M20.5761 21.7819l9.2091 9.2091M9.01002 50.4736H21.0688M79.4334 50.4736h12.0588M49.0449 78.45v12.0588M49.0449 8.99112V22.0146" stroke="#fff" stroke-width="2"/><path d="M35.584 36.789l14.3252 14.3252 30.0146-30.0146" stroke="#000" stroke-width="2"/></svg>
|
||||
|
Before Width: | Height: | Size: 568 B |
@@ -1,182 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { hydrate, render } from 'react-dom';
|
||||
import * as Loadable from 'react-loadable';
|
||||
|
||||
import { context } from 'ts/context/compiler';
|
||||
|
||||
import { Base } from 'ts/components/base';
|
||||
import { Breakout } from 'ts/components/breakout';
|
||||
import { CallToAction } from 'ts/components/call_to_action';
|
||||
import { Code } from 'ts/components/code';
|
||||
import { Compiler as CompilerComponent } from 'ts/components/compiler';
|
||||
import { Content } from 'ts/components/content';
|
||||
import { ContentBlock } from 'ts/components/content-block';
|
||||
import { Hero } from 'ts/components/hero';
|
||||
import { InlineCode } from 'ts/components/inline-code';
|
||||
import { Lead } from 'ts/components/typography';
|
||||
|
||||
const Animation = Loadable({
|
||||
loader: () => System.import(/* webpackChunkName: 'compiler-animation' */ 'ts/components/animations/compiler'),
|
||||
loading: () => <div />,
|
||||
delay: 1000,
|
||||
render(loadable: { CompilerAnimation: any }): React.ReactNode {
|
||||
const Component = loadable.CompilerAnimation;
|
||||
return <Component />;
|
||||
},
|
||||
});
|
||||
|
||||
const SOLIDITY_INPUT_FORMAT_DOCS =
|
||||
'https://solidity.readthedocs.io/en/v0.4.24/using-the-compiler.html#compiler-input-and-output-json-description';
|
||||
|
||||
const Compiler: React.StatelessComponent<{}> = () => (
|
||||
<Base context={context}>
|
||||
<Hero>
|
||||
<Animation />
|
||||
</Hero>
|
||||
<CompilerComponent />
|
||||
<Content>
|
||||
<ContentBlock main={true} title="Get started" />
|
||||
<ContentBlock title="Install">
|
||||
<Breakout>
|
||||
<Code canCopy={true}>npm install @0x/sol-compiler --g</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
|
||||
<ContentBlock title="Run">
|
||||
<Breakout>
|
||||
<Code canCopy={true}>cd /your_project_dir && sol-compiler</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
|
||||
<ContentBlock title="Configure">
|
||||
<p>
|
||||
Configure via a <InlineCode>compiler.json</InlineCode> file.
|
||||
</p>
|
||||
<Breakout>
|
||||
<Code canCopy={true}>mkdir compiler.json</Code>
|
||||
</Breakout>
|
||||
<p>Example of settings:</p>
|
||||
<Breakout>
|
||||
<Code language="json" canCopy={true}>
|
||||
{`{
|
||||
"contractsDir": "contracts",
|
||||
"artifactsDir": "artifacts",
|
||||
"contracts": "*",
|
||||
"compilerSettings": {
|
||||
"optimizer": { "enabled": false },
|
||||
"outputSelection": {
|
||||
"*": {
|
||||
"*": ["abi", "evm.bytecode.object"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
</Content>
|
||||
<Content dark={true}>
|
||||
<ContentBlock main={true} title="Artifacts">
|
||||
<Lead>
|
||||
Sol compiler uses{' '}
|
||||
<a href={SOLIDITY_INPUT_FORMAT_DOCS} target="_blank">
|
||||
Solidity standard JSON input format
|
||||
</a>{' '}
|
||||
to specify what to include in the generated artifacts. This way, you have complete flexibility on
|
||||
what is included.
|
||||
</Lead>
|
||||
</ContentBlock>
|
||||
|
||||
<ContentBlock title="Production">
|
||||
<p>
|
||||
In production, you want to optimize for a small bundle size, so your compiler.json config would
|
||||
instruct sol-compiler to only output the contract ABI.
|
||||
</p>
|
||||
<Breakout>
|
||||
<Code isLight={true} language="json" isEtc={true}>
|
||||
{`{
|
||||
"compilerSettings": {
|
||||
"outputSelection": {
|
||||
"*": {
|
||||
"*": ["abi"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
<Breakout>
|
||||
<Code isLight={true} language="json" isEtc={true}>
|
||||
{`{
|
||||
"compilerOutput": {
|
||||
"abi": [...],
|
||||
},
|
||||
}`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
<ContentBlock title="Development">
|
||||
<p>
|
||||
In development, you need to use profiler and other dev tools that require more information from the
|
||||
artifact. To do this, you can specify that the artifact also contain the bytecode, deployed bytecode
|
||||
and source maps.
|
||||
</p>
|
||||
<Breakout>
|
||||
<Code isLight={true} language="json" isEtc={true}>
|
||||
{`{
|
||||
"compilerSettings": {
|
||||
"outputSelection": {
|
||||
"*": {
|
||||
"*": [
|
||||
"abi",
|
||||
"evm.bytecode.object",
|
||||
"evm.bytecode.sourceMap",
|
||||
"evm.deployedBytecode.object",
|
||||
"evm.deployedBytecode.sourceMap"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
|
||||
<Breakout>
|
||||
<Code isLight={true} language="json" isEtc={true}>
|
||||
{`{
|
||||
"compilerOutput": {
|
||||
"abi": [...],
|
||||
"evm": {
|
||||
"bytecode": {
|
||||
"object": "0xdeadbeef",
|
||||
"sourceMap": "26:480:..."
|
||||
},
|
||||
"deployedBytecode": {
|
||||
"object": "0xdeadbeef",
|
||||
"sourceMap": "26:480:0..."
|
||||
}
|
||||
}
|
||||
}
|
||||
"sources": {
|
||||
"Migrations.sol": {
|
||||
"id": 0
|
||||
}
|
||||
},
|
||||
}`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
</Content>
|
||||
<div style={{ paddingTop: '5rem' }}>
|
||||
<CallToAction />
|
||||
</div>
|
||||
</Base>
|
||||
);
|
||||
|
||||
const root = document.getElementById('app');
|
||||
|
||||
if (root.hasChildNodes()) {
|
||||
hydrate(<Compiler />, root);
|
||||
} else {
|
||||
render(<Compiler />, root);
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { hydrate, render } from 'react-dom';
|
||||
import * as Loadable from 'react-loadable';
|
||||
|
||||
import { context } from 'ts/context/coverage';
|
||||
|
||||
import { Base } from 'ts/components/base';
|
||||
import { Breakout } from 'ts/components/breakout';
|
||||
import { CallToAction } from 'ts/components/call_to_action';
|
||||
import { Code } from 'ts/components/code';
|
||||
import { Content } from 'ts/components/content';
|
||||
import { ContentBlock } from 'ts/components/content-block';
|
||||
import { Hero } from 'ts/components/hero';
|
||||
import { InlineCode } from 'ts/components/inline-code';
|
||||
import { Intro, IntroAside, IntroLead } from 'ts/components/intro';
|
||||
import { List, ListItem } from 'ts/components/list';
|
||||
import { TabBlock, Tabs } from 'ts/components/tabs';
|
||||
|
||||
const Animation = Loadable({
|
||||
loader: () => System.import(/* webpackChunkName: 'cov-animation' */ 'ts/components/animations/cov'),
|
||||
loading: () => <div />,
|
||||
delay: 1000,
|
||||
render(loadable: { CovAnimation: any }): React.ReactNode {
|
||||
const Component = loadable.CovAnimation;
|
||||
return <Component />;
|
||||
},
|
||||
});
|
||||
|
||||
const Coverage: React.StatelessComponent<{}> = () => (
|
||||
<Base context={context}>
|
||||
<Hero>
|
||||
<Animation />
|
||||
</Hero>
|
||||
<Intro>
|
||||
<IntroLead title="Measure your tests">
|
||||
<p>
|
||||
When it comes to writing secure smart contracts, testing is one of the most important steps in the
|
||||
process. In order to quantify the robustness of your Solidity testing suite, you need to measure its
|
||||
code coverage.
|
||||
</p>
|
||||
</IntroLead>
|
||||
<IntroAside>
|
||||
<Code
|
||||
language="javascript"
|
||||
isDiff={true}
|
||||
gutterLength={2}
|
||||
gutter={[4, undefined, 4, 4, 4, undefined, 4, 2, 2, 2]}
|
||||
>
|
||||
{`+function executeTransaction(uint transactionId)
|
||||
public
|
||||
+ notExecuted(transactionId)
|
||||
+ fullyConfirmed(transactionId)
|
||||
+ pastTimeLock(transactionId)
|
||||
{
|
||||
+ Transaction storage tx = transactions[transactionId]
|
||||
+ tx.executed = true
|
||||
+ if (tx.destination.call.value(tx.value)(tx.data))
|
||||
+ Execution(transactionId)
|
||||
else {
|
||||
- ExecutionFailure(transactionId)
|
||||
- tx.executed = false
|
||||
}
|
||||
}`}
|
||||
</Code>
|
||||
</IntroAside>
|
||||
</Intro>
|
||||
|
||||
<Content>
|
||||
<ContentBlock main={true} title="Get started" />
|
||||
<ContentBlock title="Prerequisites">
|
||||
<List>
|
||||
<ListItem>
|
||||
Use{' '}
|
||||
<a href="https://github.com/trufflesuite/ganache-cli" target="_blank">
|
||||
Ganache
|
||||
</a>{' '}
|
||||
as a backing node.
|
||||
</ListItem>
|
||||
<ListItem>
|
||||
Understand and use{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
web3-provider-engine
|
||||
</a>
|
||||
.
|
||||
</ListItem>
|
||||
</List>
|
||||
</ContentBlock>
|
||||
<ContentBlock title="Installation">
|
||||
<Breakout>
|
||||
<Code canCopy={true}>npm install @0x/sol-coverage --save</Code>
|
||||
</Breakout>
|
||||
|
||||
<p>
|
||||
Sol-coverage is a subprovider that needs to be prepended to your{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
provider engine
|
||||
</a>
|
||||
. Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-coverage
|
||||
ships with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
|
||||
<a href="https://sol-compiler.com" target="_blank">
|
||||
Sol-compiler
|
||||
</a>{' '}
|
||||
and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
|
||||
<a href="https://truffleframework.com/truffle" target="_blank">
|
||||
Truffle framework
|
||||
</a>{' '}
|
||||
(Also see our{' '}
|
||||
<a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
|
||||
Truffle example project
|
||||
</a>{' '}
|
||||
for a complete walk-through). You can also write your own and support any artifact format.
|
||||
</p>
|
||||
|
||||
<Tabs>
|
||||
<TabBlock title="Sol-compiler">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { SolCompilerArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
// Both artifactsDir and contractsDir are optional and will be fetched from compiler.json if not passed in
|
||||
const artifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Truffle">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { TruffleArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
const projectRoot = '.';
|
||||
const solcVersion = '0.5.0';
|
||||
const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Custom">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { AbstractArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
|
||||
const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
</Tabs>
|
||||
<p>
|
||||
Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
|
||||
<InlineCode>CoverageSubprovider</InlineCode> and append it to our provider engine.
|
||||
</p>
|
||||
|
||||
<Breakout>
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
|
||||
import { CoverageSubprovider } from '@0x/sol-coverage';
|
||||
|
||||
const defaultFromAddress = "..."; // Some ethereum address with test funds
|
||||
const coverageSubprovider = new CoverageSubprovider(artifactAdapter, defaultFromAddress);
|
||||
|
||||
const providerEngine = new ProviderEngine();
|
||||
providerEngine.addProvider(coverageSubprovider);
|
||||
providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'}));
|
||||
providerEngine.start();`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
</Content>
|
||||
<CallToAction />
|
||||
</Base>
|
||||
);
|
||||
|
||||
const root = document.getElementById('app');
|
||||
|
||||
if (root.hasChildNodes()) {
|
||||
hydrate(<Coverage />, root);
|
||||
} else {
|
||||
render(<Coverage />, root);
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { hydrate, render } from 'react-dom';
|
||||
import * as Loadable from 'react-loadable';
|
||||
|
||||
import { context } from 'ts/context/profiler';
|
||||
|
||||
import { Base } from 'ts/components/base';
|
||||
import { Breakout } from 'ts/components/breakout';
|
||||
import { CallToAction } from 'ts/components/call_to_action';
|
||||
import { Code } from 'ts/components/code';
|
||||
import { Content } from 'ts/components/content';
|
||||
import { ContentBlock } from 'ts/components/content-block';
|
||||
import { Hero } from 'ts/components/hero';
|
||||
import { InlineCode } from 'ts/components/inline-code';
|
||||
import { Intro, IntroAside, IntroLead } from 'ts/components/intro';
|
||||
import { List, ListItem } from 'ts/components/list';
|
||||
import { TabBlock, Tabs } from 'ts/components/tabs';
|
||||
|
||||
const Animation = Loadable({
|
||||
loader: () => System.import(/* webpackChunkName: 'profiler-animation' */ 'ts/components/animations/profiler'),
|
||||
loading: () => <div />,
|
||||
delay: 1000,
|
||||
render(loadable: { ProfilerAnimation: any }): React.ReactNode {
|
||||
const Component = loadable.ProfilerAnimation;
|
||||
return <Component />;
|
||||
},
|
||||
});
|
||||
|
||||
const Profiler: React.StatelessComponent<{}> = () => (
|
||||
<Base context={context}>
|
||||
<Hero>
|
||||
<Animation />
|
||||
</Hero>
|
||||
<Intro>
|
||||
<IntroLead title="Outline gas usage">
|
||||
<p>
|
||||
Sol-profiler gathers line-by-line gas usage for any transaction submitted through your provider.
|
||||
This will help you find unexpected inefficiencies in parts of your smart contract, and take a
|
||||
data-driven approach to optimizing it.
|
||||
</p>
|
||||
</IntroLead>
|
||||
<IntroAside>
|
||||
<Code
|
||||
language="javascript"
|
||||
isDiff={true}
|
||||
gutterLength={6}
|
||||
gutter={[15, 15, undefined, 21747, 20303, 1435]}
|
||||
>
|
||||
{`+function() public payable {
|
||||
+ deposit();
|
||||
}
|
||||
+function deposit() public payabble {
|
||||
+ balanceOf[msg.sender] += msg.value;
|
||||
+ Deposit(msg.sender, msg.value);
|
||||
}
|
||||
-function withdraw(uint wad) public {
|
||||
- require(balanceOf[msg.sender] >= wad);
|
||||
- balanceOf[msg.sender] -= wad;
|
||||
- msg.sender.transfer(wad);
|
||||
- Withdrawal(msg.sender, wad);
|
||||
}`}
|
||||
</Code>
|
||||
</IntroAside>
|
||||
</Intro>
|
||||
<Content>
|
||||
<ContentBlock main={true} title="Get started" />
|
||||
<ContentBlock title="Prerequisites">
|
||||
<List>
|
||||
<ListItem>
|
||||
Use{' '}
|
||||
<a href="https://github.com/trufflesuite/ganache-cli" target="_blank">
|
||||
Ganache
|
||||
</a>{' '}
|
||||
as a backing node.
|
||||
</ListItem>
|
||||
<ListItem>
|
||||
Understand and use{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
web3-provider-engine
|
||||
</a>
|
||||
.
|
||||
</ListItem>
|
||||
</List>
|
||||
</ContentBlock>
|
||||
<ContentBlock title="Installation">
|
||||
<Breakout>
|
||||
<Code canCopy={true}>npm install @0x/sol-trace --save</Code>
|
||||
</Breakout>
|
||||
|
||||
<p>
|
||||
Sol-trace is a subprovider that needs to be prepended to your{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
provider engine
|
||||
</a>
|
||||
. Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-trace ships
|
||||
with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
|
||||
<a href="https://sol-compiler.com" target="_blank">
|
||||
Sol-compiler
|
||||
</a>{' '}
|
||||
and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
|
||||
<a href="https://truffleframework.com/truffle" target="_blank">
|
||||
Truffle framework
|
||||
</a>{' '}
|
||||
(Also see our{' '}
|
||||
<a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
|
||||
Truffle example project
|
||||
</a>{' '}
|
||||
for a complete walk-through). You can also write your own and support any artifact format.
|
||||
</p>
|
||||
|
||||
<Tabs>
|
||||
<TabBlock title="Sol-compiler">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { SolCompilerArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
// Both artifactsDir and contractsDir are optional and will be fetched from compiler.json if not passed in
|
||||
const artifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Truffle">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { TruffleArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
const projectRoot = '.';
|
||||
const solcVersion = '0.5.0';
|
||||
const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Custom">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { AbstractArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
|
||||
const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
</Tabs>
|
||||
<p>
|
||||
Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
|
||||
<InlineCode>ProfilerSubprovider</InlineCode> and append it to our provider engine.
|
||||
</p>
|
||||
|
||||
<Breakout>
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
|
||||
import { ProfilerSubprovider } from '@0x/sol-profiler';
|
||||
|
||||
const defaultFromAddress = "..."; // Some ethereum address with test funds
|
||||
const profilerSubprovider = new ProfilerSubprovider(artifactAdapter, defaultFromAddress);
|
||||
|
||||
const providerEngine = new ProviderEngine();
|
||||
providerEngine.addProvider(profilerSubprovider);
|
||||
providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'}));
|
||||
providerEngine.start();`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
</ContentBlock>
|
||||
</Content>
|
||||
<CallToAction />
|
||||
</Base>
|
||||
);
|
||||
|
||||
const root = document.getElementById('app');
|
||||
|
||||
if (root.hasChildNodes()) {
|
||||
hydrate(<Profiler />, root);
|
||||
} else {
|
||||
render(<Profiler />, root);
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
import * as React from 'react';
|
||||
import { hydrate, render } from 'react-dom';
|
||||
import * as Loadable from 'react-loadable';
|
||||
|
||||
import { context } from 'ts/context/trace';
|
||||
|
||||
import { Base } from 'ts/components/base';
|
||||
import { Breakout } from 'ts/components/breakout';
|
||||
import { CallToAction } from 'ts/components/call_to_action';
|
||||
import { Code } from 'ts/components/code';
|
||||
import { Content } from 'ts/components/content';
|
||||
import { ContentBlock } from 'ts/components/content-block';
|
||||
import { Hero } from 'ts/components/hero';
|
||||
import { InlineCode } from 'ts/components/inline-code';
|
||||
import { List, ListItem } from 'ts/components/list';
|
||||
import { TabBlock, Tabs } from 'ts/components/tabs';
|
||||
import { Trace as TraceComponent } from 'ts/components/trace';
|
||||
|
||||
const Animation = Loadable({
|
||||
loader: () => System.import(/* webpackChunkName: 'trace-animation' */ 'ts/components/animations/trace'),
|
||||
loading: () => <div />,
|
||||
delay: 1000,
|
||||
render(loadable: { TraceAnimation: any }): React.ReactNode {
|
||||
const Component = loadable.TraceAnimation;
|
||||
return <Component />;
|
||||
},
|
||||
});
|
||||
|
||||
const Trace: React.StatelessComponent<{}> = () => (
|
||||
<Base context={context}>
|
||||
<Hero>
|
||||
<Animation />
|
||||
</Hero>
|
||||
<TraceComponent />
|
||||
<Content>
|
||||
<ContentBlock main={true} title="Get started" />
|
||||
<ContentBlock title="Prerequisites">
|
||||
<List>
|
||||
<ListItem>
|
||||
Use{' '}
|
||||
<a href="https://github.com/trufflesuite/ganache-cli" target="_blank">
|
||||
Ganache
|
||||
</a>{' '}
|
||||
as a backing node.
|
||||
</ListItem>
|
||||
<ListItem>
|
||||
Understand and use{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
web3-provider-engine
|
||||
</a>
|
||||
.
|
||||
</ListItem>
|
||||
</List>
|
||||
</ContentBlock>
|
||||
<ContentBlock title="Installation">
|
||||
<Breakout>
|
||||
<Code canCopy={true}>npm install @0x/sol-trace --save</Code>
|
||||
</Breakout>
|
||||
|
||||
<p>
|
||||
Sol-trace is a subprovider that needs to be prepended to your{' '}
|
||||
<a href="https://github.com/MetaMask/provider-engine" target="_blank">
|
||||
provider engine
|
||||
</a>
|
||||
. Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-trace ships
|
||||
with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
|
||||
<a href="https://sol-compiler.com" target="_blank">
|
||||
Sol-compiler
|
||||
</a>{' '}
|
||||
and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
|
||||
<a href="https://truffleframework.com/truffle" target="_blank">
|
||||
Truffle framework
|
||||
</a>{' '}
|
||||
(Also see our{' '}
|
||||
<a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
|
||||
Truffle example project
|
||||
</a>{' '}
|
||||
for a complete walk-through). You can also write your own and support any artifact format.
|
||||
</p>
|
||||
|
||||
<Tabs>
|
||||
<TabBlock title="Sol-compiler">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { SolCompilerArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
// Both artifactsDir and contractsDir are optional and will be fetched from compiler.json if not passed in
|
||||
const artifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Truffle">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { TruffleArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
const projectRoot = '.';
|
||||
const solcVersion = '0.5.0';
|
||||
const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
<TabBlock title="Custom">
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { AbstractArtifactAdapter } from '@0x/sol-trace';
|
||||
|
||||
class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
|
||||
const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
|
||||
</Code>
|
||||
</TabBlock>
|
||||
</Tabs>
|
||||
<p>
|
||||
Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
|
||||
<InlineCode>revertTraceSubprovider</InlineCode> and append it to our provider engine.
|
||||
</p>
|
||||
|
||||
<Breakout>
|
||||
<Code language="javascript" canCopy={true}>
|
||||
{`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
|
||||
import { RevertTraceSubprovider } from '@0x/sol-trace';
|
||||
|
||||
const defaultFromAddress = "..."; // Some ethereum address with test funds
|
||||
const revertTraceSubprovider = new RevertTraceSubprovider(artifactAdapter, defaultFromAddress);
|
||||
|
||||
const providerEngine = new ProviderEngine();
|
||||
providerEngine.addProvider(revertTraceSubprovider);
|
||||
providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'}));
|
||||
providerEngine.start();`}
|
||||
</Code>
|
||||
</Breakout>
|
||||
<p>Stack traces will now be printed whenever your contracts revert!</p>
|
||||
</ContentBlock>
|
||||
</Content>
|
||||
<CallToAction />
|
||||
</Base>
|
||||
);
|
||||
|
||||
const root = document.getElementById('app');
|
||||
|
||||
if (root.hasChildNodes()) {
|
||||
hydrate(<Trace />, root);
|
||||
} else {
|
||||
render(<Trace />, root);
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import { css } from 'styled-components';
|
||||
|
||||
const colors = {
|
||||
black: '#000000',
|
||||
white: '#FFFFFF',
|
||||
lightGray: '#F1F4F5',
|
||||
gray: '#F1F2F7',
|
||||
darkGray: '#E9ECED',
|
||||
darkestGray: '#E2E5E6',
|
||||
blueGray: '#ECEFF9',
|
||||
};
|
||||
|
||||
interface SizesInterface {
|
||||
[key: string]: number;
|
||||
}
|
||||
|
||||
const sizes: SizesInterface = {
|
||||
xlarge: 1420,
|
||||
large: 1000,
|
||||
medium: 900,
|
||||
small: 650,
|
||||
};
|
||||
|
||||
const media = Object.keys(sizes).reduce((acc: any, label: string) => {
|
||||
acc[label] = (args: any) => css`
|
||||
@media (max-width: ${sizes[label] / 16}em) {
|
||||
${css(args)};
|
||||
}
|
||||
`;
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
export { colors, media };
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig",
|
||||
"compilerOptions": {
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"outDir": "./transpiled/",
|
||||
"jsx": "react",
|
||||
"baseUrl": "./",
|
||||
"allowJs": true,
|
||||
"strictNullChecks": false,
|
||||
"noImplicitThis": false,
|
||||
// tsconfig.json at the monorepo root contains some options required for
|
||||
// project references which do not work for website. We override those
|
||||
// options here.
|
||||
"declaration": false,
|
||||
"declarationMap": false,
|
||||
"composite": false,
|
||||
"paths": {
|
||||
"*": ["node_modules/@types/*", "*"]
|
||||
}
|
||||
},
|
||||
"include": ["./ts/**/*"]
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extends": ["@0x/tslint-config"],
|
||||
"rules": {
|
||||
"no-implicit-dependencies": false,
|
||||
"no-object-literal-type-assertion": false,
|
||||
"completed-docs": false,
|
||||
"prefer-function-over-method": false,
|
||||
"custom-no-magic-numbers": false
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const TerserPlugin = require('terser-webpack-plugin');
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||||
const CleanWebpackPlugin = require('clean-webpack-plugin');
|
||||
|
||||
const pages = require('./pages');
|
||||
|
||||
const config = {
|
||||
entry: {
|
||||
compiler: './ts/pages/compiler.tsx',
|
||||
coverage: './ts/pages/coverage.tsx',
|
||||
profiler: './ts/pages/profiler.tsx',
|
||||
trace: './ts/pages/trace.tsx',
|
||||
},
|
||||
output: {
|
||||
path: path.join(__dirname, '/public'),
|
||||
filename: 'bundle-[name].js',
|
||||
chunkFilename: 'bundle-[name].js',
|
||||
publicPath: '/',
|
||||
},
|
||||
devtool: 'source-map',
|
||||
resolve: {
|
||||
modules: [path.join(__dirname, '/ts'), 'node_modules'],
|
||||
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
|
||||
alias: {
|
||||
ts: path.join(__dirname, '/ts'),
|
||||
less: path.join(__dirname, '/less'),
|
||||
},
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
loader: 'source-map-loader',
|
||||
exclude: [
|
||||
// instead of /\/node_modules\//
|
||||
path.join(process.cwd(), 'node_modules'),
|
||||
path.join(process.cwd(), '../..', 'node_modules'),
|
||||
],
|
||||
},
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
loader: 'awesome-typescript-loader',
|
||||
},
|
||||
{
|
||||
test: /\.md$/,
|
||||
use: 'raw-loader',
|
||||
},
|
||||
{
|
||||
test: /\.less$/,
|
||||
loader: 'style-loader!css-loader!less-loader',
|
||||
exclude: /node_modules/,
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
loaders: ['style-loader', 'css-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.svg$/,
|
||||
loaders: ['react-svg-loader'],
|
||||
},
|
||||
],
|
||||
},
|
||||
optimization: {
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
sourceMap: true,
|
||||
}),
|
||||
],
|
||||
},
|
||||
devServer: {
|
||||
port: 3572,
|
||||
disableHostCheck: true,
|
||||
overlay: true,
|
||||
historyApiFallback: true,
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = (_env, argv) => {
|
||||
let plugins = [
|
||||
new CleanWebpackPlugin('public'),
|
||||
...pages.map(p => {
|
||||
p.environment = argv.mode;
|
||||
return new HtmlWebpackPlugin(p);
|
||||
}),
|
||||
new CopyWebpackPlugin([
|
||||
{ from: 'assets/crawl.html', to: 'index.html' },
|
||||
{ from: 'assets/fonts', to: 'fonts' },
|
||||
{ from: 'assets/images', to: 'images' },
|
||||
]),
|
||||
];
|
||||
if (argv.mode === 'development') {
|
||||
config.mode = 'development';
|
||||
} else {
|
||||
config.mode = 'production';
|
||||
config.output.filename = 'bundle-[name].[chunkhash].js';
|
||||
config.output.chunkFilename = 'bundle-[name].[chunkhash].js';
|
||||
|
||||
plugins = plugins.concat([
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': {
|
||||
NODE_ENV: JSON.stringify(process.env.NODE_ENV || config.mode),
|
||||
},
|
||||
}),
|
||||
// commented out to check the bundle when needed
|
||||
//new BundleAnalyzerPlugin(),
|
||||
]);
|
||||
}
|
||||
console.log('i 「atl」: Mode: ', config.mode);
|
||||
|
||||
config.plugins = plugins;
|
||||
console.log('i 「atl」: Plugin Count: ', config.plugins.length);
|
||||
|
||||
return config;
|
||||
};
|
||||
278
yarn.lock
@@ -758,7 +758,6 @@
|
||||
"@0x/json-schemas@^3.0.1", "@0x/json-schemas@^3.0.11", "@0x/json-schemas@^3.0.2", "@0x/json-schemas@^3.0.3", "@0x/json-schemas@^3.1.11":
|
||||
version "3.1.13"
|
||||
resolved "https://registry.yarnpkg.com/@0x/json-schemas/-/json-schemas-3.1.13.tgz#4b9010f1bdeaf2aef1daba1753aa2e5ecf57f654"
|
||||
integrity sha512-V93sF6seHDHFCSLZOOEhgY5k+w+78tLmxJRhj8XvsW4+EnXcgpshxK38P6SQAmBoNLDutmM8Wk1inf6ghiW0qA==
|
||||
dependencies:
|
||||
"@0x/typescript-typings" "^4.2.4"
|
||||
"@types/node" "*"
|
||||
@@ -819,7 +818,6 @@
|
||||
"@0x/ts-doc-gen@^0.0.17":
|
||||
version "0.0.17"
|
||||
resolved "https://registry.yarnpkg.com/@0x/ts-doc-gen/-/ts-doc-gen-0.0.17.tgz#2c3c8e96aad4476e3a13608d3f1b516b87e17665"
|
||||
integrity sha512-0+ErnVixm804BkYHt7sYe10rc8w9Nf4qO2Ecp9ljzNliEVgwMV7zBSOFFk1CUSbTPYXqDSLuP79y7CxlWXmxdA==
|
||||
dependencies:
|
||||
"@0x/typescript-typings" "^4.2.2"
|
||||
"@0x/utils" "^4.3.3"
|
||||
@@ -1808,14 +1806,6 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/highlight.js@^9.12.3":
|
||||
version "9.12.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.3.tgz#b672cfaac25cbbc634a0fd92c515f66faa18dbca"
|
||||
|
||||
"@types/history@*":
|
||||
version "4.6.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0"
|
||||
|
||||
"@types/is-mobile@0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/is-mobile/-/is-mobile-0.3.0.tgz#821825eeddb9016c41dd11c0dd6d2db8621432fc"
|
||||
@@ -1963,13 +1953,6 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-dom@^16.0.7":
|
||||
version "16.0.7"
|
||||
resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba"
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-helmet@^5.0.6":
|
||||
version "5.0.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-5.0.6.tgz#49607cbb72e1bb7dcefa9174cb591434d3b6f0af"
|
||||
@@ -1989,12 +1972,6 @@
|
||||
"@types/react" "*"
|
||||
"@types/webpack" "*"
|
||||
|
||||
"@types/react-lottie@^1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-lottie/-/react-lottie-1.2.0.tgz#87eccca2580a18c95a3fbb9f421c85debafb95e4"
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-redux@^4.4.37":
|
||||
version "4.4.47"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-4.4.47.tgz#12af1677116e08d413fe2620d0a85560c8a0536e"
|
||||
@@ -2009,21 +1986,6 @@
|
||||
"@types/react" "*"
|
||||
redux "^4.0.0"
|
||||
|
||||
"@types/react-router-dom@^4.0.4":
|
||||
version "4.2.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.6.tgz#9f7eb3c0e6661a9607d878ff8675cc4ea95cd276"
|
||||
dependencies:
|
||||
"@types/history" "*"
|
||||
"@types/react" "*"
|
||||
"@types/react-router" "*"
|
||||
|
||||
"@types/react-router@*":
|
||||
version "4.0.23"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.23.tgz#d0509dcbdb1c686aed8f3d5cb186f42e5fbe7c2a"
|
||||
dependencies:
|
||||
"@types/history" "*"
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-scroll@1.5.3":
|
||||
version "1.5.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-scroll/-/react-scroll-1.5.3.tgz#cc4e94db3d7d5b1cd244bfee24091c335d3e2598"
|
||||
@@ -2036,12 +1998,6 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-tabs@^2.3.0":
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-tabs/-/react-tabs-2.3.0.tgz#6afdf6e85c3a68ffe33824c65fee641982ef2b48"
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-tap-event-plugin@0.0.30":
|
||||
version "0.0.30"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-tap-event-plugin/-/react-tap-event-plugin-0.0.30.tgz#123f35080412f489b6770c5a65c159ff96654cb5"
|
||||
@@ -2059,13 +2015,6 @@
|
||||
"@types/prop-types" "*"
|
||||
csstype "^2.2.0"
|
||||
|
||||
"@types/react@^16.4.2":
|
||||
version "16.4.11"
|
||||
resolved "https://registry.npmjs.org/@types/react/-/react-16.4.11.tgz#330f3d864300f71150dc2d125e48644c098f8770"
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
csstype "^2.2.0"
|
||||
|
||||
"@types/react@^16.7.7":
|
||||
version "16.7.18"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.18.tgz#f4ce0d539a893dd61e36cd11ae3a5e54f5a48337"
|
||||
@@ -3676,7 +3625,6 @@ bach@^1.0.0:
|
||||
backbone@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12"
|
||||
integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==
|
||||
dependencies:
|
||||
underscore ">=1.8.3"
|
||||
|
||||
@@ -4463,7 +4411,7 @@ callsites@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
|
||||
|
||||
camel-case@3.0.x, camel-case@^3.0.0:
|
||||
camel-case@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
|
||||
dependencies:
|
||||
@@ -4800,18 +4748,6 @@ classnames@^2.2.5:
|
||||
version "2.2.5"
|
||||
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
|
||||
|
||||
clean-css@4.2.x:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
|
||||
dependencies:
|
||||
source-map "~0.6.0"
|
||||
|
||||
clean-webpack-plugin@^0.1.19:
|
||||
version "0.1.19"
|
||||
resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz#ceda8bb96b00fe168e9b080272960d20fdcadd6d"
|
||||
dependencies:
|
||||
rimraf "^2.6.1"
|
||||
|
||||
cli-boxes@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
|
||||
@@ -5066,10 +5002,6 @@ command-exists@^1.2.8:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
|
||||
|
||||
commander@2.17.x, commander@^2.7.1, commander@~2.17.1:
|
||||
version "2.17.1"
|
||||
resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
||||
|
||||
commander@2.18.0:
|
||||
version "2.18.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
|
||||
@@ -5082,6 +5014,10 @@ commander@^2.15.1, commander@^2.18.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||
|
||||
commander@^2.7.1, commander@~2.17.1:
|
||||
version "2.17.1"
|
||||
resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
||||
|
||||
commander@~2.13.0:
|
||||
version "2.13.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
|
||||
@@ -5426,19 +5362,6 @@ copy-to-clipboard@^3, copy-to-clipboard@^3.0.8:
|
||||
dependencies:
|
||||
toggle-selection "^1.0.3"
|
||||
|
||||
copy-webpack-plugin@^4.5.4:
|
||||
version "4.5.4"
|
||||
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27"
|
||||
dependencies:
|
||||
cacache "^10.0.4"
|
||||
find-cache-dir "^1.0.0"
|
||||
globby "^7.1.1"
|
||||
is-glob "^4.0.0"
|
||||
loader-utils "^1.1.0"
|
||||
minimatch "^3.0.4"
|
||||
p-limit "^1.0.0"
|
||||
serialize-javascript "^1.4.0"
|
||||
|
||||
copyfiles@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.0.0.tgz#bbd78bb78e8fd6db5c67adf54249317b24560f2a"
|
||||
@@ -5669,7 +5592,7 @@ css-mediaquery@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0"
|
||||
|
||||
css-select@^1.1.0, css-select@~1.2.0:
|
||||
css-select@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
|
||||
dependencies:
|
||||
@@ -6282,12 +6205,6 @@ dom-align@^1.7.0:
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654"
|
||||
|
||||
dom-converter@~0.2:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
|
||||
dependencies:
|
||||
utila "~0.4"
|
||||
|
||||
dom-helpers@^3.2.0:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
|
||||
@@ -6327,12 +6244,6 @@ domexception@^1.0.1:
|
||||
dependencies:
|
||||
webidl-conversions "^4.0.2"
|
||||
|
||||
domhandler@2.1:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
|
||||
dependencies:
|
||||
domelementtype "1"
|
||||
|
||||
domhandler@^2.3.0:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
|
||||
@@ -6349,12 +6260,6 @@ dompurify@^1.0.6:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.npmjs.org/dompurify/-/dompurify-1.0.7.tgz#33e5c4a5fc84df93b58ca162d1d3f28537aa3ec2"
|
||||
|
||||
domutils@1.1:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
|
||||
dependencies:
|
||||
domelementtype "1"
|
||||
|
||||
domutils@1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
|
||||
@@ -8737,17 +8642,6 @@ globby@^6.1.0:
|
||||
pify "^2.0.0"
|
||||
pinkie-promise "^2.0.0"
|
||||
|
||||
globby@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
|
||||
dependencies:
|
||||
array-union "^1.0.1"
|
||||
dir-glob "^2.0.0"
|
||||
glob "^7.1.2"
|
||||
ignore "^3.3.5"
|
||||
pify "^3.0.0"
|
||||
slash "^1.0.0"
|
||||
|
||||
globby@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
|
||||
@@ -8839,7 +8733,6 @@ got@^6.7.1:
|
||||
graceful-fs@^3.0.0:
|
||||
version "3.0.11"
|
||||
resolved "http://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
|
||||
integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=
|
||||
dependencies:
|
||||
natives "^1.1.0"
|
||||
|
||||
@@ -8850,12 +8743,10 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.1
|
||||
graceful-fs@^4.2.0:
|
||||
version "4.2.1"
|
||||
resolved "http://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d"
|
||||
integrity sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==
|
||||
|
||||
graceful-fs@~1.2.0:
|
||||
version "1.2.3"
|
||||
resolved "http://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
|
||||
integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=
|
||||
|
||||
"graceful-readlink@>= 1.0.0":
|
||||
version "1.0.1"
|
||||
@@ -9152,10 +9043,6 @@ hdkey@^1.1.0:
|
||||
safe-buffer "^5.1.1"
|
||||
secp256k1 "^3.0.1"
|
||||
|
||||
he@1.1.x:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||
|
||||
he@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||
@@ -9175,14 +9062,9 @@ highlight.js@^9.11.0, highlight.js@~9.12.0:
|
||||
version "9.12.0"
|
||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
||||
|
||||
highlight.js@^9.13.1:
|
||||
version "9.13.1"
|
||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
|
||||
|
||||
highlight.js@^9.15.8, highlight.js@^9.6.0:
|
||||
version "9.15.9"
|
||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.9.tgz#865257da1dbb4a58c4552d46c4b3854f77f0e6d5"
|
||||
integrity sha512-M0zZvfLr5p0keDMCAhNBp03XJbKBxUx5AfyfufMdFMEP4N/Xj6dh0IqC75ys7BAzceR34NgcvXjupRVaHBPPVQ==
|
||||
|
||||
highlightjs-solidity@^1.0.5:
|
||||
version "1.0.6"
|
||||
@@ -9276,18 +9158,6 @@ html-entities@^1.2.0:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
|
||||
|
||||
html-minifier@^3.2.3:
|
||||
version "3.5.20"
|
||||
resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14"
|
||||
dependencies:
|
||||
camel-case "3.0.x"
|
||||
clean-css "4.2.x"
|
||||
commander "2.17.x"
|
||||
he "1.1.x"
|
||||
param-case "2.1.x"
|
||||
relateurl "0.2.x"
|
||||
uglify-js "3.4.x"
|
||||
|
||||
html-to-react@^1.3.4:
|
||||
version "1.3.4"
|
||||
resolved "https://registry.npmjs.org/html-to-react/-/html-to-react-1.3.4.tgz#647b3a54fdec73a6461864b129fb0d1eec7d4589"
|
||||
@@ -9298,18 +9168,6 @@ html-to-react@^1.3.4:
|
||||
lodash.camelcase "^4.3.0"
|
||||
ramda "^0.26"
|
||||
|
||||
html-webpack-plugin@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
|
||||
dependencies:
|
||||
html-minifier "^3.2.3"
|
||||
loader-utils "^0.2.16"
|
||||
lodash "^4.17.3"
|
||||
pretty-error "^2.0.2"
|
||||
tapable "^1.0.0"
|
||||
toposort "^1.0.0"
|
||||
util.promisify "1.0.0"
|
||||
|
||||
htmlparser2@^3.10.0:
|
||||
version "3.10.0"
|
||||
resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
|
||||
@@ -9332,15 +9190,6 @@ htmlparser2@^3.9.1:
|
||||
inherits "^2.0.1"
|
||||
readable-stream "^2.0.2"
|
||||
|
||||
htmlparser2@~3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
|
||||
dependencies:
|
||||
domelementtype "1"
|
||||
domhandler "2.1"
|
||||
domutils "1.1"
|
||||
readable-stream "1.0"
|
||||
|
||||
http-cache-semantics@^3.8.1:
|
||||
version "3.8.1"
|
||||
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
|
||||
@@ -10654,7 +10503,6 @@ jmespath@0.15.0:
|
||||
jquery@^3.4.1:
|
||||
version "3.4.1"
|
||||
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
|
||||
integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
|
||||
|
||||
js-base64@^2.1.8:
|
||||
version "2.5.1"
|
||||
@@ -11339,15 +11187,6 @@ loader-utils@1.1.0, loader-utils@^1.1.0:
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^0.5.0"
|
||||
|
||||
loader-utils@^0.2.16, loader-utils@~0.2.2:
|
||||
version "0.2.17"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
|
||||
dependencies:
|
||||
big.js "^3.1.3"
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^0.5.0"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
loader-utils@^1.0.1, loader-utils@^1.0.2:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
|
||||
@@ -11356,6 +11195,15 @@ loader-utils@^1.0.1, loader-utils@^1.0.2:
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^1.0.1"
|
||||
|
||||
loader-utils@~0.2.2:
|
||||
version "0.2.17"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
|
||||
dependencies:
|
||||
big.js "^3.1.3"
|
||||
emojis-list "^2.0.0"
|
||||
json5 "^0.5.0"
|
||||
object-assign "^4.0.1"
|
||||
|
||||
locate-path@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
|
||||
@@ -11622,7 +11470,7 @@ lodash@=4.17.4:
|
||||
version "4.17.4"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
||||
|
||||
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10:
|
||||
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
|
||||
@@ -11688,10 +11536,6 @@ loose-envify@^1.4.0:
|
||||
dependencies:
|
||||
js-tokens "^3.0.0 || ^4.0.0"
|
||||
|
||||
lottie-web@^5.1.3:
|
||||
version "5.4.1"
|
||||
resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.4.1.tgz#98465741d4907293656cab31e395d79d0546ef26"
|
||||
|
||||
loud-rejection@^1.0.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
|
||||
@@ -11769,7 +11613,6 @@ lunr@^2.3.0:
|
||||
lunr@^2.3.6:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5"
|
||||
integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q==
|
||||
|
||||
macaddress@^0.2.8:
|
||||
version "0.2.8"
|
||||
@@ -11891,7 +11734,6 @@ marked@0.3.18:
|
||||
marked@^0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
|
||||
integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
|
||||
|
||||
matchdep@^2.0.0:
|
||||
version "2.0.0"
|
||||
@@ -12503,7 +12345,6 @@ nanomatch@^1.2.9:
|
||||
natives@^1.1.0:
|
||||
version "1.1.6"
|
||||
resolved "http://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
|
||||
integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==
|
||||
|
||||
natural-compare@^1.4.0:
|
||||
version "1.4.0"
|
||||
@@ -13472,12 +13313,6 @@ p-is-promise@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
|
||||
|
||||
p-limit@^1.0.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
|
||||
dependencies:
|
||||
p-try "^1.0.0"
|
||||
|
||||
p-limit@^1.1.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
|
||||
@@ -13603,7 +13438,7 @@ parallel-transform@^1.1.0:
|
||||
inherits "^2.0.3"
|
||||
readable-stream "^2.1.5"
|
||||
|
||||
param-case@2.1.x, param-case@^2.1.0:
|
||||
param-case@^2.1.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
|
||||
dependencies:
|
||||
@@ -14267,13 +14102,6 @@ pretty-bytes@^1.0.4:
|
||||
get-stdin "^4.0.1"
|
||||
meow "^3.1.0"
|
||||
|
||||
pretty-error@^2.0.2:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
|
||||
dependencies:
|
||||
renderkid "^2.0.1"
|
||||
utila "~0.4"
|
||||
|
||||
pretty-format@^23.6.0:
|
||||
version "23.6.0"
|
||||
resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
|
||||
@@ -14328,7 +14156,6 @@ progress@^2.0.0:
|
||||
progress@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
||||
promise-inflight@^1.0.1:
|
||||
version "1.0.1"
|
||||
@@ -14361,7 +14188,6 @@ promisify-child-process@^1.0.5:
|
||||
promisify-child-process@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/promisify-child-process/-/promisify-child-process-3.1.1.tgz#3a029c1d97bdb8bbcc8862c765b91f1cee0f2691"
|
||||
integrity sha512-683UHZEP4Bm75BvBujEe87AdE9lxnoWpcU5pEw4FG9HCSwwZC9pF7HUj3QmlDAvhyvulkWHLZs1lVRBNTvkbXQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.1.5"
|
||||
|
||||
@@ -14961,13 +14787,6 @@ react-loadable@^5.5.0:
|
||||
dependencies:
|
||||
prop-types "^15.5.0"
|
||||
|
||||
react-lottie@^1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/react-lottie/-/react-lottie-1.2.3.tgz#8544b96939e088658072eea5e12d912cdaa3acc1"
|
||||
dependencies:
|
||||
babel-runtime "^6.26.0"
|
||||
lottie-web "^5.1.3"
|
||||
|
||||
react-markdown@^4.0.6:
|
||||
version "4.0.6"
|
||||
resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-4.0.6.tgz#927d44421735cd90b7634bb221e9d7d8656e01e9"
|
||||
@@ -15102,13 +14921,6 @@ react-tabs@^2.0.0:
|
||||
classnames "^2.2.0"
|
||||
prop-types "^15.5.0"
|
||||
|
||||
react-tabs@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-2.3.0.tgz#0c37e786f288d369824acd06a96bd1818ab8b0dc"
|
||||
dependencies:
|
||||
classnames "^2.2.0"
|
||||
prop-types "^15.5.0"
|
||||
|
||||
react-test-renderer@^16.0.0-0:
|
||||
version "16.5.2"
|
||||
resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.5.2.tgz#92e9d2c6f763b9821b2e0b22f994ee675068b5ae"
|
||||
@@ -15258,15 +15070,6 @@ read@1, read@1.0.x, read@~1.0.1, read@~1.0.5:
|
||||
string_decoder "~1.1.1"
|
||||
util-deprecate "~1.0.1"
|
||||
|
||||
readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.15, readable-stream@~1.0.26, readable-stream@~1.0.31:
|
||||
version "1.0.34"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
||||
dependencies:
|
||||
core-util-is "~1.0.0"
|
||||
inherits "~2.0.1"
|
||||
isarray "0.0.1"
|
||||
string_decoder "~0.10.x"
|
||||
|
||||
"readable-stream@2 || 3", readable-stream@^3.0.2:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
|
||||
@@ -15275,6 +15078,15 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.15, readable-stream@~1.0.26, readable-stream@~1.0.31:
|
||||
version "1.0.34"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
|
||||
dependencies:
|
||||
core-util-is "~1.0.0"
|
||||
inherits "~2.0.1"
|
||||
isarray "0.0.1"
|
||||
string_decoder "~0.10.x"
|
||||
|
||||
readable-stream@^1.0.33, readable-stream@~1.1.9:
|
||||
version "1.1.14"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
|
||||
@@ -15522,10 +15334,6 @@ regjsparser@^0.1.4:
|
||||
dependencies:
|
||||
jsesc "~0.5.0"
|
||||
|
||||
relateurl@0.2.x:
|
||||
version "0.2.7"
|
||||
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
|
||||
|
||||
remark-parse@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
|
||||
@@ -15565,16 +15373,6 @@ remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
|
||||
|
||||
renderkid@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa"
|
||||
dependencies:
|
||||
css-select "^1.1.0"
|
||||
dom-converter "~0.2"
|
||||
htmlparser2 "~3.3.0"
|
||||
strip-ansi "^3.0.0"
|
||||
utila "^0.4.0"
|
||||
|
||||
repeat-element@^1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
|
||||
@@ -16409,7 +16207,6 @@ shelljs@^0.7.3:
|
||||
shelljs@^0.8.3:
|
||||
version "0.8.3"
|
||||
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097"
|
||||
integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==
|
||||
dependencies:
|
||||
glob "^7.0.0"
|
||||
interpret "^1.0.0"
|
||||
@@ -16732,7 +16529,7 @@ source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
|
||||
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
|
||||
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
|
||||
@@ -17166,10 +16963,6 @@ styled-components@^4.1.1:
|
||||
stylis-rule-sheet "^0.0.10"
|
||||
supports-color "^5.5.0"
|
||||
|
||||
styled-normalize@^8.0.1:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/styled-normalize/-/styled-normalize-8.0.1.tgz#f1c390de61075cdcc45ae38a1c8c381c5667a0af"
|
||||
|
||||
stylis-rule-sheet@^0.0.10:
|
||||
version "0.0.10"
|
||||
resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
|
||||
@@ -17699,10 +17492,6 @@ toidentifier@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
|
||||
|
||||
toposort@^1.0.0:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
|
||||
|
||||
toposort@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
|
||||
@@ -17961,7 +17750,6 @@ typedarray@^0.0.6:
|
||||
typedoc-default-themes@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.6.0.tgz#7e73bf54dd9e11550dd0fb576d5176b758f8f8b5"
|
||||
integrity sha512-MdTROOojxod78CEv22rIA69o7crMPLnVZPefuDLt/WepXqJwgiSu8Xxq+H36x0Jj3YGc7lOglI2vPJ2GhoOybw==
|
||||
dependencies:
|
||||
backbone "^1.4.0"
|
||||
jquery "^3.4.1"
|
||||
@@ -17971,12 +17759,10 @@ typedoc-default-themes@^0.6.0:
|
||||
typedoc-plugin-markdown@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-2.1.0.tgz#17b7b97415b97214985d1a61ef7b9a4dce3e8305"
|
||||
integrity sha512-f7CgreapeUIpm85BnC4ec9PZp10INOpLpItSCV4YFlZS4VaBA/a1D2nYv9+7TVJugc084XlSFUY+OX9fwGAUpA==
|
||||
|
||||
typedoc@^0.15.0:
|
||||
version "0.15.0"
|
||||
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.15.0.tgz#21eaf4db41cf2797bad027a74f2a75cd08ae0c2d"
|
||||
integrity sha512-NOtfq5Tis4EFt+J2ozhVq9RCeUnfEYMFKoU6nCXCXUULJz1UQynOM+yH3TkfZCPLzigbqB0tQYGVlktUWweKlw==
|
||||
dependencies:
|
||||
"@types/minimatch" "3.0.3"
|
||||
fs-extra "^8.1.0"
|
||||
@@ -18029,7 +17815,6 @@ typescript@3.0.1:
|
||||
typescript@3.5.x:
|
||||
version "3.5.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
|
||||
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
|
||||
|
||||
typewise-core@^1.2, typewise-core@^1.2.0:
|
||||
version "1.2.0"
|
||||
@@ -18064,7 +17849,7 @@ uglify-es@^3.3.4:
|
||||
commander "~2.13.0"
|
||||
source-map "~0.6.1"
|
||||
|
||||
uglify-js@3.4.x, uglify-js@^3.0.0:
|
||||
uglify-js@^3.0.0:
|
||||
version "3.4.9"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
|
||||
dependencies:
|
||||
@@ -18140,7 +17925,6 @@ underscore@1.8.3:
|
||||
underscore@>=1.8.3, underscore@^1.9.1:
|
||||
version "1.9.1"
|
||||
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
|
||||
integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
|
||||
|
||||
underscore@~1.4.4:
|
||||
version "1.4.4"
|
||||
@@ -18427,7 +18211,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
|
||||
util.promisify@1.0.0, util.promisify@^1.0.0:
|
||||
util.promisify@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
|
||||
dependencies:
|
||||
@@ -18440,10 +18224,6 @@ util@0.10.3, util@^0.10.3:
|
||||
dependencies:
|
||||
inherits "2.0.1"
|
||||
|
||||
utila@^0.4.0, utila@~0.4:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
|
||||
|
||||
utile@0.2.1, utile@0.2.x, utile@~0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7"
|
||||
|
||||