v1.0
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@ node_modules
|
||||
dist
|
||||
.vscode
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
3
dist/index.html
vendored
3
dist/index.html
vendored
@@ -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>
|
||||
@@ -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",
|
||||
|
||||
@@ -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>
|
||||
}
|
||||
}
|
||||
@@ -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
9
src/components/Home.tsx
Normal 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>
|
||||
}
|
||||
}
|
||||
15
src/components/ListItem.tsx
Normal file
15
src/components/ListItem.tsx
Normal 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>
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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: </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>
|
||||
|
||||
17
src/containers/HomeContainer.tsx
Normal file
17
src/containers/HomeContainer.tsx
Normal 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>
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
50
src/containers/ListContainer.tsx
Normal file
50
src/containers/ListContainer.tsx
Normal 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>
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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'}}> Hi, {this.props.loginState.displayName} <a href="#" onClick={()=>this.logout()}>Log Out</a> </span>;
|
||||
}
|
||||
else{
|
||||
return <LoginButton onClick={this.login} />;
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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}
|
||||
@@ -1,5 +1,5 @@
|
||||
.main {
|
||||
background-color: lightgray;
|
||||
width: 100%;
|
||||
height: 100;
|
||||
height: 100%;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
184
yarn.lock
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user