Refactor
This commit is contained in:
parent
4f6f479134
commit
3a337e6408
20 changed files with 631 additions and 358 deletions
4
.prettierrc
Normal file
4
.prettierrc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"singleQuote": true,
|
||||||
|
"tabWidth": 4
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
# Dashboard
|
# Dashboard
|
||||||
|
|
||||||
![screenshot](screenshot.png "screenshot")
|
![screenshot](screenshot.png 'screenshot')
|
||||||
|
|
||||||
Dashboard is just that - a dashboard. It's inspired by [SUI](https://github.com/jeroenpardon/sui) and has all the same features as SUI.
|
Dashboard is just that - a dashboard. It's inspired by [SUI](https://github.com/jeroenpardon/sui) and has all the same features as SUI.
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ To get Dashboard to run, just clone the repository, download the dependencies us
|
||||||
git clone https://github.com/phntxx/dashboard.git
|
git clone https://github.com/phntxx/dashboard.git
|
||||||
cd dashboard
|
cd dashboard
|
||||||
yarn
|
yarn
|
||||||
yarn start
|
yarn build
|
||||||
|
yarn serve:production
|
||||||
```
|
```
|
||||||
|
|
||||||
alternatively, if you want to work using static files (requires a rebuild for
|
alternatively, if you want to work using static files (requires a rebuild for
|
||||||
|
|
58
data/apps.json
Normal file
58
data/apps.json
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"apps": [
|
||||||
|
{
|
||||||
|
"name": "my pi hole",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "vpn_lock"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Plex",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "tv"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "NextCloud",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "filter_drama"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Ghost",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "rss_feed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Minecraft",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "games"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "pfSense",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "security"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ESXi",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "dns"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tautulli",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "bar_chart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grafana",
|
||||||
|
"displayURL": "example.com",
|
||||||
|
"URL": "https://example.com",
|
||||||
|
"icon": "show_chart"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
"@testing-library/jest-dom": "^4.2.4",
|
"@testing-library/jest-dom": "^4.2.4",
|
||||||
"@testing-library/react": "^9.3.2",
|
"@testing-library/react": "^9.3.2",
|
||||||
"@testing-library/user-event": "^7.1.2",
|
"@testing-library/user-event": "^7.1.2",
|
||||||
|
"http-server": "^0.12.3",
|
||||||
"material-icons-react": "^1.0.4",
|
"material-icons-react": "^1.0.4",
|
||||||
"react": "^16.13.1",
|
"react": "^16.13.1",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
|
@ -14,8 +15,12 @@
|
||||||
"styled-components": "^5.1.0"
|
"styled-components": "^5.1.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"serveAppData": "http-server ./data -c-1",
|
||||||
|
"serveProductionApp": "http-server ./build --proxy http://localhost:8080 --port 3000",
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
"build": "react-scripts build",
|
"build": "react-scripts build",
|
||||||
|
"serve:dev": "npm-run-all --parallel serveAppData start",
|
||||||
|
"serve:production": "npm-run-all --parallel serveAppData serveProductionApp",
|
||||||
"test": "react-scripts test",
|
"test": "react-scripts test",
|
||||||
"eject": "react-scripts eject"
|
"eject": "react-scripts eject"
|
||||||
},
|
},
|
||||||
|
@ -33,5 +38,8 @@
|
||||||
"last 1 firefox version",
|
"last 1 firefox version",
|
||||||
"last 1 safari version"
|
"last 1 safari version"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"npm-run-all": "^4.1.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
src/App.js
13
src/App.js
|
@ -1,14 +1,13 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled, { createGlobalStyle } from 'styled-components';
|
import styled, { createGlobalStyle } from 'styled-components';
|
||||||
|
|
||||||
import SearchBar from './components/searchBar'
|
import SearchBar from './components/searchBar';
|
||||||
import Greeter from './components/greeter'
|
import Greeter from './components/greeter';
|
||||||
import AppList from './components/appList'
|
import AppList from './components/appList';
|
||||||
import BookmarkList from './components/bookmarkList'
|
import BookmarkList from './components/bookmarkList';
|
||||||
import SettingsModal from './components/settingsModal'
|
import SettingsModal from './components/settingsModal';
|
||||||
|
|
||||||
import themeData from './components/data/themes.json';
|
import { selectedTheme } from './selectedTheme';
|
||||||
const selectedTheme = localStorage.getItem("theme") ? JSON.parse(localStorage.getItem("theme")) : themeData.themes[0];
|
|
||||||
|
|
||||||
const GlobalStyle = createGlobalStyle`
|
const GlobalStyle = createGlobalStyle`
|
||||||
body {
|
body {
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
import React from 'react';
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
import MaterialIcon from 'material-icons-react';
|
import MaterialIcon from 'material-icons-react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
import appData from './data/apps.json';
|
import { Button } from './button';
|
||||||
|
import { selectedTheme } from '../selectedTheme';
|
||||||
import themeData from './data/themes.json'
|
|
||||||
const selectedTheme = localStorage.getItem("theme") ? JSON.parse(localStorage.getItem("theme")) : themeData.themes[0];
|
|
||||||
|
|
||||||
const AppListContainer = styled.div`
|
const AppListContainer = styled.div`
|
||||||
padding: 2rem 0 2rem 0;
|
padding: 2rem 0 2rem 0;
|
||||||
|
@ -69,25 +67,69 @@ const Description = styled.p`
|
||||||
color: ${selectedTheme.accentColor};
|
color: ${selectedTheme.accentColor};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const appList = () => (
|
const ErrorMessage = styled.p`
|
||||||
|
color: red;
|
||||||
|
`;
|
||||||
|
|
||||||
|
function handleResponse(response) {
|
||||||
|
if (response.ok) {
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
throw new Error('Failed to load app data.');
|
||||||
|
}
|
||||||
|
|
||||||
|
function useAppData() {
|
||||||
|
const [appData, setAppData] = useState({ apps: [], error: false });
|
||||||
|
const fetchAppData = useCallback(() => {
|
||||||
|
(process.env.NODE_ENV === 'production'
|
||||||
|
? fetch('/apps.json').then(handleResponse)
|
||||||
|
: import('./data/apps.json')
|
||||||
|
)
|
||||||
|
.then((jsonResponse) => {
|
||||||
|
setAppData({ ...jsonResponse, error: false });
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setAppData({ apps: [], error: error.message });
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
useEffect(() => {
|
||||||
|
fetchAppData();
|
||||||
|
}, [fetchAppData]);
|
||||||
|
return { appData, fetchAppData };
|
||||||
|
}
|
||||||
|
|
||||||
|
const AppList = () => {
|
||||||
|
const {
|
||||||
|
appData: { apps, error },
|
||||||
|
fetchAppData,
|
||||||
|
} = useAppData();
|
||||||
|
return (
|
||||||
<AppListContainer>
|
<AppListContainer>
|
||||||
<ApplicationsText>Applications</ApplicationsText>
|
<ApplicationsText>
|
||||||
|
Applications <Button onClick={fetchAppData}>refresh</Button>
|
||||||
|
</ApplicationsText>
|
||||||
<AppsContainer>
|
<AppsContainer>
|
||||||
{
|
{error && <ErrorMessage>{error}</ErrorMessage>}
|
||||||
appData.apps.map((app) => (
|
{apps.map((app, idx) => {
|
||||||
<AppContainer>
|
const { name } = app;
|
||||||
|
return (
|
||||||
|
<AppContainer key={[name, idx].join('')}>
|
||||||
<IconContainer>
|
<IconContainer>
|
||||||
<MaterialIcon icon={app.icon} color={selectedTheme.mainColor}/>
|
<MaterialIcon
|
||||||
|
icon={app.icon}
|
||||||
|
color={selectedTheme.mainColor}
|
||||||
|
/>
|
||||||
</IconContainer>
|
</IconContainer>
|
||||||
<AppDetails>
|
<AppDetails>
|
||||||
<Link href={app.URL}>{app.name}</Link>
|
<Link href={app.URL}>{app.name}</Link>
|
||||||
<Description>{app.displayURL}</Description>
|
<Description>{app.displayURL}</Description>
|
||||||
</AppDetails>
|
</AppDetails>
|
||||||
</AppContainer>
|
</AppContainer>
|
||||||
))
|
);
|
||||||
}
|
})}
|
||||||
</AppsContainer>
|
</AppsContainer>
|
||||||
</AppListContainer>
|
</AppListContainer>
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default appList;
|
export default AppList;
|
||||||
|
|
|
@ -3,8 +3,7 @@ import styled from 'styled-components';
|
||||||
|
|
||||||
import bookmarkData from './data/bookmarks.json';
|
import bookmarkData from './data/bookmarks.json';
|
||||||
|
|
||||||
import themeData from './data/themes.json'
|
import { selectedTheme } from '../selectedTheme';
|
||||||
const selectedTheme = localStorage.getItem("theme") ? JSON.parse(localStorage.getItem("theme")) : themeData.themes[0];
|
|
||||||
|
|
||||||
const BookmarksText = styled.h3`
|
const BookmarksText = styled.h3`
|
||||||
font-family: Roboto, sans-serif;
|
font-family: Roboto, sans-serif;
|
||||||
|
@ -54,26 +53,24 @@ const Bookmark = styled.a`
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const bookmarkList = () => (
|
const BookmarkList = () => (
|
||||||
<BookmarkListContainer>
|
<BookmarkListContainer>
|
||||||
<BookmarksText>Bookmarks</BookmarksText>
|
<BookmarksText>Bookmarks</BookmarksText>
|
||||||
<BookmarksContainer>
|
<BookmarksContainer>
|
||||||
|
{bookmarkData.groups.map(({ name, items }) => {
|
||||||
{
|
return (
|
||||||
bookmarkData.groups.map((group) => (
|
<BookmarkGroupContainer key={name}>
|
||||||
<BookmarkGroupContainer>
|
<GroupText>{name}</GroupText>
|
||||||
<GroupText>{group.name}</GroupText>
|
{items.map(({ url, name: linkName }) => (
|
||||||
{
|
<Bookmark key={linkName} href={url}>
|
||||||
group.items.map((link) => (
|
{linkName}
|
||||||
<Bookmark href={link.url}>{link.name}</Bookmark>
|
</Bookmark>
|
||||||
))
|
))}
|
||||||
}
|
|
||||||
</BookmarkGroupContainer>
|
</BookmarkGroupContainer>
|
||||||
))
|
);
|
||||||
}
|
})}
|
||||||
|
|
||||||
</BookmarksContainer>
|
</BookmarksContainer>
|
||||||
</BookmarkListContainer>
|
</BookmarkListContainer>
|
||||||
);
|
);
|
||||||
|
|
||||||
export default bookmarkList;
|
export default BookmarkList;
|
||||||
|
|
13
src/components/button.js
Normal file
13
src/components/button.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import { selectedTheme } from '../selectedTheme';
|
||||||
|
|
||||||
|
export const Button = styled.button`
|
||||||
|
font-family: Roboto, sans-serif;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 400;
|
||||||
|
border: 1px solid ${selectedTheme.mainColor};
|
||||||
|
color: ${selectedTheme.mainColor};
|
||||||
|
background: none;
|
||||||
|
margin-left: 1rem;
|
||||||
|
min-height: 3em;
|
||||||
|
`;
|
|
@ -1,64 +1,64 @@
|
||||||
{
|
{
|
||||||
"providers":[
|
"providers": [
|
||||||
{
|
{
|
||||||
"name":"Allmusic",
|
"name": "Allmusic",
|
||||||
"url":"https://www.allmusic.com/search/all/",
|
"url": "https://www.allmusic.com/search/all/",
|
||||||
"prefix":"/a"
|
"prefix": "/a"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Discogs",
|
"name": "Discogs",
|
||||||
"url":"https://www.discogs.com/search/?q=",
|
"url": "https://www.discogs.com/search/?q=",
|
||||||
"prefix":"/di"
|
"prefix": "/di"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Duck Duck Go",
|
"name": "Duck Duck Go",
|
||||||
"url":"https://duckduckgo.com/?q=",
|
"url": "https://duckduckgo.com/?q=",
|
||||||
"prefix":"/d"
|
"prefix": "/d"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"iMDB",
|
"name": "iMDB",
|
||||||
"url":"https://www.imdb.com/find?q=",
|
"url": "https://www.imdb.com/find?q=",
|
||||||
"prefix":"/i"
|
"prefix": "/i"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"TheMovieDB",
|
"name": "TheMovieDB",
|
||||||
"url":"https://www.themoviedb.org/search?query=",
|
"url": "https://www.themoviedb.org/search?query=",
|
||||||
"prefix":"/m"
|
"prefix": "/m"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Reddit",
|
"name": "Reddit",
|
||||||
"url":"https://www.reddit.com/search?q=",
|
"url": "https://www.reddit.com/search?q=",
|
||||||
"prefix":"/r"
|
"prefix": "/r"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Qwant",
|
"name": "Qwant",
|
||||||
"url":"https://www.qwant.com/?q=",
|
"url": "https://www.qwant.com/?q=",
|
||||||
"prefix":"/q"
|
"prefix": "/q"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Soundcloud",
|
"name": "Soundcloud",
|
||||||
"url":"https://soundcloud.com/search?q=",
|
"url": "https://soundcloud.com/search?q=",
|
||||||
"prefix":"/so"
|
"prefix": "/so"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Spotify",
|
"name": "Spotify",
|
||||||
"url":"https://open.spotify.com/search/results/",
|
"url": "https://open.spotify.com/search/results/",
|
||||||
"prefix":"/s"
|
"prefix": "/s"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"TheTVDB",
|
"name": "TheTVDB",
|
||||||
"url":"https://www.thetvdb.com/search?q=",
|
"url": "https://www.thetvdb.com/search?q=",
|
||||||
"prefix":"/tv"
|
"prefix": "/tv"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name":"Trakt",
|
"name": "Trakt",
|
||||||
"url":"https://trakt.tv/search?query=",
|
"url": "https://trakt.tv/search?query=",
|
||||||
"prefix":"/t"
|
"prefix": "/t"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "YouTube",
|
"name": "YouTube",
|
||||||
"url": "https://youtube.com/results?search_query=",
|
"url": "https://youtube.com/results?search_query=",
|
||||||
"prefix":"/yt"
|
"prefix": "/yt"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
import themeData from './data/themes.json'
|
import { selectedTheme } from '../selectedTheme';
|
||||||
const selectedTheme = localStorage.getItem("theme") ? JSON.parse(localStorage.getItem("theme")) : themeData.themes[0];
|
|
||||||
|
|
||||||
const GreeterContainer = styled.div`
|
const GreeterContainer = styled.div`
|
||||||
padding: 2rem 0 2rem 0;
|
padding: 2rem 0 2rem 0;
|
||||||
|
@ -27,47 +26,75 @@ const DateText = styled.h3`
|
||||||
|
|
||||||
const getGreeting = () => {
|
const getGreeting = () => {
|
||||||
// Maybe add some expandability for different greetings?
|
// Maybe add some expandability for different greetings?
|
||||||
return "Hello World!"
|
return 'Hello World!';
|
||||||
}
|
};
|
||||||
|
|
||||||
const getExtension = (day) => {
|
const getExtension = (day) => {
|
||||||
let extension = ""
|
let extension = '';
|
||||||
|
|
||||||
if ((day > 4 && day <= 20) || (day > 20 && day % 10 >= 4)) {
|
if ((day > 4 && day <= 20) || (day > 20 && day % 10 >= 4)) {
|
||||||
extension = "th"
|
extension = 'th';
|
||||||
} else if (day % 10 === 1) {
|
} else if (day % 10 === 1) {
|
||||||
extension = "st"
|
extension = 'st';
|
||||||
} else if (day % 10 === 2) {
|
} else if (day % 10 === 2) {
|
||||||
extension = "nd"
|
extension = 'nd';
|
||||||
} else if (day % 10 === 3) {
|
} else if (day % 10 === 3) {
|
||||||
extension = "rd"
|
extension = 'rd';
|
||||||
}
|
}
|
||||||
|
|
||||||
return extension
|
return extension;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
const monthNames = [
|
||||||
|
'January',
|
||||||
|
'February',
|
||||||
|
'March',
|
||||||
|
'April',
|
||||||
|
'May',
|
||||||
|
'June',
|
||||||
|
'July',
|
||||||
|
'August',
|
||||||
|
'September',
|
||||||
|
'October',
|
||||||
|
'November',
|
||||||
|
'December',
|
||||||
|
];
|
||||||
|
|
||||||
|
const weekDayNames = [
|
||||||
|
'Sunday',
|
||||||
|
'Monday',
|
||||||
|
'Tuesday',
|
||||||
|
'Wednesday',
|
||||||
|
'Thursday',
|
||||||
|
'Friday',
|
||||||
|
'Saturday',
|
||||||
|
];
|
||||||
|
|
||||||
const getDateString = () => {
|
const getDateString = () => {
|
||||||
let currentDate = new Date();
|
let currentDate = new Date();
|
||||||
|
|
||||||
const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
|
return (
|
||||||
|
weekDayNames[currentDate.getUTCDay()] +
|
||||||
const weekDayNames = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
|
', ' +
|
||||||
|
monthNames[currentDate.getUTCMonth()] +
|
||||||
return weekDayNames[currentDate.getUTCDay()] + ", " + monthNames[currentDate.getUTCMonth()] + " " + currentDate.getDate() + getExtension(currentDate.getDate()) + " " + currentDate.getFullYear();
|
' ' +
|
||||||
}
|
currentDate.getDate() +
|
||||||
|
getExtension(currentDate.getDate()) +
|
||||||
const greeter = () => {
|
' ' +
|
||||||
|
currentDate.getFullYear()
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Greeter = () => {
|
||||||
let date = getDateString();
|
let date = getDateString();
|
||||||
let greeting = getGreeting();
|
let greeting = getGreeting();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<GreeterContainer>
|
<GreeterContainer>
|
||||||
<DateText>{ date }</DateText>
|
<DateText>{date}</DateText>
|
||||||
<GreetText>{ greeting }</GreetText>
|
<GreetText>{greeting}</GreetText>
|
||||||
</GreeterContainer>
|
</GreeterContainer>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
export default Greeter;
|
||||||
export default greeter;
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import React, {useState} from 'react';
|
import React, { useState } from 'react';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
import searchData from './data/search.json';
|
import searchData from './data/search.json';
|
||||||
|
|
||||||
import themeData from './data/themes.json';
|
import { selectedTheme } from '../selectedTheme';
|
||||||
const selectedTheme = localStorage.getItem("theme") ? JSON.parse(localStorage.getItem("theme")) : themeData.themes[0];
|
|
||||||
|
|
||||||
const SearchInput = styled.input`
|
const SearchInput = styled.input`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -17,53 +16,53 @@ const SearchInput = styled.input`
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const handleQueryWithProvider = (query) => {
|
const handleQueryWithProvider = (query) => {
|
||||||
|
let queryArray = query.split(' ');
|
||||||
let queryArray = query.split(" ");
|
|
||||||
|
|
||||||
let prefix = queryArray[0];
|
let prefix = queryArray[0];
|
||||||
|
|
||||||
queryArray.shift();
|
queryArray.shift();
|
||||||
|
|
||||||
let searchQuery = queryArray.join(" ");
|
let searchQuery = queryArray.join(' ');
|
||||||
|
|
||||||
var foundProvider = false;
|
var foundProvider = false;
|
||||||
searchData.providers.forEach((provider) => {
|
searchData.providers.forEach((provider) => {
|
||||||
if (provider.prefix === prefix) {
|
if (provider.prefix === prefix) {
|
||||||
foundProvider = true;
|
foundProvider = true;
|
||||||
window.location = provider.url + searchQuery
|
window.location = provider.url + searchQuery;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
if (!foundProvider) {
|
if (!foundProvider) {
|
||||||
window.location = "https://google.com/search?q=" + query;
|
window.location = 'https://google.com/search?q=' + query;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
const SearchBar = () => {
|
const SearchBar = () => {
|
||||||
|
|
||||||
let [input, setInput] = useState();
|
let [input, setInput] = useState();
|
||||||
|
|
||||||
const handleSearchQuery = (e) => {
|
const handleSearchQuery = (e) => {
|
||||||
|
|
||||||
var query = input;
|
var query = input;
|
||||||
|
|
||||||
console.log(query)
|
console.log(query);
|
||||||
|
|
||||||
if (query.split(" ")[0].includes("/")) {
|
if (query.split(' ')[0].includes('/')) {
|
||||||
handleQueryWithProvider(query)
|
handleQueryWithProvider(query);
|
||||||
} else {
|
} else {
|
||||||
window.location = "https://google.com/search?q=" + query;
|
window.location = 'https://google.com/search?q=' + query;
|
||||||
}
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={(e) => handleSearchQuery(e)}>
|
<form onSubmit={(e) => handleSearchQuery(e)}>
|
||||||
<SearchInput type="text" onChange={(e) => setInput(e.target.value)}></SearchInput>
|
<SearchInput
|
||||||
|
type="text"
|
||||||
|
onChange={(e) => setInput(e.target.value)}
|
||||||
|
></SearchInput>
|
||||||
<button type="submit" hidden />
|
<button type="submit" hidden />
|
||||||
</form>
|
</form>
|
||||||
)
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
export default SearchBar;
|
export default SearchBar;
|
|
@ -4,10 +4,11 @@ import styled from 'styled-components';
|
||||||
|
|
||||||
import Select from 'react-select';
|
import Select from 'react-select';
|
||||||
|
|
||||||
import searchData from './data/search.json'
|
import searchData from './data/search.json';
|
||||||
import themeData from './data/themes.json'
|
import themeData from './data/themes.json';
|
||||||
|
|
||||||
import getTheme, { setTheme } from './themeManager'
|
import getTheme, { setTheme } from './themeManager';
|
||||||
|
import { Button } from './button';
|
||||||
|
|
||||||
const selectedTheme = getTheme();
|
const selectedTheme = getTheme();
|
||||||
|
|
||||||
|
@ -47,15 +48,7 @@ const FormContainer = styled.div`
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const ApplyButton = styled.button`
|
const ApplyButton = Button;
|
||||||
font-family: Roboto, sans-serif;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: 400;
|
|
||||||
border: 1px solid ${selectedTheme.mainColor};
|
|
||||||
color: ${selectedTheme.mainColor};
|
|
||||||
background: none;
|
|
||||||
margin-left: 1rem;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const Headline = styled.h3`
|
const Headline = styled.h3`
|
||||||
font-family: Roboto, sans-serif;
|
font-family: Roboto, sans-serif;
|
||||||
|
@ -67,48 +60,47 @@ const Headline = styled.h3`
|
||||||
const SelectorStyle = {
|
const SelectorStyle = {
|
||||||
control: (provided) => ({
|
control: (provided) => ({
|
||||||
...provided,
|
...provided,
|
||||||
fontFamily: "Roboto, sans-serif",
|
fontFamily: 'Roboto, sans-serif',
|
||||||
fontWeight: "500",
|
fontWeight: '500',
|
||||||
color: selectedTheme.mainColor,
|
color: selectedTheme.mainColor,
|
||||||
textTransform: "uppercase",
|
textTransform: 'uppercase',
|
||||||
width: "200px",
|
width: '200px',
|
||||||
background: "none",
|
background: 'none',
|
||||||
borderRadius: "0px",
|
borderRadius: '0px',
|
||||||
border: "1px solid " + selectedTheme.mainColor,
|
border: '1px solid ' + selectedTheme.mainColor,
|
||||||
boxShadow: 0,
|
boxShadow: 0,
|
||||||
'&:hover': {
|
'&:hover': {
|
||||||
border: "1px solid " + selectedTheme.mainColor,
|
border: '1px solid ' + selectedTheme.mainColor,
|
||||||
}
|
},
|
||||||
}),
|
}),
|
||||||
menu: (provided) => ({
|
menu: (provided) => ({
|
||||||
...provided,
|
...provided,
|
||||||
backgroundColor: selectedTheme.backgroundColor,
|
backgroundColor: selectedTheme.backgroundColor,
|
||||||
border: "1px solid " + selectedTheme.mainColor,
|
border: '1px solid ' + selectedTheme.mainColor,
|
||||||
borderRadius: "0px",
|
borderRadius: '0px',
|
||||||
boxShadow: 0,
|
boxShadow: 0,
|
||||||
}),
|
}),
|
||||||
option: (provided) => ({
|
option: (provided) => ({
|
||||||
...provided,
|
...provided,
|
||||||
fontFamily: "Roboto, sans-serif",
|
fontFamily: 'Roboto, sans-serif',
|
||||||
fontWeight: "500",
|
fontWeight: '500',
|
||||||
color: selectedTheme.mainColor,
|
color: selectedTheme.mainColor,
|
||||||
textTransform: "uppercase",
|
textTransform: 'uppercase',
|
||||||
borderRadius: "0px",
|
borderRadius: '0px',
|
||||||
boxShadow: 0,
|
boxShadow: 0,
|
||||||
backgroundColor: selectedTheme.backgroundColor,
|
backgroundColor: selectedTheme.backgroundColor,
|
||||||
'&:hover': {
|
'&:hover': {
|
||||||
backgroundColor: selectedTheme.mainColor,
|
backgroundColor: selectedTheme.mainColor,
|
||||||
color: selectedTheme.backgroundColor,
|
color: selectedTheme.backgroundColor,
|
||||||
}
|
},
|
||||||
}),
|
}),
|
||||||
singleValue: (provided) => {
|
singleValue: (provided) => {
|
||||||
return {
|
return {
|
||||||
...provided,
|
...provided,
|
||||||
color: selectedTheme.mainColor,
|
color: selectedTheme.mainColor,
|
||||||
}
|
};
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
const Table = styled.table`
|
const Table = styled.table`
|
||||||
font-family: Roboto, sans-serif;
|
font-family: Roboto, sans-serif;
|
||||||
|
@ -132,7 +124,6 @@ const HeadCell = styled.th`
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const SettingsModal = () => {
|
const SettingsModal = () => {
|
||||||
|
|
||||||
const [modalHidden, setModalHidden] = useState(true);
|
const [modalHidden, setModalHidden] = useState(true);
|
||||||
const [newTheme, setNewTheme] = useState();
|
const [newTheme, setNewTheme] = useState();
|
||||||
|
|
||||||
|
@ -143,33 +134,49 @@ const SettingsModal = () => {
|
||||||
</ModalButton>
|
</ModalButton>
|
||||||
<Modal hidden={modalHidden}>
|
<Modal hidden={modalHidden}>
|
||||||
<ExitButton onClick={() => setModalHidden(!modalHidden)}>
|
<ExitButton onClick={() => setModalHidden(!modalHidden)}>
|
||||||
<MaterialIcon icon="close" color={selectedTheme.mainColor} />
|
<MaterialIcon
|
||||||
|
icon="close"
|
||||||
|
color={selectedTheme.mainColor}
|
||||||
|
/>
|
||||||
</ExitButton>
|
</ExitButton>
|
||||||
<SelectContainer>
|
<SelectContainer>
|
||||||
<Headline>Theme:</Headline>
|
<Headline>Theme:</Headline>
|
||||||
<FormContainer>
|
<FormContainer>
|
||||||
<Select options={themeData.themes} defaultValue={selectedTheme} onChange={(e) => {setNewTheme(e)}} styles={SelectorStyle} />
|
<Select
|
||||||
<ApplyButton onClick={() => setTheme(JSON.stringify(newTheme))}>Apply</ApplyButton>
|
options={themeData.themes}
|
||||||
|
defaultValue={selectedTheme}
|
||||||
|
onChange={(e) => {
|
||||||
|
setNewTheme(e);
|
||||||
|
}}
|
||||||
|
styles={SelectorStyle}
|
||||||
|
/>
|
||||||
|
<ApplyButton
|
||||||
|
onClick={() => setTheme(JSON.stringify(newTheme))}
|
||||||
|
>
|
||||||
|
Apply
|
||||||
|
</ApplyButton>
|
||||||
</FormContainer>
|
</FormContainer>
|
||||||
</SelectContainer>
|
</SelectContainer>
|
||||||
<Table>
|
<Table>
|
||||||
|
<tbody>
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<HeadCell>Search Provider</HeadCell>
|
<HeadCell>Search Provider</HeadCell>
|
||||||
<HeadCell>Prefix</HeadCell>
|
<HeadCell>Prefix</HeadCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
{
|
{searchData.providers.map((provider) => {
|
||||||
searchData.providers.map((provider) => (
|
const { name, prefix } = provider;
|
||||||
<TableRow>
|
return (
|
||||||
<TableCell>{provider.name}</TableCell>
|
<TableRow key={name}>
|
||||||
<TableCell>{provider.prefix}</TableCell>
|
<TableCell>{name}</TableCell>
|
||||||
|
<TableCell>{prefix}</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
))
|
);
|
||||||
}
|
})}
|
||||||
|
</tbody>
|
||||||
</Table>
|
</Table>
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
</>
|
||||||
)
|
);
|
||||||
|
};
|
||||||
}
|
|
||||||
|
|
||||||
export default SettingsModal;
|
export default SettingsModal;
|
|
@ -1,25 +1,27 @@
|
||||||
import themeData from './data/themes.json';
|
import themeData from './data/themes.json';
|
||||||
|
|
||||||
const setTheme = (theme) => {
|
const setTheme = (theme) => {
|
||||||
localStorage.setItem("theme", theme);
|
localStorage.setItem('theme', theme);
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
}
|
};
|
||||||
|
|
||||||
const resetTheme = () => {
|
const resetTheme = () => {
|
||||||
localStorage.removeItem("theme");
|
localStorage.removeItem('theme');
|
||||||
}
|
};
|
||||||
|
|
||||||
const getTheme = () => {
|
const getTheme = () => {
|
||||||
|
|
||||||
let selectedTheme = themeData.themes[0];
|
let selectedTheme = themeData.themes[0];
|
||||||
|
|
||||||
if (localStorage.getItem("theme") && localStorage.getItem("theme") !== undefined) {
|
if (
|
||||||
selectedTheme = JSON.parse(localStorage.getItem("theme"));
|
localStorage.getItem('theme') &&
|
||||||
|
localStorage.getItem('theme') !== undefined
|
||||||
|
) {
|
||||||
|
selectedTheme = JSON.parse(localStorage.getItem('theme'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectedTheme;
|
return selectedTheme;
|
||||||
}
|
};
|
||||||
|
|
||||||
export { setTheme, resetTheme }
|
export { setTheme, resetTheme };
|
||||||
|
|
||||||
export default getTheme;
|
export default getTheme;
|
5
src/selectedTheme.js
Normal file
5
src/selectedTheme.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import themeData from './components/data/themes.json';
|
||||||
|
|
||||||
|
export const selectedTheme = localStorage.getItem('theme')
|
||||||
|
? JSON.parse(localStorage.getItem('theme'))
|
||||||
|
: themeData.themes[0];
|
|
@ -57,7 +57,7 @@ export function register(config) {
|
||||||
function registerValidSW(swUrl, config) {
|
function registerValidSW(swUrl, config) {
|
||||||
navigator.serviceWorker
|
navigator.serviceWorker
|
||||||
.register(swUrl)
|
.register(swUrl)
|
||||||
.then(registration => {
|
.then((registration) => {
|
||||||
registration.onupdatefound = () => {
|
registration.onupdatefound = () => {
|
||||||
const installingWorker = registration.installing;
|
const installingWorker = registration.installing;
|
||||||
if (installingWorker == null) {
|
if (installingWorker == null) {
|
||||||
|
@ -93,7 +93,7 @@ function registerValidSW(swUrl, config) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
console.error('Error during service worker registration:', error);
|
console.error('Error during service worker registration:', error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -103,15 +103,16 @@ function checkValidServiceWorker(swUrl, config) {
|
||||||
fetch(swUrl, {
|
fetch(swUrl, {
|
||||||
headers: { 'Service-Worker': 'script' },
|
headers: { 'Service-Worker': 'script' },
|
||||||
})
|
})
|
||||||
.then(response => {
|
.then((response) => {
|
||||||
// Ensure service worker exists, and that we really are getting a JS file.
|
// Ensure service worker exists, and that we really are getting a JS file.
|
||||||
const contentType = response.headers.get('content-type');
|
const contentType = response.headers.get('content-type');
|
||||||
if (
|
if (
|
||||||
response.status === 404 ||
|
response.status === 404 ||
|
||||||
(contentType != null && contentType.indexOf('javascript') === -1)
|
(contentType != null &&
|
||||||
|
contentType.indexOf('javascript') === -1)
|
||||||
) {
|
) {
|
||||||
// No service worker found. Probably a different app. Reload the page.
|
// No service worker found. Probably a different app. Reload the page.
|
||||||
navigator.serviceWorker.ready.then(registration => {
|
navigator.serviceWorker.ready.then((registration) => {
|
||||||
registration.unregister().then(() => {
|
registration.unregister().then(() => {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
});
|
});
|
||||||
|
@ -131,10 +132,10 @@ function checkValidServiceWorker(swUrl, config) {
|
||||||
export function unregister() {
|
export function unregister() {
|
||||||
if ('serviceWorker' in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
navigator.serviceWorker.ready
|
navigator.serviceWorker.ready
|
||||||
.then(registration => {
|
.then((registration) => {
|
||||||
registration.unregister();
|
registration.unregister();
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch((error) => {
|
||||||
console.error(error.message);
|
console.error(error.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
118
yarn.lock
118
yarn.lock
|
@ -2433,6 +2433,11 @@ base@^0.11.1:
|
||||||
mixin-deep "^1.2.0"
|
mixin-deep "^1.2.0"
|
||||||
pascalcase "^0.1.1"
|
pascalcase "^0.1.1"
|
||||||
|
|
||||||
|
basic-auth@^1.0.3:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
|
||||||
|
integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=
|
||||||
|
|
||||||
batch@0.6.1:
|
batch@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
|
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
|
||||||
|
@ -3048,6 +3053,11 @@ color@^3.0.0:
|
||||||
color-convert "^1.9.1"
|
color-convert "^1.9.1"
|
||||||
color-string "^1.5.2"
|
color-string "^1.5.2"
|
||||||
|
|
||||||
|
colors@^1.4.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||||
|
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
|
||||||
|
|
||||||
combined-stream@^1.0.6, combined-stream@~1.0.6:
|
combined-stream@^1.0.6, combined-stream@~1.0.6:
|
||||||
version "1.0.8"
|
version "1.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||||
|
@ -3231,6 +3241,11 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
||||||
|
|
||||||
|
corser@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87"
|
||||||
|
integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=
|
||||||
|
|
||||||
cosmiconfig@^5.0.0, cosmiconfig@^5.2.1:
|
cosmiconfig@^5.0.0, cosmiconfig@^5.2.1:
|
||||||
version "5.2.1"
|
version "5.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
|
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
|
||||||
|
@ -3919,6 +3934,16 @@ ecc-jsbn@~0.1.1:
|
||||||
jsbn "~0.1.0"
|
jsbn "~0.1.0"
|
||||||
safer-buffer "^2.1.0"
|
safer-buffer "^2.1.0"
|
||||||
|
|
||||||
|
ecstatic@^3.3.2:
|
||||||
|
version "3.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.3.2.tgz#6d1dd49814d00594682c652adb66076a69d46c48"
|
||||||
|
integrity sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==
|
||||||
|
dependencies:
|
||||||
|
he "^1.1.1"
|
||||||
|
mime "^1.6.0"
|
||||||
|
minimist "^1.1.0"
|
||||||
|
url-join "^2.0.5"
|
||||||
|
|
||||||
ee-first@1.1.1:
|
ee-first@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||||
|
@ -5079,7 +5104,7 @@ hash.js@^1.0.0, hash.js@^1.0.3:
|
||||||
inherits "^2.0.3"
|
inherits "^2.0.3"
|
||||||
minimalistic-assert "^1.0.1"
|
minimalistic-assert "^1.0.1"
|
||||||
|
|
||||||
he@^1.2.0:
|
he@^1.1.1, he@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||||
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
||||||
|
@ -5250,6 +5275,31 @@ http-proxy@^1.17.0:
|
||||||
follow-redirects "^1.0.0"
|
follow-redirects "^1.0.0"
|
||||||
requires-port "^1.0.0"
|
requires-port "^1.0.0"
|
||||||
|
|
||||||
|
http-proxy@^1.18.0:
|
||||||
|
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"
|
||||||
|
requires-port "^1.0.0"
|
||||||
|
|
||||||
|
http-server@^0.12.3:
|
||||||
|
version "0.12.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.12.3.tgz#ba0471d0ecc425886616cb35c4faf279140a0d37"
|
||||||
|
integrity sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA==
|
||||||
|
dependencies:
|
||||||
|
basic-auth "^1.0.3"
|
||||||
|
colors "^1.4.0"
|
||||||
|
corser "^2.0.1"
|
||||||
|
ecstatic "^3.3.2"
|
||||||
|
http-proxy "^1.18.0"
|
||||||
|
minimist "^1.2.5"
|
||||||
|
opener "^1.5.1"
|
||||||
|
portfinder "^1.0.25"
|
||||||
|
secure-compare "3.0.1"
|
||||||
|
union "~0.5.0"
|
||||||
|
|
||||||
http-signature@~1.2.0:
|
http-signature@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||||
|
@ -6770,6 +6820,11 @@ memory-fs@^0.5.0:
|
||||||
errno "^0.1.3"
|
errno "^0.1.3"
|
||||||
readable-stream "^2.0.1"
|
readable-stream "^2.0.1"
|
||||||
|
|
||||||
|
memorystream@^0.3.1:
|
||||||
|
version "0.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
|
||||||
|
integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI=
|
||||||
|
|
||||||
merge-deep@^3.0.2:
|
merge-deep@^3.0.2:
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
|
resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
|
||||||
|
@ -6843,7 +6898,7 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-db "1.43.0"
|
mime-db "1.43.0"
|
||||||
|
|
||||||
mime@1.6.0:
|
mime@1.6.0, mime@^1.6.0:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
||||||
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
||||||
|
@ -6895,7 +6950,7 @@ minimist@0.0.8:
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||||
|
|
||||||
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
|
minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
|
||||||
version "1.2.5"
|
version "1.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||||
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
||||||
|
@ -7186,6 +7241,21 @@ normalize-url@^3.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
|
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
|
||||||
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
|
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
|
||||||
|
|
||||||
|
npm-run-all@^4.1.5:
|
||||||
|
version "4.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
|
||||||
|
integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^3.2.1"
|
||||||
|
chalk "^2.4.1"
|
||||||
|
cross-spawn "^6.0.5"
|
||||||
|
memorystream "^0.3.1"
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
pidtree "^0.3.0"
|
||||||
|
read-pkg "^3.0.0"
|
||||||
|
shell-quote "^1.6.1"
|
||||||
|
string.prototype.padend "^3.0.0"
|
||||||
|
|
||||||
npm-run-path@^2.0.0:
|
npm-run-path@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||||
|
@ -7360,6 +7430,11 @@ open@^7.0.2:
|
||||||
is-docker "^2.0.0"
|
is-docker "^2.0.0"
|
||||||
is-wsl "^2.1.1"
|
is-wsl "^2.1.1"
|
||||||
|
|
||||||
|
opener@^1.5.1:
|
||||||
|
version "1.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
|
||||||
|
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
|
||||||
|
|
||||||
opn@^5.5.0:
|
opn@^5.5.0:
|
||||||
version "5.5.0"
|
version "5.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
|
resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
|
||||||
|
@ -7695,6 +7770,11 @@ picomatch@^2.0.4, picomatch@^2.0.7:
|
||||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
|
||||||
integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
|
integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
|
||||||
|
|
||||||
|
pidtree@^0.3.0:
|
||||||
|
version "0.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
|
||||||
|
integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
|
||||||
|
|
||||||
pify@^2.0.0:
|
pify@^2.0.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||||
|
@ -8630,6 +8710,11 @@ qs@6.7.0:
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
|
||||||
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
|
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
|
||||||
|
|
||||||
|
qs@^6.4.0:
|
||||||
|
version "6.9.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
|
||||||
|
integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
|
||||||
|
|
||||||
qs@~6.5.2:
|
qs@~6.5.2:
|
||||||
version "6.5.2"
|
version "6.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||||
|
@ -9386,6 +9471,11 @@ schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6
|
||||||
ajv "^6.12.0"
|
ajv "^6.12.0"
|
||||||
ajv-keywords "^3.4.1"
|
ajv-keywords "^3.4.1"
|
||||||
|
|
||||||
|
secure-compare@3.0.1:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3"
|
||||||
|
integrity sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=
|
||||||
|
|
||||||
select-hose@^2.0.0:
|
select-hose@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
|
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
|
||||||
|
@ -9544,7 +9634,7 @@ shebang-regex@^3.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
||||||
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
|
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
|
||||||
|
|
||||||
shell-quote@1.7.2:
|
shell-quote@1.7.2, shell-quote@^1.6.1:
|
||||||
version "1.7.2"
|
version "1.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
|
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
|
||||||
integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
|
integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
|
||||||
|
@ -9918,6 +10008,14 @@ string.prototype.matchall@^4.0.2:
|
||||||
regexp.prototype.flags "^1.3.0"
|
regexp.prototype.flags "^1.3.0"
|
||||||
side-channel "^1.0.2"
|
side-channel "^1.0.2"
|
||||||
|
|
||||||
|
string.prototype.padend@^3.0.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3"
|
||||||
|
integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.3"
|
||||||
|
es-abstract "^1.17.0-next.1"
|
||||||
|
|
||||||
string.prototype.trimleft@^2.1.1:
|
string.prototype.trimleft@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
|
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
|
||||||
|
@ -10393,6 +10491,13 @@ union-value@^1.0.0:
|
||||||
is-extendable "^0.1.1"
|
is-extendable "^0.1.1"
|
||||||
set-value "^2.0.1"
|
set-value "^2.0.1"
|
||||||
|
|
||||||
|
union@~0.5.0:
|
||||||
|
version "0.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075"
|
||||||
|
integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==
|
||||||
|
dependencies:
|
||||||
|
qs "^6.4.0"
|
||||||
|
|
||||||
uniq@^1.0.1:
|
uniq@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
|
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
|
||||||
|
@ -10457,6 +10562,11 @@ urix@^0.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
||||||
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
||||||
|
|
||||||
|
url-join@^2.0.5:
|
||||||
|
version "2.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728"
|
||||||
|
integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=
|
||||||
|
|
||||||
url-loader@2.3.0:
|
url-loader@2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
|
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
|
||||||
|
|
Loading…
Reference in a new issue