diff --git a/package.json b/package.json index 33edff8..454ade5 100644 --- a/package.json +++ b/package.json @@ -3,17 +3,43 @@ "version": "0.1.0", "private": true, "dependencies": { - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@types/jest": "^24.0.0", - "@types/node": "^12.0.0", - "@types/react": "^16.9.0", - "@types/react-dom": "^16.9.0", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "react-scripts": "3.4.0", - "typescript": "~3.7.2" + "@testing-library/jest-dom": "^5.7.0", + "@testing-library/react": "^10.0.4", + "@testing-library/user-event": "^10.3.1", + "@types/async-lock": "^1.1.2", + "@types/jest": "^25.2.3", + "@types/lokijs": "^1.5.3", + "@types/node": "^14.0.1", + "@types/react": "^16.9.35", + "@types/react-dom": "^16.9.8", + "@types/react-helmet": "^6.0.0", + "@types/react-html-parser": "^2.0.1", + "@types/react-overlays": "^1.1.3", + "@types/react-router-dom": "^5.1.5", + "@types/react-router-hash-link": "^1.2.1", + "@types/xregexp": "^4.3.0", + "async-lock": "^1.2.4", + "axios": "^0.19.2", + "lokijs": "^1.5.8", + "moment": "2.25.3", + "rc-tree": "^3.2.2", + "react": "^16.13.1", + "react-app-polyfill": "^1.0.6", + "react-cookie": "^4.0.3", + "react-dom": "^16.13.1", + "react-ga": "^2.7.0", + "react-helmet": "^6.0.0", + "react-html-parser": "^2.0.2", + "react-image-lightbox": "^5.1.1", + "react-overlays": "^3.2.0", + "react-router-dom": "^5.2.0", + "react-router-hash-link": "^1.2.2", + "react-scripts": "3.4.1", + "react-spinner-material": "^1.3.1", + "rss-parser": "^3.8.0", + "split-string": "^6.1.0", + "typescript": "~3.9.2", + "xregexp": "^4.3.0" }, "scripts": { "start": "react-scripts start", @@ -28,12 +54,14 @@ "production": [ ">0.2%", "not dead", - "not op_mini all" + "not op_mini all", + "ie 11" ], "development": [ "last 1 chrome version", "last 1 firefox version", - "last 1 safari version" + "last 1 safari version", + "ie 11" ] } } diff --git a/public/favicon.ico b/public/favicon.ico index bcd5dfd..973f2b4 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html index aa069f2..f205a90 100644 --- a/public/index.html +++ b/public/index.html @@ -7,37 +7,26 @@ - - + + + + + + + + + + + + + - - React App + Top - INCF Japan Node
- diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a..0000000 Binary files a/public/logo192.png and /dev/null differ diff --git a/public/logo512.png b/public/logo512.png deleted file mode 100644 index a4e47a6..0000000 Binary files a/public/logo512.png and /dev/null differ diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..f6406c1 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,21 +1,11 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "INCF Japan Node", + "name": "INCF Japan Node Portal Site", "icons": [ { "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", + "sizes": "16x16", "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" } ], "start_url": ".", diff --git a/src/App.css b/src/App.css index 74b5e05..3a6841e 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +1,2 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} +@import url("./common/assets/xoops.css"); +@import url("./custom/assets/style.css"); diff --git a/src/App.tsx b/src/App.tsx index a53698a..2809684 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,17 @@ import React from 'react'; -import logo from './logo.svg'; +import { CookiesProvider } from 'react-cookie'; +import { BrowserRouter } from 'react-router-dom'; import './App.css'; +import AppRoot from './common/AppRoot'; -function App() { - return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
- ); +const App: React.FC = () => { + return ( + + + + + + ); } export default App; diff --git a/src/bulletin/Bulletin.tsx b/src/bulletin/Bulletin.tsx new file mode 100644 index 0000000..4b61b22 --- /dev/null +++ b/src/bulletin/Bulletin.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { Redirect, Route, RouteComponentProps, Switch } from 'react-router-dom'; +import Loading from '../common/lib/Loading'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import BulletinArchive from './lib/BulletinArchive'; +import BulletinContext from './lib/BulletinContext'; +import BulletinStories from './lib/BulletinStories'; +import BulletinStory from './lib/BulletinStory'; +import BulletinUtils from './lib/BulletinUtils'; + +interface Props { + lang: MultiLang; + mydirname: string; +} + +interface Props { + lang: MultiLang; + mydirname: string; +} + +interface State { + loading: boolean; + context: BulletinContext | null; +} + +class Bulletin extends React.Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + context: null, + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updateContext(); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { mydirname } = this.props; + const prevMydirname = prevProps.mydirname; + if (mydirname !== prevMydirname) { + this.setState({ loading: true, context: null }); + this.updateContext(); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + async updateContext() { + const { mydirname } = this.props; + const context = await BulletinUtils.getContext(mydirname); + if (this.isActive) { + this.setState({ loading: false, context }); + } + } + + private str2int(str: string | null): number | null { + if (str === null || str.match(/^\d+$/) === null) { + return null; + } + return parseInt(str, 10); + } + + render() { + const { lang, mydirname } = this.props; + const { loading, context } = this.state; + if (loading) { + return ; + } + if (context === null) { + return ; + } + return
+ + { + const { location } = props; + const url = context.getUrl('index.php' + location.search + location.hash); + return + }} /> + { + const { location } = props; + const params = new URLSearchParams(location.search); + const page = params.get('page') || 'main'; + switch (page) { + case 'main': { + const topicId = this.str2int(params.get('storytopic')) || 0; + const storyNum = this.str2int(params.get('storynum')) || 5; + const start = this.str2int(params.get('start')) || 0; + return + } + case 'article': { + const storyId = this.str2int(params.get('storyid')) || 0; + return + } + case 'archive': { + const year = this.str2int(params.get('year')) || 0; + const month = this.str2int(params.get('month')) || 0; + return + } + } + return + }} /> + { + return ; + }} /> + +
; + } +} + +export default Bulletin; \ No newline at end of file diff --git a/src/bulletin/blocks/BulletinRecentNews.tsx b/src/bulletin/blocks/BulletinRecentNews.tsx new file mode 100644 index 0000000..b41a26d --- /dev/null +++ b/src/bulletin/blocks/BulletinRecentNews.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Loading from '../../common/lib/Loading'; +import PageNotFound from '../../common/lib/PageNotFound'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from '../lib/BulletinContext'; +import BulletinStoryItem from '../lib/BulletinStoryItem'; +import BulletinUtils from '../lib/BulletinUtils'; + +interface Props { + lang: MultiLang; + mydirname: string; +} + +interface State { + loading: boolean; + context: BulletinContext | null; +} + +class BulletinRecentNews extends React.Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + context: null, + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updateContext(); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { mydirname } = this.props; + const prevMydirname = prevProps.mydirname; + if (mydirname !== prevMydirname) { + this.setState({ loading: true, context: null }); + this.updateContext(); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + async updateContext() { + const { mydirname } = this.props; + const context = await BulletinUtils.getContext(mydirname); + if (this.isActive) { + this.setState({ loading: false, context }); + } + } + + render() { + const { lang } = this.props; + const { loading, context } = this.state; + if (loading) { + return ; + } + if (context === null) { + return ; + } + const module = context.getModule(); + if (module === null) { + return ; + } + const stories = context.getStories(0, 10, 0); + return
+ {stories.filter((story, index) => index < 3).map((story, index) => { + return + })} +
    + {stories.filter((story, index) => index >= 3).map((story, index) => { + return
  • {Functions.mlang(story.title, lang)} ({story.posttime})
  • + })} +
+
[more]
+
; + } +} + +export default BulletinRecentNews; diff --git a/src/bulletin/lib/BulletinArchive.tsx b/src/bulletin/lib/BulletinArchive.tsx new file mode 100644 index 0000000..77c0fd0 --- /dev/null +++ b/src/bulletin/lib/BulletinArchive.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../../common/lib/PageNotFound'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from './BulletinContext'; +import BulletinUtils from './BulletinUtils'; + +interface Props { + lang: MultiLang; + context: BulletinContext; + year: number; + month: number; +} + +const BulletinArchive: React.FC = (props: Props) => { + const { lang, context, year, month } = props; + const years = context.getArchiveYearRange(); + if (years.min === 0 || years.max === 0) { + return ; + } + const module = context.getModule(); + if (module === null) { + return ; + } + const title = Functions.mlang('[en]Archive[/en][ja]アーカイブ[/ja]', lang); + const titles = [Functions.siteTitle(lang), Functions.mlang(module.name, lang), title]; + const stories = year !== 0 ? context.getStoriesByMonth(year, month) : []; + return
+ + {titles.reverse().join(' - ')} + +
{Functions.mlang('[en]Archive[/en][ja]アーカイブ[/ja]', lang)} |
+
+
+ + + + + + {[...Array(years.max - years.min + 1)].map((v, index) => { + const _year = index + years.min; + const evenodd = index % 2 === 0 ? 'even' : 'edd'; + return + + {[...Array(12)].map((v, index) => { + const _month = index + 1; + const label = BulletinUtils.getMonthLabel(_month, lang); + const style: React.CSSProperties = { textAlign: 'center' }; + const num = context.getArchiveCounter(_year, _month); + const xmonth = (num === 0 || (_year === year && _month === month)) ? label : {label}; + if (_year === year && _month === month) { + style['backgroundColor'] = '#ffcccc'; + style['color'] = '#0000ff'; + style['fontWeight'] = 'bold'; + } + return ; + })} + + })} + +
{Functions.mlang('[en]News archive[/en][ja]ニュースアーカイブ[/ja]', lang)}
{_year}{lang === 'ja' && '年'}{xmonth}
+
+ {stories.length > 0 && +
+
+ + {Functions.mlang('[en]News[/en][ja]ニュース[/ja]', lang)} + +
+
+
    + {stories.map((story, index) => { + const topic = context.getTopic(story.topic_id); + return
  • + {Functions.mlang(topic === null ? '' : topic.title, lang)} +  :  + {Functions.mlang(story.title, lang)} ({story.posttime}) +
  • + })} +
+
+
+ {Functions.mlang('[en]There are[/en][ja]計[/ja] ' + stories.length + ' [en]story(ies) in total.[/en][ja]件のニュース記事があります[/ja]', lang)} +
+
+ } +
; +}; + +export default BulletinArchive; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinContext.ts b/src/bulletin/lib/BulletinContext.ts new file mode 100644 index 0000000..4faa40a --- /dev/null +++ b/src/bulletin/lib/BulletinContext.ts @@ -0,0 +1,191 @@ +import axios from 'axios'; +import loki from 'lokijs'; + +export interface BulletinModuleData { + name: string; + dirname: string; + storyhome: number; + displaynav: number; + disp_list_of_cat: number; + stories_of_cat: number; + use_pankuzu: number; +} + +export interface BulletinTopicData { + id: number; + pid: number; + title: string; +} + +export interface BulletinStoryData { + id: number; + posttime: string; + topic_id: number; + title: string; + text: { + en: string; + ja: string; + } +} + +interface BulletinIndexData { + module: BulletinModuleData; + topics: BulletinTopicData[]; + stories: BulletinStoryData[]; +} + +interface BulletinCounterData { + count: { + [date: string]: number; + } + year: { + min: number; + max: number; + } +} + +export const BULLETIN_TOPIC_ID_ROOT = 0; + +class BulletinContext { + + private isInitialized: boolean; + private dirname: string; + private database: loki; + private module: BulletinModuleData | null; + private topics: Collection; + private stories: Collection; + private counter: BulletinCounterData; + + constructor(dirname: string) { + this.isInitialized = false; + this.dirname = dirname; + this.database = new loki(`bulletin_${dirname}`); + this.module = null; + this.topics = this.database.addCollection('topics'); + this.stories = this.database.addCollection('stories'); + this.counter = { count: {}, year: { min: 0, max: 0 } }; + } + + getUrl(path: string): string { + return `/${this.dirname}/${path}`; + } + + getStoryUrl(id: number, page: number = 0): string { + const params = new URLSearchParams([ + ['page', 'article'], + ['storyid', id.toString()] + ]); + if (page !== 0) { + params.set('storypage', page.toString()); + } + return this.getUrl('index.php?' + params.toString()); + } + + getTopicUrl(id: number, limit: number, start: number): string { + const params = new URLSearchParams(); + if (id !== 0) { + params.set('storytopic', id.toString()); + } + if (limit !== 5) { + params.set('storynum', limit.toString()); + } + if (start !== 0) { + params.set('start', start.toString()); + } + return this.getUrl('index.php?' + params.toString()); + } + + getArchiveUrl(year: number = 0, month: number = 0): string { + const params = new URLSearchParams([ + ['page', 'archive'] + ]); + if (year !== 0) { + params.set('year', year.toString()); + } + if (month !== 0) { + params.set('month', month.toString()); + } + return this.getUrl('index.php?' + params.toString()); + } + + getModule(): BulletinModuleData | null { + return this.module; + } + + getTopic(topicId: number): BulletinTopicData | null { + return this.topics.findOne({ id: topicId }); + } + + getStory(storyId: number): BulletinStoryData | null { + return this.stories.findOne({ id: storyId }); + } + + getTopics(): BulletinTopicData[] { + return this.topics.chain().find().simplesort('title').data(); + } + + getStories(topicId: number, limit: number, start: number): BulletinStoryData[] { + const filter = topicId === 0 ? undefined : { topic_id: topicId }; + return this.stories.chain().find(filter).simplesort('posttime', true).offset(start).limit(limit).data(); + } + + getStoriesByMonth(year: number, month: number) { + const key = ('0000' + year).substr(-4) + '-' + ('00' + month).substr(-2); + const filter = { posttime: { '$regex': ['^' + key] } }; + return this.stories.chain().find(filter).simplesort('posttime', true).data(); + } + + countStories(topicId: number): number { + const filter = topicId === 0 ? undefined : { topic_id: topicId }; + return this.stories.count(filter); + } + + getArchiveYearRange(): { min: number, max: number } { + return this.counter.year; + } + + getArchiveCounter(year: number, month: number) { + const key = ('0000' + year).substr(-4) + '-' + ('00' + month).substr(-2); + return key in this.counter.count ? this.counter.count[key] : 0; + } + + async initialize(): Promise { + if (!this.isInitialized) { + try { + const response = await axios.get('/modules' + this.getUrl('index.json')); + const index = response.data as BulletinIndexData; + this.module = index.module; + index.topics.forEach((value) => { + this.topics.insert(value); + }); + index.stories.forEach((value, index) => { + const key = value.posttime.replace(/^(\d{4}-\d{2}).*$/, "$1"); + const year = parseInt(key.replace(/^(\d{4}).*/, "$1"), 10); + if (index === 0) { + this.counter.year.min = year; + this.counter.year.max = year; + } else { + if (this.counter.year.min > year) { + this.counter.year.min = year; + } + if (this.counter.year.max < year) { + this.counter.year.max = year; + } + } + if (key in this.counter.count) { + this.counter.count[key]++; + } else { + this.counter.count[key] = 1; + } + this.stories.insert(value); + }); + } catch (err) { + // ignore + } + this.isInitialized = true; + } + return this.isInitialized; + } +} + +export default BulletinContext; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinStories.tsx b/src/bulletin/lib/BulletinStories.tsx new file mode 100644 index 0000000..55cd505 --- /dev/null +++ b/src/bulletin/lib/BulletinStories.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../../common/lib/PageNotFound'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from './BulletinContext'; +import BulletinStoryItem from './BulletinStoryItem'; +import BulletinStoriesSelect from './BulletinStoriesSelect'; +import BulletinStoriesPageNavi from './BulletinStoriesPageNavi'; + +interface Props { + lang: MultiLang; + context: BulletinContext; + topicId: number; + storyNum: number; + start: number; +} + +const BulletinStories: React.FC = (props: Props) => { + const { lang, context, topicId, storyNum, start } = props; + const topic = context.getTopic(topicId); + if (topicId !== 0 && topic === null) { + return ; + } + const module = context.getModule(); + if (module === null) { + return ; + } + const titles = [Functions.siteTitle(lang), Functions.mlang(module.name, lang)]; + if (topicId !== 0 && topic !== null) { + titles.push(Functions.mlang(topic.title, lang)); + } + const stories = context.getStories(topicId, storyNum, start); + return
+ + {titles.reverse().join(' - ')} + +
{Functions.mlang('[en]Archive[/en][ja]アーカイブ[/ja]', lang)} |
+
+ + {stories.map((story) => { + return + })} + +
; +}; + +export default BulletinStories; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinStoriesPageNavi.tsx b/src/bulletin/lib/BulletinStoriesPageNavi.tsx new file mode 100644 index 0000000..b991075 --- /dev/null +++ b/src/bulletin/lib/BulletinStoriesPageNavi.tsx @@ -0,0 +1,66 @@ +import React, { Fragment } from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from './BulletinContext'; + +interface Props { + lang: MultiLang; + context: BulletinContext; + topicId: number; + limit: number; + start: number; +} + +const BulletinStoriesPageNavi: React.FC = (props: Props) => { + const { lang, context, topicId, limit, start } = props; + const total = context.countStories(topicId); + if (start > total) { + return null; + } + const now = Math.ceil((start + 1) / limit); + const min = 1; + const max = Math.ceil(total / limit); + const prev = now === 1 ? 0 : now - 1; + const next = now === max ? 0 : now + 1; + let rangeMin = now - 3; + if (rangeMin < 2) { + rangeMin = 2; + } + let rangeMax = now + 3; + if (rangeMax > max - 1) { + rangeMax = max - 1; + } + const link = (num: number, el?: JSX.Element) => { + const label = el || num; + const url = context.getTopicUrl(topicId, limit, (num - 1) * limit); + return num === now ? {label} : {label} + } + const items: JSX.Element[] = []; + if (prev !== 0) { + items.push(link(prev, «)); + } + items.push(link(min)); + if (now - min > 4) { + items.push(<>...); + } + for (let range = rangeMin; range <= rangeMax; range++) { + items.push(link(range)); + } + if (max - now > 4) { + items.push(<>...); + } + items.push(link(max)); + if (next !== 0) { + items.push(link(next, »)); + } + const rangeS = start + 1; + const rangeE = (start + limit) < total ? start + limit : total; + + return ; +}; + +export default BulletinStoriesPageNavi; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinStoriesSelect.tsx b/src/bulletin/lib/BulletinStoriesSelect.tsx new file mode 100644 index 0000000..1632bcc --- /dev/null +++ b/src/bulletin/lib/BulletinStoriesSelect.tsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { RouteComponentProps, withRouter } from 'react-router-dom'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from './BulletinContext'; + +interface Props extends RouteComponentProps { + lang: MultiLang; + context: BulletinContext; + topicId: number; + num: number; +} + +interface State { + path: string; + topicId: number; + num: number; +} + +class BulletinStoriesSelect extends React.Component { + + private STORY_NUMS: ReadonlyArray = [5, 10, 15, 20, 30]; + + constructor(props: Props) { + super(props); + const {topicId, num, location} = props; + this.state = { + path: location.pathname + location.search + location.hash, + topicId, + num, + }; + this.handleSubmit = this.handleSubmit.bind(this); + this.handleSelectTopic = this.handleSelectTopic.bind(this); + this.handleSelectNum = this.handleSelectNum.bind(this); + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + const { topicId, num, location } = nextProps; + const path = location.pathname + location.search + location.hash; + if (prevState.path !== path) { + return { + path, + topicId, + num + }; + } + return null; + } + + handleSelectTopic(event: React.ChangeEvent) { + const topicId = parseInt(event.target.value, 10); + this.setState({ topicId }) + } + + handleSelectNum(event: React.ChangeEvent) { + const num = parseInt(event.target.value, 10); + this.setState({ num }) + } + + handleSubmit(event: React.FormEvent) { + const { context, history } = this.props; + event.preventDefault(); + if (context !== null) { + const url = context.getTopicUrl(this.state.topicId, this.state.num, 0); + history.push(url); + } + } + + render() { + const { lang, context } = this.props; + const topics = context.getTopics(); + return
+
+ +   + +   + +
+
; + } +} + +export default withRouter(BulletinStoriesSelect); \ No newline at end of file diff --git a/src/bulletin/lib/BulletinStory.tsx b/src/bulletin/lib/BulletinStory.tsx new file mode 100644 index 0000000..c0cc1bf --- /dev/null +++ b/src/bulletin/lib/BulletinStory.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../../common/lib/PageNotFound'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext from './BulletinContext'; +import BulletinStoryItem from './BulletinStoryItem'; + +interface Props { + lang: MultiLang; + context: BulletinContext; + id: number; +} + +const BulletinStory: React.FC = (props: Props) => { + const { lang, context, id } = props; + const story = context.getStory(id); + if (story === null) { + return ; + } + const topic = context.getTopic(story.topic_id); + if (topic === null) { + return ; + } + const module = context.getModule(); + if (module === null) { + return ; + } + const titles = [Functions.siteTitle(lang), Functions.mlang(module.name, lang), Functions.mlang(story.title, lang)]; + const stories = context.getStories(story.topic_id, module.stories_of_cat, 0); + return
+ + {titles.reverse().join(' - ')} + +
{Functions.mlang('[en]Archive[/en][ja]アーカイブ[/ja]', lang)} |
+
+
+ +
+
+
+ + {Functions.mlang(topic.title, lang)} + +
+
+
    + {stories.map((story, index) => { + return
  • {Functions.mlang(story.title, lang)} ({story.posttime})
  • + })} +
+
+
+
; +}; + +export default BulletinStory; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinStoryItem.tsx b/src/bulletin/lib/BulletinStoryItem.tsx new file mode 100644 index 0000000..8f5c03c --- /dev/null +++ b/src/bulletin/lib/BulletinStoryItem.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../../common/lib/PageNotFound'; +import XoopsCode from '../../common/lib/XoopsCode'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import BulletinContext, { BulletinStoryData } from './BulletinContext'; +import BulletinUtils from './BulletinUtils'; + +interface Props { + lang: MultiLang; + context: BulletinContext; + story: BulletinStoryData; + isList: boolean; +} + +const BulletinStoryItem: React.FC = (props: Props) => { + const { lang, context, story, isList } = props; + const topic = context.getTopic(story.topic_id); + const urlTopic = context.getTopicUrl(story.topic_id, 5, 0); + const urlStory = context.getStoryUrl(story.id); + if (topic === null) { + return ; + } + const { text, rchars } = BulletinUtils.getStoryText(story, isList, lang); + const remaining = lang === 'en' ? rchars + ' characters more' : '残り' + rchars + '字'; + return
+
+ + {Functions.mlang(topic.title, lang)} +  :  + {isList ? {Functions.mlang(story.title, lang)} : Functions.mlang(story.title, lang)} + +
+
+
+ +
+
+ {rchars > 0 && <>{Functions.mlang('[en]Read more..[/en][ja]続きを読む[/ja]', lang)} | {remaining}} +
+
+  {Functions.mlang('[en]on[/en][ja]投稿日時:[/ja]', lang)} {story.posttime} +
+
+
+
+
; +}; + +export default BulletinStoryItem; \ No newline at end of file diff --git a/src/bulletin/lib/BulletinUtils.ts b/src/bulletin/lib/BulletinUtils.ts new file mode 100644 index 0000000..8ef01fc --- /dev/null +++ b/src/bulletin/lib/BulletinUtils.ts @@ -0,0 +1,43 @@ +import { MultiLang } from '../../config'; +import BulletinContext, { BulletinStoryData } from './BulletinContext'; + +class BulletinUtils { + + private static contexts: Map = new Map(); + + private constructor() { + // blcok to access from outside of this class + } + + public static async getContext(mydirname: string): Promise { + let context = this.contexts.get(mydirname); + if (typeof context === 'undefined') { + context = new BulletinContext(mydirname); + await context.initialize(); + this.contexts.set(mydirname, context); + } + return context; + } + + public static getStoryText(story: BulletinStoryData, isList: boolean, lang: MultiLang): { text: string, rchars: number } { + const pages = story.text[lang].split('[pagebreak]'); + return isList ? { + text: pages[0], + rchars: pages.filter((value, index) => index !== 0).join('

').length + } : { + text: pages.join('

'), + rchars: 0 + }; + } + + public static getMonthLabel(month: number, lang: MultiLang): string { + const label = { + en: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + ja: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] + } + return label[lang][month - 1]; + } + +} + +export default BulletinUtils; \ No newline at end of file diff --git a/src/common/AppRoot.tsx b/src/common/AppRoot.tsx new file mode 100644 index 0000000..cf7df19 --- /dev/null +++ b/src/common/AppRoot.tsx @@ -0,0 +1,67 @@ +import React, { Component } from 'react'; +import { ReactCookieProps, withCookies } from 'react-cookie'; +import ReactGA from 'react-ga'; +import { RouteComponentProps, withRouter } from 'react-router-dom'; +import Config, { MultiLang } from '../config'; +import Page from '../custom/Page'; + +interface Props extends RouteComponentProps, ReactCookieProps { } +interface State { + lang: MultiLang; +} + +class AppRoot extends Component { + + constructor(props: Props) { + super(props); + this.state = { lang: 'en' }; + if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') { + ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID); + } + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + const params = new URLSearchParams(nextProps.location.search); + const param_lang = params.get('ml_lang'); + const cookie_lang = typeof nextProps.cookies !== 'undefined' ? nextProps.cookies.get('ml_lang') : null; + let lang = param_lang || (typeof cookie_lang === 'string' ? cookie_lang : null) || prevState.lang; + if (lang !== 'en' && lang !== 'ja') { + lang = 'en'; + } + if (cookie_lang !== lang) { + if (typeof nextProps.cookies !== 'undefined') { + nextProps.cookies.set('ml_lang', lang, { path: '/' }); + } + } + if (prevState.lang !== lang) { + return { lang }; + } + return null; + } + + componentDidMount() { + const { pathname } = this.props.location; + if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') { + ReactGA.set({ page: pathname }); + ReactGA.pageview(pathname); + } + } + + componentDidUpdate(prevProps: Props) { + const { pathname, search } = this.props.location; + if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') { + ReactGA.set({ page: pathname }); + ReactGA.pageview(pathname); + } + if (pathname !== prevProps.location.pathname || search !== prevProps.location.search) { + window.scrollTo(0, 0); + } + } + + render() { + const { lang } = this.state; + return ; + } +} + +export default withCookies(withRouter(AppRoot)); diff --git a/src/common/XoopsPathRedirect.tsx b/src/common/XoopsPathRedirect.tsx new file mode 100644 index 0000000..aaf8a18 --- /dev/null +++ b/src/common/XoopsPathRedirect.tsx @@ -0,0 +1,40 @@ +import React, { Component } from 'react'; +import { Redirect, RouteComponentProps } from 'react-router'; +import { MultiLang } from '../config'; +import PageNotFound from './lib/PageNotFound'; + +interface Params { + module: string; + pathname: string; +} + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +class XoopsPathRedirect extends Component { + + getRedirectUrl() { + const { pathname } = this.props.location; + switch (pathname || '') { + case '/index.php': { + return '/'; + } + } + return ''; + } + + render() { + const { lang } = this.props; + if (this.props.location.pathname === '/') { + return null; + } + const url = this.getRedirectUrl(); + if (url === '') { + return ; + } + return ; + } +} + +export default XoopsPathRedirect; diff --git a/src/common/assets/images/mlang_english.gif b/src/common/assets/images/mlang_english.gif new file mode 100644 index 0000000..4ff614e Binary files /dev/null and b/src/common/assets/images/mlang_english.gif differ diff --git a/src/common/assets/images/mlang_japanese.gif b/src/common/assets/images/mlang_japanese.gif new file mode 100644 index 0000000..5768206 Binary files /dev/null and b/src/common/assets/images/mlang_japanese.gif differ diff --git a/src/common/assets/images/no_avatar.gif b/src/common/assets/images/no_avatar.gif new file mode 100644 index 0000000..62fff0f Binary files /dev/null and b/src/common/assets/images/no_avatar.gif differ diff --git a/src/common/assets/images/pagact.gif b/src/common/assets/images/pagact.gif new file mode 100644 index 0000000..3f5b855 Binary files /dev/null and b/src/common/assets/images/pagact.gif differ diff --git a/src/common/assets/images/paginact.gif b/src/common/assets/images/paginact.gif new file mode 100644 index 0000000..7a2bc62 Binary files /dev/null and b/src/common/assets/images/paginact.gif differ diff --git a/src/common/assets/images/pagneutral.gif b/src/common/assets/images/pagneutral.gif new file mode 100644 index 0000000..b731713 Binary files /dev/null and b/src/common/assets/images/pagneutral.gif differ diff --git a/src/common/assets/images/rank3dbf8e94a6f72.gif b/src/common/assets/images/rank3dbf8e94a6f72.gif new file mode 100644 index 0000000..1c7c979 Binary files /dev/null and b/src/common/assets/images/rank3dbf8e94a6f72.gif differ diff --git a/src/common/assets/images/rank3dbf8e9e7d88d.gif b/src/common/assets/images/rank3dbf8e9e7d88d.gif new file mode 100644 index 0000000..a545faf Binary files /dev/null and b/src/common/assets/images/rank3dbf8e9e7d88d.gif differ diff --git a/src/common/assets/images/rank3dbf8ea81e642.gif b/src/common/assets/images/rank3dbf8ea81e642.gif new file mode 100644 index 0000000..50f3de7 Binary files /dev/null and b/src/common/assets/images/rank3dbf8ea81e642.gif differ diff --git a/src/common/assets/images/rank3dbf8eb1a72e7.gif b/src/common/assets/images/rank3dbf8eb1a72e7.gif new file mode 100644 index 0000000..64d8f29 Binary files /dev/null and b/src/common/assets/images/rank3dbf8eb1a72e7.gif differ diff --git a/src/common/assets/images/rank3dbf8edf15093.gif b/src/common/assets/images/rank3dbf8edf15093.gif new file mode 100644 index 0000000..704398e Binary files /dev/null and b/src/common/assets/images/rank3dbf8edf15093.gif differ diff --git a/src/common/assets/images/rank3dbf8ee8681cd.gif b/src/common/assets/images/rank3dbf8ee8681cd.gif new file mode 100644 index 0000000..95428a8 Binary files /dev/null and b/src/common/assets/images/rank3dbf8ee8681cd.gif differ diff --git a/src/common/assets/images/rank3e632f95e81ca.gif b/src/common/assets/images/rank3e632f95e81ca.gif new file mode 100644 index 0000000..224fbaa Binary files /dev/null and b/src/common/assets/images/rank3e632f95e81ca.gif differ diff --git a/src/common/assets/images/smil3dbd4bf386b36.gif b/src/common/assets/images/smil3dbd4bf386b36.gif new file mode 100644 index 0000000..51e517a Binary files /dev/null and b/src/common/assets/images/smil3dbd4bf386b36.gif differ diff --git a/src/common/assets/images/smil3dbd4d4e4c4f2.gif b/src/common/assets/images/smil3dbd4d4e4c4f2.gif new file mode 100644 index 0000000..ee53c7d Binary files /dev/null and b/src/common/assets/images/smil3dbd4d4e4c4f2.gif differ diff --git a/src/common/assets/images/smil3dbd4d6422f04.gif b/src/common/assets/images/smil3dbd4d6422f04.gif new file mode 100644 index 0000000..9a75a92 Binary files /dev/null and b/src/common/assets/images/smil3dbd4d6422f04.gif differ diff --git a/src/common/assets/images/smil3dbd4d75edb5e.gif b/src/common/assets/images/smil3dbd4d75edb5e.gif new file mode 100644 index 0000000..b1baee2 Binary files /dev/null and b/src/common/assets/images/smil3dbd4d75edb5e.gif differ diff --git a/src/common/assets/images/smil3dbd4d8676346.gif b/src/common/assets/images/smil3dbd4d8676346.gif new file mode 100644 index 0000000..5777f68 Binary files /dev/null and b/src/common/assets/images/smil3dbd4d8676346.gif differ diff --git a/src/common/assets/images/smil3dbd4d99c6eaa.gif b/src/common/assets/images/smil3dbd4d99c6eaa.gif new file mode 100644 index 0000000..87a792e Binary files /dev/null and b/src/common/assets/images/smil3dbd4d99c6eaa.gif differ diff --git a/src/common/assets/images/smil3dbd4daabd491.gif b/src/common/assets/images/smil3dbd4daabd491.gif new file mode 100644 index 0000000..95a63f2 Binary files /dev/null and b/src/common/assets/images/smil3dbd4daabd491.gif differ diff --git a/src/common/assets/images/smil3dbd4dbc14f3f.gif b/src/common/assets/images/smil3dbd4dbc14f3f.gif new file mode 100644 index 0000000..77c71c0 Binary files /dev/null and b/src/common/assets/images/smil3dbd4dbc14f3f.gif differ diff --git a/src/common/assets/images/smil3dbd4dcd7b9f4.gif b/src/common/assets/images/smil3dbd4dcd7b9f4.gif new file mode 100644 index 0000000..2e4dfa5 Binary files /dev/null and b/src/common/assets/images/smil3dbd4dcd7b9f4.gif differ diff --git a/src/common/assets/images/smil3dbd4ddd6835f.gif b/src/common/assets/images/smil3dbd4ddd6835f.gif new file mode 100644 index 0000000..01b5a60 Binary files /dev/null and b/src/common/assets/images/smil3dbd4ddd6835f.gif differ diff --git a/src/common/assets/images/smil3dbd4df1944ee.gif b/src/common/assets/images/smil3dbd4df1944ee.gif new file mode 100644 index 0000000..49697c5 Binary files /dev/null and b/src/common/assets/images/smil3dbd4df1944ee.gif differ diff --git a/src/common/assets/images/smil3dbd4e02c5440.gif b/src/common/assets/images/smil3dbd4e02c5440.gif new file mode 100644 index 0000000..004261b Binary files /dev/null and b/src/common/assets/images/smil3dbd4e02c5440.gif differ diff --git a/src/common/assets/images/smil3dbd4e1748cc9.gif b/src/common/assets/images/smil3dbd4e1748cc9.gif new file mode 100644 index 0000000..50f9984 Binary files /dev/null and b/src/common/assets/images/smil3dbd4e1748cc9.gif differ diff --git a/src/common/assets/images/smil3dbd4e29bbcc7.gif b/src/common/assets/images/smil3dbd4e29bbcc7.gif new file mode 100644 index 0000000..4a96ea1 Binary files /dev/null and b/src/common/assets/images/smil3dbd4e29bbcc7.gif differ diff --git a/src/common/assets/images/smil3dbd4e398ff7b.gif b/src/common/assets/images/smil3dbd4e398ff7b.gif new file mode 100644 index 0000000..15402e7 Binary files /dev/null and b/src/common/assets/images/smil3dbd4e398ff7b.gif differ diff --git a/src/common/assets/images/smil3dbd4e4c2e742.gif b/src/common/assets/images/smil3dbd4e4c2e742.gif new file mode 100644 index 0000000..99368ba Binary files /dev/null and b/src/common/assets/images/smil3dbd4e4c2e742.gif differ diff --git a/src/common/assets/images/smil3dbd4e5e7563a.gif b/src/common/assets/images/smil3dbd4e5e7563a.gif new file mode 100644 index 0000000..172ecf8 Binary files /dev/null and b/src/common/assets/images/smil3dbd4e5e7563a.gif differ diff --git a/src/common/assets/images/smil3dbd4e7853679.gif b/src/common/assets/images/smil3dbd4e7853679.gif new file mode 100644 index 0000000..a66421e Binary files /dev/null and b/src/common/assets/images/smil3dbd4e7853679.gif differ diff --git a/src/common/assets/xoops.css b/src/common/assets/xoops.css new file mode 100644 index 0000000..88f768a --- /dev/null +++ b/src/common/assets/xoops.css @@ -0,0 +1,17 @@ +img {border: 0;} + +#xoopsHiddenText {visibility: hidden; color: #000000; font-weight: normal; font-style: normal; text-decoration: none;} + +.pagneutral {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagneutral.gif);} +.pagact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagact.gif);} +.paginact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/paginact.gif);} + + +#mainmenu a {text-align:left; display: block; margin: 0; padding: 4px;} +#mainmenu a.menuTop {padding-left: 3px;} +#mainmenu a.menuMain {padding-left: 3px;} +#mainmenu a.menuSub {padding-left: 9px;} + +#usermenu a {text-align:left; display: block; margin: 0; padding: 4px;} +#usermenu a.menuTop {} +#usermenu a.highlight {color: #0000ff; background-color: #fcc;} diff --git a/src/common/lib/LangLink.tsx b/src/common/lib/LangLink.tsx new file mode 100644 index 0000000..a576e4b --- /dev/null +++ b/src/common/lib/LangLink.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../config'; + +interface Props extends RouteComponentProps { + lang: MultiLang; + className?: string; +} + +const langResources = { + en: 'English', + ja: 'Japanese', +}; + +const LangLink = (props: Props) => { + const { lang, className } = props; + const params = new URLSearchParams(props.location.search); + const flagLang = lang === 'en' ? 'ja' : 'en'; + params.set('ml_lang', flagLang); + const url = props.location.pathname + '?' + params.toString(); + return {langResources[flagLang]}; +} + + +export default withRouter(LangLink); diff --git a/src/common/lib/Loading.tsx b/src/common/lib/Loading.tsx new file mode 100644 index 0000000..13ec917 --- /dev/null +++ b/src/common/lib/Loading.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Spinner from 'react-spinner-material'; + +const Loading = () => { + return ( +
+ +
+ ); +} + +export default Loading; \ No newline at end of file diff --git a/src/common/lib/NoticeSiteHasBeenArchived.tsx b/src/common/lib/NoticeSiteHasBeenArchived.tsx new file mode 100644 index 0000000..c44a297 --- /dev/null +++ b/src/common/lib/NoticeSiteHasBeenArchived.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; + +interface Props { + lang: MultiLang; +} + +const NoticeSiteHasBeenArchived = (props: Props) => { + const { lang } = props; + const notice = '[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]'; + return

{Functions.mlang(notice, lang)}

; +} + +export default NoticeSiteHasBeenArchived; \ No newline at end of file diff --git a/src/common/lib/PageNotFound.tsx b/src/common/lib/PageNotFound.tsx new file mode 100644 index 0000000..309ca2c --- /dev/null +++ b/src/common/lib/PageNotFound.tsx @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; +import { Helmet } from 'react-helmet'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +class PageNotFound extends Component { + + private url = '/'; + private timer: NodeJS.Timer | null = null; + + goToTopPage() { + if (this.props.location.pathname !== '/') { + if (this.timer) { + clearTimeout(this.timer); + } + this.timer = setTimeout(() => { + this.timer = null; + this.props.history.push(this.url); + }, 5000); + } + } + + componentWillUnmount() { + if (this.timer) { + clearTimeout(this.timer); + } + } + + render() { + const { lang } = this.props; + if (process.env.NODE_ENV === 'production') { + this.goToTopPage(); + } + return ( +
+ + Page Not Found - {Functions.siteTitle(lang)} + +

Page Not Found

+
+

The page you were trying to access doesn't exist.

+

If the page does not automatically reload, please click here

+
+
+ ); + } +} + +export default withRouter(PageNotFound); \ No newline at end of file diff --git a/src/common/lib/XoopsCode.tsx b/src/common/lib/XoopsCode.tsx new file mode 100644 index 0000000..033d295 --- /dev/null +++ b/src/common/lib/XoopsCode.tsx @@ -0,0 +1,140 @@ +import React, { ReactElement } from 'react'; +import ReactHtmlParser, { convertNodeToElement } from 'react-html-parser'; +import { HashLink } from 'react-router-hash-link'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; + +interface Props { + lang: MultiLang; + text: string; + dohtml?: boolean; + dosmiley?: boolean; + doxcode?: boolean; + doimage?: boolean; + dobr?: boolean; +} + +const preConvertXCode = (text: string, doxcode: boolean): string => { + if (doxcode) { + return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => { + return '[code]' + Functions.base64Encode(m1) + '[/code]'; + }); + } + return text; +} + +const postConvertXCode = (text: string, doxcode: boolean, doimage: boolean): string => { + if (doxcode) { + return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => { + const text = convertXCode(Functions.htmlspecialchars(Functions.base64Decode(m1)), doimage); + return '
' + text + '
'; + }); + } + return text; +} + +const convertClickable = (text: string) => { + text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g, (...matches) => { + return matches[1] + '' + matches[2] + ''; + }); + text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g, (...matches) => { + return matches[1] + '' + matches[2] + ''; + }); + return text; +} + +const convertXCode = (text: string, doimage: boolean): string => { + // TODO: implement + return text; +} + +const convertSmiley = (text: string) => { + // TODO: implement + return text; +} + +const convertBr = (text: string): string => { + return text.replace(/(\r?\n|\r)/g, '
'); +} + +interface TransformParsedNode { + type: string; + next: object | null; + prev: object | null; + parent: object | null; + name: string; + attribs: any; + children: object[]; + data: string; +} + +const cssConvert = (text: string): object => { + const ret: any = {}; + text.split(';').forEach((line) => { + const line_ = line.trim(); + if (line.length === 0) { + return; + } + const kv = line_.split(':'); + const key = Functions.camelCase(kv[0].trim()); + const value = kv[1].trim(); + ret[key] = value; + }) + return ret; +} + +const transform = (node: object, idx: number): ReactElement | null | void => { + const node_ = node as TransformParsedNode; + if (node_.type === 'tag' && node_.name === 'a') { + const url = (node_.attribs && node_.attribs['href']) || '/'; + const download = (node_.attribs && node_.attribs['download']) || ''; + const rel = (node_.attribs && node_.attribs['rel']) || ''; + const klass = (node_.attribs && node_.attribs['class']) || ''; + const target = (node_.attribs && node_.attribs['target']) || ''; + const isFile = download !== '' || /\.(zip|pdf|png|gif|jpg|gz|bz2|xz|mpg|mp3|mp4)$/i.test(url); + const isExternal = /^(_blank|_top|_parent)$/.test(target) || /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url); + if (!isFile && !isExternal) { + const style = (node_.attribs && node_.attribs['style']) || ''; + const title = (node_.attribs && node_.attribs['title']) || null; + return + {node_.children.map((value: object, index: number) => { + return convertNodeToElement(value, index, transform); + })} + ; + } + } + if (node_.type === 'tag' && node_.name === 'img') { + const src = (node_.attribs && node_.attribs['src']) || ''; + node_.attribs['src'] = src.replace('`XOOPS_URL`', process.env.PUBLIC_URL); + return convertNodeToElement(node_ as object, idx, transform); + } +} + +const XoopsCode = (props: Props) => { + const { lang } = props; + let text = props.text; + const dohtml = !!props.dohtml; + const dosmiley = !!props.dosmiley; + const doxcode = !!props.doxcode; + const doimage = !!props.doimage; + const dobr = !!props.dobr; + text = preConvertXCode(text, doxcode); + if (!dohtml) { + text = Functions.htmlspecialchars(text); + text = convertClickable(text); + } + if (dosmiley) { + text = convertSmiley(text); + } + if (doxcode) { + text = convertXCode(text, doimage); + } + if (dobr) { + text = convertBr(text); + } + text = postConvertXCode(text, doxcode, doimage); + text = Functions.mlang(text, lang); + return <>{ReactHtmlParser(text, { transform })}; +} + +export default XoopsCode; \ No newline at end of file diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..0b26444 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,18 @@ +const SITE_TITLE = 'INCF Japan Node'; +const SITE_SLOGAN = 'Top'; +const GOOGLE_ANALYTICS_TRACKING_ID = 'UA-2365647-1'; +const XOONIPS_ITEMTYPES = ['journal', 'article', 'generaldata']; +const PICO_MODULES = ['aboutus', 'aini', 'hackathon', 'joinus', 'link', 'nbni', 'program', 'publication', 'resource', 'tutorial']; +const BULLETIN_MODULES = ['news']; +export type MultiLang = 'en' | 'ja'; + +const Config = { + SITE_TITLE, + SITE_SLOGAN, + GOOGLE_ANALYTICS_TRACKING_ID, + XOONIPS_ITEMTYPES, + PICO_MODULES, + BULLETIN_MODULES, +}; + +export default Config; \ No newline at end of file diff --git a/src/custom/ContactUs.tsx b/src/custom/ContactUs.tsx new file mode 100644 index 0000000..13a024b --- /dev/null +++ b/src/custom/ContactUs.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; + +interface Props { + lang: MultiLang; +} + +const message = { + ja:

+ INCF日本ノードの事務局は2005年に理研BSI神経情報基盤センターとして設置され、2018年4月より理研CBS神経情報基盤開発ユニットに引き継がれ、国内外の多くの皆様のご協力を得て、運営して参りました。 + CBSにおけるニューロインフォマティクスの新たな方向性を探る中で、神経情報基盤開発ユニットは日本ノード事務局の任を2019年3月末日にて終了することとなりました。 +

, + en:

+ Secretariat of the INCF Japan Node (J-Node) was launched in 2005 as the starting of Neuroinformatics Japan Center, RIKEN Brain Science Institute (BSI). + In April 2018, J-Node secretariat was inherited to Neuroinformatics Unit, RIKEN Center for Brain Science (CBS). + However, based on reconsideration at CBS, closure of J-Node secretariat at the end of FY 2018 has been decided. + Accordingly, the collaborative development of neuroinformatics platforms will finish. + Each J-Node related site is going to be transferred to a new managing form. +

+}; + +const ContactUs: React.FC = (props: Props) => { + const { lang } = props; + const title = Functions.mlang('[en]Contact Us[/en][ja]お問い合わせ[/ja]', lang); + return
+ {title + ' - ' + Functions.mlang(Config.SITE_TITLE, lang)} +

{title}

+ + {message[lang]} +

+ {Functions.mlang('[en]Please see the details[/en][ja]詳細についてはこちらをご覧ください[/ja]', lang)}: {Functions.mlang('[en]Closure of Secretariat of the INCF Japan Node[/en][ja]INCF日本ノード事務局終了のお知らせ[/ja]', lang)} +

+

+ {Functions.mlang('[en]Thank you for your understanding.[/en][ja]皆様よりの長年の多大なご支援、深く感謝申し上げます。[/ja]', lang)} +

+
; +} + +export default ContactUs; diff --git a/src/custom/Footer.tsx b/src/custom/Footer.tsx new file mode 100644 index 0000000..f7e2d5f --- /dev/null +++ b/src/custom/Footer.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../config'; +import imageCbsBanner from './assets/images/cbs-banner.png'; +import imageIncfBanner from './assets/images/incf-banner.png'; +import imageNiuBanner from './assets/images/niu-banner.png'; +import imageRikenBanner from './assets/images/riken-banner.png'; +import imageXoonisBanner from './assets/images/xoonips-banner.png'; +import Functions from '../functions'; + +interface Props { + lang: MultiLang; +} + +const Footer: React.FC = (props: Props) => { + const { lang } = props; + return ( +
+
    +
  • RIKEN
  • +
  • RIKEN Center for Brain Science
  • +
  • Neuroinformatics Unit, RIKEN Center for Brain Science
  • +
  • International Neuroinformatics Coordinating Facility
  • +
  • XooNIps
  • +
  • {Functions.mlang('[en]Site Information[/en][ja]このサイトについて[/ja]', lang)}
  • +
+ Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science +
+ ); +} + +export default Footer; diff --git a/src/custom/Header.tsx b/src/custom/Header.tsx new file mode 100644 index 0000000..3625948 --- /dev/null +++ b/src/custom/Header.tsx @@ -0,0 +1,130 @@ +import React, { Component } from 'react'; +import { Link, RouteComponentProps, withRouter } from 'react-router-dom'; +import LangLink from '../common/lib/LangLink'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemUtil from '../xoonips/lib/ItemUtil'; +import imageFacebookIcon from './assets/images/facebook-icon.png'; +import imageFlickrIcon from './assets/images/flickr-icon.png'; +import imageIncfLogo from './assets/images/incf-logo.png'; +import imageSitemapIcon from './assets/images/sitemap.png'; +import imageTwitterIcon from './assets/images/twitter-icon.png'; +import imageSearchButton from './assets/images/search.png'; +import { HashLink } from 'react-router-hash-link'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +interface State { + keyword: string; + menuid: number; +} + +class Header extends Component { + constructor(props: Props) { + super(props); + this.state = { + keyword: '', + menuid: 0 + }; + this.handleChangeKeyword = this.handleChangeKeyword.bind(this); + this.handleOnClick = this.handleOnClick.bind(this); + } + + handleChangeKeyword(event: React.ChangeEvent) { + const keyword = event.target.value; + this.setState({ keyword }); + } + + handleOnClick(event: React.MouseEvent) { + event.preventDefault(); + const keyword = this.state.keyword.trim(); + if (keyword !== '') { + const url = ItemUtil.getSearchByKeywordUrl('all', this.state.keyword); + this.props.history.push(url); + } + } + + setMenuId(menuid: number) { + this.setState({ menuid }); + } + + render() { + const { lang } = this.props; + return ( + + ); + + } +} + +export default withRouter(Header); diff --git a/src/custom/Page.tsx b/src/custom/Page.tsx new file mode 100644 index 0000000..f18e04b --- /dev/null +++ b/src/custom/Page.tsx @@ -0,0 +1,174 @@ +import React from 'react'; +import { Redirect, Route, RouteComponentProps, Switch } from 'react-router-dom'; +import Bulletin from '../bulletin/Bulletin'; +import XoopsPathRedirect from '../common/XoopsPathRedirect'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import Pico from '../pico/Pico'; +import XooNIpsIndexTreeBlock from '../xoonips/blocks/IndexTree'; +import XooNIpsSearchBlock from '../xoonips/blocks/Search'; +import Xoonips from '../xoonips/Xoonips'; +import RssBlock from './blocks/RssBlock'; +import ContactUs from './ContactUs'; +import Footer from './Footer'; +import Header from './Header'; +import RssFeedSites from './RssFeedSites'; +import TopPage from './TopPage'; +import Xsearch from './Xsearch'; + +interface Props { + lang: MultiLang; +} + +const hackathonPathes = ['hackathon2018', 'brainhack-global-2017', 'hackathon2016', 'bah2015']; +const ainiPathes = ['2014', '2015', '2016', '2017', '2018']; + +const Page: React.FC = (props: Props) => { + const { lang } = props; + const goPageTop = Functions.mlang('[en]Go Page Top[/en][ja]ページの先頭へ[/ja]', lang); + return
+
+
+ + } /> + } /> + } /> + {ainiPathes.map((name) => + } /> + )} + {hackathonPathes.map((name) => + } /> + )} + {Config.PICO_MODULES.map((name) => + } /> + )} + {Config.PICO_MODULES.map((name) => + { + const { pathname, search, hash } = props.history.location; + const url = pathname.replace(/^\/modules/, '') + search + hash; + return ; + }} /> + )} + {Config.BULLETIN_MODULES.map((name) => + } /> + )} + {Config.BULLETIN_MODULES.map((name) => + { + const { pathname, search, hash } = props.history.location; + const url = pathname.replace(/^\/modules/, '') + search + hash; + return ; + }} /> + )} + { + return
+
+
+
+ Item Search +
+
+ +
+
+
+
+ Index Tree +
+
+ +
+
+
+
+
; + }} /> + +
+ + + <> + +
+
+
+
+ {Functions.mlang('Neuro-Imaging Platform', lang)} +
+
+ +
+
+
+
+ {Functions.mlang('Dynamic Brain Platform', lang)} +
+
+ +
+
+
+
+ {Functions.mlang('Brain Transcriptome Database', lang)} +
+
+ +
+
+
+
+ {Functions.mlang('Invertebrate Brain Platform', lang)} +
+
+ +
+
+
+
+
+
+ {Functions.mlang('Visiome Platform', lang)} +
+
+ +
+
+
+
+ {Functions.mlang('Cerebellar Platform', lang)} +
+
+ +
+
+ +
+
+ {Functions.mlang('Mouse Phenotype Database', lang)} +
+
+ +
+
+
+
+ {Functions.mlang('Brain Machine Interface Platform', lang)} +
+
+ +
+
+
+
+ + } /> +
+ + +
+
+
; +} + +export default Page; diff --git a/src/custom/RssFeedSites.ts b/src/custom/RssFeedSites.ts new file mode 100644 index 0000000..ddd08f8 --- /dev/null +++ b/src/custom/RssFeedSites.ts @@ -0,0 +1,103 @@ +import imageRssBmi from './assets/images/rss-bmi.png'; +import imageRssBsiNi from './assets/images/rss-bsi-ni.png'; +import imageRssCbsn from './assets/images/rss-cbsn.png'; +import imageRssCdtdb from './assets/images/rss-cdtdb.png'; +import imageRssCerebellum from './assets/images/rss-cerebellum.png'; +import imageRssDynamicbrain from './assets/images/rss-dynamicbrain.png'; +import imageRssIncf from './assets/images/rss-incf.png'; +import imageRssInvbrain from './assets/images/rss-invbrain.png'; +import imageRssMpdb from './assets/images/rss-mpdb.png'; +import imageRssNimg from './assets/images/rss-nimg.png'; +import imageRssVisiome from './assets/images/rss-visiome.png'; +import { RssFeedSite } from './lib/RssFeed'; + +const RssFeedSites: { [key: string]: RssFeedSite } = { + 'incf': { + id: 'incf', + name: 'INCF Neuroinformatics Portal', + logo: imageRssIncf, + url: 'https://www.incf.org/', + rss: 'https://www.incf.org/news/feed' + }, + 'visiome': + { + id: 'visiome', + name: 'Visiome Platform', + logo: imageRssVisiome, + url: 'https://visiome.neuroinf.jp/', + rss: 'https://visiome.neuroinf.jp/rss.xml' + }, + 'bmi': + { + id: 'bmi', + name: 'Brain Machine Interface Platform', + logo: imageRssBmi, + url: 'https://bmi.neuroinf.jp/', + rss: 'https://bmi.neuroinf.jp/researchers/rss.xml' + }, + 'invbrain': + { + id: 'invbrain', + name: 'Invertebrate Brain Platform', + logo: imageRssInvbrain, + url: 'https://invbrain.neuroinf.jp/', + rss: 'https://invbrain.neuroinf.jp/rss.xml' + }, + 'cbsn': + { + id: 'cbsn', + name: 'Comprehensive Brain Science Network Platform', + logo: imageRssCbsn, + url: 'https://cbsn.neuroinf.jp/', + rss: 'https://cbsn.neuroinf.jp/rss.xml' + }, + 'cdtdb': + { + id: 'cdtdb', + name: 'Brain Transcriptome Database', + logo: imageRssCdtdb, + url: 'http://www.cdtdb.neuroinf.jp/', + rss: 'http://www.cdtdb.neuroinf.jp/CDT/cdtdb.xml' + }, + 'cerebellum': + { + id: 'cerebellum', + name: 'Cerebellar Platform', + logo: imageRssCerebellum, + url: 'https://cerebellum.neuroinf.jp/', + rss: 'https://cerebellum.neuroinf.jp/rss.xml' + }, + 'nimg': { + id: 'nimg', + name: 'Neuro-Imaging Platform', + logo: imageRssNimg, + url: 'https://nimg.neuroinf.jp/', + rss: 'https://nimg.neuroinf.jp/rss.xml' + }, + 'dynamicbrain': + { + id: 'dynamicbrain', + name: 'Dynamic Brain Platform', + logo: imageRssDynamicbrain, + url: 'https://dynamicbrain.neuroinf.jp/', + rss: 'https://dynamicbrain.neuroinf.jp/rss.xml' + }, + 'mpdb': + { + id: 'mpdb', + name: 'Mouse Phenotype Database', + logo: imageRssMpdb, + url: 'http://www.mouse-phenotype.org/', + rss: 'http://www.mouse-phenotype.org/index.xml' + }, + 'bsi-ni': + { + id: 'bsi-ni', + name: 'BSI-Neuroinfomatics', + logo: imageRssBsiNi, + url: 'https://bsi-ni.brain.riken.jp/', + rss: 'https://bsi-ni.brain.riken.jp/index.xml' + } +}; + +export default RssFeedSites; diff --git a/src/custom/TopPage.tsx b/src/custom/TopPage.tsx new file mode 100644 index 0000000..74629a3 --- /dev/null +++ b/src/custom/TopPage.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import BulletinRecentNews from '../bulletin/blocks/BulletinRecentNews'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import imageMainBanner from './assets/images/main-banner.png'; +import LinkBannersBlock from './blocks/LinkBannersBlock'; +import RssBlock from './blocks/RssBlock'; +import { RssFeedSite } from './lib/RssFeed'; +import RssFeedSites from './RssFeedSites'; + +interface Props { + lang: MultiLang; +} + +const RSS_UPDATES_INCF: RssFeedSite[] = [ + RssFeedSites.incf +]; +const RSS_UPDATES_PLATFORMS: RssFeedSite[] = [ + RssFeedSites.mpdb, + RssFeedSites.cdtdb, + RssFeedSites.nimg +]; + +const TopPage: React.FC = (props: Props) => { + const { lang } = props; + const title = Functions.mlang(Config.SITE_SLOGAN, lang) + ' - ' + Functions.mlang(Config.SITE_TITLE, lang); + return
+ {title} +
main banner
+
+
+
+
+ +
+
+
+
+
+
+
+ {Functions.mlang('[en]Latest News and Topics[/en][ja]最新ニュース[/ja]', lang)} +
+
+ +
+
+
+
+
+
+ {Functions.mlang('[en]INCF Portal Updates[/en][ja]INCF Portal 更新情報[/ja]', lang)} +
+
+ +
+
+
+
+
+
+ {Functions.mlang('[en]Platform Updates[/en][ja]プラットフォーム更新情報[/ja]', lang)} +
+
+ +
+
+
+
+
+
; +} + +export default TopPage; diff --git a/src/custom/Xsearch.tsx b/src/custom/Xsearch.tsx new file mode 100644 index 0000000..c655139 --- /dev/null +++ b/src/custom/Xsearch.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import { Link } from 'react-router-dom'; + +interface Props { + lang: MultiLang; +} + +const message = { + ja:
+

サイトアーカイブ化に伴い、本機能の提供を終了しました。

+

このサイトのデータについては、こちらから検索可能です。

+
, + en:
+

Due to site archiving, the across platform research search service has been discontinued.

+

You can search the data only this site here.

+
+}; + +const Xsearch: React.FC = (props: Props) => { + const { lang } = props; + const title = Functions.mlang('[en]Across Platform Resource Search[/en][ja]日本ノードプラットフォーム横断検索[/ja]', lang); + return
+ {title + ' - ' + Functions.mlang(Config.SITE_TITLE, lang)} +

{title}

+ + {message[lang]} +
; +} + +export default Xsearch; diff --git a/src/custom/assets/images/blockTitleBack.png b/src/custom/assets/images/blockTitleBack.png new file mode 100644 index 0000000..8d92695 Binary files /dev/null and b/src/custom/assets/images/blockTitleBack.png differ diff --git a/src/custom/assets/images/cbs-banner.png b/src/custom/assets/images/cbs-banner.png new file mode 100644 index 0000000..7e1f891 Binary files /dev/null and b/src/custom/assets/images/cbs-banner.png differ diff --git a/src/custom/assets/images/facebook-icon.png b/src/custom/assets/images/facebook-icon.png new file mode 100644 index 0000000..78e1ca1 Binary files /dev/null and b/src/custom/assets/images/facebook-icon.png differ diff --git a/src/custom/assets/images/flickr-icon.png b/src/custom/assets/images/flickr-icon.png new file mode 100644 index 0000000..7bf5e7d Binary files /dev/null and b/src/custom/assets/images/flickr-icon.png differ diff --git a/src/custom/assets/images/go-page-top.png b/src/custom/assets/images/go-page-top.png new file mode 100644 index 0000000..693d091 Binary files /dev/null and b/src/custom/assets/images/go-page-top.png differ diff --git a/src/custom/assets/images/h1-back.png b/src/custom/assets/images/h1-back.png new file mode 100644 index 0000000..3c08591 Binary files /dev/null and b/src/custom/assets/images/h1-back.png differ diff --git a/src/custom/assets/images/h2-back.png b/src/custom/assets/images/h2-back.png new file mode 100644 index 0000000..99efe6b Binary files /dev/null and b/src/custom/assets/images/h2-back.png differ diff --git a/src/custom/assets/images/incf-banner.png b/src/custom/assets/images/incf-banner.png new file mode 100644 index 0000000..ff18077 Binary files /dev/null and b/src/custom/assets/images/incf-banner.png differ diff --git a/src/custom/assets/images/incf-logo.png b/src/custom/assets/images/incf-logo.png new file mode 100644 index 0000000..1be803e Binary files /dev/null and b/src/custom/assets/images/incf-logo.png differ diff --git a/src/custom/assets/images/indent.png b/src/custom/assets/images/indent.png new file mode 100644 index 0000000..f515ee7 Binary files /dev/null and b/src/custom/assets/images/indent.png differ diff --git a/src/custom/assets/images/links-aini2018.png b/src/custom/assets/images/links-aini2018.png new file mode 100644 index 0000000..da35452 Binary files /dev/null and b/src/custom/assets/images/links-aini2018.png differ diff --git a/src/custom/assets/images/links-hackathon2018sep.png b/src/custom/assets/images/links-hackathon2018sep.png new file mode 100644 index 0000000..ec496a7 Binary files /dev/null and b/src/custom/assets/images/links-hackathon2018sep.png differ diff --git a/src/custom/assets/images/links-jnodepf.png b/src/custom/assets/images/links-jnodepf.png new file mode 100644 index 0000000..ad7c1bf Binary files /dev/null and b/src/custom/assets/images/links-jnodepf.png differ diff --git a/src/custom/assets/images/links-newsletter-e.png b/src/custom/assets/images/links-newsletter-e.png new file mode 100644 index 0000000..b22f41e Binary files /dev/null and b/src/custom/assets/images/links-newsletter-e.png differ diff --git a/src/custom/assets/images/links-newsletter-j.png b/src/custom/assets/images/links-newsletter-j.png new file mode 100644 index 0000000..ea5c488 Binary files /dev/null and b/src/custom/assets/images/links-newsletter-j.png differ diff --git a/src/custom/assets/images/links-pfreport-e.png b/src/custom/assets/images/links-pfreport-e.png new file mode 100644 index 0000000..f053e4d Binary files /dev/null and b/src/custom/assets/images/links-pfreport-e.png differ diff --git a/src/custom/assets/images/links-pfreport-j.png b/src/custom/assets/images/links-pfreport-j.png new file mode 100644 index 0000000..69d923c Binary files /dev/null and b/src/custom/assets/images/links-pfreport-j.png differ diff --git a/src/custom/assets/images/logo.png b/src/custom/assets/images/logo.png new file mode 100644 index 0000000..e3b125c Binary files /dev/null and b/src/custom/assets/images/logo.png differ diff --git a/src/custom/assets/images/main-banner.png b/src/custom/assets/images/main-banner.png new file mode 100644 index 0000000..371d2e2 Binary files /dev/null and b/src/custom/assets/images/main-banner.png differ diff --git a/src/custom/assets/images/mlang_english.png b/src/custom/assets/images/mlang_english.png new file mode 100644 index 0000000..14755f1 Binary files /dev/null and b/src/custom/assets/images/mlang_english.png differ diff --git a/src/custom/assets/images/mlang_japanese.png b/src/custom/assets/images/mlang_japanese.png new file mode 100644 index 0000000..48991b2 Binary files /dev/null and b/src/custom/assets/images/mlang_japanese.png differ diff --git a/src/custom/assets/images/niu-banner.png b/src/custom/assets/images/niu-banner.png new file mode 100644 index 0000000..20eeb22 Binary files /dev/null and b/src/custom/assets/images/niu-banner.png differ diff --git a/src/custom/assets/images/riken-banner.png b/src/custom/assets/images/riken-banner.png new file mode 100644 index 0000000..7cedfb3 Binary files /dev/null and b/src/custom/assets/images/riken-banner.png differ diff --git a/src/custom/assets/images/rss-bmi.png b/src/custom/assets/images/rss-bmi.png new file mode 100644 index 0000000..55b2265 Binary files /dev/null and b/src/custom/assets/images/rss-bmi.png differ diff --git a/src/custom/assets/images/rss-bsi-ni.png b/src/custom/assets/images/rss-bsi-ni.png new file mode 100644 index 0000000..d144575 Binary files /dev/null and b/src/custom/assets/images/rss-bsi-ni.png differ diff --git a/src/custom/assets/images/rss-cbsn.png b/src/custom/assets/images/rss-cbsn.png new file mode 100644 index 0000000..3f229a3 Binary files /dev/null and b/src/custom/assets/images/rss-cbsn.png differ diff --git a/src/custom/assets/images/rss-cdtdb.png b/src/custom/assets/images/rss-cdtdb.png new file mode 100644 index 0000000..7ea7bd8 Binary files /dev/null and b/src/custom/assets/images/rss-cdtdb.png differ diff --git a/src/custom/assets/images/rss-cerebellum.png b/src/custom/assets/images/rss-cerebellum.png new file mode 100644 index 0000000..90e42b1 Binary files /dev/null and b/src/custom/assets/images/rss-cerebellum.png differ diff --git a/src/custom/assets/images/rss-dynamicbrain.png b/src/custom/assets/images/rss-dynamicbrain.png new file mode 100644 index 0000000..3d35a10 Binary files /dev/null and b/src/custom/assets/images/rss-dynamicbrain.png differ diff --git a/src/custom/assets/images/rss-incf.png b/src/custom/assets/images/rss-incf.png new file mode 100644 index 0000000..69b1f2f Binary files /dev/null and b/src/custom/assets/images/rss-incf.png differ diff --git a/src/custom/assets/images/rss-invbrain.png b/src/custom/assets/images/rss-invbrain.png new file mode 100644 index 0000000..403372f Binary files /dev/null and b/src/custom/assets/images/rss-invbrain.png differ diff --git a/src/custom/assets/images/rss-mpdb.png b/src/custom/assets/images/rss-mpdb.png new file mode 100644 index 0000000..cb131ed Binary files /dev/null and b/src/custom/assets/images/rss-mpdb.png differ diff --git a/src/custom/assets/images/rss-nimg.png b/src/custom/assets/images/rss-nimg.png new file mode 100644 index 0000000..e1fd0f8 Binary files /dev/null and b/src/custom/assets/images/rss-nimg.png differ diff --git a/src/custom/assets/images/rss-visiome.png b/src/custom/assets/images/rss-visiome.png new file mode 100644 index 0000000..76d4601 Binary files /dev/null and b/src/custom/assets/images/rss-visiome.png differ diff --git a/src/custom/assets/images/search.png b/src/custom/assets/images/search.png new file mode 100644 index 0000000..0d00928 Binary files /dev/null and b/src/custom/assets/images/search.png differ diff --git a/src/custom/assets/images/sitemap.png b/src/custom/assets/images/sitemap.png new file mode 100644 index 0000000..831915a Binary files /dev/null and b/src/custom/assets/images/sitemap.png differ diff --git a/src/custom/assets/images/twitter-icon.png b/src/custom/assets/images/twitter-icon.png new file mode 100644 index 0000000..884fc80 Binary files /dev/null and b/src/custom/assets/images/twitter-icon.png differ diff --git a/src/custom/assets/images/xoonips-banner.png b/src/custom/assets/images/xoonips-banner.png new file mode 100644 index 0000000..8d08859 Binary files /dev/null and b/src/custom/assets/images/xoonips-banner.png differ diff --git a/src/custom/assets/style.css b/src/custom/assets/style.css new file mode 100644 index 0000000..3b8ce11 --- /dev/null +++ b/src/custom/assets/style.css @@ -0,0 +1,664 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + line-height: 1.15; +} + +html, +body, +#root { + width: 100%; + min-width: 990px; +} + +body { + font-family: Arial, Helvetica, sans-serif; + color: #333333; + background-color: #ffffff; + margin: 0; + font-size: 14px; + border-top: 3px solid #2c6bab; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: Georgia, "Times New Roman", Times, serif; + margin-bottom: 0.5rem; + font-weight: bold; + line-height: 1.2; +} + +h1 { + font-size: 1.383rem; +} + +h2 { + font-size: 1.296rem; +} + +h3 { + font-size: 1.215rem; +} + +h4 { + font-size: 1.138rem; +} + +h5 { + font-size: 1.067rem; +} + +h6 { + font-size: 1rem; +} + +p { + margin: 0 0 1rem; +} + +a { + color: #16315c; +} + +a:visited { + color: #5c165b; +} + +ul, ol { + margin: 0 0 1rem; + padding-left: 1rem; +} + +li { + margin: 0 0 0.5rem; + padding: 0 0 0 0.5rem; +} + +table { + margin: 0 0 1rem; + width: 100%; +} + +td, +th { + padding: 0.5rem; +} + +td { + vertical-align: top; +} + +.foot { + vertical-align: middle; +} + +th, +.head, +.foot { + font-weight: bold; + color: #666666; + background-color: #eeeeee; + vertical-align: middle; +} + +.even { + background-color: #f7f7f7; +} + +.odd { + background-color: #fafafa; +} + +.col2::after { + content: ""; + display: block; + clear: both; +} + +.col2 .leftcolumn { + float: left; + width: 260px; + margin: 10px 0; +} + +.col2 .centercolumn { + float: right; + width: 720px; +} + +.centerCcolumn { + margin: 10px 0; +} + +.centerLcolumn { + display: inline-block; + vertical-align: top; + margin: 10px 10px 10px 0; + width: calc(50% - 10px); +} + +.centerRcolumn { + display: inline-block; + vertical-align: top; + margin: 10px 0 10px 10px; + width: calc(50% - 10px); +} + +.centerLcolumn .block:not(:first-child), +.centerRcolumn .block:not(:first-child) { + margin-top: 20px; +} + +.hidden { + display: none; +} + +.block .blockTitle { + font-weight: bold; + color: #ffffff; + background: url(images/blockTitleBack.png) no-repeat left center; + text-shadow: 0px -1px 0 #000000; +} + +.centercolumn .block { + border: 1px solid#cccccc; +} + +.leftcolumn .block:not(:first-child) { + margin: 10px 0; +} + +.leftcolumn .blockTitle, +.centerCcolumn .blockTitle { + padding: 0.75rem 0.75rem 0.75rem 1.5rem; +} + +.centerRcolumn .blockTitle, +.centerLcolumn .blockTitle { + margin: 8px 10px 0; + padding: 0.5rem 0.5rem 0.5rem 1.5rem; +} + +.centerCcolumn .blockContent, +.centerRcolumn .blockContent, +.centerLcolumn .blockContent { + margin: 0; + padding: 10px; +} + +#page { + margin: 0 auto; + width: 990px; +} + +#header { + margin: 0; + width: 990px; + min-width: 990px; +} + +#header a { + color: #333333; +} + +#header .top { + height: 90px; +} + +#header .top::after { + clear: both; + content: ''; + display: block; +} + +#header .logo { + float: left; + display: block; + margin: 10px 0; + height: 70px; + width: 400px; + background-image: url(images/logo.png); +} + +#header .utility { + float: right; + display: block; + height: 90px; + width: 590px; + text-align: right; +} + +#header .utility .socialmedia { + display: inline-block; + position: relative; + width: 126px; + height: 35px; + top: 20px; + right: 50px; +} + +#header .utility .socialmedia a { + padding: 0 5px; +} + +#header .utility .sitemap { + display: inline-block; + position: relative; + top: 20px; + left: 80px; +} + +#header .utility .incf { + display: inline-block; + position: relative; + width: 120px; + height: 68px; + top: 5px; +} + +#header .utility .language { + display: inline-block; + position: relative; + width: 80px; + top: 15px; + right: -115px; +} + +#header .utility .language a { + display: inline-block; + font-size: 12px; + text-indent: 10px; + background: url(./images/indent.png) no-repeat left center; +} + +#header .menubar { + height: 40px; + background: linear-gradient(#fff, #eee); +} + +#header .menubar::after { + content: ""; + display: block; + clear: both; +} + +#header .menubar .mainmenu { + float: left; + margin: 0; + padding: 0; + list-style-type: none; + font-size: 90%; +} + +#header .menubar .mainmenu>li { + display: inline-block; + border-right: 2px solid #bbcdd5; + text-align: center; +} + +#header .menubar .mainmenu li:hover { + background: linear-gradient(#fff, #d9e5fe); + cursor: pointer; +} + +#header .menubar .mainmenu li>a, +#header .menubar .mainmenu li>span { + display: block; + margin: 0 10px; + text-decoration: none; + color: #333333; + text-shadow: 0px 1px #FFF; +} + +#header .menubar .mainmenu>li { + line-height: 39px; + height: 40px; + margin: 0; + padding: 0; +} + +#header .menubar .mainmenu .submenu { + display: block; + position: absolute; + width: 200px; + text-align: left; + border: 1px solid #cccccc; + animation: fadeIn 1s ease 0s 1 normal; + font-size: 90%; + z-index: 1; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +#header .menubar .mainmenu .submenu .item { + display: block; + line-height: 1.5; + padding: 5px 10px; + text-decoration: none; + background: linear-gradient(#fff, #eee); +} + +#header .menubar .mainmenu .submenu .item:not(:first-child) { + border-top: 1px solid #cccccc; +} + +#header .menubar .mainmenu .submenu .item:hover { + background: linear-gradient(#fff, #d9e5fe); +} + +#header .menubar .search_box { + float: right; + margin: 10px 15px 0 0; +} + +#header .menubar .search_box input { + margin: 0 1px; + padding: 2px; + height: 20px; + width: 150px; + border: 1px #ddd solid; + line-height: normal; + vertical-align: top; +} + +#header .menubar .search_box a { + line-height: 0; + font-size: 0; +} + +#footer { + text-align: center; +} + +#footer .banners { + margin: 0; + padding: 0; + height: 60px; + list-style-type: none; + line-height: 60px; +} + +#footer .banners>li { + margin: 0 10px; + display: inline-block; +} + +#footer .banners>li img { + vertical-align: middle; +} + +#footer .banners .credits { + color: white; + background: #0174DF; + font-weight: bold; + padding: 5px 10px; + border-radius: 20px; + text-decoration: none; +} + +#footer .copyright { + line-height: 38px; + display: block; + font-size: 90%; +} + +#main { + margin: 10px 0; + background-color: #ffffff; + min-height: 500px; + font-size: 90%; +} + +#main .goPageTop { + text-align: right; + font-size: 80%; +} + +#main .goPageTop a { + display: inline-block; + line-height: 2; + padding: 0 20px; + background: url(./images/go-page-top.png) no-repeat; + text-decoration: none; + color: #333333; +} + +#main .goPageTop a:hover { + text-decoration: none; + color: #333333; +} + +#main h1 { + font-weight: bold; + padding: .3rem .3rem .3rem 2.25rem; + background: url(images/h1-back.png) no-repeat left center; + border: 1px solid #cccccc; + color: white; + text-shadow: 0px -1px 0 #000; +} + +#main h2 { + font-weight: bold; + padding: .3rem .3rem .3rem 2.25rem; + background: url(images/h2-back.png) no-repeat left center; + border: 1px solid #cccccc; + text-shadow: 0px -1px 0 #FFF; +} + +#main h3 { + position: relative; + padding: .2rem .2rem .2rem .75rem; + border-left: 6px solid #ccc; + border-bottom: 1px solid #ccc; +} + +#main .pico_body { + margin: 0; + padding: 0; +} + +#link-banners div { + margin-bottom: 8px; + font-size: 0; +} + +.feed { + margin: 0 0 10px; +} + +.feed .pubDate { + color: #797c80; + margin: 0 5px 0; + font-size: 90%; + font-weight: bold; + font-style: italic; +} + +.feed .pubDate .new { + margin-left: 3px; + font-weight: bold; + color: #ff9999; +} + +.feed .logo { + display: inline-block; + width: 60px !important; + overflow: hidden; + margin: 2px 10px; +} + +.feed .item { + display: inline-block; + vertical-align: top; + width: calc(100% - 80px); +} + +.feed .item .site { + margin: 2px 0 0; + font-size: 85%; + font-style: italic; +} + +/* +.pico_body table { + border-collapse: collapse; + font-size: 0.9rem; +} + +.pico_body table caption { + font-weight: bold; + font-size: 1.2rem; +} + +.pico_body table, +.pico_body th, +.pico_body td { + border: 1px solid black; + padding: 5px; +} +*/ + +.bulletin { + margin: 10px 5px; +} + +.bulletin .itemHead { + margin: 10px 0 5px; + padding: 2px 0; + font-weight: bold; + border-bottom: 1px dotted #CCC; +} + +.bulletin .itemInfo { + text-align: right; + margin: 5px 0; + padding: 3px 0; + font-size: 90%; +} + +.bulletin .itemTitle { + font-size: 120%; + font-weight: bold; +} + +.bulletin .itemTitle a { + text-decoration: none; +} + +.bulletin .itemPoster { + font-size: 90%; +} + +.bulletin .itemPostDate { + font-size: 90%; +} + +.bulletin .itemStats { + font-size: 90%; +} + +.bulletin .itemBody { + padding: 0; + overflow: hidden; +} + +.bulletin .itemText { + margin: 5px 0; + line-height: 1.47em; + letter-spacing: 0.04em; + font-size: 94%; +} + +.bulletin .itemFoot { + text-align: right; + padding: 2px 0; + border-top: 2px dotted #999; +} + +.bulletin .itemPermaLink { + clear: both; + margin: 5px 0; + font-size: 90%; +} + +.bulletin .pagenavi { + margin: 5px 0; + text-align: right; + font-size: 95%; +} + +.bulletin .pagenavi .pages { + margin-left: 10px; + font-weight: bold; +} + +.bulletin .pagenavi .pages .current:before { + content: '('; +} + +.bulletin .pagenavi .pages .current:after { + content: ')'; +} + +.platform-committee th:first-child { + width: 120px; +} + +.platform-committee th:nth-child(2) { + width: 200px; +} + +.xoonips .listTable table { + margin: 0; +} + +.xoonips .listTable table > tbody > tr > td { + padding: 0; +} + +.xoonips .listTable .listBody div { + margin: 1px 0; +} +.xoonips .listTable .listBody .journal .journal_name { + font-style: italic; +} + +.xoonips .itemDetail { + max-width: 720px; +} +.xoonips .itemDetail > tbody > tr > td:first-child { + width: 200px; +} +.xoonips .itemDetail > tbody > tr > td:nth-child(2) { + width: 520px; + max-width: 520px; +} + +.xoonips .itemDetail table { + margin: 5px 0; +} + +.xoonips .itemDetail table td, +.xoonips .itemDetail table th { + padding: 5px 0; +} + +.xoonips .itemDetail table td:first-child { + white-space: nowrap; +} diff --git a/src/custom/blocks/LinkBannersBlock.tsx b/src/custom/blocks/LinkBannersBlock.tsx new file mode 100644 index 0000000..637f107 --- /dev/null +++ b/src/custom/blocks/LinkBannersBlock.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../config'; +import imageLinksAini2018 from '../assets/images/links-aini2018.png'; +import imageLinksHakcathon2018Sep from '../assets/images/links-hackathon2018sep.png'; +import imageLinksJnodePf from '../assets/images/links-jnodepf.png'; +import imageLinksNewsletterE from '../assets/images/links-newsletter-e.png'; +import imageLinksNewsletterJ from '../assets/images/links-newsletter-j.png'; +import imageLinksPfReportE from '../assets/images/links-pfreport-e.png'; +import imageLinksPfReportJ from '../assets/images/links-pfreport-j.png'; + +interface Props { + lang: MultiLang; +} + +const LinkBannersBlock: React.FC = (props: Props) => { + const { lang } = props; + const links = [ + { name: 'AINI 2018', image: imageLinksAini2018, link: '/aini2018/' }, + { name: 'J-Node Hackathon 2018 September', image: imageLinksHakcathon2018Sep, link: '/hackathon2018/september.html' }, + { name: 'J-Node Platform', image: imageLinksJnodePf, link: '/resource/platform.html' }, + { name: 'J-Node Newsletter', image: lang === 'en' ? imageLinksNewsletterE : imageLinksNewsletterJ, link: '/modules/news/index.php?storytopic=4' }, + { name: 'J-Node Platform Report', image: lang === 'en' ? imageLinksPfReportE : imageLinksPfReportJ, link: '/publication' } + ]; + return ; +}; + +export default LinkBannersBlock; \ No newline at end of file diff --git a/src/custom/blocks/RssBlock.tsx b/src/custom/blocks/RssBlock.tsx new file mode 100644 index 0000000..845ec7a --- /dev/null +++ b/src/custom/blocks/RssBlock.tsx @@ -0,0 +1,95 @@ +import React from 'react'; +import Loading from '../../common/lib/Loading'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import RssFeed, { RssFeedItem, RssFeedSite } from '../lib/RssFeed'; + +interface Props { + lang: MultiLang; + sites: RssFeedSite[]; + num: number; +} + +interface State { + loading: boolean; + feeds: RssFeedItem[] | null; +} + +const rssMerge = (a: RssFeedItem[], b: RssFeedItem[], maxlength: number) => { + return a.concat(b).sort((i, j) => { return i.pubDate === j.pubDate ? 0 : (i.pubDate > j.pubDate ? -1 : 1) }).slice(0, maxlength); +}; +const arrayDiff = (a: string[], b: string[]): string[] => { return a.filter((i: string) => { return b.indexOf(i) < 0 }) }; + +class RssBlock extends React.Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + feeds: null + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updateFeed(); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { sites, num } = this.props; + const prevSites = prevProps.sites; + const prevNum = prevProps.num; + const siteIds = sites.map((site) => site.id); + const prevSiteIds = prevSites.map((site) => site.id); + if (num !== prevNum || arrayDiff(siteIds, prevSiteIds).length !== 0 || arrayDiff(prevSiteIds, siteIds).length !== 0) { + this.setState({ loading: true, feeds: null }); + this.updateFeed(); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + async updateFeed() { + const { sites, num } = this.props; + let feeds: RssFeedItem[] = []; + const infos = await Promise.all(sites.map(async (site) => RssFeed.getInfo(site))); + infos.forEach((info) => { + feeds = rssMerge(feeds, info.items, num); + }) + if (this.isActive) { + this.setState({ loading: false, feeds }); + } + } + + render() { + const { loading, feeds } = this.state; + if (loading) { + return ; + } + if (feeds === null) { + return
Faild to get RSS feeds.
; + } + const newRange = new Date().getTime() / 1000 - 604800; + return
+ {feeds.map((feed, index) => { + const site = RssFeed.getSite(feed.id); + const isNew = feed.pubDate > newRange; + return
+
{Functions.formatDate(feed.pubDate, 'YYYY-M-D')}{isNew && New}
+
{site.name}
+
+ +
({site.name})
+
+
+ })} +
; + } +} + +export default RssBlock; \ No newline at end of file diff --git a/src/custom/lib/RssFeed.ts b/src/custom/lib/RssFeed.ts new file mode 100644 index 0000000..ca20eef --- /dev/null +++ b/src/custom/lib/RssFeed.ts @@ -0,0 +1,72 @@ +import moment from 'moment'; +import RSSParser from 'rss-parser'; + +export interface RssFeedSite { + id: string; + name: string; + logo: string; + url: string; + rss: string; +} + +export interface RssFeedItem { + id: string; + title: string; + link: string; + pubDate: number; +} + +export interface RssFeedInfo { + site: RssFeedSite; + items: RssFeedItem[]; + loaded: boolean; +} + +const CORS_PROXY = "https://archive.ni.brain.riken.jp/cors/"; +const feedInfoCache = new Map(); + +const getInfo = async (site: RssFeedSite): Promise => { + const info = feedInfoCache.get(site.id) || { site, items: [], loaded: false }; + if (!info.loaded) { + info.loaded = true; + const parser = new RSSParser(); + try { + const output = await parser.parseURL(CORS_PROXY + site.rss); + if (typeof output.items !== 'undefined') { + output.items.forEach((item) => { + if (typeof item.title !== 'undefined' && typeof item.link !== 'undefined') { + const dateString = item.pubDate || item.isoDate; + const pubDate = moment(dateString).unix(); + if (!isNaN(pubDate)) { + info.items.push({ + id: site.id, + title: item.title, + link: item.link, + pubDate: pubDate, + }); + } + } + }); + } + } catch (err) { + // ignore + } + feedInfoCache.set(site.id, info); + } + return info; +} + +const getSite = (id: string) => { + const info = feedInfoCache.get(id); + if (typeof info === 'undefined') { + return { id: id, name: '', logo: '', url: '' }; + } + return info.site; +} + +const RssFeed = { + getInfo, + getSite +} + +export default RssFeed; \ No newline at end of file diff --git a/src/functions.ts b/src/functions.ts new file mode 100644 index 0000000..4bdfc3e --- /dev/null +++ b/src/functions.ts @@ -0,0 +1,136 @@ +import moment from 'moment'; +import XRegExp from 'xregexp'; +import Config, { MultiLang } from './config'; + +const escape = (str: string): string => { + return encodeURIComponent(str).replace(/[!'()*]/g, (c) => { + return '%' + c.charCodeAt(0).toString(16); + }); +} + +const unescape = (str: string): string => { + return decodeURIComponent(str); +} + +const htmlspecialchars = (str: string): string => { + return str.replace(/(<|>|&|'|")/g, (match) => { + switch (match) { + case '<': + return '<'; + case '>': + return '>'; + case '&': + return '&'; + case '\'': + return '''; + case '"': + return '"'; + } + return ''; + }); +} + +const camelCase = (str: string): string => { + return str.replace(/[-_](.)/g, (...matches) => { + return matches[1].toUpperCase(); + }); +} + +const snakeCase = (str: string): string => { + var camel = camelCase(str); + return camel.replace(/[A-Z]/g, (...matches) => { + return "_" + matches[0].charAt(0).toLowerCase(); + }); +} + +const pascalCase = (str: string): string => { + var camel = camelCase(str); + return camel.charAt(0).toUpperCase() + camel.slice(1); +} + +const base64Encode = (str: string): string => { + return btoa(unescape(encodeURIComponent(str))); +} + +const base64Decode = (str: string): string => { + return decodeURIComponent(escape(atob(str))); +} + +const formatDate = (timestamp: number, format: string): string => { + return moment(new Date(timestamp * 1000)).format(format); +} + +const ordinal = (num: number): string => { + const hundred = num % 100; + if (hundred >= 10 && hundred <= 20) { + return 'th'; + } + const ten = num % 10; + const suffix = ['st', 'nd', 'rd']; + return ten > 0 && ten < 4 ? suffix[ten - 1] : 'th'; +} + +const mlang = (str: string, lang: MultiLang): string => { + const mlLangs = ['en', 'ja']; + // escape brackets inside of + let text = str.replace(/(]*)(>)/isg, (whole, m1, m2, m3) => { + if (m2.match(/type=["']?(?:text|hidden)["']?/is)) { + return m1 + m2.replace(/\[/g, '__ml[ml__') + m3; + } + return whole; + }); + // escape brackets inside of + text = text.replace(/(]*>)(.*)(<\/textarea>)/isg, (whole, m1, m2, m3) => { + return m1 + m2.replace(/\[/g, '__ml[ml__') + m3; + }); + // simple pattern to strip selected lang_tags + const re = new RegExp('\\[/?(?:[^\\]]+\\|)?' + lang + '(?:\\|[^\\]]+)?\\](?:
)?', 'g'); + text = text.replace(re, ''); + // eliminate description between the other language tags. + mlLangs.forEach((mlLang) => { + if (mlLang !== lang) { + const re = XRegExp('\\[(?:[^/][^\\]]+\\|)?' + mlLang + '(?:\\|[^\\]]+)?\\].*?\\[/(?:[^\\]]+\\|)?' + mlLang + '(?:\\|[^\\]]+)?\\](?:
)?', 'isg'); + text = text.replace(re, (whole) => { + return whole.match(/<\/table>/) ? whole : ''; + }); + } + }); + // unescape brackets inside of + text = text.replace(/(]*>)(.*)(<\/textarea>)/isg, (whole, m1, m2, m3) => { + return m1 + m2.replace(/__ml\[ml__/g, '[') + m3; + }); + // unescape brackets inside of + text = text.replace(/(]*)(>)/isg, (whole, m1, m2, m3) => { + if (m2.match(/type=["']?(?:text|hidden)["']?/is)) { + return m1 + m2.replace(/__ml\[ml__/g, '[') + m3; + } + return whole; + }); + return text; +} + +const siteTitle = (lang: MultiLang): string => { + return mlang(Config.SITE_TITLE, lang); +} + +const siteSlogan = (lang: MultiLang): string => { + return mlang(Config.SITE_SLOGAN, lang); +} + +const Functions = { + escape, + unescape, + htmlspecialchars, + camelCase, + snakeCase, + pascalCase, + base64Encode, + base64Decode, + formatDate, + ordinal, + mlang, + siteTitle, + siteSlogan, +}; + +export default Functions; \ No newline at end of file diff --git a/src/index.css b/src/index.css index ec2585e..2daa7e9 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +1 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} +@import-normalize; diff --git a/src/index.tsx b/src/index.tsx index 87d1be5..d6fc2b4 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,12 +1,14 @@ +import 'react-app-polyfill/ie11'; +import 'react-app-polyfill/stable'; import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; -import * as serviceWorker from './serviceWorker'; +// import * as serviceWorker from './serviceWorker'; ReactDOM.render(, document.getElementById('root')); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. // Learn more about service workers: https://bit.ly/CRA-PWA -serviceWorker.unregister(); +// serviceWorker.unregister(); diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/pico/Pico.tsx b/src/pico/Pico.tsx new file mode 100644 index 0000000..cca8644 --- /dev/null +++ b/src/pico/Pico.tsx @@ -0,0 +1,133 @@ +import React, { Component } from 'react'; +import { Redirect, Route, RouteComponentProps, Switch } from 'react-router-dom'; +import Loading from '../common/lib/Loading'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import './assets/pico_main.css'; +import PicoContext from './lib/PicoContext'; +import PicoUtils from './lib/PicoUtils'; +import PicoCategory from './PicoCategory'; +import PicoContent from './PicoContent'; +import PicoMenu from './PicoMenu'; + +interface Props { + lang: MultiLang; + dirname: string; + virtualpath: string; + showTitle: boolean; +} + +interface State { + loading: boolean; + context: PicoContext | null; +} + +class Pico extends Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.isActive = false; + this.state = { + loading: true, + context: null, + }; + } + + componentDidMount() { + this.isActive = true; + this.updatePage(); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { lang, dirname, virtualpath } = this.props; + if (prevProps.lang !== lang || prevProps.dirname !== dirname || prevProps.virtualpath !== virtualpath) { + this.updatePage(); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + async updatePage() { + const { dirname, showTitle } = this.props; + const context = PicoUtils.getContext(dirname, showTitle); + const status = await context.initialize(); + if (this.isActive) { + this.setState({ loading: false, context: status ? context : null }); + } + } + + render() { + const { lang, dirname, virtualpath } = this.props; + const { loading, context } = this.state; + if (loading) { + return ; + } + if (context === null) { + return ; + } + const module = context.getModule(); + if (module === null) { + return ; + } + const modulepath = context.getUrl(''); + return + { + const { location } = props; + const url = modulepath + '/index.php' + location.search + location.hash; + return + }} /> + { + const { location } = props; + const { pathname, search } = location; + const regexVirutal = new RegExp(`^${virtualpath}`); + const regexModule = new RegExp(`^${dirname}/?`); + let link = pathname.replace(regexVirutal, dirname).replace(regexModule, ''); + if (link + '/' === virtualpath) { + link = ''; + } + if (link.match(/.html$/)) { + const content = context.getContentByPath(link); + if (content !== null) { + return ; + } + return ; + } + const category = context.getCategoryByPath(link); + if (category !== null) { + if (module.show_listasindex !== 0) { + return + } + const content = context.getFirstContent(category.id); + if (content !== null) { + return ; + } + return ; + } + if (link === '' || link === 'index.php') { + const params = new URLSearchParams(search); + const paramCatId = params.get('cat_id'); + if (paramCatId !== null && paramCatId.match(/^\d+$/)) { + const catId = parseInt(paramCatId, 10); + return ; + } + const paramContentId = params.get('content_id'); + if (paramContentId !== null && paramContentId.match(/^\d+$/)) { + const contentId = parseInt(paramContentId, 10); + return ; + } + const paramPage = params.get('page'); + if ((paramPage !== null && paramPage === 'menu') || module.show_menuinmoduletop !== 0) { + return ; + } + } + return ; + }} /> + ; + } +} + +export default Pico; diff --git a/src/pico/PicoCategory.tsx b/src/pico/PicoCategory.tsx new file mode 100644 index 0000000..3d7f79d --- /dev/null +++ b/src/pico/PicoCategory.tsx @@ -0,0 +1,81 @@ +import React, { Fragment } from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import PicoContext, { PicoCategoryData, PicoContentData } from './lib/PicoContext'; + +interface Props { + lang: MultiLang; + context: PicoContext; + catId: number; +} + +const PicoCategory = (props: Props) => { + const { lang, context, catId } = props; + const pico = context.getModule(); + if (pico === null) { + return ; + } + const category = context.getCategory(catId); + if (category === null) { + return ; + } + const parentCategories = context.getParentCategories(category.pid); + const subCategories = context.getSubCategories(catId); + const contents = context.getCategoryContents(catId); + return ( +
+ + {Functions.mlang(category.title, lang)} - {Functions.mlang(pico.name, lang)} - {Functions.siteTitle(lang)} + + {pico.show_breadcrumbs !== 0 && ( +
+ {parentCategories.map((parentCategory: PicoCategoryData, idx: number) => { + return ( + + {idx > 0 && <> > } + {Functions.mlang(parentCategory.title, lang)} + + ); + })} + {parentCategories.length > 0 && <> > } + {Functions.mlang(category.title, lang)} +
+ )} + {catId === 0 && pico.message !== '' && ( +

{Functions.mlang(pico.message, lang)}

+ )} +

{Functions.mlang(category.title, lang)}

+ {category.desc !== '' && ( +

{Functions.mlang(category.desc, lang)}

+ )} + {subCategories.length > 0 && ( + <> +

{Functions.mlang('[en]Subcageroies[/en][ja]サブカテゴリー[/ja]', lang)}

+ {subCategories.map((subCategory: PicoCategoryData) => { + return ( +
+
{Functions.mlang(subCategory.title, lang)}
+
{Functions.mlang(subCategory.desc, lang)}
+
+ ); + })} + + )} + {contents.length > 0 && ( + <> +

{Functions.mlang('[en]Contents[/en][ja]コンテンツ[/ja]', lang)}

+
    + {contents.map((content: PicoContentData) => { + return
  • {Functions.mlang(content.title, lang)}
  • ; + })} +
+ + )} +
+ ); +}; + +export default PicoCategory; \ No newline at end of file diff --git a/src/pico/PicoContent.tsx b/src/pico/PicoContent.tsx new file mode 100644 index 0000000..f37c55b --- /dev/null +++ b/src/pico/PicoContent.tsx @@ -0,0 +1,112 @@ +import React, { Component, Fragment } from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import { HashLink } from 'react-router-hash-link'; +import Loading from '../common/lib/Loading'; +import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived'; +import PageNotFound from '../common/lib/PageNotFound'; +import XoopsCode from '../common/lib/XoopsCode'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import PicoContext, { PicoCategoryData, PicoPageData } from './lib/PicoContext'; + +interface Props { + lang: MultiLang; + context: PicoContext; + contentId: number; +} + +interface State { + loading: boolean; + page: PicoPageData | null; +} + +class PicoContent extends Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + page: null, + }; + this.isActive = false; + } + + componentDidMount() { + const { contentId } = this.props; + this.isActive = true; + this.updatePage(contentId); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { context, contentId } = this.props; + const prevContext = prevProps.context; + const prevContentId = prevProps.contentId; + if (context !== prevContext || contentId !== prevContentId) { + this.setState({ loading: true, page: null }); + this.updatePage(contentId); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + async updatePage(contentId: number) { + const { context } = this.props; + const page = await context.getPage(contentId); + if (this.isActive) { + this.setState({ loading: false, page }); + } + } + + render() { + const { lang, context, contentId } = this.props; + const { loading, page } = this.state; + if (loading) { + return ; + } + if (page === null) { + return ; + } + const pico = context.getModule(); + if (pico === null) { + return ; + } + const categories = context.getContentCategery(contentId); + return ( +
+ + {Functions.mlang(page.title, lang)} - {Functions.mlang(pico.name, lang)} - {Functions.siteTitle(lang)} + + {context.isShowTitle() && <> +

{Functions.mlang(pico.name, lang)}

+ + } + {pico.show_breadcrumbs !== 0 && ( +
+ {categories.map((category: PicoCategoryData, idx: number) => { + return ( + + {idx > 0 && <> > } + {Functions.mlang(category.title, lang)} + + ); + })} +  > {Functions.mlang(page.title, lang)} +
+ )} +
+ +
+
+ {Functions.mlang('[en]Jump to the top[/en][ja]この記事の1行目に飛ぶ[/ja]', lang)} +
+
+ ); + } +} + +export default PicoContent; diff --git a/src/pico/PicoMenu.tsx b/src/pico/PicoMenu.tsx new file mode 100644 index 0000000..72470a4 --- /dev/null +++ b/src/pico/PicoMenu.tsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import PicoContext, { PicoCategoryData, PicoContentData } from './lib/PicoContext'; + +interface Props { + lang: MultiLang; + context: PicoContext; +} + +interface PicoMenuCategoryProps { + lang: MultiLang; + context: PicoContext; + category: PicoCategoryData; + depth: number; +} + +const PicoMenuCategory = (props: PicoMenuCategoryProps) => { + const { lang, context, category, depth } = props; + const subCategories = context.getSubCategories(category.id); + const contents = context.getCategoryContents(category.id); + const level = 'level' + depth; + const link = {Functions.mlang(category.title, lang)}; + let title =
{link}
; + switch (depth) { + case 1: + title =

{link}

; + break; + case 2: + title =

{link}

; + break; + case 3: + title =

{link}

; + break; + case 4: + title =

{link}

; + break; + case 5: + title =
{link}
; + break; + } + return ( + <> + {title} + {contents.length > 0 && ( +
+
    + {contents.map((content: PicoContentData) => { + return
  • {Functions.mlang(content.title, lang)}
  • ; + })} +
+
+ )} + {subCategories.length > 0 && ( + <> + {subCategories.map((subCategory: PicoCategoryData) => { + return ; + })} + + )} + + ); +} + +const PicoMenu = (props: Props) => { + const { lang, context } = props; + const pico = context.getModule(); + if (pico === null) { + return ; + } + const category = context.getCategory(0); + if (category === null) { + return ; + } + return ( +
+ + {Functions.mlang('[en]Menu[/en][ja]メニュー[/ja]', lang)} - {Functions.mlang(pico.name, lang)} - {Functions.siteTitle(lang)} + + {pico.message !== '' && ( +

{Functions.mlang(pico.message, lang)}

+ )} + +
+ ); +}; + +export default PicoMenu; \ No newline at end of file diff --git a/src/pico/assets/pico_main.css b/src/pico/assets/pico_main.css new file mode 100644 index 0000000..9413c22 --- /dev/null +++ b/src/pico/assets/pico_main.css @@ -0,0 +1,140 @@ +div.pico_breadcrumbs { + font-size: 95%; + padding: 0 0 3px; + border-bottom: 1px #aaa solid; +} + +.pico_body { + margin: 0 -2px; + padding: 15px 8px; +} + +div.pico_menu h1 { + margin: 18px 0 0 0; + padding: 3px; + background-color: #eee; +} +div.pico_menu h2 { + margin: 18px 0 0 10px; + padding: 3px; + background-color: #eee; +} +div.pico_menu h3 { + margin: 18px 0 0 20px; + padding: 3px; + background-color: #eee; +} +div.pico_menu h4 { + margin: 18px 0 0 30px; + padding: 3px; + background-color: #eee; +} +div.pico_menu h5 { + margin: 18px 0 0 40px; + padding: 3px; + background-color: #eee; +} +div.pico_menu div.level1 { + margin-left: 0; +} +div.pico_menu div.level2 { + margin-left: 10px; +} +div.pico_menu div.level3 { + margin-left: 20px; +} +div.pico_menu div.level4 { + margin-left: 30px; +} +div.pico_menu div.level5 { + margin-left: 40px; +} + +em.pico_notice { + font-weight: bold; + font-style: normal; + color: #ff0000; +} + +div.pico_controllers_in_menu { + float: right; + position: relative; + top: -1.5em; +} + +div.bottom_of_content_body { + clear: right; +} + +ul.pico_list_contents li { + list-style: none outside; +} +ul.pico_list_contents_in_menu li { + list-style: none outside; +} + +div.pico_print_icon { + float: right; + width: 40px; + height: 40px; +} +div.pico_tellafriend_icon { + float: right; + width: 40px; + height: 40px; +} +div.pico_vote form { + display: inline; +} + +table.pico_pagenavigation { + border-top: 1px #aaa solid; + margin-top: 20px; +} + +table.pico_form_table th.pico_waiting { + color: red; +} +table.pico_form_table td.pico_waiting { + color: red; + background-color: white; +} + +table.pico_form_table td, +table.pico_form_table th { + color: black; + vertical-align: top !important; + text-align: left; +} +p.pico_submit { + text-align: center; + margin: 0; + padding: 10px; +} + +input.pico_ascii_only { + ime-mode: disabled; +} +input.pico_number_only { + ime-mode: disabled; + text-align: right; +} + +pre.pico_history_diff del { + color: red; +} +pre.pico_history_diff ins { + color: blue; +} + +div.pico_pagebreak { + margin: 10px; +} +div.pico_pagebreak span { + border: 1px solid black; + padding: 2px; + margin: 2px; +} +div.pico_pagebreak span.selected { + border: 0px; +} diff --git a/src/pico/lib/PicoContext.ts b/src/pico/lib/PicoContext.ts new file mode 100644 index 0000000..ee58e26 --- /dev/null +++ b/src/pico/lib/PicoContext.ts @@ -0,0 +1,161 @@ +import axios from 'axios'; +import loki from 'lokijs'; + +export interface PicoModuleData { + name: string; + dirname: string; + message: string; + show_menuinmoduletop: number; + show_listasindex: number; + show_breadcrumbs: number; + show_pagenavi: number; +} + +export interface PicoCategoryData { + id: number; + title: string; + desc: string; + pid: number; + weight: number; + link: string; +} + +export interface PicoContentData { + id: number; + title: string; + cat_id: number; + weight: number; + link: string; +} + +export interface PicoIndexData { + module: PicoModuleData; + categories: PicoCategoryData[]; + contents: PicoContentData[]; +} + +export interface PicoPageData { + id: number; + title: string; + content: { + en: string; + ja: string; + } +} + +export const PICO_CATEGORY_ID_ROOT = 65535; + +class PicoContext { + + private isInitialized: boolean; + private dirname: string; + private showTitle: boolean; + private database: loki; + private module: PicoModuleData | null; + private categories: Collection; + private contents: Collection; + + constructor(dirname: string, showTitle: boolean) { + this.isInitialized = false; + this.dirname = dirname; + this.showTitle = showTitle; + this.database = new loki(`pico_${dirname}`); + this.module = null; + this.categories = this.database.addCollection('categories'); + this.contents = this.database.addCollection('contents'); + } + + isShowTitle(): boolean { + return this.showTitle; + } + + getUrl(path: string): string { + return `/modules/${this.dirname}` + (path !== '' ? `/${path}` : ''); + } + + getModule(): PicoModuleData | null { + return this.module; + } + + getCategoryByPath(link: string): PicoCategoryData | null { + return this.categories.findOne({ link: link }); + } + + getCategory(catId: number): PicoCategoryData | null { + return this.categories.findOne({ id: catId }); + } + + getParentCategories(catId: number): PicoCategoryData[] { + const categories: PicoCategoryData[] = []; + while (catId !== PICO_CATEGORY_ID_ROOT) { + const category = this.categories.findOne({ id: catId }); + if (category === null) { + break; + } + categories.unshift(category); + catId = category.pid; + } + return categories; + } + + getSubCategories(catId: number): PicoCategoryData[] { + return this.categories.chain().find({ pid: catId }).simplesort('weight').data(); + } + + getCategoryContents(catId: number): PicoContentData[] { + return this.contents.chain().find({ cat_id: catId }).simplesort('weight').data(); + } + + getContentCategery(contentId: number): PicoCategoryData[] { + const content = this.contents.findOne({ id: contentId }); + if (content === null) { + return []; + } + return this.getParentCategories(content.cat_id); + } + + getFirstContent(catId: number): PicoContentData | null { + const contents = this.contents.chain().find({ cat_id: catId }).simplesort('weight').limit(1).data(); + if (contents.length !== 1) { + return null; + } + return contents[0]; + } + + getContentByPath(link: string): PicoContentData | null { + return this.contents.findOne({ link: link }); + } + + async getPage(contentId: number): Promise { + let page: PicoPageData | null = null; + try { + const response = await axios.get(this.getUrl(`${contentId}.json`)); + page = response.data as PicoPageData; + } catch (err) { + // ignore + } + return page; + } + + async initialize(): Promise { + if (!this.isInitialized) { + try { + const response = await axios.get(this.getUrl('index.json')); + const index = response.data as PicoIndexData; + this.module = index.module; + index.categories.forEach((value) => { + this.categories.insert(value); + }); + index.contents.forEach((value) => { + this.contents.insert(value); + }); + } catch (err) { + // ignore + } + this.isInitialized = true; + } + return this.isInitialized; + } +} + +export default PicoContext; \ No newline at end of file diff --git a/src/pico/lib/PicoUtils.ts b/src/pico/lib/PicoUtils.ts new file mode 100644 index 0000000..0f67bcc --- /dev/null +++ b/src/pico/lib/PicoUtils.ts @@ -0,0 +1,22 @@ +import PicoContext from './PicoContext'; + +class PicoUtils { + + private static contexts: Map = new Map(); + + private constructor() { + // blcok to access from outside of this class + } + + public static getContext(dirname: string, showTitle: boolean): PicoContext { + let context = this.contexts.get(dirname); + if (typeof context === 'undefined') { + context = new PicoContext(dirname, showTitle); + this.contexts.set(dirname, context); + } + return context; + } + +} + +export default PicoUtils; diff --git a/src/xoonips/Xoonips.module.css b/src/xoonips/Xoonips.module.css new file mode 100644 index 0000000..12743fe --- /dev/null +++ b/src/xoonips/Xoonips.module.css @@ -0,0 +1,78 @@ +.database { + margin: 0; +} + +.database :global(.list) { + width: 100%; +} + +.database :global(.listTable) { + width: 100%; + border-collapse: separate; + border-spacing: 5px; +} + +.database :global(.listTable .listIcon), +.database :global(.listTable .listExtra) { + vertical-align: middle; + text-align: center; + width: 65px; + line-height: 0; +} + +.database :global(.itemDetail) { + border-collapse: separate; + border-spacing: 1px; +} +.database :global(.itemDetail .head) { + width: 30%; +} + +.database :global(.itemDetail .readme), +.database :global(.itemDetail .rights) { + background-color: #ffffff; + width: 100%; + max-height: 200px; + overflow: auto; +} + +.database :global(.advancedSearch .head) { + width: 30%; +} + +.database :global(.advancedSearch .search) { + text-align: center; + margin: 10px; +} + +.database :global(.advancedSearch .itemtype) { + margin: 5px 0; +} + +.database :global(.advancedSearch .itemtype .itemtypeName), +.database :global(.advancedSearch .itemtype .itemtypeFields) { + border-collapse: separate; + border-spacing: 1px; +} +.database :global(.advancedSearch .itemtype .itemtypeName) { + margin: 0; +} +.database :global(.advancedSearch .itemtype .itemtypeName input) { + margin-right: 5px; +} +.database :global(.advancedSearch .itemtype .itemtypeFields) { + margin: 2px 0; +} +.database :global(.advancedSearch .itemtype .itemtypeName th) { + padding: 10px; +} + +.database :global(.advancedSearch .fieldDateLabel) { + display: inline-block; + width: 50px; +} + +.database :global(.advancedSearch .fieldDate select), +.database :global(.advancedSearch .fieldDate input) { + margin: 0 5px 0 0; +} diff --git a/src/xoonips/Xoonips.tsx b/src/xoonips/Xoonips.tsx new file mode 100644 index 0000000..2040f8c --- /dev/null +++ b/src/xoonips/Xoonips.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { Helmet } from 'react-helmet'; +import { Redirect, Route, RouteComponentProps, Switch, withRouter } from 'react-router-dom'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemUtil from './lib/ItemUtil'; +import styles from './Xoonips.module.css'; +import XoonipsAdvancedSearch from './XoonipsAdvancedSearch'; +import XoonipsDetailItem from './XoonipsDetailItem'; +import XoonipsSearchByAdvancedKeyword from './XoonipsSearchByAdvancedKeyword'; +import XoonipsSearchByIndexId from './XoonipsSearchByIndexId'; +import XoonipsSearchByItemType from './XoonipsSearchByItemType'; +import XoonipsSearchByKeyword from './XoonipsSearchByKeyword'; +import XoonipsTop from './XoonipsTop'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +const Xoonips: React.FC = (props: Props) => { + const { lang, location } = props; + const query = new URLSearchParams(location.search); + query.delete('ml_lang'); + return ( +
+ + {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)} + + + } /> + } /> + { + const idStr = query.get('item_id'); + const doi = query.get('id'); + const id = idStr !== null && /^\d+$/.test(idStr) ? parseInt(idStr, 10) : null; + return ; + }} /> + { + const idStr = query.get('index_id'); + const id = idStr !== null && /^\d+$/.test(idStr) ? parseInt(idStr, 10) : null; + return ; + }} /> + { + const op = query.get('op') || ''; + query.delete('op'); + switch (op) { + case 'quick': { + const { type, keyword } = ItemUtil.getSearchKeywordByQuery(location.search); + return + } + case 'advanced': { + const search_itemtype = query.get('search_itemtype'); + if (search_itemtype !== null) { + return + } + if (Array.from(query).length > 0) { + return + } + return + } + } + return ; + }} /> + + +
+ ); +} + +export default withRouter(Xoonips); \ No newline at end of file diff --git a/src/xoonips/XoonipsAdvancedSearch.tsx b/src/xoonips/XoonipsAdvancedSearch.tsx new file mode 100644 index 0000000..95a1d20 --- /dev/null +++ b/src/xoonips/XoonipsAdvancedSearch.tsx @@ -0,0 +1,48 @@ +import React, { Component } from 'react'; +import { RouteComponentProps } from 'react-router'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemType from './item-type'; +import AdvancedSearchQuery from './lib/AdvancedSearchQuery'; +import ItemUtil from './lib/ItemUtil'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +class XoonipsAdvancedSearch extends Component { + + private query: AdvancedSearchQuery = new AdvancedSearchQuery(); + + constructor(props: Props) { + super(props); + this.handleClickSearchButton = this.handleClickSearchButton.bind(this); + } + + handleClickSearchButton() { + if (!this.query.empty()) { + const url = ItemUtil.getSearchByAdvancedKeywordsUrl(this.query); + this.props.history.push(url); + } + } + + render() { + const { lang } = this.props; + return ( +
+

{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}

+
+ +
+ {Config.XOONIPS_ITEMTYPES.map((type) => { + return ; + })} +
+ +
+
+ ); + } +} + +export default XoonipsAdvancedSearch; \ No newline at end of file diff --git a/src/xoonips/XoonipsDetailItem.tsx b/src/xoonips/XoonipsDetailItem.tsx new file mode 100644 index 0000000..6581d3f --- /dev/null +++ b/src/xoonips/XoonipsDetailItem.tsx @@ -0,0 +1,76 @@ +import React, { Component } from 'react'; +import { Helmet } from 'react-helmet'; +import Loading from '../common/lib/Loading'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemType from './item-type'; +import ItemUtil, { Item } from './lib/ItemUtil'; + +interface Props { + lang: MultiLang; + id: number | null; + doi: string | null +} + +interface State { + loading: boolean; + item: Item | null; +} + +class XoonipsDetailItem extends Component { + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + item: null, + }; + } + + componentDidMount() { + this.updateItem(); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { id, doi } = this.props; + if (id !== prevProps.id || doi !== prevProps.doi) { + this.updateItem(); + } + } + + updateItem() { + const { id, doi } = this.props; + if (doi !== null) { + ItemUtil.getByDoi(doi, (item) => { + this.setState({ loading: false, item }); + }); + } else if (id !== null) { + ItemUtil.get(id, (item) => { + this.setState({ loading: false, item }); + }); + } + } + + render() { + const { lang } = this.props; + if (this.state.loading) { + return ; + } + if (this.state.item === null) { + return ; + } + return ( + <> + + {Functions.mlang(this.state.item.title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)} + +

{Functions.mlang('[en]Detail[/en][ja]詳細[/ja]', lang)}

+
+ + + ); + } +} + +export default XoonipsDetailItem; \ No newline at end of file diff --git a/src/xoonips/XoonipsSearchByAdvancedKeyword.tsx b/src/xoonips/XoonipsSearchByAdvancedKeyword.tsx new file mode 100644 index 0000000..02f44d5 --- /dev/null +++ b/src/xoonips/XoonipsSearchByAdvancedKeyword.tsx @@ -0,0 +1,56 @@ +import React, { Component } from 'react'; +import { RouteComponentProps } from 'react-router'; +import { MultiLang } from '../config'; +import AdvancedSearchQuery from './lib/AdvancedSearchQuery'; +import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil'; +import XoonipsListItem from './lib/XoonipsListItem'; + +interface Props extends RouteComponentProps { + lang: MultiLang +} + +interface State { + search: string; + query: AdvancedSearchQuery; +} + +class XoonipsSearchByAdvancedKeyword extends Component { + + constructor(props: Props) { + super(props); + const search = props.location.search; + const query = ItemUtil.getAdvancedSearchQueryByQuery(search); + this.state = { search, query }; + this.searchFunc = this.searchFunc.bind(this); + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + const search = nextProps.location.search; + if (prevState.search !== search) { + const query = ItemUtil.getAdvancedSearchQueryByQuery(search); + return { search, query }; + } + return null; + } + + getUrl() { + return ItemUtil.getSearchByAdvancedKeywordsUrl(this.state.query); + } + + searchFunc(condition: SortCondition, func: SearchCallbackFunc) { + ItemUtil.getListByAdvancedSearchQuery(this.state.query, condition, func); + } + + render() { + const { lang } = this.props; + const baseUrl = this.getUrl(); + return ( +
+

Listing item

+ +
+ ); + } +} + +export default XoonipsSearchByAdvancedKeyword; diff --git a/src/xoonips/XoonipsSearchByIndexId.tsx b/src/xoonips/XoonipsSearchByIndexId.tsx new file mode 100644 index 0000000..bb5bdc2 --- /dev/null +++ b/src/xoonips/XoonipsSearchByIndexId.tsx @@ -0,0 +1,72 @@ +import React, { Component, Fragment } from 'react'; +import { Helmet } from 'react-helmet'; +import { Link } from 'react-router-dom'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import IndexUtil, { Index, INDEX_ID_PUBLIC } from './lib/IndexUtil'; +import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil'; +import XoonipsListIndex from './lib/XoonipsListIndex'; +import XoonipsListItem from './lib/XoonipsListItem'; + +interface Props { + lang: MultiLang; + id: number | null; +} + +class XoonipsSearchByIndexId extends Component { + + constructor(props: Props) { + super(props); + this.searchFunc = this.searchFunc.bind(this); + } + + getUrl() { + const { id } = this.props; + const indexId = id === null ? INDEX_ID_PUBLIC : id; + if (indexId === 0) { + return '/'; + } + return IndexUtil.getUrl(indexId); + } + + searchFunc(condition: SortCondition, func: SearchCallbackFunc) { + const { id } = this.props; + const indexId = id === null ? INDEX_ID_PUBLIC : id; + if (id === 0) { + const res = { total: 0, data: [] }; + func(res); + } else { + ItemUtil.getListByIndexId(indexId, condition, func); + } + } + + render() { + const { lang, id } = this.props; + const indexId = id === null ? INDEX_ID_PUBLIC : id; + const index = IndexUtil.get(indexId); + if (index === null) { + return ; + } + const baseUrl = this.getUrl(); + const pIndexes = IndexUtil.getParents(indexId); + const parents = pIndexes.map((value: Index) => { + const url: string = IndexUtil.getUrl(value.id); + return / {value.title} ; + }); + const title = pIndexes.map((value) => { return '/' + value.title; }).join(''); + return ( +
+ + {Functions.mlang(title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)} + +

{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}

+
{parents}
+ + +
+ ); + } +} + +export default XoonipsSearchByIndexId; diff --git a/src/xoonips/XoonipsSearchByItemType.tsx b/src/xoonips/XoonipsSearchByItemType.tsx new file mode 100644 index 0000000..cf9c60b --- /dev/null +++ b/src/xoonips/XoonipsSearchByItemType.tsx @@ -0,0 +1,47 @@ +import React, { Component } from 'react'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil'; +import XoonipsListItem from './lib/XoonipsListItem'; + +interface Props { + lang: MultiLang; + itemType: string | null; + itemSubType: string | null; +} + +class XoonipsSearchByItemType extends Component { + + constructor(props: Props) { + super(props); + this.searchFunc = this.searchFunc.bind(this); + } + + searchFunc(condition: SortCondition, func: SearchCallbackFunc) { + const { itemType, itemSubType } = this.props; + if (itemType === null || itemSubType === null) { + const res = { total: 0, data: [] }; + func(res); + } else { + ItemUtil.getListByItemType(itemType, itemSubType, condition, func); + } + } + + getUrl() { + const { itemType, itemSubType } = this.props; + return ItemUtil.getItemTypeSearchUrl(itemType, itemSubType); + } + + render() { + const { lang } = this.props; + const baseUrl = this.getUrl(); + return ( +
+

{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}

+ +
+ ); + } +} + +export default XoonipsSearchByItemType; diff --git a/src/xoonips/XoonipsSearchByKeyword.tsx b/src/xoonips/XoonipsSearchByKeyword.tsx new file mode 100644 index 0000000..1a09e17 --- /dev/null +++ b/src/xoonips/XoonipsSearchByKeyword.tsx @@ -0,0 +1,48 @@ +import React, { Component } from 'react'; +import { MultiLang } from '../config'; +import Functions from '../functions'; +import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil'; +import XoonipsListItem from './lib/XoonipsListItem'; + +interface Props { + lang: MultiLang; + type: string; + keyword: string; +} + +class XoonipsSearchByKeyword extends Component { + + constructor(props: Props) { + super(props); + this.searchFunc = this.searchFunc.bind(this); + } + + getUrl() { + const { type, keyword } = this.props; + return ItemUtil.getSearchByKeywordUrl(type, keyword); + } + + searchFunc(condition: SortCondition, func: SearchCallbackFunc) { + const { type, keyword } = this.props; + if (keyword === '') { + const res = { total: 0, data: [] }; + func(res); + } else { + ItemUtil.getListByKeyword(type, keyword, condition, func); + } + } + + render() { + const { lang, keyword } = this.props; + const baseUrl = this.getUrl(); + return ( +
+

{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}

+

{Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {keyword}

+ +
+ ); + } +} + +export default XoonipsSearchByKeyword; diff --git a/src/xoonips/XoonipsTop.module.css b/src/xoonips/XoonipsTop.module.css new file mode 100644 index 0000000..f1de613 --- /dev/null +++ b/src/xoonips/XoonipsTop.module.css @@ -0,0 +1,19 @@ +.itemTypes .itemType { + width: 50%; + padding: 5px; +} + +.itemTypes .itemType :global(table) { + width: 100%; + margin: 0; +} + +.itemTypes .itemType :global(table .itemTypeIcon) { + width: 50px; + padding: 5px; +} +.itemTypes .itemType :global(table .itemTypeName) { + padding: 5px; + vertical-align: middle; + font-size: large; +} \ No newline at end of file diff --git a/src/xoonips/XoonipsTop.tsx b/src/xoonips/XoonipsTop.tsx new file mode 100644 index 0000000..650e391 --- /dev/null +++ b/src/xoonips/XoonipsTop.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import Config, { MultiLang } from '../config'; +import ItemType from './item-type'; +import styles from './XoonipsTop.module.css'; + +interface Props { + lang: MultiLang; +} + +const XoonipsTop: React.FC = (props: Props) => { + const { lang } = props; + const types: string[][] = []; + const len = Config.XOONIPS_ITEMTYPES.length; + for (let i = 0; i < Math.ceil(len / 2); i++) { + const j = i * 2; + const p = Config.XOONIPS_ITEMTYPES.slice(j, j + 2); + types.push(p); + } + return ( + + + {types.map((value, idx) => { + return ( + + {value.map((type, idx) => { + return ( + + ); + })} + + ); + })} + +
+ {type !== '' && } +
+ ); +} + +export default XoonipsTop; diff --git a/src/xoonips/XoonipsXoopsPathRedirect.tsx b/src/xoonips/XoonipsXoopsPathRedirect.tsx new file mode 100644 index 0000000..9f5745f --- /dev/null +++ b/src/xoonips/XoonipsXoopsPathRedirect.tsx @@ -0,0 +1,42 @@ +import React, { Component } from 'react'; +import { Redirect, RouteComponentProps, withRouter } from 'react-router'; +import PageNotFound from '../common/lib/PageNotFound'; +import { MultiLang } from '../config'; +import Functions from '../functions'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +class XoonipsXoopsPathRedirect extends Component { + + getRedirectUrl(): string { + const { location } = this.props; + const pathname = location.pathname || ''; + const query = new URLSearchParams(location.search); + const search = new RegExp('^/modules/xoonips(?:/+(.*))?$'); + const matches = pathname.match(search); + if (matches === null) { + return ''; + } + const path = matches[1] || ''; + switch (path) { + case '': + case 'index.php': { + return '/modules/xoonips'; + } + } + return ''; + } + + render() { + const { lang } = this.props; + const url = this.getRedirectUrl(); + if (url === '') { + return ; + } + return ; + } +} + +export default withRouter(XoonipsXoopsPathRedirect); diff --git a/src/xoonips/assets/images/icon_conference.gif b/src/xoonips/assets/images/icon_conference.gif new file mode 100644 index 0000000..ec56f37 Binary files /dev/null and b/src/xoonips/assets/images/icon_conference.gif differ diff --git a/src/xoonips/assets/images/icon_folder.gif b/src/xoonips/assets/images/icon_folder.gif new file mode 100644 index 0000000..7a69a82 Binary files /dev/null and b/src/xoonips/assets/images/icon_folder.gif differ diff --git a/src/xoonips/assets/images/simpf_button.png b/src/xoonips/assets/images/simpf_button.png new file mode 100644 index 0000000..1f93ad6 Binary files /dev/null and b/src/xoonips/assets/images/simpf_button.png differ diff --git a/src/xoonips/assets/images/star.gif b/src/xoonips/assets/images/star.gif new file mode 100644 index 0000000..f90543e Binary files /dev/null and b/src/xoonips/assets/images/star.gif differ diff --git a/src/xoonips/assets/images/tree_line.png b/src/xoonips/assets/images/tree_line.png new file mode 100644 index 0000000..2865cd2 Binary files /dev/null and b/src/xoonips/assets/images/tree_line.png differ diff --git a/src/xoonips/assets/images/tree_node.png b/src/xoonips/assets/images/tree_node.png new file mode 100644 index 0000000..b23e4b1 Binary files /dev/null and b/src/xoonips/assets/images/tree_node.png differ diff --git a/src/xoonips/assets/simpf-links.json b/src/xoonips/assets/simpf-links.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/src/xoonips/assets/simpf-links.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/src/xoonips/assets/tree.json b/src/xoonips/assets/tree.json new file mode 100644 index 0000000..cb07ce7 --- /dev/null +++ b/src/xoonips/assets/tree.json @@ -0,0 +1 @@ +[{"id":2,"title":"Public","num_of_items":0,"children":[{"id":593,"title":"Publication","num_of_items":0,"children":[{"id":665,"title":"Advances in Neuroinformatics","num_of_items":0,"children":[{"id":692,"title":"Advances in Neuroinformatics VI","num_of_items":1,"children":[]},{"id":687,"title":"Advances in Neuroinformatics V","num_of_items":1,"children":[]},{"id":596,"title":"Advances in Neuroinformatics IV","num_of_items":80,"children":[]},{"id":595,"title":"Advances in Neuroinformatics III","num_of_items":1,"children":[]},{"id":594,"title":"Advances in Neuroinformatics II","num_of_items":1,"children":[]},{"id":668,"title":"Advances in Neuroinformatics I","num_of_items":1,"children":[]}]}]},{"id":618,"title":"News & Topics","num_of_items":54,"children":[]},{"id":23,"title":"Newsletter","num_of_items":91,"children":[]},{"id":406,"title":"AINI","num_of_items":0,"children":[{"id":532,"title":"2016","num_of_items":3,"children":[]},{"id":519,"title":"2015","num_of_items":63,"children":[]},{"id":407,"title":"2014","num_of_items":41,"children":[]},{"id":650,"title":"2012","num_of_items":0,"children":[]},{"id":671,"title":"2017","num_of_items":2,"children":[]},{"id":688,"title":"2018","num_of_items":2,"children":[{"id":690,"title":"Tutorial 2","num_of_items":15,"children":[]}]}]},{"id":449,"title":"NBNI","num_of_items":3,"children":[]},{"id":534,"title":"Hackathon","num_of_items":0,"children":[{"id":535,"title":"2016","num_of_items":8,"children":[]},{"id":679,"title":"2018","num_of_items":56,"children":[]}]},{"id":657,"title":"Tutorial","num_of_items":0,"children":[{"id":659,"title":"Benham's Top","num_of_items":6,"children":[]},{"id":676,"title":"Semantic description of EEG","num_of_items":8,"children":[]}]},{"id":661,"title":"Document","num_of_items":2,"children":[{"id":496,"title":"Poster","num_of_items":39,"children":[]},{"id":629,"title":"Brocher","num_of_items":2,"children":[]},{"id":664,"title":"PF report","num_of_items":4,"children":[]},{"id":681,"title":"[en]Program[\/en][ja]プログラム[\/ja]","num_of_items":1,"children":[]}]}]}] \ No newline at end of file diff --git a/src/xoonips/blocks/IndexTree.module.css b/src/xoonips/blocks/IndexTree.module.css new file mode 100644 index 0000000..7b1427b --- /dev/null +++ b/src/xoonips/blocks/IndexTree.module.css @@ -0,0 +1,91 @@ +.indexTree { + border-top: 1px solid #999999; + border-left: 1px solid #999999; + border-bottom: 1px solid #404040; + border-right: 1px solid #404040; + background-color: white; + height: 400px; + width: calc(100% - 6px); + overflow: auto; + margin: 0 auto; + padding: 3px; + line-height: 100%; +} + +.formButton { + margin: 3px 3px 10px; +} + +.indexTree div span { + color: #333; + font-size: 12px; + font-weight: bold; + line-height: 19px; + vertical-align: bottom; +} + +.indexTree div span:hover { + color: #f60; +} + +.indexTree:global(.rc-tree .rc-tree-treenode) { + line-height: 20px; + white-space: nowrap; +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent) { + display: inline-block; +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit) { + display: inline-block; + height: 20px; + width: 9px; + background: url(../assets/images/tree_line.png); +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)) { + background-position: -9px 0; +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child).rc-tree-indent-unit-end) { + background-position: -18px 0; +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end) { + background-position: -27px 0; +} + +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-switcher) { + display: inline-block; + height: 20px; + width: 16px; + margin-right: 2px; + background: url(../assets/images/tree_node.png); + cursor: pointer; +} +.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher-noop) { + background-position: 0 0; + cursor: auto; +} +.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher_open) { + background-position: -16px 0; +} +.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher_close) { + background-position: -32px 0; +} +.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher-noop) { + background-position: 0 -20px; + cursor: auto; +} +.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_open) { + background-position: -16px -20px; +} +.indexTree:global(.rc-tree .rc-tree-treenode:not(:first-child) .rc-tree-switcher.rc-tree-switcher_close) { + background-position: -32px -20px; +} + +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper) { + display: inline-block; + height: 20px; + cursor: pointer; +} +.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper .rc-tree-title) { + vertical-align: middle; + line-height: 20px; +} \ No newline at end of file diff --git a/src/xoonips/blocks/IndexTree.tsx b/src/xoonips/blocks/IndexTree.tsx new file mode 100644 index 0000000..c9265d0 --- /dev/null +++ b/src/xoonips/blocks/IndexTree.tsx @@ -0,0 +1,124 @@ +import Tree from 'rc-tree'; +import { DataNode, EventDataNode } from 'rc-tree/lib/interface'; +import React, { Component, ReactText } from 'react'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import IndexUtil, { Index, INDEX_ID_PUBLIC } from '../lib/IndexUtil'; +import styles from './IndexTree.module.css'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +interface State { + tree: DataNode[]; + expandableKeys: string[]; + expandedKeys: string[]; + selectedKeys: number[]; +} + +class XooNIpsIndexTreeBlock extends Component { + + constructor(props: Props) { + super(props); + this.handleClickOpenAll = this.handleClickOpenAll.bind(this); + this.handleClickCloseAll = this.handleClickCloseAll.bind(this); + this.handleExpand = this.handleExpand.bind(this); + this.handleSelect = this.handleSelect.bind(this); + const res = this.load(); + this.state = { + tree: res.elements, + expandableKeys: res.keys, + expandedKeys: res.expandedKeys, + selectedKeys: [], + }; + } + + load() { + const { lang } = this.props; + let keys: string[] = []; + let eKeys: string[] = []; + const makeTreeNode = (index: Index, depth: number): DataNode => { + const title = Functions.mlang(index.title, lang) + (index.numOfItems > 0 ? ' (' + index.numOfItems + ')' : ''); + const children = IndexUtil.getChildren(index.id); + if (children.length === 0) { + return { key: String(index.id), title: title }; + } + const childTreeNodes = children.map((value: Index) => { + return makeTreeNode(value, depth + 1); + }); + if (depth < 1) { + eKeys.push(String(index.id)); + } + keys.push(String(index.id)); + return { key: String(index.id), title: title, children: childTreeNodes }; + }; + let elements: DataNode[] = []; + const index = IndexUtil.get(INDEX_ID_PUBLIC); + if (index !== null) { + elements.push(makeTreeNode(index, 0)); + } + return { + elements: elements, + keys: keys, + expandedKeys: eKeys, + } + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const { lang } = this.props; + if (prevProps.lang !== lang) { + const res = this.load(); + this.setState({ + tree: res.elements, + selectedKeys: [], + }); + } + } + + handleClickOpenAll() { + this.setState({ expandedKeys: this.state.expandableKeys }) + } + + handleClickCloseAll() { + this.setState({ expandedKeys: [] }) + } + + handleExpand(expandedKeys: ReactText[], info: { + node: EventDataNode; + expanded: boolean; + nativeEvent: MouseEvent; + }): void { + const keys: string[] = expandedKeys.map((key) => { + return typeof key === 'string' ? key : String(key); + }); + this.setState({ expandedKeys: keys }); + } + + handleSelect(selectedKeys: ReactText[], info: { + event: 'select'; + selected: boolean; + node: EventDataNode; + selectedNodes: DataNode[]; + nativeEvent: MouseEvent; + }): void { + const selectedKey = selectedKeys.shift() || 0; + const key = typeof selectedKey === 'string' ? parseInt(selectedKey, 10) : selectedKey; + const url = IndexUtil.getUrl(key); + this.props.history.push(url); + this.setState({ selectedKeys: [] }); + } + + render() { + return ( +
+ + + +
+ ); + } +} + +export default withRouter(XooNIpsIndexTreeBlock); diff --git a/src/xoonips/blocks/Rankings.module.css b/src/xoonips/blocks/Rankings.module.css new file mode 100644 index 0000000..362a532 --- /dev/null +++ b/src/xoonips/blocks/Rankings.module.css @@ -0,0 +1,28 @@ +.heading { + margin: 0 0 3px; + font-size: 100%; + font-weight: normal; +} + +.item { + display: flex; + white-space: nowrap; + width: 100%; +} + +.order { + margin-right: 5px; +} + +.title { + overflow: hidden; + text-overflow: ellipsis; +} + +.count { + margin-left: 10px; +} + +.star { + margin-left: 5px; +} \ No newline at end of file diff --git a/src/xoonips/blocks/Rankings.tsx b/src/xoonips/blocks/Rankings.tsx new file mode 100644 index 0000000..3c98b4e --- /dev/null +++ b/src/xoonips/blocks/Rankings.tsx @@ -0,0 +1,181 @@ +import axios from 'axios'; +import React, { Fragment } from 'react'; +import { Link } from 'react-router-dom'; +import Loading from '../../common/lib/Loading'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import imageStar from '../assets/images/star.gif'; +import ItemUtil, { ItemCore } from '../lib/ItemUtil'; +import styles from './Rankings.module.css'; + +interface RankingsData { + accessed?: { + item_id: number; + doi: string; + title: string; + count: number; + }[], + downloaded?: { + item_id: number; + doi: string; + title: string; + count: number; + }[], + contributed?: { + uid: number; + uname: string; + name: string; + count: number; + }[], + searched?: { + keyword: string; + count: number; + }[]; +}; + +interface Props { + lang: MultiLang; +} + +interface State { + loading: boolean; + rankings: RankingsData | null; +} + +const orderLabel = (order: number, lang: string) => { + return String(order) + (lang === 'en' ? Functions.ordinal(order) : '位') +} + +class Rankings extends React.Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + rankings: null + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updatePage(); + } + + componentWillUnmount() { + this.isActive = false; + } + + async updatePage() { + try { + const response = await axios.get('/modules/xoonips/rankings.json'); + const rankings = response.status === 200 ? response.data as RankingsData : null; + if (this.isActive) { + this.setState({ loading: false, rankings }); + } + } catch (e) { + if (this.isActive) { + this.setState({ loading: false, rankings: null }); + } + } + } + + render() { + const { lang } = this.props; + const { loading, rankings } = this.state; + if (loading) { + return ; + } + if (rankings === null) { + return
Failed to get data resource.
; + } + + const items = []; + if (rankings.accessed) { + items.push({ + title: '[en]Frequently accessed items[/en][ja]頻繁に閲覧されるアイテム[/ja]', + list: rankings.accessed.map((item, idx) => { + const url = ItemUtil.getUrl(item as ItemCore); + const title = Functions.mlang(item.title, lang); + const order = orderLabel(idx + 1, lang); + return ( +
+
{order}
+
{title}
+ {idx === 0 &&
{order}
} +
+ ); + }), + }); + } + if (rankings.downloaded) { + items.push({ + title: '[en]Frequently downloaded items[/en][ja]頻繁にダウンロードされるアイテム[/ja]', + list: rankings.downloaded.map((item, idx) => { + const url = ItemUtil.getUrl(item as ItemCore); + const title = Functions.mlang(item.title, lang); + const order = orderLabel(idx + 1, lang); + return ( +
+
{order}
+
{title}
+ {idx === 0 &&
{order}
} +
+ ); + }), + }); + } + if (rankings.contributed) { + items.push({ + title: '[en]Most active contributers[/en][ja]最も多くアイテムを公開したユーザ[/ja]', + list: rankings.contributed.map((item, idx) => { + const name = item.name !== '' ? item.name + ' (' + item.uname + ')' : item.uname; + const title = Functions.mlang(name, lang); + const order = orderLabel(idx + 1, lang); + return ( +
+
{order}
+
{title}
+
({item.count})
+ {idx === 0 &&
{order}
} +
+ ); + }), + }); + } + if (rankings.searched) { + items.push({ + title: '[en]Frequently searched keywords[/en][ja]頻繁に検索されるキーワード[/ja]', + list: rankings.searched.map((item, idx) => { + const url = ItemUtil.getSearchByKeywordUrl('all', item.keyword); + const title = 'Search by: ' + item.keyword; + const order = orderLabel(idx + 1, lang); + return ( +
+
{order}
+
{item.keyword}
+ {idx === 0 &&
{order}
} +
+ ); + }), + }); + } + return ( +
+ {items.map((item, idx) => { + return ( + + {idx !== 0 &&
} +

{Functions.mlang(item.title, lang)}

+
{item.list}
+
+ ); + })} +
+ ); + } +} + +export default Rankings; \ No newline at end of file diff --git a/src/xoonips/blocks/RecentContents.module.css b/src/xoonips/blocks/RecentContents.module.css new file mode 100644 index 0000000..6466fb7 --- /dev/null +++ b/src/xoonips/blocks/RecentContents.module.css @@ -0,0 +1,28 @@ +.heading { + margin: 0 0 3px; + font-size: 100%; + font-weight: normal; +} + +.item { + display: flex; + white-space: nowrap; + width: 100%; +} + +.order { + margin-right: 5px; +} + +.title { + overflow: hidden; + text-overflow: ellipsis; +} + +.date { + margin-left: 10px; +} + +.star { + margin-left: 5px; +} \ No newline at end of file diff --git a/src/xoonips/blocks/RecentContents.tsx b/src/xoonips/blocks/RecentContents.tsx new file mode 100644 index 0000000..9d250b2 --- /dev/null +++ b/src/xoonips/blocks/RecentContents.tsx @@ -0,0 +1,98 @@ +import axios from 'axios'; +import moment from 'moment'; +import React from 'react'; +import { Link } from 'react-router-dom'; +import Loading from '../../common/lib/Loading'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import imageStar from '../assets/images/star.gif'; +import ItemUtil, { ItemCore } from '../lib/ItemUtil'; +import styles from './RecentContents.module.css'; + +interface RecentContentData { + item_id: number; + doi: string; + last_update_date: number; + title: string; +}; +type RecentContentsData = RecentContentData[]; + +interface Props { + lang: MultiLang; +} + +interface State { + loading: boolean; + contents: RecentContentsData | null; +} + +class RecentContents extends React.Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + contents: null + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updatePage(); + } + + componentWillUnmount() { + this.isActive = false; + } + + async updatePage() { + try { + const response = await axios.get('/modules/xoonips/recent-contents.json'); + const contents = response.status === 200 ? response.data as RecentContentsData : null; + if (this.isActive) { + this.setState({ loading: false, contents }); + } + } catch (e) { + if (this.isActive) { + this.setState({ loading: false, contents: null }); + } + } + } + + render() { + const { lang } = this.props; + const { loading, contents } = this.state; + if (loading) { + return ; + } + if (contents === null) { + return
Failed to get data resource.
; + } + + const list = contents.map((item, idx) => { + const url = ItemUtil.getUrl(item as ItemCore); + const title = Functions.mlang(item.title, lang); + const date = moment(new Date(item.last_update_date * 1000)).format('Y/M/D'); + const order = String(idx + 1) + (lang === 'en' ? Functions.ordinal(idx + 1) : '位'); + return ( +
+
{order}
+
{title}
+
({date})
+ {idx === 0 &&
{order}
} +
+ ); + }); + return ( +
+

{Functions.mlang('[en]Newly Arrived Items[/en][ja]新着アイテム[/ja]', lang)}

+
{list}
+
+ ); + } +} + +export default RecentContents; \ No newline at end of file diff --git a/src/xoonips/blocks/Search.tsx b/src/xoonips/blocks/Search.tsx new file mode 100644 index 0000000..0cb299e --- /dev/null +++ b/src/xoonips/blocks/Search.tsx @@ -0,0 +1,86 @@ +import React, { ChangeEvent, Component, FormEvent } from 'react'; +import { Link, RouteComponentProps, withRouter } from 'react-router-dom'; +import Config, { MultiLang } from '../../config'; +import Functions from '../../functions'; +import ItemUtil from '../lib/ItemUtil'; + +interface Props extends RouteComponentProps { + lang: MultiLang; +} + +interface State { + type: string; + keyword: string; + path: string; +} + +class XooNIpsSearchBlock extends Component { + + constructor(props: Props) { + super(props); + const { location } = props; + this.state = { + type: 'all', + keyword: '', + path: location.pathname + location.search + location.hash, + }; + this.handleChangeType = this.handleChangeType.bind(this); + this.handleChangeKeyword = this.handleChangeKeyword.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + const { location } = nextProps; + const path = location.pathname + location.search + location.hash + if (path !== prevState.path) { + const { type, keyword } = ItemUtil.getSearchKeywordByQuery(location.search); + return { type, keyword, path }; + } + return null; + } + + handleChangeKeyword(event: ChangeEvent) { + const keyword = event.target.value.trim(); + this.setState({ keyword }); + } + + handleChangeType(event: ChangeEvent) { + const type = event.target.value; + this.setState({ type }); + } + + handleSubmit(event: FormEvent) { + event.preventDefault(); + const url = ItemUtil.getSearchByKeywordUrl(this.state.type, this.state.keyword); + this.props.history.push(url); + } + + render() { + const { lang } = this.props; + const options = [ + { value: 'all', label: '[en]All[/en][ja]全て[/ja]' }, + { value: 'basic', label: '[en]Title & Keyword[/en][ja]タイトル&キーワード[/ja]' }, + ]; + + Config.XOONIPS_ITEMTYPES.forEach((type) => { + options.push({ value: type, label: Functions.pascalCase(type) }) + }); + return ( +
+ +    + +
+ +      + {Functions.mlang('[en]Advanced[/en][ja]詳細検索[/ja]', lang)} +
+ ); + } +} + +export default withRouter(XooNIpsSearchBlock); \ No newline at end of file diff --git a/src/xoonips/item-type/article/ArticleAdvancedSearch.tsx b/src/xoonips/item-type/article/ArticleAdvancedSearch.tsx new file mode 100644 index 0000000..f2eb217 --- /dev/null +++ b/src/xoonips/item-type/article/ArticleAdvancedSearch.tsx @@ -0,0 +1,153 @@ +import React from 'react'; +import Functions from '../../../functions'; +import { ItemBasicLangs } from '../../lib/ItemUtil'; +import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase'; +import ArticleUtil from './ArticleUtil'; + +class ArticleAdvancedSearch extends AdvancedSearchBase { + + constructor(props: AdvancedSearchBaseProps) { + super(props); + this.type = ArticleUtil.type; + this.title = ArticleUtil.label; + const now = new Date(); + const year = String(now.getFullYear()); + const month = String(now.getMonth() + 1); + const mday = String(now.getDate()); + this.state.values['doi'] = ''; + this.state.values['title'] = ''; + this.state.values['author'] = ''; + this.state.values['affiliation'] = ''; + this.state.values['journal_name'] = ''; + this.state.values['journal_volume'] = ''; + this.state.values['publication_year'] = ''; + this.state.values['publication_month'] = ''; + this.state.values['journal_page'] = ''; + this.state.values['journal_publisher'] = ''; + this.state.values['meeting_name'] = ''; + this.state.values['meeting_place'] = ''; + this.state.values['meeting_date_from_year'] = year; + this.state.values['meeting_date_from_month'] = month; + this.state.values['meeting_date_from_mday'] = mday; + this.state.values['meeting_date_to_year'] = year; + this.state.values['meeting_date_to_month'] = month; + this.state.values['meeting_date_to_mday'] = mday; + this.state.values['meeting_program_no'] = ''; + this.state.values['journal_page'] = ''; + this.state.values['journal_page'] = ''; + this.state.values['journal_page'] = ''; + this.state.values['lang'] = ''; + this.state.values['file.article_fulltext_file.original_file_name'] = ''; + this.state.values['date_from_year'] = year; + this.state.values['date_from_month'] = month; + this.state.values['date_from_mday'] = mday; + this.state.values['date_to_year'] = year; + this.state.values['date_to_month'] = month; + this.state.values['date_to_mday'] = mday; + this.state.values['keyword'] = ''; + this.setIgnoreKey('meeting_date_from_year'); + this.setIgnoreKey('meeting_date_from_month'); + this.setIgnoreKey('meeting_date_from_mday'); + this.setIgnoreKey('meeting_date_to_year'); + this.setIgnoreKey('meeting_date_to_month'); + this.setIgnoreKey('meeting_date_to_mday'); + this.setIgnoreKey('date_from_year'); + this.setIgnoreKey('date_from_month'); + this.setIgnoreKey('date_from_mday'); + this.setIgnoreKey('date_to_year'); + this.setIgnoreKey('date_to_month'); + this.setIgnoreKey('date_to_mday'); + } + + renderJournal() { + const { lang } = this.props; + return + + + + + + + + + + + + + + + + + + + + + + + + + + +
{Functions.mlang('[en]Name[/en][ja]名称[/ja]', lang)}{this.renderFieldInputText('journal_name', 50)}
{Functions.mlang('[en]Volume[/en][ja]巻[/ja]', lang)}{this.renderFieldInputText('journal_volume', 50)}
{Functions.mlang('[en]Publication Year[/en][ja]発行年[/ja]', lang)}{this.renderFieldInputText('publication_year', 10)}
{Functions.mlang('[en]Publication Month[/en][ja]発行月[/ja]', lang)}{this.renderFieldInputText('publication_month', 10)}
{Functions.mlang('[en]Page[/en][ja]ページ[/ja]', lang)}{this.renderFieldInputText('journal_page', 10)}
{Functions.mlang('[en]Publisher[/en][ja]出版者[/ja]', lang)}{this.renderFieldInputText('journal_publisher', 50)}
; + } + + renderMeeting() { + const { lang } = this.props; + return + + + + + + + + + + + + + + + + + + + + + + +
{Functions.mlang('[en]Name[/en][ja]名称[/ja]', lang)}{this.renderFieldInputText('meeting_name', 50)}
{Functions.mlang('[en]Place[/en][ja]場所[/ja]', lang)}{this.renderFieldInputText('meeting_place', 50)}
{Functions.mlang('[en]Date (From)[/en][ja]日付 (自)[/ja]', lang)}{this.renderFieldDate('', 'meeting_date_from_year', 'meeting_date_from_month', 'meeting_date_from_mday')}
{Functions.mlang('[en]Date (To)[/en][ja]日付 (至)[/ja]', lang)}{this.renderFieldDate('', 'meeting_date_to_year', 'meeting_date_to_month', 'meeting_date_to_mday')}
{Functions.mlang('[en]Program Num[/en][ja]発表番号[/ja]', lang)}{this.renderFieldInputText('meeting_program_no', 50)}
; + } + + renderDate() { + return ( + <> +
+ {this.renderFieldDate('From', 'date_from_year', 'date_from_month', 'date_from_mday')} + +
+
+ {this.renderFieldDate('To', 'date_to_year', 'date_to_month', 'date_to_mday')} +
+ + ); + } + + getRows() { + const rows = [ + { label: 'ID', value: this.renderFieldInputText('doi', 50) }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) }, + { label: '[en]Author[/en][ja]著者[/ja]', value: this.renderFieldInputText('author', 50) }, + { label: '[en]Affiliation[/en][ja]所属[/ja]', value: this.renderFieldInputText('affiliation', 50) }, + { label: '[en]Journal[/en][ja]ジャーナル[/ja]', value: this.renderJournal() }, + { label: '[en]Meeting[/en][ja]会議[/ja]', value: this.renderMeeting() }, + { label: '[en]Language[/en][ja]言語[/ja]', value: this.renderFieldSelect('lang', ItemBasicLangs) }, + { label: '[en]Full Text[/en][ja]本文ファイル[/ja]', value: this.renderFieldInputText('file.article_fulltext_file.original_file_name', 50) }, + { label: '[en]Publication Date[/en][ja]発行日[/ja]', value: this.renderDate() }, + { label: '[en]Keywords[/en][ja]キーワード[/ja]', value: this.renderFieldInputText('keyword', 50) }, + ]; + return rows; + } +} + +export default ArticleAdvancedSearch; \ No newline at end of file diff --git a/src/xoonips/item-type/article/ArticleDetail.tsx b/src/xoonips/item-type/article/ArticleDetail.tsx new file mode 100644 index 0000000..f2f8b83 --- /dev/null +++ b/src/xoonips/item-type/article/ArticleDetail.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import Functions from '../../../functions'; +import { ItemArticle } from '../../lib/ItemUtil'; +import DetailBase from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; +import ArticleUtil from './ArticleUtil'; + +class ArticleDetail extends DetailBase { + + renderAuthor(item: ItemArticle) { + const { lang } = this.props; + return + + {item.author.map((author) => { + const name = author.replace(/(?:\(\d+\))+$/g, ''); + const num = author === name ? '' : author.replace(/^.+?((?:\(\d+\))+)$/, '$1').replace(/\)\(/g, ', ').replace(/[()]/g, ''); + return ; + })} + +
{Functions.mlang(name, lang)}{num !== '' && {num}}
; + } + + renderAffiliation(item: ItemArticle) { + const { lang } = this.props; + return + + {item.affiliation.map((affiliation) => { + const name = affiliation.replace(/^(?:\(\d+\))+/g, ''); + const num = affiliation === name ? '' : affiliation.replace(/^((?:\(\d+\))+).+?$/, '$1').replace(/\)\(/g, ', ').replace(/[()]/g, ''); + return ; + })} + +
{num !== '' && {num} }{Functions.mlang(name, lang)}
; + } + + renderJournal(item: ItemArticle) { + const { lang } = this.props; + return + + + + + + + + + + + + + + + + + + + + + + + + + + +
{Functions.mlang('[en]Name[/en][ja]名称[/ja]', lang)}: {Functions.mlang(item.journal_name, lang)}
{Functions.mlang('[en]Volume[/en][ja]巻[/ja]', lang)}: {Functions.mlang(item.journal_volume, lang)}
{Functions.mlang('[en]Publication Year[/en][ja]発行年[/ja]', lang)}: {Functions.mlang(item.publication_year.toString(), lang)}
{Functions.mlang('[en]Publication Month[/en][ja]発行月[/ja]', lang)}: {Functions.mlang(item.publication_month.toString(), lang)}
{Functions.mlang('[en]Page[/en][ja]ページ[/ja]', lang)}: {Functions.mlang(item.journal_page, lang)}
{Functions.mlang('[en]Publisher[/en][ja]出版者[/ja]', lang)}: {Functions.mlang(item.journal_publisher, lang)}
; + } + + renderMeeting(item: ItemArticle) { + const { lang } = this.props; + return + + + + + + + + + + + + + + + + + + + + + + +
{Functions.mlang('[en]Name[/en][ja]名称[/ja]', lang)}: {Functions.mlang(item.meeting_name, lang)}
{Functions.mlang('[en]Place[/en][ja]場所[/ja]', lang)}: {Functions.mlang(item.meeting_place, lang)}
{Functions.mlang('[en]Date (From)[/en][ja]日付 (自)[/ja]', lang)}:
{Functions.mlang('[en]Date (To)[/en][ja]日付 (至)[/ja]', lang)}:
{Functions.mlang('[en]Program Num[/en][ja]発表番号[/ja]', lang)}: {Functions.mlang(item.meeting_program_no, lang)}
; + } + + getFields() { + const { lang } = this.props; + const item = this.props.item as ItemArticle; + const doi = ArticleUtil.getDOI(item.doi); + const fields = [ + { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name }, + { label: 'ID', value: doi !== '' ? doi:{doi} : item.doi }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) }, + { label: '[en]Author[/en][ja]著者[/ja]', value: this.renderAuthor(item) }, + { label: '[en]Affiliation[/en][ja]所属[/ja]', value: this.renderAffiliation(item) }, + { label: '[en]Journal[/en][ja]ジャーナル[/ja]', value: this.renderJournal(item) }, + { label: '[en]Meeting[/en][ja]会議[/ja]', value: this.renderMeeting(item) }, + { label: '[en]Language[/en][ja]言語[/ja]', value: }, + { label: '[en]Full Text[/en][ja]本文[/ja]', value: }, + { label: 'Rights', value: }, + { label: '[en]Release Date[/en][ja]本公開日[/ja]', value: }, + { label: '[en]Keyword[/en][ja]キーワード[/ja]', value: }, + { label: '[en]Related item[/en][ja]関連アイテム[/ja]', value: }, + { label: '[en]Index[/en][ja]インデックス[/ja]', value: }, + { label: '[en]Item Owner[/en][ja]アイテム所有者[/ja]', value: }, + { label: '[en]Registered Date[/en][ja]登録日[/ja]', value: }, + { label: '[en]Last Update[/en][ja]最終更新日[/ja]', value: }, + { label: '[en]Change Log[/en][ja]更新履歴[/ja]', value: }, + ]; + return fields; + } +} + +export default ArticleDetail; \ No newline at end of file diff --git a/src/xoonips/item-type/article/ArticleList.tsx b/src/xoonips/item-type/article/ArticleList.tsx new file mode 100644 index 0000000..b52c042 --- /dev/null +++ b/src/xoonips/item-type/article/ArticleList.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Functions from '../../../functions'; +import { ItemArticle } from '../../lib/ItemUtil'; +import ListBase, { ListBaseProps } from '../lib/ListBase'; +import ArticleUtil from './ArticleUtil'; + +class ArticleList extends ListBase { + + constructor(props: ListBaseProps) { + super(props); + this.label = ArticleUtil.label; + this.icon = ArticleUtil.icon; + } + + renderBody() { + const { lang } = this.props; + const item = this.props.item as ItemArticle; + const authors = item.author.map((author, i) => { + return {i > 0 && ', '}{Functions.mlang(author.replace(/(?:\(\d+\))+$/, ''), lang)} + }); + const doi = ArticleUtil.getDOI(item.doi); + return ( +
+
{Functions.mlang(item.title, lang)}
+
{authors}
+
{Functions.mlang(item.journal_name, lang)} ({item.publication_year})
+
{Functions.mlang(item.journal_publisher, lang)}
+ {doi !== '' && } +
+ ); + } +} + +export default ArticleList; \ No newline at end of file diff --git a/src/xoonips/item-type/article/ArticleTop.tsx b/src/xoonips/item-type/article/ArticleTop.tsx new file mode 100644 index 0000000..0536c50 --- /dev/null +++ b/src/xoonips/item-type/article/ArticleTop.tsx @@ -0,0 +1,15 @@ +import TopBase, { TopBaseProps } from '../lib/TopBase'; +import ArticleUtil from './ArticleUtil'; + +class ArticleTop extends TopBase { + + constructor(props: TopBaseProps) { + super(props); + this.type = ArticleUtil.type; + this.label = ArticleUtil.label; + this.icon = ArticleUtil.icon; + this.description = ArticleUtil.description; + } +} + +export default ArticleTop; \ No newline at end of file diff --git a/src/xoonips/item-type/article/ArticleUtil.tsx b/src/xoonips/item-type/article/ArticleUtil.tsx new file mode 100644 index 0000000..1fb17ab --- /dev/null +++ b/src/xoonips/item-type/article/ArticleUtil.tsx @@ -0,0 +1,16 @@ +import icon from './icon.png'; + +const ArticleUtil = { + type: 'article', + label: 'Aritcle', + description: '[en]Article[/en][ja]アーティクル[/ja]', + icon, + getDOI: (id:string): string => { + if (/^aini201[4-8]\..*$/.test(id)) { + return '10.14931/' + id; + } + return ''; + } +}; + +export default ArticleUtil; \ No newline at end of file diff --git a/src/xoonips/item-type/article/icon.png b/src/xoonips/item-type/article/icon.png new file mode 100644 index 0000000..7d7c48a Binary files /dev/null and b/src/xoonips/item-type/article/icon.png differ diff --git a/src/xoonips/item-type/article/index.tsx b/src/xoonips/item-type/article/index.tsx new file mode 100644 index 0000000..ddcd9ba --- /dev/null +++ b/src/xoonips/item-type/article/index.tsx @@ -0,0 +1,13 @@ +import ArticleTop from './ArticleTop'; +import ArticleList from './ArticleList'; +import ArticleDetail from './ArticleDetail'; +import ArticleAdvancedSearch from './ArticleAdvancedSearch'; + +const ItemTypeArticle = { + Top: ArticleTop, + List: ArticleList, + Detail: ArticleDetail, + AdvancedSearch: ArticleAdvancedSearch, +}; + +export default ItemTypeArticle; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/GeneralDataAdvancedSearch.tsx b/src/xoonips/item-type/generaldata/GeneralDataAdvancedSearch.tsx new file mode 100644 index 0000000..25f8a8e --- /dev/null +++ b/src/xoonips/item-type/generaldata/GeneralDataAdvancedSearch.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import Functions from '../../../functions'; +import { ItemBasicLangs } from '../../lib/ItemUtil'; +import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase'; + +class GeneralDataAdvancedSearch extends AdvancedSearchBase { + + constructor(props: AdvancedSearchBaseProps) { + super(props); + this.type = 'generaldata'; + this.title = 'General Data and Documents'; + const now = new Date(); + const year = String(now.getFullYear()); + const month = String(now.getMonth() + 1); + const mday = String(now.getDate()); + this.state.values['doi'] = ''; + this.state.values['title'] = ''; + this.state.values['description'] = ''; + this.state.values['lang'] = ''; + this.state.values['file.generaldata_file.original_file_name'] = ''; + this.state.values['creator'] = ''; + this.state.values['affiliation'] = ''; + this.state.values['publication_year'] = year; + this.state.values['publication_month'] = month; + this.state.values['publication_mday'] = mday; + this.state.values['publisher'] = ''; + this.state.values['version'] = ''; + this.state.values['format'] = ''; + this.state.values['variation'] = ''; + this.state.values['relation'] = ''; + this.state.values['keyword'] = ''; + this.setIgnoreKey('publication_year'); + this.setIgnoreKey('publication_month'); + this.setIgnoreKey('publication_mday'); + } + + renderEdition() { + const { lang } = this.props; + return + + + + + + + + + + + + + + +
{Functions.mlang('[en]Version[/en][ja]バージョン[/ja]', lang)}{this.renderFieldInputText('version', 30)}
{Functions.mlang('[en]Format[/en][ja]フォーマット[/ja]', lang)}{this.renderFieldInputText('format', 30)}
{Functions.mlang('[en]Variation[/en][ja]バリエーション[/ja]', lang)}{this.renderFieldInputText('variation', 30)}
; + } + + getRows() { + const rows = [ + { label: 'ID', value: this.renderFieldInputText('doi', 50) }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) }, + { label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) }, + { label: '[en]Language[/en][ja]言語[/ja]', value: this.renderFieldSelect('lang', ItemBasicLangs) }, + { label: '[en]Files[/en][ja]ファイル[/ja]', value: this.renderFieldInputText('file.generaldata_file.original_file_name', 50) }, + { label: '[en]Creator[/en][ja]作成者[/ja]', value: this.renderFieldInputText('creator', 50) }, + { label: '[en]Affiliation[/en][ja]所属[/ja]', value: this.renderFieldInputText('affiliation', 50) }, + { label: '[en]Publication Date[/en][ja]発行日[/ja]', value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday') }, + { label: '[en]Publisher[/en][ja]発行者[/ja]', value: this.renderFieldInputText('publisher', 50) }, + { label: '[en]Edition[/en][ja]版[/ja]', value: this.renderEdition() }, + { label: '[en]Relation[/en][ja]関連リンク[/ja]', value: this.renderFieldInputText('relation', 50) }, + { label: '[en]Keywords[/en][ja]キーワード[/ja]', value: this.renderFieldInputText('keyword', 50) }, + ]; + return rows; + } +} + +export default GeneralDataAdvancedSearch; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/GeneralDataDetail.tsx b/src/xoonips/item-type/generaldata/GeneralDataDetail.tsx new file mode 100644 index 0000000..5693820 --- /dev/null +++ b/src/xoonips/item-type/generaldata/GeneralDataDetail.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import Functions from '../../../functions'; +import { ItemGeneralData } from '../../lib/ItemUtil'; +import DetailBase from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; + +class GeneralDataDetail extends DetailBase { + + renderEdition(item: ItemGeneralData) { + const { lang } = this.props; + return + + + + + + + + + + + + + + +
{Functions.mlang('[en]Version[/en][ja]バージョン[/ja]', lang)}{Functions.mlang(item.version, lang)}
{Functions.mlang('[en]Format[/en][ja]フォーマット[/ja]', lang)}{Functions.mlang(item.format, lang)}
{Functions.mlang('[en]Variation[/en][ja]バリエーション[/ja]', lang)}{Functions.mlang(item.variation, lang)}
+ } + + getFields() { + const { lang } = this.props; + const item = this.props.item as ItemGeneralData; + const fields = [ + { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name }, + { label: 'ID', value: item.doi }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) }, + { label: '[en]Description[/en][ja]概要[/ja]', value: }, + { label: '[en]Preview[/en][ja]プレビュー[/ja]', value: }, + { label: '[en]Language[/en][ja]言語[/ja]', value: }, + { label: '[en]Files[/en][ja]ファイル[/ja]', value: }, + { label: 'Rights', value: }, + { label: '[en]Creator[/en][ja]作成者[/ja]', value: }, + { label: '[en]Affiliation[/en][ja]所属[/ja]', value: }, + { label: '[en]Publication Date[/en][ja]発行日[/ja]', value: }, + { label: '[en]Publisher[/en][ja]発行者[/ja]', value: Functions.mlang(item.publisher, lang) }, + { label: '[en]Edition[/en][ja]版[/ja]', value: this.renderEdition(item) }, + { label: '[en]Related Links[/en][ja]関連リンク[/ja]', value: {relation})} /> }, + { label: '[en]Keyword[/en][ja]キーワード[/ja]', value: }, + { label: '[en]Related item[/en][ja]関連アイテム[/ja]', value: }, + { label: '[en]Index[/en][ja]インデックス[/ja]', value: }, + { label: '[en]Item Owner[/en][ja]アイテム所有者[/ja]', value: }, + { label: '[en]Registered Date[/en][ja]登録日[/ja]', value: }, + { label: '[en]Last Update[/en][ja]最終更新日[/ja]', value: }, + { label: '[en]Change Log[/en][ja]更新履歴[/ja]', value: }, + ]; + return fields; + } +} + +export default GeneralDataDetail; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/GeneralDataList.tsx b/src/xoonips/item-type/generaldata/GeneralDataList.tsx new file mode 100644 index 0000000..d5e1a95 --- /dev/null +++ b/src/xoonips/item-type/generaldata/GeneralDataList.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Functions from '../../../functions'; +import ItemUtil, { ItemGeneralData } from '../../lib/ItemUtil'; +import ListBase, { ListBaseProps } from '../lib/ListBase'; +import GeneralDataUtil from './GeneralDataUtil'; +import FileSize from '../lib/field/FileSize'; + +class GeneralDataList extends ListBase { + + constructor(props: ListBaseProps) { + super(props); + this.label = 'General Data'; + this.icon = GeneralDataUtil.iconImage; + } + + renderIcon() { + const { lang } = this.props; + const item = this.props.item as ItemGeneralData; + const data = item.file.filter((value) => { + return value.file_type_name === 'preview'; + }); + let imgSrc = this.icon; + let imgAlt = this.label; + if (data.length > 0) { + const preview = data.pop(); + if ('undefined' !== typeof preview) { + imgSrc = ItemUtil.getPreviewFileUrl(preview); + if ('' !== preview.caption) { + imgAlt = Functions.mlang(preview.caption, lang); + } + } + } + return {imgAlt}; + } + + renderBody() { + const { lang } = this.props; + const item = this.props.item as ItemGeneralData; + const authors = item.creator.map((author, i) => { + return {i > 0 && ', '}{Functions.mlang(author, lang)} + }); + const files = item.file.filter((value) => value.file_type_name === 'generaldata_file').map((value) => { + return
- {value.original_file_name} ()
+ }); + const pubdate = new Date(item.publication_year, item.publication_month - 1, item.publication_mday); + return ( +
+
{Functions.mlang(item.title, lang)}
+
{authors}
+
{files}
+
{Functions.formatDate(pubdate.getTime() / 1000, 'MMM Do YYYY')}
+
+ ); + } +} + +export default GeneralDataList; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/GeneralDataTop.tsx b/src/xoonips/item-type/generaldata/GeneralDataTop.tsx new file mode 100644 index 0000000..48d50c9 --- /dev/null +++ b/src/xoonips/item-type/generaldata/GeneralDataTop.tsx @@ -0,0 +1,15 @@ +import TopBase, { TopBaseProps } from '../lib/TopBase'; +import GeneralDataUtil from './GeneralDataUtil'; + +class GeneralDataTop extends TopBase { + + constructor(props: TopBaseProps) { + super(props); + this.type = 'generaldata'; + this.label = 'General Data and Documents'; + this.icon = GeneralDataUtil.iconImage; + this.description = '[en]General Data and Documents[/en][ja]汎用データ・ドキュメント[/ja]'; + } +} + +export default GeneralDataTop; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/GeneralDataUtil.tsx b/src/xoonips/item-type/generaldata/GeneralDataUtil.tsx new file mode 100644 index 0000000..06cde0d --- /dev/null +++ b/src/xoonips/item-type/generaldata/GeneralDataUtil.tsx @@ -0,0 +1,7 @@ +import iconImage from './icon.png'; + +const GeneralDataUtil = { + iconImage +} + +export default GeneralDataUtil; \ No newline at end of file diff --git a/src/xoonips/item-type/generaldata/icon.png b/src/xoonips/item-type/generaldata/icon.png new file mode 100644 index 0000000..67eaad5 Binary files /dev/null and b/src/xoonips/item-type/generaldata/icon.png differ diff --git a/src/xoonips/item-type/generaldata/index.tsx b/src/xoonips/item-type/generaldata/index.tsx new file mode 100644 index 0000000..0cfc09f --- /dev/null +++ b/src/xoonips/item-type/generaldata/index.tsx @@ -0,0 +1,13 @@ +import GeneralDataTop from './GeneralDataTop'; +import GeneralDataList from './GeneralDataList'; +import GeneralDataDetail from './GeneralDataDetail'; +import GeneralDataAdvancedSearch from './GeneralDataAdvancedSearch'; + +const ItemTypeGeneralData = { + Top: GeneralDataTop, + List: GeneralDataList, + Detail: GeneralDataDetail, + AdvancedSearch: GeneralDataAdvancedSearch, +}; + +export default ItemTypeGeneralData; \ No newline at end of file diff --git a/src/xoonips/item-type/index.tsx b/src/xoonips/item-type/index.tsx new file mode 100644 index 0000000..aa067cf --- /dev/null +++ b/src/xoonips/item-type/index.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import ItemTypeArticle from './article'; +import ItemTypeGeneralData from './generaldata'; +import ItemTypeJournal from './journal'; +import { AdvancedSearchBaseProps } from './lib/AdvancedSearchBase'; +import { DetailBaseProps } from './lib/DetailBase'; +import { ListBaseProps } from './lib/ListBase'; +import { TopBaseProps } from './lib/TopBase'; + +interface TopProps extends TopBaseProps { + type: string; +} +const Top = (props: TopProps) => { + const { lang, type } = props; + switch (type) { + case 'journal': + return ; + case 'article': + return ; + case 'generaldata': + return ; + default: + return null; + } +} + +const List = (props: ListBaseProps) => { + const { item } = props; + switch (item.item_type_name) { + case 'journal': + return ; + case 'article': + return ; + case 'generaldata': + return ; + default: + return null; + } +} + +const Detail = (props: DetailBaseProps) => { + const { item } = props; + switch (item.item_type_name) { + case 'journal': + return ; + case 'article': + return ; + case 'generaldata': + return ; + default: + return null; + } +} + +interface AdvancedSearchProps extends AdvancedSearchBaseProps { + type: string; +} +const AdvancedSearch = (props: AdvancedSearchProps) => { + const { lang, type, query } = props; + switch (type) { + case 'journal': + return ; + case 'article': + return ; + case 'generaldata': + return ; + default: + return null; + } +} + +const ItemType = { + Top, + List, + Detail, + AdvancedSearch +} + +export default ItemType; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/JournalAdvancedSearch.tsx b/src/xoonips/item-type/journal/JournalAdvancedSearch.tsx new file mode 100644 index 0000000..b65b59a --- /dev/null +++ b/src/xoonips/item-type/journal/JournalAdvancedSearch.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { ItemBasicLangs, ItemJournalPublisherLocations } from '../../lib/ItemUtil'; +import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase'; +import JournalUtil from './JournalUtil'; + +class JournalAdvancedSearch extends AdvancedSearchBase { + + constructor(props: AdvancedSearchBaseProps) { + super(props); + this.type = JournalUtil.type; + this.title = JournalUtil.label; + const now = new Date(); + const year = String(now.getFullYear()); + const month = String(now.getMonth() + 1); + const mday = String(now.getDate()); + this.state.values['doi'] = ''; + this.state.values['title'] = ''; + this.state.values['journal'] = ''; + this.state.values['volume'] = ''; + this.state.values['publication_year'] = ''; + this.state.values['publication_month'] = ''; + this.state.values['publisher'] = ''; + this.state.values['publisher_location'] = ''; + this.state.values['relation'] = ''; + this.state.values['lang'] = ''; + this.state.values['keyword'] = ''; + this.state.values['date_from_year'] = year; + this.state.values['date_from_month'] = month; + this.state.values['date_from_mday'] = mday; + this.state.values['date_to_year'] = year; + this.state.values['date_to_month'] = month; + this.state.values['date_to_mday'] = mday; + this.setIgnoreKey('date_from_year'); + this.setIgnoreKey('date_from_month'); + this.setIgnoreKey('date_from_mday'); + this.setIgnoreKey('date_to_year'); + this.setIgnoreKey('date_to_month'); + this.setIgnoreKey('date_to_mday'); + } + + renderDate() { + return ( + <> +
+ {this.renderFieldDate('From', 'date_from_year', 'date_from_month', 'date_from_mday')} + +
+
+ {this.renderFieldDate('To', 'date_to_year', 'date_to_month', 'date_to_mday')} +
+ + ); + } + + getRows() { + const rows = [ + { label: 'ID', value: this.renderFieldInputText('doi', 50) }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) }, + { label: '[en]Journal[/en][ja]ジャーナル名[/ja]', value: this.renderFieldInputText('journal', 50) }, + { label: '[en]Volume[/en][ja]巻[/ja]', value: this.renderFieldInputText('volume', 50) }, + { label: '[en]Publication Year[/en][ja]発行年[/ja]', value: this.renderFieldInputText('publication_year', 10) }, + { label: '[en]Publication Month[/en][ja]発行月[/ja]', value: this.renderFieldInputText('publication_month', 10) }, + { label: '[en]Publisher[/en][ja]出版者[/ja]', value: this.renderFieldInputText('publisher', 50) }, + { label: '[en]Location[/en][ja]出版地[/ja]', value: this.renderFieldSelect('publisher_location', ItemJournalPublisherLocations) }, + { label: '[en]Language[/en][ja]言語[/ja]', value: this.renderFieldSelect('lang', ItemBasicLangs) }, + { label: '[en]Publication Date[/en][ja]発行日[/ja]', value: this.renderDate() }, + { label: '[en]Keywords[/en][ja]キーワード[/ja]', value: this.renderFieldInputText('keyword', 50) }, + ]; + return rows; + } +} + +export default JournalAdvancedSearch; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/JournalDetail.tsx b/src/xoonips/item-type/journal/JournalDetail.tsx new file mode 100644 index 0000000..7403edb --- /dev/null +++ b/src/xoonips/item-type/journal/JournalDetail.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import Functions from '../../../functions'; +import { ItemJournal, ItemJournalPublisherLocations } from '../../lib/ItemUtil'; +import DetailBase from '../lib/DetailBase'; +import ItemTypeField from '../lib/field'; +import JournalUtil from './JournalUtil'; + +class JournalDetail extends DetailBase { + + getFields() { + const { lang } = this.props; + const item = this.props.item as ItemJournal; + const doi = JournalUtil.getDOI(item.doi); + const location = ItemJournalPublisherLocations.find((value) => value.type === item.publisher_location) || { type: '', label: '' }; + const fields = [ + { label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name }, + { label: 'ID', value: doi !== '' ? doi:{doi} : item.doi }, + { label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) }, + { label: '[en]Journal[/en][ja]ジャーナル名[/ja]', value: Functions.mlang(item.journal, lang) }, + { label: '[en]Volume[/en][ja]巻[/ja]', value: Functions.mlang(item.volume, lang) }, + { label: '[en]Publication Year[/en][ja]発行年[/ja]', value: Functions.mlang(item.publication_year.toString(), lang) }, + { label: '[en]Publication Month[/en][ja]発行月[/ja]', value: Functions.mlang(item.publication_month.toString(), lang) }, + { label: '[en]Publisher[/en][ja]出版者[/ja]', value: Functions.mlang(item.publisher, lang) }, + { label: '[en]Location[/en][ja]出版地[/ja]', value: Functions.mlang(location.label, lang) }, + { label: '[en]Language[/en][ja]言語[/ja]', value: }, + { label: '[en]Full Text[/en][ja]本文[/ja]', value: }, + { label: 'Rights', value: }, + { label: '[en]Release Date[/en][ja]本公開日[/ja]', value: }, + { label: '[en]Keyword[/en][ja]キーワード[/ja]', value: }, + { label: '[en]Note[/en][ja]補足[/ja]', value: }, + { label: '[en]Related item[/en][ja]関連アイテム[/ja]', value: }, + { label: '[en]Index[/en][ja]インデックス[/ja]', value: }, + { label: '[en]Item Owner[/en][ja]アイテム所有者[/ja]', value: }, + { label: '[en]Registered Date[/en][ja]登録日[/ja]', value: }, + { label: '[en]Last Update[/en][ja]最終更新日[/ja]', value: }, + { label: '[en]Change Log[/en][ja]更新履歴[/ja]', value: }, + ]; + return fields; + } +} + +export default JournalDetail; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/JournalList.tsx b/src/xoonips/item-type/journal/JournalList.tsx new file mode 100644 index 0000000..67d5416 --- /dev/null +++ b/src/xoonips/item-type/journal/JournalList.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import Functions from '../../../functions'; +import { ItemJournal } from '../../lib/ItemUtil'; +import ListBase, { ListBaseProps } from '../lib/ListBase'; +import JournalUtil from './JournalUtil'; + +class JournalList extends ListBase { + + constructor(props: ListBaseProps) { + super(props); + this.label = JournalUtil.label; + this.icon = JournalUtil.icon; + } + + renderBody() { + const { lang } = this.props; + const item = this.props.item as ItemJournal; + const doi = JournalUtil.getDOI(item.doi); + return ( +
+
{Functions.mlang(item.title, lang)} ({item.publication_year})
+
{Functions.mlang(item.publisher, lang)}
+ {doi !== '' && } +
+ ); + } +} + +export default JournalList; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/JournalTop.tsx b/src/xoonips/item-type/journal/JournalTop.tsx new file mode 100644 index 0000000..fcecc8d --- /dev/null +++ b/src/xoonips/item-type/journal/JournalTop.tsx @@ -0,0 +1,15 @@ +import TopBase, { TopBaseProps } from '../lib/TopBase'; +import JournalUtil from './JournalUtil'; + +class JournalTop extends TopBase { + + constructor(props: TopBaseProps) { + super(props); + this.type = JournalUtil.type; + this.label = JournalUtil.label; + this.icon = JournalUtil.icon; + this.description = JournalUtil.description; + } +} + +export default JournalTop; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/JournalUtil.tsx b/src/xoonips/item-type/journal/JournalUtil.tsx new file mode 100644 index 0000000..1462a24 --- /dev/null +++ b/src/xoonips/item-type/journal/JournalUtil.tsx @@ -0,0 +1,16 @@ +import icon from './icon.png'; + +const JournalUtil = { + type: 'journal', + label: 'Journal', + description: '[en]Journal[/en][ja]ジャーナル・定期刊行物[/ja]', + icon, + getDOI: (id:string): string => { + if (/^aini201[7-8]$/.test(id)) { + return '10.14931/' + id; + } + return ''; + } +} + +export default JournalUtil; \ No newline at end of file diff --git a/src/xoonips/item-type/journal/icon.png b/src/xoonips/item-type/journal/icon.png new file mode 100644 index 0000000..287fdd9 Binary files /dev/null and b/src/xoonips/item-type/journal/icon.png differ diff --git a/src/xoonips/item-type/journal/index.tsx b/src/xoonips/item-type/journal/index.tsx new file mode 100644 index 0000000..fd540c8 --- /dev/null +++ b/src/xoonips/item-type/journal/index.tsx @@ -0,0 +1,13 @@ +import JournalTop from './JournalTop'; +import JournalList from './JournalList'; +import JournalDetail from './JournalDetail'; +import JournalAdvancedSearch from './JournalAdvancedSearch'; + +const ItemTypeJournal = { + Top: JournalTop, + List: JournalList, + Detail: JournalDetail, + AdvancedSearch: JournalAdvancedSearch, +}; + +export default ItemTypeJournal; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/AdvancedSearchBase.tsx b/src/xoonips/item-type/lib/AdvancedSearchBase.tsx new file mode 100644 index 0000000..53b0181 --- /dev/null +++ b/src/xoonips/item-type/lib/AdvancedSearchBase.tsx @@ -0,0 +1,190 @@ +import React, { ChangeEvent, Component } from 'react'; +import { MultiLang } from '../../../config'; +import Functions from '../../../functions'; +import AdvancedSearchQuery from '../../lib/AdvancedSearchQuery'; +import { ItemSelectTypes } from '../../lib/ItemUtil'; + +export interface AdvancedSearchBaseProps { + lang: MultiLang; + query: AdvancedSearchQuery; +} + +interface State { + show: boolean; + values: any; +} + +class AdvancedSearchBase extends Component { + + protected type: string = 'base' + protected title: string = 'Base'; + protected query: AdvancedSearchQuery; + protected ignoreKeys: string[] = []; + + constructor(props: AdvancedSearchBaseProps) { + super(props); + this.state = { + show: false, + values: {}, + } + this.query = props.query; + this.handleChangeTitleCheck = this.handleChangeTitleCheck.bind(this); + } + + updateQuery(key: string, value: string) { + if (this.ignoreKeys.includes(key)) { + this.query.delete(this.type, key); + } else { + this.query.set(this.type, key, value); + } + } + + setIgnoreKey(key: string) { + if (!this.ignoreKeys.includes(key)) { + this.ignoreKeys = this.ignoreKeys.concat(key); + } + this.query.delete(this.type, key); + } + + deleteIgnoreKey(key: string) { + if (this.ignoreKeys.includes(key)) { + this.ignoreKeys = this.ignoreKeys.filter((v) => { + return (v !== key); + }); + } + this.query.set(this.type, key, this.state.values[key]); + } + + updateField(key: string, value: string) { + let values = Object.assign({}, this.state.values); + values[key] = value; + this.updateQuery(key, value); + this.setState({ values }); + } + + handleChangeTitleCheck(e: ChangeEvent) { + const show = e.target.checked; + if (show) { + Object.keys(this.state.values).forEach((key) => { + const value = this.state.values[key]; + this.updateQuery(key, value); + }); + } else { + this.query.deleteType(this.type); + } + this.setState({ show }); + } + + getRows(): { label: string, value: JSX.Element }[] { + return []; + } + + renderFieldInputText(key: string, size: number) { + const onChange = (e: ChangeEvent) => { + this.updateField(key, e.target.value); + }; + return ( + + ); + } + + renderFieldSelect(key: string, values: ItemSelectTypes) { + const { lang } = this.props; + const onChange = (e: ChangeEvent) => { + this.updateField(key, e.target.value); + }; + const options = values.map(({ type, label }, i) => { + return ; + }); + return ( + + ); + } + + renderFieldDate(label: string, keyYear: string, keyMonth: string, keyMday: string) { + const onChange = (e: ChangeEvent) => { + if (e.target.checked) { + this.deleteIgnoreKey(keyYear); + keyMonth !== '' && this.deleteIgnoreKey(keyMonth); + keyMday !== '' && this.deleteIgnoreKey(keyMday); + } else { + this.setIgnoreKey(keyYear); + keyMonth !== '' && this.setIgnoreKey(keyMonth); + keyMday !== '' && this.setIgnoreKey(keyMday); + } + }; + const month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + const monthOptions = month.map((value, i) => { + return ; + }) + let mdayOptions: JSX.Element[] = []; + for (let i = 1; i <= 31; i++) { + mdayOptions.push() + } + return ( +
+ + {label.length !== 0 && } + {keyMonth !== '' && + + } + {keyMday !== '' && + + } + this.updateField(keyYear, e.target.value)} /> +
+ ); + } + + renderBody() { + const { lang } = this.props; + if (this.state.show === false) { + return null; + } + const rows = this.getRows(); + const fields = rows.map((value, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return ( + + {Functions.mlang(value.label, lang)} + {value.value} + + ); + }); + return ( + + + {fields} + +
+ ); + } + + render() { + return ( +
+ + + + + + +
+ + {this.title} +
+ {this.renderBody()} +
+ ); + } + +} + +export default AdvancedSearchBase; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/DetailBase.tsx b/src/xoonips/item-type/lib/DetailBase.tsx new file mode 100644 index 0000000..470c146 --- /dev/null +++ b/src/xoonips/item-type/lib/DetailBase.tsx @@ -0,0 +1,52 @@ +import React, { Component, ReactNode } from 'react'; +import { MultiLang } from '../../../config'; +import Functions from '../../../functions'; +import { Item } from '../../lib/ItemUtil'; + +export interface DetailBaseField { + label: string; + value: ReactNode; +} + +export interface DetailBaseProps { + lang: MultiLang; + item: Item; + isBaseItem?: boolean; +} + +class DetailBase extends Component { + + getFields(): DetailBaseField[] { + return []; + } + + render() { + const { lang, isBaseItem } = this.props; + const renderField = (label: string, value: ReactNode, idx: number) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return ( + + {Functions.mlang(label, lang)} + {value} + + ) + } + let idx = 1; + const elements:JSX.Element[] = []; + this.getFields().forEach((field) => { + if (typeof isBaseItem === 'undefined' || isBaseItem === false || (field.label !== 'Index' && field.label !== '[en]Related to[/en][ja]関連アイテム[/ja]')) { + idx++; + elements.push(renderField(field.label, field.value, idx)); + } + }); + return ( + + + {elements} + +
+ ); + } +} + +export default DetailBase; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/ListBase.tsx b/src/xoonips/item-type/lib/ListBase.tsx new file mode 100644 index 0000000..e907973 --- /dev/null +++ b/src/xoonips/item-type/lib/ListBase.tsx @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; +import { MultiLang } from '../../../config'; +import ItemUtil, { Item } from '../../lib/ItemUtil'; +import SimPFLinkIcon from './field/SimPFLinkIcon'; + +export interface ListBaseProps { + lang: MultiLang; + item: Item +}; + +class ListBase extends Component { + + protected label = ''; + protected icon = ''; + protected url: string; + protected simpfLinkUrl: string; + + constructor(props: ListBaseProps) { + super(props); + this.url = ItemUtil.getUrl(props.item); + this.simpfLinkUrl = ItemUtil.getSimPFLinkUrl(props.item.item_id); + } + + renderIcon() { + return {this.label}; + } + + renderBody() { + return <>; + } + + render() { + const { lang } = this.props; + return ( + + + + + + + + +
+ {this.renderIcon()} + + {this.renderBody()} + + +
+ ); + } +} + +export default ListBase; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/TopBase.tsx b/src/xoonips/item-type/lib/TopBase.tsx new file mode 100644 index 0000000..068d2e5 --- /dev/null +++ b/src/xoonips/item-type/lib/TopBase.tsx @@ -0,0 +1,46 @@ +import React, { Component, Fragment } from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../../config'; +import Functions from '../../../functions'; +import ItemUtil, { ItemSelectTypes } from '../../lib/ItemUtil'; + +export interface TopBaseProps { + lang: MultiLang; +} + +class TopBase extends Component { + + protected type: string = ''; + protected label: string = ''; + protected icon: string = ''; + protected description: string = ''; + protected subTypes: ItemSelectTypes = []; + + render() { + const { lang } = this.props; + const url = ItemUtil.getItemTypeSearchUrl(this.type, ''); + const links = this.subTypes.map(({ type, label }, i) => { + const subUrl = ItemUtil.getItemTypeSearchUrl(this.type, type); + return {i > 0 && ' / '}{label}; + }); + return
+ + + + + + + +
+ {this.label} + + {this.label} +
+
+
{Functions.mlang(this.description, lang)}
+ {links} +
; + } +} + +export default TopBase; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Author.tsx b/src/xoonips/item-type/lib/field/Author.tsx new file mode 100644 index 0000000..9181ca8 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Author.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + author: string[]; +} + +const Author = (props: Props) => { + const { author } = props; + if (author.length === 0) { + return null; + } + const elements = author.map((value, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return {value}; + }); + return {elements}
; +} + +export default Author; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/ChangeLog.tsx b/src/xoonips/item-type/lib/field/ChangeLog.tsx new file mode 100644 index 0000000..f3d9ba9 --- /dev/null +++ b/src/xoonips/item-type/lib/field/ChangeLog.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; +import { ItemBasicChangeLog } from '../../../lib/ItemUtil'; +import DateTime from './DateTime'; + +interface Props { + lang: MultiLang; + changelog: ItemBasicChangeLog[]; +} + +const ChangeLog = (props: Props) => { + const { lang, changelog } = props; + if (changelog.length === 0) { + return null; + } + const elements = changelog.map((value, i) => { + return ( + + + {Functions.mlang(value.log, lang)} + + ); + }); + return ({elements}
); +} + +export default ChangeLog; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Contributer.tsx b/src/xoonips/item-type/lib/field/Contributer.tsx new file mode 100644 index 0000000..63261a9 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Contributer.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; + +interface Props { + lang: MultiLang; + uname: string; + name: string +} + +const Contributer = (props: Props) => { + const { lang, name, uname } = props; + const unsubscribed = '([en]Unsubscribed User[/en][ja]退会済みユーザ[/ja])'; + const label = uname === '' ? unsubscribed : (name === '' ? uname : name + ' (' + uname + ')'); + return {Functions.mlang(label, lang)}; +} + +export default Contributer; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/CreativeCommons.tsx b/src/xoonips/item-type/lib/field/CreativeCommons.tsx new file mode 100644 index 0000000..b545f02 --- /dev/null +++ b/src/xoonips/item-type/lib/field/CreativeCommons.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; + +export type CreativeCommonsType = 'by' | 'by-nc' | 'by-nc-nd' | 'by-nc-sa' | 'by-nd' | 'by-sa'; + +export const getCreativeCommonsType = (ccCommercialUse: number, ccModification: number): CreativeCommonsType => { + const cc = ccCommercialUse * 10 + ccModification; + switch (cc) { + case 0: + return 'by-nc-nd'; + case 1: + return 'by-nc-sa'; + case 2: + return 'by-nc'; + case 10: + return 'by-nd'; + case 11: + return 'by-sa'; + case 12: + default: + return 'by'; + } +} + +interface Props { + lang: MultiLang; + type: CreativeCommonsType; +} + +const CreativeCommons = (props: Props) => { + const { type } = props; + const url = 'http://creativecommons.org/licenses/' + type + '/4.0/'; + const logoUrl = 'https://i.creativecommons.org/l/' + type + '/4.0/88x31.png'; + const labels = { + by: 'Attribution', + nc: 'NonCommercial', + nd: 'NoDerivatives', + sa: 'ShareAlike', + } + const label = type.split('-').map((value) => { + const prop = value as 'by' | 'nc' | 'nd' | 'sa'; + return labels[prop]; + }).join('-'); + return ( + + + + + + + +
Creative Commons LicenseThis work is licensed under a Criative Commons {label} 4.0 International License.
+ ); +} + +export default CreativeCommons; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/DateTime.tsx b/src/xoonips/item-type/lib/field/DateTime.tsx new file mode 100644 index 0000000..0e9b1dc --- /dev/null +++ b/src/xoonips/item-type/lib/field/DateTime.tsx @@ -0,0 +1,21 @@ +import moment from 'moment'; +import React from 'react'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + date: number; + onlyDate?: boolean +} + +const DateTime = (props: Props) => { + const { date, onlyDate } = props; + const d = moment(new Date(date * 1000)); + let format = 'MMM D, Y'; + if (typeof onlyDate === 'undefined' || !onlyDate) { + format += ' HH:mm:ss'; + } + return {d.format(format)}; +} + +export default DateTime; diff --git a/src/xoonips/item-type/lib/field/Description.tsx b/src/xoonips/item-type/lib/field/Description.tsx new file mode 100644 index 0000000..353b3d9 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Description.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import XoopsCode from '../../../../common/lib/XoopsCode'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + description: string; + className?: string; +} + +const Description = (props: Props) => { + const { lang, description, className } = props; + const textarea = ; + const name = typeof className === 'undefined' ? 'description' : className; + return (
{textarea}
); +} + +export default Description; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/FileDownloadButton.module.css b/src/xoonips/item-type/lib/field/FileDownloadButton.module.css new file mode 100644 index 0000000..dd40e7e --- /dev/null +++ b/src/xoonips/item-type/lib/field/FileDownloadButton.module.css @@ -0,0 +1,21 @@ +.downloadButton { + display: inline-block; + padding: 7px 20px; + text-decoration: none !important; + font-weight: normal !important; + background: #f0f0f0; + color: #000 !important; + border: solid 1px #e0e0e0; + box-shadow: 2px 2px #bbbbbb; + border-radius: 5px; +} + +.downloadButton:hover { + background: #e8e8e8 !important; + border: solid 1px #cccccc; +} + +.downloadButton:active { + transform: translate(2px, 2px); + box-shadow: none; +} \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/FileDownloadButton.tsx b/src/xoonips/item-type/lib/field/FileDownloadButton.tsx new file mode 100644 index 0000000..76b2483 --- /dev/null +++ b/src/xoonips/item-type/lib/field/FileDownloadButton.tsx @@ -0,0 +1,56 @@ +import React, { Component } from 'react'; +import { MultiLang } from '../../../../config'; +import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil'; +import styles from './FileDownloadButton.module.css'; +import LicenseAgreementDialog from './LicenseAgreementDialog'; + +interface Props { + lang: MultiLang; + file: ItemBasicFile; + rights: string; + useCc: number; + ccCommercialUse: number; + ccModification: number; +} + +interface State { + show: boolean; +} + +class FileDownloadButton extends Component { + + constructor(props: Props) { + super(props); + this.state = { + show: false, + }; + this.handleClickDownload = this.handleClickDownload.bind(this); + this.unsetShow = this.unsetShow.bind(this); + } + + handleClickDownload(e: React.MouseEvent) { + const { rights, useCc } = this.props; + if (rights !== '' || useCc === 1) { + e.stopPropagation(); + e.preventDefault(); + this.setState({ show: true }); + } + } + + unsetShow() { + this.setState({ show: false }); + } + + render() { + const { lang, file, rights, useCc, ccCommercialUse, ccModification } = this.props; + const url = ItemUtil.getFileUrl(this.props.file); + return ( + <> + Download + + + ); + } +} + +export default FileDownloadButton; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/FileSize.tsx b/src/xoonips/item-type/lib/field/FileSize.tsx new file mode 100644 index 0000000..0198e89 --- /dev/null +++ b/src/xoonips/item-type/lib/field/FileSize.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + size: number; +} + +const FileSize = (props: Props) => { + const { size } = props; + const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const power = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0; + const label = Math.round(size / Math.pow(1024, power) * 10) / 10 + ' ' + units[power] + return {label}; +} + +export default FileSize; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/FreeKeyword.tsx b/src/xoonips/item-type/lib/field/FreeKeyword.tsx new file mode 100644 index 0000000..d33437e --- /dev/null +++ b/src/xoonips/item-type/lib/field/FreeKeyword.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + keyword: string[]; +} + +const FreeKeyword = (props: Props) => { + const { keyword } = props; + if (keyword.length === 0) { + return null; + } + const label = keyword.join(', '); + return ({label}); +} + +export default FreeKeyword; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/ItemFile.tsx b/src/xoonips/item-type/lib/field/ItemFile.tsx new file mode 100644 index 0000000..7c8dc9e --- /dev/null +++ b/src/xoonips/item-type/lib/field/ItemFile.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; +import { ItemBasicFile } from '../../../lib/ItemUtil'; +import DateTime from './DateTime'; +import FileDownloadButton from './FileDownloadButton'; +import FileSize from './FileSize'; + +interface Props { + lang: MultiLang; + file: ItemBasicFile[]; + type: string; + rights?: string; + useCc?: number; + ccCommercialUse?: number; + ccModification?: number; + downloadLimit?: number; +} + +const ItemFile = (props: Props) => { + const { lang, file, type } = props; + const rights = typeof props.rights === 'undefined' ? '' : props.rights; + const useCc = typeof props.useCc === 'undefined' ? 0 : props.useCc; + const ccCommercialUse = typeof props.ccCommercialUse === 'undefined' ? 0 : props.ccCommercialUse; + const ccModification = typeof props.ccModification === 'undefined' ? 0 : props.ccModification; + const downloadLimit = typeof props.downloadLimit === 'undefined' ? 0 : props.downloadLimit; + const data = file.find((value) => { + return value.file_type_name === type; + }); + if (typeof data === 'undefined') { + return null; + } + return ( +
+ {data.original_file_name}
+ + + + + + +
Type: {data.mime_type}{downloadLimit === 0 && }
Size:
Last updated:
+ {downloadLimit === 1 && <>
({Functions.mlang('[en]File has been removed[/en][ja]ファイルは削除されました[/ja]', lang)})} +
+ ); +} + +export default ItemFile; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/ItemIndex.tsx b/src/xoonips/item-type/lib/field/ItemIndex.tsx new file mode 100644 index 0000000..02937f6 --- /dev/null +++ b/src/xoonips/item-type/lib/field/ItemIndex.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; +import IndexUtil from '../../../lib/IndexUtil'; +import { ItemBasicIndex } from '../../../lib/ItemUtil'; + +interface Props { + lang: MultiLang; + index: ItemBasicIndex[]; +} + +const ItemIndex = (props: Props) => { + const { lang, index } = props; + if (index.length === 0) { + return null; + } + const elements = index.map((value, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + const url = IndexUtil.getUrl(value.index_id); + return ({Functions.mlang(value.title, lang)}); + }); + return ({elements}
); +} + +export default ItemIndex; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Language.tsx b/src/xoonips/item-type/lib/field/Language.tsx new file mode 100644 index 0000000..0a6a584 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Language.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { ItemBasicLang, ItemBasicLangs } from '../../../lib/ItemUtil'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; + +interface Props { + lang: MultiLang; + itemLang: ItemBasicLang; +} + +const Language = (props: Props) => { + const { lang, itemLang } = props; + const xlang = ItemBasicLangs.find((value) => value.type === itemLang); + if (typeof xlang === 'undefined') { + return null; + } + return ({Functions.mlang(xlang.label, lang)}); +} + +export default Language; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/LicenseAgreementDialog.module.css b/src/xoonips/item-type/lib/field/LicenseAgreementDialog.module.css new file mode 100644 index 0000000..b2f4525 --- /dev/null +++ b/src/xoonips/item-type/lib/field/LicenseAgreementDialog.module.css @@ -0,0 +1,38 @@ +.overlay { + position: fixed; + z-index: 90; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: #000000; + opacity: 0.8; +} + +.dialog { + position: fixed; + background-color: #d8d8d8; + width: 570px; + z-index: 100; + top: 50%; + left: 50%; + right: auto; + bottom: auto; + margin: 0 auto; + padding: 20px; + transform: translate(-50%, -50%); + border-radius: 5px; +} + +.box { + background-color: #fff; + padding: 10px; +} + +.download { + text-align: center; +} + +.download button { + margin: 5px 5px 0; +} \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/LicenseAgreementDialog.tsx b/src/xoonips/item-type/lib/field/LicenseAgreementDialog.tsx new file mode 100644 index 0000000..1fde593 --- /dev/null +++ b/src/xoonips/item-type/lib/field/LicenseAgreementDialog.tsx @@ -0,0 +1,113 @@ +import React, { ChangeEvent, Component, MouseEvent } from 'react'; +import { Modal } from 'react-overlays'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; +import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil'; +import DateTime from './DateTime'; +import FileSize from './FileSize'; +import styles from './LicenseAgreementDialog.module.css'; +import Rights from './Rights'; + +interface Props extends RouteComponentProps { + lang: MultiLang; + file: ItemBasicFile; + rights: string; + useCc: number; + ccCommercialUse: number; + ccModification: number; + show: boolean; + unsetShow: () => void; +} + +interface State { + show: boolean; + disabled: boolean; +} + +class LicenseAgreementDialog extends Component { + + constructor(props: Props) { + super(props); + this.state = { + show: props.show, + disabled: false, + }; + this.handleChangeCheckbox = this.handleChangeCheckbox.bind(this); + this.handleClickDownload = this.handleClickDownload.bind(this); + this.handleClickCancel = this.handleClickCancel.bind(this); + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + if (nextProps.show && !prevState.show) { + return { disabled: true, show: nextProps.show }; + } + return null; + } + + handleChangeCheckbox(e: ChangeEvent) { + const disabled = e.target.value === '0'; + this.setState({ disabled }); + } + + handleClickDownload(e: MouseEvent) { + this.props.unsetShow(); + this.setState({ show: false }); + } + + handleClickCancel() { + this.props.unsetShow(); + this.setState({ show: false }); + } + + renderBackdrop(props: any) { + return
; + } + + render() { + const { lang } = this.props; + const url = ItemUtil.getFileUrl(this.props.file); + return ( + +
+
+ {Functions.mlang('[en]Download file information[/en][ja]ダウンロードするファイルの情報[/ja]', lang)} +
+ {this.props.file.original_file_name}
+ + + + + + +
Type: {this.props.file.mime_type}
Size:
Last updated:
+
+
+
+
+ {Functions.mlang('[en]License agreement[/en][ja]ファイルのライセンス[/ja]', lang)} +
+ {Functions.mlang('[en]Please read the following license agreement carefully.[/en][ja]このファイルには下記のライセンスが設定されています。[/ja]', lang)} +
+ + {Functions.mlang('[en]I accept the terms in the license agreement.[/en][ja]ライセンスに同意します。[/ja]', lang)}
+ {Functions.mlang('[en]I do not accept the terms in the license agreement.[/en][ja]ライセンスに同意しません。[/ja]', lang)}
+
+
+
+
+
+ Acceptance is needed to download this file. +
+ + + + +
+
+
+ ); + } +} + +export default withRouter(LicenseAgreementDialog); \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Preview.module.css b/src/xoonips/item-type/lib/field/Preview.module.css new file mode 100644 index 0000000..7ce5431 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Preview.module.css @@ -0,0 +1,23 @@ +.previewBox { + text-align: center; + margin: 10px; +} + +.previewBox::after { + content: ""; + display: block; + clear: both; +} + +.preview { + width: 200px; + margin: 0 auto; + float: left; + text-align: center; +} + +.preview caption { + width: 200px; + margin: 5px; + font-size: 80%; +} \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Preview.tsx b/src/xoonips/item-type/lib/field/Preview.tsx new file mode 100644 index 0000000..86ec5b3 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Preview.tsx @@ -0,0 +1,84 @@ +import React, { Component } from 'react'; +import Lightbox from 'react-image-lightbox'; +import 'react-image-lightbox/style.css'; +import { MultiLang } from '../../../../config'; +import Functions from '../../../../functions'; +import ItemUtil, { ItemBasicFile } from '../../../lib/ItemUtil'; +import styles from './Preview.module.css'; + +interface Props { + lang: MultiLang; + file: ItemBasicFile[]; +} + +interface State { + isOpen: boolean; + imageIndex: number; +} + +class Preview extends Component { + + constructor(props: Props) { + super(props); + this.state = { + isOpen: false, + imageIndex: 0, + }; + } + + render() { + const { lang, file } = this.props; + const data = file.filter((value) => { + return value.file_type_name === 'preview'; + }); + if (data.length === 0) { + return null; + } + let imageUrls: string[] = []; + const previews = data.map((value, idx) => { + const fileUrl = ItemUtil.getFileUrl(value); + const previewUrl = ItemUtil.getPreviewFileUrl(value); + const caption = Functions.mlang(value.caption, lang); + imageUrls.push(fileUrl); + return ( +
+ { + e.preventDefault(); + this.setState({ isOpen: true, imageIndex: idx }); + }}> + {caption} + +
{caption}
+
+ ); + }); + const { isOpen, imageIndex } = this.state; + return ( + <> +
+ {previews} +
+ {isOpen && + this.setState({ isOpen: false })} + onMovePrevRequest={() => + this.setState({ + imageIndex: (imageIndex + data.length - 1) % data.length, + }) + } + onMoveNextRequest={() => + this.setState({ + imageIndex: (imageIndex + 1) % data.length, + }) + } + /> + } + + ); + } +} + +export default Preview; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/PublicationDate.tsx b/src/xoonips/item-type/lib/field/PublicationDate.tsx new file mode 100644 index 0000000..6da3a62 --- /dev/null +++ b/src/xoonips/item-type/lib/field/PublicationDate.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import DateTime from './DateTime'; + +interface Props { + lang: MultiLang; + year: number; + month: number; + mday: number; +} + +const PublicationDate = (props: Props) => { + const { lang, year, month, mday } = props; + const d = new Date(year + '-' + month + '-' + mday); + const timestamp = Math.floor(d.valueOf() / 1000); + return ; +} + +export default PublicationDate; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Readme.tsx b/src/xoonips/item-type/lib/field/Readme.tsx new file mode 100644 index 0000000..6fbd19b --- /dev/null +++ b/src/xoonips/item-type/lib/field/Readme.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import Description from './Description'; + +interface Props { + lang: MultiLang; + readme: string; +} + +const Readme = (props: Props) => { + const { lang, readme } = props; + return ; +} + +export default Readme; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/RelatedTo.tsx b/src/xoonips/item-type/lib/field/RelatedTo.tsx new file mode 100644 index 0000000..87cd518 --- /dev/null +++ b/src/xoonips/item-type/lib/field/RelatedTo.tsx @@ -0,0 +1,74 @@ +import React, { Component } from 'react'; +import { MultiLang } from '../../../../config'; +import ItemType from '../../../item-type'; +import ItemUtil from '../../../lib/ItemUtil'; + +interface Props { + lang: MultiLang + relatedTo: number[]; +} + +interface State { + elements: JSX.Element[]; +} + +class RelatedTo extends Component { + + private isActive: boolean; + + constructor(props: Props) { + super(props); + this.state = { + elements: [], + }; + this.isActive = false; + } + + componentDidMount() { + this.isActive = true; + this.updateElements(this.props.relatedTo); + } + + componentDidUpdate(prevProps: Props) { + if (JSON.stringify(this.props.relatedTo) !== JSON.stringify(prevProps.relatedTo)) { + this.updateElements(this.props.relatedTo); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + updateElements(relatedTo: number[]) { + const { lang } = this.props; + if (relatedTo.length === 0) { + this.setState({ elements: [] }); + } else { + ItemUtil.getList(relatedTo, (results) => { + const elements = results.data.map((item, idx) => { + const evenodd = idx % 0 ? 'even' : 'odd'; + return ; + }); + if (this.isActive) { + this.setState({ elements }); + } + }); + } + } + + render() { + if (this.state.elements.length === 0) { + return null; + } + return ( + + + + {this.state.elements} + +
Item summary
+ ); + } +} + +export default RelatedTo; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Repeatable.tsx b/src/xoonips/item-type/lib/field/Repeatable.tsx new file mode 100644 index 0000000..6f1add4 --- /dev/null +++ b/src/xoonips/item-type/lib/field/Repeatable.tsx @@ -0,0 +1,21 @@ +import React, { ReactNode } from 'react'; +import { MultiLang } from '../../../../config'; + +interface Props { + lang: MultiLang; + data: ReactNode[]; +} + +const Repeatable = (props: Props) => { + const { data } = props; + if (data.length === 0) { + return null; + } + const elements = data.map((value, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return {value}; + }); + return {elements}
; +} + +export default Repeatable; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/Rights.tsx b/src/xoonips/item-type/lib/field/Rights.tsx new file mode 100644 index 0000000..25f65cf --- /dev/null +++ b/src/xoonips/item-type/lib/field/Rights.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import CreativeCommons, { getCreativeCommonsType } from './CreativeCommons'; +import Description from './Description'; + +interface Props { + lang: MultiLang; + rights: string; + useCc: number; + ccCommercialUse: number; + ccModification: number; +} + +const Rights = (props: Props) => { + const { lang, rights, useCc, ccCommercialUse, ccModification } = props; + if (useCc === 0) { + return ; + } + const ccType = getCreativeCommonsType(ccCommercialUse, ccModification); + return ; +} + +export default Rights; \ No newline at end of file diff --git a/src/xoonips/item-type/lib/field/SimPFLinkIcon.tsx b/src/xoonips/item-type/lib/field/SimPFLinkIcon.tsx new file mode 100644 index 0000000..1bfc8cb --- /dev/null +++ b/src/xoonips/item-type/lib/field/SimPFLinkIcon.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { MultiLang } from '../../../../config'; +import imageButton from '../../../assets/images/simpf_button.png'; + +interface Props { + lang: MultiLang; + url: string; + isDetail: boolean; +} + +const SimPFLinkIcon = (props: Props) => { + const { url, isDetail } = props; + const title = 'Online Simulation'; + const size = isDetail ? 64 : 35; + if (url === '') { + return null; + } + return ( + + {title} + + );; +} + +export default SimPFLinkIcon; diff --git a/src/xoonips/item-type/lib/field/index.tsx b/src/xoonips/item-type/lib/field/index.tsx new file mode 100644 index 0000000..e786f30 --- /dev/null +++ b/src/xoonips/item-type/lib/field/index.tsx @@ -0,0 +1,41 @@ +import Author from './Author'; +import ChangeLog from './ChangeLog'; +import Contributer from './Contributer'; +import CreativeCommons from './CreativeCommons'; +import DateTime from './DateTime'; +import Description from './Description'; +import FileDownloadButton from './FileDownloadButton'; +import FileSize from './FileSize'; +import FreeKeyword from './FreeKeyword'; +import ItemFile from './ItemFile'; +import ItemIndex from './ItemIndex'; +import Language from './Language'; +import Preview from './Preview'; +import PublicationDate from './PublicationDate'; +import Readme from './Readme'; +import RelatedTo from './RelatedTo'; +import Repeatable from './Repeatable'; +import Rights from './Rights'; + +const ItemTypeField = { + Author, + ChangeLog, + Contributer, + CreativeCommons, + DateTime, + Description, + FileDownloadButton, + FileSize, + FreeKeyword, + ItemFile, + ItemIndex, + Language, + Preview, + PublicationDate, + Readme, + RelatedTo, + Repeatable, + Rights, +}; + +export default ItemTypeField; \ No newline at end of file diff --git a/src/xoonips/lib/AdvancedSearchQuery.ts b/src/xoonips/lib/AdvancedSearchQuery.ts new file mode 100644 index 0000000..9266348 --- /dev/null +++ b/src/xoonips/lib/AdvancedSearchQuery.ts @@ -0,0 +1,202 @@ +import split from 'split-string'; + +type AdvancedSearchQueryData = Map; + +class AdvancedSearchQuery { + + private dataset: AdvancedSearchQueryData = new Map(); + + empty() { + let ret = true; + this.dataset.forEach((data) => { + data.forEach((value) => { + value = value.trim(); + if (value.length !== 0) { + ret = false; + } + }); + }); + return ret; + } + + splitString(str: string): string[] { + return split(str, { separator: ' ', quotes: true }) + .map((value) => { + return value.replace(/^['"](.*)['"]$/, (whole, m1) => m1).trim(); + }) + .filter((value) => { + return value.length > 0; + }); + } + + set(type: string, key: string, value: string) { + type = type.trim(); + key = key.trim(); + const data: URLSearchParams = this.dataset.has(type) ? this.dataset.get(type) as URLSearchParams : new URLSearchParams(); + data.set(key, value); + this.dataset.set(type, data); + } + + delete(type: string, key: string) { + type = type.trim(); + key = key.trim(); + const data: URLSearchParams = this.dataset.has(type) ? this.dataset.get(type) as URLSearchParams : new URLSearchParams(); + data.delete(key); + this.dataset.set(type, data); + } + + deleteType(type: string) { + type = type.trim(); + this.dataset.delete(type.trim()); + } + + getQueryParams() { + let ret: URLSearchParams = new URLSearchParams(); + this.dataset.forEach((data, type) => { + data.forEach((value, key) => { + value = value.trim(); + value.length > 0 && ret.set(type + '.' + key, value); + }); + }); + return ret; + } + + setByQueryString(queryString: string) { + const query = new URLSearchParams(queryString); + query.forEach((v, k) => { + const [type, ...key] = k.split('.'); + if (typeof key === 'undefined') { + return; + } + this.set(type, key.join('.'), v); + }); + } + + getSearchFilter() { + const regex = (str: string) => { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + const filter: any = []; + this.dataset.forEach((data, type) => { + const filter2: any = []; + let journal_date_from: number = NaN; + let journal_date_from_year: number = NaN; + let journal_date_from_month: number = NaN; + let journal_date_from_mday: number = NaN; + let journal_date_to: number = NaN; + let journal_date_to_year: number = NaN; + let journal_date_to_month: number = NaN; + let journal_date_to_mday: number = NaN; + let article_meeting_date_from_year: number = NaN; + let article_meeting_date_from_month: number = NaN; + let article_meeting_date_from_mday: number = NaN; + let article_meeting_date_to_year: number = NaN; + let article_meeting_date_to_month: number = NaN; + let article_meeting_date_to_mday: number = NaN; + let article_date_from: number = NaN; + let article_date_from_year: number = NaN; + let article_date_from_month: number = NaN; + let article_date_from_mday: number = NaN; + let article_date_to: number = NaN; + let article_date_to_year: number = NaN; + let article_date_to_month: number = NaN; + let article_date_to_mday: number = NaN; + filter2.push({ + item_type_name: type, + }); + data.forEach((value, key) => { + const keys = key.split('.'); + if (keys.length > 0) { + if (keys[0] === 'file' && keys.length === 3) { + const fileType = keys[1]; + const subKey = keys[2]; + filter2.push({ + file: { + '$elemMatch': { + file_type_name: fileType, + [subKey]: { '$regex': [regex(value), 'i'] } + } + } + }); + } else if (type === 'journal' && keys[0] === 'date_from_year') { + journal_date_from_year = parseInt(value, 10); + } else if (type === 'journal' && keys[0] === 'date_from_month') { + journal_date_from_month = parseInt(value, 10); + } else if (type === 'journal' && keys[0] === 'date_from_mday') { + journal_date_from_mday = parseInt(value, 10); + } else if (type === 'journal' && keys[0] === 'date_to_year') { + journal_date_to_year = parseInt(value, 10); + } else if (type === 'journal' && keys[0] === 'date_to_month') { + journal_date_to_month = parseInt(value, 10); + } else if (type === 'journal' && keys[0] === 'date_to_mday') { + journal_date_to_mday = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_from_year') { + article_meeting_date_from_year = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_from_month') { + article_meeting_date_from_month = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_from_mday') { + article_meeting_date_from_mday = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_to_year') { + article_meeting_date_to_year = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_to_month') { + article_meeting_date_to_month = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'meeting_date_to_mday') { + article_meeting_date_to_mday = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_from_year') { + article_date_from_year = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_from_month') { + article_date_from_month = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_from_mday') { + article_date_from_mday = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_to_year') { + article_date_to_year = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_to_month') { + article_date_to_month = parseInt(value, 10); + } else if (type === 'article' && keys[0] === 'date_to_mday') { + article_date_to_mday = parseInt(value, 10); + } else { + filter2.push({ [key]: { '$regex': [regex(value), 'i'] } }); + } + } + }); + if (!isNaN(journal_date_from_year) && !isNaN(journal_date_from_month) && !isNaN(journal_date_from_mday)) { + journal_date_from = new Date(journal_date_from_year, journal_date_from_month - 1, journal_date_from_mday).getTime() / 1000; + } + if (!isNaN(journal_date_to_year) && !isNaN(journal_date_to_month) && !isNaN(journal_date_to_mday)) { + journal_date_to = new Date(journal_date_to_year, journal_date_to_month - 1, journal_date_to_mday).getTime() / 1000; + } + if (!isNaN(journal_date_from) && !isNaN(journal_date_to)) { + filter2.push({ date: { '$between': [journal_date_from, journal_date_to] } }); + } else if (!isNaN(journal_date_from)) { + filter2.push({ date: { '$gte': journal_date_from } }); + } else if (!isNaN(journal_date_to)) { + filter2.push({ date: { '$lte': journal_date_to } }); + } + if (!isNaN(article_meeting_date_from_year) && !isNaN(article_meeting_date_from_month) && !isNaN(article_meeting_date_from_mday)) { + const date = new Date(article_meeting_date_from_year, article_meeting_date_from_month - 1, article_meeting_date_from_mday).getTime() / 1000; + filter2.push({ meeting_date_from: { '$eq': date } }); + } + if (!isNaN(article_meeting_date_to_year) && !isNaN(article_meeting_date_to_month) && !isNaN(article_meeting_date_to_mday)) { + const date = new Date(article_meeting_date_to_year, article_meeting_date_to_month - 1, article_meeting_date_to_mday).getTime() / 1000; + filter2.push({ meeting_date_to: { '$eq': date } }); + } + if (!isNaN(article_date_from_year) && !isNaN(article_date_from_month) && !isNaN(article_date_from_mday)) { + article_date_from = new Date(article_date_from_year, article_date_from_month - 1, article_date_from_mday).getTime() / 1000; + } + if (!isNaN(article_date_to_year) && !isNaN(article_date_to_month) && !isNaN(article_date_to_mday)) { + article_date_to = new Date(article_date_to_year, article_date_to_month - 1, article_date_to_mday).getTime() / 1000; + } + if (!isNaN(article_date_from) && !isNaN(article_date_to)) { + filter2.push({ date: { '$between': [article_date_from, article_date_to] } }); + } else if (!isNaN(article_date_from)) { + filter2.push({ date: { '$gte': article_date_from } }); + } else if (!isNaN(article_date_to)) { + filter2.push({ date: { '$lte': article_date_to } }); + } + filter.push({ '$and': filter2 }); + }); + return { '$or': filter }; + } +} + +export default AdvancedSearchQuery; \ No newline at end of file diff --git a/src/xoonips/lib/IndexUtil.ts b/src/xoonips/lib/IndexUtil.ts new file mode 100644 index 0000000..3dba888 --- /dev/null +++ b/src/xoonips/lib/IndexUtil.ts @@ -0,0 +1,95 @@ +import loki from 'lokijs'; +import indexesJson from '../assets/tree.json'; + +export interface Index { + id: number; + title: string; + numOfItems: number; + parentId: number; + weight: number; +} + +export const INDEX_ID_ROOT = 1; +export const INDEX_ID_PUBLIC = 2; + +interface IndexData { + id: number; + title: string; + num_of_items: number; + children: IndexData[]; +} +type IndexesData = IndexData[]; + +class IndexUtil { + + private database: loki; + private indexes: Collection; + + constructor(json: IndexesData) { + this.database = new loki('database'); + this.indexes = this.database.addCollection('indexes'); + this.load(json); + } + + load(json: IndexesData): void { + const store = (indexesData: IndexesData, parentId: number) => { + indexesData.forEach((indexData: IndexData, idx) => { + const entry: Index = { + id: indexData.id, + title: indexData.title, + numOfItems: indexData.num_of_items, + parentId: parentId, + weight: idx, + }; + this.indexes.insert(entry); + store(indexData.children, indexData.id) + }); + } + store(json, INDEX_ID_ROOT); + } + + getUrl(id: number): string { + return '/modules/xoonips/list.php?index_id=' + String(id); + } + + get(indexId: number): Index | null { + const filter = { + 'id': indexId, + } + const res = this.indexes.findOne(filter); + return res; + } + + getChildren(indexId: number): Index[] { + const filter = { + 'parentId': indexId, + } + const res = this.indexes.chain().find(filter).simplesort('weight').data(); + return res; + } + + countChildren(indexId: number): number { + const filter = { + 'parentId': indexId, + } + const res = this.indexes.count(filter); + return res; + } + + getParents(parentId: number): Index[] { + let parents: Index[] = []; + const loop = (parentId: number) => { + if (parentId !== INDEX_ID_ROOT) { + const parent = this.get(parentId); + if (parent !== null) { + loop(parent.parentId); + parents.push(parent); + } + } + } + loop(parentId); + return parents; + } +} + +export default new IndexUtil(indexesJson); \ No newline at end of file diff --git a/src/xoonips/lib/ItemUtil.ts b/src/xoonips/lib/ItemUtil.ts new file mode 100644 index 0000000..e367794 --- /dev/null +++ b/src/xoonips/lib/ItemUtil.ts @@ -0,0 +1,490 @@ +import AsyncLock from 'async-lock'; +import axios from 'axios'; +import loki from 'lokijs'; +import funcs from '../../functions'; +import simpfLinksJson from '../assets/simpf-links.json'; +import AdvancedSearchQuery from './AdvancedSearchQuery'; + +interface SimPFLink { + id: number; + url: string; +} + +interface ItemSelectType { + type: T; + label: string; +} + +export type ItemSelectTypes = readonly ItemSelectType[]; + +export type ItemBasicLang = 'eng' | 'jpn' | 'fra' | 'deu' | 'esl' | 'ita' | 'dut' | 'sve' | 'nor' | 'dan' | 'fin' | 'por' | 'chi' | 'kor'; +export const ItemBasicLangs: ItemSelectTypes = [ + { type: 'eng', label: '[en]English[/en][ja]英語[/ja]' }, + { type: 'jpn', label: '[en]Japanese[/en][ja]日本語[/ja]' }, + { type: 'fra', label: '[en]French[/en][ja]フランス語[/ja]' }, + { type: 'deu', label: '[en]German[/en][ja]ドイツ語[/ja]' }, + { type: 'esl', label: '[en]Spanish[/en][ja]スペイン語[/ja]' }, + { type: 'ita', label: '[en]Italian[/en][ja]イタリア語[/ja]' }, + { type: 'dut', label: '[en]Dutch[/en][ja]オランダ語[/ja]' }, + { type: 'sve', label: '[en]Swedish[/en][ja]スウェーデン語[/ja]' }, + { type: 'nor', label: '[en]Norwegian[/en][ja]ノルウェー語[/ja]' }, + { type: 'dan', label: '[en]Danish[/en][ja]デンマーク語[/ja]' }, + { type: 'fin', label: '[en]Finnish[/en][ja]フィンランド語[/ja]' }, + { type: 'por', label: '[en]Portuguese[/en][ja]ポルトガル語[/ja]' }, + { type: 'chi', label: '[en]Chinese[/en][ja]中国語[/ja]' }, + { type: 'kor', label: '[en]Korean[/en][ja]韓国語[/ja]' } +]; + +export interface ItemBasicIndex { + index_id: number; + title: string; +} +export interface ItemBasicChangeLog { + log_date: number; + log: string; +} +export interface ItemBasicFile { + file_id: number; + original_file_name: string; + mime_type: string; + file_size: number; + caption: string; + timestamp: number; + file_type_name: string; + file_type_display_name: string; +} +export interface ItemCore { + item_id: number; + doi: string; +} +export interface ItemBasic extends ItemCore { + uid: number; + description: string; + last_update_date: number; + creation_date: number; + publication_year: number; + publication_month: number; + publication_mday: number; + lang: ItemBasicLang; + title: string; + item_type_display_name: string; + item_type_name: string; + uname: string; + name: string; + item_url: string; + index: ItemBasicIndex[]; + changelog: ItemBasicChangeLog[]; + related_to: number[]; + keyword: string[]; + file: ItemBasicFile[]; +} + + +export type ItemJournalPublisherLocation = 'USA' | 'JPN'; +export const ItemJournalPublisherLocations: ItemSelectTypes = [ + { type: 'USA', label: '[en]United States[/en][ja]アメリカ[/ja]' }, + { type: 'JPN', label: '[en]Japan[/en][ja]日本[/ja]' } +]; +export interface ItemJournal extends ItemBasic { + journal: string; + volume: string; + publisher: string; + publisher_location: ItemJournalPublisherLocation; + rights: string; + use_cc: number; + cc_commercial_use: number; + cc_modification: number; + date: number; +} + +export interface ItemArticle extends ItemBasic { + author: string[]; + affiliation: string[]; + journal_name: string; + journal_volume: string; + journal_page: string; + journal_publisher: string; + meeting_name: string; + meeting_place: string; + meeting_date_from: number; + meeting_date_to: number; + meeting_program_no: string; + rights: string; + use_cc: number; + cc_commercial_use: number; + cc_modification: number; + date: number; +} + +export interface ItemGeneralData extends ItemBasic { + rights: string; + use_cc: number; + cc_commercial_use: number; + cc_modification: number; + creator: string[]; + affiliation: string[]; + date: number; + publisher: string; + version: string; + format: string; + variation: string; + relation: string[]; +} + +export type Item = ItemJournal | ItemArticle | ItemGeneralData; + +export interface KeywordSearchQuery { + type: string; + keyword: string; +} + +export type SortConditionLimit = 20 | 50 | 100; +export type SortConditionOrderBy = 'title' | 'doi' | 'last_update_date' | 'creation_date' | 'publication_date'; +export enum SortConditionOrderDir { ASC, DESC } + +export interface SortCondition { + limit: SortConditionLimit; + orderBy: SortConditionOrderBy; + orderDir: SortConditionOrderDir; + page: number; +} + +class ItemSorter { + + public orderBy: SortConditionOrderBy; + public orderDir: SortConditionOrderDir; + + constructor(condition: SortCondition) { + this.orderBy = condition.orderBy; + this.orderDir = condition.orderDir; + this.sort = this.sort.bind(this); + } + + sort(a: Item, b: Item) { + let av: string = ''; + let bv: string = ''; + switch (this.orderBy) { + case 'title': + av = a.title.toLocaleUpperCase(); + bv = b.title.toLocaleUpperCase(); + break; + case 'doi': + av = a.doi.toLocaleUpperCase(); + bv = b.doi.toLocaleUpperCase(); + break; + case 'last_update_date': + av = String(a.last_update_date); + bv = String(b.last_update_date); + break; + case 'creation_date': + av = String(a.creation_date); + bv = String(b.creation_date); + break; + case 'publication_date': + av = String(a.publication_year * 10000 + a.publication_month * 100 + a.publication_mday); + bv = String(b.publication_year * 10000 + b.publication_month * 100 + b.publication_mday); + break; + default: + break; + } + if (this.orderDir === SortConditionOrderDir.ASC) { + if (av > bv) return -1; + else if (av < bv) return 1; + } else { + if (av > bv) return 1; + else if (av < bv) return -1; + } + return 0; + } +} + +type GetResult = Item | null; +export interface GetCallbackFunc { (item: GetResult): void } +export interface SearchResult { + total: number; + data: Item[]; +} +export interface SearchCallbackFunc { (results: SearchResult): void } +export interface SearchFunc { (condition: SortCondition, func: SearchCallbackFunc): void } + +interface ItemLoadCallbackFunc { (items: Collection): void } + +class ItemUtil { + + private database: loki; + private items: Collection; + private simpfLinks: Collection; + private loading: boolean; + private callbacks: ItemLoadCallbackFunc[]; + + constructor() { + this.database = new loki('database'); + this.items = this.database.addCollection('items'); + this.simpfLinks = this.database.addCollection('simpf-links'); + this.loading = true; + this.callbacks = []; + this.load(); + } + + load(): void { + axios.get('/modules/xoonips/items.json', { responseType: 'json' }).then((response) => { + const itemsJson = response.data as Item[]; + itemsJson.forEach((json: Item) => { + this.items.insert(json); + }); + const lock = new AsyncLock(); + lock.acquire('items', () => { + this.loading = false; + this.callbacks.forEach((callback) => { + callback(this.items); + }); + this.callbacks = []; + }); + }); + const simpfLinks = simpfLinksJson as SimPFLink[]; + simpfLinks.forEach((simpfLink: SimPFLink) => { + this.simpfLinks.insert(simpfLink); + }); + } + + registerItemLoadCallback(func: ItemLoadCallbackFunc): void { + const lock = new AsyncLock(); + lock.acquire('items', () => { + if (this.loading) { + this.callbacks.push(func); + } else { + func(this.items); + } + }); + } + + getUrl(item: ItemCore): string { + const query = new URLSearchParams(); + if (item.doi !== '') { + query.set('id', item.doi); + } else { + query.set('item_id', item.item_id.toString()); + } + return `/modules/xoonips/detail.php?${query.toString()}`; + } + + getFileUrl(file: ItemBasicFile): string { + return '/modules/xoonips/file/' + String(file.file_id) + '/' + funcs.escape(file.original_file_name); + } + + getPreviewFileUrl(file: ItemBasicFile): string { + return '/modules/xoonips/file/' + String(file.file_id) + '.png'; + } + + getSearchByKeywordUrl(type: string, keyword: string): string { + const params = new URLSearchParams({ + op: 'quick', + search_condition: type, + keyword + }); + return '/modules/xoonips/search.php?' + params.toString(); + } + + getItemTypeSearchUrl(type: string | null, subType: string | null): string { + if (type === null || subType === null) { + return '/'; + } + const query = new URLSearchParams(); + if (subType === '') { + query.set('op', 'advanced'); + query.set('search_itemtype', `${type}`); + } else { + query.set('op', 'itemsubtypesearch'); + query.set(`${type}`, 'on'); + query.set(`${type}_subtype`, subType); + } + return `/modules/xoonips/search.php?${query.toString()}`; + } + + getSearchByAdvancedKeywordsUrl(query: AdvancedSearchQuery): string { + return '/modules/xoonips/search.php?op=advanced&' + query.getQueryParams().toString(); + } + + getSearchKeywordByQuery(queryString: string): KeywordSearchQuery { + const query = new URLSearchParams(queryString); + const type = query.get('search_condition') || 'all'; + const keyword = query.get('keyword') || ''; + return ({ type, keyword }); + } + + getAdvancedSearchQueryByQuery(queryString: string): AdvancedSearchQuery { + const query: AdvancedSearchQuery = new AdvancedSearchQuery(); + query.setByQueryString(queryString); + return query; + } + + get(itemId: number, func: GetCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const filter = { + item_id: itemId + } + const item = items.findOne(filter); + func(item); + }); + } + + getByDoi(doi: string, func: GetCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const filter = { + doi: doi + } + const item = items.findOne(filter); + func(item); + }); + } + + getList(itemIds: number[], func: SearchCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const filter = { + item_id: { + '$in': itemIds, + } + } + const sort = (a: Item, b: Item) => { + const aIdx = itemIds.findIndex((itemId) => { return a.item_id === itemId; }); + const bIdx = itemIds.findIndex((itemId) => { return b.item_id === itemId; }); + if (aIdx > bIdx) { + return 1; + } else if (aIdx < bIdx) { + return -1; + } + return 0; + } + const data = items.chain().find(filter).sort(sort).data(); + const res = { + total: data.length, + data: data, + } + func(res); + }); + } + + getListByIndexId(indexId: number, condition: SortCondition, func: SearchCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const filter: any = { + 'index.index_id': indexId + }; + const offset = condition.limit * (condition.page - 1); + const result = items.chain().find(filter); + const itemSorter = new ItemSorter(condition); + const ret = { + total: result.count(), + data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data() + }; + func(ret); + }); + } + + getListByItemType(itemType: string, subItemType: string, condition: SortCondition, func: SearchCallbackFunc): void { + this.registerItemLoadCallback((items) => { + let filter: any = { + item_type_name: itemType, + } + if (subItemType !== '') { + switch (itemType) { + default: + break; + } + } + const offset = condition.limit * (condition.page - 1); + const result = items.chain().find(filter); + const itemSorter = new ItemSorter(condition); + const ret = { + total: result.count(), + data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data() + }; + func(ret); + }); + } + + getListByKeyword(type: string, keyword: string, condition: SortCondition, func: SearchCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const regex = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const num = keyword.match(/^[0-9]+$/) ? parseInt(keyword, 10) : null; + let filter: any = { '$or': [] }; + const appendToFilter = (type: string, strKeys: string[], numKeys: string[]) => { + const basicStrKeys: string[] = ['title', 'keyword', 'doi', 'description', 'uname', 'name', 'index.title']; + const basicNumKeys: string[] = []; + let filterItemType: any = { + item_type_name: type, + '$or': [] + }; + let sKeys: string[] = basicStrKeys.concat(strKeys); + let nKeys: string[] = basicNumKeys.concat(numKeys); + sKeys.forEach((key) => { + let criteria: any = {}; + criteria[key] = { '$regex': [regex, 'i'] }; + filterItemType['$or'].push(criteria); + }); + if (num !== null) { + nKeys.forEach((key) => { + let criteria: any = {}; + criteria[key] = { '$eq': num }; + filterItemType['$or'].push(criteria); + }); + } + filter['$or'].push(filterItemType); + } + if (type === 'basic') { + filter['$or'].push({ 'title': { '$regex': [regex, 'i'] } }); + filter['$or'].push({ 'keyword': { '$regex': [regex, 'i'] } }); + } else { + if (type === 'all' || type === 'journal') { + const strKeys: string[] = ['doi', 'title', 'journal', 'volume', 'publication_year', 'publisher', 'file.original_file_name', 'keyword', 'description']; + const numKeys: string[] = []; + appendToFilter('journal', strKeys, numKeys); + } + if (type === 'all' || type === 'article') { + const strKeys: string[] = ['doi', 'title', 'author', 'affiliation', 'journal_name', 'journal_volume', 'publication_year', 'journal_page', 'journal_publisher', 'meeting_name', 'meeting_place', 'meeting_program_no', 'file.original_file_name', 'keyword']; + const numKeys: string[] = []; + appendToFilter('article', strKeys, numKeys); + } + if (type === 'all' || type === 'generaldata') { + const strKeys: string[] = ['doi', 'title', 'description', 'file.caption', 'file.original_file_name', 'creator', 'affiliation', 'version', 'format', 'variation', 'relation', 'keyword']; + const numKeys: string[] = []; + appendToFilter('generaldata', strKeys, numKeys); + } + if (type !== 'all') { + filter['item_type_name'] = type; + } + } + const offset = condition.limit * (condition.page - 1); + const result = items.chain().find(filter); + const itemSorter = new ItemSorter(condition); + const ret = { + total: result.count(), + data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data() + }; + func(ret); + }); + } + + getListByAdvancedSearchQuery(query: AdvancedSearchQuery, condition: SortCondition, func: SearchCallbackFunc): void { + this.registerItemLoadCallback((items) => { + const filter: any = query.getSearchFilter(); + const offset = condition.limit * (condition.page - 1); + const result = items.chain().find(filter); + const itemSorter = new ItemSorter(condition); + const ret = { + total: result.count(), + data: result.sort(itemSorter.sort).offset(offset).limit(condition.limit).data() + }; + func(ret); + }); + } + + getSimPFLinkUrl(itemId: number) { + const simpfLink = this.simpfLinks.findOne({ id: itemId }); + if (simpfLink === null) { + return ''; + } + return simpfLink.url; + } +} + +export default new ItemUtil(); \ No newline at end of file diff --git a/src/xoonips/lib/XoonipsListIndex.tsx b/src/xoonips/lib/XoonipsListIndex.tsx new file mode 100644 index 0000000..ecac8d6 --- /dev/null +++ b/src/xoonips/lib/XoonipsListIndex.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { MultiLang } from '../../config'; +import iconFile from '../assets/images/icon_folder.gif'; +import IndexUtil, { Index } from './IndexUtil'; + +interface Props { + lang: MultiLang; + index: Index; +} + +const ListIndexItem = (props: Props) => { + const url = IndexUtil.getUrl(props.index.id); + const numOfIndexes = IndexUtil.countChildren(props.index.id); + return ( + + + + + + + +
+ {props.index.title} + + {props.index.title} +
+ {numOfIndexes} indexes / {props.index.numOfItems} items +
+ ); +} + +const XoonipsListIndex = (props: Props) => { + const { lang } = props; + const children = IndexUtil.getChildren(props.index.id); + if (children.length === 0) { + return null; + } + const treeList = children.map((value: Index, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return ( + + + + + + ); + }); + return ( + + + {treeList} + +
+ ); +} + +export default XoonipsListIndex; diff --git a/src/xoonips/lib/XoonipsListItem.module.css b/src/xoonips/lib/XoonipsListItem.module.css new file mode 100644 index 0000000..a2f6d4f --- /dev/null +++ b/src/xoonips/lib/XoonipsListItem.module.css @@ -0,0 +1,11 @@ +.sortCriteria { + text-align: center; +} + +.pageNavi { + text-align: right; +} + +.pageNaviItem { + margin: 0 5px; +} \ No newline at end of file diff --git a/src/xoonips/lib/XoonipsListItem.tsx b/src/xoonips/lib/XoonipsListItem.tsx new file mode 100644 index 0000000..c6b2718 --- /dev/null +++ b/src/xoonips/lib/XoonipsListItem.tsx @@ -0,0 +1,241 @@ +import React, { ChangeEvent, Component } from 'react'; +import { RouteComponentProps } from 'react-router'; +import { Link, withRouter } from 'react-router-dom'; +import Loading from '../../common/lib/Loading'; +import { MultiLang } from '../../config'; +import Functions from '../../functions'; +import ItemType from '../item-type'; +import { Item, SearchFunc, SearchResult, SortCondition, SortConditionLimit, SortConditionOrderBy, SortConditionOrderDir } from './ItemUtil'; +import styles from './XoonipsListItem.module.css'; + +const SORT_CONDITION_DEFAULT: SortCondition = { + limit: 20, + page: 1, + orderBy: 'title', + orderDir: 1 +}; +const SORT_CONDITION_RANGE_ORDER_BY = ['title', 'doi', 'last_update_date', 'creation_date', 'publication_date']; +const SORT_CONDITION_RANGE_ORDER_DIR = ['0', '1']; +const SORT_CONDITION_RANGE_LIMIT = ['20', '50', '100']; + +interface Props extends RouteComponentProps { + lang: MultiLang; + url: string; + search: SearchFunc +} + +interface State { + loading: boolean; + condition: SortCondition; + result: SearchResult; +} + +class XoonipsListItem extends Component { + + private isActive = false; + + constructor(props: Props) { + super(props); + this.state = { + loading: true, + condition: this.getSortConditionByQuery(this.props.location.search), + result: { total: 0, data: [] } + }; + this.handleSelectOrderby = this.handleSelectOrderby.bind(this); + this.handleSelectItemcount = this.handleSelectItemcount.bind(this); + } + + componentDidMount() { + this.isActive = true; + this.props.search(this.state.condition, (result) => { + if (this.isActive) { + this.setState({ loading: false, result }); + } + }); + } + + componentDidUpdate(prevProps: Props, prevState: State) { + const condition = this.getSortConditionByQuery(this.props.location.search); + if (prevProps.url !== this.props.url || this.isConditionChanged(prevState.condition, condition)) { + this.props.search(condition, (result) => { + if (this.isActive) { + this.setState({ loading: false, result, condition }); + } + }); + } + } + + componentWillUnmount() { + this.isActive = false; + } + + handleSelectOrderby(event: ChangeEvent) { + const value = event.target.value; + const url = this.getListUrl({ orderby: value }); + this.props.history.push(url); + } + + handleSelectItemcount(event: ChangeEvent) { + const value = parseInt(event.target.value, 10); + const url = this.getListUrl({ limit: value }); + this.props.history.push(url); + } + + isConditionChanged(prev: SortCondition, next: SortCondition) { + return prev.limit !== next.limit || prev.orderBy !== next.orderBy || prev.orderDir !== next.orderDir || prev.page !== next.page; + } + + getListUrl(query: { orderby?: string, order_dir?: number, limit?: number, page?: number }) { + const newOrderBy: string = typeof query.orderby !== 'undefined' ? query.orderby : this.state.condition.orderBy; + const newOrderDir: number = typeof query.order_dir !== 'undefined' ? query.order_dir : this.state.condition.orderDir; + const newLimit: number = typeof query.limit !== 'undefined' ? query.limit : this.state.condition.limit; + let newPage: number = typeof query.page !== 'undefined' ? query.page : this.state.condition.page; + if (newLimit !== this.state.condition.limit || newOrderBy !== this.state.condition.orderBy) { + newPage = SORT_CONDITION_DEFAULT.page; + } + const params = new URLSearchParams({ + orderby: newOrderBy, + order_dir: String(newOrderDir), + itemcount: String(newLimit), + page: String(newPage), + }); + const join = this.props.url.indexOf('?') < 0 ? '?' : '&' + return this.props.url + join + params.toString(); + } + + getDefaultSortCondition() { + return Object.assign({}, SORT_CONDITION_DEFAULT); + }; + + getSortConditionByQuery(queryString: string) { + const query = new URLSearchParams(queryString); + const condition = this.getDefaultSortCondition(); + const orderby = query.get('orderby'); + if (orderby !== null && SORT_CONDITION_RANGE_ORDER_BY.includes(orderby)) { + condition.orderBy = orderby as SortConditionOrderBy; + } + const order_dir = query.get('order_dir'); + if (order_dir !== null && SORT_CONDITION_RANGE_ORDER_DIR.includes(order_dir)) { + condition.orderDir = parseInt(order_dir, 10) as SortConditionOrderDir; + } + const itemcount = query.get('itemcount'); + if (itemcount !== null && SORT_CONDITION_RANGE_LIMIT.includes(itemcount)) { + condition.limit = parseInt(itemcount, 10) as SortConditionLimit; + } + const page = query.get('page'); + if (page !== null && page.match(/^\d+$/) !== null) { + condition.page = parseInt(page, 10); + } + return condition; + } + + renderSortCriteria() { + const { lang } = this.props; + let orderDir; + if (this.state.condition.orderDir !== SortConditionOrderDir.ASC) { + const url = this.getListUrl({ order_dir: SortConditionOrderDir.ASC }); + orderDir = ( + ▼ ▲ + ); + } else { + const url = this.getListUrl({ order_dir: SortConditionOrderDir.DESC }); + orderDir = ( + ▼ ▲ + ); + } + return ( +
+ + + + + + + +
+ Order by  + +  {orderDir} + + No.Item per page  + +
+
+ ); + }; + + renderPageNavi(result: SearchResult) { + const maxPage = Math.floor(result.total / this.state.condition.limit) + (result.total % this.state.condition.limit !== 0 ? 1 : 0); + const link = (title: string, page: number, id: string) => { + if (page === 0 || page === this.state.condition.page) { + return ({title}); + } + const url: string = this.getListUrl({ page: page }); + return ({title}); + } + let startPage = (this.state.condition.page - 4) > 1 ? this.state.condition.page - 4 : 1; + const endPage = (startPage + 9) > maxPage ? maxPage : startPage + 9; + if ((endPage - startPage) < 9) { + startPage = (endPage - 9) > 0 ? endPage - 9 : 1; + } + let pageLinks: JSX.Element[] = []; + pageLinks.push(link('PREV', this.state.condition.page - 1, 'p')); + for (let i = startPage; i <= endPage; i++) { + pageLinks.push(link(String(i), i, String(i))); + } + pageLinks.push(link('NEXT', this.state.condition.page >= maxPage ? 0 : this.state.condition.page + 1, 'n')); + return ( +
+ {pageLinks} +
+ ); + } + + render() { + const { lang } = this.props; + if (this.state.loading) { + return ; + } + const result = this.state.result; + if (result.data.length === 0) { + return ( +

No items found.

+ ); + } + const startNum = 1 + this.state.condition.limit * (this.state.condition.page - 1); + let endNum = this.state.condition.limit * this.state.condition.page; + if (endNum > result.total) { + endNum = result.total; + } + const pageNavi = this.renderPageNavi(result); + const items = result.data.map((item: Item, idx) => { + const evenodd = idx % 2 === 0 ? 'even' : 'odd'; + return (); + }); + return ( + <> + {this.renderSortCriteria()} +

{startNum} - {endNum} of {result.total} Items

+ {pageNavi} + + + {items} + +
+ {pageNavi} + + ); + } +} + +export default withRouter(XoonipsListItem); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 7a979e3..54c5aa3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@ant-design/css-animation@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.2.tgz#4ee5d2ec0fb7cc0a78b44e1c82628bd4621ac7e3" + integrity sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw== + "@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" @@ -9,42 +14,65 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.4": - version "7.8.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.5.tgz#d28ce872778c23551cbb9432fc68d28495b613b9" - integrity sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg== +"@babel/compat-data@^7.9.0", "@babel/compat-data@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" + integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== dependencies: - browserslist "^4.8.5" + browserslist "^4.11.1" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@7.8.4", "@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== +"@babel/core@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== +"@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== dependencies: - "@babel/types" "^7.8.3" + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.9.0", "@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== + dependencies: + "@babel/types" "^7.9.6" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -64,53 +92,54 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" + integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== dependencies: - "@babel/types" "^7.8.3" - esutils "^2.0.0" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.5" -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" -"@babel/helper-compilation-targets@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" - integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== +"@babel/helper-compilation-targets@^7.8.7", "@babel/helper-compilation-targets@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" + integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== dependencies: - "@babel/compat-data" "^7.8.4" - browserslist "^4.8.5" + "@babel/compat-data" "^7.9.6" + browserslist "^4.11.1" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" - integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== +"@babel/helper-create-class-features-plugin@^7.8.3", "@babel/helper-create-class-features-plugin@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" + integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== dependencies: - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-replace-supers" "^7.9.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" - integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" + regexpu-core "^4.7.0" "@babel/helper-define-map@^7.8.3": version "7.8.3" @@ -129,14 +158,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.9.5" "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" @@ -166,16 +195,17 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.8.3": @@ -208,15 +238,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" - integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6", "@babel/helper-replace-supers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" + integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== dependencies: "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/helper-simple-access@^7.8.3": version "7.8.3" @@ -233,6 +263,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -243,28 +278,28 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.9.0", "@babel/helpers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" + integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0", "@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -308,7 +343,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -316,7 +351,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@7.8.3": +"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== @@ -324,13 +359,14 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== +"@babel/plugin-proposal-object-rest-spread@^7.9.0", "@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" + integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" @@ -340,20 +376,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.8.8" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-async-generators@^7.8.0": @@ -405,7 +441,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== @@ -478,17 +514,17 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" - integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== +"@babel/plugin-transform-classes@^7.9.0", "@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" @@ -499,14 +535,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== +"@babel/plugin-transform-destructuring@^7.8.3", "@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -529,18 +565,18 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz#da705a655466b2a9b36046b57bf0cbcd53551bd4" - integrity sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA== +"@babel/plugin-transform-flow-strip-types@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" - integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -566,41 +602,41 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-amd@^7.9.0", "@babel/plugin-transform-modules-amd@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" + integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-commonjs@^7.9.0", "@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-modules-systemjs@^7.9.0", "@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" + integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": @@ -625,12 +661,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== +"@babel/plugin-transform-parameters@^7.8.7", "@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== dependencies: - "@babel/helper-call-delegate" "^7.8.3" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -642,11 +677,10 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz#784c25294bddaad2323eb4ff0c9f4a3f6c87d6bc" - integrity sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" + integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": @@ -656,37 +690,47 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== +"@babel/plugin-transform-react-jsx@^7.9.1", "@babel/plugin-transform-react-jsx@^7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" + integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-regenerator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== dependencies: - regenerator-transform "^0.14.0" + regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.8.3": version "7.8.3" @@ -695,10 +739,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-runtime@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169" - integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ== +"@babel/plugin-transform-runtime@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -742,12 +786,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" - integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== +"@babel/plugin-transform-typescript@^7.9.0": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" + integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.9.6" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" @@ -759,27 +803,29 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/preset-env@7.8.4", "@babel/preset-env@^7.4.5": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" - integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== +"@babel/preset-env@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== dependencies: - "@babel/compat-data" "^7.8.4" - "@babel/helper-compilation-targets" "^7.8.4" + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions" "^7.8.3" "@babel/plugin-proposal-dynamic-import" "^7.8.3" "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -788,26 +834,26 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" "@babel/plugin-transform-computed-properties" "^7.8.3" "@babel/plugin-transform-destructuring" "^7.8.3" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.4" + "@babel/plugin-transform-for-of" "^7.9.0" "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.4" + "@babel/plugin-transform-parameters" "^7.8.7" "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" "@babel/plugin-transform-shorthand-properties" "^7.8.3" "@babel/plugin-transform-spread" "^7.8.3" @@ -815,69 +861,175 @@ "@babel/plugin-transform-template-literals" "^7.8.3" "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.3" - browserslist "^4.8.5" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" -"@babel/preset-react@7.8.3", "@babel/preset-react@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== +"@babel/preset-env@^7.4.5": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== + dependencies: + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.1" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" -"@babel/preset-typescript@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" - integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== +"@babel/preset-react@^7.0.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" + integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.4" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" -"@babel/runtime@7.8.4", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.1", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== dependencies: - regenerator-runtime "^0.13.2" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" -"@babel/template@^7.4.0", "@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== +"@babel/runtime-corejs3@^7.7.4", "@babel/runtime-corejs3@^7.8.3": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz#67aded13fffbbc2cb93247388cf84d77a4be9a71" + integrity sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" + integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0", "@babel/traverse@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helper-function-name" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1079,6 +1231,16 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1092,10 +1254,18 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@sheerun/mutationobserver-shim@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" - integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== +"@popperjs/core@^2.0.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.0.tgz#0e1bdf8d021e7ea58affade33d9d607e11365915" + integrity sha512-NMrDy6EWh9TPdSRiHmHH2ye1v5U0gBD7pRYwSwJvomx7Bm4GG04vu63dYiVzebLOx2obPpJugew06xVP0Nk7hA== + +"@restart/hooks@^0.3.12": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652" + integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w== + dependencies: + lodash "^4.17.15" + lodash-es "^4.17.15" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" @@ -1200,51 +1370,54 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" -"@testing-library/dom@^6.11.0": - version "6.12.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.12.2.tgz#5d549acf43f2e0c23b2abfd4e36d65594c3b2741" - integrity sha512-KCnvHra5fV+wDxg3wJObGvZFxq7v1DJt829GNFLuRDjKxVNc/B5AdsylNF5PMHFbWMXDsHwM26d2NZcZO9KjbQ== +"@testing-library/dom@^7.2.2": + version "7.5.7" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.5.7.tgz#c4bf683a65083d4a78644588cfa4ad684c113fc7" + integrity sha512-835MiwAxQE7xjSrhpeJbv41UQRmsPJQ0tGfzWiJMdZj2LBbdG5cT8Z44Viv11/XucCmJHr/v8q7VpZnuSimscg== dependencies: - "@babel/runtime" "^7.6.2" - "@sheerun/mutationobserver-shim" "^0.3.2" - "@types/testing-library__dom" "^6.0.0" - aria-query "3.0.0" - pretty-format "^24.9.0" - wait-for-expect "^3.0.0" + "@babel/runtime" "^7.9.6" + aria-query "^4.0.2" + dom-accessibility-api "^0.4.4" + pretty-format "^25.5.0" -"@testing-library/jest-dom@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" - integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== +"@testing-library/jest-dom@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.7.0.tgz#b2e2acb4c088a293d52ba2cd1674b526282a2f87" + integrity sha512-ZV0OtBXmTDEDxrIbqJXiOcXCZ6aIMpmDlmfHj0hGNsSuQ/nX0qPAs9HWmCzXvPfTrhufTiH2nJLvDJu/LgHzwQ== dependencies: - "@babel/runtime" "^7.5.1" - chalk "^2.4.1" - css "^2.2.3" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.0.2" + chalk "^3.0.0" + css "^2.2.4" css.escape "^1.5.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" + jest-diff "^25.1.0" + jest-matcher-utils "^25.1.0" + lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^9.3.2": - version "9.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.4.0.tgz#b021ac8cb987c8dc54c6841875f745bf9b2e88e5" - integrity sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg== +"@testing-library/react@^10.0.4": + version "10.0.4" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.0.4.tgz#8e0e299cd91acc626d81ed8489fdc13df864c31d" + integrity sha512-2e1B5debfuiIGbvUuiSXybskuh7ZTVJDDvG/IxlzLOY9Co/mKFj9hIklAe2nGZYcOUxFaiqWrRZ9vCVGzJfRlQ== dependencies: - "@babel/runtime" "^7.7.6" - "@testing-library/dom" "^6.11.0" - "@types/testing-library__react" "^9.1.2" + "@babel/runtime" "^7.9.6" + "@testing-library/dom" "^7.2.2" + "@types/testing-library__react" "^10.0.1" -"@testing-library/user-event@^7.1.2": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" - integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== +"@testing-library/user-event@^10.3.1": + version "10.3.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-10.3.1.tgz#8ed6fbfa40fbb866fa4666c9a62d7f7ff151f93b" + integrity sha512-HozvWlr/xHmkoJrrDdZBbUOXAC/STAeXGyNU+g5KgEwWBpLJi1RPCHJKbTjwz8hp2jDFsk/jjfD0530eZjcFEg== + +"@types/async-lock@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-1.1.2.tgz#cbc26a34b11b83b28f7783a843c393b443ef8bef" + integrity sha512-j9n4bb6RhgFIydBe0+kpjnBPYumDaDyU8zvbWykyVMkku+c2CSu31MZkLeaBfqIwU+XCxlDpYDfyMQRkM0AkeQ== "@types/babel__core@^7.1.0": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.4.tgz#5c5569cc40e5f2737dfc00692f5444e871e4a234" - integrity sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg== + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1268,12 +1441,34 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" - integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" + integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== dependencies: "@babel/types" "^7.3.0" +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/cookie@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.3.3.tgz#85bc74ba782fb7aa3a514d11767832b0e3bc6803" + integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== + +"@types/domhandler@*": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/domhandler/-/domhandler-2.4.1.tgz#7b3b347f7762180fbcb1ece1ce3dd0ebbb8c64cf" + integrity sha512-cfBw6q6tT5sa1gSPFSRKzF/xxYrrmeiut7E0TxNBObiLSBTuFEHibcfEe3waQPEDbqBsq+ql/TOniw65EyDFMA== + +"@types/domutils@*": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@types/domutils/-/domutils-1.7.2.tgz#89422e579c165994ad5c09ce90325da596cc105d" + integrity sha512-Nnwy1Ztwq42SSNSZSh9EXBJGrOZPR+PQ2sRT4VZy8hnsFXfCil7YlKO2hd2360HyrtFz2qwnKQ13ENrgXNxJbw== + dependencies: + "@types/domhandler" "*" + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -1293,10 +1488,32 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/history@*": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" + integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== + +"@types/hoist-non-react-statics@^3.0.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/htmlparser2@*": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@types/htmlparser2/-/htmlparser2-3.10.1.tgz#1e65ba81401d53f425c1e2ba5a3d05c90ab742c7" + integrity sha512-fCxmHS4ryCUCfV9+CJZY1UjkbR+6Al/EQdX5Jh03qBj9gdlPG5q+7uNoDgE/ZNXb3XNWSAQgqKIWnbRCbOyyWA== + dependencies: + "@types/domhandler" "*" + "@types/domutils" "*" + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" + integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w== "@types/istanbul-lib-report@*": version "3.0.0" @@ -1306,39 +1523,45 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/jest@^24.0.0": - version "24.9.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" - integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== +"@types/jest@*", "@types/jest@^25.2.3": + version "25.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" + integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== dependencies: - jest-diff "^24.3.0" + jest-diff "^25.2.1" + pretty-format "^25.2.1" "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/lokijs@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/lokijs/-/lokijs-1.5.3.tgz#e45db0b35e53ec09a4c2ff4f253037abd56be151" + integrity sha512-ssiP6F7rpDqlaOzo+0Y/0dkVH2JiAjc+o7n6M4pFnfAMscf+7FthqS0cobvGJEJvxmzp4PWfMOfe0q3VETtrgQ== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*": - version "13.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.1.tgz#238eb34a66431b71d2aaddeaa7db166f25971a0d" - integrity sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA== +"@types/node@*", "@types/node@^14.0.1": + version "14.0.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.1.tgz#5d93e0a099cd0acd5ef3d5bde3c086e1f49ff68c" + integrity sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA== -"@types/node@^12.0.0": - version "12.12.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.28.tgz#3a2b5f8d21f96ace690a8832ae9779114612575f" - integrity sha512-g73GJYJDXgf0jqg+P9S8h2acWbDXNkoCX8DLtJVu7Fkn788pzQ/oJsrdJz/2JejRf/SjfZaAhsw+3nd1D5EWGg== +"@types/object-assign@^4.0.30": + version "4.0.30" + resolved "https://registry.yarnpkg.com/@types/object-assign/-/object-assign-4.0.30.tgz#8949371d5a99f4381ee0f1df0a9b7a187e07e652" + integrity sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI= "@types/parse-json@^4.0.0": version "4.0.0" @@ -1351,21 +1574,76 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== -"@types/react-dom@*", "@types/react-dom@^16.9.0": - version "16.9.5" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7" - integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg== +"@types/react-dom@*", "@types/react-dom@^16.9.8": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.0": - version "16.9.21" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.21.tgz#99e274e2ecfab6bb93920e918341daa3198b348d" - integrity sha512-xpmenCMeBwJRct8vmIfczlgdOXWIWASoOM857kxKfHlVQvDltRh7IFRVfGws79iO2jkNPXOeWREyKoClzhBaQA== +"@types/react-helmet@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-6.0.0.tgz#5b74e44a12662ffb12d1c97ee702cf4e220958cf" + integrity sha512-NBMPAxgjpaMooXa51cU1BTgrX6T+hQbMiLm77JhBbfOzPQea3RB5rNpPOD5xGWHIVpGXHd59cltEzIq0qglGcQ== + dependencies: + "@types/react" "*" + +"@types/react-html-parser@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/react-html-parser/-/react-html-parser-2.0.1.tgz#2d9002ac5bf1adf9aff8eae77ace5488bd78c98d" + integrity sha512-Lyw0AtG3gahw78CX2pzmzhKaoZCfJNzzuhhPsFVhzFrylMv8NaCmzYaPKglMv3RRHpwBbHuMOkVx0HiwGZKgSA== + dependencies: + "@types/htmlparser2" "*" + "@types/react" "*" + +"@types/react-overlays@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/react-overlays/-/react-overlays-1.1.3.tgz#fb97081cbf506917e358f0523b34fed14e2de2f7" + integrity sha512-oOq5NWbyfNz2w2sKvjkHdvGQSMA+VDVfI5UOfGPR0wkik2welad1RDVnVgH15jKf58jrZNBa1Ee4SVBgCGFxCg== + dependencies: + "@types/react" "*" + "@types/react-transition-group" "*" + +"@types/react-router-dom@*", "@types/react-router-dom@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090" + integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw== + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router-hash-link@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/react-router-hash-link/-/react-router-hash-link-1.2.1.tgz#fba7dc351cef2985791023018b7a5dbd0653c843" + integrity sha512-jdzPGE8jFGq7fHUpPaKrJvLW1Yhoe5MQCrmgeesC+eSLseMj3cGCTYMDA4BNWG8JQmwO8NTYt/oT3uBZ77pmBA== + dependencies: + "@types/react" "*" + "@types/react-router-dom" "*" + +"@types/react-router@*": + version "5.1.7" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.7.tgz#e9d12ed7dcfc79187e4d36667745b69a5aa11556" + integrity sha512-2ouP76VQafKjtuc0ShpwUebhHwJo0G6rhahW9Pb8au3tQTjYXd2jta4wv6U2tGLR/I42yuG00+UXjNYY0dTzbg== + dependencies: + "@types/history" "*" + "@types/react" "*" + +"@types/react-transition-group@*": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.2.4.tgz#c7416225987ccdb719262766c1483da8f826838d" + integrity sha512-8DMUaDqh0S70TjkqU0DxOu80tFUiiaS9rxkWip/nb7gtvAsbqOXm02UCmR8zdcjWujgeYPiPNTVpVpKzUDotwA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.11", "@types/react@^16.9.35": + version "16.9.35" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" + integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -1375,20 +1653,38 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0": - version "6.12.1" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.12.1.tgz#37af28fae051f9e3feed5684535b1540c97ae28b" - integrity sha512-cgqnEjxKk31tQt29j4baSWaZPNjQf3bHalj2gcHQTpW5SuHRal76gOpF0vypeEo6o+sS5inOvvNdzLY0B3FB2A== +"@types/testing-library__dom@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.0.2.tgz#2906f8a0dce58b0746c6ab606f786bd06fe6940e" + integrity sha512-8yu1gSwUEAwzg2OlPNbGq+ixhmSviGurBu1+ivxRKq1eRcwdjkmlwtPvr9VhuxTq2fNHBWN2po6Iem3Xt5A6rg== dependencies: - pretty-format "^24.3.0" + pretty-format "^25.1.0" -"@types/testing-library__react@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351" - integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q== +"@types/testing-library__jest-dom@^5.0.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.7.0.tgz#078790bf4dc89152a74428591a228ec5f9433251" + integrity sha512-LoZ3uonlnAbJUz4bg6UoeFl+frfndXngmkCItSjJ8DD5WlRfVqPC5/LgJASsY/dy7AHH2YJ7PcsdASOydcVeFA== + dependencies: + "@types/jest" "*" + +"@types/testing-library__react@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-10.0.1.tgz#92bb4a02394bf44428e35f1da2970ed77f803593" + integrity sha512-RbDwmActAckbujLZeVO/daSfdL1pnjVqas25UueOkAY5r7vriavWf0Zqg7ghXMHa8ycD/kLkv8QOj31LmSYwww== dependencies: "@types/react-dom" "*" "@types/testing-library__dom" "*" + pretty-format "^25.1.0" + +"@types/warning@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= + +"@types/xregexp@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/xregexp/-/xregexp-4.3.0.tgz#e981c9b7281579019cc5740e08d206f3403e029f" + integrity sha512-3gJTS9gt27pS7U9q5IVqo4YvKSlkf2ck8ish6etuDj6LIRxkL/2Y8RMUtK/QzvE1Yv2zwWV5yemI2BS0GGGFnA== "@types/yargs-parser@*": version "15.0.0" @@ -1396,53 +1692,60 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" - integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.10.0": - version "2.19.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.19.2.tgz#e279aaae5d5c1f2547b4cff99204e1250bc7a058" - integrity sha512-HX2qOq2GOV04HNrmKnTpSIpHjfl7iwdXe3u/Nvt+/cpmdvzYvY0NHSiTkYN257jHnq4OM/yo+OsFgati+7LqJA== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: - "@typescript-eslint/experimental-utils" "2.19.2" - eslint-utils "^1.4.3" + "@typescript-eslint/experimental-utils" "2.34.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.19.2": - version "2.19.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.2.tgz#4611d44cf0f0cb460c26aa7676fc0a787281e233" - integrity sha512-B88QuwT1wMJR750YvTJBNjMZwmiPpbmKYLm1yI7PCc3x0NariqPwqaPsoJRwU9DmUi0cd9dkhz1IqEnwfD+P1A== +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.19.2" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.10.0": - version "2.19.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.19.2.tgz#21f42c0694846367e7d6a907feb08ab2f89c0879" - integrity sha512-8uwnYGKqX9wWHGPGdLB9sk9+12sjcdqEEYKGgbS8A0IvYX59h01o8os5qXUHMq2na8vpDRaV0suTLM7S8wraTA== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.19.2" - "@typescript-eslint/typescript-estree" "2.19.2" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.19.2": - version "2.19.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.2.tgz#67485b00172f400474d243c6c0be27581a579350" - integrity sha512-Xu/qa0MDk6upQWqE4Qy2X16Xg8Vi32tQS2PR0AvnT/ZYS4YGDvtn2MStOh5y8Zy2mg4NuL06KUHlvCh95j9C6Q== +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" "@webassemblyjs/ast@1.8.5": @@ -1622,10 +1925,10 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== acorn-walk@^6.0.1: version "6.2.0" @@ -1633,19 +1936,26 @@ acorn-walk@^6.0.1: integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== + +add-dom-event-listener@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" + integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== + dependencies: + object-assign "4.x" address@1.1.2, address@^1.0.1: version "1.1.2" @@ -1681,10 +1991,10 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" - integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -1707,11 +2017,11 @@ ansi-escapes@^3.0.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.8.1" + type-fest "^0.11.0" ansi-html@0.0.7: version "0.0.7" @@ -1750,6 +2060,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1778,7 +2096,7 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@3.0.0, aria-query@^3.0.0: +aria-query@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= @@ -1786,6 +2104,14 @@ aria-query@3.0.0, aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +aria-query@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.0.2.tgz#250687b4ccde1ab86d127da0432ae3552fc7b145" + integrity sha512-S1G1V790fTaigUSM/Gd0NngzEfiMy9uTUfMyHhKhVyy4cH5O/eTuR01ydhGL0z4Za1PXFTRGH3qL8VhUQuEO5w== + dependencies: + "@babel/runtime" "^7.7.4" + "@babel/runtime-corejs3" "^7.7.4" + arity-n@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" @@ -1926,6 +2252,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-lock@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.2.4.tgz#80d0d612383045dd0c30eb5aad08510c1397cb91" + integrity sha512-UBQJC2pbeyGutIfYmErGc9RaJYnpZ1FHaxuKwb0ahvGiiCkPUf3p67Io+YLPmmv3RHY+mF6JEtNW8FlHsraAaA== + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -1944,17 +2275,17 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.8.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" + integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001061" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.30" + postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: version "0.7.0" @@ -1966,6 +2297,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + axobject-query@^2.0.2: version "2.1.2" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" @@ -1980,15 +2318,15 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-eslint@10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" - integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== +babel-eslint@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" eslint-visitor-keys "^1.0.0" resolve "^1.12.0" @@ -2012,20 +2350,21 @@ babel-jest@^24.9.0: chalk "^2.4.2" slash "^2.0.0" -babel-loader@8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" pify "^4.0.1" + schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -2086,22 +2425,24 @@ babel-preset-jest@^24.9.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.9.0" -babel-preset-react-app@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.1.tgz#d1ceb47cbe48b285fdd5c562c54c432ed5a41e0e" - integrity sha512-YkWP2UwY//TLltNlEBRngDOrYhvSLb+CA330G7T9M5UhGEMWe+JK/8IXJc5p2fDTSfSiETf+PY0+PYXFMix81Q== +babel-preset-react-app@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA== dependencies: - "@babel/core" "7.8.4" + "@babel/core" "7.9.0" "@babel/plugin-proposal-class-properties" "7.8.3" "@babel/plugin-proposal-decorators" "7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" "@babel/plugin-proposal-numeric-separator" "7.8.3" - "@babel/plugin-transform-flow-strip-types" "7.8.3" + "@babel/plugin-proposal-optional-chaining" "7.9.0" + "@babel/plugin-transform-flow-strip-types" "7.9.0" "@babel/plugin-transform-react-display-name" "7.8.3" - "@babel/plugin-transform-runtime" "7.8.3" - "@babel/preset-env" "7.8.4" - "@babel/preset-react" "7.8.3" - "@babel/preset-typescript" "7.8.3" - "@babel/runtime" "7.8.4" + "@babel/plugin-transform-runtime" "7.9.0" + "@babel/preset-env" "7.9.0" + "@babel/preset-react" "7.9.1" + "@babel/preset-typescript" "7.9.0" + "@babel/runtime" "7.9.0" babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" @@ -2180,11 +2521,16 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" + integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== + body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -2254,10 +2600,10 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -2297,7 +2643,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -2306,17 +2652,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -2325,23 +2673,25 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@4.8.6: - version "4.8.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" - integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== +browserslist@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== dependencies: - caniuse-lite "^1.0.30001023" - electron-to-chromium "^1.3.341" - node-releases "^1.1.47" + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" -browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.8.5: - version "4.8.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.7.tgz#ec8301ff415e6a42c949d0e66b405eb539c532d0" - integrity sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA== +browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== dependencies: - caniuse-lite "^1.0.30001027" - electron-to-chromium "^1.3.349" - node-releases "^1.1.49" + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" + node-releases "^1.1.53" + pkg-up "^2.0.0" bser@2.1.1: version "2.1.1" @@ -2390,9 +2740,9 @@ bytes@3.1.0: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -2478,13 +2828,13 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" + pascal-case "^3.1.1" + tslib "^1.10.0" camelcase@5.0.0: version "5.0.0" @@ -2506,10 +2856,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001023, caniuse-lite@^1.0.30001027: - version "1.0.30001027" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001027.tgz#283e2ef17d94889cc216a22c6f85303d78ca852d" - integrity sha512-7xvKeErvXZFtUItTHgNtLgS9RJpVnwBlWX8jSo/BO8VsF6deszemZSkJJJA1KOKrXuzZH4WALpAJdq5EyfgMLg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061: + version "1.0.30001062" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001062.tgz#d814b648338504b315222ace6f1a533d9a55e390" + integrity sha512-ei9ZqeOnN7edDrb24QfJ0OZicpEbsWxv7WusOiQGz/f2SfvBgHHbOEwBJ8HKGVSyx8Z6ndPjxzR6m0NQq+0bfw== capture-exit@^2.0.0: version "2.0.0" @@ -2548,12 +2898,20 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2572,10 +2930,10 @@ chokidar@^2.0.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@^3.3.0, chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2583,7 +2941,7 @@ chokidar@^3.3.0: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -2622,7 +2980,12 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@^4.2.1: +classnames@2.x, classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== @@ -2642,9 +3005,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== cliui@^4.0.0: version "4.1.0" @@ -2718,12 +3081,19 @@ color-convert@^1.9.0, color-convert@^1.9.1: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -2756,7 +3126,7 @@ commander@^2.11.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.0: +commander@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -2877,6 +3247,11 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -2895,22 +3270,27 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.8.3" + browserslist "^4.8.5" semver "7.0.0" +core-js-pure@^3.0.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== + core-js@^2.4.0: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-js@^3.5.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2946,7 +3326,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -2957,7 +3337,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -3092,10 +3472,13 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-unit-converter@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" - integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" css-what@2.1: version "2.1.3" @@ -3112,7 +3495,7 @@ css.escape@^1.5.1: resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -css@^2.0.0, css@^2.2.3: +css@^2.0.0, css@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== @@ -3206,11 +3589,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== dependencies: - css-tree "1.0.0-alpha.37" + css-tree "1.0.0-alpha.39" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -3224,10 +3607,10 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" -csstype@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== +csstype@^2.2.0, csstype@^2.6.7: + version "2.6.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" + integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== cyclist@^1.0.1: version "1.0.1" @@ -3270,6 +3653,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3407,6 +3797,11 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -3466,6 +3861,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.4.4.tgz#c2f9fb8b591bc19581e7ef3e6fe35baf1967c498" + integrity sha512-XBM62jdDc06IXSujkqw6BugEWiDkp6jphtzVJf1kgPQGvfzaU7/jRtRSF/mxc8DBCIm2LS3bN1dCa5Sfxx982A== + dom-converter@^0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -3473,6 +3873,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.1.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -3526,6 +3934,14 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + dot-prop@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" @@ -3571,12 +3987,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.341, electron-to-chromium@^1.3.349: - version "1.3.349" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.349.tgz#663f26a69d348a462df47b4d7ab162a2f29bbcb7" - integrity sha512-uEb2zs6EJ6OZIqaMsCSliYVgzE/f7/s1fLWqtvRtHg/v5KBF2xds974fUnyatfxIDgkqzQVwFtam5KExqywx0Q== +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.413: + version "1.3.443" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.443.tgz#b01c8933e820a728afc5dde7dd535c53ff55ab11" + integrity sha512-ty0LEroTap/xfMy31oQ3XX+Q377QvWvJaha2cmuXcbmBiX2EIB5SNDQ0hp8lhvxj63WG0zOgm/4MQ/oUBdfQqg== -elliptic@^6.0.0: +elliptic@^6.0.0, elliptic@^6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== @@ -3604,6 +4020,11 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3631,9 +4052,9 @@ entities@^1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" + integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -3649,10 +4070,10 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" @@ -3728,10 +4149,10 @@ escodegen@^1.11.0, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-react-app@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz#135110ba56a9e378f7acfe5f36e2ae76a2317899" - integrity sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw== +eslint-config-react-app@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== dependencies: confusing-browser-globals "^1.0.9" @@ -3755,9 +4176,9 @@ eslint-loader@3.0.3: schema-utils "^2.6.1" eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" @@ -3769,10 +4190,10 @@ eslint-plugin-flowtype@4.6.0: dependencies: lodash "^4.17.15" -eslint-plugin-import@2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz#d749a7263fb6c29980def8e960d380a6aa6aecaa" - integrity sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ== +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" @@ -3807,10 +4228,10 @@ eslint-plugin-react-hooks@^1.6.1: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== -eslint-plugin-react@7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz#2317831284d005b30aff8afb7c4e906f13fa8e7e" - integrity sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ== +eslint-plugin-react@7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== dependencies: array-includes "^3.1.1" doctrine "^2.1.0" @@ -3820,7 +4241,10 @@ eslint-plugin-react@7.18.0: object.fromentries "^2.0.2" object.values "^1.1.1" prop-types "^15.7.2" - resolve "^1.14.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" eslint-scope@^4.0.3: version "4.0.3" @@ -3845,6 +4269,13 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" + integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" @@ -3894,12 +4325,12 @@ eslint@^6.6.0: v8-compile-cache "^2.0.3" espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0, esprima@^4.0.1: @@ -3908,11 +4339,11 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -3921,12 +4352,17 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.0, esutils@^2.0.2: +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + +esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -3937,9 +4373,9 @@ etag@~1.8.1: integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== events@^3.0.0: version "3.1.0" @@ -3979,6 +4415,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -4154,14 +4595,14 @@ fb-watchman@^2.0.0: bser "2.1.1" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -4229,7 +4670,7 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" -find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: +find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== @@ -4239,12 +4680,12 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: pkg-dir "^3.0.0" find-cache-dir@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" - integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== dependencies: commondir "^1.0.1" - make-dir "^3.0.0" + make-dir "^3.0.2" pkg-dir "^4.1.0" find-up@4.1.0, find-up@^4.0.0: @@ -4287,9 +4728,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatten@^1.0.2: version "1.0.3" @@ -4304,10 +4745,17 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== dependencies: debug "^3.0.0" @@ -4430,19 +4878,24 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@2.1.2, fsevents@~2.1.2: +fsevents@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4501,9 +4954,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -4546,9 +4999,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" @@ -4577,9 +5030,9 @@ globby@^6.1.0: pinkie-promise "^2.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== growly@^1.3.0: version "1.3.0" @@ -4595,9 +5048,9 @@ gzip-size@5.1.1: pify "^4.0.1" handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" @@ -4678,12 +5131,13 @@ has@^1.0.0, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -4703,6 +5157,18 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -4712,10 +5178,17 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hpack.js@^2.1.6: version "2.1.6" @@ -4750,27 +5223,27 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.3.tgz#b33549b57be7f0357be0d0b892995aaed1ed90f8" - integrity sha512-It4No3H1V3Dhd/O0MePFdo0oX/M6u6YZTMw4My/010mT6vxdbqge7+0RoxGAmeSbKok6gjYZoP0p4rpZ2+J2yw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: - camel-case "^3.0.0" - clean-css "^4.2.1" - commander "^4.0.0" + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" he "^1.2.0" - param-case "^2.1.1" + param-case "^3.0.3" relateurl "^0.2.7" - terser "^4.3.9" + terser "^4.6.3" html-webpack-plugin@4.0.0-beta.11: version "4.0.0-beta.11" @@ -4784,7 +5257,7 @@ html-webpack-plugin@4.0.0-beta.11: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.3.0: +htmlparser2@^3.3.0, htmlparser2@^3.9.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -4849,9 +5322,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -4983,7 +5456,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5003,7 +5476,7 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@7.0.4, inquirer@^7.0.0: +inquirer@7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== @@ -5022,6 +5495,25 @@ inquirer@7.0.4, inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -5030,6 +5522,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -5052,12 +5553,7 @@ ip@^1.1.0, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== - -ipaddr.js@^1.9.0: +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== @@ -5297,11 +5793,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - is-regex@^1.0.4, is-regex@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" @@ -5364,9 +5855,16 @@ is-wsl@^1.1.0: integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" @@ -5491,7 +5989,7 @@ jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: +jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -5501,6 +5999,16 @@ jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" +jest-diff@^25.1.0, jest-diff@^25.2.1, jest-diff@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + jest-docblock@^24.3.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" @@ -5559,6 +6067,11 @@ jest-get-type@^24.9.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + jest-haste-map@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" @@ -5608,7 +6121,7 @@ jest-leak-detector@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" -jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: +jest-matcher-utils@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== @@ -5618,6 +6131,16 @@ jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" +jest-matcher-utils@^25.1.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" + integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== + dependencies: + chalk "^3.0.0" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + jest-message-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" @@ -5812,9 +6335,9 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: supports-color "^6.1.0" jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -5968,12 +6491,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonfile@^4.0.0: version "4.0.0" @@ -6122,19 +6645,19 @@ load-json-file@^4.0.0: strip-bom "^3.0.0" loader-fs-cache@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" - integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== dependencies: find-cache-dir "^0.1.1" - mkdirp "0.5.1" + mkdirp "^0.5.1" loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -6143,6 +6666,15 @@ loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2. emojis-list "^2.0.0" json5 "^1.0.1" +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -6166,6 +6698,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -6207,21 +6744,28 @@ lodash.uniq@^4.5.0: integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +lokijs@^1.5.8: + version "1.5.8" + resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.8.tgz#9296f288edb2147389ec692fc972c428c59179d1" + integrity sha512-D8E3TBrY35o1ELnonp2MF8b3wKu2tVNl2TqRjvS+95oPMMe7OoIAxNY1qr+5BEZwnWn2V4ErAjVt000DonM+FA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" lru-cache@^5.1.1: version "5.1.1" @@ -6238,10 +6782,10 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -6290,6 +6834,11 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -6381,17 +6930,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.43.0" + mime-db "1.44.0" mime@1.6.0: version "1.6.0" @@ -6399,9 +6948,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.5" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009" + integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w== mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" @@ -6413,6 +6962,14 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + dependencies: + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" + mini-css-extract-plugin@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" @@ -6440,15 +6997,10 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== minipass-collect@^1.0.2: version "1.0.2" @@ -6465,16 +7017,16 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" + integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" @@ -6510,12 +7062,17 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" + +moment@2.25.3: + version "2.25.3" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.3.tgz#252ff41319cf41e47761a1a88cab30edfe9808c0" + integrity sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg== move-concurrently@^1.0.1: version "1.0.1" @@ -6563,9 +7120,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -6609,12 +7166,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== dependencies: - lower-case "^1.1.1" + lower-case "^2.0.1" + tslib "^1.10.0" node-forge@0.9.0: version "0.9.0" @@ -6671,12 +7229,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.47, node-releases@^1.1.49: - version "1.1.49" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.49.tgz#67ba5a3fac2319262675ef864ed56798bb33b93e" - integrity sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg== - dependencies: - semver "^6.3.0" +node-releases@^1.1.52, node-releases@^1.1.53: + version "1.1.55" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee" + integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w== normalize-package-data@^2.3.2: version "2.5.0" @@ -6754,7 +7310,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -6769,9 +7325,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-hash@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.2.tgz#f7b2212dbe07d07e340ccd6004c59504fc4015cf" - integrity sha512-b+2AKjAf6uQlxxv8ChHdM+VT4eeX+ZSwv+pk2xIXZWbo+yxn4/En1iC+GHe/OFYa9on0AhFF2PvuAcFHoiiHaA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== object-inspect@^1.7.0: version "1.7.0" @@ -6779,9 +7335,12 @@ object-inspect@^1.7.0: integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -6887,9 +7446,9 @@ onetime@^5.1.0: mimic-fn "^2.1.0" open@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.2.tgz#fb3681f11f157f2361d2392307548ca1792960e8" - integrity sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ== + version "7.0.4" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" + integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -6977,9 +7536,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -7052,12 +7611,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -param-case@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== dependencies: - no-case "^2.2.0" + dot-case "^3.0.3" + tslib "^1.10.0" parent-module@^1.0.0: version "1.0.1" @@ -7066,7 +7626,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== @@ -7118,6 +7678,14 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -7180,6 +7748,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -7215,10 +7790,10 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: version "2.3.0" @@ -7282,29 +7857,36 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== -pnp-webpack-plugin@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz#d5c068013a2fdc82224ca50ed179c8fba9036a8e" - integrity sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ== +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== dependencies: - ts-pnp "^1.1.2" + ts-pnp "^1.1.6" portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== dependencies: async "^2.6.2" debug "^3.1.1" @@ -7331,14 +7913,13 @@ postcss-browser-comments@^3.0.0: postcss "^7" postcss-calc@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== dependencies: - css-unit-converter "^1.1.1" - postcss "^7.0.5" - postcss-selector-parser "^5.0.0-rc.4" - postcss-value-parser "^3.3.1" + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" postcss-color-functional-notation@^2.0.1: version "2.0.1" @@ -7648,9 +8229,9 @@ postcss-modules-local-by-default@^3.0.2: postcss-value-parser "^4.0.0" postcss-modules-scope@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" - integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" postcss-selector-parser "^6.0.0" @@ -7940,15 +8521,15 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: +postcss-value-parser@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" - integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -7968,10 +8549,10 @@ postcss@7.0.21: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.30" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2" + integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -8000,7 +8581,7 @@ pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: +pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -8010,7 +8591,17 @@ pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -private@^0.1.6: +pretty-format@^25.1.0, pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -8036,21 +8627,21 @@ promise-inflight@^1.0.1: integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.3.tgz#f592e099c6cddc000d538ee7283bb190452b0bf6" - integrity sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: asap "~2.0.6" prompts@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" - integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" - sisteransi "^1.0.3" + sisteransi "^1.0.4" -prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -8060,12 +8651,12 @@ prop-types@^15.6.2, prop-types@^15.7.2: react-is "^16.8.1" proxy-addr@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== dependencies: forwarded "~0.1.2" - ipaddr.js "1.9.0" + ipaddr.js "1.9.1" prr@~1.0.1: version "1.0.1" @@ -8073,9 +8664,9 @@ prr@~1.0.1: integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -8167,7 +8758,7 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -raf@^3.4.1: +raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== @@ -8204,6 +8795,46 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +rc-animate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.0.0.tgz#f76d7051136b7d650fb3d29366a160e95a369c0a" + integrity sha512-+ANeyCei4lWSJHWTcocywdYAy6lpRdBva/7Fs3nBBiAngW/W+Gmx+gQEcsmcgQBqziWUYnR91Bk12ltR3GBHPA== + dependencies: + "@ant-design/css-animation" "^1.7.2" + classnames "^2.2.6" + raf "^3.4.0" + rc-util "^4.15.3" + +rc-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.2.2.tgz#9822c4929570156a2170037a4faeb010cae10702" + integrity sha512-eF4vJJpMnTmPufxplZ2xg+P3ogfFoUfZkZXV2qasC6JSTf+13jB7pA1xXjCwJ86V+7PqEGUsE/mljLusng0XEA== + dependencies: + classnames "2.x" + rc-animate "^3.0.0" + rc-util "^4.11.0" + rc-virtual-list "^1.1.0" + +rc-util@^4.11.0, rc-util@^4.15.3, rc-util@^4.8.0: + version "4.20.5" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.20.5.tgz#f7c77569e971ae6a8ad56f899cadd22275398325" + integrity sha512-f67s4Dt1quBYhrVPq5QMKmK3eS2hN1NNIAyhaiG0HmvqiGYAXMQ7SP2AlGqv750vnzhJs38JklbkWT1/wjhFPg== + dependencies: + add-dom-event-listener "^1.1.0" + prop-types "^15.5.10" + react-is "^16.12.0" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.1.0" + +rc-virtual-list@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-1.1.3.tgz#4b59d1f727f3ba2dc4ccea21f3e92a5e023c11a0" + integrity sha512-2D7GPdvta05NQZ5fHSK3BFst28G0wFgvNX/xAhGXVC8YOheZPFAn5Yqpe7jXFepBb7Y+1cwOx12LYAL8VkULBw== + dependencies: + classnames "^2.2.6" + raf "^3.4.1" + rc-util "^4.8.0" + react-app-polyfill@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" @@ -8216,14 +8847,23 @@ react-app-polyfill@^1.0.6: regenerator-runtime "^0.13.3" whatwg-fetch "^3.0.0" -react-dev-utils@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.0.tgz#b11cc48aa2be2502fb3c27a50d1dfa95cfa9dfe0" - integrity sha512-MwrvQW2TFjLblhqpDNeqCXHBkz3G5vc7k4wntgutAJZX4ia3o07eGKo6uYGhUOeJ0hfOxcpJFNFk7+4XCc1S8g== +react-cookie@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-cookie/-/react-cookie-4.0.3.tgz#ba8e5ea0047c916516e1181a3ad394c9b7580b56" + integrity sha512-cmi6IpdVgTSvjqssqIEvo779Gfqc4uPGHRrKMEdHcqkmGtPmxolGfsyKj95bhdLEKqMdbX8MLBCwezlnhkHK0g== + dependencies: + "@types/hoist-non-react-statics" "^3.0.1" + hoist-non-react-statics "^3.0.0" + universal-cookie "^4.0.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== dependencies: "@babel/code-frame" "7.8.3" address "1.1.2" - browserslist "4.8.6" + browserslist "4.10.0" chalk "2.4.2" cross-spawn "7.0.1" detect-port-alt "1.1.6" @@ -8240,58 +8880,158 @@ react-dev-utils@^10.2.0: loader-utils "1.2.3" open "^7.0.2" pkg-up "3.1.0" - react-error-overlay "^6.0.6" + react-error-overlay "^6.0.7" recursive-readdir "2.2.2" shell-quote "1.7.2" strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.18.0" + scheduler "^0.19.1" -react-error-overlay@^6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.6.tgz#ac4d9dc4c1b5c536c2c312bf66aa2b09bfa384e2" - integrity sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw== +react-error-overlay@^6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" + integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-is@^16.8.1, react-is@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== +react-fast-compare@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react-scripts@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.0.tgz#f413680f0b5b937c8879ba1ffdae9b8c5b364bf5" - integrity sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg== +react-ga@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.7.0.tgz#24328f157f31e8cffbf4de74a3396536679d8d7c" + integrity sha512-AjC7UOZMvygrWTc2hKxTDvlMXEtbmA0IgJjmkhgmQQ3RkXrWR11xEagLGFGaNyaPnmg24oaIiaNPnEoftUhfXA== + +react-helmet@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.0.0.tgz#fcb93ebaca3ba562a686eb2f1f9d46093d83b5f8" + integrity sha512-My6S4sa0uHN/IuVUn0HFmasW5xj9clTkB9qmMngscVycQ5vVG51Qp44BEvLJ4lixupTwDlU9qX1/sCrMN4AEPg== dependencies: - "@babel/core" "7.8.4" + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^2.0.4" + react-side-effect "^2.1.0" + +react-html-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/react-html-parser/-/react-html-parser-2.0.2.tgz#6dbe1ddd2cebc1b34ca15215158021db5fc5685e" + integrity sha512-XeerLwCVjTs3njZcgCOeDUqLgNIt/t+6Jgi5/qPsO/krUWl76kWKXMeVs2LhY2gwM6X378DkhLjur0zUQdpz0g== + dependencies: + htmlparser2 "^3.9.0" + +react-image-lightbox@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-image-lightbox/-/react-image-lightbox-5.1.1.tgz#872d1a4336b5a6410ea7909b767cf59014081004" + integrity sha512-GprldD8AqpRb2hsOdns3sI7Xeo9hJlcybDxuli4RB+ml1J/GaFaUuRkT/7IrTLv2+4vkR74ahz2LD0HOUHI7wA== + dependencies: + prop-types "^15.6.2" + react-modal "^3.8.1" + +react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-modal@^3.8.1: + version "3.11.2" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.11.2.tgz#bad911976d4add31aa30dba8a41d11e21c4ac8a4" + integrity sha512-o8gvvCOFaG1T7W6JUvsYjRjMVToLZgLIsi5kdhFIQCtHxDkA47LznX62j+l6YQkpXDbvQegsDyxe/+JJsFQN7w== + dependencies: + exenv "^1.2.0" + prop-types "^15.5.10" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + +react-overlays@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-3.2.0.tgz#ed8335adb0871e701b0fc8396c44dfd2467e7a55" + integrity sha512-YTgCmw6l4uBOYylSnc3V8WLX+A0EoGnzDrqkYz0K7MUKbMBZFpaxLXH4EF9eZbspd+syZHQ5XAABI7n/zak1EA== + dependencies: + "@babel/runtime" "^7.4.5" + "@popperjs/core" "^2.0.0" + "@restart/hooks" "^0.3.12" + "@types/warning" "^3.0.0" + dom-helpers "^5.1.0" + prop-types "^15.7.2" + uncontrollable "^7.0.0" + warning "^4.0.3" + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router-hash-link@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-router-hash-link/-/react-router-hash-link-1.2.2.tgz#7a0ad5e925d49596d19554de8bc6c554ce4f8099" + integrity sha512-LBthLVHdqPeKDVt3+cFRhy15Z7veikOvdKRZRfyBR2vjqIE7rxn+tKLjb6DOmLm6JpoQVemVDnxQ35RVnEHdQA== + dependencies: + prop-types "^15.6.0" + +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" + integrity sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ== + dependencies: + "@babel/core" "7.9.0" "@svgr/webpack" "4.3.3" "@typescript-eslint/eslint-plugin" "^2.10.0" "@typescript-eslint/parser" "^2.10.0" - babel-eslint "10.0.3" + babel-eslint "10.1.0" babel-jest "^24.9.0" - babel-loader "8.0.6" + babel-loader "8.1.0" babel-plugin-named-asset-import "^0.3.6" - babel-preset-react-app "^9.1.1" + babel-preset-react-app "^9.1.2" camelcase "^5.3.1" case-sensitive-paths-webpack-plugin "2.3.0" css-loader "3.4.2" dotenv "8.2.0" dotenv-expand "5.1.0" eslint "^6.6.0" - eslint-config-react-app "^5.2.0" + eslint-config-react-app "^5.2.1" eslint-loader "3.0.3" eslint-plugin-flowtype "4.6.0" - eslint-plugin-import "2.20.0" + eslint-plugin-import "2.20.1" eslint-plugin-jsx-a11y "6.2.3" - eslint-plugin-react "7.18.0" + eslint-plugin-react "7.19.0" eslint-plugin-react-hooks "^1.6.1" file-loader "4.3.0" fs-extra "^8.1.0" @@ -8303,33 +9043,43 @@ react-scripts@3.4.0: jest-watch-typeahead "0.4.2" mini-css-extract-plugin "0.9.0" optimize-css-assets-webpack-plugin "5.0.3" - pnp-webpack-plugin "1.6.0" + pnp-webpack-plugin "1.6.4" postcss-flexbugs-fixes "4.1.0" postcss-loader "3.0.0" postcss-normalize "8.0.1" postcss-preset-env "6.7.0" postcss-safe-parser "4.0.1" react-app-polyfill "^1.0.6" - react-dev-utils "^10.2.0" + react-dev-utils "^10.2.1" resolve "1.15.0" resolve-url-loader "3.1.1" sass-loader "8.0.2" semver "6.3.0" style-loader "0.23.1" - terser-webpack-plugin "2.3.4" - ts-pnp "1.1.5" + terser-webpack-plugin "2.3.5" + ts-pnp "1.1.6" url-loader "2.3.0" - webpack "4.41.5" - webpack-dev-server "3.10.2" + webpack "4.42.0" + webpack-dev-server "3.10.3" webpack-manifest-plugin "2.2.0" workbox-webpack-plugin "4.3.1" optionalDependencies: fsevents "2.1.2" -react@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== +react-side-effect@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.0.tgz#1ce4a8b4445168c487ed24dab886421f74d380d3" + integrity sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg== + +react-spinner-material@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-spinner-material/-/react-spinner-material-1.3.1.tgz#31395f07547929c459c3964c5027fc79b883fcd4" + integrity sha512-UiCp5eRpRnhleE7ng1Pq4vqNKxbof+kG842JGekoSE0w+vUe7AbXTK1nebRaAloe3Lm0cRbLW621LKEAJMVT/Q== + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -8382,7 +9132,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8400,12 +9150,12 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" realpath-native@^1.1.0: version "1.1.0" @@ -8429,10 +9179,10 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" @@ -8446,17 +9196,18 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: - private "^0.1.6" + "@babel/runtime" "^7.8.4" + private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -8471,7 +9222,7 @@ regex-parser@2.2.10: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== -regexp.prototype.flags@^1.2.0: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -8485,31 +9236,31 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + unicode-match-property-value-ecmascript "^1.2.0" -regjsgen@^0.5.0: +regjsgen@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== -regjsparser@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.3.tgz#74192c5805d35e9f5ebe3c1fb5b40d40a8a38460" - integrity sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA== +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== dependencies: jsesc "~0.5.0" @@ -8623,6 +9374,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve-url-loader@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" @@ -8656,10 +9412,10 @@ resolve@1.15.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.3.2, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -8726,17 +9482,23 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rss-parser@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.8.0.tgz#6ab883c5cfb69202e25c76fe2b17e3e9179a39f6" + integrity sha512-EvjM0r3IymXnk+SCUawLhdH36D2WQCwpEfIyvu4hpPswYuMSk/jlCLOcg24OvXwVdcJcEocAlTZVjGNjOOSJXg== + dependencies: + entities "^1.1.1" + xml2js "^0.4.19" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -8746,9 +9508,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" @@ -8757,10 +9519,10 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -8805,7 +9567,7 @@ sass-loader@8.0.2: schema-utils "^2.6.1" semver "^6.3.0" -sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -8817,10 +9579,10 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -scheduler@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" - integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -8834,12 +9596,12 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" - integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== dependencies: - ajv "^6.10.2" + ajv "^6.12.0" ajv-keywords "^3.4.1" select-hose@^2.0.0: @@ -8869,6 +9631,11 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -8971,6 +9738,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -9005,10 +9777,18 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-swizzle@^0.2.2: version "0.2.2" @@ -9017,10 +9797,10 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sisteransi@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^1.0.0: version "1.0.0" @@ -9120,9 +9900,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -9151,14 +9931,14 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -9181,9 +9961,9 @@ spdy-transport@^3.0.0: wbuf "^1.7.3" spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -9198,6 +9978,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split-string@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-6.1.0.tgz#e9cedcf94cdab077d9b5528927894dec4b0f42ab" + integrity sha512-9UBdnmnvx2NLLd4bMs7CEKK+wSzbujVv3ONyorkP1o8M3pVJQtXDO1cN19xD1JJs6ltOrtPrkUND0HzLSinUcA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9349,21 +10134,51 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -9442,9 +10257,9 @@ strip-indent@^3.0.0: min-indent "^1.0.0" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== style-loader@0.23.1: version "0.23.1" @@ -9482,7 +10297,7 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== @@ -9490,9 +10305,9 @@ supports-color@^7.0.0: has-flag "^4.0.0" svg-parser@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.3.tgz#a38f2e4e5442986f7ecb554c11f1411cfcf8c2b9" - integrity sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" @@ -9533,10 +10348,10 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -terser-webpack-plugin@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz#ac045703bd8da0936ce910d8fb6350d0e1dee5fe" - integrity sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg== +terser-webpack-plugin@2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== dependencies: cacache "^13.0.1" find-cache-dir "^3.2.0" @@ -9563,10 +10378,10 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.1.2, terser@^4.3.9, terser@^4.4.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" - integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== +terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: + version "4.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" + integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -9622,6 +10437,16 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9696,15 +10521,20 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -ts-pnp@1.1.5, ts-pnp@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec" - integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA== +ts-pnp@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== -tslib@^1.8.1, tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tsutils@^3.17.1: version "3.17.1" @@ -9737,6 +10567,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -9765,10 +10600,20 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@~3.7.2: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== +typescript@~3.9.2: + version "3.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9" + integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw== + +uncontrollable@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" + integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" "^16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -9783,15 +10628,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== union-value@^1.0.0: version "1.0.1" @@ -9827,6 +10672,16 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universal-cookie@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/universal-cookie/-/universal-cookie-4.0.3.tgz#c2fa59127260e6ad21ef3e0cdd66ad453cbc41f6" + integrity sha512-YbEHRs7bYOBTIWedTR9koVEe2mXrq+xdjTJZcoKJK/pQaE6ni28ak2AKXFpevb+X6w3iU5SXzWDiJkmpDRb9qw== + dependencies: + "@types/cookie" "^0.3.3" + "@types/object-assign" "^4.0.30" + cookie "^0.4.0" + object-assign "^4.1.1" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -9855,11 +10710,6 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -9967,6 +10817,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9992,11 +10847,11 @@ vm-browserify@^1.0.1: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" @@ -10007,11 +10862,6 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" -wait-for-expect@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" - integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== - walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -10019,14 +10869,30 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -10051,10 +10917,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@3.10.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.2.tgz#3403287d674c7407aab6d9b3f72259ecd0aa0874" - integrity sha512-pxZKPYb+n77UN8u9YxXT4IaIrGcNtijh/mi8TXbErHmczw0DtPnMTTjHj+eNjkqLOaAZM/qD7V59j/qJsEiaZA== +webpack-dev-server@3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -10116,10 +10982,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.41.5: - version "4.41.5" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" - integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== +webpack@4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" @@ -10424,11 +11290,31 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@^0.4.19: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -10450,11 +11336,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== yargs-parser@^11.1.1: version "11.1.1" @@ -10464,10 +11348,10 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -10491,9 +11375,9 @@ yargs@12.0.5: yargs-parser "^11.1.1" yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -10504,4 +11388,4 @@ yargs@^13.3.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2"