diff --git a/package.json b/package.json index 349aa4a27be386078d7d2cb9cf6979816355ff0e..59125a31c180a96757d82c5ba6bd404e442de348 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,7 @@ "json2csv": "^5.0.6", "jsonwebtoken": "^8.5.1", "jwt-decode": "^3.1.2", + "material-ui": "^0.20.2", "mongodb": "^3.6.4", "mongoose": "^5.11.15", "net": "^1.0.2", @@ -139,6 +140,7 @@ "portastic": "^1.0.1", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-iframe": "^1.8.0", "react-router-dom": "^5.2.0", "react-scripts": "4.0.2", "react-spinners-css": "^1.2.2", diff --git a/src/backend/helpers/createJbrowse.js b/src/backend/helpers/createJbrowse.js index d18c144ad4dd3596aa8bb288516e9a5f94a17ea1..fc1e6da12d5c83e6415c0c6c210b9606464be962 100644 --- a/src/backend/helpers/createJbrowse.js +++ b/src/backend/helpers/createJbrowse.js @@ -1,14 +1,9 @@ -const createJbrowse = (body) => { +const createJbrowse = (jbPath) => { const fs = require("fs"); const ncp = require("ncp").ncp; const path = require("path"); const source = path.join(__dirname, "../../resources/jbrowse2"); - const destination = path.join( - __dirname, - `../../resources/users/${body.name}/` - ); - console.log(`creating Jbrowse For ${body.name}`); - ncp(source, destination, function (err) { + ncp(source, jbPath, function (err) { if (err) { return console.error(err); } diff --git a/src/backend/models/Run.js b/src/backend/models/Run.js index 9ad3b7e5ead2360cd88de47805609305c93ea822..9da81d9cced76722738412238b6b0794ddde0bf1 100644 --- a/src/backend/models/Run.js +++ b/src/backend/models/Run.js @@ -152,8 +152,8 @@ const RunSchema = new Schema({ id: { type: String, required: false }, sample: { type: String, required: false }, lane: { type: String, required: false }, - techrep: { type: Number, required: false }, - biorep: { type: Number, required: false }, + techrep: { type: String, required: false }, + biorep: { type: String, required: false }, fq1: { type: String, required: false }, fq2: { type: String, required: false }, }, diff --git a/src/backend/models/User.js b/src/backend/models/User.js index 9300e6e7e05dc87de9b2e3aa76f88b9016a3e249..396ea7e78ec94f354ad58be301e60d2ea11b7e94 100644 --- a/src/backend/models/User.js +++ b/src/backend/models/User.js @@ -18,6 +18,10 @@ const UserSchema = new Schema({ type: Date, default: Date.now, }, + jbPath: { + type: String, + required: true, + }, runs: [ { type: Schema.Types.ObjectId, diff --git a/src/backend/routes/api/userController.js b/src/backend/routes/api/userController.js index 475d3e9e6329436342ff4b5864c34558a35d06d6..61524119eb16c7e3bae9d0ef5a522900c8818dc3 100644 --- a/src/backend/routes/api/userController.js +++ b/src/backend/routes/api/userController.js @@ -3,6 +3,9 @@ const router = express.Router(); const bcrypt = require("bcryptjs"); const jwt = require("jsonwebtoken"); const path = require("path"); +const portastic = require("portastic"); +const handler = require("serve-handler"); +const http = require("http"); const createJB = require("../../helpers/createJbrowse"); // Load input validation const validateRegisterInput = require("../../validation/register"); @@ -25,11 +28,16 @@ router.post("/register", (req, res) => { if (user) { return res.status(400).json({ email: "Email already exists" }); } else { - createJB(req.body); + const jbPath = path.join( + __dirname, + `../../../resources/users/${req.body.name}/` + ); + createJB(jbPath); const newUser = new User({ name: req.body.name, email: req.body.email, password: req.body.password, + jbPath, }); // Hash password before saving in database bcrypt.genSalt(10, (err, salt) => { @@ -69,24 +77,47 @@ router.post("/login", (req, res) => { if (isMatch) { // User matched // Create JWT Payload - const payload = { - id: user.id, - name: user.name, - }; - // Sign token - jwt.sign( - payload, - process.env.SECRET, - { - expiresIn: 31556926, // 1 year in seconds - }, - (err, token) => { - res.json({ - success: true, - token: "Bearer " + token, + portastic + .find({ + min: 30000, + max: 35000, + retrieve: 1, + }) + .then(function (port) { + const server = http.createServer( + (request, response) => { + return handler(request, response, { + public: user.jbPath, + }); + } + ); + server.listen(port[0], () => { + console.log(`Running at http://localhost:${port}`); + const payload = { + id: user.id, + name: user.name, + jbPath: user.jbPath, + email: user.email, + runs: user.runs, + views: user.runs, + port: port, + }; + // Sign token + jwt.sign( + payload, + process.env.SECRET, + { + expiresIn: 31556926, // 1 year in seconds + }, + (err, token) => { + res.json({ + success: true, + token: "Bearer " + token, + }); + } + ); }); - } - ); + }); } else { return res .status(400) diff --git a/src/backend/routes/api/viewController.js b/src/backend/routes/api/viewController.js index c20aa4327d7a193109e41b7f5723c14e5d682b19..0fe460c26b20abbfbe885b8e6c6951deb8179a0e 100644 --- a/src/backend/routes/api/viewController.js +++ b/src/backend/routes/api/viewController.js @@ -47,7 +47,7 @@ router.post("/visualize", (req, res) => { spawnJbrowse(req.body, uniqueDir); } }); -router.post("/nonassigned", (req, res) => { +router.post("/serve", (req, res) => { console.log(req.body); }); router.get("/", function (req, res) { diff --git a/src/components/Table/ComparisonTable.js b/src/components/Table/ComparisonTable.js index b2dbb2ea21df884bde892571baa12f983c7c5a10..9df5148a8ebc8bc39a9e57305f619d01b19cc7d7 100644 --- a/src/components/Table/ComparisonTable.js +++ b/src/components/Table/ComparisonTable.js @@ -20,6 +20,7 @@ import Typography from "@material-ui/core/Typography"; import FolderIcon from "@material-ui/icons/Folder"; import DeleteIcon from "@material-ui/icons/Delete"; import { Link } from "react-router-dom"; +import Iframe from "react-iframe"; const fs = require("fs"); const portastic = require("portastic"); @@ -126,7 +127,7 @@ export default function InteractiveList() { <Container maxWidth="lg" className={classes.container} gutterBottom> <Grid container direction="column" alignItems="center" gutterBottom> <Box m={3}> - <Button + {/* <Button alignItems="center" variant="contained" variant="outlined" @@ -135,10 +136,25 @@ export default function InteractiveList() { to="/newcomparison" > New Comparison - </Button> + </Button> */} </Box> </Grid> + {/* <Iframe + url="http://127.0.0.1:8080/" + position="absolute" + width="70%" + id="myId" + className="myClassname" + height="100%" + styles={{ height: "100%", border: "none" }} + /> */} + <iframe + src="http://127.0.0.1:8080/" + style={{ border: "none", display: "true" }} + width="100%" + height="1000" + ></iframe> {/* <FormGroup row> <FormControlLabel control={ diff --git a/src/components/Table/NewTable.js b/src/components/Table/NewTable.js index 20158a23ffb95b9c18a1ac8f47fa453aa09b95ea..723010815cc60d8a01a1e0e328f59e04aa97cb09 100644 --- a/src/components/Table/NewTable.js +++ b/src/components/Table/NewTable.js @@ -256,9 +256,9 @@ export default function NewTable() { const blankUnit = { id: uuid(), sample: "", - lane: 1, - techrep: 1, - biorep: 1, + lane: "", + techrep: "", + biorep: "", fq1: "", fq2: "", }; @@ -411,23 +411,25 @@ export default function NewTable() { {" "} <InputBase placeholder="Lane" + inputProps={{ "data-idx": index }} + label={`Lane ${index}`} + placeholder="Lane Number" required + type="text" value={unit.lane} onChange={handleUnitChange} - inputProps={{ "data-idx": index, min: "1" }} id="lane" - type="number" ></InputBase> </TableCell> <TableCell align="right"> {" "} <InputBase + inputProps={{ "data-idx": index }} onChange={handleUnitChange} placeholder="Technical Replicate" value={unit.techrep} - inputProps={{ "data-idx": index, min: "1" }} id="techrep" - type="number" + type="text" ></InputBase> </TableCell> @@ -438,9 +440,9 @@ export default function NewTable() { placeholder="Biological Replicate" value={unit.biorep} required - inputProps={{ "data-idx": index, min: "1" }} + inputProps={{ "data-idx": index }} id="biorep" - type="number" + type="text" ></InputBase> </TableCell> <TableCell align="right"> diff --git a/src/components/Tableau/listItems.js b/src/components/Tableau/listItems.js index 2eb81c10b39d8852c8b987f48cb7c46726e2a4dd..d8dcc3ece192e864283e303b58ba5f5de8e06752 100644 --- a/src/components/Tableau/listItems.js +++ b/src/components/Tableau/listItems.js @@ -29,7 +29,7 @@ export const mainListItems = ( <ListItemIcon> <BarChartIcon /> </ListItemIcon> - <ListItemText primary="Reports" /> + <ListItemText primary="Nothing" /> </ListItem> <ListItem component={Link} to="/visualization" button button> <ListItemIcon> diff --git a/src/components/Visualization/VisualizationFill.js b/src/components/Visualization/VisualizationFill.js index e37d2fc5e14376628f3f97362d70ae8e26fbb882..c9d8085f23cdb77742fc4cab1dac0b6946a12af1 100644 --- a/src/components/Visualization/VisualizationFill.js +++ b/src/components/Visualization/VisualizationFill.js @@ -17,6 +17,8 @@ import DialogContent from "@material-ui/core/DialogContent"; import DialogContentText from "@material-ui/core/DialogContentText"; import DialogTitle from "@material-ui/core/DialogTitle"; import { Link } from "react-router-dom"; +import ButtonGroup from "@material-ui/core/ButtonGroup"; + const electron = window.require("electron"); const { shell } = window.require("electron"); const remote = electron.remote; @@ -24,7 +26,8 @@ const { BrowserWindow } = remote; import Grid from "@material-ui/core/Grid"; import Typography from "@material-ui/core/Typography"; import FolderIcon from "@material-ui/icons/Folder"; -const handler = require("serve-handler"); +const fs = require("fs"); + const http = require("http"); import IconButton from "@material-ui/core/IconButton"; import CommentIcon from "@material-ui/icons/Comment"; @@ -41,18 +44,7 @@ const useStyles = makeStyles((theme) => ({ export default function VisualizationFill() { const classes = useStyles(); - const [dense, setDense] = useState(false); - const [secondary, setSecondary] = useState(false); - const [open, setOpen] = useState(false); - const handleClickOpen = () => { - setOpen(true); - }; - - const handleClose = () => { - setOpen(false); - }; - const [checked, setChecked] = useState([0]); - const [openJB, setOpenJB] = useState([]); + const [checked, setChecked] = useState([]); const { user } = useAuth(); const handleToggle = (genome) => () => { @@ -69,7 +61,6 @@ export default function VisualizationFill() { }; const [data, setData] = useState([]); const [views, setViews] = useState([]); - useEffect(() => { const fetchData = async () => { const token = localStorage.jwtToken; @@ -107,6 +98,7 @@ export default function VisualizationFill() { fetchData(); }, []); + useEffect(() => { const fetchData = async () => { const token = localStorage.jwtToken; @@ -156,62 +148,48 @@ export default function VisualizationFill() { }; const handleClick = () => { - portastic - .find({ - min: 30000, - max: 35000, - retrieve: 1, - }) - .then(function (port) { - window.ipcRenderer.send("ping", port[0]); - const request = { - port: port[0], - genomes: - "/home/shatira/Documents/Demo_Data/genome/Malus_domestica_cultivar_Golden_Delicious-chr4.fasta", - outdir: "/home/shatira/Bureau/jbrowse2", - userId: user.user.id, - }; - const token = localStorage.jwtToken; - const options = { - method: "POST", - path: "http://localhost/api/jbrowse/visualize", - socketPath: sessionStorage.Sock, - hostname: "unix", - port: null, - headers: { - "Content-Type": "application/json", - Authorization: token, - }, - }; - - const req = http.request(options, function (res) { - const chunks = []; - console.log("STATUS: " + res.statusCode); - console.log("HEADERS: " + JSON.stringify(res.headers)); - res.on("data", function (chunk) { - chunks.push(chunk); - }); - res.on("error", (err) => console.log(err)); - res.on("end", function () { - const body = Buffer.concat(chunks).toString(); + const request = { + genomes: checked, + userId: user.user.id, + }; + const token = localStorage.jwtToken; + const options = { + method: "POST", + path: "http://localhost/api/jbrowse/visualize", + socketPath: sessionStorage.Sock, + hostname: "unix", + port: null, + headers: { + "Content-Type": "application/json", + Authorization: token, + }, + }; + const req = http.request(options, function (res) { + const chunks = []; + console.log("STATUS: " + res.statusCode); + console.log("HEADERS: " + JSON.stringify(res.headers)); + res.on("data", function (chunk) { + chunks.push(chunk); + }); + res.on("error", (err) => console.log(err)); + res.on("end", function () { + const body = Buffer.concat(chunks).toString(); - const jsbody = JSON.parse(body); - if (res.statusCode !== 200) { - console.log("failed post request"); - } else { - console.log("successful post request"); - } - }); - }); - req.on("error", (err) => console.log(err)); - req.write(JSON.stringify(request)); - req.end(); - setOpenJB([...openJB, `http:///localhost:${port}`]); - setOpen(false); - shell.openExternal(`http:///localhost:${port}`); + const jsbody = JSON.parse(body); + if (res.statusCode !== 200) { + console.log("failed post request"); + } else { + console.log("successful post request"); + } }); + }); + req.on("error", (err) => console.log(err)); + req.write(JSON.stringify(request)); + req.end(); + setOpen(false); + shell.openExternal(`http:///localhost:${user.user.port[0]}`); }; - console.log(openJB); + const blankSample = {}; const helper = {}; const result = data.reduce(function (r, o) { @@ -228,194 +206,165 @@ export default function VisualizationFill() { console.log(result); - const handleServe = (outdir) => { - portastic - .find({ - min: 30000, - max: 35000, - retrieve: 1, - }) - .then(function (port) { - console.log(outdir); - const server = http.createServer((request, response) => { - return handler(request, response, { public: outdir }); - }); - server.listen(port[0], () => { - console.log(`Running at http://localhost:${port}`); - }); - shell.openExternal(`http:///localhost:${port}`); - }); + const handleServe = () => { + shell.openExternal(`http:///localhost:${user.user.port[0]}`); }; return ( <Container maxWidth="lg" className={classes.container} gutterBottom> <Grid container direction="column" alignItems="center" gutterBottom> <Box m={3}> {" "} - <Button - alignItems="center" - variant="contained" - variant="outlined" + <ButtonGroup color="primary" - onClick={handleClickOpen} + aria-label="outlined primary button group" > - New Jbrowse - </Button> + <Button + alignItems="center" + variant="contained" + variant="outlined" + color="primary" + onClick={handleServe} + > + Start Jbrowse{" "} + </Button> + <Button + alignItems="center" + variant="contained" + variant="outlined" + color="primary" + > + Reset Jbrowse{" "} + </Button> + <Button alignItems="center" variant="contained" color="primary"> + Populate Jbrowse{" "} + </Button> + </ButtonGroup> </Box> </Grid> - <Dialog - open={open} - onClose={handleClose} - aria-labelledby="alert-dialog-title" - aria-describedby="alert-dialog-description" - > - <DialogTitle id="alert-dialog-title"> - {"Create a new Jbrowse Intance?"} - </DialogTitle> - <DialogContent> - <DialogContentText id="alert-dialog-description"> - Select the assemblies and tracks you want in your Jbrowse Instance, - Please note that a whole new Instance is created with a copy of all - selected files inside , this can quickly consume a lot of space. - </DialogContentText> - <List className={classes.root}> - {result.map((genome, idx) => { - const labelId = `checkbox-list-label-${genome}`; - console.log(idx); - return ( - <ListItem - key={idx} - role={undefined} - dense - button - onClick={handleToggle(idx)} - > - <ListItemIcon> - <Checkbox - edge="start" - checked={checked.indexOf(idx) !== -1} - tabIndex={-1} - disableRipple - inputProps={{ "aria-labelledby": labelId }} - /> - </ListItemIcon> - <ListItemText id={labelId} primary={`${genome.genome}`} /> - <ListItemSecondaryAction> - <IconButton edge="end" aria-label="comments"> - <CommentIcon /> - </IconButton> - </ListItemSecondaryAction> - </ListItem> - ); - })} - </List> - <List className={classes.root}> - {data && - data.map((row) => { - console.log(row); - row.samples.map((sample) => { + <List subheader={"Genomes"}> + {result.map((genome, idx) => { + console.log(user.user.jbPath, genome.genome); + const labelId = `checkbox-list-label-${genome}`; + console.log(idx); + if (!fileExist(path.join(user.user.jbPath, genome.genome))) { + return ( + <ListItem + key={idx} + button + onClick={handleToggle(genome.genomePath)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(genome.genomePath) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={`${genome.genome}`} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"> + <CommentIcon /> + </IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + } + })} + </List> + <List subheader={"Bam Files"}> + {data.map((row) => { + const labelId = `checkbox-list-label-${row}`; + return ( + <div> + {row.samples.map((sample) => { + const samplePath = `${row.outdir}/results/${sample.samplePath}/alignment_bismark/${sample.sampleName}.deduplicated.bam`; + if ( + fileExist(samplePath) && + !fileExist( + path.join( + user.user.jbPath, + `${sample.sampleName}.deduplicated.bam` + ) + ) + ) { return ( - <ListItemText - primary={`${row.outdir}/results/${sample.samplePath}/alignment_bismark/${sample.sampleName}.deduplicated.bam`} - /> - ); - }); - })} - </List> - </DialogContent> - <DialogActions> - <Button onClick={handleClose} color="primary"> - Quit - </Button> - <Button onClick={handleClick} color="primary" autoFocus> - Create - </Button> - </DialogActions> - </Dialog> - - <Grid container spacing={2}> - {views.length > 0 ? ( - views.map((view) => ( - <Grid key={view._id} item xs={12} md={6}> - <List dense={dense}> - <ListItem - button - onClick={() => { - const path = `${view.outdir}/index.html`; - handleServe(view.outdir); - }} - > - Jbrowse Instance created by {view.createdBy.name} - </ListItem> - </List> - - <div className={classes.demo}> - <List dense={dense}> - {/* {view.samples.map((sample) => ( <ListItem + key={row._id} button - disabled={ - fileExist( - `${view.outdir}/results/${sample.samplePath}/multiqc_report.html` - ) - ? false - : true - } - key={sample._id} - onClick={() => { - const path = `${view.outdir}/results/${sample.samplePath}/multiqc_report.html`; - console.log(path); - createBrowserWindow(path); - }} + onClick={handleToggle(samplePath)} > - <ListItemAvatar> - <Avatar> - <FolderIcon /> - </Avatar> - </ListItemAvatar> + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(samplePath) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> <ListItemText - primary={sample.sample} - secondary={secondary ? "Secondary text" : null} + id={labelId} + primary={`${sample.sampleName}.deduplicated.bam`} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"> + <CommentIcon /> + </IconButton> + </ListItemSecondaryAction> </ListItem> - ))} */} - {/* {generate( - <ListItem> - <ListItemAvatar> - <Avatar> - <FolderIcon /> - </Avatar> - </ListItemAvatar> - <ListItemText - primary="Single-line item" - secondary={secondary ? "Secondary text" : null} - /> - <ListItemSecondaryAction> - <IconButton edge="end" aria-label="delete"> - <DeleteIcon /> - </IconButton> - </ListItemSecondaryAction> - </ListItem> - )} */} - </List> - </div> - </Grid> - )) - ) : ( - <Grid - container - spacing={0} - direction="column" - alignItems="center" - justify="center" - style={{ minHeight: "70vh" }} - > - <Typography variant="h6" className={classes.title}> - You have no analyses to view{" "} - </Typography> - </Grid> - )} - </Grid> + ); + } + })} + </div> + ); + // console.log(row); + // { + // row.samples.map((sample) => { + // console.log( + // `${row.outdir}/results/${sample.samplePath}/alignment_bismark/${sample.sampleName}.deduplicated.bam` + // ); + // if ( + // !fileExist( + // path.join( + // user.user.jbPath, + // `${sample.sampleName}.deduplicated.bam` + // ) + // ) + // ) { + // return ( + // <ListItem + // key={row._id} + // button + // onClick={handleToggle(row._id)} + // > + // <ListItemIcon> + // <Checkbox + // edge="start" + // checked={checked.indexOf(row._id) !== -1} + // tabIndex={-1} + // disableRipple + // inputProps={{ "aria-labelledby": labelId }} + // /> + // </ListItemIcon> + // <ListItemText + // id={labelId} + // primary={`${row.outdir}/results/${sample.samplePath}/alignment_bismark/${sample.sampleName}.deduplicated.bam`} + // /> + // <ListItemSecondaryAction> + // <IconButton edge="end" aria-label="comments"> + // <CommentIcon /> + // </IconButton> + // </ListItemSecondaryAction> + // </ListItem> + // ); + // } + // }); + // } + })} + </List> </Container> ); } diff --git a/src/index.js b/src/index.js index df6e1bff97a7b8183c45281b3f42bc94f6c2a517..9880431d8c5dc62b8474decfce28d82fe0641206 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,9 @@ import App from "./App"; const electron = window.require("electron"); const remote = electron.remote; sessionStorage.setItem("Sock", remote.getGlobal("sharedObj").prop1); +sessionStorage.setItem("Jbrowse", remote.getGlobal("sharedObj").jbrowse); +sessionStorage.setItem("Shiny", remote.getGlobal("sharedObj").shiny); +console.log(sessionStorage); function render() { ReactDOM.render( <React.Fragment> diff --git a/src/main.js b/src/main.js index e40425161a96957b74dceaa541b56bf877268c52..b4d02791de6934ec59f7737bd4c694cd790296b9 100644 --- a/src/main.js +++ b/src/main.js @@ -8,6 +8,7 @@ const { } = require("electron"); const path = require("path"); const fs = require("fs"); + const server = require("../src/backend/spawnServer.js"); // const mongod = require("./backend/spawnMongod.js"); @@ -116,9 +117,9 @@ const createWindow = () => { if (isDev) { mainWindow.webContents.openDevTools(); } - // installExtension(REACT_DEVELOPER_TOOLS) - // .then((name) => console.log(`Added Extension: ${name}`)) - // .catch((err) => console.log("An error occurred: ", err)); + installExtension(REACT_DEVELOPER_TOOLS) + .then((name) => console.log(`Added Extension: ${name}`)) + .catch((err) => console.log("An error occurred: ", err)); }; // This method will be called when Electron has finished // initialization and is ready to create browser windows. diff --git a/src/preload.js b/src/preload.js index e698cfd98047f9ad8850771d50f6d4e41d604317..5aca6c1b59b0cb1395400752bee94ddb60103e80 100644 --- a/src/preload.js +++ b/src/preload.js @@ -1,4 +1,5 @@ window.ipcRenderer = require("electron").ipcRenderer; + // window.ipcRenderer.on("ping", (event, sock) => { // console.log("right here bruh"); diff --git a/yarn.lock b/yarn.lock index 74f4b64f8b337095bd907fc43657d32a7f645d8f..6377236ea3a59b35d73556f75b1bc37ac47b9ffe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3814,7 +3814,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@~2.0.6: +asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -4175,7 +4175,7 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.26.0: +babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -4394,6 +4394,11 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570" integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== +bowser@^1.7.3: + version "1.9.4" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" + integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== + boxen@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -4930,6 +4935,11 @@ caw@^2.0.0: tunnel-agent "^0.6.0" url-to-options "^1.0.1" +chain-function@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.1.tgz#c63045e5b4b663fb86f1c6e186adaf1de402a1cc" + integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== + chainsaw@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" @@ -4982,6 +4992,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -5676,6 +5691,11 @@ core-js-pure@^3.0.0: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.0.tgz#326cc74e1fef8b7443a6a793ddb0adfcd81f9efb" integrity sha512-3pEcmMZC9Cq0D4ZBh3pe2HLtqxpGNJBLXF/kZ2YzK17RbKp94w0HFbdbSx8H8kAlZG5k76hvLrkPm57Uyef+kg== +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + core-js@^2.4.0, core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -5912,6 +5932,14 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + css-loader@4.3.0, css-loader@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" @@ -6698,7 +6726,7 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^3.4.0: +dom-helpers@^3.2.0, dom-helpers@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -7200,7 +7228,7 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -8024,6 +8052,19 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -9165,6 +9206,11 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -9413,7 +9459,7 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -hyphenate-style-name@^1.0.3: +hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== @@ -9629,6 +9675,14 @@ ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inline-style-prefixer@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534" + integrity sha1-hVG45bTVcyROZqNLBPfTIHaitTQ= + dependencies: + bowser "^1.7.3" + css-in-js-utils "^2.0.0" + inquirer@^7.3.3: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -10151,7 +10205,7 @@ is-set@^2.0.1, is-set@^2.0.2: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -10298,6 +10352,14 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -11159,6 +11221,11 @@ keyboardevents-areequal@^0.2.1: resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== +keycode@^2.1.8: + version "2.2.0" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" + integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -11440,6 +11507,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -11665,6 +11737,23 @@ material-colors@^1.2.1: resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== +material-ui@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.20.2.tgz#5fc9b4b62b691d3b16c89d8e54597a0412b52c7d" + integrity sha512-VeqgQkdvtK193w+FFvXDEwlVxI4rWk83eWbpYLeOIHDPWr3rbB9B075JRnJt/8IsI2X8q5Aia5W3+7m4KkleDg== + dependencies: + babel-runtime "^6.23.0" + inline-style-prefixer "^3.0.8" + keycode "^2.1.8" + lodash.merge "^4.6.0" + lodash.throttle "^4.1.1" + prop-types "^15.5.7" + react-event-listener "^0.6.2" + react-transition-group "^1.2.1" + recompose "^0.26.0" + simple-assign "^0.1.0" + warning "^3.0.0" + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -12309,6 +12398,14 @@ node-fetch@2.6.1, node-fetch@^2.6.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -14231,6 +14328,13 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promise@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -14246,7 +14350,7 @@ prompts@2.4.0, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -14932,6 +15036,15 @@ react-error-overlay@^6.0.9: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== +react-event-listener@^0.6.2: + version "0.6.6" + resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" + integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== + dependencies: + "@babel/runtime" "^7.2.0" + prop-types "^15.6.0" + warning "^4.0.1" + react-hot-loader@^4.13.0: version "4.13.0" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.13.0.tgz#c27e9408581c2a678f5316e69c061b226dc6a202" @@ -14946,6 +15059,13 @@ react-hot-loader@^4.13.0: shallowequal "^1.1.0" source-map "^0.7.3" +react-iframe@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/react-iframe/-/react-iframe-1.8.0.tgz#8c78f2c59b894ca5605fa7e45e61e27e57e96091" + integrity sha512-NYi89+rEqREwQxW9sDf+akh6/dtwWd3bOjByoVEIQ7SicOxVawRMer3pLdWjFaHXpuxTB9NqobPf/Ohj2iAKkg== + dependencies: + object-assign "^4.1.1" + react-is@16.10.2: version "16.10.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" @@ -15150,6 +15270,17 @@ react-syntax-highlighter@^14.0.0: prismjs "^1.21.0" refractor "^3.1.0" +react-transition-group@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" + integrity sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q== + dependencies: + chain-function "^1.0.0" + dom-helpers "^3.2.0" + loose-envify "^1.3.1" + prop-types "^15.5.6" + warning "^3.0.0" + react-transition-group@^2.3.1, react-transition-group@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" @@ -15387,6 +15518,16 @@ recharts@^2.0.8: recharts-scale "^0.4.2" reduce-css-calc "^2.1.7" +recompose@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" + integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== + dependencies: + change-emitter "^0.1.2" + fbjs "^0.8.1" + hoist-non-react-statics "^2.3.1" + symbol-observable "^1.0.4" + recursive-readdir@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -16263,7 +16404,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@~1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -16366,6 +16507,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +simple-assign@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/simple-assign/-/simple-assign-0.1.0.tgz#17fd3066a5f3d7738f50321bb0f14ca281cc4baa" + integrity sha1-F/0wZqXz13OPUDIbsPFMooHMS6o= + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -17090,7 +17236,7 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@1.2.0: +symbol-observable@1.2.0, symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -17723,6 +17869,11 @@ typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= +ua-parser-js@^0.7.18: + version "0.7.26" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.26.tgz#b3731860e241419abd5b542b1a0881070d92e0ce" + integrity sha512-VwIvGlFNmpKbjzRt51jpbbFTrKIEgGHxIwA8Y69K1Bqc6bTIV7TaGGABOkghSFQWsLmcRB4drGvpfv9z2szqoQ== + uglify-js@^3.1.4: version "3.13.2" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.2.tgz#fe10319861bccc8682bfe2e8151fbdd8aa921c44" @@ -18166,6 +18317,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= + dependencies: + loose-envify "^1.0.0" + warning@^4.0.1, warning@^4.0.2, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -18405,7 +18563,7 @@ whatwg-fetch@2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -whatwg-fetch@^3.0.0: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==