├── .eslintrc.json ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── images └── screenshot.png ├── index.d.ts ├── package.json ├── src ├── components │ ├── Action.tsx │ ├── Environment.tsx │ ├── Pipeline.tsx │ └── Stage.tsx ├── css │ └── index.css ├── index.ts ├── models │ ├── ActionModel.ts │ ├── ArtifactModel.ts │ ├── EnvironmentModel.ts │ ├── LogModel.ts │ ├── PipelineModel.ts │ ├── ReturnStatus.ts │ └── StageModel.ts └── services │ ├── CWLogsService.ts │ ├── CodeBuildService.ts │ └── CodePipelineService.ts ├── tsconfig.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:react/recommended", 5 | "plugin:@typescript-eslint/recommended", 6 | "prettier/@typescript-eslint", 7 | "plugin:prettier/recommended" 8 | ], 9 | "plugins": ["react", "@typescript-eslint", "prettier"], 10 | "env": { 11 | "browser": true, 12 | "jasmine": true, 13 | "jest": true 14 | }, 15 | "rules": { 16 | "prettier/prettier": ["error", { "singleQuote": true }] 17 | }, 18 | "settings": { 19 | "react": { 20 | "pragma": "React", 21 | "version": "detect" 22 | } 23 | }, 24 | "parser": "@typescript-eslint/parser" 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # production 5 | /lib 6 | 7 | # misc 8 | .DS_Store 9 | .env.local 10 | .env.development.local 11 | .env.test.local 12 | .env.production.local 13 | 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.validate": [ 3 | "javascript", 4 | "javascriptreact", 5 | "typescript", 6 | "typescriptreact" 7 | ], 8 | "prettier.singleQuote": true 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Assignar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-aws-dashboard-codepipeline 2 | 3 | A react component which provides an graphical interface to adminster AWS CodePipeline. This is completely client side and requires no backend code to function. 4 | 5 | This component can be used standalone, or in combination with [react-aws-dashboard](https://github.com/assignar/react-aws-dashboard) if you want to be able to switch between multiple AWS environments. 6 | 7 | ## Installation 8 | 9 | ``` 10 | yarn add react-aws-dashboard-codepipeline 11 | ``` 12 | 13 | ## Features 14 | 15 | - Restart Pipelines 16 | - Restart Stages 17 | - Get CodeBuild Logs 18 | - Show Git source provider commit details 19 | - Show Deployment details 20 | - Search Pipelines 21 | 22 | 23 | 24 | ## Example (with create-react-app) 25 | 26 | 1. Create new react app and add react-aws-dashboard-codepipeline 27 | ```bash 28 | yarn create react-app my-app --template typescript 29 | cd my-app 30 | yarn add react-aws-dashboard-codepipeline aws-sdk 31 | ``` 32 | 33 | 2. Replace src/App.tsx with the following code importing the react-aws-dashboard-codepipeline component. 34 | ```typescript 35 | import React from "react"; 36 | import AWS from "aws-sdk"; 37 | import Environment from "react-aws-dashboard-codepipeline"; 38 | 39 | const App: React.FC = () => { 40 | const config = new AWS.Config(); 41 | config.accessKeyId = "AKIAIOSFODNN7EXAMPLE"; 42 | config.secretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"; 43 | config.region = "ap-southeast-2"; 44 | 45 | return ; 46 | }; 47 | 48 | export default App; 49 | ``` 50 | 51 | 3. Run the example 52 | ```bash 53 | yarn start 54 | ``` 55 | 56 | Please note, due to the sensitive nature of the AWS credentials, this example is only suitable to run locally and should never be deployed to a remote location. [Consider using AWS Cognito or Federated Identities](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-browser-credentials-federated-id.html) if you wish to deploy this solution to a website. 57 | 58 | ## Screenshot 59 | 60 | ![Screenshot](https://raw.githubusercontent.com/assignar/react-aws-dashboard-codepipeline/master/images/screenshot.png?token=AJ2OJHTP3N7YSQ5HCXBC5BS6HODUY) 61 | -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/assignar/react-aws-dashboard-codepipeline/dbfaddfaa3f82d5e592d4a4efc8cb29db742f21b/images/screenshot.png -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { EnvironmentModel as EnvironmentProps } from './src/models/EnvironmentModel'; 3 | 4 | declare class Environment extends React.Component {} 5 | 6 | declare module 'react-aws-dashboard-codepipeline' {} 7 | 8 | export default Environment; 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-aws-dashboard-codepipeline", 3 | "version": "1.0.5", 4 | "description": "View AWS CodePipeline resources", 5 | "repository": "git@github.com:assignar/react-aws-dashboard-codepipeline.git", 6 | "author": "c-py ", 7 | "license": "MIT", 8 | "main": "lib/index.js", 9 | "files": [ 10 | "lib", 11 | "index.d.ts" 12 | ], 13 | "scripts": { 14 | "build": "rm -rf ./lib && tsc", 15 | "postbuild": "cp -r ./src/css ./lib/css", 16 | "lint": "eslint '*/**/*.{ts,tsx}' --quiet --fix", 17 | "prepare": "yarn lint && yarn build" 18 | }, 19 | "devDependencies": { 20 | "@types/classnames": "^2.2.9", 21 | "@types/lodash": "^4.14.149", 22 | "@types/lscache": "^1.3.0", 23 | "@types/node": "^13.5.0", 24 | "@types/react": "^16.9.19", 25 | "@types/react-dom": "^16.9.5", 26 | "@typescript-eslint/eslint-plugin": "^2.18.0", 27 | "@typescript-eslint/parser": "^2.18.0", 28 | "aws-sdk": "^2.610.0", 29 | "eslint": "^6.8.0", 30 | "eslint-config-prettier": "^6.10.0", 31 | "eslint-config-react": "^1.1.7", 32 | "eslint-plugin-prettier": "^3.1.2", 33 | "eslint-plugin-react": "^7.18.0", 34 | "prettier": "^1.19.1", 35 | "react": "^16.12.0", 36 | "react-dom": "^16.12.0", 37 | "typescript": "^3.7.5" 38 | }, 39 | "dependencies": { 40 | "@fortawesome/fontawesome-svg-core": "^1.2.26", 41 | "@fortawesome/free-solid-svg-icons": "^5.12.0", 42 | "@fortawesome/react-fontawesome": "^0.1.8", 43 | "bulma": "^0.8.0", 44 | "classnames": "^2.2.6", 45 | "lodash": "^4.17.15", 46 | "lscache": "^1.3.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/components/Action.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { ActionModel } from '../models/ActionModel'; 3 | import classnames from 'classnames'; 4 | import { EnvironmentModel } from '../models/EnvironmentModel'; 5 | import { LogModel } from '../models/LogModel'; 6 | import { CodeBuildService } from '../services/CodeBuildService'; 7 | import { CWLogsService } from '../services/CWLogsService'; 8 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 9 | import { faAngleDown } from '@fortawesome/free-solid-svg-icons'; 10 | 11 | interface ActionProps { 12 | environment: EnvironmentModel; 13 | action: ActionModel; 14 | } 15 | 16 | async function getLogs( 17 | environment: EnvironmentModel, 18 | build: string 19 | ): Promise { 20 | const codeBuildService: CodeBuildService = new CodeBuildService(environment); 21 | let logs: LogModel | undefined = undefined; 22 | 23 | const cbResult = await codeBuildService.getBuildLogLocation(build); 24 | if (cbResult.fail) { 25 | console.error(cbResult.fail.message); 26 | } 27 | 28 | if (cbResult.success) { 29 | const logLocation: LogModel = cbResult.success.response as LogModel; 30 | const cwlService: CWLogsService = new CWLogsService(environment); 31 | const cwlResult = await cwlService.getLogs(logLocation); 32 | if (cwlResult.fail) { 33 | console.log(cwlResult.fail.message); 34 | } 35 | 36 | if (cwlResult.success) { 37 | logs = cwlResult.success.response as LogModel; 38 | } 39 | } 40 | return logs; 41 | } 42 | 43 | async function openLogs( 44 | environment: EnvironmentModel, 45 | build: string 46 | ): Promise { 47 | const o = window.open(); 48 | if (o !== null) { 49 | const response = await getLogs(environment, build); 50 | if (response) { 51 | o.document.write('
');
 52 |       o.document.write((response.logs as string[]).join(''));
 53 |       o.document.write('
'); 54 | } 55 | } 56 | } 57 | 58 | //https://stackoverflow.com/questions/8211744/convert-time-interval-given-in-seconds-into-more-human-readable-form 59 | function millisecondToHumanReadable(milliseconds: number): string { 60 | const seconds = milliseconds / 1000; 61 | const levels = [ 62 | [Math.floor(seconds / 31557600), 'years'], 63 | [Math.floor((seconds % 31557600) / 86400), 'days'], 64 | [Math.floor(((seconds % 31557600) % 86400) / 3600), 'hours'], 65 | [Math.floor((((seconds % 31557600) % 86400) % 3600) / 60), 'minutes'] 66 | ]; 67 | const calcSeconds = [ 68 | Math.floor((((seconds % 31536000) % 86400) % 3600) % 60), 69 | 'seconds' 70 | ]; 71 | let returntext = ''; 72 | 73 | for (let i = 0, max = levels.length; i < max; i++) { 74 | if (levels[i][0] === 0) continue; 75 | returntext += 76 | ' ' + 77 | levels[i][0] + 78 | ' ' + 79 | (levels[i][0] === 1 80 | ? (levels[i][1] as string).substr( 81 | 0, 82 | (levels[i][1] as string).length - 1 83 | ) 84 | : levels[i][1]); 85 | } 86 | returntext = returntext.trim(); 87 | if (returntext === '') { 88 | returntext = 89 | calcSeconds[0] + 90 | ' ' + 91 | (calcSeconds[0] === 1 92 | ? (calcSeconds[1] as string).substr( 93 | 0, 94 | (calcSeconds[1] as string).length - 1 95 | ) 96 | : calcSeconds[1]); 97 | } 98 | return returntext + ' ago'; 99 | } 100 | 101 | export const Action: React.FC = ({ 102 | environment, 103 | action 104 | }: ActionProps) => ( 105 |
112 |
113 |
114 |
115 | {action.name} ({action.type}) 116 |
117 |

118 | {action.statusTime && 119 | millisecondToHumanReadable( 120 | new Date().getTime() - new Date(action.statusTime).getTime() 121 | )} 122 |

123 |
124 |
125 | 133 | {action.status} 134 | 135 |
136 |
137 | {action.repo &&

Repository: {action.repo}

} 138 | {action.branch &&

Branch: {action.branch}

} 139 | {action.details && ( 140 |
141 |
142 | 153 |
154 | 159 |
160 | )} 161 | {action.type === 'CodeBuild' && window !== null && ( 162 | 170 | )} 171 |
172 |
173 | ); 174 | -------------------------------------------------------------------------------- /src/components/Environment.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useState, useEffect } from 'react'; 3 | import { CodePipelineService } from '../services/CodePipelineService'; 4 | import { Pipeline } from './Pipeline'; 5 | import { PipelineModel } from '../models/PipelineModel'; 6 | import { EnvironmentModel as EnvironmentProps } from '../models/EnvironmentModel'; 7 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 8 | import { faTimes } from '@fortawesome/free-solid-svg-icons'; 9 | 10 | async function getPipelines( 11 | codePipeline: CodePipelineService 12 | ): Promise { 13 | const result = await codePipeline.listPipelines(); 14 | if (result.success) { 15 | return result.success.response as PipelineModel[]; 16 | } 17 | if (result.fail) { 18 | console.error(result.fail.message); 19 | } 20 | return undefined; 21 | } 22 | 23 | export const Environment: React.FC = environment => { 24 | const [loading, setLoading] = useState(true); 25 | const [searchString, setSearchString] = useState(''); 26 | const [pipelines, setPipelines] = useState([]); 27 | 28 | useEffect(() => { 29 | let cancelled = false; 30 | const fetchData = async (): Promise => { 31 | setLoading(true); 32 | if (!cancelled) { 33 | const codePipeline: CodePipelineService = new CodePipelineService( 34 | environment.config 35 | ); 36 | const result = await getPipelines(codePipeline); 37 | console.log(result); 38 | if (result) setPipelines(result); 39 | setSearchString(''); 40 | setLoading(false); 41 | } 42 | }; 43 | fetchData(); 44 | return (): void => { 45 | cancelled = true; 46 | }; 47 | }, [environment.name]); 48 | 49 | return ( 50 |
51 |

{environment.name}

52 | {loading && ( 53 | 57 | 15% 58 | 59 | )} 60 | {!loading && ( 61 |
62 |
63 |
64 |
65 | setSearchString(e.target.value)} 71 | /> 72 |
73 | 81 |
82 |
83 | {pipelines && 84 | pipelines 85 | .filter(pipe => pipe.name.includes(searchString)) 86 | .map((pipeline: PipelineModel) => ( 87 |
91 | 96 |
97 | ))} 98 |
99 | )} 100 |
101 | ); 102 | }; 103 | export default Environment; 104 | -------------------------------------------------------------------------------- /src/components/Pipeline.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useState, useEffect } from 'react'; 3 | import * as Cache from 'lscache'; 4 | import { CodePipelineService } from '../services/CodePipelineService'; 5 | import { PipelineModel } from '../models/PipelineModel'; 6 | import * as _ from 'lodash'; 7 | import { EnvironmentModel } from '../models/EnvironmentModel'; 8 | import { StageModel } from '../models/StageModel'; 9 | import { Stage } from './Stage'; 10 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; 11 | import { faRedo } from '@fortawesome/free-solid-svg-icons'; 12 | 13 | interface PipelineProps { 14 | pipeline: PipelineModel; 15 | environment: EnvironmentModel; 16 | } 17 | 18 | async function restartPipeline( 19 | callback: Function, 20 | pipeline: PipelineModel, 21 | environment: EnvironmentModel 22 | ): Promise { 23 | const codepipeline = new CodePipelineService(environment.config); 24 | const result = await codepipeline.startPipelineExecution(pipeline); 25 | if (result.fail) { 26 | console.error(result.fail.message); 27 | } 28 | callback(true); 29 | } 30 | 31 | async function getPipeline( 32 | pipeline: PipelineModel, 33 | environment: EnvironmentModel, 34 | force: boolean 35 | ): Promise { 36 | Cache.setExpiryMilliseconds(1000); 37 | Cache.setBucket(environment.name); 38 | 39 | const cachedPipeline = Cache.get(pipeline.name); 40 | if (cachedPipeline && !force) return cachedPipeline; 41 | 42 | const codepipeline = new CodePipelineService(environment.config); 43 | let mergedPipeline: PipelineModel | undefined = undefined; 44 | 45 | const pipelineResult = await codepipeline.getPipeline(pipeline.name); 46 | if (pipelineResult.fail) { 47 | console.error(pipelineResult.fail.message); 48 | } 49 | const stateResult = await codepipeline.getPipelineState(pipeline.name); 50 | if (stateResult.fail) { 51 | console.error(stateResult.fail.message); 52 | } 53 | 54 | if (pipelineResult.success && stateResult.success) { 55 | mergedPipeline = _.merge( 56 | pipelineResult.success.response, 57 | stateResult.success.response 58 | ) as PipelineModel; 59 | 60 | Cache.setBucket(environment.name); 61 | Cache.set(pipeline.name, mergedPipeline, 10); 62 | } 63 | return mergedPipeline; 64 | } 65 | 66 | export const Pipeline: React.FC = ({ 67 | pipeline, 68 | environment 69 | }: PipelineProps) => { 70 | const [pipelineState, setPipelineState] = useState(); 71 | const [bustCache, setBustCache] = useState(false); 72 | const [refreshInterval, setRefreshInterval] = useState(60 * 1000); 73 | 74 | useEffect(() => { 75 | const fetchData = async (): Promise => { 76 | const p = await getPipeline(pipeline, environment, bustCache); 77 | // If any of the pipeline stages are in progess, set the refresh rate to 5 seconds. 78 | if (p && p.stages) { 79 | const inprogress = !p.stages.every( 80 | (stage: StageModel) => stage.status !== 'InProgress' 81 | ); 82 | if (inprogress) { 83 | setRefreshInterval(5 * 1000); 84 | } else { 85 | setRefreshInterval(60 * 1000); 86 | } 87 | setPipelineState(p); 88 | setBustCache(false); 89 | } 90 | }; 91 | 92 | // Fetch Data Immediately 93 | fetchData(); 94 | // Fetch Data every refreshInterval milliseconds 95 | const timerId = setInterval(fetchData, refreshInterval); 96 | 97 | return (): void => clearInterval(timerId); 98 | }, [pipeline, environment, refreshInterval, bustCache]); 99 | 100 | return ( 101 | <> 102 | {pipelineState && ( 103 | <> 104 |
105 |
106 |
107 |
108 |
{pipeline.name}
109 |
110 | 115 |
116 |
117 |
    118 | {pipelineState.stages && 119 | pipelineState.stages.map((stage: StageModel) => ( 120 | 127 | ))} 128 |
129 | 137 |
138 | 139 | )} 140 | 141 | ); 142 | }; 143 | -------------------------------------------------------------------------------- /src/components/Stage.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useState, useEffect } from 'react'; 3 | import * as Cache from 'lscache'; 4 | import { StageModel } from '../models/StageModel'; 5 | import { ActionModel } from '../models/ActionModel'; 6 | import classnames from 'classnames'; 7 | import { EnvironmentModel } from '../models/EnvironmentModel'; 8 | import { PipelineModel } from '../models/PipelineModel'; 9 | import { CodePipelineService } from '../services/CodePipelineService'; 10 | import { Action } from './Action'; 11 | import { ArtifactModel } from '../models/ArtifactModel'; 12 | 13 | interface StageProps { 14 | callback: (state: boolean) => void; 15 | stage: StageModel; 16 | pipeline: PipelineModel; 17 | environment: EnvironmentModel; 18 | } 19 | 20 | async function getArtifact( 21 | props: StageProps 22 | ): Promise { 23 | Cache.setExpiryMilliseconds(1000); 24 | Cache.setBucket(props.environment.name); 25 | const cachedArtifact = Cache.get(props.stage.id as string); 26 | if (cachedArtifact) return cachedArtifact; 27 | 28 | const codepipeline = new CodePipelineService(props.environment.config); 29 | const result = await codepipeline.getPipelineExecution( 30 | props.pipeline, 31 | props.stage 32 | ); 33 | 34 | let resultArtifact: ArtifactModel | undefined = undefined; 35 | if (result.fail) { 36 | console.error(result.fail.message); 37 | } 38 | 39 | if (result.success) { 40 | resultArtifact = result.success.response as ArtifactModel; 41 | Cache.setBucket(props.environment.name); 42 | Cache.set(props.stage.id as string, resultArtifact, 30); 43 | } 44 | 45 | return resultArtifact; 46 | } 47 | 48 | async function retryStage(props: StageProps): Promise { 49 | const codepipeline = new CodePipelineService(props.environment.config); 50 | const result = await codepipeline.retryStageExecution( 51 | props.pipeline, 52 | props.stage 53 | ); 54 | if (result.fail) { 55 | console.error(result.fail.message); 56 | } 57 | props.callback(true); 58 | } 59 | 60 | export const Stage: React.FC = ({ 61 | callback, 62 | stage, 63 | pipeline, 64 | environment 65 | }: StageProps) => { 66 | const [artifact, setArtifact] = useState(); 67 | 68 | useEffect(() => { 69 | let cancelled = false; 70 | 71 | const fetchData = async (): Promise => { 72 | if (!cancelled) { 73 | const artifact = await getArtifact({ 74 | callback, 75 | stage, 76 | pipeline, 77 | environment 78 | }); 79 | setArtifact(artifact); 80 | } 81 | }; 82 | fetchData(); 83 | return (): void => { 84 | cancelled = true; 85 | }; 86 | }, [callback, pipeline, stage, environment]); 87 | 88 | return ( 89 |
  • 96 |
    97 |
    98 |
    99 |
    {stage.name}
    100 | 101 | {stage.status === 'Failed' && ( 102 | 110 | )} 111 |
    112 |
    113 | 123 | {stage.status} 124 | 125 |
    126 |
    127 |
    128 |
    129 | {artifact && ( 130 | <> 131 | Artifact: 132 | {artifact.id.substring(0, 7)} 133 | 134 | )} 135 |
    136 |
    137 | {stage.actions.map((action: ActionModel) => ( 138 | 139 | ))} 140 |
    141 |
  • 142 | ); 143 | }; 144 | -------------------------------------------------------------------------------- /src/css/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | margin: 0; 5 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 6 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 7 | sans-serif; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | } 11 | 12 | code { 13 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 14 | monospace; 15 | } 16 | 17 | .pipeline { 18 | background: #fff; 19 | border: 1px solid #999; 20 | padding: 0; 21 | width: 220px; 22 | height: 220px; 23 | background: white; 24 | float: left; 25 | margin: 10px; 26 | } 27 | 28 | .pipeline h3 { 29 | display: inline; 30 | float: none; 31 | } 32 | 33 | .date { 34 | font-size: xx-small; 35 | } 36 | 37 | .navbar.is-light .navbar-start > a.navbar-item:hover { 38 | color: white; 39 | background-color: #555; 40 | } 41 | 42 | .navbar-selected { 43 | background-color: #e8e8e8; 44 | } 45 | 46 | .columns-container { 47 | margin-left: -0.75rem; 48 | margin-right: -0.75rem; 49 | } 50 | 51 | .pipeline-column { 52 | display: inline-block; 53 | vertical-align: top; 54 | } 55 | 56 | .progress-loader { 57 | margin-top: 0.75rem; 58 | } 59 | 60 | .newlines { 61 | white-space: pre; 62 | } 63 | 64 | .stage { 65 | border-left-width: 8px; 66 | border-left-style: solid; 67 | } 68 | 69 | .stage.danger { 70 | border-left-color: hsl(348, 100%, 61%); 71 | } 72 | 73 | .stage.success { 74 | border-left-color: hsl(141, 71%, 48%); 75 | } 76 | 77 | .stage.info { 78 | border-left-color: hsl(204, 86%, 53%); 79 | } 80 | 81 | div.action { 82 | border-width: 0px 0px 0px 4px; 83 | padding-left: 4px; 84 | border-style: solid; 85 | border-color: rgb(219, 219, 219); 86 | } 87 | 88 | div.action.danger { 89 | border-left-color: hsl(348, 100%, 61%); 90 | } 91 | 92 | div.action.success { 93 | border-left-color: hsl(141, 71%, 48%); 94 | } 95 | 96 | div.action.info { 97 | border-left-color: hsl(204, 86%, 53%); 98 | } 99 | 100 | button.shift-button { 101 | margin-right: 12px; 102 | margin-top: 5px; 103 | } 104 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import 'bulma/css/bulma.css'; 2 | import './css/index.css'; 3 | 4 | export * from './components/Environment'; 5 | -------------------------------------------------------------------------------- /src/models/ActionModel.ts: -------------------------------------------------------------------------------- 1 | export interface ActionModel { 2 | name: string; 3 | id?: string; 4 | type?: string; 5 | status?: string; 6 | details?: string; 7 | statusTime?: Date; 8 | branch?: string; 9 | repo?: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/models/ArtifactModel.ts: -------------------------------------------------------------------------------- 1 | export interface ArtifactModel { 2 | name: string; 3 | id: string; 4 | summary: string; 5 | url: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/models/EnvironmentModel.ts: -------------------------------------------------------------------------------- 1 | import * as AWS from 'aws-sdk'; 2 | 3 | export interface EnvironmentModel { 4 | name: string; 5 | config: AWS.Config; 6 | } 7 | -------------------------------------------------------------------------------- /src/models/LogModel.ts: -------------------------------------------------------------------------------- 1 | export interface LogModel { 2 | logGroup: string; 3 | logStream: string; 4 | logs?: string[]; 5 | } 6 | -------------------------------------------------------------------------------- /src/models/PipelineModel.ts: -------------------------------------------------------------------------------- 1 | import { StageModel } from './StageModel'; 2 | 3 | export interface PipelineModel { 4 | name: string; 5 | version: number; 6 | stages: StageModel[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/models/ReturnStatus.ts: -------------------------------------------------------------------------------- 1 | import { PipelineModel } from './PipelineModel'; 2 | import { EnvironmentModel } from './EnvironmentModel'; 3 | import { LogModel } from './LogModel'; 4 | import { ArtifactModel } from './ArtifactModel'; 5 | 6 | export interface ReturnStatus { 7 | fail?: { 8 | message: string; 9 | }; 10 | success?: { 11 | response: 12 | | PipelineModel[] 13 | | PipelineModel 14 | | EnvironmentModel 15 | | LogModel 16 | | ArtifactModel 17 | | undefined; 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /src/models/StageModel.ts: -------------------------------------------------------------------------------- 1 | import { ActionModel } from './ActionModel'; 2 | 3 | export interface StageModel { 4 | name: string; 5 | id?: string; 6 | status?: string; 7 | actions: ActionModel[]; 8 | } 9 | -------------------------------------------------------------------------------- /src/services/CWLogsService.ts: -------------------------------------------------------------------------------- 1 | import * as AWS from 'aws-sdk'; 2 | import { EnvironmentModel } from '../models/EnvironmentModel'; 3 | import { LogModel } from '../models/LogModel'; 4 | import { ReturnStatus } from '../models/ReturnStatus'; 5 | import { OutputLogEvent } from 'aws-sdk/clients/cloudwatchlogs'; 6 | 7 | export class CWLogsService { 8 | private client: AWS.CloudWatchLogs; 9 | 10 | constructor(environment: EnvironmentModel) { 11 | this.client = new AWS.CloudWatchLogs(environment.config); 12 | } 13 | 14 | public getLogs(logLocation: LogModel): Promise { 15 | return this.client 16 | .getLogEvents({ 17 | logGroupName: logLocation.logGroup, 18 | logStreamName: logLocation.logStream 19 | }) 20 | .promise() 21 | .then(function(data: AWS.CloudWatchLogs.GetLogEventsResponse) { 22 | if (!data.events) { 23 | const error: ReturnStatus = { 24 | fail: { message: 'Could not find logs' } 25 | }; 26 | return error; 27 | } 28 | 29 | function convertTimestamp(timestamp: number): string { 30 | const d = new Date(timestamp); // Convert the passed timestamp to milliseconds 31 | const yyyy = d.getFullYear(), 32 | mm = ('0' + (d.getMonth() + 1)).slice(-2), // Months are zero based. Add leading 0. 33 | dd = ('0' + d.getDate()).slice(-2), // Add leading 0. 34 | hh = d.getHours(), 35 | min = ('0' + d.getMinutes()).slice(-2); // Add leading 0. 36 | 37 | let h = hh, 38 | ampm = 'AM'; 39 | 40 | if (hh > 12) { 41 | h = hh - 12; 42 | ampm = 'PM'; 43 | } else if (hh === 12) { 44 | h = 12; 45 | ampm = 'PM'; 46 | } else if (hh === 0) { 47 | h = 12; 48 | } 49 | 50 | // ie: 2013-02-18, 8:35 AM 51 | return yyyy + '-' + mm + '-' + dd + ', ' + h + ':' + min + ' ' + ampm; 52 | } 53 | 54 | const logs: LogModel = { 55 | logs: data.events.map((event: OutputLogEvent) => { 56 | return ( 57 | convertTimestamp(event.timestamp as number) + ': ' + event.message 58 | ); 59 | }), 60 | logStream: logLocation.logStream, 61 | logGroup: logLocation.logGroup 62 | }; 63 | 64 | const success: ReturnStatus = { 65 | success: { response: logs } 66 | }; 67 | return success; 68 | }) 69 | .catch(function(err: AWS.AWSError) { 70 | const error: ReturnStatus = { 71 | fail: { message: err.message } 72 | }; 73 | return error; 74 | }); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/services/CodeBuildService.ts: -------------------------------------------------------------------------------- 1 | import * as AWS from 'aws-sdk'; 2 | import { ReturnStatus } from '../models/ReturnStatus'; 3 | import { LogModel } from '../models/LogModel'; 4 | import { EnvironmentModel } from '../models/EnvironmentModel'; 5 | 6 | export class CodeBuildService { 7 | private client: AWS.CodeBuild; 8 | 9 | constructor(environment: EnvironmentModel) { 10 | this.client = new AWS.CodeBuild(environment.config); 11 | } 12 | 13 | public getBuildLogLocation(build: string): Promise { 14 | return this.client 15 | .batchGetBuilds({ ids: [build] }) 16 | .promise() 17 | .then(function(data: AWS.CodeBuild.BatchGetBuildsOutput) { 18 | if (!data.builds || !data.builds[0] || !data.builds[0].logs) { 19 | const error: ReturnStatus = { 20 | fail: { 21 | message: 'Could not find log details' 22 | } 23 | }; 24 | return error; 25 | } 26 | 27 | const logLocation: LogModel = { 28 | logGroup: data.builds[0].logs.groupName as string, 29 | logStream: data.builds[0].logs.streamName as string 30 | }; 31 | 32 | const success: ReturnStatus = { 33 | success: { response: logLocation } 34 | }; 35 | return success; 36 | }) 37 | .catch(function(err: AWS.AWSError) { 38 | const error: ReturnStatus = { 39 | fail: { message: err.message } 40 | }; 41 | return error; 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/services/CodePipelineService.ts: -------------------------------------------------------------------------------- 1 | import * as AWS from 'aws-sdk'; 2 | import { ReturnStatus } from '../models/ReturnStatus'; 3 | import { PipelineModel } from '../models/PipelineModel'; 4 | import { 5 | StageState, 6 | PipelineSummary, 7 | ActionState, 8 | PipelineDeclaration, 9 | StageDeclaration, 10 | ActionDeclaration, 11 | ActionExecution, 12 | ArtifactRevision 13 | } from 'aws-sdk/clients/codepipeline'; 14 | import { StageModel } from '../models/StageModel'; 15 | import { ArtifactModel } from '../models/ArtifactModel'; 16 | 17 | export class CodePipelineService { 18 | private client: AWS.CodePipeline; 19 | 20 | constructor(config: AWS.Config) { 21 | this.client = new AWS.CodePipeline(config); 22 | } 23 | 24 | public getPipelineExecution( 25 | pipeline: PipelineModel, 26 | stage: StageModel 27 | ): Promise { 28 | return this.client 29 | .getPipelineExecution({ 30 | pipelineName: pipeline.name, 31 | pipelineExecutionId: stage.id as string 32 | }) 33 | .promise() 34 | .then(function(data: AWS.CodePipeline.GetPipelineExecutionOutput) { 35 | if ( 36 | !data.pipelineExecution || 37 | !data.pipelineExecution.artifactRevisions 38 | ) { 39 | const error: ReturnStatus = { 40 | fail: { message: 'could not find execution details' } 41 | }; 42 | return error; 43 | } 44 | //TODO support multiple revisions 45 | const artifactRevision: ArtifactRevision = 46 | data.pipelineExecution.artifactRevisions[0]; 47 | const artifact: ArtifactModel = { 48 | name: artifactRevision.name as string, 49 | id: artifactRevision.revisionId as string, 50 | summary: artifactRevision.revisionSummary as string, 51 | url: artifactRevision.revisionUrl as string 52 | }; 53 | const success: ReturnStatus = { 54 | success: { response: artifact } 55 | }; 56 | return success; 57 | }) 58 | .catch(function(err: AWS.AWSError) { 59 | const error: ReturnStatus = { 60 | fail: { message: err.message } 61 | }; 62 | return error; 63 | }); 64 | } 65 | 66 | public startPipelineExecution( 67 | pipeline: PipelineModel 68 | ): Promise { 69 | return this.client 70 | .startPipelineExecution({ name: pipeline.name }) 71 | .promise() 72 | .then(function() { 73 | const success: ReturnStatus = { 74 | success: { 75 | response: undefined 76 | } 77 | }; 78 | return success; 79 | }) 80 | .catch(function(err: AWS.AWSError) { 81 | const error: ReturnStatus = { 82 | fail: { 83 | message: err.message 84 | } 85 | }; 86 | return error; 87 | }); 88 | } 89 | 90 | public retryStageExecution( 91 | pipeline: PipelineModel, 92 | stage: StageModel 93 | ): Promise { 94 | return this.client 95 | .retryStageExecution({ 96 | pipelineExecutionId: stage.id as string, 97 | pipelineName: pipeline.name, 98 | retryMode: 'FAILED_ACTIONS', 99 | stageName: stage.name 100 | }) 101 | .promise() 102 | .then(function() { 103 | const success: ReturnStatus = { 104 | success: { response: undefined } 105 | }; 106 | return success; 107 | }) 108 | .catch(function(err: AWS.AWSError) { 109 | const error: ReturnStatus = { 110 | fail: { message: err.message } 111 | }; 112 | return error; 113 | }); 114 | } 115 | 116 | public listPipelines(): Promise { 117 | return this.client 118 | .listPipelines({}) 119 | .promise() 120 | .then(function(data: AWS.CodePipeline.ListPipelinesOutput) { 121 | const pipelines: PipelineModel[] = (data.pipelines as PipelineSummary[]).map( 122 | (pipeline: PipelineSummary) => { 123 | return { 124 | name: pipeline.name as string, 125 | version: pipeline.version as number, 126 | stages: [] 127 | }; 128 | } 129 | ); 130 | 131 | const success: ReturnStatus = { 132 | success: { response: pipelines } 133 | }; 134 | return success; 135 | }) 136 | .catch(function(err: AWS.AWSError) { 137 | const error: ReturnStatus = { 138 | fail: { message: err.message } 139 | }; 140 | return error; 141 | }); 142 | } 143 | 144 | public getPipeline(name: string): Promise { 145 | return this.client 146 | .getPipeline({ name: name }) 147 | .promise() 148 | .then(function(data: AWS.CodePipeline.GetPipelineOutput) { 149 | const pipelineData: PipelineDeclaration = data.pipeline as PipelineDeclaration; 150 | //Map AWS objects into our models 151 | const pipeline: PipelineModel = { 152 | name: pipelineData.name, 153 | version: pipelineData.version as number, 154 | stages: pipelineData.stages.map((stage: StageDeclaration) => { 155 | return { 156 | name: stage.name, 157 | status: undefined, 158 | actions: stage.actions.map((action: ActionDeclaration) => { 159 | return { 160 | name: action.name, 161 | type: action.actionTypeId.provider, 162 | version: action.actionTypeId.version, 163 | branch: action.configuration 164 | ? action.configuration.Branch 165 | : undefined, 166 | repo: action.configuration 167 | ? action.configuration.Repo 168 | : undefined 169 | }; 170 | }) 171 | }; 172 | }) 173 | }; 174 | 175 | const success: ReturnStatus = { 176 | success: { response: pipeline } 177 | }; 178 | return success; 179 | }) 180 | .catch(function(err: AWS.AWSError) { 181 | const error: ReturnStatus = { 182 | fail: { message: err.message } 183 | }; 184 | return error; 185 | }); 186 | } 187 | 188 | public getPipelineState(name: string): Promise { 189 | return this.client 190 | .getPipelineState({ name: name }) 191 | .promise() 192 | .then(function(data: AWS.CodePipeline.GetPipelineStateOutput) { 193 | function getLatestExectionDetails( 194 | latestExecution?: ActionExecution 195 | ): string | undefined { 196 | if (!latestExecution) { 197 | return ''; 198 | } 199 | 200 | if (latestExecution.status === 'Failed') { 201 | return latestExecution.errorDetails 202 | ? latestExecution.errorDetails.message 203 | : ''; 204 | } 205 | 206 | return latestExecution.summary; 207 | } 208 | 209 | //Map AWS objects into our models 210 | const pipeline: PipelineModel = { 211 | name: data.pipelineName as string, 212 | version: data.pipelineVersion as number, 213 | stages: (data.stageStates as StageState[]).map( 214 | (stage: StageState) => { 215 | return { 216 | name: stage.stageName as string, 217 | id: stage.latestExecution 218 | ? stage.latestExecution.pipelineExecutionId 219 | : undefined, 220 | status: stage.latestExecution 221 | ? stage.latestExecution.status 222 | : 'Unknown', 223 | actions: (stage.actionStates as ActionState[]).map( 224 | (actionState: ActionState) => { 225 | return { 226 | name: actionState.actionName as string, 227 | id: actionState.latestExecution 228 | ? actionState.latestExecution.externalExecutionId 229 | : undefined, 230 | status: actionState.latestExecution 231 | ? actionState.latestExecution.status 232 | : 'Unknown', 233 | details: getLatestExectionDetails( 234 | actionState.latestExecution 235 | ), 236 | statusTime: actionState.latestExecution 237 | ? actionState.latestExecution.lastStatusChange 238 | : undefined 239 | }; 240 | } 241 | ) 242 | }; 243 | } 244 | ) 245 | }; 246 | 247 | const success: ReturnStatus = { 248 | success: { response: pipeline } 249 | }; 250 | return success; 251 | }) 252 | .catch(function(err: AWS.AWSError) { 253 | const error: ReturnStatus = { 254 | fail: { message: err.message } 255 | }; 256 | return error; 257 | }); 258 | } 259 | } 260 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./lib", 4 | "target": "es5", 5 | "module": "commonjs", 6 | "noImplicitAny": true, 7 | "strictNullChecks": true, 8 | "removeComments": true, 9 | "declaration": false, 10 | "sourceMap": true, 11 | "jsx": "react", 12 | "typeRoots": [ 13 | "index.d.ts", 14 | "node_modules/@types" 15 | ] 16 | }, 17 | "include": [ 18 | "./src/**/*.tsx", 19 | "./src/**/*.ts" 20 | ], 21 | "exclude": [ 22 | "node_modules" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== 9 | dependencies: 10 | "@babel/highlight" "^7.8.3" 11 | 12 | "@babel/highlight@^7.8.3": 13 | version "7.8.3" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" 15 | integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@fortawesome/fontawesome-common-types@^0.2.26": 22 | version "0.2.26" 23 | resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz#6e0b13a752676036f8196f8a1500d53a27b4adc1" 24 | integrity sha512-CcM/fIFwZlRdiWG/25xE/wHbtyUuCtqoCTrr6BsWw7hH072fR++n4L56KPydAr3ANgMJMjT8v83ZFIsDc7kE+A== 25 | 26 | "@fortawesome/fontawesome-svg-core@^1.2.26": 27 | version "1.2.26" 28 | resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.26.tgz#671569271d6b532cdea5e3deb8ff16f8b7ac251d" 29 | integrity sha512-3Dfd/v2IztP1TxKOxZiB5+4kaOZK9mNy0KU1vVK7nFlPWz3gzxrCWB+AloQhQUoJ8HhGqbzjliK89Vl7PExGbw== 30 | dependencies: 31 | "@fortawesome/fontawesome-common-types" "^0.2.26" 32 | 33 | "@fortawesome/free-solid-svg-icons@^5.12.0": 34 | version "5.12.0" 35 | resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.0.tgz#8decac5844e60453cc0c7c51437d1461df053a35" 36 | integrity sha512-CnpsWs6GhTs9ekNB3d8rcO5HYqRkXbYKf2YNiAlTWbj5eVlPqsd/XH1F9If8jkcR1aegryAbln/qYeKVZzpM0g== 37 | dependencies: 38 | "@fortawesome/fontawesome-common-types" "^0.2.26" 39 | 40 | "@fortawesome/react-fontawesome@^0.1.8": 41 | version "0.1.8" 42 | resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.8.tgz#cb6d4dd3aeec45b6ff2d48c812317a6627618511" 43 | integrity sha512-I5h9YQg/ePA3Br9ISS18fcwOYmzQYDSM1ftH03/8nHkiqIVHtUyQBw482+60dnzvlr82gHt3mGm+nDUp159FCw== 44 | dependencies: 45 | prop-types "^15.5.10" 46 | 47 | "@types/classnames@^2.2.9": 48 | version "2.2.9" 49 | resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.9.tgz#d868b6febb02666330410fe7f58f3c4b8258be7b" 50 | integrity sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A== 51 | 52 | "@types/eslint-visitor-keys@^1.0.0": 53 | version "1.0.0" 54 | resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" 55 | integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== 56 | 57 | "@types/json-schema@^7.0.3": 58 | version "7.0.4" 59 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" 60 | integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== 61 | 62 | "@types/lodash@^4.14.149": 63 | version "4.14.149" 64 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" 65 | integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== 66 | 67 | "@types/lscache@^1.3.0": 68 | version "1.3.0" 69 | resolved "https://registry.yarnpkg.com/@types/lscache/-/lscache-1.3.0.tgz#03840a670129220ae6140937f9c3c4816a0d1a1f" 70 | integrity sha512-KgXIaX1JJfnYgaWUIxFx+7qPYaBa/PKkSWh5VeCj+cVc6jD/EMtbhEK3sO/ZlL/k2WytTkeJ9nsRSqANWNG9mA== 71 | 72 | "@types/node@^13.5.0": 73 | version "13.5.0" 74 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.0.tgz#4e498dbf355795a611a87ae5ef811a8660d42662" 75 | integrity sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ== 76 | 77 | "@types/prop-types@*": 78 | version "15.7.3" 79 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" 80 | integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== 81 | 82 | "@types/react-dom@^16.9.5": 83 | version "16.9.5" 84 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7" 85 | integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg== 86 | dependencies: 87 | "@types/react" "*" 88 | 89 | "@types/react@*", "@types/react@^16.9.19": 90 | version "16.9.19" 91 | resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.19.tgz#c842aa83ea490007d29938146ff2e4d9e4360c40" 92 | integrity sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A== 93 | dependencies: 94 | "@types/prop-types" "*" 95 | csstype "^2.2.0" 96 | 97 | "@typescript-eslint/eslint-plugin@^2.18.0": 98 | version "2.18.0" 99 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.18.0.tgz#f8cf272dfb057ecf1ea000fea1e0b3f06a32f9cb" 100 | integrity sha512-kuO8WQjV+RCZvAXVRJfXWiJ8iYEtfHlKgcqqqXg9uUkIolEHuUaMmm8/lcO4xwCOtaw6mY0gStn2Lg4/eUXXYQ== 101 | dependencies: 102 | "@typescript-eslint/experimental-utils" "2.18.0" 103 | eslint-utils "^1.4.3" 104 | functional-red-black-tree "^1.0.1" 105 | regexpp "^3.0.0" 106 | tsutils "^3.17.1" 107 | 108 | "@typescript-eslint/experimental-utils@2.18.0": 109 | version "2.18.0" 110 | resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.18.0.tgz#e4eab839082030282496c1439bbf9fdf2a4f3da8" 111 | integrity sha512-J6MopKPHuJYmQUkANLip7g9I82ZLe1naCbxZZW3O2sIxTiq/9YYoOELEKY7oPg0hJ0V/AQ225h2z0Yp+RRMXhw== 112 | dependencies: 113 | "@types/json-schema" "^7.0.3" 114 | "@typescript-eslint/typescript-estree" "2.18.0" 115 | eslint-scope "^5.0.0" 116 | 117 | "@typescript-eslint/parser@^2.18.0": 118 | version "2.18.0" 119 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.18.0.tgz#d5f7fc1839abd4a985394e40e9d2454bd56aeb1f" 120 | integrity sha512-SJJPxFMEYEWkM6pGfcnjLU+NJIPo+Ko1QrCBL+i0+zV30ggLD90huEmMMhKLHBpESWy9lVEeWlQibweNQzyc+A== 121 | dependencies: 122 | "@types/eslint-visitor-keys" "^1.0.0" 123 | "@typescript-eslint/experimental-utils" "2.18.0" 124 | "@typescript-eslint/typescript-estree" "2.18.0" 125 | eslint-visitor-keys "^1.1.0" 126 | 127 | "@typescript-eslint/typescript-estree@2.18.0": 128 | version "2.18.0" 129 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.18.0.tgz#cfbd16ed1b111166617d718619c19b62764c8460" 130 | integrity sha512-gVHylf7FDb8VSi2ypFuEL3hOtoC4HkZZ5dOjXvVjoyKdRrvXAOPSzpNRnKMfaUUEiSLP8UF9j9X9EDLxC0lfZg== 131 | dependencies: 132 | debug "^4.1.1" 133 | eslint-visitor-keys "^1.1.0" 134 | glob "^7.1.6" 135 | is-glob "^4.0.1" 136 | lodash "^4.17.15" 137 | semver "^6.3.0" 138 | tsutils "^3.17.1" 139 | 140 | acorn-jsx@^5.1.0: 141 | version "5.1.0" 142 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" 143 | integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== 144 | 145 | acorn@^7.1.0: 146 | version "7.1.0" 147 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" 148 | integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== 149 | 150 | ajv@^6.10.0, ajv@^6.10.2: 151 | version "6.11.0" 152 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" 153 | integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== 154 | dependencies: 155 | fast-deep-equal "^3.1.1" 156 | fast-json-stable-stringify "^2.0.0" 157 | json-schema-traverse "^0.4.1" 158 | uri-js "^4.2.2" 159 | 160 | ansi-escapes@^4.2.1: 161 | version "4.3.0" 162 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" 163 | integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== 164 | dependencies: 165 | type-fest "^0.8.1" 166 | 167 | ansi-regex@^4.1.0: 168 | version "4.1.0" 169 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 170 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 171 | 172 | ansi-regex@^5.0.0: 173 | version "5.0.0" 174 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 175 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 176 | 177 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 178 | version "3.2.1" 179 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 180 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 181 | dependencies: 182 | color-convert "^1.9.0" 183 | 184 | argparse@^1.0.7: 185 | version "1.0.10" 186 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 187 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 188 | dependencies: 189 | sprintf-js "~1.0.2" 190 | 191 | array-includes@^3.0.3, array-includes@^3.1.1: 192 | version "3.1.1" 193 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" 194 | integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== 195 | dependencies: 196 | define-properties "^1.1.3" 197 | es-abstract "^1.17.0" 198 | is-string "^1.0.5" 199 | 200 | astral-regex@^1.0.0: 201 | version "1.0.0" 202 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 203 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 204 | 205 | aws-sdk@^2.610.0: 206 | version "2.610.0" 207 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.610.0.tgz#a8633204bed83df763095824f8110ced4a717d2a" 208 | integrity sha512-kqcoCTKjbxrUo2KeLQR2Jw6l4PvkbHXSDk8KqF2hXcpHibiOcMXZZPVe9X+s90RC/B2+qU95M7FImp9ByMcw7A== 209 | dependencies: 210 | buffer "4.9.1" 211 | events "1.1.1" 212 | ieee754 "1.1.13" 213 | jmespath "0.15.0" 214 | querystring "0.2.0" 215 | sax "1.2.1" 216 | url "0.10.3" 217 | uuid "3.3.2" 218 | xml2js "0.4.19" 219 | 220 | balanced-match@^1.0.0: 221 | version "1.0.0" 222 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 223 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 224 | 225 | base64-js@^1.0.2: 226 | version "1.3.1" 227 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 228 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 229 | 230 | brace-expansion@^1.1.7: 231 | version "1.1.11" 232 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 233 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 234 | dependencies: 235 | balanced-match "^1.0.0" 236 | concat-map "0.0.1" 237 | 238 | buffer@4.9.1: 239 | version "4.9.1" 240 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 241 | integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= 242 | dependencies: 243 | base64-js "^1.0.2" 244 | ieee754 "^1.1.4" 245 | isarray "^1.0.0" 246 | 247 | bulma@^0.8.0: 248 | version "0.8.0" 249 | resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.8.0.tgz#ac1606431703a4761b18a4a2d5cc1fa864a2aece" 250 | integrity sha512-nhf3rGyiZh/VM7FrSJ/5KeLlfaFkXz0nYcXriynfPH4vVpnxnqyEwaNGdNCVzHyyCA3cHgkQAMpdF/SFbFGZfA== 251 | 252 | callsites@^3.0.0: 253 | version "3.1.0" 254 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 255 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 256 | 257 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: 258 | version "2.4.2" 259 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 260 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 261 | dependencies: 262 | ansi-styles "^3.2.1" 263 | escape-string-regexp "^1.0.5" 264 | supports-color "^5.3.0" 265 | 266 | chardet@^0.7.0: 267 | version "0.7.0" 268 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 269 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 270 | 271 | classnames@^2.2.6: 272 | version "2.2.6" 273 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" 274 | integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== 275 | 276 | cli-cursor@^3.1.0: 277 | version "3.1.0" 278 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 279 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 280 | dependencies: 281 | restore-cursor "^3.1.0" 282 | 283 | cli-width@^2.0.0: 284 | version "2.2.0" 285 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 286 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 287 | 288 | color-convert@^1.9.0: 289 | version "1.9.3" 290 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 291 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 292 | dependencies: 293 | color-name "1.1.3" 294 | 295 | color-name@1.1.3: 296 | version "1.1.3" 297 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 298 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 299 | 300 | concat-map@0.0.1: 301 | version "0.0.1" 302 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 303 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 304 | 305 | cross-spawn@^6.0.5: 306 | version "6.0.5" 307 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 308 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 309 | dependencies: 310 | nice-try "^1.0.4" 311 | path-key "^2.0.1" 312 | semver "^5.5.0" 313 | shebang-command "^1.2.0" 314 | which "^1.2.9" 315 | 316 | csstype@^2.2.0: 317 | version "2.6.8" 318 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" 319 | integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== 320 | 321 | debug@^4.0.1, debug@^4.1.1: 322 | version "4.1.1" 323 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 324 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 325 | dependencies: 326 | ms "^2.1.1" 327 | 328 | deep-is@~0.1.3: 329 | version "0.1.3" 330 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 331 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 332 | 333 | define-properties@^1.1.2, define-properties@^1.1.3: 334 | version "1.1.3" 335 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 336 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 337 | dependencies: 338 | object-keys "^1.0.12" 339 | 340 | doctrine@^2.1.0: 341 | version "2.1.0" 342 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 343 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 344 | dependencies: 345 | esutils "^2.0.2" 346 | 347 | doctrine@^3.0.0: 348 | version "3.0.0" 349 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 350 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 351 | dependencies: 352 | esutils "^2.0.2" 353 | 354 | emoji-regex@^7.0.1: 355 | version "7.0.3" 356 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 357 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 358 | 359 | emoji-regex@^8.0.0: 360 | version "8.0.0" 361 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 362 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 363 | 364 | es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: 365 | version "1.17.4" 366 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" 367 | integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== 368 | dependencies: 369 | es-to-primitive "^1.2.1" 370 | function-bind "^1.1.1" 371 | has "^1.0.3" 372 | has-symbols "^1.0.1" 373 | is-callable "^1.1.5" 374 | is-regex "^1.0.5" 375 | object-inspect "^1.7.0" 376 | object-keys "^1.1.1" 377 | object.assign "^4.1.0" 378 | string.prototype.trimleft "^2.1.1" 379 | string.prototype.trimright "^2.1.1" 380 | 381 | es-to-primitive@^1.2.1: 382 | version "1.2.1" 383 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 384 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 385 | dependencies: 386 | is-callable "^1.1.4" 387 | is-date-object "^1.0.1" 388 | is-symbol "^1.0.2" 389 | 390 | escape-string-regexp@^1.0.5: 391 | version "1.0.5" 392 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 393 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 394 | 395 | eslint-config-prettier@^6.10.0: 396 | version "6.10.0" 397 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f" 398 | integrity sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg== 399 | dependencies: 400 | get-stdin "^6.0.0" 401 | 402 | eslint-config-react@^1.1.7: 403 | version "1.1.7" 404 | resolved "https://registry.yarnpkg.com/eslint-config-react/-/eslint-config-react-1.1.7.tgz#a0918d0fc47d0e9bd161a47308021da85d2585b3" 405 | integrity sha1-oJGND8R9DpvRYaRzCAIdqF0lhbM= 406 | 407 | eslint-plugin-prettier@^3.1.2: 408 | version "3.1.2" 409 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" 410 | integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== 411 | dependencies: 412 | prettier-linter-helpers "^1.0.0" 413 | 414 | eslint-plugin-react@^7.18.0: 415 | version "7.18.0" 416 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz#2317831284d005b30aff8afb7c4e906f13fa8e7e" 417 | integrity sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ== 418 | dependencies: 419 | array-includes "^3.1.1" 420 | doctrine "^2.1.0" 421 | has "^1.0.3" 422 | jsx-ast-utils "^2.2.3" 423 | object.entries "^1.1.1" 424 | object.fromentries "^2.0.2" 425 | object.values "^1.1.1" 426 | prop-types "^15.7.2" 427 | resolve "^1.14.2" 428 | 429 | eslint-scope@^5.0.0: 430 | version "5.0.0" 431 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 432 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 433 | dependencies: 434 | esrecurse "^4.1.0" 435 | estraverse "^4.1.1" 436 | 437 | eslint-utils@^1.4.3: 438 | version "1.4.3" 439 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 440 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 441 | dependencies: 442 | eslint-visitor-keys "^1.1.0" 443 | 444 | eslint-visitor-keys@^1.1.0: 445 | version "1.1.0" 446 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 447 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 448 | 449 | eslint@^6.8.0: 450 | version "6.8.0" 451 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 452 | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 453 | dependencies: 454 | "@babel/code-frame" "^7.0.0" 455 | ajv "^6.10.0" 456 | chalk "^2.1.0" 457 | cross-spawn "^6.0.5" 458 | debug "^4.0.1" 459 | doctrine "^3.0.0" 460 | eslint-scope "^5.0.0" 461 | eslint-utils "^1.4.3" 462 | eslint-visitor-keys "^1.1.0" 463 | espree "^6.1.2" 464 | esquery "^1.0.1" 465 | esutils "^2.0.2" 466 | file-entry-cache "^5.0.1" 467 | functional-red-black-tree "^1.0.1" 468 | glob-parent "^5.0.0" 469 | globals "^12.1.0" 470 | ignore "^4.0.6" 471 | import-fresh "^3.0.0" 472 | imurmurhash "^0.1.4" 473 | inquirer "^7.0.0" 474 | is-glob "^4.0.0" 475 | js-yaml "^3.13.1" 476 | json-stable-stringify-without-jsonify "^1.0.1" 477 | levn "^0.3.0" 478 | lodash "^4.17.14" 479 | minimatch "^3.0.4" 480 | mkdirp "^0.5.1" 481 | natural-compare "^1.4.0" 482 | optionator "^0.8.3" 483 | progress "^2.0.0" 484 | regexpp "^2.0.1" 485 | semver "^6.1.2" 486 | strip-ansi "^5.2.0" 487 | strip-json-comments "^3.0.1" 488 | table "^5.2.3" 489 | text-table "^0.2.0" 490 | v8-compile-cache "^2.0.3" 491 | 492 | espree@^6.1.2: 493 | version "6.1.2" 494 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" 495 | integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== 496 | dependencies: 497 | acorn "^7.1.0" 498 | acorn-jsx "^5.1.0" 499 | eslint-visitor-keys "^1.1.0" 500 | 501 | esprima@^4.0.0: 502 | version "4.0.1" 503 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 504 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 505 | 506 | esquery@^1.0.1: 507 | version "1.0.1" 508 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 509 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 510 | dependencies: 511 | estraverse "^4.0.0" 512 | 513 | esrecurse@^4.1.0: 514 | version "4.2.1" 515 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 516 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 517 | dependencies: 518 | estraverse "^4.1.0" 519 | 520 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 521 | version "4.3.0" 522 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 523 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 524 | 525 | esutils@^2.0.2: 526 | version "2.0.3" 527 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 528 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 529 | 530 | events@1.1.1: 531 | version "1.1.1" 532 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 533 | integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 534 | 535 | external-editor@^3.0.3: 536 | version "3.1.0" 537 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 538 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 539 | dependencies: 540 | chardet "^0.7.0" 541 | iconv-lite "^0.4.24" 542 | tmp "^0.0.33" 543 | 544 | fast-deep-equal@^3.1.1: 545 | version "3.1.1" 546 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 547 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 548 | 549 | fast-diff@^1.1.2: 550 | version "1.2.0" 551 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 552 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 553 | 554 | fast-json-stable-stringify@^2.0.0: 555 | version "2.1.0" 556 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 557 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 558 | 559 | fast-levenshtein@~2.0.6: 560 | version "2.0.6" 561 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 562 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 563 | 564 | figures@^3.0.0: 565 | version "3.1.0" 566 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" 567 | integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== 568 | dependencies: 569 | escape-string-regexp "^1.0.5" 570 | 571 | file-entry-cache@^5.0.1: 572 | version "5.0.1" 573 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 574 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 575 | dependencies: 576 | flat-cache "^2.0.1" 577 | 578 | flat-cache@^2.0.1: 579 | version "2.0.1" 580 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 581 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 582 | dependencies: 583 | flatted "^2.0.0" 584 | rimraf "2.6.3" 585 | write "1.0.3" 586 | 587 | flatted@^2.0.0: 588 | version "2.0.1" 589 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" 590 | integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== 591 | 592 | fs.realpath@^1.0.0: 593 | version "1.0.0" 594 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 595 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 596 | 597 | function-bind@^1.1.1: 598 | version "1.1.1" 599 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 600 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 601 | 602 | functional-red-black-tree@^1.0.1: 603 | version "1.0.1" 604 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 605 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 606 | 607 | get-stdin@^6.0.0: 608 | version "6.0.0" 609 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 610 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 611 | 612 | glob-parent@^5.0.0: 613 | version "5.1.0" 614 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" 615 | integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== 616 | dependencies: 617 | is-glob "^4.0.1" 618 | 619 | glob@^7.1.3, glob@^7.1.6: 620 | version "7.1.6" 621 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 622 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 623 | dependencies: 624 | fs.realpath "^1.0.0" 625 | inflight "^1.0.4" 626 | inherits "2" 627 | minimatch "^3.0.4" 628 | once "^1.3.0" 629 | path-is-absolute "^1.0.0" 630 | 631 | globals@^12.1.0: 632 | version "12.3.0" 633 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" 634 | integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== 635 | dependencies: 636 | type-fest "^0.8.1" 637 | 638 | has-flag@^3.0.0: 639 | version "3.0.0" 640 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 641 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 642 | 643 | has-symbols@^1.0.0, has-symbols@^1.0.1: 644 | version "1.0.1" 645 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 646 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 647 | 648 | has@^1.0.3: 649 | version "1.0.3" 650 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 651 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 652 | dependencies: 653 | function-bind "^1.1.1" 654 | 655 | iconv-lite@^0.4.24: 656 | version "0.4.24" 657 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 658 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 659 | dependencies: 660 | safer-buffer ">= 2.1.2 < 3" 661 | 662 | ieee754@1.1.13, ieee754@^1.1.4: 663 | version "1.1.13" 664 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 665 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 666 | 667 | ignore@^4.0.6: 668 | version "4.0.6" 669 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 670 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 671 | 672 | import-fresh@^3.0.0: 673 | version "3.2.1" 674 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 675 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 676 | dependencies: 677 | parent-module "^1.0.0" 678 | resolve-from "^4.0.0" 679 | 680 | imurmurhash@^0.1.4: 681 | version "0.1.4" 682 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 683 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 684 | 685 | inflight@^1.0.4: 686 | version "1.0.6" 687 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 688 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 689 | dependencies: 690 | once "^1.3.0" 691 | wrappy "1" 692 | 693 | inherits@2: 694 | version "2.0.4" 695 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 696 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 697 | 698 | inquirer@^7.0.0: 699 | version "7.0.4" 700 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" 701 | integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== 702 | dependencies: 703 | ansi-escapes "^4.2.1" 704 | chalk "^2.4.2" 705 | cli-cursor "^3.1.0" 706 | cli-width "^2.0.0" 707 | external-editor "^3.0.3" 708 | figures "^3.0.0" 709 | lodash "^4.17.15" 710 | mute-stream "0.0.8" 711 | run-async "^2.2.0" 712 | rxjs "^6.5.3" 713 | string-width "^4.1.0" 714 | strip-ansi "^5.1.0" 715 | through "^2.3.6" 716 | 717 | is-callable@^1.1.4, is-callable@^1.1.5: 718 | version "1.1.5" 719 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 720 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 721 | 722 | is-date-object@^1.0.1: 723 | version "1.0.2" 724 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 725 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 726 | 727 | is-extglob@^2.1.1: 728 | version "2.1.1" 729 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 730 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 731 | 732 | is-fullwidth-code-point@^2.0.0: 733 | version "2.0.0" 734 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 735 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 736 | 737 | is-fullwidth-code-point@^3.0.0: 738 | version "3.0.0" 739 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 740 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 741 | 742 | is-glob@^4.0.0, is-glob@^4.0.1: 743 | version "4.0.1" 744 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 745 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 746 | dependencies: 747 | is-extglob "^2.1.1" 748 | 749 | is-promise@^2.1.0: 750 | version "2.1.0" 751 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 752 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 753 | 754 | is-regex@^1.0.5: 755 | version "1.0.5" 756 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 757 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 758 | dependencies: 759 | has "^1.0.3" 760 | 761 | is-string@^1.0.5: 762 | version "1.0.5" 763 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 764 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 765 | 766 | is-symbol@^1.0.2: 767 | version "1.0.3" 768 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 769 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 770 | dependencies: 771 | has-symbols "^1.0.1" 772 | 773 | isarray@^1.0.0: 774 | version "1.0.0" 775 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 776 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 777 | 778 | isexe@^2.0.0: 779 | version "2.0.0" 780 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 781 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 782 | 783 | jmespath@0.15.0: 784 | version "0.15.0" 785 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 786 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 787 | 788 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 789 | version "4.0.0" 790 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 791 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 792 | 793 | js-yaml@^3.13.1: 794 | version "3.13.1" 795 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 796 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 797 | dependencies: 798 | argparse "^1.0.7" 799 | esprima "^4.0.0" 800 | 801 | json-schema-traverse@^0.4.1: 802 | version "0.4.1" 803 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 804 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 805 | 806 | json-stable-stringify-without-jsonify@^1.0.1: 807 | version "1.0.1" 808 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 809 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 810 | 811 | jsx-ast-utils@^2.2.3: 812 | version "2.2.3" 813 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" 814 | integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== 815 | dependencies: 816 | array-includes "^3.0.3" 817 | object.assign "^4.1.0" 818 | 819 | levn@^0.3.0, levn@~0.3.0: 820 | version "0.3.0" 821 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 822 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 823 | dependencies: 824 | prelude-ls "~1.1.2" 825 | type-check "~0.3.2" 826 | 827 | lodash@^4.17.14, lodash@^4.17.15: 828 | version "4.17.15" 829 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 830 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 831 | 832 | loose-envify@^1.1.0, loose-envify@^1.4.0: 833 | version "1.4.0" 834 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 835 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 836 | dependencies: 837 | js-tokens "^3.0.0 || ^4.0.0" 838 | 839 | lscache@^1.3.0: 840 | version "1.3.0" 841 | resolved "https://registry.yarnpkg.com/lscache/-/lscache-1.3.0.tgz#2221fd39f3393d2dfbc6ed2231beb52e11e43396" 842 | integrity sha512-0JwzMSSu3fd3m8QQVbqIxzXywkNLQvgdNehuEtZ66v7f89ybpkZX+WN45SkvChP4AqUPSpDPJKHsAqStOhHgUA== 843 | 844 | mimic-fn@^2.1.0: 845 | version "2.1.0" 846 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 847 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 848 | 849 | minimatch@^3.0.4: 850 | version "3.0.4" 851 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 852 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 853 | dependencies: 854 | brace-expansion "^1.1.7" 855 | 856 | minimist@0.0.8: 857 | version "0.0.8" 858 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 859 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 860 | 861 | mkdirp@^0.5.1: 862 | version "0.5.1" 863 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 864 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 865 | dependencies: 866 | minimist "0.0.8" 867 | 868 | ms@^2.1.1: 869 | version "2.1.2" 870 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 871 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 872 | 873 | mute-stream@0.0.8: 874 | version "0.0.8" 875 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 876 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 877 | 878 | natural-compare@^1.4.0: 879 | version "1.4.0" 880 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 881 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 882 | 883 | nice-try@^1.0.4: 884 | version "1.0.5" 885 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 886 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 887 | 888 | object-assign@^4.1.1: 889 | version "4.1.1" 890 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 891 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 892 | 893 | object-inspect@^1.7.0: 894 | version "1.7.0" 895 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 896 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 897 | 898 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 899 | version "1.1.1" 900 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 901 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 902 | 903 | object.assign@^4.1.0: 904 | version "4.1.0" 905 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 906 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 907 | dependencies: 908 | define-properties "^1.1.2" 909 | function-bind "^1.1.1" 910 | has-symbols "^1.0.0" 911 | object-keys "^1.0.11" 912 | 913 | object.entries@^1.1.1: 914 | version "1.1.1" 915 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" 916 | integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== 917 | dependencies: 918 | define-properties "^1.1.3" 919 | es-abstract "^1.17.0-next.1" 920 | function-bind "^1.1.1" 921 | has "^1.0.3" 922 | 923 | object.fromentries@^2.0.2: 924 | version "2.0.2" 925 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" 926 | integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== 927 | dependencies: 928 | define-properties "^1.1.3" 929 | es-abstract "^1.17.0-next.1" 930 | function-bind "^1.1.1" 931 | has "^1.0.3" 932 | 933 | object.values@^1.1.1: 934 | version "1.1.1" 935 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" 936 | integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== 937 | dependencies: 938 | define-properties "^1.1.3" 939 | es-abstract "^1.17.0-next.1" 940 | function-bind "^1.1.1" 941 | has "^1.0.3" 942 | 943 | once@^1.3.0: 944 | version "1.4.0" 945 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 946 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 947 | dependencies: 948 | wrappy "1" 949 | 950 | onetime@^5.1.0: 951 | version "5.1.0" 952 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 953 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 954 | dependencies: 955 | mimic-fn "^2.1.0" 956 | 957 | optionator@^0.8.3: 958 | version "0.8.3" 959 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 960 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 961 | dependencies: 962 | deep-is "~0.1.3" 963 | fast-levenshtein "~2.0.6" 964 | levn "~0.3.0" 965 | prelude-ls "~1.1.2" 966 | type-check "~0.3.2" 967 | word-wrap "~1.2.3" 968 | 969 | os-tmpdir@~1.0.2: 970 | version "1.0.2" 971 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 972 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 973 | 974 | parent-module@^1.0.0: 975 | version "1.0.1" 976 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 977 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 978 | dependencies: 979 | callsites "^3.0.0" 980 | 981 | path-is-absolute@^1.0.0: 982 | version "1.0.1" 983 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 984 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 985 | 986 | path-key@^2.0.1: 987 | version "2.0.1" 988 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 989 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 990 | 991 | path-parse@^1.0.6: 992 | version "1.0.6" 993 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 994 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 995 | 996 | prelude-ls@~1.1.2: 997 | version "1.1.2" 998 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 999 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1000 | 1001 | prettier-linter-helpers@^1.0.0: 1002 | version "1.0.0" 1003 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 1004 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1005 | dependencies: 1006 | fast-diff "^1.1.2" 1007 | 1008 | prettier@^1.19.1: 1009 | version "1.19.1" 1010 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 1011 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== 1012 | 1013 | progress@^2.0.0: 1014 | version "2.0.3" 1015 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1016 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1017 | 1018 | prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2: 1019 | version "15.7.2" 1020 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 1021 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 1022 | dependencies: 1023 | loose-envify "^1.4.0" 1024 | object-assign "^4.1.1" 1025 | react-is "^16.8.1" 1026 | 1027 | punycode@1.3.2: 1028 | version "1.3.2" 1029 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1030 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1031 | 1032 | punycode@^2.1.0: 1033 | version "2.1.1" 1034 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1035 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1036 | 1037 | querystring@0.2.0: 1038 | version "0.2.0" 1039 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1040 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1041 | 1042 | react-dom@^16.12.0: 1043 | version "16.12.0" 1044 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" 1045 | integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== 1046 | dependencies: 1047 | loose-envify "^1.1.0" 1048 | object-assign "^4.1.1" 1049 | prop-types "^15.6.2" 1050 | scheduler "^0.18.0" 1051 | 1052 | react-is@^16.8.1: 1053 | version "16.12.0" 1054 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" 1055 | integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== 1056 | 1057 | react@^16.12.0: 1058 | version "16.12.0" 1059 | resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" 1060 | integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== 1061 | dependencies: 1062 | loose-envify "^1.1.0" 1063 | object-assign "^4.1.1" 1064 | prop-types "^15.6.2" 1065 | 1066 | regexpp@^2.0.1: 1067 | version "2.0.1" 1068 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1069 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1070 | 1071 | regexpp@^3.0.0: 1072 | version "3.0.0" 1073 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" 1074 | integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== 1075 | 1076 | resolve-from@^4.0.0: 1077 | version "4.0.0" 1078 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1079 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1080 | 1081 | resolve@^1.14.2: 1082 | version "1.15.0" 1083 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" 1084 | integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== 1085 | dependencies: 1086 | path-parse "^1.0.6" 1087 | 1088 | restore-cursor@^3.1.0: 1089 | version "3.1.0" 1090 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1091 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1092 | dependencies: 1093 | onetime "^5.1.0" 1094 | signal-exit "^3.0.2" 1095 | 1096 | rimraf@2.6.3: 1097 | version "2.6.3" 1098 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1099 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1100 | dependencies: 1101 | glob "^7.1.3" 1102 | 1103 | run-async@^2.2.0: 1104 | version "2.3.0" 1105 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1106 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 1107 | dependencies: 1108 | is-promise "^2.1.0" 1109 | 1110 | rxjs@^6.5.3: 1111 | version "6.5.4" 1112 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" 1113 | integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== 1114 | dependencies: 1115 | tslib "^1.9.0" 1116 | 1117 | "safer-buffer@>= 2.1.2 < 3": 1118 | version "2.1.2" 1119 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1120 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1121 | 1122 | sax@1.2.1: 1123 | version "1.2.1" 1124 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 1125 | integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= 1126 | 1127 | sax@>=0.6.0: 1128 | version "1.2.4" 1129 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1130 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1131 | 1132 | scheduler@^0.18.0: 1133 | version "0.18.0" 1134 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" 1135 | integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== 1136 | dependencies: 1137 | loose-envify "^1.1.0" 1138 | object-assign "^4.1.1" 1139 | 1140 | semver@^5.5.0: 1141 | version "5.7.1" 1142 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1143 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1144 | 1145 | semver@^6.1.2, semver@^6.3.0: 1146 | version "6.3.0" 1147 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1148 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1149 | 1150 | shebang-command@^1.2.0: 1151 | version "1.2.0" 1152 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1153 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1154 | dependencies: 1155 | shebang-regex "^1.0.0" 1156 | 1157 | shebang-regex@^1.0.0: 1158 | version "1.0.0" 1159 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1160 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1161 | 1162 | signal-exit@^3.0.2: 1163 | version "3.0.2" 1164 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1165 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1166 | 1167 | slice-ansi@^2.1.0: 1168 | version "2.1.0" 1169 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1170 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1171 | dependencies: 1172 | ansi-styles "^3.2.0" 1173 | astral-regex "^1.0.0" 1174 | is-fullwidth-code-point "^2.0.0" 1175 | 1176 | sprintf-js@~1.0.2: 1177 | version "1.0.3" 1178 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1179 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1180 | 1181 | string-width@^3.0.0: 1182 | version "3.1.0" 1183 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1184 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1185 | dependencies: 1186 | emoji-regex "^7.0.1" 1187 | is-fullwidth-code-point "^2.0.0" 1188 | strip-ansi "^5.1.0" 1189 | 1190 | string-width@^4.1.0: 1191 | version "4.2.0" 1192 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1193 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1194 | dependencies: 1195 | emoji-regex "^8.0.0" 1196 | is-fullwidth-code-point "^3.0.0" 1197 | strip-ansi "^6.0.0" 1198 | 1199 | string.prototype.trimleft@^2.1.1: 1200 | version "2.1.1" 1201 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" 1202 | integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== 1203 | dependencies: 1204 | define-properties "^1.1.3" 1205 | function-bind "^1.1.1" 1206 | 1207 | string.prototype.trimright@^2.1.1: 1208 | version "2.1.1" 1209 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" 1210 | integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== 1211 | dependencies: 1212 | define-properties "^1.1.3" 1213 | function-bind "^1.1.1" 1214 | 1215 | strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1216 | version "5.2.0" 1217 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1218 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1219 | dependencies: 1220 | ansi-regex "^4.1.0" 1221 | 1222 | strip-ansi@^6.0.0: 1223 | version "6.0.0" 1224 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1225 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1226 | dependencies: 1227 | ansi-regex "^5.0.0" 1228 | 1229 | strip-json-comments@^3.0.1: 1230 | version "3.0.1" 1231 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1232 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1233 | 1234 | supports-color@^5.3.0: 1235 | version "5.5.0" 1236 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1237 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1238 | dependencies: 1239 | has-flag "^3.0.0" 1240 | 1241 | table@^5.2.3: 1242 | version "5.4.6" 1243 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" 1244 | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1245 | dependencies: 1246 | ajv "^6.10.2" 1247 | lodash "^4.17.14" 1248 | slice-ansi "^2.1.0" 1249 | string-width "^3.0.0" 1250 | 1251 | text-table@^0.2.0: 1252 | version "0.2.0" 1253 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1254 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1255 | 1256 | through@^2.3.6: 1257 | version "2.3.8" 1258 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1259 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1260 | 1261 | tmp@^0.0.33: 1262 | version "0.0.33" 1263 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1264 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1265 | dependencies: 1266 | os-tmpdir "~1.0.2" 1267 | 1268 | tslib@^1.8.1, tslib@^1.9.0: 1269 | version "1.10.0" 1270 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1271 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1272 | 1273 | tsutils@^3.17.1: 1274 | version "3.17.1" 1275 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 1276 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 1277 | dependencies: 1278 | tslib "^1.8.1" 1279 | 1280 | type-check@~0.3.2: 1281 | version "0.3.2" 1282 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1283 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1284 | dependencies: 1285 | prelude-ls "~1.1.2" 1286 | 1287 | type-fest@^0.8.1: 1288 | version "0.8.1" 1289 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1290 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1291 | 1292 | typescript@^3.7.5: 1293 | version "3.7.5" 1294 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" 1295 | integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== 1296 | 1297 | uri-js@^4.2.2: 1298 | version "4.2.2" 1299 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1300 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1301 | dependencies: 1302 | punycode "^2.1.0" 1303 | 1304 | url@0.10.3: 1305 | version "0.10.3" 1306 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 1307 | integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= 1308 | dependencies: 1309 | punycode "1.3.2" 1310 | querystring "0.2.0" 1311 | 1312 | uuid@3.3.2: 1313 | version "3.3.2" 1314 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1315 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 1316 | 1317 | v8-compile-cache@^2.0.3: 1318 | version "2.1.0" 1319 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1320 | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1321 | 1322 | which@^1.2.9: 1323 | version "1.3.1" 1324 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1325 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1326 | dependencies: 1327 | isexe "^2.0.0" 1328 | 1329 | word-wrap@~1.2.3: 1330 | version "1.2.3" 1331 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1332 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1333 | 1334 | wrappy@1: 1335 | version "1.0.2" 1336 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1337 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1338 | 1339 | write@1.0.3: 1340 | version "1.0.3" 1341 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1342 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1343 | dependencies: 1344 | mkdirp "^0.5.1" 1345 | 1346 | xml2js@0.4.19: 1347 | version "0.4.19" 1348 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 1349 | integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 1350 | dependencies: 1351 | sax ">=0.6.0" 1352 | xmlbuilder "~9.0.1" 1353 | 1354 | xmlbuilder@~9.0.1: 1355 | version "9.0.7" 1356 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 1357 | integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= 1358 | --------------------------------------------------------------------------------