show pokemon list

This commit is contained in:
Jeff Colombo 2019-01-14 00:31:46 -05:00
parent 6dca121ffb
commit 8fe5c4b559
16 changed files with 305 additions and 41 deletions

View File

@ -2,9 +2,7 @@ import * as fs from 'fs';
import Pokemon from 'pokemongo-json-pokedex/output/pokemon.json';
import { ILeaguePokemon, IPokemon, IStats, League, Grade } from 'app/models/Pokemon';
interface ICpAndTotalFound {
[ key : number ] : Array<IStats>;
}
type ICpAndTotalFound = Record<number, Array<IStats>>;
interface IStatsDistribution {
great : ICpAndTotalFound;
ultra : ICpAndTotalFound;
@ -33,8 +31,8 @@ const getClosestCpMultiplierIndex = (value : number) => {
};
const familyOrder : Array<string> = [];
const familyEvolutionOrder : { [ key : string ] : Array<string> } = {};
const familyEncountered : { [ key : string ] : Array<ILeaguePokemon> } = {};
const familyEvolutionOrder : Record<string, Array<string>> = {};
const familyEncountered : Record<string, Array<ILeaguePokemon>> = {};
Pokemon.forEach((mon) => {
const baseAtk = mon.stats.baseAttack;
const baseDef = mon.stats.baseDefense;

View File

@ -2,12 +2,13 @@
"license": "UNLICENSED",
"scripts": {
"#": "DO NOT ADD '-d' OPTION TO WEBPACK OR ALL SOURCEMAPS WILL BREAK: https://webpack.js.org/api/cli/#shortcuts",
"lint": "tslint --project tslint.json",
"package": "yarn build -- --config webpack.config.prod.js --bail --display-used-exports -p",
"package-for-test": "yarn build -- --config webpack.config.test.js --bail --display-used-exports",
"watch": "yarn build -- --config webpack.config.js --colors --debug --output-pathinfo --progress --watch",
"build": "node ./node_modules/webpack/bin/webpack.js --cache=true --display-error-details --profile",
"clean": "rm -rf ./dist/*",
"tsnode": "./node_modules/.bin/ts-node"
"tsnode": "./node_modules/.bin/ts-node -r tsconfig-paths/register"
},
"devDependencies": {
"@babel/core": "^7.2.2",
@ -21,6 +22,7 @@
"@types/node": "^10.12.18",
"@types/react": "^16.7.18",
"@types/react-dom": "^16.0.11",
"@types/react-redux": "^6.0.12",
"babel-loader": "^8.0.4",
"babel-plugin-transform-builtin-extend": "^1.1.2",
"css-loader": "^2.1.0",
@ -40,6 +42,7 @@
"stylelint-webpack-plugin": "^0.10.5",
"ts-loader": "^5.3.2",
"ts-node": "^7.0.1",
"tsconfig-paths": "^3.7.0",
"tslint": "^5.12.0",
"tslint-eslint-rules": "^5.4.0",
"tslint-loader": "^3.5.4",
@ -52,7 +55,12 @@
},
"dependencies": {
"pokemongo-json-pokedex": "^3.4.6",
"prop-types": "^15.6.2",
"react": "^16.7.0",
"react-dom": "^16.7.0"
"react-dom": "^16.7.0",
"react-redux": "^6.0.0",
"redux": "^4.0.1",
"redux-thunk": "^2.3.0",
"typesafe-actions": "^3.0.0"
}
}

View File

@ -12,7 +12,7 @@ export class PokemonService implements IPokemonService {
is_active: true,
};
return AjaxUtils.ajaxGet('/api/billing/plan', queryParameters)
return AjaxUtils.ajaxGet('/dist/db/order.json', queryParameters)
.then((response : Array<IPokemonJSON>) => {
return Promise.resolve(this.serializePokemonList(response));
});
@ -22,23 +22,24 @@ export class PokemonService implements IPokemonService {
const pokemonList = jsonPokemonList.reduce((result : Array<IPokemon>, pokemonJson) => {
try {
if (typeof pokemonJson.name !== 'string') {
throw 'pokemon missing name';
throw new Error('pokemon missing name');
}
if (typeof pokemonJson.id !== 'string') {
throw 'pokemon missing id';
throw new Error('pokemon missing id');
}
if (typeof pokemonJson.family !== 'string') {
throw 'pokemon missing family';
throw new Error('pokemon missing family');
}
if (typeof pokemonJson.dex !== 'number') {
throw 'pokemon missing dex';
throw new Error('pokemon missing dex');
}
if (typeof pokemonJson.stats !== 'object') {
throw 'pokemon missing stats';
throw new Error('pokemon missing stats');
}
const pokemon : IPokemon = { ...pokemonJson };
result.push(pokemon);
} catch (e) {
/* tslint:disable-next-line:no-console */
console.error(pokemonJson, e.message);
}
return result;

42
src/ts/app/PokemonApp.tsx Normal file
View File

@ -0,0 +1,42 @@
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { appReducers } from './index';
import * as ActionsPokemonSelectList from './PokemonSelectList/actions';
import { IPokemonSelectListState, ThunkDispatchPokemonSelectList } from './PokemonSelectList/types';
import { PokemonSelectList } from './PokemonSelectList/PokemonSelectList';
interface IPokemonAppProps {
pokemonSelectListState : IPokemonSelectListState;
}
interface IConnectedPokemonAppProps extends IPokemonAppProps {
dispatch : ThunkDispatchPokemonSelectList;
}
class PokemonApp extends React.Component<IConnectedPokemonAppProps> {
constructor(props : IConnectedPokemonAppProps) {
super(props);
}
public componentWillMount() {
this.props.dispatch(ActionsPokemonSelectList.fetchPokemonList());
}
public render() {
return (
<PokemonSelectList pokemonList={ this.props.pokemonSelectListState.pokemonList } />
);
}
}
const mapStateToProps = (state : ReturnType<typeof appReducers>) : IPokemonAppProps => {
return {
pokemonSelectListState: state.pokemonSelectListState,
};
};
export const ConnectedPokemonApp = connect(mapStateToProps)(PokemonApp);

View File

@ -0,0 +1,17 @@
import * as React from 'react';
import { IPokemon } from 'app/models/Pokemon';
export interface IPokemonSelectListProps {
pokemonList : Array<IPokemon>;
}
export class PokemonSelectList extends React.Component<IPokemonSelectListProps, object> {
public render() {
return (
<div>
{ this.props.pokemonList.map((pokemon, index) => <div key={ index }>{ pokemon.name }</div>) }
</div>
);
}
}

View File

@ -0,0 +1,20 @@
import { action } from 'typesafe-actions';
import { IPokemon } from 'app/models/Pokemon';
import { PokemonSelectListActionTypes, ThunkResult } from './types';
export const setPokemonList = (pokemonList : Array<IPokemon>) => action(PokemonSelectListActionTypes.SET_POKEMON_LIST, { pokemonList });
export const fetchPokemonList = (
) : ThunkResult<Promise<void>> => {
return (dispatch, getState, extraArguments) => {
return new Promise<void>((resolve, reject) => {
extraArguments.services.pokemonService.getPokemonList()
.then((pokemonList) => {
dispatch(setPokemonList(pokemonList));
resolve();
});
});
};
};

View File

@ -0,0 +1,29 @@
import { Reducer } from 'redux';
import * as Actions from './actions';
import { IPokemonSelectListState, PokemonSelectListActionTypes } from './types';
export const initialState : IPokemonSelectListState = {
pokemonList: [],
pokemonListFiltered: [],
};
const reduceSetPokemonList = (
state : IPokemonSelectListState,
action : ReturnType<typeof Actions.setPokemonList>
) : IPokemonSelectListState => ({
...state,
pokemonList: action.payload.pokemonList,
});
export const PokemonSelectListReducers : Reducer<IPokemonSelectListState> = (
state : IPokemonSelectListState = initialState,
action,
) : IPokemonSelectListState => {
switch (action.type) {
case PokemonSelectListActionTypes.SET_POKEMON_LIST:
return reduceSetPokemonList(state, action as ReturnType<typeof Actions.setPokemonList>);
default:
return state;
}
};

View File

@ -0,0 +1,32 @@
import { Action } from 'redux';
import { ThunkAction, ThunkDispatch } from 'redux-thunk';
import { IProviderExtraArguments } from 'common/models/IProviderExtraArguments';
import { PokemonService } from 'api/PokemonService';
import { IPokemon } from 'app/models/Pokemon';
export interface IPokemonSelectListState {
pokemonList : Array<IPokemon>;
pokemonListFiltered : Array<IPokemon>;
}
export interface IPokemonSelectListStore {
pokemonSelectListState : IPokemonSelectListState;
}
export interface IPokemonSelectListServices {
pokemonService : PokemonService;
}
export interface IPokemonSelectListExtraArguments extends IProviderExtraArguments {
services : IPokemonSelectListServices;
}
export type ThunkResult<R> = ThunkAction<R, IPokemonSelectListStore, IPokemonSelectListExtraArguments, Action>;
export type ThunkDispatchPokemonSelectList = ThunkDispatch<IPokemonSelectListStore, IPokemonSelectListExtraArguments, Action>;
export const PokemonSelectListActionTypes = {
SET_POKEMON_LIST: 'POKEMON_SELECT_LIST/SET_POKEMON_LIST',
};

View File

@ -1,23 +0,0 @@
import * as React from 'react';
import { PokemonService } from 'api/PokemonService';
export interface IPokemonSelectListProps {}
export class PokemonSelectList extends React.Component<IPokemonSelectListProps, object> {
constructor(props : IPokemonSelectListProps) {
super(props);
}
public componentWillMount() {
// TODO: switch to redux
// PokemonService
}
public render() {
return (
<div>Pokemon List</div>
);
}
}

View File

@ -1,11 +1,61 @@
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import * as Redux from 'redux';
import thunk from 'redux-thunk';
import { PokemonSelectList } from './components/PokemonSelectList/PokemonSelectList';
import { IProviderExtraArguments } from 'common/models/IProviderExtraArguments';
import { IPokemonSelectListExtraArguments } from 'app/PokemonSelectList/types';
import { PokemonService } from 'api/PokemonService';
import { PokemonSelectListReducers } from './PokemonSelectList/reducers';
import { ConnectedPokemonApp } from './PokemonApp';
import 'styles/index.scss';
export const appReducers = Redux.combineReducers({
pokemonSelectListState : PokemonSelectListReducers
});
const extraArguments : IPokemonSelectListExtraArguments = {
services: {
pokemonService: new PokemonService()
}
};
const store = Redux.createStore(
appReducers,
// enableBatching(appReducers),
Redux.applyMiddleware(
thunk.withExtraArgument(extraArguments)
)
);
ReactDOM.render(
<PokemonSelectList />,
<Provider store={ store }>
<ConnectedPokemonApp />
</Provider>,
document.getElementById('pokemon-mount')
);
// const BATCH_ACTION_TYPE = '_BATCHING_REDUCER_BATCH_ACTION_';
// // TODO Allow this to also take ThunkAction<any, any, any>
// export function batchActions(actions : Array<Redux.Action>) : Redux.Action {
// return action(BATCH_ACTION_TYPE, actions);
// }
// // This is called in the Provider on all Reducers
// export function enableBatching(reducer : Redux.Reducer<any>) {
// return function batchingReducer(state : any, action : Redux.Action) {
// if (action && (action.type === BATCH_ACTION_TYPE)) {
// const payload = (action as Redux.Action).payload;
// return payload.reduce(batchingReducer, state);
// }
// return reducer(state, action);
// };
// }

View File

@ -0,0 +1,3 @@
export interface IProviderExtraArguments {
services : object;
}

View File

@ -16,6 +16,7 @@
"paths": {
"api/*": ["src/ts/api/*"],
"app/*": ["src/ts/app/*"],
"common/*": ["src/ts/common/*"],
"styles/*": ["src/scss/*"]
},
"plugins": [{

View File

@ -1,7 +1,7 @@
{
"extends": ["tslint:latest", "tslint-react", "tslint-eslint-rules"],
"rules": {
"no-implicit-dependencies": [true, ["styles", "app", "api"]],
"no-implicit-dependencies": [true, ["api", "app", "common", "styles"]],
"no-default-export": true,
"no-unused-expression": true,
"no-unused-variable": [true, "react"],

View File

@ -11,6 +11,7 @@ const typescriptResolve = {
// keep in sync with tsconfig.json `paths` and tslint.json `no-implicit-dependencies`
'api': path.resolve('./src/ts/api'),
'app': path.resolve('./src/ts/app'),
'common': path.resolve('./src/ts/common'),
'styles': path.resolve('./src/scss'),
},
extensions: ['.ts', '.tsx', '.js'],
@ -50,6 +51,7 @@ module.exports = function (env, tsLoaderHappyPackMode) {
},
resolve: typescriptResolve,
devtool: 'source-map',
mode: 'development',
plugins: plugins,
module: {
rules: [

View File

@ -7,6 +7,7 @@ const StyleLintPlugin = require('stylelint-webpack-plugin');
module.exports = function(env) {
var generatedConfig = config(env, false);
generatedConfig.mode = 'production';
generatedConfig.plugins = [
new webpack.LoaderOptionsPlugin({
minimize: true

View File

@ -673,6 +673,13 @@
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-transform-typescript" "^7.1.0"
"@babel/runtime@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f"
integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2":
version "7.2.2"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907"
@ -719,6 +726,11 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
"@types/node@^10.12.18":
version "10.12.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
@ -736,6 +748,14 @@
dependencies:
"@types/react" "*"
"@types/react-redux@^6.0.12":
version "6.0.12"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.12.tgz#f3e9a400b8d40db43ffd8949ce14db4aa17a53ce"
integrity sha512-fvcpm7cfW/JMflRdZgegCVbSGYt/hyEWQKriesaLZDRDjBGKQsAiui08VCQg5lBpocPmulVGKFhICtOAcMUPOQ==
dependencies:
"@types/react" "*"
redux "^4.0.0"
"@types/react@*", "@types/react@^16.7.18":
version "16.7.18"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.18.tgz#f4ce0d539a893dd61e36cd11ae3a5e54f5a48337"
@ -1964,6 +1984,11 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deepmerge@^2.0.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
define-properties@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@ -2813,6 +2838,13 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
hoist-non-react-statics@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e"
integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw==
dependencies:
react-is "^16.3.2"
homedir-polyfill@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
@ -2981,7 +3013,7 @@ interpret@^1.1.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
invariant@^2.2.2:
invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@ -3487,7 +3519,7 @@ longest-streak@^2.0.1:
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e"
integrity sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@ -4686,6 +4718,23 @@ react-dom@^16.7.0:
prop-types "^15.6.2"
scheduler "^0.12.0"
react-is@^16.3.2, react-is@^16.6.3:
version "16.7.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa"
integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==
react-redux@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz#09e86eeed5febb98e9442458ad2970c8f1a173ef"
integrity sha512-EmbC3uLl60pw2VqSSkj6HpZ6jTk12RMrwXMBdYtM6niq0MdEaRq9KYCwpJflkOZj349BLGQm1MI/JO1W96kLWQ==
dependencies:
"@babel/runtime" "^7.2.0"
hoist-non-react-statics "^3.2.1"
invariant "^2.2.4"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react-is "^16.6.3"
react@^16.7.0:
version "16.7.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381"
@ -4777,6 +4826,19 @@ redent@^2.0.0:
indent-string "^3.0.0"
strip-indent "^2.0.0"
redux-thunk@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
redux@^4.0.0, redux@^4.0.1:
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"
regenerate-unicode-properties@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
@ -5613,6 +5675,11 @@ svg-tags@^1.0.0:
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
table@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/table/-/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837"
@ -5808,6 +5875,17 @@ ts-node@^7.0.1:
source-map-support "^0.5.6"
yn "^2.0.0"
tsconfig-paths@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.7.0.tgz#02ae978db447b22e09dafcd4198be95c4885ceb2"
integrity sha512-7iE+Q/2E1lgvxD+c0Ot+GFFmgmfIjt/zCayyruXkXQ84BLT85gHXy0WSoQSiuFX9+d+keE/jiON7notV74ZY+A==
dependencies:
"@types/json5" "^0.0.29"
deepmerge "^2.0.1"
json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"
tslib@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
@ -5909,6 +5987,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typesafe-actions@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/typesafe-actions/-/typesafe-actions-3.0.0.tgz#8b162ea11fa7383d4b4d96afc181118e84e06e10"
integrity sha512-NLpRc/FY+jPfWL0aUXQzjxPyF0Xug2om6akaoRLQ18KGwP2yYNBJu9vkv2q1q+Cx/+edy2Qf6O8xXnYY/xwz1A==
typescript@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5"