diff --git a/app/client/src/actions/pageActions.tsx b/app/client/src/actions/pageActions.tsx index 1b2fc3c1f6..9dd9fa2d1b 100644 --- a/app/client/src/actions/pageActions.tsx +++ b/app/client/src/actions/pageActions.tsx @@ -19,7 +19,6 @@ export const fetchPage = ( type: ReduxActionTypes.FETCH_PAGE, payload: { pageId: pageId, - renderMode: renderMode, }, }; }; diff --git a/app/client/src/api/PageApi.tsx b/app/client/src/api/PageApi.tsx index 33ab271152..36a7976379 100644 --- a/app/client/src/api/PageApi.tsx +++ b/app/client/src/api/PageApi.tsx @@ -2,13 +2,11 @@ import Api from "./Api"; import { ContainerWidgetProps } from "../widgets/ContainerWidget"; import { ApiResponse } from "./ApiResponses"; import { WidgetProps } from "../widgets/BaseWidget"; -import { RenderMode } from "../constants/WidgetConstants"; import { PageAction } from "../constants/ActionConstants"; import { AxiosPromise } from "axios"; export interface FetchPageRequest { pageId: string; - renderMode: RenderMode; } export interface FetchPublishedPageRequest { @@ -41,6 +39,7 @@ export type FetchPublishedPageResponse = ApiResponse & { data: { id: string; dsl: Partial>; + pageId: string; }; }; @@ -48,6 +47,23 @@ export interface SavePageResponse extends ApiResponse { pageId: string; } +export interface CreatePageRequest { + applicationId: string; + name: string; +} + +export interface CreatePageResponse extends ApiResponse { + data: {}; +} + +export interface FetchPageListResponse extends ApiResponse { + data: Array<{ + id: string; + name: string; + layouts: Array; + }>; +} + class PageApi extends Api { static url = "v1/pages"; static getLayoutUpdateURL = (pageId: string, layoutId: string) => { @@ -85,6 +101,16 @@ class PageApi extends Api { PageApi.getPublishedPageURL(pageRequest.pageId, pageRequest.layoutId), ); } + + static createPage( + createPageRequest: CreatePageRequest, + ): AxiosPromise { + return Api.post(PageApi.url, createPageRequest); + } + + static fetchPageList(): AxiosPromise { + return Api.get(PageApi.url); + } } export default PageApi; diff --git a/app/client/src/common/DropdownOption.tsx b/app/client/src/common/DropdownOption.tsx new file mode 100644 index 0000000000..c5c081acbe --- /dev/null +++ b/app/client/src/common/DropdownOption.tsx @@ -0,0 +1,8 @@ +export type DropdownOption = { + label: string; + value: string; + disabled?: boolean; + displayText?: string; +}; + +export default DropdownOption; diff --git a/app/client/src/components/editor/DropdownComponent.tsx b/app/client/src/components/editor/DropdownComponent.tsx new file mode 100644 index 0000000000..c4fbe7a27c --- /dev/null +++ b/app/client/src/components/editor/DropdownComponent.tsx @@ -0,0 +1,155 @@ +import React, { Component } from "react"; +import styled from "styled-components"; +import { MenuItem, Menu, ControlGroup, InputGroup } from "@blueprintjs/core"; +import { BaseButton } from "../blueprint/ButtonComponent"; +import { + ItemRenderer, + Select, + ItemListRenderer, + IItemListRendererProps, +} from "@blueprintjs/select"; +import DropdownOption from "../../common/DropdownOption"; + +const Dropdown = Select.ofType(); +const StyledDropdown = styled(Dropdown)``; + +class DropdownComponent extends Component { + private newItemTextInput: HTMLInputElement | null = null; + private setNewItemTextInput = (element: HTMLInputElement | null) => { + this.newItemTextInput = element; + }; + + public state = { + isEditing: false, + }; + + showTextBox = (): void => { + this.setState({ + isEditing: true, + }); + }; + + handleAddItem = (): void => { + this.props.addItem && + this.newItemTextInput && + this.props.addItem.addItemHandler(this.newItemTextInput.value); + this.setState({ + isEditing: false, + }); + }; + + renderItemList: ItemListRenderer = ( + props: IItemListRendererProps, + ) => { + if (this.props.addItem) { + const renderItems = props.items.map(props.renderItem).filter(Boolean); + const displayMode = ( + + ); + const editMode = ( + + + + + ); + return ( + + {renderItems} + {!this.state.isEditing ? displayMode : editMode} + + ); + } + + return ; + }; + + searchItem = (query: string, option: DropdownOption): boolean => { + return ( + option.label.toLowerCase().indexOf(query.toLowerCase()) > -1 || + option.value.toLowerCase().indexOf(query.toLowerCase()) > -1 || + (!!option.displayText && + option.displayText.toLowerCase().indexOf(query.toLowerCase()) > -1) + ); + }; + onItemSelect = (item: DropdownOption): void => { + this.props.selectHandler(item.value); + }; + + renderItem: ItemRenderer = ( + option: DropdownOption, + { handleClick, modifiers }, + ) => { + if (!modifiers.matchesPredicate) { + return null; + } + return ( + + ); + }; + getSelectedDisplayText = () => { + if (this.props.selected) { + const selectedValue = this.props.selected.value; + const item: DropdownOption | undefined = this.props.options.find( + option => option.value === selectedValue, + ); + + return item && (item.displayText || item.label); + } + return ""; + }; + render() { + return ( + } + > + + + ); + } +} + +export interface DropdownComponentProps { + options: DropdownOption[]; + selectHandler: (selectedValue: string) => void; + selected?: DropdownOption; + multiselectDisplayType?: "TAGS" | "CHECKBOXES"; + checked?: boolean; + multi?: boolean; + autocomplete?: boolean; + addItem?: { + displayText: string; + addItemHandler: (name: string) => void; + }; +} + +export default DropdownComponent; diff --git a/app/client/src/components/viewer/AppViewerHeader.tsx b/app/client/src/components/viewer/AppViewerHeader.tsx new file mode 100644 index 0000000000..92457478c8 --- /dev/null +++ b/app/client/src/components/viewer/AppViewerHeader.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import styled from "styled-components"; + +const HeaderWrapper = styled.header` + height: ${props => props.theme.headerHeight}; + width: 100vw; + position: fixed; + top: 0; + left: 0; + background: white; +`; +type AppViewerHeaderProps = {}; + +export const AppViewerHeader = (props: AppViewerHeaderProps) => { + return ; +}; + +export default AppViewerHeader; diff --git a/app/client/src/components/viewer/SideNav.tsx b/app/client/src/components/viewer/SideNav.tsx new file mode 100644 index 0000000000..2abc81b15e --- /dev/null +++ b/app/client/src/components/viewer/SideNav.tsx @@ -0,0 +1,76 @@ +import React, { useState } from "react"; +import styled from "styled-components"; +import { Menu, MenuItem, IconName, Button } from "@blueprintjs/core"; + +export type SideNavItem = { + id: string; + icon?: string; + text: string; +}; + +type SideNavProps = { + items: SideNavItem[]; + active?: SideNavItem; + onSelect: Function; + headeroffset?: number; +}; + +/* eslint-disable no-unexpected-multiline */ + +const SideNavWrapper = styled.div<{ + isExpanded: boolean; + headeroffset?: number; +}>` + height: calc(100vh - ${props => props.headeroffset || 50}px); + margin-top: ${props => props.headeroffset || 50}px; + width: ${props => + props.isExpanded + ? props.theme.sideNav.maxWidth + : props.theme.sideNav.minWidth}px; + transition: width 0.5s ease-out; +`; + +const ToggleButton = styled(Button)<{ headeroffset?: number }>` + position: fixed; + top: 0; + left: 0; + width: ${props => props.headeroffset || 50}px; + height: ${props => props.headeroffset || 50}px; +`; + +export const SideNav = (props: SideNavProps) => { + const [isExpanded, setIsExpanded] = useState(true); + const select = (item: SideNavItem) => () => { + props.onSelect(item); + }; + const renderItems = (items: SideNavItem[]) => { + return items.map(item => { + return ( + + ); + }); + }; + const toggleCollapse = () => { + setIsExpanded(!isExpanded); + }; + + return ( + + + {renderItems(props.items)} + + ); +}; + +export default SideNav; diff --git a/app/client/src/constants/DefaultTheme.tsx b/app/client/src/constants/DefaultTheme.tsx index 0710940c03..432e714671 100644 --- a/app/client/src/constants/DefaultTheme.tsx +++ b/app/client/src/constants/DefaultTheme.tsx @@ -37,6 +37,12 @@ export type Theme = { propertyPane: PropertyPaneTheme; headerHeight: string; sidebarWidth: string; + sideNav: { + minWidth: number; + maxWidth: number; + bgColor: Color; + fontColor: Color; + }; }; export const getColorWithOpacity = (color: Color, opacity: number) => { @@ -48,12 +54,12 @@ export const getColorWithOpacity = (color: Color, opacity: number) => { return `rgba(${r},${g},${b},${opacity})`; }; -export const getBorderCSSShorthand = (border?: ThemeBorder) : string => { - let values : string[] = [] +export const getBorderCSSShorthand = (border?: ThemeBorder): string => { + const values: string[] = []; _.forIn(border, (value, key) => { - values.push(key === 'thickness' ? value + "px" : value) - }) - return values.join(" ") + values.push(key === "thickness" ? value + "px" : value); + }); + return values.join(" "); }; export const theme: Theme = { @@ -118,6 +124,12 @@ export const theme: Theme = { ], sidebarWidth: "350px", headerHeight: "50px", + sideNav: { + maxWidth: 250, + minWidth: 50, + bgColor: Colors.OXFORD_BLUE, + fontColor: Colors.WHITE, + }, }; export { css, createGlobalStyle, keyframes, ThemeProvider }; diff --git a/app/client/src/constants/ReduxActionConstants.tsx b/app/client/src/constants/ReduxActionConstants.tsx index ee0d8af3b7..f715746e06 100644 --- a/app/client/src/constants/ReduxActionConstants.tsx +++ b/app/client/src/constants/ReduxActionConstants.tsx @@ -59,7 +59,13 @@ export const ReduxActionTypes: { [key: string]: string } = { FETCH_PUBLISHED_PAGE_SUCCESS: "FETCH_PUBLISHED_PAGE_SUCCESS", PUBLISH_APPLICATION_INIT: "PUBLISH_APPLICATION_INIT", PUBLISH_APPLICATION_SUCCESS: "PUBLISH_APPLICATION_SUCCESS", + CREATE_PAGE_INIT: "CREATE_PAGE_INIT", + CREATE_PAGE_SUCCESS: "CREATE_PAGE_SUCCESS", + FETCH_PAGE_LIST_INIT: "FETCH_PAGE_LIST_INIT", + FETCH_PAGE_LIST_SUCCESS: "FETCH_PAGE_LIST_SUCCESS", + INITIALIZE_PAGE_VIEWER: "INITIALIZE_PAGE_VIEWER", }; + export type ReduxActionType = (typeof ReduxActionTypes)[keyof typeof ReduxActionTypes]; export const ReduxActionErrorTypes: { [key: string]: string } = { @@ -84,6 +90,8 @@ export const ReduxActionErrorTypes: { [key: string]: string } = { CREATE_RESOURCE_ERROR: "CREATE_RESOURCE_ERROR", FETCH_PUBLISHED_PAGE_ERROR: "FETCH_PUBLISHED_PAGE_ERROR", PUBLISH_APPLICATION_ERROR: "PUBLISH_APPLICATION_ERROR", + CREATE_PAGE_ERROR: "CREATE_PAGE_ERROR", + FETCH_PAGE_LIST_ERROR: "FETCH_PAGE_LIST_ERROR", }; export type ReduxActionErrorType = (typeof ReduxActionErrorTypes)[keyof typeof ReduxActionErrorTypes]; @@ -107,18 +115,18 @@ export interface UpdateCanvasPayload { currentApplicationId: string; } -export interface LayoutPayload { - layoutId: string; - pageId: string; - widgets: { [widgetId: string]: WidgetProps }; -} - export interface ShowPropertyPanePayload { widgetId: string; node: RefObject; toggle: boolean; } +export type PageListPayload = Array<{ + pageName: string; + pageId: string; + layoutId: string; +}>; + // export interface LoadAPIResponsePayload extends ExecuteActionResponse {} // export interface LoadQueryResponsePayload extends ExecuteActionResponse {} diff --git a/app/client/src/constants/routes.ts b/app/client/src/constants/routes.ts index 4dfe230d1c..ed067e509a 100644 --- a/app/client/src/constants/routes.ts +++ b/app/client/src/constants/routes.ts @@ -5,6 +5,7 @@ export const LOGIN_URL = "/login"; export const BUILDER_URL = "/builder"; export const API_EDITOR_URL = `${BUILDER_URL}/api`; export const API_EDITOR_ID_URL = (id = ":id") => `${API_EDITOR_URL}/${id}`; +export const APP_VIEW_URL = `/view/pages/:pageId`; export const EDITOR_ROUTES = [ { diff --git a/app/client/src/index.tsx b/app/client/src/index.tsx index efe425f0df..b9bcc61696 100755 --- a/app/client/src/index.tsx +++ b/app/client/src/index.tsx @@ -6,6 +6,7 @@ import App from "./App"; import Editor from "./pages/Editor"; import PageNotFound from "./pages/common/PageNotFound"; import LoginPage from "./pages/common/LoginPage"; +import AppViewer from "./pages/AppViewer"; import * as serviceWorker from "./serviceWorker"; import { Router, Route, Switch } from "react-router-dom"; import { createStore, applyMiddleware } from "redux"; @@ -20,7 +21,12 @@ import HTML5Backend from "react-dnd-html5-backend"; import { appInitializer } from "./utils/AppsmithUtils"; import ProtectedRoute from "./pages/common/ProtectedRoute"; import { composeWithDevTools } from "redux-devtools-extension/logOnlyInProduction"; -import { BASE_URL, BUILDER_URL, LOGIN_URL } from "./constants/routes"; +import { + BASE_URL, + BUILDER_URL, + LOGIN_URL, + APP_VIEW_URL, +} from "./constants/routes"; appInitializer(); const sagaMiddleware = createSagaMiddleware(); @@ -37,6 +43,7 @@ ReactDOM.render( + diff --git a/app/client/src/mockResponses/WidgetSidebarResponse.tsx b/app/client/src/mockResponses/WidgetSidebarResponse.tsx index 83084e279a..36af23f569 100644 --- a/app/client/src/mockResponses/WidgetSidebarResponse.tsx +++ b/app/client/src/mockResponses/WidgetSidebarResponse.tsx @@ -1,5 +1,6 @@ import { WidgetCardProps } from "../widgets/BaseWidget"; import { generateReactKey } from "../utils/generators"; +/* eslint-disable no-useless-computed-key */ const WidgetSidebarResponse: { [id: string]: WidgetCardProps[]; diff --git a/app/client/src/pages/AppViewer/AppPage.tsx b/app/client/src/pages/AppViewer/AppPage.tsx new file mode 100644 index 0000000000..a75b8cf68e --- /dev/null +++ b/app/client/src/pages/AppViewer/AppPage.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import styled from "styled-components"; +import { WidgetProps } from "../../widgets/BaseWidget"; +import { RenderModes } from "../../constants/WidgetConstants"; +import WidgetFactory from "../../utils/WidgetFactory"; +import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; + +const PageView = styled.div` + flex-grow: 1; +`; + +type AppPageProps = { + dsl: ContainerWidgetProps; +}; + +export const AppPage = (props: AppPageProps) => { + return ( + + {props.dsl.widgetId && + WidgetFactory.createWidget(props.dsl, RenderModes.PAGE)} + + ); +}; + +export default AppPage; diff --git a/app/client/src/pages/AppViewer/index.tsx b/app/client/src/pages/AppViewer/index.tsx new file mode 100644 index 0000000000..602a1d075c --- /dev/null +++ b/app/client/src/pages/AppViewer/index.tsx @@ -0,0 +1,117 @@ +import React, { Component } from "react"; +import styled from "styled-components"; +import { connect } from "react-redux"; +import { withRouter } from "react-router"; +import { AppState } from "../../reducers"; +import { + ReduxActionTypes, + PageListPayload, +} from "../../constants/ReduxActionConstants"; +import { + getCurrentPageId, + getCurrentPageLayoutDSL, + getPageList, +} from "../../selectors/appViewSelectors"; +import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; +import { WidgetProps } from "../../widgets/BaseWidget"; +import { executeAction } from "../../actions/widgetActions"; +import { ActionPayload } from "../../constants/ActionConstants"; +import AppPage from "./AppPage"; +import SideNav, { SideNavItem } from "../../components/viewer/SideNav"; +import AppViewerHeader from "../../components/viewer/AppViewerHeader"; + +const AppViewWrapper = styled.div` + margin-top: ${props => props.theme.headerHeight}; + background: white; +`; +const AppViewerBody = styled.section` + display: flex; + flex-direction: row; + align-items: stretch; + justify-content: flex-start; +`; +export type AppViewerProps = { + currentPageId?: string; + currentLayoutId?: string; + executeAction: Function; + fetchPageWidgets: Function; + pages?: PageListPayload; + dsl?: ContainerWidgetProps; + initializeAppViewer: Function; + match: any; + location: any; + history: any; +}; + +class AppViewer extends Component { + handlePageSelect = (item: SideNavItem) => { + this.props.fetchPageWidgets(item.id); + }; + + componentDidMount() { + this.props.initializeAppViewer(this.props.currentPageId); + } + + public render() { + const items: SideNavItem[] | undefined = + this.props.pages && + this.props.pages.map(page => ({ + text: page.pageName, + id: page.pageId, + })); + + const currentPage = + this.props.pages && + this.props.pages.find(page => page.pageId === this.props.currentPageId); + return ( + + + + {items && ( + + )} + {this.props.dsl && } + + + ); + } +} + +const mapStateToProps = (state: AppState, props: AppViewerProps) => ({ + currentPageId: getCurrentPageId(state, props), + dsl: getCurrentPageLayoutDSL(state), + pages: getPageList(state), +}); + +const mapDispatchToProps = (dispatch: any) => ({ + executeAction: (actionPayloads?: ActionPayload[]) => + dispatch(executeAction(actionPayloads)), + fetchPageWidgets: (pageId: string) => + dispatch({ + type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_INIT, + payload: { + pageId, + }, + }), + initializeAppViewer: (pageId: string) => + dispatch({ + type: ReduxActionTypes.INITIALIZE_PAGE_VIEWER, + payload: { pageId }, + }), +}); + +export default withRouter( + connect( + mapStateToProps, + mapDispatchToProps, + )(AppViewer), +); diff --git a/app/client/src/pages/Editor/Canvas.tsx b/app/client/src/pages/Editor/Canvas.tsx index 3eab9a956b..0495e19f85 100644 --- a/app/client/src/pages/Editor/Canvas.tsx +++ b/app/client/src/pages/Editor/Canvas.tsx @@ -1,17 +1,10 @@ import React, { createContext, useState, Context } from "react"; -import styled from "styled-components"; import WidgetFactory from "../../utils/WidgetFactory"; import { RenderModes } from "../../constants/WidgetConstants"; import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; import { WidgetProps } from "../../widgets/BaseWidget"; import PropertyPane from "./PropertyPane"; - -const ArtBoard = styled.div` - width: 100%; - height: 100%; - position: relative; - overflow: auto; -`; +import ArtBoard from "../common/ArtBoard"; interface CanvasProps { dsl: ContainerWidgetProps; diff --git a/app/client/src/pages/Editor/EditorHeader.tsx b/app/client/src/pages/Editor/EditorHeader.tsx index 5c6a5080da..1be145a929 100644 --- a/app/client/src/pages/Editor/EditorHeader.tsx +++ b/app/client/src/pages/Editor/EditorHeader.tsx @@ -1,6 +1,9 @@ import React from "react"; import styled from "styled-components"; import { Breadcrumbs, IBreadcrumbProps, Spinner } from "@blueprintjs/core"; +import DropdownComponent from "../../components/editor/DropdownComponent"; +import { PageListPayload } from "../../constants/ReduxActionConstants"; +import { DropdownOption } from "../../common/DropdownOption"; import { BaseButton } from "../../components/blueprint/ButtonComponent"; const Header = styled.header` @@ -14,6 +17,10 @@ const Header = styled.header` font-size: ${props => props.theme.fontSizes[1]}px; `; +const PageSelector = styled(DropdownComponent)` + flex: 2; +`; + const NotificationText = styled.div` display: flex; justify-content: space-evenly; @@ -25,11 +32,11 @@ const PreviewPublishSection = styled.div` display: flex; justify-content: space-evenly; align-items: center; - flex-grow: 1; + flex-shrink: 1; `; const StretchedBreadCrumb = styled(Breadcrumbs)` - flex-grow: 10; + flex-shrink: 1; * { font-family: ${props => props.theme.fonts[0]}; font-size: ${props => props.theme.fontSizes[2]}px; @@ -43,33 +50,58 @@ type EditorHeaderProps = { notificationText?: string; pageName: string; onPublish: React.FormEventHandler; - onPreview: React.FormEventHandler; + onCreatePage: (name: string) => void; + pages?: PageListPayload; + currentPageId: string; + switchToPage: (selectedPage: string) => void; + isPublishing: boolean; }; export const EditorHeader = (props: EditorHeaderProps) => { const navigation: IBreadcrumbProps[] = [ { href: "#", icon: "folder-close", text: "appsmith-dev" }, { href: "#", icon: "folder-close", text: "application" }, - { icon: "page-layout", text: props.pageName, current: true }, + { icon: "page-layout", text: "", current: true }, ]; + const pageList: + | Array<{ + label: string; + value: string; + }> + | undefined = + props.pages && + props.pages.map((page: { pageName: string; pageId: string }) => ({ + label: page.pageName, + value: page.pageId, + })); + + const selectedPage: DropdownOption | undefined = + pageList && pageList.find(page => page.value === props.currentPageId); + return (
+ {pageList && ( + + )} {props.notificationText && } {props.notificationText} - diff --git a/app/client/src/pages/Editor/Sidebar.tsx b/app/client/src/pages/Editor/Sidebar.tsx index 2875c1bfb1..c0de26fea3 100644 --- a/app/client/src/pages/Editor/Sidebar.tsx +++ b/app/client/src/pages/Editor/Sidebar.tsx @@ -9,7 +9,6 @@ const Wrapper = styled.div` grid-template-columns: 1fr 4fr; width: ${props => props.theme.sidebarWidth}; box-shadow: 0px 1px 3px ${props => props.theme.colors.paneBG}; - z-index: 30; `; const NavBar = styled.div` diff --git a/app/client/src/pages/Editor/WidgetsEditor.tsx b/app/client/src/pages/Editor/WidgetsEditor.tsx index 8a0150cd82..0e9718a3b1 100644 --- a/app/client/src/pages/Editor/WidgetsEditor.tsx +++ b/app/client/src/pages/Editor/WidgetsEditor.tsx @@ -18,7 +18,6 @@ import { getCurrentPageId, getDenormalizedDSL, getCurrentPageName, - getPageWidgetId, } from "../../selectors/editorSelectors"; import { RenderModes } from "../../constants/WidgetConstants"; import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; @@ -120,7 +119,6 @@ class WidgetsEditor extends React.Component { const mapStateToProps = (state: AppState) => { return { dsl: getDenormalizedDSL(state), - pageWidgetId: getPageWidgetId(state), currentPageId: getCurrentPageId(state), currentLayoutId: getCurrentLayoutId(state), currentPageName: getCurrentPageName(state), diff --git a/app/client/src/pages/Editor/index.tsx b/app/client/src/pages/Editor/index.tsx index 7ee6663a1a..41bdf64570 100644 --- a/app/client/src/pages/Editor/index.tsx +++ b/app/client/src/pages/Editor/index.tsx @@ -7,8 +7,16 @@ import { getCurrentApplicationId, getCurrentLayoutId, getCurrentPageId, + getPageList, + getIsPublishingApplication, + getPublishingError, + getIsPageSaving, } from "../../selectors/editorSelectors"; -import { ReduxActionTypes } from "../../constants/ReduxActionConstants"; +import { + ReduxActionTypes, + PageListPayload, +} from "../../constants/ReduxActionConstants"; +import { Dialog, Classes, AnchorButton } from "@blueprintjs/core"; type EditorProps = { currentPageName: string; @@ -18,19 +26,46 @@ type EditorProps = { currentPageId: string; publishApplication: Function; previewPage: Function; + createPage: Function; + fetchPageList: Function; + pages: PageListPayload; + switchPage: (pageId: string) => void; + isPublishing: boolean; + errorPublishing: boolean; }; class Editor extends Component { - handlePublish = () => { - if (this.props.currentApplicationId) - this.props.publishApplication(this.props.currentApplicationId); + public state = { + isDialogOpen: false, }; - handlePreview = () => { - this.props.previewPage( - this.props.currentPageId, - this.props.currentLayoutId, - ); - //TODO(abhinav): Add logic to open in a different tab. + + componentDidMount() { + this.props.fetchPageList(); + } + componentDidUpdate(currently: EditorProps) { + const previously = this.props; + if ( + !currently.isPublishing && + previously.isPublishing && + !currently.errorPublishing + ) { + this.setState({ + isDialogOpen: true, + }); + } + } + handleDialogClose = () => { + this.setState({ + isDialogOpen: false, + }); + }; + handlePublish = () => { + if (this.props.currentApplicationId) { + this.props.publishApplication(this.props.currentApplicationId); + } + }; + handleCreatePage = (pageName: string) => { + this.props.createPage(this.props.currentApplicationId, pageName); }; public render() { return ( @@ -39,9 +74,37 @@ class Editor extends Component { notificationText={this.props.isSaving ? "Saving page..." : undefined} pageName={this.props.currentPageName} onPublish={this.handlePublish} - onPreview={this.handlePreview} + onCreatePage={this.handleCreatePage} + pages={this.props.pages} + currentPageId={this.props.currentPageId} + switchToPage={this.props.switchPage} + isPublishing={this.props.isPublishing} /> + +
+

+ Your awesome application is now published with the current + changes! +

+
+
+
+ +
+
+
); } @@ -49,10 +112,13 @@ class Editor extends Component { const mapStateToProps = (state: AppState) => ({ currentPageName: state.ui.editor.currentPageName, - isSaving: state.ui.editor.isSaving, + isSaving: getIsPageSaving(state), currentApplicationId: getCurrentApplicationId(state), currentPageId: getCurrentPageId(state), currentLayoutId: getCurrentLayoutId(state), + pages: getPageList(state), + errorPublishing: getPublishingError(state), + isPublishing: getIsPublishingApplication(state), }); const mapDispatchToProps = (dispatch: any) => { @@ -74,6 +140,28 @@ const mapDispatchToProps = (dispatch: any) => { }, }); }, + createPage: (applicationId: string, name: string) => { + dispatch({ + type: ReduxActionTypes.CREATE_PAGE_INIT, + payload: { + applicationId, + name, + }, + }); + }, + fetchPageList: () => { + dispatch({ + type: ReduxActionTypes.FETCH_PAGE_LIST_INIT, + }); + }, + switchPage: (pageId: string) => { + dispatch({ + type: ReduxActionTypes.FETCH_PAGE, + payload: { + pageId, + }, + }); + }, }; }; diff --git a/app/client/src/pages/common/ArtBoard.tsx b/app/client/src/pages/common/ArtBoard.tsx new file mode 100644 index 0000000000..abbb18a422 --- /dev/null +++ b/app/client/src/pages/common/ArtBoard.tsx @@ -0,0 +1,8 @@ +import styled from "styled-components"; + +export default styled.div` + width: 100%; + height: 100%; + position: relative; + overflow: auto; +`; diff --git a/app/client/src/propertyControls/DropDownControl.tsx b/app/client/src/propertyControls/DropDownControl.tsx index 002b0e8db5..278686a29b 100644 --- a/app/client/src/propertyControls/DropDownControl.tsx +++ b/app/client/src/propertyControls/DropDownControl.tsx @@ -4,6 +4,7 @@ import { ControlType } from "../constants/PropertyControlConstants"; import { Button, MenuItem } from "@blueprintjs/core"; import { IItemRendererProps } from "@blueprintjs/select"; import { ControlWrapper, StyledDropDown } from "./StyledControls"; +import DropdownOption from "../common/DropdownOption"; class DropDownControl extends BaseControl { render() { @@ -52,11 +53,6 @@ class DropDownControl extends BaseControl { } } -export interface DropdownOption { - label: string; - value: string; -} - export interface DropDownControlProps extends ControlProps { options: DropdownOption[]; } diff --git a/app/client/src/propertyControls/StyledControls.tsx b/app/client/src/propertyControls/StyledControls.tsx index aa359dfb24..c3eeebcdb2 100644 --- a/app/client/src/propertyControls/StyledControls.tsx +++ b/app/client/src/propertyControls/StyledControls.tsx @@ -2,6 +2,7 @@ import styled from "styled-components"; import { Select } from "@blueprintjs/select"; import { Switch, InputGroup } from "@blueprintjs/core"; import { ContainerOrientation } from "../constants/WidgetConstants"; +import DropdownOption from "../common/DropdownOption"; type ControlWrapperProps = { orientation?: ContainerOrientation; @@ -25,7 +26,7 @@ export const ControlWrapper = styled.div` } `; -const DropDown = Select.ofType<{ label: string; value: string }>(); +const DropDown = Select.ofType(); export const StyledDropDown = styled(DropDown)` &&& button { background: ${props => props.theme.colors.paneInputBG}; diff --git a/app/client/src/reducers/entityReducers/propertyPaneConfigReducer.tsx b/app/client/src/reducers/entityReducers/propertyPaneConfigReducer.tsx index 30de4c72fc..6b2c800c5c 100644 --- a/app/client/src/reducers/entityReducers/propertyPaneConfigReducer.tsx +++ b/app/client/src/reducers/entityReducers/propertyPaneConfigReducer.tsx @@ -44,7 +44,7 @@ export interface PropertyPaneConfigState { configVersion: number; } /** - * Todo: Remove hardcoding of config response + * TODO: Remove hardcoding of config response */ const propertyPaneConfigReducer = createReducer(initialState, { @@ -53,7 +53,6 @@ const propertyPaneConfigReducer = createReducer(initialState, { action: ReduxAction, ) => { return { ...PropertyPaneConfigResponse }; - return { ...action.payload }; }, }); diff --git a/app/client/src/reducers/index.tsx b/app/client/src/reducers/index.tsx index 3bb1e04e9a..acfc1110ac 100644 --- a/app/client/src/reducers/index.tsx +++ b/app/client/src/reducers/index.tsx @@ -13,6 +13,7 @@ import { PropertyPaneReduxState } from "./uiReducers/propertyPaneReducer"; import { WidgetConfigReducerState } from "./entityReducers/widgetConfigReducer"; import { WidgetSidebarReduxState } from "./uiReducers/widgetSidebarReducer"; import { ResourceDataState } from "./entityReducers/resourcesReducer"; +import { AppViewReduxState } from "./uiReducers/appViewReducer"; const appReducer = combineReducers({ entities: entityReducer, @@ -28,6 +29,7 @@ export interface AppState { editor: EditorReduxState; propertyPane: PropertyPaneReduxState; errors: ErrorReduxState; + view: AppViewReduxState; }; entities: { canvasWidgets: CanvasWidgetsReduxState; diff --git a/app/client/src/reducers/uiReducers/appViewReducer.tsx b/app/client/src/reducers/uiReducers/appViewReducer.tsx new file mode 100644 index 0000000000..b54f031e1a --- /dev/null +++ b/app/client/src/reducers/uiReducers/appViewReducer.tsx @@ -0,0 +1,54 @@ +import { createReducer } from "../../utils/AppsmithUtils"; +import { WidgetProps } from "../../widgets/BaseWidget"; +import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; +import { + ReduxAction, + ReduxActionTypes, + PageListPayload, +} from "../../constants/ReduxActionConstants"; + +const initialState: AppViewReduxState = { + isFetchingPage: false, + pages: [], +}; + +const appViewReducer = createReducer(initialState, { + [ReduxActionTypes.FETCH_PAGE_LIST_SUCCESS]: ( + state: AppViewReduxState, + action: ReduxAction, + ) => { + return { ...state, pages: action.payload }; + }, + [ReduxActionTypes.FETCH_PUBLISHED_PAGE_INIT]: (state: AppViewReduxState) => { + return { ...state, isFetchingPage: true }; + }, + [ReduxActionTypes.FETCH_PUBLISHED_PAGE_ERROR]: (state: AppViewReduxState) => { + return { ...state, isFetchingPage: false }; + }, + [ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS]: ( + state: AppViewReduxState, + action: ReduxAction<{ + pageId: string; + layoutId: string; + dsl: ContainerWidgetProps; + }>, + ) => { + return { + ...state, + dsl: action.payload.dsl, + currentPageId: action.payload.pageId, + currentLayoutId: action.payload.layoutId, + isFetchingPage: false, + }; + }, +}); + +export interface AppViewReduxState { + dsl?: ContainerWidgetProps; + isFetchingPage: boolean; + currentPageId?: string; + currentLayoutId?: string; + pages: PageListPayload; +} + +export default appViewReducer; diff --git a/app/client/src/reducers/uiReducers/editorReducer.tsx b/app/client/src/reducers/uiReducers/editorReducer.tsx index 06e59d0c8f..56a667878e 100644 --- a/app/client/src/reducers/uiReducers/editorReducer.tsx +++ b/app/client/src/reducers/uiReducers/editorReducer.tsx @@ -6,21 +6,59 @@ import { ContainerWidgetProps } from "../../widgets/ContainerWidget"; import { ReduxAction, UpdateCanvasPayload, + PageListPayload, } from "../../constants/ReduxActionConstants"; const editorConfigs = getEditorConfigs(); const initialState: EditorReduxState = { pageWidgetId: "0", ...editorConfigs, - isSaving: false, + pages: [], + loadingStates: { + publishing: false, + publishingError: false, + saving: false, + savingError: false, + }, }; const editorReducer = createReducer(initialState, { + [ReduxActionTypes.PUBLISH_APPLICATION_INIT]: (state: EditorReduxState) => { + state.loadingStates.publishing = true; + state.loadingStates.publishingError = false; + return { ...state }; + }, + [ReduxActionTypes.PUBLISH_APPLICATION_ERROR]: (state: EditorReduxState) => { + state.loadingStates.publishing = false; + state.loadingStates.publishingError = true; + return { ...state }; + }, + [ReduxActionTypes.PUBLISH_APPLICATION_SUCCESS]: (state: EditorReduxState) => { + state.loadingStates.publishing = false; + state.loadingStates.publishingError = false; + return { ...state }; + }, + [ReduxActionTypes.FETCH_PAGE_LIST_SUCCESS]: ( + state: EditorReduxState, + action: ReduxAction, + ) => { + return { ...state, pages: action.payload }; + }, + [ReduxActionTypes.CREATE_PAGE_SUCCESS]: ( + state: EditorReduxState, + action: ReduxAction<{ pageName: string; pageId: string; layoutId: string }>, + ) => { + state.pages.push(action.payload); + return { ...state }; + }, [ReduxActionTypes.SAVE_PAGE_INIT]: (state: EditorReduxState) => { - return { ...state, isSaving: true }; + state.loadingStates.saving = true; + state.loadingStates.savingError = false; + return { ...state }; }, [ReduxActionTypes.SAVE_PAGE_SUCCESS]: (state: EditorReduxState) => { - return { ...state, isSaving: false }; + state.loadingStates.saving = false; + return { ...state }; }, [ReduxActionTypes.UPDATE_CANVAS]: ( state: EditorReduxState, @@ -33,6 +71,8 @@ const editorReducer = createReducer(initialState, { pageWidgetId, currentApplicationId, } = action.payload; + state.loadingStates.publishing = false; + state.loadingStates.publishingError = false; return { ...state, currentPageId, @@ -52,7 +92,13 @@ export interface EditorReduxState { currentPageName: string; propertyPaneConfigsId: string; currentApplicationId?: string; - isSaving: boolean; + pages: PageListPayload; + loadingStates: { + saving: boolean; + savingError: boolean; + publishing: boolean; + publishingError: boolean; + }; } export default editorReducer; diff --git a/app/client/src/reducers/uiReducers/index.tsx b/app/client/src/reducers/uiReducers/index.tsx index 66de037705..a40c36a57d 100644 --- a/app/client/src/reducers/uiReducers/index.tsx +++ b/app/client/src/reducers/uiReducers/index.tsx @@ -2,6 +2,7 @@ import { combineReducers } from "redux"; import editorReducer from "./editorReducer"; import errorReducer from "./errorReducer"; import propertyPaneReducer from "./propertyPaneReducer"; +import appViewReducer from "./appViewReducer"; import { widgetSidebarReducer } from "./widgetSidebarReducer"; const uiReducer = combineReducers({ @@ -9,5 +10,6 @@ const uiReducer = combineReducers({ editor: editorReducer, errors: errorReducer, propertyPane: propertyPaneReducer, + view: appViewReducer, }); export default uiReducer; diff --git a/app/client/src/sagas/PageSagas.tsx b/app/client/src/sagas/PageSagas.tsx index 2c6d985295..7f81662bb6 100644 --- a/app/client/src/sagas/PageSagas.tsx +++ b/app/client/src/sagas/PageSagas.tsx @@ -4,7 +4,7 @@ import { ReduxActionErrorTypes, ReduxAction, UpdateCanvasPayload, - LayoutPayload, + PageListPayload, } from "../constants/ReduxActionConstants"; import { updateCanvas, savePageSuccess } from "../actions/pageActions"; import PageApi, { @@ -14,6 +14,8 @@ import PageApi, { SavePageRequest, FetchPublishedPageRequest, FetchPublishedPageResponse, + CreatePageRequest, + FetchPageListResponse, } from "../api/PageApi"; import { FlattenedWidgetProps } from "../reducers/entityReducers/canvasWidgetsReducer"; import { @@ -24,11 +26,63 @@ import { takeEvery, all, } from "redux-saga/effects"; +import { getPageLayoutId } from "./selectors"; import { extractCurrentDSL } from "../utils/WidgetPropsUtils"; import { getEditorConfigs, getWidgets } from "./selectors"; import { validateResponse } from "./ErrorSagas"; +export function* fetchPageListSaga() { + try { + const response: FetchPageListResponse = yield call(PageApi.fetchPageList); + const isValidResponse = yield validateResponse(response); + if (isValidResponse) { + const pageList: PageListPayload = response.data.map(page => ({ + pageName: page.name, + pageId: page.id, + layoutId: page.layouts[0].id, + })); + yield put({ + type: ReduxActionTypes.FETCH_PAGE_LIST_SUCCESS, + payload: pageList, + }); + return; + } + } catch (error) { + yield put({ + type: ReduxActionErrorTypes.FETCH_PAGE_LIST_ERROR, + payload: { + error, + }, + }); + } +} +//TODO(abhinav): Probably not the best place for this particular saga +export function* initializeAppViewerSaga( + action: ReduxAction<{ pageId: string }>, +) { + yield* fetchPageListSaga(); + yield put({ + type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_INIT, + payload: action.payload, + }); +} +const getCanvasWidgetsPayload = ( + pageResponse: FetchPageResponse, +): UpdateCanvasPayload => { + const normalizedResponse = CanvasWidgetsNormalizer.normalize( + extractCurrentDSL(pageResponse), + ); + return { + pageWidgetId: normalizedResponse.result, + currentPageName: pageResponse.data.name, + currentPageId: pageResponse.data.id, + widgets: normalizedResponse.entities.canvasWidgets, + currentLayoutId: pageResponse.data.layouts[0].id, // TODO(abhinav): Handle for multiple layouts + currentApplicationId: pageResponse.data.applicationId, + }; +}; + export function* fetchPageSaga( pageRequestAction: ReduxAction, ) { @@ -40,17 +94,7 @@ export function* fetchPageSaga( ); const isValidResponse = yield validateResponse(fetchPageResponse); if (isValidResponse) { - const normalizedResponse = CanvasWidgetsNormalizer.normalize( - extractCurrentDSL(fetchPageResponse), - ); - const canvasWidgetsPayload: UpdateCanvasPayload = { - pageWidgetId: normalizedResponse.result, - currentPageName: fetchPageResponse.data.name, - currentPageId: fetchPageResponse.data.id, - widgets: normalizedResponse.entities.canvasWidgets, - currentLayoutId: fetchPageResponse.data.layouts[0].id, // TODO(abhinav): Handle for multiple layouts - currentApplicationId: fetchPageResponse.data.applicationId, - }; + const canvasWidgetsPayload = getCanvasWidgetsPayload(fetchPageResponse); yield all([ put(updateCanvas(canvasWidgetsPayload)), put({ @@ -70,28 +114,28 @@ export function* fetchPageSaga( } export function* fetchPublishedPageSaga( - pageRequestAction: ReduxAction, + pageRequestAction: ReduxAction<{ pageId: string }>, ) { try { - const request: FetchPublishedPageRequest = pageRequestAction.payload; + const { pageId } = pageRequestAction.payload; + const layoutId: string = yield select(getPageLayoutId, pageId); + const request: FetchPublishedPageRequest = { + pageId, + layoutId, + }; const response: FetchPublishedPageResponse = yield call( PageApi.fetchPublishedPage, request, ); const isValidResponse = yield validateResponse(response); if (isValidResponse) { - const normalizedResponse = CanvasWidgetsNormalizer.normalize( - response.data.dsl, - ); - const layoutPayload: LayoutPayload = { - widgets: normalizedResponse, - layoutId: response.data.id, - pageId: request.pageId, - }; - yield put({ - type: ReduxActionTypes.FETCH_PUBLISED_PAGE_SUCCESS, - payload: layoutPayload, + type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS, + payload: { + dsl: response.data.dsl, + layoutId: response.data.id, + pageId: request.pageId, + }, }); } } catch (error) { @@ -160,7 +204,7 @@ export function* saveLayoutSaga( } // TODO(abhinav): This has redundant code. The only thing different here is the lack of state update. -// For now this is fire and forget. +// For now, this is fire and forget. export function* asyncSaveLayout() { try { const widgets = yield select(getWidgets); @@ -189,6 +233,35 @@ export function* asyncSaveLayout() { } } +export function* createPageSaga( + createPageAction: ReduxAction, +) { + try { + const request: CreatePageRequest = createPageAction.payload; + const response: FetchPageResponse = yield call(PageApi.createPage, request); + const isValidResponse = yield validateResponse(response); + if (isValidResponse) { + const canvasPayload = getCanvasWidgetsPayload(response); + yield put({ + type: ReduxActionTypes.CREATE_PAGE_SUCCESS, + payload: { + pageId: response.data.id, + pageName: response.data.name, + layoutId: response.data.layouts[0].id, + }, + }); + yield put(updateCanvas(canvasPayload)); + } + } catch (error) { + yield put({ + type: ReduxActionErrorTypes.CREATE_PAGE_ERROR, + payload: { + error, + }, + }); + } +} + export default function* pageSagas() { yield all([ takeLatest(ReduxActionTypes.FETCH_PAGE, fetchPageSaga), @@ -201,5 +274,11 @@ export default function* pageSagas() { // No need to save layout everytime a property is updated. // We save the latest request to update layout. takeLatest(ReduxActionTypes.UPDATE_WIDGET_PROPERTY, asyncSaveLayout), + takeLatest(ReduxActionTypes.CREATE_PAGE_INIT, createPageSaga), + takeLatest(ReduxActionTypes.FETCH_PAGE_LIST_INIT, fetchPageListSaga), + takeLatest( + ReduxActionTypes.INITIALIZE_PAGE_VIEWER, + initializeAppViewerSaga, + ), ]); } diff --git a/app/client/src/sagas/selectors.tsx b/app/client/src/sagas/selectors.tsx index 86fa24db4c..2fff269102 100644 --- a/app/client/src/sagas/selectors.tsx +++ b/app/client/src/sagas/selectors.tsx @@ -32,3 +32,12 @@ export const getDefaultWidgetConfig = ( delete widgetConfig.columns; return widgetConfig; }; + +export const getPageLayoutId = (state: AppState, pageId: string): string => { + const pages = state.ui.view.pages; + const page = pages.find(page => page.pageId === pageId); + if (!page) { + throw Error("Page not found"); + } + return page.layoutId; +}; diff --git a/app/client/src/selectors/appViewSelectors.tsx b/app/client/src/selectors/appViewSelectors.tsx new file mode 100644 index 0000000000..a5a3e68e08 --- /dev/null +++ b/app/client/src/selectors/appViewSelectors.tsx @@ -0,0 +1,22 @@ +import { createSelector } from "reselect"; +import { AppState } from "../reducers"; +import { AppViewReduxState } from "../reducers/uiReducers/appViewReducer"; +import { AppViewerProps } from "../pages/AppViewer"; + +const getAppViewState = (state: AppState) => state.ui.view; + +export const getCurrentLayoutId = (state: AppState, props: AppViewerProps) => + state.ui.view.currentLayoutId || props.match.params.layoutId; +export const getCurrentPageId = (state: AppState, props: AppViewerProps) => + state.ui.view.currentPageId || props.match.params.pageId; + +// For the viewer, this does not need to be wrapped in createCachedSelector, as it will not change in subsequent renders. +export const getCurrentPageLayoutDSL = createSelector( + getAppViewState, + (view: AppViewReduxState) => view.dsl, +); + +export const getPageList = createSelector( + getAppViewState, + (view: AppViewReduxState) => (view.pages.length > 0 ? view.pages : undefined), +); diff --git a/app/client/src/selectors/editorSelectors.tsx b/app/client/src/selectors/editorSelectors.tsx index 5dbe4e2a44..175c43e5ca 100644 --- a/app/client/src/selectors/editorSelectors.tsx +++ b/app/client/src/selectors/editorSelectors.tsx @@ -13,6 +13,11 @@ const getWidgetConfigs = (state: AppState) => state.entities.widgetConfig; const getEntities = (state: AppState) => state.entities; const getWidgetSideBar = (state: AppState) => state.ui.widgetSidebar; +export const getPageList = createSelector( + getEditorState, + (editor: EditorReduxState) => editor.pages, +); + export const getPropertyPaneConfigsId = createSelector( getEditorState, (editor: EditorReduxState) => editor.propertyPaneConfigsId, @@ -45,7 +50,17 @@ export const getCurrentApplicationId = createSelector( export const getIsPageSaving = createSelector( getEditorState, - (editor: EditorReduxState) => editor.isSaving, + (editor: EditorReduxState) => editor.loadingStates.saving, +); + +export const getIsPublishingApplication = createSelector( + getEditorState, + (editor: EditorReduxState) => editor.loadingStates.publishing, +); + +export const getPublishingError = createSelector( + getEditorState, + (editor: EditorReduxState) => editor.loadingStates.publishingError, ); export const getWidgetCards = createSelector( diff --git a/app/client/src/utils/WidgetPropsUtils.tsx b/app/client/src/utils/WidgetPropsUtils.tsx index f246a7232e..7f9ec3c935 100644 --- a/app/client/src/utils/WidgetPropsUtils.tsx +++ b/app/client/src/utils/WidgetPropsUtils.tsx @@ -36,10 +36,10 @@ const defaultDSL = { export const extractCurrentDSL = ( fetchPageResponse: FetchPageResponse, ): ContainerWidgetProps => { - const currentDSL = fetchPageResponse.data.layouts[0].dsl; + const currentDSL = fetchPageResponse.data.layouts[0].dsl || defaultDSL; currentDSL.rightColumn = 1200; currentDSL.snapColumns = 24; - return currentDSL || defaultDSL; + return currentDSL; }; export const getDropZoneOffsets = ( diff --git a/app/client/src/utils/WidgetRegistry.tsx b/app/client/src/utils/WidgetRegistry.tsx index 31e075b859..6dcce4108b 100644 --- a/app/client/src/utils/WidgetRegistry.tsx +++ b/app/client/src/utils/WidgetRegistry.tsx @@ -63,6 +63,12 @@ class WidgetBuilderRegistry { return ; }, }); + + WidgetFactory.registerWidgetBuilder("DROP_DOWN_WIDGET", { + buildWidget(widgetData: DropdownWidgetProps): JSX.Element { + return ; + }, + }); } } diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 01d3c5ed5b..cf706e2a6a 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -987,25 +987,25 @@ "@emotion/weak-memoize" "0.2.4" "@emotion/core@^10.0.9": - version "10.0.21" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.21.tgz#2e8398d2b92fd90d4ed6ac4d0b66214971de3458" - integrity sha512-U9zbc7ovZ2ceIwbLXYZPJy6wPgnOdTNT4jENZ31ee6v2lojetV5bTbCVk6ciT8G3wQRyVaTTfUCH9WCrMzpRIw== + version "10.0.22" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.22.tgz#2ac7bcf9b99a1979ab5b0a876fbf37ab0688b177" + integrity sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA== dependencies: "@babel/runtime" "^7.5.5" "@emotion/cache" "^10.0.17" - "@emotion/css" "^10.0.14" - "@emotion/serialize" "^0.11.10" + "@emotion/css" "^10.0.22" + "@emotion/serialize" "^0.11.12" "@emotion/sheet" "0.9.3" "@emotion/utils" "0.11.2" -"@emotion/css@^10.0.14", "@emotion/css@^10.0.9": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.14.tgz#95dacabdd0e22845d1a1b0b5968d9afa34011139" - integrity sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg== +"@emotion/css@^10.0.22", "@emotion/css@^10.0.9": + version "10.0.22" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.22.tgz#37b1abb6826759fe8ac0af0ac0034d27de6d1793" + integrity sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA== dependencies: - "@emotion/serialize" "^0.11.8" + "@emotion/serialize" "^0.11.12" "@emotion/utils" "0.11.2" - babel-plugin-emotion "^10.0.14" + babel-plugin-emotion "^10.0.22" "@emotion/hash@0.7.3": version "0.7.3" @@ -1013,9 +1013,9 @@ integrity sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw== "@emotion/is-prop-valid@^0.8.1": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz#cbe62ddbea08aa022cdf72da3971570a33190d29" - integrity sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig== + version "0.8.4" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.4.tgz#cf1dcfc1812c226f05e1ba53592eb6b51e734990" + integrity sha512-QBW8h6wVQgeQ55F52rNaprEJxtVR+/ScOP8/V1ScSpPzKqHdFB9QVqby0Z50sqS8mcaeIl5vR1vQpKwJbIS6NQ== dependencies: "@emotion/memoize" "0.7.3" @@ -1024,10 +1024,10 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.3.tgz#5b6b1c11d6a6dddf1f2fc996f74cf3b219644d78" integrity sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow== -"@emotion/serialize@^0.11.10", "@emotion/serialize@^0.11.11", "@emotion/serialize@^0.11.8": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.11.tgz#c92a5e5b358070a7242d10508143306524e842a4" - integrity sha512-YG8wdCqoWtuoMxhHZCTA+egL0RSGdHEc+YCsmiSBPBEDNuVeMWtjEWtGrhUterSChxzwnWBXvzSxIFQI/3sHLw== +"@emotion/serialize@^0.11.12", "@emotion/serialize@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.14.tgz#56a6d8d04d837cc5b0126788b2134c51353c6488" + integrity sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA== dependencies: "@emotion/hash" "0.7.3" "@emotion/memoize" "0.7.3" @@ -1071,9 +1071,9 @@ integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== "@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.3.2" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.3.2.tgz#91e7188edebc5d876f0b91a860f555ff06f0782b" - integrity sha512-NP5SG4bzix+EtSMtcudp8TvI0lB46mXNo8uFpTDw6tqxGx4z5yx+giIunEFA0Z7oUO4DuWrOJV9xqR2tJVEdyA== + version "8.4.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.4.0.tgz#3f2153d9eea8942dfe217e1642a420f1fe4087f3" + integrity sha512-JLK+vNrtZSQy1PiAAvtaPGiZhFQo+BLywJkD4EHG8vCzlW9w7Y9yfb2be1GFKnZKczLgzHBpgMOBUZs1qBNB5g== "@hapi/joi@^15.0.0": version "15.1.1" @@ -1630,14 +1630,14 @@ integrity sha512-mTdN5Z71smk1+TeqgDF1RhkB+CDCS/CvCm4Iy7gGpheB4tsJVk2hnAhTi6w9v2H0jhixfAMgu1bUkqDA1yuq2Q== "@types/node@*": - version "12.11.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.5.tgz#6c3c8dc84988aff11fd2a63d7b5fbf39eaaab7b1" - integrity sha512-LC8ALj/24PhByn39nr5jnTvpE7MujK8y7LQmV74kHYF5iQ0odCPkMH4IZNZw+cobKfSXqaC8GgegcbIsQpffdA== + version "12.12.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" + integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== "@types/node@^10.12.18": - version "10.14.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.22.tgz#34bcdf6b6cb5fc0db33d24816ad9d3ece22feea4" - integrity sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw== + version "10.17.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.2.tgz#41b5afbcde1a5a805302a4da3cf399499f1bbf64" + integrity sha512-sAh60KDol+MpwOr1RTK0+HgBEYejKsxdpmrOS1Wts5bI03dLzq8F7T0sRXDKeaEK8iWDlGfdzxrzg6vx/c5pNA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1655,16 +1655,16 @@ integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== "@types/react-dom@*", "@types/react-dom@^16.8.0": - version "16.9.2" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.2.tgz#90f9e6c161850be1feb31d2f448121be2a4f3b47" - integrity sha512-hgPbBoI1aTSTvZwo8HYw35UaTldW6n2ETLvHAcfcg1FaOuBV3olmyCe5eMpx2WybWMBPv0MdU2t5GOcQhP+3zA== + version "16.9.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.3.tgz#4006ff0e13958af91313869077c04cb20d9b9d04" + integrity sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg== dependencies: "@types/react" "*" "@types/react-native@*": - version "0.60.21" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.60.21.tgz#81a41cae7b232f52ab3983d854f4a0b0df79531e" - integrity sha512-E7F+P/UG4Utu+kh8Hy544i0m4CzpHw1awNX6hVfkhlu4mXSlAn6KLZzKEkPBbHm7g1kspmZTiuP23HAKZpASPw== + version "0.60.22" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.60.22.tgz#ba199a441cb0612514244ffb1d0fe6f04c878575" + integrity sha512-LTXMKEyGA+x4kadmjujX6yAgpcaZutJ01lC7zLJWCULaZg7Qw5/3iOQpwIJRUcOc+a8A2RR7rSxplehVf9IuhA== dependencies: "@types/prop-types" "*" "@types/react" "*" @@ -1697,9 +1697,9 @@ "@types/react" "*" "@types/react-select@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-3.0.5.tgz#c615c1f7a0ea98e828b469d0f5ddd39ba3f0d319" - integrity sha512-BodHwzj9WU1EWC1j8zx1iyAMDCrTURwdvMpOVvVFwDVU7fvs8Ks9fPTkUY3+BgYbpOJFr21bR3Jib/GonwanAQ== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-3.0.6.tgz#63e06aea611bcb264f4b8af069f11f987cbecb5e" + integrity sha512-vgEbVtwxtdgmaOPXb8HRlO3VgEwlhx8MVW/nB5yI/q3442x31XETy9P1UAoVRhSoYIEa4TuJGJCkKk7Ss3y5Eg== dependencies: "@types/react" "*" "@types/react-dom" "*" @@ -1719,15 +1719,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.2": - version "16.9.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a" - integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg== - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" - -"@types/react@^16.9.2": +"@types/react@*", "@types/react@^16.8.2", "@types/react@^16.9.2": version "16.9.11" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" integrity sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ== @@ -1766,9 +1758,9 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/styled-components@^4.1.8": - version "4.1.19" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-4.1.19.tgz#535b455d7744fda1608c605df82c0800eda61a09" - integrity sha512-nDkoTQ8ItcJiyEvTa24TwsIpIfNKCG+Lq0LvAwApOcjQ8OaeOOCg66YSPHBePHUh6RPt1LA8aEzRlgWhQPFqPg== + version "4.1.20" + resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-4.1.20.tgz#8afd41039c0fd582152e57ff75c58a5353870de6" + integrity sha512-WztLENdKY+H9udccx5ZhAblgTp08NSfOFYdGaWM0MMm+1tEOioYVFwIIQ7Hx+9wWXiWKDXeoX6R3D/i1obnG3g== dependencies: "@types/react" "*" "@types/react-native" "*" @@ -1796,9 +1788,9 @@ source-map "^0.6.1" "@types/webpack@^4.4.19": - version "4.39.5" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.39.5.tgz#3671b65928d9e0c6fcd4adff3f8167d48b174681" - integrity sha512-9twG6D97ao13MBLvigwfBJe6rxtb04UY3TcYHBYkW5sXZjUrNhqIRxLYg74VzK/YAE8xlVhOyd+3Whr7E5RrBA== + version "4.39.7" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.39.7.tgz#50ee509a206f9ab2ff812788efb896250068c659" + integrity sha512-xXNSgKu6KNNEhATLEDRI/T7hT3n3DVOCE1YWFXIP+XSDedRDAGaGTq8fr51Ntb9L0Bpopx9zJuGwK0/sj5my7g== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -1820,39 +1812,39 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.0.0", "@typescript-eslint/eslint-plugin@^2.2.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.5.0.tgz#101d96743ce3365b3223df73d641078c9b775903" - integrity sha512-ddrJZxp5ns1Lh5ofZQYk3P8RyvKfyz/VcRR4ZiJLHO/ljnQAO8YvTfj268+WJOOadn99mvDiqJA65+HAKoeSPA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.0.tgz#e82ed43fc4527b21bfe35c20a2d6e4ed49fc7957" + integrity sha512-iCcXREU4RciLmLniwKLRPCOFVXrkF7z27XuHq5DrykpREv/mz6ztKAyLg2fdkM0hQC7659p5ZF5uStH7uzAJ/w== dependencies: - "@typescript-eslint/experimental-utils" "2.5.0" + "@typescript-eslint/experimental-utils" "2.6.0" eslint-utils "^1.4.2" functional-red-black-tree "^1.0.1" regexpp "^2.0.1" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.5.0.tgz#383a97ded9a7940e5053449f6d73995e782b8fb1" - integrity sha512-UgcQGE0GKJVChyRuN1CWqDW8Pnu7+mVst0aWrhiyuUD1J9c+h8woBdT4XddCvhcXDodTDVIfE3DzGHVjp7tUeQ== +"@typescript-eslint/experimental-utils@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.0.tgz#ed70bef72822bff54031ff0615fc888b9e2b6e8a" + integrity sha512-34BAFpNOwHXeqT+AvdalLxOvcPYnCxA5JGmBAFL64RGMdP0u65rXjii7l/nwpgk5aLEE1LaqF+SsCU0/Cb64xA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.5.0" + "@typescript-eslint/typescript-estree" "2.6.0" eslint-scope "^5.0.0" "@typescript-eslint/parser@^2.0.0", "@typescript-eslint/parser@^2.2.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.5.0.tgz#858030ddd808fbbe88e03f42e5971efaccb8218a" - integrity sha512-9UBMiAwIDWSl79UyogaBdj3hidzv6exjKUx60OuZuFnJf56tq/UMpdPcX09YmGqE8f4AnAueYtBxV8IcAT3jdQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.6.0.tgz#5106295c6a7056287b4719e24aae8d6293d5af49" + integrity sha512-AvLejMmkcjRTJ2KD72v565W4slSrrzUIzkReu1JN34b8JnsEsxx7S9Xx/qXEuMQas0mkdUfETr0j3zOhq2DIqQ== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.5.0" - "@typescript-eslint/typescript-estree" "2.5.0" + "@typescript-eslint/experimental-utils" "2.6.0" + "@typescript-eslint/typescript-estree" "2.6.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.5.0.tgz#40ada624d6217ef092a3a79ed30d947ad4f212ce" - integrity sha512-AXURyF8NcA3IsnbjNX1v9qbwa0dDoY9YPcKYR2utvMHoUcu3636zrz0gRWtVAyxbPCkhyKuGg6WZIyi2Fc79CA== +"@typescript-eslint/typescript-estree@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.0.tgz#d3e9d8e001492e2b9124c4d4bd4e7f03c0fd7254" + integrity sha512-A3lSBVIdj2Gp0lFEL6in2eSPqJ33uAc3Ko+Y4brhjkxzjbzLnwBH22CwsW2sCo+iwogfIyvb56/AJri15H0u5Q== dependencies: debug "^4.1.1" glob "^7.1.4" @@ -2380,16 +2372,16 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.6.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.5.tgz#98f4afe7e93cccf323287515d426019619775e5e" - integrity sha512-rGd50YV8LgwFQ2WQp4XzOTG69u1qQsXn0amww7tjqV5jJuNazgFKYEVItEBngyyvVITKOg20zr2V+9VsrXJQ2g== + version "9.7.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.0.tgz#905ec19e50f04545fe9ff131182cc9ab25246901" + integrity sha512-j2IRvaCfrUxIiZun9ba4mhJ2omhw4OY88/yVzLO+lHhGBumAAK72PgM6gkbSN8iregPOn1ZlxGkmZh2CQ7X4AQ== dependencies: - browserslist "^4.7.0" - caniuse-lite "^1.0.30000999" + browserslist "^4.7.2" + caniuse-lite "^1.0.30001004" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.18" + postcss "^7.0.19" postcss-value-parser "^4.0.2" aws-sign2@~0.7.0: @@ -2485,15 +2477,15 @@ babel-plugin-dynamic-import-node@2.3.0, babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.14: - version "10.0.21" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.21.tgz#9ebeb12edeea3e60a5476b0e07c9868605e65968" - integrity sha512-03o+T6sfVAJhNDcSdLapgv4IeewcFPzxlvBUVdSf7o5PI57ZSxoDvmy+ZulVWSu+rOWAWkEejNcsb29TuzJHbg== +babel-plugin-emotion@^10.0.22: + version "10.0.23" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz#040d40bf61dcab6d31dd6043d10e180240b8515b" + integrity sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@emotion/hash" "0.7.3" "@emotion/memoize" "0.7.3" - "@emotion/serialize" "^0.11.11" + "@emotion/serialize" "^0.11.14" babel-plugin-macros "^2.0.0" babel-plugin-syntax-jsx "^6.18.0" convert-source-map "^1.5.0" @@ -2553,9 +2545,9 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-transform-async-to-promises@^0.8.11: - version "0.8.14" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.14.tgz#8c783aecb1139f39c608f8bb0f5bb69c343c878e" - integrity sha512-BHw2WriDbnLwaaIydAjVeXXKBal0pWlFWxfo0UKL2CTaSorvRocrsTflni/mzIOP8c+EJ8xHqtbre8GbIm4ehQ== + version "0.8.15" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.15.tgz#13b6d8ef13676b4e3c576d3600b85344bb1ba346" + integrity sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ== babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" @@ -2829,14 +2821,14 @@ browserslist@4.7.0: electron-to-chromium "^1.3.247" node-releases "^1.1.29" -browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7.0, browserslist@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.1.tgz#bd400d1aea56538580e8c4d5f1c54ac11b5ab468" - integrity sha512-QtULFqKIAtiyNx7NhZ/p4rB8m3xDozVo/pi5VgTlADLF2tNigz/QH+v0m5qhn7XfHT7u+607NcCNOnC0HZAlMg== +browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== dependencies: - caniuse-lite "^1.0.30000999" - electron-to-chromium "^1.3.284" - node-releases "^1.1.36" + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" bs-logger@0.x: version "0.2.6" @@ -3017,10 +3009,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.30000989, caniuse-lite@^1.0.30000999: - version "1.0.30001002" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001002.tgz#ba999a737b1abd5bf0fd47efe43a09b9cadbe9b0" - integrity sha512-pRuxPE8wdrWmVPKcDmJJiGBxr6lFJq4ivdSeo9FTmGj5Rb8NX3Mby2pARG57MXF15hYAhZ0nHV5XxT2ig4bz3g== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001004: + version "1.0.30001006" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" + integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== capture-exit@^2.0.0: version "2.0.0" @@ -3142,6 +3134,13 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-spinners@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" @@ -3367,11 +3366,9 @@ connect-history-api-fallback@^1.3.0: integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -3440,11 +3437,11 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.1.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.3.tgz#82642808cf484a35292b2f8e83ef9376884e760f" - integrity sha512-GNZkENsx5pMnS7Inwv7ZO/s3B68a9WU5kIjxqrD/tkNR8mtfXJRk8fAKRlbvWZSGPc59/TkiOBDYl5Cb65pTVA== + version "3.3.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.5.tgz#7abf70778b73dc74aa99d4075aefcd99b76f2c3a" + integrity sha512-44ZORuapx0MUht0MUk0p9lcQPh7n/LDXehimTmjCs0CYblpKZcqVd5w0OQDUDq5OQjEbazWObHDQJWvvHYPNTg== dependencies: - browserslist "^4.7.1" + browserslist "^4.7.2" semver "^6.3.0" core-js@3.2.1: @@ -3655,21 +3652,13 @@ css-to-react-native@^2.2.2: css-color-keywords "^1.0.0" postcss-value-parser "^3.3.0" -css-tree@1.0.0-alpha.29: - version "1.0.0-alpha.29" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" - integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-tree@1.0.0-alpha.33: - version "1.0.0-alpha.33" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.33.tgz#970e20e5a91f7a378ddd0fc58d0b6c8d4f3be93e" - integrity sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w== +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== dependencies: mdn-data "2.0.4" - source-map "^0.5.3" + source-map "^0.6.1" css-unit-converter@^1.1.1: version "1.1.1" @@ -3774,12 +3763,12 @@ cssnano@^4.1.10: is-resolvable "^1.0.0" postcss "^7.0.0" -csso@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" - integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== dependencies: - css-tree "1.0.0-alpha.29" + css-tree "1.0.0-alpha.37" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -3844,11 +3833,6 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4251,10 +4235,10 @@ 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.247, electron-to-chromium@^1.3.284: - version "1.3.292" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.292.tgz#7812fc5138619342f1dd5823df6e9cbb7d2820e9" - integrity sha512-hqkem5ANpt6mxVXmhAmlbdG8iicuyM/jEYgmP1tiHPeOLyZoTyGUzrDmJS/xyrrZy9frkW1uQcubicu7f6DS5g== +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.295: + version "1.3.296" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz#a1d4322d742317945285d3ba88966561b67f3ac8" + integrity sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -4279,6 +4263,11 @@ emoji-regex@^7.0.1, emoji-regex@^7.0.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -4361,14 +4350,14 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.51: - version "0.10.51" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" - integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ== +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.52" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.52.tgz#bb21777e919a04263736ded120a9d665f10ea63f" + integrity sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag== dependencies: es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "^1.0.0" + es6-symbol "~3.1.2" + next-tick "~1.0.0" es6-error@^4.1.1: version "4.1.1" @@ -4384,13 +4373,13 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1" - integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ== +es6-symbol@^3.1.1, es6-symbol@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== dependencies: d "^1.0.1" - es5-ext "^0.10.51" + ext "^1.1.2" escape-html@~1.0.3: version "1.0.3" @@ -4415,9 +4404,9 @@ escodegen@^1.11.0, escodegen@^1.9.1: source-map "~0.6.1" eslint-config-prettier@^6.1.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz#0a04f147e31d33c6c161b2dd0971418ac52d0477" - integrity sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w== + version "6.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" + integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== dependencies: get-stdin "^6.0.0" @@ -4557,7 +4546,7 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.2: +eslint-utils@^1.4.2, eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== @@ -4570,9 +4559,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@^6.1.0, eslint@^6.4.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" - integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -4581,9 +4570,9 @@ eslint@^6.1.0, eslint@^6.4.0: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.2" + eslint-utils "^1.4.3" eslint-visitor-keys "^1.1.0" - espree "^6.1.1" + espree "^6.1.2" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -4593,7 +4582,7 @@ eslint@^6.1.0, eslint@^6.4.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" + inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" @@ -4612,7 +4601,7 @@ eslint@^6.1.0, eslint@^6.4.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.1.1: +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== @@ -4789,6 +4778,13 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.1.2.tgz#d1d216c83641bb4cb7684622b063cff44a19ce35" + integrity sha512-/KLjJdTNyDepCihrk4HQt57nAE1IRCEo5jUt+WgWGCr1oARhibDvmI2DMcSNWood1T9AUWwq+jaV1wvRqaXfnA== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4938,6 +4934,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +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== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -5439,9 +5442,9 @@ gotrue-js@^0.9.25: micro-api-client "^3.2.1" 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.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== growly@^1.3.0: version "1.3.0" @@ -5467,9 +5470,9 @@ handle-thing@^2.0.0: integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== handlebars@^4.1.2: - version "4.4.5" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.5.tgz#1b1f94f9bfe7379adda86a8b73fb570265a0dddd" - integrity sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg== + version "4.5.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.1.tgz#8a01c382c180272260d07f2d1aa3ae745715c7ba" + integrity sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -5975,22 +5978,22 @@ inquirer@6.5.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== dependencies: - ansi-escapes "^3.2.0" + ansi-escapes "^4.2.1" chalk "^2.4.2" - cli-cursor "^2.1.0" + cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" run-async "^2.2.0" rxjs "^6.4.0" - string-width "^2.1.0" + string-width "^4.1.0" strip-ansi "^5.1.0" through "^2.3.6" @@ -6192,6 +6195,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -7034,9 +7042,9 @@ jsprim@^1.2.2: verror "1.10.0" jsx-ast-utils@^2.1.0, jsx-ast-utils@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" - integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== dependencies: array-includes "^3.0.3" object.assign "^4.1.0" @@ -7472,11 +7480,6 @@ 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@~1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" - integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7818,15 +7821,20 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nan@^2.12.1, nan@^2.13.2: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanoid@^2.0.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.4.tgz#c38b2c1f7f4c60cde2291f40854420328d0d621e" - integrity sha512-PijW88Ry+swMFfArOrm7uRAdVmJilLbej7WwVY6L5QwLDckqxSOinGGMV596yp5C8+MH3VvCXCSZ6AodGtKrYQ== + version "2.1.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.6.tgz#0665418f692e54cf44f34d4010761f3240a03314" + integrity sha512-2NDzpiuEy3+H0AVtdt8LoFi7PnqkOnIzYmJQp7xsEU6VexLluHQwKREuiz57XaQC5006seIadPrIZJhyS2n7aw== nanomatch@^1.2.9: version "1.2.13" @@ -7874,7 +7882,7 @@ netlify-identity-widget@^1.5.5: resolved "https://registry.yarnpkg.com/netlify-identity-widget/-/netlify-identity-widget-1.5.5.tgz#e9ba8d7676263507106060236cf55c2992f425e4" integrity sha512-gCILbXMVn83TiRaiPCWk93ynyyYgxn8N/KoO+WOfyGZaNgq7gMMPtn7vo6VDe/ZczgyCn9DRlm3artNoj78/MQ== -next-tick@^1.0.0: +next-tick@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= @@ -7980,17 +7988,17 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.29, node-releases@^1.1.36: - version "1.1.38" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.38.tgz#d81b365df2936654ba37f509ba2fbe91eff2578b" - integrity sha512-/5NZAaOyTj134Oy5Cp/J8mso8OD/D9CSuL+6TOXXsTKO8yjc5e4up75SRPCganCjwFKMj2jbp5tR0dViVdox7g== +node-releases@^1.1.29, node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== dependencies: semver "^6.3.0" node-sass@^4.11.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" - integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + version "4.13.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066" + integrity sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -7999,7 +8007,7 @@ node-sass@^4.11.0: get-stdin "^4.0.1" glob "^7.0.3" in-publish "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.15" meow "^3.7.0" mkdirp "^0.5.1" nan "^2.13.2" @@ -9435,10 +9443,10 @@ postcss@7.0.14: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" - integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.19, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -10444,6 +10452,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -10610,9 +10626,9 @@ rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.6.0, estree-walker "^0.6.1" rollup@^1.12.0: - version "1.25.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.25.2.tgz#739f508bd8f7ece52bb6c1fcda83466af82b7f6d" - integrity sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg== + version "1.26.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.26.0.tgz#cf40fd5e1edc4d7f3d4235a0a43f1c2be1cf294b" + integrity sha512-5HljNYn9icFvXX+Oe97qY5TWvnWhKqgGT0HGeWWqFPx7w7+Anzg7dfHMtUif7YYy6QxAgynDSwK6uxbgcrVUxw== dependencies: "@types/estree" "*" "@types/node" "*" @@ -11069,9 +11085,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.10, source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + 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== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -11093,7 +11109,7 @@ source-map@^0.4.2: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -11305,6 +11321,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" + string.prototype.trimleft@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" @@ -11421,9 +11446,9 @@ style-loader@1.0.0: schema-utils "^2.0.1" styled-components@^4.1.3: - version "4.4.0" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.4.0.tgz#4e381e2dab831d0e6ea431c2840a96323e84e21b" - integrity sha512-xQ6vTI/0zNjZ1BBDRxyjvBddrxhQ3DxjeCdaLM1lSn5FDnkTOQgRkmWvcUiTajqc5nJqKVl+7sUioMqktD0+Zw== + version "4.4.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.4.1.tgz#e0631e889f01db67df4de576fedaca463f05c2f2" + integrity sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/traverse" "^7.0.0" @@ -11483,16 +11508,16 @@ svg-parser@^2.0.0: integrity sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg== svgo@^1.0.0, svgo@^1.2.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.0.tgz#bae51ba95ded9a33a36b7c46ce9c359ae9154313" - integrity sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== dependencies: chalk "^2.4.1" coa "^2.0.2" css-select "^2.0.0" css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.33" - csso "^3.5.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" js-yaml "^3.13.1" mkdirp "~0.5.1" object.values "^1.1.0" @@ -11882,6 +11907,11 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -11925,9 +11955,9 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4: - version "3.6.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.3.tgz#1351533bbe22cc698f012589ed6bd4cbd971bff8" - integrity sha512-KfQUgOqTkLp2aZxrMbCuKCDGW9slFYu2A23A36Gs7sGzTLcRBDORdOi5E21KWHFIfkY8kzgi/Pr1cXCh0yIp5g== + version "3.6.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.5.tgz#b0ee796d2ae7e25672e04f65629b997cd4b30bd6" + integrity sha512-7L3W+Npia1OCr5Blp4/Vw83tK1mu5gnoIURtT1fUVfQ3Kf8WStWV6NJz0fdoBJZls0KlweruRTLVe6XLafmy5g== dependencies: commander "~2.20.3" source-map "~0.6.1"