mirror of
https://github.com/rowyio/rowy.git
synced 2026-02-24 20:20:05 +01:00
5
.gitignore
vendored
5
.gitignore
vendored
@@ -29,3 +29,8 @@ Firetable/.env
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Accidental package installs to root directory
|
||||
yarn.lock
|
||||
package.json
|
||||
package-lock.json
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{
|
||||
"trailingComma": "es5"
|
||||
"trailingComma": "es5",
|
||||
"proseWrap": "always"
|
||||
}
|
||||
|
||||
84
README.md
84
README.md
@@ -1,76 +1,100 @@
|
||||
## Firetable
|
||||
# Firetable
|
||||
|
||||
Firetable is an Excel/Google Sheets like UI for Firebase/Firestore. No more building admin portal for allowing business users to access data from GCP.
|
||||
Firetable is a spreadsheet-like UI for Firestore.
|
||||
|
||||
#### Firetable UI
|
||||
No more building admin portals to let business users to access data from Google
|
||||
Cloud.
|
||||
|
||||
### Firetable UI
|
||||
|
||||
Supports fields such as images, files, single/multi select, in addition to
|
||||
standard fields. Functions such as row resizing, data import/export are
|
||||
supported. More coming soon, for comprehensive list see ROADMAP.md.
|
||||
|
||||
Supports fields such as images, files, single/multi select in addition to standard fields. Functions such a row resizing, data import/export are supported. More coming soon, for comprehensive list of checkout ROADMAP.
|
||||

|
||||
|
||||
## Setup instructions
|
||||
|
||||
#### 1) Create a firebase project ([instructions](https://console.firebase.google.com/u/0/))
|
||||
### 1. Create a Firebase project [(Instructions)](https://console.firebase.google.com/u/0/)
|
||||
|
||||
- enable firestore
|
||||
- setup security rules: test mode or setup required permission
|
||||
- upgrade project to Blaze plan
|
||||
- go to authentication/ sign method enable google auth
|
||||
- Enable the Firestore database
|
||||
- Set up Firestore Security Rules: use Test Mode or set up required permissions.
|
||||
Below are sample rules that allow for unlimited access to the entire database:
|
||||
```
|
||||
rules_version = '2';
|
||||
service cloud.firestore {
|
||||
match /databases/{database}/documents {
|
||||
match /{document=**} {
|
||||
allow read, write: if true;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
- Upgrade project to the Blaze Plan
|
||||
- Enable the Google sign-in method in **Authentication / Sign-in method**
|
||||
|
||||
### 2. Create an [Algolia](https://algolia.com) project
|
||||
|
||||
#### 2) Create an algolia project
|
||||
- Get the generated **Application ID** and **Search-Only API Key** from the
|
||||
**API Keys** page
|
||||
|
||||
- get the generated appId,API key and search key
|
||||
|
||||
#### 3) Clone repo
|
||||
### 3. Clone this repo
|
||||
|
||||
```
|
||||
git clone https://github.com/AntlerVC/firetable.git
|
||||
```
|
||||
|
||||
#### 4) Setup cloud functions
|
||||
### 4. Set up Cloud Functions
|
||||
|
||||
install dependencies
|
||||
- Install dependencies
|
||||
|
||||
```
|
||||
cd cloud_functions/functions;yarn
|
||||
cd cloud_functions/functions
|
||||
yarn
|
||||
```
|
||||
|
||||
insure that you have firebase cli installed, [instructions](https://firebase.google.com/docs/cli)
|
||||
- Ensure that you have Firebase CLI installed.
|
||||
[(Instructions)](https://firebase.google.com/docs/cli)
|
||||
|
||||
then set cloud environment keys using the following commands
|
||||
- Set cloud environment keys for Algolia
|
||||
|
||||
```
|
||||
firebase functions:config:set algolia.appid=YOUR_APP_ID algolia.apikey=ADMIN_API_KEY
|
||||
```
|
||||
|
||||
Deploy the cloud functions to your firebase project
|
||||
- Deploy the Cloud Functions to your Firebase project
|
||||
|
||||
```
|
||||
yarn deploy
|
||||
```
|
||||
|
||||
#### 5) Set environment variables
|
||||
### 5. Set React app environment variables
|
||||
|
||||
Create a .env file in the `www` directory
|
||||
|
||||
create a .env file in the www directory
|
||||
- Get the generated **Application ID** and **Search-Only API Key** from the
|
||||
Algolia **API Keys** page
|
||||
|
||||
- Get the Firebase **Project ID** and **Web API Key** from your Firebase
|
||||
Project’s **Settings** page. Click the cog icon on the left sidebar (under the
|
||||
Firebase logo) and click **Project settings**
|
||||
|
||||
```
|
||||
REACT_APP_FIREBASE_PROJECT_NAME =
|
||||
REACT_APP_FIREBASE_PROJECT_KEY =
|
||||
REACT_APP_ALGOLIA_APP_ID =
|
||||
REACT_APP_ALGOLIA_SEARCH_KEY =
|
||||
REACT_APP_ALGOLIA_APP_ID=
|
||||
REACT_APP_ALGOLIA_SEARCH_API_KEY=
|
||||
|
||||
REACT_APP_FIREBASE_PROJECT_ID=
|
||||
REACT_APP_FIREBASE_PROJECT_WEB_API_KEY=
|
||||
```
|
||||
|
||||
#### 6) Run frontend
|
||||
|
||||
install dependencies
|
||||
### 6. Install front-end dependencies
|
||||
|
||||
```
|
||||
cd www;yarn
|
||||
cd www
|
||||
yarn
|
||||
```
|
||||
|
||||
#### 7) Run project locally
|
||||
### 7. Run project locally
|
||||
|
||||
```
|
||||
yarn start
|
||||
|
||||
5
www/.env.example
Normal file
5
www/.env.example
Normal file
@@ -0,0 +1,5 @@
|
||||
REACT_APP_ALGOLIA_APP_ID=
|
||||
REACT_APP_ALGOLIA_SEARCH_API_KEY=
|
||||
|
||||
REACT_APP_FIREBASE_PROJECT_ID=
|
||||
REACT_APP_FIREBASE_PROJECT_WEB_API_KEY=
|
||||
@@ -4,10 +4,10 @@
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@date-io/date-fns": "^1.3.11",
|
||||
"@material-ui/core": "^4.4.0",
|
||||
"@material-ui/icons": "^4.4.1",
|
||||
"@material-ui/lab": "^4.0.0-alpha.26",
|
||||
"@material-ui/pickers": "^3.2.5",
|
||||
"@material-ui/core": "^4.8.3",
|
||||
"@material-ui/icons": "^4.5.1",
|
||||
"@material-ui/lab": "^4.0.0-alpha.39",
|
||||
"@material-ui/pickers": "^3.2.9",
|
||||
"@types/algoliasearch": "^3.34.2",
|
||||
"@types/backbone": "^1.4.1",
|
||||
"@types/cash": "^0.0.3",
|
||||
|
||||
@@ -21,6 +21,12 @@
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<link rel="stylesheet" href="https://use.typekit.net/ngg8buf.css" />
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
<title>Firetable</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import React, { lazy, Suspense } from "react";
|
||||
|
||||
import { ThemeProvider } from "@material-ui/styles";
|
||||
import Theme from "./Theme";
|
||||
|
||||
import { Route } from "react-router-dom";
|
||||
|
||||
import {
|
||||
MuiThemeProvider as ThemeProvider,
|
||||
CssBaseline,
|
||||
} from "@material-ui/core";
|
||||
import Theme from "./Theme";
|
||||
|
||||
import CustomBrowserRouter from "./util/CustomBrowserRouter";
|
||||
import PrivateRoute from "./util/PrivateRoute";
|
||||
import Snack from "./components/Snack";
|
||||
@@ -19,6 +21,7 @@ const EditorView = lazy(() => import("./views/EditorView"));
|
||||
const App: React.FC = () => {
|
||||
return (
|
||||
<ThemeProvider theme={Theme}>
|
||||
<CssBaseline />
|
||||
<AuthProvider>
|
||||
<SnackProvider>
|
||||
<CustomBrowserRouter>
|
||||
|
||||
118
www/src/Theme.ts
118
www/src/Theme.ts
@@ -1,14 +1,122 @@
|
||||
import createMuiTheme from "@material-ui/core/styles/createMuiTheme";
|
||||
|
||||
const HEADING_TEXT = "Europa, sans-serif";
|
||||
const BODY_TEXT = '"Open Sans", sans-serif';
|
||||
|
||||
const Theme = createMuiTheme({
|
||||
spacing: 4,
|
||||
palette: {
|
||||
primary: {
|
||||
main: "#E34C4E",
|
||||
primary: { main: "#e22729" },
|
||||
secondary: { main: "#e22729" },
|
||||
text: { secondary: "rgba(0, 0, 0, 0.6)" },
|
||||
},
|
||||
typography: {
|
||||
fontFamily: BODY_TEXT,
|
||||
h3: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: 36,
|
||||
fontWeight: "bold",
|
||||
fontStyle: "normal",
|
||||
lineHeight: "normal",
|
||||
letterSpacing: "normal",
|
||||
},
|
||||
secondary: {
|
||||
main: "#007bff",
|
||||
h4: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontWeight: "bold",
|
||||
letterSpacing: 0.2,
|
||||
},
|
||||
h5: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: "1.5rem",
|
||||
fontWeight: "bold",
|
||||
fontStyle: "normal",
|
||||
lineHeight: 1.25,
|
||||
letterSpacing: "normal",
|
||||
},
|
||||
h6: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: "1.125rem",
|
||||
fontWeight: "bold",
|
||||
letterSpacing: 0.2,
|
||||
textTransform: "uppercase",
|
||||
},
|
||||
overline: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: 13.4,
|
||||
fontWeight: "bold",
|
||||
fontStyle: "normal",
|
||||
lineHeight: 1.2,
|
||||
letterSpacing: 2,
|
||||
color: "rgba(0, 0, 0, 0.6)",
|
||||
},
|
||||
subtitle1: {
|
||||
fontSize: 15.9,
|
||||
fontWeight: 300,
|
||||
lineHeight: 1.51,
|
||||
letterSpacing: 0.15,
|
||||
},
|
||||
body1: {
|
||||
lineHeight: 1.75,
|
||||
letterSpacing: 0.5,
|
||||
},
|
||||
subtitle2: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontWeight: "bold",
|
||||
fontSize: "1rem",
|
||||
lineHeight: 1.5,
|
||||
},
|
||||
body2: {
|
||||
fontSize: 13.8,
|
||||
fontWeight: "normal",
|
||||
lineHeight: 1.45,
|
||||
letterSpacing: 0.25,
|
||||
},
|
||||
button: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: "1rem",
|
||||
fontWeight: "bold",
|
||||
lineHeight: 1,
|
||||
letterSpacing: 0.75,
|
||||
},
|
||||
caption: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: "0.8125rem",
|
||||
fontWeight: "bold",
|
||||
letterSpacing: 0.4,
|
||||
lineHeight: 1.2,
|
||||
},
|
||||
},
|
||||
overrides: {
|
||||
MuiChip: {
|
||||
root: { borderRadius: 4 },
|
||||
},
|
||||
MuiCard: {
|
||||
root: { borderRadius: 8 },
|
||||
},
|
||||
MuiFormLabel: {
|
||||
root: {
|
||||
fontFamily: "Europa",
|
||||
fontSize: "1rem",
|
||||
fontWeight: "bold",
|
||||
letterSpacing: 0.4,
|
||||
},
|
||||
},
|
||||
MuiTooltip: {
|
||||
tooltip: {
|
||||
fontFamily: HEADING_TEXT,
|
||||
fontSize: "0.8125rem",
|
||||
fontWeight: "bold",
|
||||
letterSpacing: 0.4,
|
||||
lineHeight: 1.2,
|
||||
},
|
||||
},
|
||||
MuiTab: {
|
||||
root: { fontSize: "1rem !important" },
|
||||
},
|
||||
},
|
||||
props: {
|
||||
MuiRadio: { color: "primary" },
|
||||
MuiCheckbox: { color: "primary" },
|
||||
MuiCircularProgress: { size: 44 },
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
1
www/src/assets/antler.svg
Normal file
1
www/src/assets/antler.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72"><g fill="none" fill-rule="evenodd"><path fill="#EF4C47" fill-rule="nonzero" d="M0 0h72v72H0z"/><path fill="#FFF" d="M34.076 21L21 52h5.35l10.056-24.531L46.473 52H52L38.921 21z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 252 B |
113
www/src/components/AppBar.tsx
Normal file
113
www/src/components/AppBar.tsx
Normal file
@@ -0,0 +1,113 @@
|
||||
import React from "react";
|
||||
|
||||
import {
|
||||
createStyles,
|
||||
makeStyles,
|
||||
useTheme,
|
||||
useMediaQuery,
|
||||
useScrollTrigger,
|
||||
AppBar as MuiAppBar,
|
||||
Toolbar,
|
||||
Typography,
|
||||
Grid,
|
||||
TextField,
|
||||
MenuItem,
|
||||
} from "@material-ui/core";
|
||||
|
||||
import AntlerLogo from "../assets/antler.svg";
|
||||
|
||||
const useStyles = makeStyles(theme =>
|
||||
createStyles({
|
||||
appBar: {
|
||||
backgroundColor: theme.palette.background.paper,
|
||||
marginBottom: theme.spacing(8),
|
||||
},
|
||||
toolbar: {
|
||||
[theme.breakpoints.up("md")]: { minHeight: 80 },
|
||||
},
|
||||
|
||||
logo: {
|
||||
display: "block",
|
||||
marginRight: theme.spacing(2),
|
||||
},
|
||||
heading: { textTransform: "none" },
|
||||
|
||||
locationDropdown: {
|
||||
minWidth: 140,
|
||||
margin: 0,
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
const locations = ["SYD2", "SG4", "LON2", "NYC2", "STO3", "AMS2"];
|
||||
|
||||
interface IAppBarProps {
|
||||
cohort?: string;
|
||||
onChangeCohort?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
||||
}
|
||||
|
||||
const AppBar: React.FunctionComponent<IAppBarProps> = ({
|
||||
cohort,
|
||||
onChangeCohort,
|
||||
}) => {
|
||||
const classes = useStyles();
|
||||
const theme = useTheme();
|
||||
const trigger = useScrollTrigger({ disableHysteresis: true, threshold: 0 });
|
||||
|
||||
const isMd = useMediaQuery(theme.breakpoints.down("md"));
|
||||
|
||||
return (
|
||||
<MuiAppBar
|
||||
position="sticky"
|
||||
color="default"
|
||||
className={classes.appBar}
|
||||
elevation={trigger ? 4 : 0}
|
||||
>
|
||||
<Toolbar className={classes.toolbar}>
|
||||
<Grid item>
|
||||
<img
|
||||
src={AntlerLogo}
|
||||
width="32"
|
||||
height="32"
|
||||
alt="Antler"
|
||||
className={classes.logo}
|
||||
/>
|
||||
</Grid>
|
||||
|
||||
<Grid item xs>
|
||||
<Typography
|
||||
variant={isMd ? "h6" : "h4"}
|
||||
color="primary"
|
||||
component="h1"
|
||||
className={classes.heading}
|
||||
>
|
||||
Manager
|
||||
</Typography>
|
||||
</Grid>
|
||||
|
||||
{cohort !== undefined && onChangeCohort && (
|
||||
<Grid item>
|
||||
<TextField
|
||||
select
|
||||
label="Cohort"
|
||||
variant="filled"
|
||||
margin={isMd ? "dense" : "normal"}
|
||||
className={classes.locationDropdown}
|
||||
value={cohort}
|
||||
onChange={onChangeCohort}
|
||||
>
|
||||
<MenuItem value="all">All</MenuItem>
|
||||
{locations.map(option => (
|
||||
<MenuItem key={option} value={option}>
|
||||
{option}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
</Grid>
|
||||
)}
|
||||
</Toolbar>
|
||||
</MuiAppBar>
|
||||
);
|
||||
};
|
||||
|
||||
export default AppBar;
|
||||
@@ -1,21 +1,34 @@
|
||||
import React, { useState, useEffect } from "react";
|
||||
import AddIcon from "@material-ui/icons/Add";
|
||||
import _camelCase from "lodash/camelCase";
|
||||
import useRouter from "../hooks/useRouter";
|
||||
import Button from "@material-ui/core/Button";
|
||||
import TextField from "@material-ui/core/TextField";
|
||||
import Dialog from "@material-ui/core/Dialog";
|
||||
import DialogActions from "@material-ui/core/DialogActions";
|
||||
import DialogContent from "@material-ui/core/DialogContent";
|
||||
import DialogContentText from "@material-ui/core/DialogContentText";
|
||||
import DialogTitle from "@material-ui/core/DialogTitle";
|
||||
import Fab from "@material-ui/core/Fab";
|
||||
import Tooltip from "@material-ui/core/Tooltip";
|
||||
|
||||
// TODO: Create an interface for props
|
||||
export default function CreateTableDialog(props: any) {
|
||||
import AddIcon from "@material-ui/icons/Add";
|
||||
import useRouter from "../hooks/useRouter";
|
||||
|
||||
import {
|
||||
Tooltip,
|
||||
Fab,
|
||||
Dialog,
|
||||
DialogActions,
|
||||
DialogContent,
|
||||
DialogContentText,
|
||||
DialogTitle,
|
||||
TextField,
|
||||
Button,
|
||||
} from "@material-ui/core";
|
||||
|
||||
export interface ICreateTableDialogProps {
|
||||
/** Optional class overrides */
|
||||
classes?: Partial<Record<"fab", string>>;
|
||||
/** Function to handle table creation */
|
||||
createTable: (tableName: string, collectionName: string) => void;
|
||||
}
|
||||
|
||||
export default function CreateTableDialog({
|
||||
classes = {},
|
||||
createTable,
|
||||
}: ICreateTableDialogProps) {
|
||||
const router = useRouter();
|
||||
const { classes, createTable } = props;
|
||||
|
||||
const [open, setOpen] = React.useState(false);
|
||||
const [tableName, setTableName] = useState("");
|
||||
const [collectionName, setCollectionName] = useState("");
|
||||
@@ -46,9 +59,9 @@ export default function CreateTableDialog(props: any) {
|
||||
<div>
|
||||
<Tooltip title="Create a table">
|
||||
<Fab
|
||||
className={classes.fabButton}
|
||||
className={classes.fab}
|
||||
color="secondary"
|
||||
aria-label="add"
|
||||
aria-label="Create table"
|
||||
onClick={handleClickOpen}
|
||||
>
|
||||
<AddIcon />
|
||||
|
||||
10
www/src/components/GoIcon.tsx
Normal file
10
www/src/components/GoIcon.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
import React from "react";
|
||||
|
||||
import ChevronRightIcon from "@material-ui/icons/ChevronRight";
|
||||
import { SvgIconProps } from "@material-ui/core/SvgIcon";
|
||||
|
||||
const GoIcon: React.FunctionComponent<SvgIconProps> = props => (
|
||||
<ChevronRightIcon style={{ marginLeft: -8 }} {...props} />
|
||||
);
|
||||
|
||||
export default GoIcon;
|
||||
@@ -39,7 +39,7 @@ const useStyles = makeStyles(theme =>
|
||||
grow: {
|
||||
flexGrow: 1,
|
||||
},
|
||||
fabButton: {
|
||||
fab: {
|
||||
position: "absolute",
|
||||
zIndex: 1,
|
||||
top: -30,
|
||||
|
||||
@@ -17,8 +17,8 @@ const searchClient = algoliasearch(
|
||||
process.env.REACT_APP_ALGOLIA_APP_ID
|
||||
? process.env.REACT_APP_ALGOLIA_APP_ID
|
||||
: "",
|
||||
process.env.REACT_APP_ALGOLIA_SEARCH_KEY
|
||||
? process.env.REACT_APP_ALGOLIA_SEARCH_KEY
|
||||
process.env.REACT_APP_ALGOLIA_SEARCH_API_KEY
|
||||
? process.env.REACT_APP_ALGOLIA_SEARCH_API_KEY
|
||||
: ""
|
||||
);
|
||||
|
||||
|
||||
169
www/src/components/StyledCard.tsx
Normal file
169
www/src/components/StyledCard.tsx
Normal file
@@ -0,0 +1,169 @@
|
||||
import React from "react";
|
||||
import clsx from "clsx";
|
||||
import { Link, LinkProps } from "react-router-dom";
|
||||
|
||||
import {
|
||||
makeStyles,
|
||||
createStyles,
|
||||
Card,
|
||||
Grid,
|
||||
Typography,
|
||||
Button,
|
||||
CardActions,
|
||||
CardContent,
|
||||
CardMedia,
|
||||
Divider,
|
||||
} from "@material-ui/core";
|
||||
import { ButtonProps } from "@material-ui/core/Button";
|
||||
|
||||
import GoIcon from "./GoIcon";
|
||||
|
||||
const useStyles = makeStyles(theme =>
|
||||
createStyles({
|
||||
root: { width: "100%" },
|
||||
container: { height: "100%" },
|
||||
cardContent: { "&:last-child": { paddingBottom: 0 } },
|
||||
|
||||
headerSection: { marginBottom: theme.spacing(1) },
|
||||
overline: {
|
||||
marginBottom: theme.spacing(2),
|
||||
color: theme.palette.text.disabled,
|
||||
},
|
||||
title: { whiteSpace: "pre-line" },
|
||||
image: {
|
||||
width: 80,
|
||||
height: 80,
|
||||
borderRadius: theme.shape.borderRadius,
|
||||
},
|
||||
|
||||
cardActions: {
|
||||
padding: theme.spacing(1),
|
||||
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
},
|
||||
|
||||
divider: {
|
||||
margin: theme.spacing(2),
|
||||
marginBottom: 0,
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
interface StyledCardProps {
|
||||
className?: string;
|
||||
|
||||
overline?: React.ReactNode;
|
||||
title?: string;
|
||||
imageSource?: string;
|
||||
|
||||
bodyContent?: React.ReactNode;
|
||||
|
||||
primaryButton?: Partial<ButtonProps>;
|
||||
primaryLink?: {
|
||||
to: LinkProps["to"];
|
||||
children?: React.ReactNode;
|
||||
label?: string;
|
||||
};
|
||||
secondaryAction?: React.ReactNode;
|
||||
}
|
||||
|
||||
export default function StyledCard({
|
||||
className,
|
||||
overline,
|
||||
title,
|
||||
imageSource,
|
||||
bodyContent,
|
||||
primaryButton,
|
||||
primaryLink,
|
||||
secondaryAction,
|
||||
}: StyledCardProps) {
|
||||
const classes = useStyles();
|
||||
|
||||
return (
|
||||
<Card className={clsx(className, classes.root)}>
|
||||
<Grid
|
||||
container
|
||||
direction="column"
|
||||
wrap="nowrap"
|
||||
className={classes.container}
|
||||
>
|
||||
<Grid item xs>
|
||||
<CardContent className={clsx(classes.container, classes.cardContent)}>
|
||||
<Grid
|
||||
container
|
||||
direction="column"
|
||||
wrap="nowrap"
|
||||
className={classes.container}
|
||||
>
|
||||
<Grid item>
|
||||
<Grid container className={classes.headerSection} spacing={3}>
|
||||
<Grid item xs>
|
||||
{overline && (
|
||||
<Typography
|
||||
variant="overline"
|
||||
className={classes.overline}
|
||||
>
|
||||
{overline}
|
||||
</Typography>
|
||||
)}
|
||||
{title && (
|
||||
<Typography variant="h5" className={classes.title}>
|
||||
{title}
|
||||
</Typography>
|
||||
)}
|
||||
</Grid>
|
||||
|
||||
{imageSource && (
|
||||
<Grid item>
|
||||
<CardMedia
|
||||
className={classes.image}
|
||||
image={imageSource}
|
||||
title={title}
|
||||
/>
|
||||
</Grid>
|
||||
)}
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<Grid item xs>
|
||||
{bodyContent && Array.isArray(bodyContent) ? (
|
||||
<Grid
|
||||
container
|
||||
direction="column"
|
||||
wrap="nowrap"
|
||||
justify="space-between"
|
||||
>
|
||||
{bodyContent.map(element => (
|
||||
<Grid item>{element}</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
) : (
|
||||
bodyContent
|
||||
)}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Grid>
|
||||
|
||||
<Grid item>
|
||||
<Divider className={classes.divider} />
|
||||
<CardActions className={classes.cardActions}>
|
||||
{primaryButton && <Button color="primary" {...primaryButton} />}
|
||||
{primaryLink && (
|
||||
<Button
|
||||
color="primary"
|
||||
component={Link}
|
||||
to={primaryLink.to}
|
||||
children={primaryLink.children || primaryLink.label}
|
||||
endIcon={<GoIcon />}
|
||||
/>
|
||||
)}
|
||||
|
||||
{secondaryAction}
|
||||
</CardActions>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
8
www/src/constants/routes.ts
Normal file
8
www/src/constants/routes.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export enum routes {
|
||||
home = "/",
|
||||
auth = "/auth",
|
||||
table = "/table",
|
||||
editor = "/editor",
|
||||
}
|
||||
|
||||
export default routes;
|
||||
@@ -5,11 +5,11 @@ import "firebase/functions";
|
||||
import "firebase/storage";
|
||||
|
||||
const config = {
|
||||
apiKey: process.env.REACT_APP_FIREBASE_PROJECT_KEY,
|
||||
authDomain: `${process.env.REACT_APP_FIREBASE_PROJECT_NAME}.firebaseapp.com`,
|
||||
databaseURL: `https://${process.env.REACT_APP_FIREBASE_PROJECT_NAME}.firebaseio.com`,
|
||||
projectId: process.env.REACT_APP_FIREBASE_PROJECT_NAME,
|
||||
storageBucket: `${process.env.REACT_APP_FIREBASE_PROJECT_NAME}.appspot.com`,
|
||||
apiKey: process.env.REACT_APP_FIREBASE_PROJECT_WEB_API_KEY,
|
||||
authDomain: `${process.env.REACT_APP_FIREBASE_PROJECT_ID}.firebaseapp.com`,
|
||||
databaseURL: `https://${process.env.REACT_APP_FIREBASE_PROJECT_ID}.firebaseio.com`,
|
||||
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
|
||||
storageBucket: `${process.env.REACT_APP_FIREBASE_PROJECT_ID}.appspot.com`,
|
||||
};
|
||||
|
||||
firebase.initializeApp(config);
|
||||
|
||||
@@ -98,7 +98,7 @@ const useTable = (initialOverrides: any) => {
|
||||
//TODO:callable to create new index
|
||||
if (error.message.includes("indexes?create_composite=")) {
|
||||
const url =
|
||||
`https://console.firebase.google.com/project/${process.env.REACT_APP_FIREBASE_PROJECT_NAME}/database/firestore/` +
|
||||
`https://console.firebase.google.com/project/${process.env.REACT_APP_FIREBASE_PROJECT_ID}/database/firestore/` +
|
||||
"indexes?create_composite=" +
|
||||
error.message.split("indexes?create_composite=")[1];
|
||||
console.log(url);
|
||||
|
||||
@@ -1,82 +1,160 @@
|
||||
import React from "react";
|
||||
import React, { useContext, useState } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import createStyles from "@material-ui/core/styles/createStyles";
|
||||
import makeStyles from "@material-ui/core/styles/makeStyles";
|
||||
import Card from "@material-ui/core/Card";
|
||||
import CardActions from "@material-ui/core/CardActions";
|
||||
import CardContent from "@material-ui/core/CardContent";
|
||||
import Button from "@material-ui/core/Button";
|
||||
import Typography from "@material-ui/core/Typography";
|
||||
import Grid from "@material-ui/core/Grid";
|
||||
import {
|
||||
createStyles,
|
||||
makeStyles,
|
||||
Container,
|
||||
Grid,
|
||||
Typography,
|
||||
Chip,
|
||||
Button,
|
||||
Divider,
|
||||
} from "@material-ui/core";
|
||||
|
||||
import useSettings from "../hooks/useSettings";
|
||||
import useRouter from "../hooks/useRouter";
|
||||
import routes from "../constants/routes";
|
||||
import AuthContext from "../contexts/authContext";
|
||||
|
||||
import AppBar from "../components/AppBar";
|
||||
import GoIcon from "../components/GoIcon";
|
||||
import StyledCard from "../components/StyledCard";
|
||||
import CreateTableDialog from "../components/CreateTableDialog";
|
||||
const useStyles = makeStyles(() =>
|
||||
|
||||
const useStyles = makeStyles(theme =>
|
||||
createStyles({
|
||||
card: {
|
||||
minWidth: 275,
|
||||
},
|
||||
bullet: {
|
||||
root: { minHeight: "100vh", paddingBottom: theme.spacing(8) },
|
||||
|
||||
greeting: {
|
||||
textTransform: "uppercase",
|
||||
letterSpacing: 3,
|
||||
display: "inline-block",
|
||||
margin: "0 2px",
|
||||
transform: "scale(0.8)",
|
||||
verticalAlign: "middle",
|
||||
},
|
||||
title: {
|
||||
fontSize: 14,
|
||||
newChip: {
|
||||
...theme.typography.overline,
|
||||
backgroundColor: theme.palette.text.secondary,
|
||||
color: theme.palette.getContrastText(theme.palette.text.secondary),
|
||||
marginLeft: theme.spacing(4),
|
||||
},
|
||||
pos: {
|
||||
marginBottom: 12,
|
||||
newChipLabel: { padding: theme.spacing(0, 2) },
|
||||
divider: {
|
||||
margin: theme.spacing(2, 0, 4),
|
||||
},
|
||||
fabButton: {
|
||||
position: "absolute",
|
||||
right: 15,
|
||||
bottom: 15,
|
||||
|
||||
cardGrid: {
|
||||
[theme.breakpoints.down("xs")]: { maxWidth: 360, margin: "0 auto" },
|
||||
},
|
||||
card: {
|
||||
height: "100%",
|
||||
[theme.breakpoints.up("md")]: { minHeight: 220 },
|
||||
[theme.breakpoints.down("md")]: { minHeight: 180 },
|
||||
},
|
||||
|
||||
createTableContainer: {
|
||||
alignSelf: "flex-end",
|
||||
marginLeft: "auto",
|
||||
},
|
||||
createTableFab: {
|
||||
width: 80,
|
||||
height: 80,
|
||||
borderRadius: theme.shape.borderRadius * 2,
|
||||
"& svg": { width: "2em", height: "2em" },
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
// TODO: Create an interface for props
|
||||
const TablesView = (props: any) => {
|
||||
const TablesView = () => {
|
||||
const classes = useStyles();
|
||||
const { currentUser } = useContext(AuthContext);
|
||||
|
||||
const [settings, createTable] = useSettings();
|
||||
const tables = settings.tables;
|
||||
const classes = useStyles();
|
||||
const router = useRouter();
|
||||
|
||||
const [cohort, setCohort] = useState("all");
|
||||
const handleCohortChange = (e: React.ChangeEvent<HTMLInputElement>) =>
|
||||
setCohort(e.target.value);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Grid container>
|
||||
{tables
|
||||
? tables.map((table: any) => (
|
||||
<Card className={classes.card}>
|
||||
<CardContent>
|
||||
<Typography variant="h5" component="h2">
|
||||
{table.name}
|
||||
</Typography>
|
||||
<Typography className={classes.pos} color="textSecondary">
|
||||
primary
|
||||
</Typography>
|
||||
<Typography variant="body2" component="p">
|
||||
Table summery use
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<CardActions>
|
||||
<Button
|
||||
size="small"
|
||||
onClick={() => {
|
||||
router.history.push(`table/${table.collection}`);
|
||||
}}
|
||||
>
|
||||
open{" "}
|
||||
</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
))
|
||||
: "TODO: card skeleton"}
|
||||
</Grid>
|
||||
<main className={classes.root}>
|
||||
<AppBar cohort={cohort} onChangeCohort={handleCohortChange} />
|
||||
|
||||
<CreateTableDialog classes={classes} createTable={createTable} />
|
||||
</>
|
||||
<Container>
|
||||
<Grid container spacing={2} justify="center">
|
||||
<Grid item xs>
|
||||
<Typography
|
||||
variant="h5"
|
||||
color="textSecondary"
|
||||
component="h2"
|
||||
className={classes.greeting}
|
||||
>
|
||||
Hi {currentUser!.displayName!.split(" ")[0]}!
|
||||
</Typography>
|
||||
|
||||
{/* <Chip
|
||||
label="1 New"
|
||||
size="small"
|
||||
classes={{ root: classes.newChip, label: classes.newChipLabel }}
|
||||
/> */}
|
||||
</Grid>
|
||||
|
||||
{/* <Grid item>
|
||||
<Button color="primary" component={Link} to="" endIcon={<GoIcon />}>
|
||||
Manage Team
|
||||
</Button>
|
||||
</Grid> */}
|
||||
</Grid>
|
||||
|
||||
<Divider className={classes.divider} />
|
||||
|
||||
<Grid
|
||||
container
|
||||
spacing={4}
|
||||
justify="space-between"
|
||||
className={classes.cardGrid}
|
||||
>
|
||||
{Array.isArray(tables)
|
||||
? tables.map((table: any) => (
|
||||
<Grid key={table.name} item xs={12} sm={6} md={4}>
|
||||
<StyledCard
|
||||
className={classes.card}
|
||||
overline="Primary"
|
||||
title={table.name}
|
||||
bodyContent={table.description}
|
||||
primaryLink={{
|
||||
to: {
|
||||
pathname: `${routes.table}/${table.collection}`,
|
||||
search:
|
||||
cohort === "all"
|
||||
? ""
|
||||
: encodeURI(
|
||||
"?filters=" +
|
||||
JSON.stringify([
|
||||
{
|
||||
key: "cohort",
|
||||
operator: "==",
|
||||
value: cohort,
|
||||
},
|
||||
])
|
||||
),
|
||||
},
|
||||
label: "Open",
|
||||
}}
|
||||
/>
|
||||
</Grid>
|
||||
))
|
||||
: "TODO: card skeleton"}
|
||||
|
||||
<Grid item className={classes.createTableContainer}>
|
||||
<CreateTableDialog
|
||||
createTable={createTable}
|
||||
classes={{ fab: classes.createTableFab }}
|
||||
/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Container>
|
||||
</main>
|
||||
);
|
||||
};
|
||||
|
||||
export default TablesView;
|
||||
|
||||
250
www/yarn.lock
250
www/yarn.lock
@@ -780,7 +780,7 @@
|
||||
pirates "^4.0.0"
|
||||
source-map-support "^0.5.9"
|
||||
|
||||
"@babel/runtime@7.6.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
|
||||
"@babel/runtime@7.6.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
|
||||
version "7.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205"
|
||||
integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==
|
||||
@@ -794,6 +794,13 @@
|
||||
dependencies:
|
||||
regenerator-runtime "^0.13.2"
|
||||
|
||||
"@babel/runtime@^7.6.2":
|
||||
version "7.8.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1"
|
||||
integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.13.2"
|
||||
|
||||
"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
|
||||
version "7.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
|
||||
@@ -845,6 +852,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5"
|
||||
integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==
|
||||
|
||||
"@date-io/core@1.x":
|
||||
version "1.3.13"
|
||||
resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.13.tgz#90c71da493f20204b7a972929cc5c482d078b3fa"
|
||||
integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==
|
||||
|
||||
"@date-io/core@^1.3.11":
|
||||
version "1.3.11"
|
||||
resolved "https://registry.yarnpkg.com/@date-io/core/-/core-1.3.11.tgz#98e3c366794dfff571e39227e5d718ac7f26b729"
|
||||
@@ -857,10 +869,10 @@
|
||||
dependencies:
|
||||
"@date-io/core" "^1.3.11"
|
||||
|
||||
"@emotion/hash@^0.7.1":
|
||||
version "0.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.2.tgz#53211e564604beb9befa7a4400ebf8147473eeef"
|
||||
integrity sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q==
|
||||
"@emotion/hash@^0.7.4":
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831"
|
||||
integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==
|
||||
|
||||
"@firebase/app-types@0.4.3", "@firebase/app-types@0.x":
|
||||
version "0.4.3"
|
||||
@@ -1229,91 +1241,86 @@
|
||||
"@babel/traverse" "^7.4.5"
|
||||
jscodeshift-add-imports "^1.0.1"
|
||||
|
||||
"@material-ui/core@^4.4.0":
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.4.1.tgz#cc9b8e417ced1ab3145fdeda41a6aee657d3524b"
|
||||
integrity sha512-LotIIGv8EDMj6mwXobsMF4WlCe+PtMjrXa34U2B0xFMdZLrNYwdOHFgkAIaE0m/ibMXTobNKWqhc5bhXLxvXoQ==
|
||||
"@material-ui/core@^4.8.3":
|
||||
version "4.8.3"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.8.3.tgz#858f758b26d8417eb39310f07fb9d7a72beb8b03"
|
||||
integrity sha512-ZJbfJQmkuZCSQTf0nzpfZwizmDdCq8ruZxnPNFnhoKDqgJpMvV8TJRi8vdI9ls1tMuTqxlhyhw8556fxOpWpFQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
"@material-ui/styles" "^4.4.1"
|
||||
"@material-ui/system" "^4.3.3"
|
||||
"@material-ui/styles" "^4.8.2"
|
||||
"@material-ui/system" "^4.7.1"
|
||||
"@material-ui/types" "^4.1.1"
|
||||
"@material-ui/utils" "^4.4.0"
|
||||
"@material-ui/utils" "^4.7.1"
|
||||
"@types/react-transition-group" "^4.2.0"
|
||||
clsx "^1.0.2"
|
||||
convert-css-length "^2.0.1"
|
||||
deepmerge "^4.0.0"
|
||||
hoist-non-react-statics "^3.2.1"
|
||||
is-plain-object "^3.0.0"
|
||||
normalize-scroll-left "^0.2.0"
|
||||
popper.js "^1.14.1"
|
||||
prop-types "^15.7.2"
|
||||
react-transition-group "^4.0.0"
|
||||
warning "^4.0.1"
|
||||
react-is "^16.8.0"
|
||||
react-transition-group "^4.3.0"
|
||||
|
||||
"@material-ui/icons@^4.4.1":
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.4.1.tgz#a09d53275a5d73a77ee621f91c005a1793432df7"
|
||||
integrity sha512-ilo6rSgsI3B5L7s1H3tBS1x77sJqPql3QJDYzVi2TVluZLCTfRKjpbYYDUwolEAQC0MzXLjVbXHqJ97VeJqpmQ==
|
||||
"@material-ui/icons@^4.5.1":
|
||||
version "4.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.5.1.tgz#6963bad139e938702ece85ca43067688018f04f8"
|
||||
integrity sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
|
||||
"@material-ui/lab@^4.0.0-alpha.26":
|
||||
version "4.0.0-alpha.26"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.26.tgz#8db16de1ab46cda5d06afdd97578536989ed3c4e"
|
||||
integrity sha512-23N43d2/DJkQKbJjg3J9DqORgmvxA9ebqpnqrA6JB8zIiDSoSuZmJu1hHUtINgMechxwWGTf73PMy9ihm0AAQA==
|
||||
"@material-ui/lab@^4.0.0-alpha.39":
|
||||
version "4.0.0-alpha.39"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.39.tgz#715ec621111ce876f1744bde1e55018341c4be3e"
|
||||
integrity sha512-TbYfqS0zWdOzH44K7x74+dcLlMe6o5zrIvvHA2y6IZ1l9a9/qLUZGLwBIOtkBPHDDDJ32rv/bOPzOGGbnxLUDw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
"@material-ui/utils" "^4.4.0"
|
||||
"@material-ui/utils" "^4.7.1"
|
||||
clsx "^1.0.4"
|
||||
prop-types "^15.7.2"
|
||||
warning "^4.0.3"
|
||||
react-is "^16.8.0"
|
||||
|
||||
"@material-ui/pickers@^3.2.5":
|
||||
version "3.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/pickers/-/pickers-3.2.5.tgz#e5c9a56c8b57ceb8bca50c4fd7b7a03cb3c918e1"
|
||||
integrity sha512-UV5UKslOcmcP4cB2wwOg1SFoXS6RTRRvCNkDclHtOa+Ni+gyZLEt3WcSQWH7oDx8A94gmkiZTpfweNFV7sC4sw==
|
||||
"@material-ui/pickers@^3.2.9":
|
||||
version "3.2.9"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/pickers/-/pickers-3.2.9.tgz#34feea26d0681264765ba41a94bf75b9f1c99ea9"
|
||||
integrity sha512-OvrqmCwvroUzRrsG7VebWDr/m/6kq5USBTH54zA75WrTG1quo/xCLHRJhjBPnu6dpfmnjyhM6b1Lut18G2jwPQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.2.0"
|
||||
"@babel/runtime" "^7.6.0"
|
||||
"@date-io/core" "1.x"
|
||||
"@types/styled-jsx" "^2.2.8"
|
||||
clsx "^1.0.2"
|
||||
react-transition-group "^4.0.0"
|
||||
rifm "^0.7.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"@material-ui/styles@^4.4.1":
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.4.1.tgz#a53fb39e373636bd2c296a78c54afecb80f68446"
|
||||
integrity sha512-wXASlta7G+N8NeihbAKQjL6E1XMkS3SWpksNKn1cxhmKYQ+5pkMAUW/rChC5ovG7C/C2ZIdajYgOz977m3xlBA==
|
||||
"@material-ui/styles@^4.8.2":
|
||||
version "4.8.2"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.8.2.tgz#841acbc4314accbe82a45cb1feb758d47448c802"
|
||||
integrity sha512-r5U+93pkpwQOmHTmwyn2sqTio6PHd873xvSHiKP6fdybAXXX6CZgVvh3W8saZNbYr/QXsS8OHmFv7sYJLt5Yfg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
"@emotion/hash" "^0.7.1"
|
||||
"@emotion/hash" "^0.7.4"
|
||||
"@material-ui/types" "^4.1.1"
|
||||
"@material-ui/utils" "^4.1.0"
|
||||
"@material-ui/utils" "^4.7.1"
|
||||
clsx "^1.0.2"
|
||||
csstype "^2.5.2"
|
||||
deepmerge "^4.0.0"
|
||||
hoist-non-react-statics "^3.2.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss-plugin-camel-case "10.0.0-alpha.24"
|
||||
jss-plugin-default-unit "10.0.0-alpha.24"
|
||||
jss-plugin-global "10.0.0-alpha.24"
|
||||
jss-plugin-nested "10.0.0-alpha.24"
|
||||
jss-plugin-props-sort "10.0.0-alpha.24"
|
||||
jss-plugin-rule-value-function "10.0.0-alpha.24"
|
||||
jss-plugin-vendor-prefixer "10.0.0-alpha.24"
|
||||
jss "^10.0.0"
|
||||
jss-plugin-camel-case "^10.0.0"
|
||||
jss-plugin-default-unit "^10.0.0"
|
||||
jss-plugin-global "^10.0.0"
|
||||
jss-plugin-nested "^10.0.0"
|
||||
jss-plugin-props-sort "^10.0.0"
|
||||
jss-plugin-rule-value-function "^10.0.0"
|
||||
jss-plugin-vendor-prefixer "^10.0.0"
|
||||
prop-types "^15.7.2"
|
||||
warning "^4.0.1"
|
||||
|
||||
"@material-ui/system@^4.3.3":
|
||||
version "4.3.3"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.3.3.tgz#8534fe76adbd3938a8dea833e69d84a7a143ecff"
|
||||
integrity sha512-j7JyvlhcTdc1wV6HzrDTU7XXlarxYXEUyzyHawOA0kCGmYVN2uFHENQRARLUdl+mEmuXO4TsAhNAiqiKakkFMg==
|
||||
"@material-ui/system@^4.7.1":
|
||||
version "4.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.7.1.tgz#d928dacc0eeae6bea569ff3ee079f409efb3517d"
|
||||
integrity sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
deepmerge "^4.0.0"
|
||||
"@material-ui/utils" "^4.7.1"
|
||||
prop-types "^15.7.2"
|
||||
warning "^4.0.1"
|
||||
|
||||
"@material-ui/types@^4.1.1":
|
||||
version "4.1.1"
|
||||
@@ -1322,14 +1329,14 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@material-ui/utils@^4.1.0", "@material-ui/utils@^4.4.0":
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.4.0.tgz#9275421e2798a067850d201212d46f12725828ad"
|
||||
integrity sha512-UXoQVwArQEQWXxf2FPs0iJGT+MePQpKr0Qh0CPoLc1OdF0GSMTmQczcqCzwZkeHxHAOq/NkIKM1Pb/ih1Avicg==
|
||||
"@material-ui/utils@^4.7.1":
|
||||
version "4.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.7.1.tgz#dc16c7f0d2cd02fbcdd5cfe601fd6863ae3cc652"
|
||||
integrity sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
prop-types "^15.7.2"
|
||||
react-is "^16.8.6"
|
||||
react-is "^16.8.0"
|
||||
|
||||
"@mrmlnc/readdir-enhanced@^2.2.1":
|
||||
version "2.2.1"
|
||||
@@ -3750,12 +3757,12 @@ css-unit-converter@^1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
|
||||
integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
|
||||
|
||||
css-vendor@^2.0.5:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.6.tgz#a205f73d7562e8728c86ef6ce5ee7c7e5eefd71b"
|
||||
integrity sha512-buv8FoZh84iMrtPHYGYll00/qSNV0gYO6E/GUCjUPTsSPj7uf/wot/QZwig+7qdFGxJ7HjOSJoclbhag09TVUQ==
|
||||
css-vendor@^2.0.7:
|
||||
version "2.0.7"
|
||||
resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.7.tgz#4e6d53d953c187981576d6a542acc9fb57174bda"
|
||||
integrity sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.5.5"
|
||||
"@babel/runtime" "^7.6.2"
|
||||
is-in-browser "^1.0.2"
|
||||
|
||||
css-what@2.1, css-what@^2.1.2:
|
||||
@@ -4023,11 +4030,6 @@ deep-is@~0.1.3:
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
|
||||
|
||||
deepmerge@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09"
|
||||
integrity sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww==
|
||||
|
||||
default-gateway@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
|
||||
@@ -6558,13 +6560,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
|
||||
dependencies:
|
||||
isobject "^3.0.1"
|
||||
|
||||
is-plain-object@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
|
||||
integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
|
||||
dependencies:
|
||||
isobject "^4.0.0"
|
||||
|
||||
is-promise@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
|
||||
@@ -6668,11 +6663,6 @@ isobject@^3.0.0, isobject@^3.0.1:
|
||||
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
|
||||
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
|
||||
|
||||
isobject@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
|
||||
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
|
||||
|
||||
isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
|
||||
@@ -7332,69 +7322,69 @@ jsprim@^1.2.2:
|
||||
json-schema "0.2.3"
|
||||
verror "1.10.0"
|
||||
|
||||
jss-plugin-camel-case@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0-alpha.24.tgz#579a48989d2628ee8baaa006449b1b82d32ee27e"
|
||||
integrity sha512-cRYLbGl6oO9wdGXp3hn+xqc8pw8bjaui25dDYuEeEsRZMh5/OKl3ByYxDT3PLKgFqouy5Xo+YmLGVH8l+nnEdQ==
|
||||
jss-plugin-camel-case@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.3.tgz#ce25f3cdb7f2b80724558361351fe6b644ca9e4f"
|
||||
integrity sha512-rild/oFKFkmRP7AoiX9D6bdDAUfmJv8c7sEBvFoi+JP31dn2W8nw4txMKGnV1LJKlFkYprdZt1X99Uvztl1hug==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
hyphenate-style-name "^1.0.3"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss-plugin-default-unit@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0-alpha.24.tgz#3e6e24e8ec7aaa950c8975f1645ea861b8aa338e"
|
||||
integrity sha512-1E1XlJqJ/9I1lR5EO/tA75U1LIIicKvW6xZEKLxAP8NC/rUjI+yBQBTBJn61LOpua51e7fgW8me46Z+iuXiC4A==
|
||||
jss-plugin-default-unit@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.3.tgz#c4b97b7b18c6cf9e9809e05b8525045decc298d3"
|
||||
integrity sha512-n+XfVLPF9Qh7IOTdQ8M4oRpjpg6egjr/r0NNytubbCafMgCILJYIVrMTGgOTydH+uvak8onQY3f/F9hasPUx6g==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss-plugin-global@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.0.0-alpha.24.tgz#a53e2028d0cb073661e8213f2e622fef9ef4b1fa"
|
||||
integrity sha512-3LoxrZloF4tvXrS5S7enV9OhtaxXsEP3BQdiE76vI/ecCmgNDZNpnPd8MG20ptn2iAOsoMGfoMX20Ea1IKl/Mg==
|
||||
jss-plugin-global@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.0.3.tgz#82bc95aa7f2c7171adc3ea47ec7717aca76a2389"
|
||||
integrity sha512-kNotkAciJIXpIGYnmueaIifBne9rdq31O8Xq1nF7KMfKlskNRANTcEX5rVnsGKl2yubTMYfjKBFCeDgcQn6+gA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss-plugin-nested@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.0.0-alpha.24.tgz#f1b4a0bd1050e29d627c9bc2dc0f424c35f0aa44"
|
||||
integrity sha512-BWU6NaRZTVSJc7N+3FeHacdkFOjCMThouoRQPCWVxeT0nmAVlVGwgYzChcI+vzncx+UaRQC0x+01FYhVQ2xAFA==
|
||||
jss-plugin-nested@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.0.3.tgz#1ff39383154a710008788dbc9f73e6dec77b2852"
|
||||
integrity sha512-OMucRs9YLvWlZ3Ew+VhdgNVMwSS2zZy/2vy+s/etvopnPUzDHgCnJwdY2Wx/SlhLGERJeKKufyih2seH+ui0iw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
tiny-warning "^1.0.2"
|
||||
|
||||
jss-plugin-props-sort@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0-alpha.24.tgz#e309e286004b6e059c373efaa308b8742e22ec16"
|
||||
integrity sha512-TB4RpXwnGSEE58rN2RRzcWqhIaz0oAS1UBg10mk1fuLpkKyHEJWuuZXzgGih23Ivl/8LDVzTF+QRY5JagMUUGg==
|
||||
jss-plugin-props-sort@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.3.tgz#8bc9f2a670fbd603f110486d28c526eb9efcbdc4"
|
||||
integrity sha512-ufhvdCMnRcDa0tNHoZ12OcVNQQyE10yLMohxo/UIMarLV245rM6n9D19A12epjldRgyiS13SoSyLFCJEobprYg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss-plugin-rule-value-function@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0-alpha.24.tgz#85bfd5f994647cb4bf2237d18232421ea362665c"
|
||||
integrity sha512-uFw4tf8PN48bdv4ZcDjG3OzKPIFZ4gpCC1cWO/dyexYfFIubX3bnQUbK4B0wPNe9LJU4KQo8s4F42B8B1ADTrA==
|
||||
jss-plugin-rule-value-function@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.3.tgz#1103240cf686bde5baee16cd7b15b0daf79d1103"
|
||||
integrity sha512-RWwIT2UBAIwf3f6DQtt5gyjxHMRJoeO9TQku+ueR8dBMakqSSe8vFwQNfjXEoe0W+Tez5HZCTkZKNMulv3Z+9A==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
jss "10.0.0-alpha.24"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss-plugin-vendor-prefixer@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0-alpha.24.tgz#c4c2c28667d3c7c0d9a01ca1f7a2f74367d1ceef"
|
||||
integrity sha512-hffKj0kSSvZsXs6RYEylpBlEGjryMzU1lsWqC5vQAT/Xb3tDe60BbEarEOFLBGv7EfyajXkuRwlXAQocV5ejCg==
|
||||
jss-plugin-vendor-prefixer@^10.0.0:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.3.tgz#cfdf2ac1263e190ee9a0d874cdcc6092df452012"
|
||||
integrity sha512-zVs6e5z4tFRK/fJ5kuTLzXlTFQbLeFTVwk7lTZiYNufmZwKT0kSmnOJDUukcSe7JLGSRztjWhnHB/6voP174gw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
css-vendor "^2.0.5"
|
||||
jss "10.0.0-alpha.24"
|
||||
css-vendor "^2.0.7"
|
||||
jss "^10.0.3"
|
||||
|
||||
jss@10.0.0-alpha.24:
|
||||
version "10.0.0-alpha.24"
|
||||
resolved "https://registry.yarnpkg.com/jss/-/jss-10.0.0-alpha.24.tgz#f8e2044b6b2f034db05a685d99c599095baf8b61"
|
||||
integrity sha512-kfuSitcj7MTrDtSPLkrWcZppgZlTE3A+cqrkC+Z10WYROt0RXIWINAaK8tE2ohwkDfUlaM1YcRYvV3iT6YNFTA==
|
||||
jss@^10.0.0, jss@^10.0.3:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/jss/-/jss-10.0.3.tgz#5c160f96aa8ce8b9f851ee0b33505dcd37f490a4"
|
||||
integrity sha512-AcDvFdOk16If9qvC9KN3oFXsrkHWM9+TaPMpVB9orm3z+nq1Xw3ofHyflRe/mkSucRZnaQtlhZs1hdP3DR9uRw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.3.1"
|
||||
csstype "^2.6.5"
|
||||
@@ -10324,11 +10314,16 @@ react-is-deprecated@^0.1.2:
|
||||
resolved "https://registry.yarnpkg.com/react-is-deprecated/-/react-is-deprecated-0.1.2.tgz#301148f86ea428fe8e673eca7a372160b7579dbd"
|
||||
integrity sha1-MBFI+G6kKP6OZz7KejchYLdXnb0=
|
||||
|
||||
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
|
||||
react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
|
||||
version "16.9.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
|
||||
integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
|
||||
|
||||
react-is@^16.8.0:
|
||||
version "16.12.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
|
||||
integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
|
||||
|
||||
react-quill@^1.3.3:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/react-quill/-/react-quill-1.3.3.tgz#95b8e088ad4e4acc6c79c2f85bdc0460eebe08eb"
|
||||
@@ -10441,7 +10436,7 @@ react-select@^1.3.0:
|
||||
prop-types "^15.5.8"
|
||||
react-input-autosize "^2.1.2"
|
||||
|
||||
react-transition-group@^4.0.0:
|
||||
react-transition-group@^4.0.0, react-transition-group@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.3.0.tgz#fea832e386cf8796c58b61874a3319704f5ce683"
|
||||
integrity sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==
|
||||
@@ -12148,7 +12143,7 @@ ts-toolbelt@^3.8.4:
|
||||
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-3.8.72.tgz#647ba67a3bd55f1e5a8057c1a7621c38b2e418a5"
|
||||
integrity sha512-rVwnPRczAamCTIs/9iUgWW12YMscmDG79M0xiUmcmWgTk8lkjxrrwzUys72wsIxNohtiNQaOhbkgQPIxqIdwmA==
|
||||
|
||||
tslib@1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
|
||||
tslib@1.10.0, tslib@^1.8.1, tslib@^1.9.0:
|
||||
version "1.10.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
|
||||
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
|
||||
@@ -12507,13 +12502,6 @@ walker@^1.0.7, walker@~1.0.5:
|
||||
dependencies:
|
||||
makeerror "1.0.x"
|
||||
|
||||
warning@^4.0.1, warning@^4.0.3:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
|
||||
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
|
||||
dependencies:
|
||||
loose-envify "^1.0.0"
|
||||
|
||||
watchpack@^1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
|
||||
|
||||
Reference in New Issue
Block a user