This commit is contained in:
Tommy Parnell
2017-12-25 16:38:21 -05:00
parent b602647511
commit 33943ad773
21 changed files with 349 additions and 78 deletions

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ node_modules
dist
.vscode
npm-debug.log
yarn-error.log

3
dist/index.html vendored
View File

@@ -1,4 +1,3 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
@@ -11,6 +10,6 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.production.min.js"></script>
<!-- Main -->
<script src="./bundle.js"></script>
<script src="/bundle.js"></script>
</body>
</html>

View File

@@ -6,7 +6,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "webpack-dev-server --output-public-path=dist --history-api-fallback",
"build": "webpack"
"build": "webpack --optimize-minimize"
},
"author": "",
"license": "ISC",
@@ -20,6 +20,7 @@
"re-base": "^3.2.1",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-markdown": "^3.1.3",
"react-redux": "^5.0.6",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",

View File

@@ -2,7 +2,7 @@ import * as React from "react";
export class Conditional extends React.Component<{render:boolean}, any>{
render(){
var toRender = this.props.render? this.props.children : null;
let toRender = this.props.render? this.props.children : null;
return <span>{toRender}</span>
}
}

View File

@@ -1,16 +0,0 @@
import * as React from "react";
require('../styles/main.css');
export interface HelloProps { compiler: string; framework: string; }
// 'HelloProps' describes the shape of props.
// State is never set so we use the '{}' type.
export class Hello extends React.Component<HelloProps, {}> {
render() {
return (
<div className="main">
<p>Hello from {this.props.compiler} and {this.props.framework}!</p>
</div>
);
}
}

9
src/components/Home.tsx Normal file
View File

@@ -0,0 +1,9 @@
import { LoginState } from '../models/LoginState';
import * as React from 'react';
export class Home extends React.Component<any,any>{
render(){
return <h4> Hi, welcome to minbin a simple pastebin. Please login to get started!</h4>
}
}

View File

@@ -0,0 +1,15 @@
import { Viewer } from './Viewer';
import { getLanguage } from '../util/doc';
import * as React from 'react';
import {Document} from "../models/Document"
import { Link } from "react-router-dom";
export class ListItem extends React.PureComponent<{doc: Document, uid: string, docId: string}>{
render(){
return <div key={`li_div_${this.props.docId}`}>
<h4>
<Link to={`/d/${this.props.uid}/${this.props.docId}/edit`}>{this.props.doc.Title || 'Untitled'}</Link>
</h4>
<Viewer doc={this.props.doc.Body} language={getLanguage(this.props.doc.Title)} maxHeight={"200px"} />
</div>
}
}

View File

@@ -1,20 +1,30 @@
import * as React from "react";
import { LoginState } from '../models/LoginState';
import * as React from 'react';
import { TabContent, TabPane, Nav, NavItem, NavLink, Card, Button, CardTitle, CardText, Row, Col, NavbarBrand, Navbar } from 'reactstrap';
import { LoginContainer } from '../containers/Login';
import { Link } from 'react-router-dom';
export class NavBar extends React.Component<any, any> {
export class NavBar extends React.Component<{loginState: LoginState}, any> {
constructor(props: any) {
super(props);
}
render() {
let newButton = this.props.loginState.isLoggedIn ? (
<NavItem>
<Link to="/d/new" className="btn btn-sm btn-outline-success" >+ New</Link>
</NavItem>
) : null;
return (
<div>
<Navbar color="faded" light expand="md">
<NavbarBrand href="/">minbin</NavbarBrand>
<Nav navbar className="ml-auto">
{newButton}
<NavItem>
{this.props.children}
<LoginContainer />
</NavItem>
</Nav>
</Navbar>

View File

@@ -1,35 +1,21 @@
/// <reference path="../redux-styles.d.ts" />
/// <reference path="../react-syntax-highlighter.d.ts" />
import * as React from "react";
import { Row, Col, Card, CardText } from "reactstrap";
import SyntaxHighlighter from 'react-syntax-highlighter';
import googlecode from "react-syntax-highlighter/styles/hljs/googlecode";
let exampleText = `
void Main()
{
let next5Friday13 = DateTime.Today
.Recurse(a=>a.AddDays(1))
.Where(a=>a.Day == 13 && a.DayOfWeek == DayOfWeek.Friday).Take(5);
}
public static class Extension
{
public static IEnumerable<T> Recurse<T>(this T obj, Func<T,T> action)
{
let local = obj;
while(true)
{
local = action(local);
yield return local;
}
}
}
`
export interface ViewerProps {doc?: string, language?: string}
export interface ViewerProps {doc?: string, language?: string, maxHeight?: string}
export class Viewer extends React.Component<ViewerProps, any>{
render(){
let style : React.CSSProperties = { paddingTop: "10px" };
if(this.props.maxHeight){
style.maxHeight = this.props.maxHeight
}
return(
<Card style={{ paddingTop: "10px" }}>
<SyntaxHighlighter showLineNumbers={true} language={this.props.language || 'cs'} style={googlecode} >{this.props.doc || ''}</SyntaxHighlighter>
</Card>);
<Card style={style}>
<SyntaxHighlighter showLineNumbers={true} language={this.props.language || null} style={googlecode} >{this.props.doc || ''}</SyntaxHighlighter>
</Card>
);
}
}

View File

@@ -1,3 +1,4 @@
import { HomeContainer } from './HomeContainer';
import { LoginState } from '../models/LoginState';
import { Edit } from './Edit';
import { LoginContainer } from './Login';
@@ -18,15 +19,13 @@ const mapStateToProps = (state : AppState) : AppState =>
class appContainer extends React.Component<AppState, any>{
render(){
return <BrowserRouter><div className="app container-fluid">
<NavBar>
<LoginContainer/>
</NavBar>
<NavBar loginState={this.props.login} />
<Switch>
<Route path="/d/new" render={()=>{
return <Redirect to={`/d/${this.props.login.uid}/${generateDocId()}`} />
}} />
<Route path="/d/:uid/:docId/:edit" render={(routeProps: RouteComponentProps<{docId?: string, uid?: string, login: LoginState, edit: string}>)=>{
var showEdit;
let showEdit;
if(routeProps.match.params.edit === "edit"){
showEdit = true;
}
@@ -39,6 +38,9 @@ class appContainer extends React.Component<AppState, any>{
return <Redirect to={`/d/${routeProps.match.params.uid}/${routeProps.match.params.docId}/view`} />
}} />
<Route path="/" strict={true}>
<HomeContainer login={this.props.login} />
</Route>
<Route component={ForOhFour} />
</Switch>
</div></BrowserRouter>

View File

@@ -1,11 +1,11 @@
import { generateDocId } from '../util/doc';
import { generateDocId, getLanguage } from '../util/doc';
import { LoginState } from '../models/LoginState';
import { Editor } from '../components/Editor';
import { Viewer } from '../components/Viewer';
import * as React from 'react';
import fbData from '../startup/firebase'
import {Document} from '../models/Document'
import { TabContent, TabPane, Nav, NavItem, NavLink, Card, Button, CardTitle, CardText, Row, Col, NavbarBrand } from 'reactstrap';
import { TabContent, TabPane, Nav, NavItem, NavLink, Card, Button, CardTitle, CardText, Row, Col, NavbarBrand, FormText, Input } from 'reactstrap';
import { Link } from 'react-router-dom';
import { Conditional } from '../components/Conditional';
import { ChangeEventHandler } from 'react';
@@ -48,9 +48,10 @@ export class Edit extends React.Component<EditProps, EditState> {
}
render() {
var tabNumber = this.props.showEdit ? '2': '1'
var displayEdit = this.props.login.isLoggedIn && this.props.login.uid === this.props.uid;
var displayViewer = tabNumber === '1';
let tabNumber = this.props.showEdit ? '2': '1'
let displayEdit = this.props.login.isLoggedIn && this.props.login.uid === this.props.uid;
let displayViewer = tabNumber === '1';
// : null;
return (
<div>
@@ -79,25 +80,24 @@ export class Edit extends React.Component<EditProps, EditState> {
<Conditional render={displayViewer}>
<br />
<h4>{this.state.document.Title}</h4><br />
<Viewer doc={this.state.document.Body} />
<Viewer doc={this.state.document.Body} language={getLanguage(this.state.document.Title)} />
</Conditional>
</Col >
</Row>
</TabPane>
<TabPane tabId="2">
<Conditional render={displayEdit}>
<Row style={{height: '80vh'}}>
<Row style={{height: '60vh'}}>
<Col sm="12" style={{height: '100%'}}>
<textarea className="form-control" style={{height: "100%"}} value={this.state.document.Body || ""} onChange={(event)=>this.updateDocument(event.target.value)}></textarea>
<div>Permalink: <Input readOnly type="text" value={`https://minbin.co/d/${this.props.login.uid}/${this.props.docId}`} /></div><br />
<textarea className="form-control" style={{height: "40vh"}} value={this.state.document.Body || ""} onChange={(event)=>this.updateDocument(event.target.value)}></textarea>
</Col>
</Row>
<Row style={{height: '20vh'}} >
<Col sm="12">
<form style={{paddingLeft: "10px"}} className={'form-inline'}>
<label htmlFor="title-input">Title: &nbsp;</label>
<input type="text" onChange={(event)=>this.updateTitle(event.target.value)} value={this.state.document.Title} className="form-control" id="title-input" placeholder="Title" />
<input placeholder={"KittensAttack.cpp"} type="text" onChange={(event)=>this.updateTitle(event.target.value)} value={this.state.document.Title} className="form-control" id="title-input" />
</form>
</Col>
</Row>

View File

@@ -0,0 +1,17 @@
import { Home } from '../components/Home';
import { LoginState } from '../models/LoginState';
import * as React from 'react';
import { ListContainer } from './ListContainer';
export class HomeContainer extends React.Component<{login: LoginState},any>{
render(){
let render = this.props.login.isLoggedIn ? <ListContainer login={this.props.login} /> : <Home />
return(
<div>
{render}
</div>
)
}
}

View File

@@ -0,0 +1,50 @@
import { ListItem } from '../components/ListItem';
import { Viewer } from '../components/Viewer';
import { LoginState } from '../models/LoginState';
import * as React from 'react';
import fbData from '../startup/firebase';
import Progress from 'reactstrap/lib/Progress';
import { DocumentPlusKey } from '../models/Document'
import { getLanguage } from '../util/doc';
export class ListContainer extends React.Component<{login: LoginState}, {inProgress: Boolean, docs: Array<DocumentPlusKey>, error : Boolean }>{
inProgress: Boolean = true;
getPastes(){
fbData.rebase.fetch(`/docs/${this.props.login.uid}`,
{
context: this,
asArray: true
})
.then((data: Array<DocumentPlusKey>)=>
{
this.setState({docs: data, inProgress: false});
})
.catch((err: any)=>{
console.error(err);
this.setState({error: true, inProgress: false});
});
}
constructor(login: {login: LoginState}){
super(login)
this.state = {inProgress: true, docs: new Array<DocumentPlusKey>(), error: false}
}
componentDidMount(){
this.getPastes()
}
render(){
if(this.state.inProgress){
return <div><Progress striped={true} animated={true} max={100} value={100} /></div>
}
if(this.state.error){
return <h4>Oh No! An error occured</h4>
}
if(this.state.docs.length < 1){
return <h4>No pastes found <small>Press new in the upper right to make a paste!</small></h4>
}
let elems =this.state.docs.map(doc => {
return <ListItem key={`${doc.key}_li`} docId={doc.key} doc={doc} uid={this.props.login.uid} />
});
return <div>{elems}</div>
}
}

View File

@@ -50,11 +50,11 @@ class loginContainer extends React.Component<ILoginProps,{}>{
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
.then(()=>firebase.auth().signInWithPopup(provider).then(result => {}));
}
//todo I should seperate the UI layer from the login business logic, redux posting
render(){
if(this.props && this.props.loginState && this.props.loginState.isLoggedIn){
return <span> <Link to="/d/new" className="btn btn-outline-success" >+ New</Link> Hi, {this.props.loginState.displayName} <a href="#" onClick={()=>this.logout()}>Log Out</a> </span>;
return <span style={{verticalAlign: 'middle'}}>&nbsp; Hi, {this.props.loginState.displayName} <a href="#" onClick={()=>this.logout()}>Log Out</a> </span>;
}
else{
return <LoginButton onClick={this.login} />;

View File

@@ -1,6 +1,5 @@
import * as React from "react";
import * as ReactDOM from "react-dom";
import { Hello } from "./components/Hello";
import 'bootstrap/dist/css/bootstrap.css';
import { NavBar } from './components/NavBar'
import rebase from './startup/firebase'

View File

@@ -1,4 +1,10 @@
export enum Theme {
}
export interface Document {
Title?: string,
Body?: string
Body?: string,
Theme?: Theme
}
export interface DocumentPlusKey extends Document{key: string}

View File

@@ -1,5 +1,5 @@
.main {
background-color: lightgray;
width: 100%;
height: 100;
height: 100%;
}

View File

@@ -6,3 +6,14 @@ export function generateDocId(){
}
return result;
}
export function getLanguage(title?: string){
let language = null;
if(title){
let split = title.split('.');
if(split.length == 2){
language = split[1];
}
}
return language;
}

View File

@@ -1,8 +1,9 @@
var webpack = require('webpack');
module.exports = {
entry: "./src/index.tsx",
output: {
filename: "bundle.js",
path: __dirname + "./dist",
path: __dirname + "/dist",
},
@@ -12,7 +13,13 @@ module.exports = {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [".ts", ".tsx", ".js", ".json"]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
})
],
module: {
rules: [
// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.

184
yarn.lock
View File

@@ -450,6 +450,10 @@ babel-runtime@^6.18.0:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
bail@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764"
balanced-match@^0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
@@ -749,6 +753,18 @@ chalk@^2.3.0:
escape-string-regexp "^1.0.5"
supports-color "^4.0.0"
character-entities-legacy@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f"
character-entities@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca"
character-reference-invalid@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc"
chokidar@^1.6.0, chokidar@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
@@ -833,6 +849,10 @@ code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
collapse-white-space@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c"
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -1551,7 +1571,7 @@ extend-shallow@^3.0.0:
dependencies:
is-extendable "^1.0.1"
extend@~3.0.0:
extend@^3.0.0, extend@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
@@ -2160,6 +2180,17 @@ is-accessor-descriptor@^0.1.6:
dependencies:
kind-of "^3.0.2"
is-alphabetical@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08"
is-alphanumerical@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b"
dependencies:
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -2170,7 +2201,7 @@ is-binary-path@^1.0.0:
dependencies:
binary-extensions "^1.0.0"
is-buffer@^1.1.5:
is-buffer@^1.1.4, is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@ -2194,6 +2225,10 @@ is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-decimal@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82"
is-descriptor@^0.1.0:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
@@ -2266,6 +2301,10 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
is-hexadecimal@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69"
is-number@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -2300,7 +2339,7 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-plain-obj@^1.0.0:
is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -2346,6 +2385,14 @@ is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
is-whitespace-character@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b"
is-word-character@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb"
is-wsl@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
@@ -2624,6 +2671,10 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
markdown-escapes@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518"
math-expression-evaluator@^1.2.14:
version "1.2.17"
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
@@ -3071,6 +3122,17 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
parse-entities@^1.0.2:
version "1.1.1"
resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
dependencies:
character-entities "^1.0.0"
character-entities-legacy "^1.0.0"
character-reference-invalid "^1.0.0"
is-alphanumerical "^1.0.0"
is-decimal "^1.0.0"
is-hexadecimal "^1.0.0"
parse-glob@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
@@ -3626,6 +3688,16 @@ react-dom@^16.2.0:
object-assign "^4.1.1"
prop-types "^15.6.0"
react-markdown@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.1.3.tgz#5ac1f20cb5a3e8c47b6ae3c8522e813b08f58c34"
dependencies:
prop-types "^15.6.0"
remark-parse "^4.0.0"
unified "^6.1.5"
unist-util-visit "^1.1.3"
xtend "^4.0.1"
react-popper@^0.7.2:
version "0.7.4"
resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.7.4.tgz#8649d539837e7c6f47bc9b24c9cf57a404e199a1"
@@ -3835,6 +3907,26 @@ regjsparser@^0.1.4:
dependencies:
jsesc "~0.5.0"
remark-parse@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b"
dependencies:
collapse-white-space "^1.0.2"
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
is-whitespace-character "^1.0.0"
is-word-character "^1.0.0"
markdown-escapes "^1.0.0"
parse-entities "^1.0.2"
repeat-string "^1.5.4"
state-toggle "^1.0.0"
trim "0.0.1"
trim-trailing-lines "^1.0.0"
unherit "^1.0.4"
unist-util-remove-position "^1.0.0"
vfile-location "^2.0.0"
xtend "^4.0.1"
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -3843,7 +3935,7 @@ repeat-element@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
repeat-string@^1.5.2, repeat-string@^1.6.1:
repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
@@ -3853,6 +3945,10 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
replace-ext@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
request@2.81.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
@@ -4229,6 +4325,10 @@ sshpk@^1.7.0:
jsbn "~0.1.0"
tweetnacl "~0.14.0"
state-toggle@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -4443,10 +4543,18 @@ trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
trim-trailing-lines@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684"
trim@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
trough@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86"
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -4505,6 +4613,25 @@ underscore@^1.8.3:
version "1.8.3"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
unherit@^1.0.4:
version "1.1.0"
resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d"
dependencies:
inherits "^2.0.1"
xtend "^4.0.1"
unified@^6.1.5:
version "6.1.6"
resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1"
dependencies:
bail "^1.0.0"
extend "^3.0.0"
is-plain-obj "^1.1.0"
trough "^1.0.0"
vfile "^2.0.0"
x-is-function "^1.0.4"
x-is-string "^0.1.0"
union-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
@@ -4528,6 +4655,26 @@ uniqs@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
unist-util-is@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
unist-util-remove-position@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb"
dependencies:
unist-util-visit "^1.1.0"
unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c"
unist-util-visit@^1.1.0, unist-util-visit@^1.1.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444"
dependencies:
unist-util-is "^2.1.1"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -4621,6 +4768,25 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
vfile-location@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255"
vfile-message@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359"
dependencies:
unist-util-stringify-position "^1.1.1"
vfile@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a"
dependencies:
is-buffer "^1.1.4"
replace-ext "1.0.0"
unist-util-stringify-position "^1.0.0"
vfile-message "^1.0.0"
vm-browserify@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
@@ -4785,11 +4951,19 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
x-is-function@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"
x-is-string@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
xmlhttprequest@^1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
xtend@^4.0.0:
xtend@^4.0.0, xtend@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"