diff --git a/.github/PULL_REQUEST_TEMPLATE/new_version.md b/.github/PULL_REQUEST_TEMPLATE/new_version.md new file mode 100644 index 0000000..1aa425c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/new_version.md @@ -0,0 +1,12 @@ +--- +name: New Version +about: New version update + +--- + +# Version: v +## What's new +- + +## Bug fixes +- \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..ce5875f --- /dev/null +++ b/.npmignore @@ -0,0 +1,49 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules +app/node_modules + +# OSX +.DS_Store + +# App packaged +release/*.yml +release/*.yaml +release/*.deb +release/*.AppImage +app/main.js +app/main.js.map +app/bundle.js +app/bundle.js.map +app/style.css +app/style.css.map +dist +main.js +main.js.map + +.idea +.vscode diff --git a/app/actions/counter.ts b/app/actions/counter.ts deleted file mode 100644 index 8f3f4dc..0000000 --- a/app/actions/counter.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { actionCreatorVoid } from './helpers'; - -export const increment = actionCreatorVoid('INCREMENT_COUNTER'); -export const decrement = actionCreatorVoid('DECREMENT_COUNTER'); - -export function incrementIfOdd() { - return (dispatch: Function, getState: Function) => { - const { counter } = getState(); - - if (counter % 2 === 0) { - return; - } - - dispatch(increment()); - }; -} - -export function incrementAsync(delay: number = 1000) { - return (dispatch: Function) => { - setTimeout(() => { - dispatch(increment()); - }, delay); - }; -} \ No newline at end of file diff --git a/app/actions/helpers.ts b/app/actions/helpers.ts deleted file mode 100644 index bae0c60..0000000 --- a/app/actions/helpers.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Action } from 'redux'; - -export interface IAction extends Action { } -export interface IActionWithPayload extends IAction { - readonly payload: T; -} - -interface IActionCreator { - readonly type: string; - (payload: T): IActionWithPayload; - - test(action: IAction): action is IActionWithPayload; -} - -interface IActionCreatorVoid { - readonly type: string; - (): IAction; - - test(action: IAction): action is IAction; -} - -export const actionCreator = (type: string): IActionCreator => - Object.assign((payload: T): any => ({ type, payload }), { - type, - test(action: IAction): action is IActionWithPayload { - return action.type === type; - } - }); - -export const actionCreatorVoid = (type: string): IActionCreatorVoid => - Object.assign((): any => ({ type }), { - type, - test(action: IAction): action is IAction { - return action.type === type; - } - }); diff --git a/app/actions/saving.ts b/app/actions/saving.ts index 6c25b71..a9c0aff 100644 --- a/app/actions/saving.ts +++ b/app/actions/saving.ts @@ -39,7 +39,7 @@ export namespace Saving { }); } } - function deserialize>(gates: IComponent.GateStatePlecibo[], + export function deserialize>(gates: IComponent.GateStatePlecibo[], endNodes: GateNode[], startNodes: GateNode[], ctx: CanvasRenderingContext2D, type: string): T[] { const construct = (): AnyGate => { switch (type) { diff --git a/app/components/Home.tsx b/app/components/Home.tsx index 7dfa1b4..fe56767 100644 --- a/app/components/Home.tsx +++ b/app/components/Home.tsx @@ -222,6 +222,13 @@ export default class Home extends RComponent { case "q": workspace.checkSave(); break; + case "z": + if (e.shiftKey) { + workspace.redo(); + } else { + workspace.undo(); + } + break; } } } diff --git a/app/components/NavBar.tsx b/app/components/NavBar.tsx index 6b614d9..4e8d8b9 100644 --- a/app/components/NavBar.tsx +++ b/app/components/NavBar.tsx @@ -78,6 +78,9 @@ export default class NavBar extends Component { } } + private undo = (e: event) => this.workspace().undo() + private redo = (e: event) => this.workspace().redo() + private exit = (): void => { if (!!this.home) { this.workspace().checkSave(); @@ -104,6 +107,8 @@ export default class NavBar extends Component {
  • ExitCtrl + Q
  • Edit
      +
    • UndoCtrl + Z
    • +
    • RedoCtrl + Shift + Z
    • SettingsAlt + P
  • Window
      diff --git a/app/components/Workspace.tsx b/app/components/Workspace.tsx index 84d28a9..dabff2c 100644 --- a/app/components/Workspace.tsx +++ b/app/components/Workspace.tsx @@ -37,6 +37,8 @@ export default class Workspace extends React.Component { + // Find gate for history + let gate = this.allGates().find(val => { return val.state.id === id }); + if (gate) { + this.pushState({ + method: 'delete', + gate: this.genPlecibo(gate) + }) + } // Remove context menu // Delete Wires referencing gate let is: number[] = []; @@ -165,6 +176,20 @@ export default class Workspace extends React.Component { + const state = gate.state; + const coordsObj = !!coords ? coords : state.coords; + return { + coords: Object.assign({}, coordsObj), + size: Object.assign({}, state.size), + id: state.id, + inputs: state.gateIn.map(val => val.state.id), + outputs: state.gateOut.map(val => val.state.id), + type: gate.state.type, + invert: state.invert + } + } + /** * Returns an array of all the gates held in this.gates. * Update this with new gates as added. @@ -203,6 +228,8 @@ export default class Workspace extends React.Component { + if (this.state.undoIndex < this.stateHistory.length - 2 && this.state.undoIndex !== -1) { + this.stateHistory = this.stateHistory.slice(0, this.state.undoIndex); + } + this.stateHistory.push(action); + this.setState({undoIndex: this.stateHistory.length}); + console.log(this.stateHistory.length - 1, this.state.undoIndex, this.stateHistory); + } + + + public undo = (): number => { + let index = this.state.undoIndex - 1; + this.changeState(index); + if (this.props.addStatus) { + this.props.addStatus("Undone", false); + } + return index; + } + public redo = (): number => { + let index = this.state.undoIndex + 1; + if (index < this.stateHistory.length && this.props.addStatus) { + this.changeState(index); + this.props.addStatus("Redone", false); + } + return index; + } + + private changeState = (index: number) => { + if (index >= 0) { + let state = this.stateHistory[index]; + + if (!!state) { + this.clear(); + switch (state.method) { + case "create": + // Delete the gate in current state + this.deleteGate(state.gate.id); + break; + case "delete": + // Create the gate again + // Deserialize + let newGate = Saving.deserialize([state.gate], this.endNodes, this.startNodes, this.ctx, state.gate.type)[0] as LogicGates.Gates; + console.log(newGate); + // Set previous id + newGate.state.id = state.gate.id; + // Remove constructed ID + LogicGates.Gates.REMID(LogicGates.Gates.IDS[LogicGates.Gates.IDS.length-1]); + switch (state.gate.type) { + case "and": + this.gates.and.push(newGate); + break; + case "or": + this.gates.or.push(newGate); + break; + case "not": + this.gates.not.push(newGate); + break; + case "switch": + this.gates.switch.push(newGate as LogicGates.Switch); + break; + case "led": + this.gates.led.push(newGate as LogicGates.LED); + break; + } + break; + case "join": + // Disconnect and delete wire + let id = 0; + for (let wire of this.gates.wire) { + if (state.secondGate + && wire.state.startNode.state.gate.state.id === state.gate.id + && wire.state.endNode.state.gate.state.id === state.secondGate.id) { + this.derefWire(id); + } + id++; + } + break; + case "unjoin": + // TODO: Connect and create wire + break; + case "move": + // Move to previous position + let gate = this.allGates().find(val => { return val.state.id === state.gate.id }); + if (!!gate) { + gate.drag(state.gate.coords); + } + break; + } + this.clear(); + console.log(index, this.gates); + this.setState({undoIndex: index}); + } + } + } + public componentDidUpdate() { this.updateCanvas(); } @@ -350,7 +472,7 @@ export default class Workspace extends React.Component, coords: ICanvas.GateCoords): void => { + private canvasClick = (e: React.MouseEvent, coords: ICanvas.GateCoords): boolean => { // Find if a gate was clicked let gate = this.isClicked(coords); @@ -549,8 +688,14 @@ export default class Workspace extends React.Component 0 && move.y > 0) for (let g of this.clickedDrag) g.drag(move); } + // TODO: add multi move support for history + this.pushState({ + method: 'move', + gate: this.genPlecibo(this.clickedDrag[0], this.state.drag) + }); this.clear(); this.setState({ dragging: false }); + return true; } else if (this.state.canvasDrag) { this.setState({ canvasDrag: false }); } @@ -562,6 +707,7 @@ export default class Workspace extends React.Component { return v.state.break.x !== wire.state.break.x || v.state.break.y !== wire.state.break.y; } - wire.state.startNode.state.wire = wire.state.startNode.state.wire.filter(checkWire); - wire.state.endNode.state.wire = wire.state.endNode.state.wire.filter(checkWire); - let gateIn = wire.state.startNode.state.gate; - let gateOut = wire.state.endNode.state.gate; - gateIn.state.gateOut = gateIn.state.gateOut.filter(v => { return v.state.id !== gateOut.state.id; }); - gateOut.state.gateIn = gateOut.state.gateIn.filter(v => { return v.state.id !== gateIn.state.id; }); - this.gates.wire = this.gates.wire.filter((_, i) => { return i !== cut; }); + let deref = this.derefWire(cut); + + // Send to history + this.pushState({ + method: 'unjoin', + gate: this.genPlecibo(deref[0]), + secondGate: this.genPlecibo(deref[1]) + }) } window.requestAnimationFrame(() => { this.clear(); @@ -701,6 +852,21 @@ export default class Workspace extends React.Component { + let wire = this.gates.wire[cut]; + // GIANT REREF BLOCK + // DONT TRY THIS AT HOME + let checkWire = (v: LogicGates.Wire): boolean => { return v.state.break.x !== wire.state.break.x || v.state.break.y !== wire.state.break.y; } + wire.state.startNode.state.wire = wire.state.startNode.state.wire.filter(checkWire); + wire.state.endNode.state.wire = wire.state.endNode.state.wire.filter(checkWire); + let gateIn = wire.state.startNode.state.gate; + let gateOut = wire.state.endNode.state.gate; + gateIn.state.gateOut = gateIn.state.gateOut.filter(v => { return v.state.id !== gateOut.state.id; }); + gateOut.state.gateIn = gateOut.state.gateIn.filter(v => { return v.state.id !== gateIn.state.id; }); + this.gates.wire = this.gates.wire.filter((_, i) => { return i !== cut; }); + return [gateIn, gateOut] + } + /** * Opens property window * Set in a separate constructor. diff --git a/app/components/styles/NavBar.scss b/app/components/styles/NavBar.scss index b22e04e..5d02079 100644 --- a/app/components/styles/NavBar.scss +++ b/app/components/styles/NavBar.scss @@ -78,7 +78,8 @@ right: 5px; top: 4px; z-index: 1999; - user-select: initial; + user-select: none; + -webkit-tap-highlight-color: transparent; -webkit-app-region: no-drag; } .opt img { diff --git a/app/containers/HomePage.tsx b/app/containers/HomePage.tsx deleted file mode 100644 index 2057b59..0000000 --- a/app/containers/HomePage.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import * as React from 'react'; -import { RouteComponentProps } from 'react-router'; -import Home from '../components/Home'; - -export class HomePage extends React.Component, void> { - render() { - return ( - - ); - } -} - -export default (HomePage as any as React.StatelessComponent>); diff --git a/app/containers/Root.tsx b/app/containers/Root.tsx deleted file mode 100644 index f4b4404..0000000 --- a/app/containers/Root.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from 'react'; -import * as Redux from 'react-redux'; -import { History } from 'history'; - -import { Provider } from 'react-redux'; -import { ConnectedRouter } from 'react-router-redux'; -import Routes from '../routes'; - -interface IRootType { - store: Redux.Store; - history: History -}; - -export default function Root({ store, history }: IRootType) { - return ( - - - - - - ); -} diff --git a/app/gates/AND.ts b/app/gates/AND.ts index 449b3e4..1cfb479 100644 --- a/app/gates/AND.ts +++ b/app/gates/AND.ts @@ -68,7 +68,8 @@ export default class AndGate extends Gates { gateIn: new Array(), gateOut: new Array(), id: !!id ? id : Gates.INCID(), - invert + invert, + type: "and" } if (invert) { diff --git a/app/gates/LED.ts b/app/gates/LED.ts index 8c2eaae..a22d408 100644 --- a/app/gates/LED.ts +++ b/app/gates/LED.ts @@ -47,7 +47,8 @@ export default class LED extends Gates { input: false, gateIn: new Array(), gateOut: new Array(), - id: !!id ? id : Gates.INCID() + id: !!id ? id : Gates.INCID(), + type: "led" } this.render(); diff --git a/app/gates/NOT.ts b/app/gates/NOT.ts index 0fe1bb7..1224eab 100644 --- a/app/gates/NOT.ts +++ b/app/gates/NOT.ts @@ -39,7 +39,8 @@ export default class NotGate extends Gates { }, gateIn: new Array(), gateOut: new Array(), - id: !!id ? id : Gates.INCID() + id: !!id ? id : Gates.INCID(), + type: "not" } this.render(); diff --git a/app/gates/OR.ts b/app/gates/OR.ts index 119ff96..ed6d690 100644 --- a/app/gates/OR.ts +++ b/app/gates/OR.ts @@ -65,7 +65,8 @@ export default class OrGate extends Gates { gateIn: new Array(), gateOut: new Array(), id: !!id ? id : Gates.INCID(), - invert + invert, + type: "or" } if (invert) { diff --git a/app/gates/Switch.ts b/app/gates/Switch.ts index fcec6ae..84fa084 100644 --- a/app/gates/Switch.ts +++ b/app/gates/Switch.ts @@ -49,7 +49,8 @@ export default class Switch extends Gates { connected: false, gateIn: new Array(), gateOut: new Array(), - id: !!id ? id : Gates.INCID() + id: !!id ? id : Gates.INCID(), + type: "switch" } this.render(); diff --git a/app/index.tsx b/app/index.tsx index 6e9fc13..1f9a78f 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -2,26 +2,13 @@ import * as React from 'react'; import { render } from 'react-dom'; import { AppContainer } from 'react-hot-loader'; import './app.global.scss'; -import Root from './containers/Root'; - -const { configureStore, history } = require('./store/configureStore'); -const store = configureStore(); +import Home from './components/Home'; render( - + , document.getElementById('root') ); -if ((module as any).hot) { - (module as any).hot.accept('./containers/Root', () => { - const NextRoot = require('./containers/Root').default; - render( - - - , - document.getElementById('root') - ); - }); -} + diff --git a/app/interfaces/canvas.d.ts b/app/interfaces/canvas.d.ts index ede6139..0ae8d1c 100644 --- a/app/interfaces/canvas.d.ts +++ b/app/interfaces/canvas.d.ts @@ -12,7 +12,8 @@ export interface State> { nodes: Nodes, gateIn: Array, gateOut: Array, - invert?: boolean + invert?: boolean, + type: string } export interface Nodes> { start: GateNode[], diff --git a/app/interfaces/components.d.ts b/app/interfaces/components.d.ts index 881ac5b..4a5b488 100644 --- a/app/interfaces/components.d.ts +++ b/app/interfaces/components.d.ts @@ -1,6 +1,6 @@ // Gates imports import { AndGate, GateNode, LED, NotGate, OrGate, Switch, Wire } from '../gates/all'; -import { GateCoords, GateSize, AnyGate } from "./canvas"; +import { GateCoords, GateSize, AnyGate, SelectedNode } from "./canvas"; import Home from '../components/Home'; import { notDeepEqual } from 'assert'; @@ -25,6 +25,11 @@ export interface HomeState { export interface HomeProps { testing?: boolean } +export interface StateHistory { + method: 'create' | 'move' | 'join' | 'delete' | 'unjoin', + gate: GateStatePlecibo, + secondGate?: GateStatePlecibo +} export interface PropertiesState { } @@ -101,7 +106,8 @@ export interface WorkspaceState { context: IContext | null, path?: string, gridType: number, - unsavedChanges: boolean + unsavedChanges: boolean, + undoIndex: number } export interface WorkspaceProps extends Component { name?: string, @@ -135,7 +141,7 @@ export interface StatusProps { unmount: () => void, offset: number } -interface GateStatePlecibo { +export interface GateStatePlecibo { coords: GateCoords, size: GateSize, id: number, diff --git a/app/package-lock.json b/app/package-lock.json index 05b73e7..a07e250 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,5 +1,5 @@ { "name": "newlogic", - "version": "0.1.2-beta", + "version": "0.1.3-beta", "lockfileVersion": 1 } diff --git a/app/package.json b/app/package.json index b3f9931..8299600 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "newlogic", "productName": "newlogic", - "version": "0.1.2-beta", + "version": "0.1.3-beta", "description": "A circuit builder", "main": "./main.js", "author": { diff --git a/app/reducers/index.ts b/app/reducers/index.ts deleted file mode 100644 index e21c12a..0000000 --- a/app/reducers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { combineReducers, Reducer } from 'redux'; -import { routerReducer as routing } from 'react-router-redux'; - -const rootReducer = combineReducers({ - routing: routing as Reducer -}); - -export default rootReducer; diff --git a/app/routes.tsx b/app/routes.tsx deleted file mode 100644 index 051a3fe..0000000 --- a/app/routes.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from 'react'; -import { Route, Switch } from 'react-router'; -import App from './containers/App'; -import HomePage from './containers/HomePage'; - -export default () => ( - - - - - -); diff --git a/app/store/configureStore.development.ts b/app/store/configureStore.development.ts deleted file mode 100644 index 5246cb9..0000000 --- a/app/store/configureStore.development.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; -import { createHashHistory } from 'history'; -import { routerMiddleware, push } from 'react-router-redux'; -import { createLogger } from 'redux-logger'; -import rootReducer from '../reducers'; - -import * as counterActions from '../actions/counter'; - -declare const window: Window & { - __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?(a: any): void; -}; - -declare const module: NodeModule & { - hot?: { - accept(...args: any[]): any; - } -}; - -const actionCreators = Object.assign({}, - counterActions, - {push} -); - -const logger = (createLogger)({ - level: 'info', - collapsed: true -}); - -const history = createHashHistory(); -const router = routerMiddleware(history); - -// If Redux DevTools Extension is installed use it, otherwise use Redux compose -/* eslint-disable no-underscore-dangle */ -const composeEnhancers: typeof compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? - window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ - // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators - }) as any : - compose; -/* eslint-enable no-underscore-dangle */ -const enhancer = composeEnhancers( - applyMiddleware(thunk, router, logger) -); - -export = { - history, - configureStore(initialState: Object | void) { - const store = createStore(rootReducer, initialState, enhancer); - - if (module.hot) { - module.hot.accept('../reducers', () => - store.replaceReducer(require('../reducers')) // eslint-disable-line global-require - ); - } - - return store; - } -}; diff --git a/app/store/configureStore.production.ts b/app/store/configureStore.production.ts deleted file mode 100644 index a18840a..0000000 --- a/app/store/configureStore.production.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; -import { createBrowserHistory } from 'history'; -import { routerMiddleware } from 'react-router-redux'; -import rootReducer from '../reducers'; - -const history = createBrowserHistory(); -const router = routerMiddleware(history); -const enhancer = applyMiddleware(thunk, router); - -export = { - history, - configureStore(initialState: Object | void) { - return createStore(rootReducer, initialState, enhancer); - } -}; diff --git a/app/store/configureStore.ts b/app/store/configureStore.ts deleted file mode 100644 index 81582dd..0000000 --- a/app/store/configureStore.ts +++ /dev/null @@ -1,9 +0,0 @@ -let configureStore: any; - -if (process.env.NODE_ENV === 'production') { - configureStore = require('./configureStore.production'); -} else { - configureStore = require('./configureStore.development'); -} - -export = configureStore; diff --git a/package.json b/package.json index 5269f59..061b5d0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "newlogic", "productName": "newlogic", - "version": "0.1.2-beta", + "version": "0.1.3-beta", "description": "Circuit Builder Desktop Application (like mmlogic) made with Electron + React Typescript. Compatible with Windows, Mac and Linux.", "main": "main.js", "preferGlobal": true, @@ -21,7 +21,8 @@ "package-win": "npm run build && build --win --x64", "package-linux": "npm run build && build --linux", "package-all": "npm run build && build -mwl", - "cleanup": "mop -v" + "cleanup": "mop -v", + "prepack": "npm run package-linux" }, "jest": { "moduleNameMapper": { @@ -91,7 +92,7 @@ } }, "bin": { - "newlogic": "./start.js" + "newlogic": "./release/linux-unpacked/newlogic" }, "repository": { "type": "git", @@ -124,10 +125,7 @@ "@types/react": "^16.0.5", "@types/react-dom": "16.0.3", "@types/react-hot-loader": "^3.0.4", - "@types/react-redux": "^5.0.4", - "@types/react-router": "^4.0.11", "@types/react-router-dom": "^4.0.7", - "@types/react-router-redux": "^5.0.2", "@types/redux-logger": "^3.0.0", "@types/sinon": "^4.0.0", "asar": "^0.14.0", @@ -183,10 +181,7 @@ "react": "^16.0.0", "react-dom": "^16.0.0", "react-konva": "^16.7.1", - "react-redux": "^5.0.1", - "react-router": "^4.1.1", "react-router-dom": "^4.1.1", - "react-router-redux": "^5.0.0-alpha.6", "redux": "^3.6.0", "redux-thunk": "^2.1.0", "source-map-support": "^0.5.0" diff --git a/yarn.lock b/yarn.lock index 12dfed9..027665a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -148,14 +148,6 @@ dependencies: "@types/react" "*" -"@types/react-redux@^5.0.4": - version "5.0.21" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-5.0.21.tgz#98a3a371dfc22c894889f660d7515717639d20f4" - integrity sha512-ewkOW4GjnyXq5L++T31utI8yRmwj8iCIahZohYi1Ef7Xkrw0V/q92ao7x20rm38FKgImDaCCsaRGWfCJmF/Ukg== - dependencies: - "@types/react" "*" - redux "^3.6.0" - "@types/react-router-dom@^4.0.7": version "4.3.2" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.2.tgz#52c17c3682597638f31c17c42620403dc5c2a3f5" @@ -165,17 +157,7 @@ "@types/react" "*" "@types/react-router" "*" -"@types/react-router-redux@^5.0.2": - version "5.0.18" - resolved "https://registry.yarnpkg.com/@types/react-router-redux/-/react-router-redux-5.0.18.tgz#5f28d5f7387fa71e33f602ccf9269e1609d47b8b" - integrity sha512-5SI69Virpmo+5HXWXKIzSt5hsnV7TTidL3Ddmbi+PH1CIdi40wthJwjFoqiE+gRQANur5WhjEtfyPorJ4zymHA== - dependencies: - "@types/history" "*" - "@types/react" "*" - "@types/react-router" "*" - redux ">= 3.7.2" - -"@types/react-router@*", "@types/react-router@^4.0.11": +"@types/react-router@*": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.4.5.tgz#1166997dc7eef2917b5ebce890ebecb32ee5c1b3" integrity sha512-12+VOu1+xiC8RPc9yrgHCyLI79VswjtuqeS2gPrMcywH6tkc8rGIUhs4LaL3AJPqo5d+RPnfRpNKiJ7MK2Qhcg== @@ -3648,13 +3630,6 @@ hoist-non-react-statics@^2.5.0: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" - integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== - dependencies: - react-is "^16.7.0" - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -6529,7 +6504,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6777,7 +6752,7 @@ react-hot-loader@^3.0.0-beta.6: redbox-react "^1.3.6" source-map "^0.6.1" -react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@^16.8.1, react-is@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== @@ -6790,7 +6765,7 @@ react-konva@^16.7.1: react-reconciler "^0.20.4" scheduler "^0.13.6" -react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -6812,19 +6787,6 @@ react-reconciler@^0.20.4: prop-types "^15.6.2" scheduler "^0.13.6" -react-redux@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f" - integrity sha512-LE7Ned+cv5qe7tMV5BPYkGQ5Lpg8gzgItK07c67yHvJ8t0iaD9kPFPAli/mYkiyJYrs2pJgExR2ZgsGqlrOApg== - dependencies: - "@babel/runtime" "^7.1.2" - hoist-non-react-statics "^3.1.0" - invariant "^2.2.4" - loose-envify "^1.1.0" - prop-types "^15.6.1" - react-is "^16.6.0" - react-lifecycles-compat "^3.0.0" - react-router-dom@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" @@ -6837,16 +6799,7 @@ react-router-dom@^4.1.1: react-router "^4.3.1" warning "^4.0.1" -react-router-redux@^5.0.0-alpha.6: - version "5.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-5.0.0-alpha.9.tgz#825431516e0e6f1fd93b8807f6bd595e23ec3d10" - integrity sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw== - dependencies: - history "^4.7.2" - prop-types "^15.6.0" - react-router "^4.2.0" - -react-router@^4.1.1, react-router@^4.2.0, react-router@^4.3.1: +react-router@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== @@ -7031,14 +6984,6 @@ redux-thunk@^2.1.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -"redux@>= 3.7.2": - version "4.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" - integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - redux@^3.6.0: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" @@ -8002,7 +7947,7 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -symbol-observable@^1.0.3, symbol-observable@^1.2.0: +symbol-observable@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==