From 79be2b8155cf22259f6651baafd875929bca13a2 Mon Sep 17 00:00:00 2001 From: Absurdon Date: Sun, 11 Oct 2020 19:47:33 +0200 Subject: [PATCH] docker+upgrade * Updated dependencies - React update needed transformation of React.createClass to ES2015 classes - removed some deprecations/deprecated packages - added mulitple @types Dependencies to devDependencies for IDE code completion support * added Docker related files - Dockerfile with build container - docker-compose.yml with mongodb and app --- .dockerignore | 9 + .env.example | 12 + .gitignore | 4 +- Dockerfile | 28 + app/javascripts/app.js | 9 +- app/javascripts/components/admin.js | 209 +- app/javascripts/components/discord.js | 119 +- app/javascripts/components/event.js | 59 +- app/javascripts/components/gather.js | 2141 +++++++++--------- app/javascripts/components/gatherArchive.js | 61 +- app/javascripts/components/info.js | 26 +- app/javascripts/components/main.js | 944 ++++---- app/javascripts/components/menubar.js | 31 +- app/javascripts/components/message.js | 880 ++++---- app/javascripts/components/news.js | 199 +- app/javascripts/components/settings.js | 95 +- app/javascripts/components/snowMachine.js | 60 +- app/javascripts/components/sound.js | 509 ++--- app/javascripts/components/user.js | 708 +++--- app/javascripts/helper.js | 128 +- bin/entry.sh | 11 + brunch-config.js | 17 +- config/express.js | 38 +- db/index.js | 25 +- docker-compose.yml | 38 + lib/ensl/client.js | 163 +- package-lock.json | 2158 ++++++++++--------- package.json | 30 +- scripts/unmarshal.rb | 13 - 29 files changed, 4494 insertions(+), 4230 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 bin/entry.sh create mode 100644 docker-compose.yml delete mode 100644 scripts/unmarshal.rb diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..69ceeeb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +.snyk +*.md +db/data +Procfile +Dockerfile +docker-compose.yml +.env* +.nvmrc diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8be8911 --- /dev/null +++ b/.env.example @@ -0,0 +1,12 @@ +NODE_PORT=8080 +RAILS_SECRET=secret +NEW_RELIC_LICENSE_KEY=secret +GATHER_STEAM_ACCOUNT=gatherbot +GATHER_STEAM_PASSWORD=secret +GATHER_DISCORD_HOOK_ID=someid +GATHER_DISCORD_HOOK_TOKEN=secret +NODE_ENV=production + +MONGODB_USERNAME=ensl_gather +MONGODB_PASSWORD=supersecret +MONGODB_DATABASE=ensl_gather diff --git a/.gitignore b/.gitignore index 86d5723..851a115 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ public/app.js.map public/app.css public/app.css.map public/vendor.js -public/vendor.js.map \ No newline at end of file +public/vendor.js.map +db/data +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2bc6914 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM bitnami/node:12 AS builder + +COPY package*.json /app/ +WORKDIR /app +RUN ["npm", "install"] + +COPY . /app +RUN ["npm", "run", "compile_production" ] +RUN ["npm", "prune","--production"] + + +FROM bitnami/node:12-prod AS production +ENV NODE_ENV="production" +ENV PORT=8000 + +RUN ["adduser", "web", "--disabled-password"] + +COPY --chown=web:web --from=builder /app /app +USER web +WORKDIR /app + +RUN /bin/mkdir -p /home/web/tmp/public +RUN /bin/cp -r ./public /home/web/tmp/public +RUN /usr/bin/touch /home/web/tmp/.updatePublic + +EXPOSE 8000 + +CMD ["node", "index.js"] diff --git a/app/javascripts/app.js b/app/javascripts/app.js index 950376f..0a42303 100644 --- a/app/javascripts/app.js +++ b/app/javascripts/app.js @@ -1,9 +1,10 @@ -const React = require("react"); -const ReactDOM = require("react-dom"); -const App = require("javascripts/components/main"); +import React from "react"; +import ReactDOM from "react-dom"; +import { App } from "./components/main"; + module.exports = function (mount) { - ReactDOM.render(, mount); + ReactDOM.render(, mount); }; toastr.options = { diff --git a/app/javascripts/components/admin.js b/app/javascripts/components/admin.js index 712f8cd..dd5f034 100644 --- a/app/javascripts/components/admin.js +++ b/app/javascripts/components/admin.js @@ -1,114 +1,119 @@ -const React = require("react"); -import {MenubarMixin} from "javascripts/components/menubar"; +import React from "react"; +import { object } from "prop-types" +import { MenubarMixin } from "javascripts/components/menubar"; -const UserLogin = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired - }, +class UserLogin extends React.Component { + static propTypes = { + socket: object.isRequired + } - getInitialState() { - return { - userId: null - }; - }, + state = { + userId: null + } - handleChange(e) { - const newId = e.target.value || null; - this.setState({ userId: newId }); - }, + handleChange = (e) => { + const newId = e.target.value || null; + this.setState({ userId: newId }); + } - authorizeId(id) { - this.props.socket.emit("users:authorize", { - id: id - }); - }, + authorizeId = (id) => { + this.props.socket.emit("users:authorize", { + id: id + }); + } - handleSubmit(e) { - e.preventDefault(); - this.authorizeId(this.state.userId); - }, + handleSubmit = (e) => { + e.preventDefault(); + this.authorizeId(this.state.userId); + } - render() { - return ( -
-
- - - - -
-
- ); - } -}); + render = () => { + return ( +
+
+ + + + +
+
+ ); + } +} -const ResetGatherButton = exports.ResetGatherButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired - }, +class ResetGatherButton extends React.Component { + static propTypes = { + socket: object.isRequired, + gather: object.isRequired + } - handleGatherReset() { - this.props.socket.emit("gather:reset", { - type: this.props.gather.type - }); - }, + handleGatherReset = () => { + this.props.socket.emit("gather:reset", { + type: this.props.gather.type + }); + } - render() { - return ( - - ); - } -}); + render = () => { + return ( + + ); + } +} -const AdminPanel = exports.AdminPanel = React.createClass({ - mixins: [MenubarMixin], +class AdminPanel extends MenubarMixin(React.Component) { - propTypes: { - socket: React.PropTypes.object.isRequired, - gatherPool: React.PropTypes.object.isRequired - }, + static propTypes = { + socket: object.isRequired, + gatherPool: object.isRequired + } - render() { - const gatherPool = this.props.gatherPool; - const resetButtons = []; - for (let attr in gatherPool) { - let gather = gatherPool[attr]; - resetButtons.push( - - ); - } - return ( -
  • - - - -
      -
    • Admin
    • -
        -
        Swap Into a Different Account (Only works for admins)
        - -
        Gather Options
        -
        - {resetButtons} -
        -
      -
    -
  • - ); - } -}); \ No newline at end of file + constructor(props) { + super(props) + this.state = super.getInitialState(); + } + + render = () => { + const gatherPool = this.props.gatherPool; + const resetButtons = []; + for (let attr in gatherPool) { + let gather = gatherPool[attr]; + resetButtons.push( + + ); + } + return ( +
  • + + + +
      +
    • Admin
    • +
        +
        Swap Into a Different Account (Only works for admins)
        + +
        Gather Options
        +
        + {resetButtons} +
        +
      +
    +
  • + ); + } +} + +export { AdminPanel, ResetGatherButton } diff --git a/app/javascripts/components/discord.js b/app/javascripts/components/discord.js index d857ff5..6701b2a 100644 --- a/app/javascripts/components/discord.js +++ b/app/javascripts/components/discord.js @@ -1,71 +1,70 @@ -const React = require("react"); +import React from "react"; const discordDefaults = { - url: "https://discord.gg/Bvs3KjX", - alien: { - channel: "https://discord.gg/UcN724q", - }, - marine: { - channel: "https://discord.gg/eGwfHXz", - } + url: "https://discord.gg/Bvs3KjX", + alien: { + channel: "https://discord.gg/UcN724q", + }, + marine: { + channel: "https://discord.gg/eGwfHXz", + } }; -const DiscordButton = exports.DiscordButton = React.createClass({ - getInitialState() { - return { - open: false - }; - }, - toggleOpen(e) { - e.preventDefault(); - this.setState({ open: !this.state.open }); - }, - getDefaultProps() { - return discordDefaults - }, +export class DiscordButton extends React.Component { - marineUrl() { - return discordDefaults.marine.channel; - }, + static defaultProps = discordDefaults - alienUrl() { - return discordDefaults.alien.channel; - }, + state = { + open: false + } - chevron() { - if (this.state.open) { - return ; - } else { - return ; - } - }, + toggleOpen = (e) => { + e.preventDefault(); + this.setState({ open: !this.state.open }); + } - render() { - const open = this.state.open; - let componentClass = ["treeview"]; - let dropdown; - if (open) { - componentClass.push("active"); - dropdown = ( - - ); - } - return ( -
  • - - Discord - {this.chevron()} - - {dropdown} -
  • - ); - } -}); + marineUrl = () => discordDefaults.marine.channel; + + + alienUrl() { + return discordDefaults.alien.channel; + } + + chevron = () => { + if (this.state.open) { + return ; + } else { + return ; + } + } + + render = () => { + const open = this.state.open; + let componentClass = ["treeview"]; + let dropdown; + if (open) { + componentClass.push("active"); + dropdown = ( + + ); + } + + return ( +
  • + + Discord + {this.chevron()} + + {dropdown} +
  • + ); + } +} diff --git a/app/javascripts/components/event.js b/app/javascripts/components/event.js index d7d6840..b2bb5ee 100644 --- a/app/javascripts/components/event.js +++ b/app/javascripts/components/event.js @@ -1,30 +1,33 @@ -const React = require("react"); -const Events = exports.Events = React.createClass({ - propTypes: { - events: React.PropTypes.array.isRequired - }, +import React from "react"; +import { array } from "prop-types"; +class Events extends React.Component { + static propTypes = { + events: array.isRequired + } - getTime(timeString) { - return (new Date(timeString)).toTimeString().match(/^[\d:]*/)[0]; - }, + getTime(timeString) { + return (new Date(timeString)).toTimeString().match(/^[\d:]*/)[0]; + } - render() { - let events; - if (this.props.events.length) { - events = this.props.events.map(event => { - return `${this.getTime(event.createdAt)} ${event.description}`; - }).join("\n"); - return ( -
    -					{events}
    -				
    - ); - } else { - return ( -
    -					Listening for new events...
    -				
    - ); - } - } -}); + render = () => { + let events; + if (this.props.events.length) { + events = this.props.events.map(event => { + return `${this.getTime(event.createdAt)} ${event.description}`; + }).join("\n"); + return ( +
    +          {events}
    +        
    + ); + } else { + return ( +
    +          Listening for new events...
    +        
    + ); + } + } +} + +export { Events } diff --git a/app/javascripts/components/gather.js b/app/javascripts/components/gather.js index ddc11c5..877ef16 100644 --- a/app/javascripts/components/gather.js +++ b/app/javascripts/components/gather.js @@ -1,1178 +1,1173 @@ import { AssumeUserIdButton } from "javascripts/components/user"; +import React from "react" +import { object, array, number, string, func } from "prop-types"; -const React = require("react"); -const helper = require("javascripts/helper"); -const enslUrl = helper.enslUrl; -const rankVotes = helper.rankVotes; -const obsUrl = helper.observatoryUrl; +import { enslUrl, rankVotes, observatoryUrl as obsUrl } from "../helper" -const SelectPlayerButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - gatherer: React.PropTypes.object.isRequired - }, +class SelectPlayerButton extends React.Component { + static propTypes = { + socket: object.isRequired, + gather: object.isRequired, + gatherer: object.isRequired + } - selectPlayer(e) { - e.preventDefault(); - this.props.socket.emit("gather:select", { - type: this.props.gather.type, - player: parseInt(e.target.value, 10) - }); - }, + selectPlayer = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:select", { + type: this.props.gather.type, + player: parseInt(e.target.value, 10) + }); + } - render() { - let button; - if (this.props.gatherer.leader) { - button = ; - } else if (this.props.gatherer.team !== "lobby") { - button = ; - } else { - button = ; + } else if (this.props.gatherer.team !== "lobby") { + button = ; + } else { + button = ; - } - return button; - } -}); + } + return button; + } +} -const GathererList = React.createClass({ - memberList() { - const self = this; - return this.props.gather.gatherers - .filter(gatherer => gatherer.team === self.props.team) - .sort(gatherer => { return gatherer.leader ? 1 : -1 }); - }, +class GathererList extends React.Component { + memberList = () => { + const self = this; + return this.props.gather.gatherers + .filter(gatherer => gatherer.team === self.props.team) + .sort(gatherer => { return gatherer.leader ? 1 : -1 }); + } - render() { - const extractGatherer = gatherer => { - let image; - if (gatherer.leader) { - image = ; - } - return ( - - - {image}{gatherer.user.username} - - - - - - ); - }; - const members = this.memberList() - .map(extractGatherer); - return ( - - - {members} - -
    - ); - } -}); + render = () => { + const extractGatherer = gatherer => { + let image; + if (gatherer.leader) { + image = ; + } + return ( + + + {image}{gatherer.user.username} + + + + + + ); + }; + const members = this.memberList() + .map(extractGatherer); + return ( + + + {members} + +
    + ); + } +} -const GatherTeams = React.createClass({ - render() { - return ( -
    -
    -
    -
    - Marines +class GatherTeams extends React.Component { + render = () => { + return ( +
    +
    +
    +
    + Marines
    - -
    -
    -
    -
    -
    - Aliens + +
    +
    +
    +
    +
    + Aliens
    - -
    -
    -
    - ); - } -}); + +
    +
    +
    + ); + } +} -const ElectionProgressBar = React.createClass({ - componentDidMount() { - const self = this; - this.timer = setInterval(() => { - self.forceUpdate(); - }, 900); - }, +class ElectionProgressBar extends React.Component { + componentDidMount = () => { + const self = this; + this.timer = setInterval(() => { + self.forceUpdate(); + }, 900); + } - progress() { - const interval = this.props.gather.election.interval; - const startTime = (new Date(this.props.gather.election.startTime)).getTime(); - const msTranspired = Math.floor((new Date()).getTime() - startTime); + progress = () => { + const interval = this.props.gather.election.interval; + const startTime = (new Date(this.props.gather.election.startTime)).getTime(); + const msTranspired = Math.floor((new Date()).getTime() - startTime); - return { - num: msTranspired, - den: interval, - barMessage: Math.floor((interval - msTranspired) / 1000) + "s remaining" - } - }, + return { + num: msTranspired, + den: interval, + barMessage: Math.floor((interval - msTranspired) / 1000) + "s remaining" + } + } - componentWillUnmount() { - clearInterval(this.timer); - }, + componentWillUnmount = () => { + clearInterval(this.timer); + } - render() { - return (); - } -}); + render() { + return (); + } +} -const ProgressBar = React.createClass({ - render() { - const progress = this.props.progress; - const style = { - width: Math.round((progress.num / progress.den * 100)) + "%" - }; - const barMessage = progress.barMessage || ""; - return ( -
    -
    {barMessage} -
    -
    - ); - } -}); +class ProgressBar extends React.Component { + render = () => { + const progress = this.props.progress; + const style = { + width: Math.round((progress.num / progress.den * 100)) + "%" + }; + const barMessage = progress.barMessage || ""; + return ( +
    +
    {barMessage} +
    +
    + ); + } +} -const GatherProgress = React.createClass({ - stateDescription() { - switch (this.props.gather.state) { - case "gathering": - return "Waiting for more gatherers."; - case "election": - return "Currently voting for team leaders."; - case "selection": - return "Waiting for leaders to pick teams."; - case "done": - return "Gather completed."; - default: - return "Initialising gather."; - } - }, +class GatherProgress extends React.Component { + stateDescription = () => { + switch (this.props.gather.state) { + case "gathering": + return "Waiting for more gatherers."; + case "election": + return "Currently voting for team leaders."; + case "selection": + return "Waiting for leaders to pick teams."; + case "done": + return "Gather completed."; + default: + return "Initialising gather."; + } + } - gatheringProgress() { - const gather = this.props.gather; - const num = gather.gatherers.length; - const den = gather.teamSize * 2; - const remaining = den - num; - const message = (remaining === 1) ? - "Waiting for last player" : `Waiting for ${remaining} more players`; - return { - num: num, - den: den, - message: message - }; - }, + gatheringProgress = () => { + const gather = this.props.gather; + const num = gather.gatherers.length; + const den = gather.teamSize * 2; + const remaining = den - num; + const message = (remaining === 1) ? + "Waiting for last player" : `Waiting for ${remaining} more players`; + return { + num: num, + den: den, + message: message + }; + } - electionProgress() { - const gather = this.props.gather; - const num = gather.gatherers.reduce((acc, gatherer) => { - if (gatherer.leaderVote) acc++; - return acc; - }, 0); - const den = gather.teamSize * 2; - return { - num: num, - den: den, - message: den - num + " more votes required" - }; - }, + electionProgress = () => { + const gather = this.props.gather; + const num = gather.gatherers.reduce((acc, gatherer) => { + if (gatherer.leaderVote) acc++; + return acc; + }, 0); + const den = gather.teamSize * 2; + return { + num: num, + den: den, + message: den - num + " more votes required" + }; + } - selectionProgress() { - const gather = this.props.gather; - const num = gather.gatherers.reduce((acc, gatherer) => { - if (gatherer.team !== "lobby") acc++; - return acc; - }, 0); - const den = gather.teamSize * 2; + selectionProgress = () => { + const gather = this.props.gather; + const num = gather.gatherers.reduce((acc, gatherer) => { + if (gatherer.team !== "lobby") acc++; + return acc; + }, 0); + const den = gather.teamSize * 2; - return { - num: num, - den: den, - message: `${num} out of ${den} players assigned. Waiting + return { + num: num, + den: den, + message: `${num} out of ${den} players assigned. Waiting on ${_.capitalize(gather.pickingTurn)}s to pick next...` - }; - }, + }; + } - render() { - let progress, progressBar; - const gatherState = this.props.gather.state; - if (gatherState === 'gathering' && this.props.gather.gatherers.length) { - progress = this.gatheringProgress(); - progressBar = (); - } else if (gatherState === 'election') { - progress = this.electionProgress(); - progressBar = (); - } else if (gatherState === 'selection') { - progress = this.selectionProgress(); - progressBar = (); - } + render = () => { + let progress, progressBar; + const gatherState = this.props.gather.state; + if (gatherState === 'gathering' && this.props.gather.gatherers.length) { + progress = this.gatheringProgress(); + progressBar = (); + } else if (gatherState === 'election') { + progress = this.electionProgress(); + progressBar = (); + } else if (gatherState === 'selection') { + progress = this.selectionProgress(); + progressBar = (); + } - if (!progress) return false; + if (!progress) return false; - return ( -
    -

    {this.stateDescription()} {progress.message}

    - {progressBar} -
    - ); - } -}); + return ( +
    +

    {this.stateDescription()} {progress.message}

    + {progressBar} +
    + ); + } +} -const JoinGatherButton = React.createClass({ - propTypes: { - thisGatherer: React.PropTypes.object, - user: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired - }, +class JoinGatherButton extends React.Component { + static propTypes = { + thisGatherer: object, + user: object.isRequired, + socket: object.isRequired, + gather: object.isRequired + } - componentDidMount() { - const self = this; - this.timer = setInterval(() => { - self.forceUpdate(); - }, 30000); - }, + componentDidMount = () => { + const self = this; + this.timer = setInterval(() => { + self.forceUpdate(); + }, 30000); + } - componentWillUnmount() { - clearInterval(this.timer); - }, + componentWillUnmount = () => { + clearInterval(this.timer); + } - joinGather(e) { - e.preventDefault(); - this.props.socket.emit("gather:join", { - type: this.props.gather.type - }); - }, + joinGather = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:join", { + type: this.props.gather.type + }); + } - leaveGather(e) { - e.preventDefault(); - this.props.socket.emit("gather:leave", { - type: this.props.gather.type - }); - }, + leaveGather = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:leave", { + type: this.props.gather.type + }); + } - cooldownTime() { - let user = this.props.user; - if (!user) return false; - let cooloffTime = this.props.gather.cooldown[user.id]; - if (!cooloffTime) return false; - let timeRemaining = new Date(cooloffTime) - new Date(); - return timeRemaining > 0 ? timeRemaining : false; - }, + cooldownTime = () => { + let user = this.props.user; + if (!user) return false; + let cooloffTime = this.props.gather.cooldown[user.id]; + if (!cooloffTime) return false; + let timeRemaining = new Date(cooloffTime) - new Date(); + return timeRemaining > 0 ? timeRemaining : false; + } - render() { - let gather = this.props.gather; - let thisGatherer = this.props.thisGatherer; - if (thisGatherer) { - return ; - } - if (gather.state === 'gathering') { - let cooldownTime = this.cooldownTime(); - if (cooldownTime) { - return ; - } else { - return ; - } - } - return false; - } -}); + render = () => { + let gather = this.props.gather; + let thisGatherer = this.props.thisGatherer; + if (thisGatherer) { + return ; + } + if (gather.state === 'gathering') { + let cooldownTime = this.cooldownTime(); + if (cooldownTime) { + return ; + } else { + return ; + } + } + return false; + } +} -const CooloffButton = React.createClass({ - propTypes: { - timeRemaining: React.PropTypes.number.isRequired - }, +class CooloffButton extends React.Component { + static propTypes = { + timeRemaining: number.isRequired + } - timeRemaining() { - return `${Math.floor(this.props.timeRemaining / 60000) + 1} minutes remaining`; - }, + timeRemaining = () => { + return `${Math.floor(this.props.timeRemaining / 60000) + 1} minutes remaining`; + } - render() { - return - } -}) + } +} -const GatherActions = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - thisGatherer: React.PropTypes.object - }, +class GatherActions extends React.Component { + static propTypes = { + socket: object.isRequired, + gather: object.isRequired, + thisGatherer: object + } - voteRegather(e) { - e.preventDefault(e); - this.props.socket.emit("gather:vote", { - type: this.props.gather.type, - regather: (e.target.value === "true") - }); - }, + voteRegather = (e) => { + e.preventDefault(e); + this.props.socket.emit("gather:vote", { + type: this.props.gather.type, + regather: (e.target.value === "true") + }); + } - regatherVotes() { - let gather = this.props.gather; - if (!gather) return 0; - return gather.gatherers.reduce((acc, gatherer) => { - if (gatherer.regatherVote) acc++; - return acc; - }, 0); - }, + regatherVotes = () => { + let gather = this.props.gather; + if (!gather) return 0; + return gather.gatherers.reduce((acc, gatherer) => { + if (gatherer.regatherVote) acc++; + return acc; + }, 0); + } - render() { - let regatherButton; - let pickPatternIndicator; - const user = this.props.user; - const gather = this.props.gather; - const socket = this.props.socket; - const thisGatherer = this.props.thisGatherer; - let pickIndex = this.props.gather.pickingTurnIndex - 1; - if (thisGatherer) { - let regatherVotes = this.regatherVotes(); - if (thisGatherer.regatherVote) { - regatherButton = ; - } else { - regatherButton = ; - } + render = () => { + let regatherButton; + let pickPatternIndicator; + const user = this.props.user; + const gather = this.props.gather; + const socket = this.props.socket; + const thisGatherer = this.props.thisGatherer; + let pickIndex = this.props.gather.pickingTurnIndex - 1; + if (thisGatherer) { + let regatherVotes = this.regatherVotes(); + if (thisGatherer.regatherVote) { + regatherButton = ; + } else { + regatherButton = ; + } - pickPatternIndicator =
      - {gather.pickingPattern.map((team, index) => { - if (team === 'alien') { - if (index <= pickIndex) { - return
    • - }else{ - return
    • - } - } else { - if (index <= pickIndex) { - return
    • - }else{ - return
    • - } - } - })} -
    ; - } + pickPatternIndicator =
      + {gather.pickingPattern.map((team, index) => { + if (team === 'alien') { + if (index <= pickIndex) { + return
    • + } else { + return
    • + } + } else { + if (index <= pickIndex) { + return
    • + } else { + return
    • + } + } + })} +
    ; + } - return ( -
    -
    -
      -
    • - {pickPatternIndicator} -
    • -
        -
      • - -
      • -
      • - {regatherButton} -
      • -
      -
    -
    -
    - ); - } -}); + return ( +
    +
    +
      +
    • + {pickPatternIndicator} +
    • +
        +
      • + +
      • +
      • + {regatherButton} +
      • +
      +
    +
    +
    + ); + } +} -const VoteButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - candidate: React.PropTypes.object.isRequired, - thisGatherer: React.PropTypes.object, - gather: React.PropTypes.object.isRequired - }, +class VoteButton extends React.Component { + static propTypes = { + socket: object.isRequired, + candidate: object.isRequired, + thisGatherer: object, + gather: object.isRequired + } - cancelVote(e) { - this.props.socket.emit("gather:vote", { - type: this.props.gather.type, - leader: { - candidate: null - } - }); - }, + cancelVote = (e) => { + this.props.socket.emit("gather:vote", { + type: this.props.gather.type, + leader: { + candidate: null + } + }); + } - vote(e) { - e.preventDefault(); - this.props.socket.emit("gather:vote", { - type: this.props.gather.type, - leader: { - candidate: parseInt(e.target.value, 10) - } - }); - }, + vote = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:vote", { + type: this.props.gather.type, + leader: { + candidate: parseInt(e.target.value, 10) + } + }); + } - stopGatherMusic() { - soundController.stop(); - }, + stopGatherMusic = () => { + soundController.stop(); + } - render() { - let candidate = this.props.candidate; - let thisGatherer = this.props.thisGatherer; - if (thisGatherer === null) { - return false; - } - if (thisGatherer.leaderVote === candidate.id) { - return ( - - ); - } else { - return ( - - ); - } - } -}); + render = () => { + let candidate = this.props.candidate; + let thisGatherer = this.props.thisGatherer; + if (thisGatherer === null) { + return false; + } + if (thisGatherer.leaderVote === candidate.id) { + return ( + + ); + } else { + return ( + + ); + } + } +} -const ServerVoting = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - thisGatherer: React.PropTypes.object, - }, +class ServerVoting extends React.Component { + static propTypes = { + socket: object.isRequired, + gather: object.isRequired, + thisGatherer: object, + } - voteHandler(serverId) { - return e => { - e.preventDefault(); - this.props.socket.emit("gather:vote", { - type: this.props.gather.type, - server: { - id: serverId - } - }); - } - }, + voteHandler = (serverId) => { + return e => { + e.preventDefault(); + this.props.socket.emit("gather:vote", { + type: this.props.gather.type, + server: { + id: serverId + } + }); + } + } - votesForServer(server) { - return this.props.gather.gatherers.reduce((acc, gatherer) => { - if (gatherer.serverVote.some(voteId => voteId === server.id)) acc++; - return acc; - }, 0); - }, + votesForServer = (server) => { + return this.props.gather.gatherers.reduce((acc, gatherer) => { + if (gatherer.serverVote.some(voteId => voteId === server.id)) acc++; + return acc; + }, 0); + } - render() { - let self = this; - let thisGatherer = self.props.thisGatherer; - let servers = self.props.gather.servers.sort((a, b) => { - const aVotes = self.votesForServer(a); - const bVotes = self.votesForServer(b); - return bVotes - aVotes; - }).map(server => { - let votes = self.votesForServer(server); - let style = thisGatherer.serverVote.some(voteId => voteId === server.id) ? - "list-group-item list-group-item-success" : "list-group-item"; - return ( - - {votes} - {server.name || server.description} - - ); - }); + render = () => { + let self = this; + let thisGatherer = self.props.thisGatherer; + let servers = self.props.gather.servers.sort((a, b) => { + const aVotes = self.votesForServer(a); + const bVotes = self.votesForServer(b); + return bVotes - aVotes; + }).map(server => { + let votes = self.votesForServer(server); + let style = thisGatherer.serverVote.some(voteId => voteId === server.id) ? + "list-group-item list-group-item-success" : "list-group-item"; + return ( + + {votes} + {server.name || server.description} + + ); + }); - let votes = thisGatherer.serverVote.length; + let votes = thisGatherer.serverVote.length; - return ( -
    -
    - {votes === 2 ? "Server Votes" : - `Please Vote for a Server. ${2 - votes} votes remaining`} -
    -
    - {servers} -
    -
    - ); - } -}) + return ( +
    +
    + {votes === 2 ? "Server Votes" : + `Please Vote for a Server. ${2 - votes} votes remaining`} +
    +
    + {servers} +
    +
    + ); + } +} -const MapVoting = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - thisGatherer: React.PropTypes.object, - maps: React.PropTypes.array.isRequired, - }, +class MapVoting extends React.Component { + static propTypes = { + socket: object.isRequired, + gather: object.isRequired, + thisGatherer: object, + maps: array.isRequired, + } - voteHandler(mapId) { - return e => { - e.preventDefault(); - this.props.socket.emit("gather:vote", { - type: this.props.gather.type, - map: { - id: mapId - } - }); - } - }, + voteHandler = (mapId) => { + return e => { + e.preventDefault(); + this.props.socket.emit("gather:vote", { + type: this.props.gather.type, + map: { + id: mapId + } + }); + } + } - votesForMap(map) { - return this.props.gather.gatherers.reduce((acc, gatherer) => { - if (gatherer.mapVote.some(voteId => voteId === map.id)) acc++; - return acc; - }, 0); - }, + votesForMap = (map) => { + return this.props.gather.gatherers.reduce((acc, gatherer) => { + if (gatherer.mapVote.some(voteId => voteId === map.id)) acc++; + return acc; + }, 0); + } - render() { - const self = this; - let thisGatherer = self.props.thisGatherer - let maps = self.props.maps.sort((a, b) => { - const aVotes = self.votesForMap(a); - const bVotes = self.votesForMap(b); - return bVotes - aVotes; - }).map(map => { - let votes = self.votesForMap(map); - let style = thisGatherer.mapVote.some(voteId => voteId === map.id) ? - "list-group-item list-group-item-success" : "list-group-item"; - return ( - - {votes} - {map.name} - - ); - }); + render = () => { + const self = this; + let thisGatherer = self.props.thisGatherer + let maps = self.props.maps.sort((a, b) => { + const aVotes = self.votesForMap(a); + const bVotes = self.votesForMap(b); + return bVotes - aVotes; + }).map(map => { + let votes = self.votesForMap(map); + let style = thisGatherer.mapVote.some(voteId => voteId === map.id) ? + "list-group-item list-group-item-success" : "list-group-item"; + return ( + + {votes} + {map.name} + + ); + }); - let votes = thisGatherer.mapVote.length; + let votes = thisGatherer.mapVote.length; - return ( -
    -
    - {votes === 2 ? "Map Votes" : - `Please Vote for a Map. ${2 - votes} votes remaining`} -
    -
    - {maps} -
    -
    - ); - } -}) + return ( +
    +
    + {votes === 2 ? "Map Votes" : + `Please Vote for a Map. ${2 - votes} votes remaining`} +
    +
    + {maps} +
    +
    + ); + } +} -const Gather = exports.Gather = React.createClass({ - propTypes: { - thisGatherer: React.PropTypes.object, - maps: React.PropTypes.array.isRequired, - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired - }, +class Gather extends React.Component { + static propTypes = { + thisGatherer: object, + maps: array.isRequired, + socket: object.isRequired, + gather: object.isRequired + } - render() { - const socket = this.props.socket; - const gather = this.props.gather; - const thisGatherer = this.props.thisGatherer; - const soundController = this.props.soundController; - const maps = this.props.maps; - const user = this.props.user; - if (gather === null) return
    ; + render = () => { + const socket = this.props.socket; + const gather = this.props.gather; + const thisGatherer = this.props.thisGatherer; + const soundController = this.props.soundController; + const maps = this.props.maps; + const user = this.props.user; + if (gather === null) return
    ; - let voting; - if (thisGatherer) { - let state = gather.state; - if (state === 'gathering' || state === 'election') { - voting = ( -
    -
    - -
    -
    - -
    -
    - ); - } else { - voting = ; - } - } + let voting; + if (thisGatherer) { + let state = gather.state; + if (state === 'gathering' || state === 'election') { + voting = ( +
    +
    + +
    +
    + +
    +
    + ); + } else { + voting = ; + } + } - let gatherTeams; - if (gather.state === 'selection') { - gatherTeams = ; - } + let gatherTeams; + if (gather.state === 'selection') { + gatherTeams = ; + } - if (gather.gatherers.length > 0) { - return ( -
    -
    -
    {gather.name} ({gather.description})
    -
    - - -
    -
    - - {gatherTeams} - {voting} -
    - ); - } else { - return ( -
    -
    -
    {gather.name} ({gather.description})
    -
    - -
    - ); - } + if (gather.gatherers.length > 0) { + return ( +
    +
    +
    {gather.name} ({gather.description})
    +
    + + +
    +
    + + {gatherTeams} + {voting} +
    + ); + } else { + return ( +
    +
    +
    {gather.name} ({gather.description})
    +
    + +
    + ); + } - } -}); + } +} -const LifeformIcons = exports.LifeformIcons = React.createClass({ - availableLifeforms() { - return ["skulk", "gorge", "lerk", "fade", "onos", "commander"]; - }, +class LifeformIcons extends React.Component { + availableLifeforms = () => { + return ["skulk", "gorge", "lerk", "fade", "onos", "commander"]; + } - gathererLifeforms() { - let lifeforms = []; - let gatherer = this.props.gatherer; - let abilities = gatherer.user.profile.abilities; - for (let attr in abilities) { - if (abilities[attr]) lifeforms.push(_.capitalize(attr)); - } - return lifeforms; - }, + gathererLifeforms = () => { + let lifeforms = []; + let gatherer = this.props.gatherer; + let abilities = gatherer.user.profile.abilities; + for (let attr in abilities) { + if (abilities[attr]) lifeforms.push(_.capitalize(attr)); + } + return lifeforms; + } - render() { - let lifeforms = this.gathererLifeforms(); - let availableLifeforms = this.availableLifeforms(); - let icons = availableLifeforms.map(lifeform => { - let containsAbility = lifeforms.some(gathererLifeform => { - return gathererLifeform.toLowerCase() === lifeform.toLowerCase() - }); - if (containsAbility) { - return - } else { - return - } - }); - return {icons} - } -}); + render = () => { + let lifeforms = this.gathererLifeforms(); + let availableLifeforms = this.availableLifeforms(); + let icons = availableLifeforms.map(lifeform => { + let containsAbility = lifeforms.some(gathererLifeform => { + return gathererLifeform.toLowerCase() === lifeform.toLowerCase() + }); + if (containsAbility) { + return + } else { + return + } + }); + return {icons} + } +} -const GatherMenu = exports.GatherMenu = React.createClass({ - propTypes: { - gatherPool: React.PropTypes.object.isRequired, - currentGather: React.PropTypes.string.isRequired, - gatherSelectedCallback: React.PropTypes.func.isRequired - }, +class GatherMenu extends React.Component { + static propTypes = { + gatherPool: object.isRequired, + currentGather: string.isRequired, + gatherSelectedCallback: func.isRequired + } - onClick(gather) { - return () => { - this.props.gatherSelectedCallback(gather.type); - } - }, + onClick = (gather) => { + return () => { + this.props.gatherSelectedCallback(gather.type); + } + } - itemClass(gather) { - let className = ["treeview"]; - if (gather.type === this.props.currentGather) { - className.push("active"); - } - return className.join(" "); - }, + itemClass = (gather) => { + let className = ["treeview"]; + if (gather.type === this.props.currentGather) { + className.push("active"); + } + return className.join(" "); + } - gatherPoolArray() { - const gatherArray = []; - const gatherPool = this.props.gatherPool; - for (let attr in gatherPool) { - if (gatherPool.hasOwnProperty(attr)) { - gatherArray.push(gatherPool[attr]); - } - } - return gatherArray.sort((a, b) => a.name - b.name); - }, + gatherPoolArray = () => { + const gatherArray = []; + const gatherPool = this.props.gatherPool; + for (let attr in gatherPool) { + if (gatherPool.hasOwnProperty(attr)) { + gatherArray.push(gatherPool[attr]); + } + } + return gatherArray.sort((a, b) => a.name - b.name); + } - drawerItemsClass(open){ - if(!open){ - return 'drawerItems' - } - }, + drawerItemsClass = (open) => { + if (!open) { + return 'drawerItems' + } + } - render() { - let open = !this.props.drawerState + render = () => { + let open = !this.props.drawerState - return ( - - ); - } -}); + return ( + + ); + } +} -const GathererListItem = React.createClass({ - propTypes: { - user: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - gatherer: React.PropTypes.object.isRequired, - thisGatherer: React.PropTypes.object, - soundController: React.PropTypes.object.isRequired - }, +class GathererListItem extends React.Component { + static propTypes = { + user: object.isRequired, + gather: object.isRequired, + socket: object.isRequired, + gatherer: object.isRequired, + thisGatherer: object, + soundController: object.isRequired + } - bootGatherer(e) { - e.preventDefault(); - this.props.socket.emit("gather:leave", { - type: this.props.gather.type, - gatherer: parseInt(e.target.value, 10) || null - }); - }, + bootGatherer = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:leave", { + type: this.props.gather.type, + gatherer: parseInt(e.target.value, 10) || null + }); + } - getInitialState() { - return { - collapse: true - }; - }, + state = { + collapse: true + }; - toggleCollapse(e) { - e.preventDefault(); - this.setState({ collapse: !this.state.collapse }); - }, - caret() { - if (this.state.collapse) { - return ; - } else { - return ; - } - }, + toggleCollapse = (e) => { + e.preventDefault(); + this.setState({ collapse: !this.state.collapse }); + } - collapseState() { - return `panel-collapse out collapse ${this.state.collapse ? "" : "in"}`; - }, + caret = () => { + if (this.state.collapse) { + return ; + } else { + return ; + } + } - render() { - const user = this.props.user; - const gather = this.props.gather; - const socket = this.props.socket; - const gatherer = this.props.gatherer; - const thisGatherer = this.props.thisGatherer; - const soundController = this.props.soundController; + collapseState = () => { + return `panel-collapse out collapse ${this.state.collapse ? "" : "in"}`; + } - let country; - if (gatherer.user.country) { - country = ( - {gatherer.user.country} - ); - }; + render = () => { + const user = this.props.user; + const gather = this.props.gather; + const socket = this.props.socket; + const gatherer = this.props.gatherer; + const thisGatherer = this.props.thisGatherer; + const soundController = this.props.soundController; - const skill = gatherer.user.profile.skill || "Not Available"; + let country; + if (gatherer.user.country) { + country = ( + {gatherer.user.country} + ); + }; - const hiveStats = []; - if (gatherer.user.hive.skill) hiveStats.push(`${gatherer.user.hive.skill} ELO`); + const skill = gatherer.user.profile.skill || "Not Available"; - if (gatherer.user.hive.playTime) { - hiveStats.push(`${Math.floor(gatherer.user.hive.playTime / 3600)} Hours`); - } + const hiveStats = []; + if (gatherer.user.hive.skill) hiveStats.push(`${gatherer.user.hive.skill} ELO`); - const hive = (hiveStats.length) ? hiveStats.join(", ") : "Not Available"; + if (gatherer.user.hive.playTime) { + hiveStats.push(`${Math.floor(gatherer.user.hive.playTime / 3600)} Hours`); + } - const team = (gatherer.user.team) ? gatherer.user.team.name : "None"; + const hive = (hiveStats.length) ? hiveStats.join(", ") : "Not Available"; - let action; - if (gather.state === "election") { - let votes = gather.gatherers.reduce((acc, voter) => { - if (voter.leaderVote === gatherer.id) acc++; - return acc; - }, 0) - action = ( - - {votes + " votes"} - - - ); - } + const team = (gatherer.user.team) ? gatherer.user.team.name : "None"; - if (gather.state === 'selection') { - if (thisGatherer && - thisGatherer.leader && - thisGatherer.team === gather.pickingTurn) { - action = ( - - - - ); - } else { - if (gatherer.leader) { - action = ( { + if (voter.leaderVote === gatherer.id) acc++; + return acc; + }, 0) + action = ( + + {votes + " votes"} + + + ); + } + + if (gather.state === 'selection') { + if (thisGatherer && + thisGatherer.leader && + thisGatherer.team === gather.pickingTurn) { + action = ( + + + + ); + } else { + if (gatherer.leader) { + action = (Leader); - } else if (gatherer.team !== "lobby") { - action = ({_.capitalize(gatherer.team)}); - } else { - action = ( - Lobby); - } - } - } + } else { + action = ( + Lobby); + } + } + } - let adminOptions; - if ((user && user.admin) || (user && user.moderator)) { - adminOptions = [ -
    , -
    Admin
    , -
    -   -
    - ] - } - - const lastSeenInMinutes = (gatherer) => { - const now = Date.now(); - const minutesSinceLastSeen = (now - gatherer.user.lastSeen) / 60000; + gatherer={gatherer} currentUser={user} /> + + ] + } - if (minutesSinceLastSeen < 0) { - return 0; - } + const lastSeenInMinutes = (gatherer) => { + const now = Date.now(); + const minutesSinceLastSeen = (now - gatherer.user.lastSeen) / 60000; - return parseInt(minutesSinceLastSeen || 0); - }; + if (minutesSinceLastSeen < 0) { + return 0; + } - let idleStatus; - if (!gatherer.user.online) { - const mins = lastSeenInMinutes(gatherer); - if (mins > 60) { - const hours = Math.round(mins / 6) / 10; - idleStatus = [ -
    Last Seen
    , -
    {hours} hours ago
    - ] - } else{ - idleStatus = [ -
    Last Seen
    , -
    {mins} mins ago
    - ] - } - } + return parseInt(minutesSinceLastSeen || 0); + }; - let tabColor = gatherer.team !== "lobby" ? `panel-${gatherer.team}` : "panel-info"; - let onlineStatus = gatherer.user.online ? "" : "font-italic" - return ( -
    -
    -

    - {country} {gatherer.user.username} - - - Info {this.caret()} - - {action} - -

    -
    -
    -
    -
    - {idleStatus} -
    Skill Level
    -
    {skill}
    -
    Team
    -
    {team}
    -
    Hive Stats
    -
    {hive}
    -
    Links
    -
    - ENSL Profile  + let idleStatus; + if (!gatherer.user.online) { + const mins = lastSeenInMinutes(gatherer); + if (mins > 60) { + const hours = Math.round(mins / 6) / 10; + idleStatus = [ +
    Last Seen
    , +
    {hours} hours ago
    + ] + } else { + idleStatus = [ +
    Last Seen
    , +
    {mins} mins ago
    + ] + } + } + + let tabColor = gatherer.team !== "lobby" ? `panel-${gatherer.team}` : "panel-info"; + let onlineStatus = gatherer.user.online ? "" : "font-italic" + return ( +
    +
    +

    + {country} {gatherer.user.username} + + + Info {this.caret()} + + {action} + +

    +
    +
    +
    +
    + {idleStatus} +
    Skill Level
    +
    {skill}
    +
    Team
    +
    {team}
    +
    Hive Stats
    +
    {hive}
    +
    Links
    +
    + ENSL Profile  Observatory Profile -
    - {adminOptions} -
    -
    + className="btn btn-xs btn-primary" + target="_blank">Observatory Profile + + {adminOptions} +
    +
    +
    +
    + ); + } +} + +class Gatherers extends React.Component { + static propTypes = { + user: object, + thisGatherer: object, + socket: object.isRequired, + gather: object.isRequired, + soundController: object.isRequired + } + + joinGather = (e) => { + e.preventDefault(); + this.props.socket.emit("gather:join", { + type: this.props.gather.type + }); + } + + render = () => { + const self = this; + const user = this.props.user; + const socket = this.props.socket; + const gather = this.props.gather; + const thisGatherer = this.props.thisGatherer; + const gatherers = gather.gatherers + .sort((a, b) => { + return (b.user.hive.skill || 1000) - (a.user.hive.skill || 1000); + }) + .map(gatherer => { + return + }); + + if (gather.gatherers.length) { + return ( +
    + {gatherers} +
    + ); + } else { + return ( +
    +
    + +
    +
    + ); + } + } +} + +class CompletedGather extends React.Component { + completionDate = () => { + let d = new Date(this.props.gather.done.time); + if (d) { + return d.toLocaleString(); + } else { + return "Completed Gather" + } + } + + state = { + show: !!this.props.show + } + + toggleGatherInfo = () => { + let newState = !this.state.show; + this.setState({ + show: newState + }); + } + + render = () => { + let gatherInfo = []; + let gather = this.props.gather; + let maps = this.props.maps; + let gatherName = gather.name || "Classic Gather"; + if (this.state.show) { + gatherInfo.push(); + gatherInfo.push(); + } + return ( +
    +
    +
    {gatherName} - {this.completionDate()}
    +
    + {gatherInfo} +
    + ); + } +} + +class GatherVotingResults extends React.Component { + // Returns an array of ids voted for e.g. [1,2,5,1,1,3,2] + countVotes = (voteType) => { + return this.props.gather.gatherers.reduce((acc, gatherer) => { + let votes = gatherer[voteType]; + + // Temporary fix because some mapvotes are ints and not arrays + if (!Array.isArray(votes)) votes = [votes]; + + if (votes.length > 0) votes.forEach(vote => acc.push(vote)); + return acc; + }, []); + } + + selectedMaps = () => { + return rankVotes(this.countVotes('mapVote'), this.props.maps).slice(0, 2) + } + + selectedServers = () => { + return rankVotes(this.countVotes('serverVote'), this.props.gather.servers || []).slice(0, 2); + } + + serverTable = (server, primary) => { + let password = server.password ? server.password : "N/A"; + let className = primary ? "btn btn-primary max-width" : "btn btn-primary pull-right"; + let label = primary ? `Join ${server.name}` : "Join Fallback" + return ( +
    +
    +
    Server Name
    +
    {server.name}
    +
    Address
    +
    {server.ip}:{server.port}
    +
    Password
    +
    {password}
    +
    +

    + {label} +

    +
    + ); + } + + render = () => { + let maps = this.selectedMaps(); + let servers = this.selectedServers(); + let mainServer; + if (servers[0]) { + mainServer = this.serverTable(servers[0], true); + } + + let altServer; + if (servers[1]) { + altServer = this.serverTable(servers[1]); + } + return ( +
    +
    + Game Information
    -
    - ); - } -}); - -const Gatherers = React.createClass({ - propTypes: { - user: React.PropTypes.object, - thisGatherer: React.PropTypes.object, - socket: React.PropTypes.object.isRequired, - gather: React.PropTypes.object.isRequired, - soundController: React.PropTypes.object.isRequired - }, - - joinGather(e) { - e.preventDefault(); - this.props.socket.emit("gather:join", { - type: this.props.gather.type - }); - }, - - render() { - const self = this; - const user = this.props.user; - const socket = this.props.socket; - const gather = this.props.gather; - const thisGatherer = this.props.thisGatherer; - const gatherers = gather.gatherers - .sort((a, b) => { - return (b.user.hive.skill || 1000) - (a.user.hive.skill || 1000); - }) - .map(gatherer => { - return - }); - - if (gather.gatherers.length) { - return ( -
    - {gatherers} -
    - ); - } else { - return ( -
    -
    - -
    -
    - ); - } - } -}); - -const CompletedGather = exports.CompletedGather = React.createClass({ - completionDate() { - let d = new Date(this.props.gather.done.time); - if (d) { - return d.toLocaleString(); - } else { - return "Completed Gather" - } - }, - - getInitialState() { - return { - show: !!this.props.show - }; - }, - - toggleGatherInfo() { - let newState = !this.state.show; - this.setState({ - show: newState - }); - }, - - render() { - let gatherInfo = []; - let gather = this.props.gather; - let maps = this.props.maps; - let gatherName = gather.name || "Classic Gather"; - if (this.state.show) { - gatherInfo.push(); - gatherInfo.push(); - } - return ( -
    -
    -
    {gatherName} - {this.completionDate()}
    -
    - {gatherInfo} -
    - ); - } -}); - -const GatherVotingResults = React.createClass({ - // Returns an array of ids voted for e.g. [1,2,5,1,1,3,2] - countVotes(voteType) { - return this.props.gather.gatherers.reduce((acc, gatherer) => { - let votes = gatherer[voteType]; - - // Temporary fix because some mapvotes are ints and not arrays - if (!Array.isArray(votes)) votes = [votes]; - - if (votes.length > 0) votes.forEach(vote => acc.push(vote)); - return acc; - }, []); - }, - - selectedMaps() { - return rankVotes(this.countVotes('mapVote'), this.props.maps).slice(0, 2) - }, - - selectedServers() { - return rankVotes(this.countVotes('serverVote'), this.props.gather.servers || []).slice(0, 2); - }, - - serverTable(server, primary) { - let password = server.password ? server.password : "N/A"; - let className = primary ? "btn btn-primary max-width" : "btn btn-primary pull-right"; - let label = primary ? `Join ${server.name}` : "Join Fallback" - return ( -
    -
    -
    Server Name
    -
    {server.name}
    -
    Address
    -
    {server.ip}:{server.port}
    -
    Password
    -
    {password}
    -
    -

    - {label} -

    -
    - ); - }, - - render() { - let maps = this.selectedMaps(); - let servers = this.selectedServers(); - let mainServer; - if (servers[0]) { - mainServer = this.serverTable(servers[0], true); - } - - let altServer; - if (servers[1]) { - altServer = this.serverTable(servers[1]); - } - return ( -
    -
    - Game Information -
    -
    -
    -
    -

    Map Selection

    -
    -
    Maps
    -
    {maps[0].name}
    (Alternate: {maps[1].name})
    -
    -
    -
    -

    Primary Server

    - {mainServer} -
    -
    -

    Fallback Server

    - {altServer} -
    -
    -
    -
    - ); - } -}); - +
    +
    +
    +

    Map Selection

    +
    +
    Maps
    +
    {maps[0].name}
    (Alternate: {maps[1].name})
    +
    +
    +
    +

    Primary Server

    + {mainServer} +
    +
    +

    Fallback Server

    + {altServer} +
    +
    +
    +
    + ); + } +} +export { Gather, CompletedGather, GatherMenu, LifeformIcons } diff --git a/app/javascripts/components/gatherArchive.js b/app/javascripts/components/gatherArchive.js index e22e786..1500dd3 100644 --- a/app/javascripts/components/gatherArchive.js +++ b/app/javascripts/components/gatherArchive.js @@ -1,32 +1,35 @@ -const React = require("react"); -import {CompletedGather} from "javascripts/components/gather"; +import React from "react"; +import { array } from "prop-types"; +import { CompletedGather } from "javascripts/components/gather"; -const ArchivedGathers = exports.ArchivedGathers = React.createClass({ - propTypes: { - archive: React.PropTypes.array.isRequired, - maps: React.PropTypes.array.isRequired - }, +class ArchivedGathers extends React.Component { + static propTypes = { + archive: array.isRequired, + maps: array.isRequired + } - render() { - let archive = this.props.archive - .sort((a, b) => { - return new Date(b.createdAt) - new Date(a.createdAt); - }) - .map((archivedGather, index) => { - return - }); + render = () => { + let archive = this.props.archive + .sort((a, b) => { + return new Date(b.createdAt) - new Date(a.createdAt); + }) + .map((archivedGather, index) => { + return + }); - return ( -
    -
    Archived Gathers
    -
    - {archive} -
    -
    - ); - } -}); + return ( +
    +
    Archived Gathers
    +
    + {archive} +
    +
    + ); + } +} + +export { ArchivedGathers } diff --git a/app/javascripts/components/info.js b/app/javascripts/components/info.js index a7df6a5..d51762a 100644 --- a/app/javascripts/components/info.js +++ b/app/javascripts/components/info.js @@ -1,26 +1,24 @@ -const React = require("react"); +import React from "react" -const InfoButton = exports.InfoButton = React.createClass({ - getInitialState() { - return { - open: false - }; - }, +class InfoButton extends React.Component { + state = { + open: false + } - toggleOpen(e) { + toggleOpen = (e) => { e.preventDefault(); this.setState({ open: !this.state.open }); - }, + } - chevron() { + chevron = () => { if (this.state.open) { return ; } else { return ; } - }, + } - render() { + render = () => { const open = this.state.open; let componentClass = ["treeview"]; let dropdown; @@ -62,5 +60,7 @@ const InfoButton = exports.InfoButton = React.createClass({ ); } -}); +} + +export { InfoButton } diff --git a/app/javascripts/components/main.js b/app/javascripts/components/main.js index 4e0ad7e..38a2a1c 100644 --- a/app/javascripts/components/main.js +++ b/app/javascripts/components/main.js @@ -1,537 +1,537 @@ -import {News} from "javascripts/components/news"; -import {Events} from "javascripts/components/event"; -import {Gather, GatherMenu} from "javascripts/components/gather"; -import {InfoButton} from "javascripts/components/info"; -import {AdminPanel} from "javascripts/components/admin"; -import {Chatroom} from "javascripts/components/message"; -import {SoundPanel} from "javascripts/components/sound"; -import {SettingsPanel} from "javascripts/components/settings"; -import {ArchivedGathers} from "javascripts/components/gatherArchive"; -import {CurrentUser, ProfileModal, UserMenu} from "javascripts/components/user"; -import {DiscordButton, DiscordModal} from "javascripts/components/discord"; +import { News } from "./news"; +import { Events } from "./event"; +import { Gather, GatherMenu } from "./gather"; +import { InfoButton } from "./info"; +import { AdminPanel } from "./admin"; +import { Chatroom } from "./message"; +import { SoundPanel } from "./sound"; +import { ArchivedGathers } from "./gatherArchive"; +import { CurrentUser, ProfileModal, UserMenu } from "./user"; +import { DiscordButton } from "./discord"; -const React = require("react"); +import React from "react"; +import { object } from "prop-types" -const Sound = require("javascripts/components/sound"); -const SoundController = Sound.SoundController; -const helper = require("javascripts/helper"); -const storageAvailable = helper.storageAvailable; -const io = require("socket.io-client"); +import { SoundController } from "./sound"; +import { storageAvailable } from "../helper" +import io from "socket.io-client"; -const App = React.createClass({ +class App extends React.Component { - getInitialState() { - return { - status: "connecting", - socket: null - } - }, + state = { + status: "connecting", + socket: null + } - componentDidMount() { + + componentDidMount = () => { const socketUrl = window.location.origin; const socket = io(socketUrl) .on("connect", () => { - this.setState({ status: "connected" }); - socket - .on("reconnect", () => {}) - .on("disconnect", () => {}); - }) - .on("error", error => { - if (error === "Authentication Failed") { - this.setState({ status: "authFailed" }); - } else if (error === "Gather Banned") { - this.setState({ status: "banned" }); - } else { + this.setState({ status: "connected" }); + socket + .on("reconnect", () => { }) + .on("disconnect", () => { }); + }) + .on("error", error => { + if (error === "Authentication Failed") { + this.setState({ status: "authFailed" }); + } else if (error === "Gather Banned") { + this.setState({ status: "banned" }); + } else { socket.disconnect(); } - }); + }); this.setState({ socket: socket }); socket.open(); - }, + } - render() { - const status = this.state.status; + render = () => { + const status = this.state.status; - if (status === "connected") { - return ; - } + if (status === "connected") { + return ; + } - let splash; - if (status === "authFailed") { - splash = ; - } else if (status === "banned") { - splash = ; - } else if (status === "connecting") { - splash = ; - } + let splash; + if (status === "authFailed") { + splash = ; + } else if (status === "banned") { + splash = ; + } else if (status === "connecting") { + splash = ; + } - return ( -
    -
    -
    - {splash} -
    -
    -
    - ); - } -}); + return ( +
    +
    +
    + {splash} +
    +
    +
    + ); + } +} -const AuthFailedSplash = React.createClass({ - render() { - return ( -
    -
    -
    -
    - ENSL Logo -
    -

    You need to be logged in to the ENSL website to access gathers

    -

    If you are logged on, try visiting a few pages on ENSL.org so the server can update your cookies

    -

    If this error persists please contact an admin to fix it

    -
    -

    Go to website

    -
    -
    -
    - ); - } -}); +class AuthFailedSplash extends React.Component { + render() { + return ( +
    +
    +
    +
    + ENSL Logo +
    +

    You need to be logged in to the ENSL website to access gathers

    +

    If you are logged on, try visiting a few pages on ENSL.org so the server can update your cookies

    +

    If this error persists please contact an admin to fix it

    +
    +

    Go to website

    +
    +
    +
    + ); + } +} -const BannedSplash = React.createClass({ - render() { - return ( -
    -
    -
    -
    - ENSL Logo -
    -

    You're currently barred from joining gathers

    -

    Either wait for the ban to expire or talk to an admin to get it lifted

    -
    -

    See the ban list

    -
    -
    -
    - ); - } -}); +class BannedSplash extends React.Component { + render() { + return ( +
    +
    +
    +
    + ENSL Logo +
    +

    You're currently barred from joining gathers

    +

    Either wait for the ban to expire or talk to an admin to get it lifted

    +
    +

    See the ban list

    +
    +
    +
    + ); + } +} -const ConnectingSplash = React.createClass({ - render() { - return ( -
    -
    -
    -
    - ENSL Logo -
    -
    -

    Authenticating your ENSL account

    -
    -
    - Loading -
    -
    -
    -
    - ); - } -}); +class ConnectingSplash extends React.Component { + render() { + return ( +
    +
    +
    +
    + ENSL Logo +
    +
    +

    Authenticating your ENSL account

    +
    +
    + Loading +
    +
    +
    +
    + ); + } +} -const GatherPage = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired - }, +class GatherPage extends React.Component { + static propTypes = { + socket: object.isRequired + } - getInitialState() { - let updateTitle = true; - let showEventsPanel = true; + constructor(props) { + super(props); + this.state = this.getInitialState(); + } - if (storageAvailable('localStorage')) { - if (localStorage.getItem("updateTitle") !== null) { - updateTitle = JSON.parse(localStorage.getItem("updateTitle")); - } - if (localStorage.getItem("showEventsPanel") !== null) { - showEventsPanel = JSON.parse(localStorage.getItem("showEventsPanel")); - } - } + getInitialState = () => { + let updateTitle = true; + let showEventsPanel = true; - return { - modal: null, - gatherPool: { - classic: { - gatherers: [], - type: "classic" - } - }, - currentGather: "classic", - users: [], - messages: [], - maps: [], - user: null, - servers: [], - archive: [], - socket: null, - events: [], - updateTitle: updateTitle, - showEventsPanel: showEventsPanel, - soundController: new SoundController(), - showMessageBox: true, - collapseMenu: false, - chatContainerHeight: 500, - connectionState: "connected" - }; - }, + if (storageAvailable('localStorage')) { + if (localStorage.getItem("updateTitle") !== null) { + updateTitle = JSON.parse(localStorage.getItem("updateTitle")); + } + if (localStorage.getItem("showEventsPanel") !== null) { + showEventsPanel = JSON.parse(localStorage.getItem("showEventsPanel")); + } + } - currentGather() { - return this.state.gatherPool[this.state.currentGather]; - }, + return { + modal: null, + gatherPool: { + classic: { + gatherers: [], + type: "classic" + } + }, + currentGather: "classic", + users: [], + messages: [], + maps: [], + user: null, + servers: [], + archive: [], + socket: null, + events: [], + updateTitle: updateTitle, + showEventsPanel: showEventsPanel, + soundController: new SoundController(), + showMessageBox: true, + collapseMenu: false, + chatContainerHeight: 500, + connectionState: "connected" + }; + } - componentDidMount() { - let self = this; - let socket = this.props.socket; - let soundController = this.state.soundController; + currentGather = () => this.state.gatherPool[this.state.currentGather] - this.updateTitle(); + componentDidMount = () => { + let self = this; + let socket = this.props.socket; + let soundController = this.state.soundController; - $(window).resize(_.debounce(this.reloadChatContainerHeight, 250)); - this.reloadChatContainerHeight(); + this.updateTitle(); - socket.on('stateChange', data => { - let state = data.state; + $(window).resize(_.debounce(this.reloadChatContainerHeight, 250)); + this.reloadChatContainerHeight(); - if (state.from === 'gathering' - && state.to === 'election' - && this.thisGatherer(data.type)) { - soundController.playGatherMusic(); - } + socket.on('stateChange', data => { + let state = data.state; - if (state.from === 'election' - && state.to === 'gathering') { - soundController.stop(); - } - }); + if (state.from === 'gathering' + && state.to === 'election' + && this.thisGatherer(data.type)) { + soundController.playGatherMusic(); + } - socket.on("notify", data => toastr[data.type](data.message)); + if (state.from === 'election' + && state.to === 'gathering') { + soundController.stop(); + } + }); - socket.on('event:append', data => { - let events = self.state.events; - events.unshift(data); - self.setState({ - events: events.slice(0, 100) - }); - }); + socket.on("notify", data => toastr[data.type](data.message)); - socket.on('users:update', - data => self.setState({ - users: data.users, - user: data.currentUser - }) - ); + socket.on('event:append', data => { + let events = self.state.events; + events.unshift(data); + self.setState({ + events: events.slice(0, 100) + }); + }); - socket.on("message:append", data => { - self.setState({ - messages: self.state.messages.concat(data.messages) - .sort((a, b) => { - return new Date(a.createdAt) - new Date(b.createdAt); - }) - }); - }); + socket.on('users:update', + data => self.setState({ + users: data.users, + user: data.currentUser + }) + ); - socket.on("message:refresh", data => { - self.setState({ - messages: data.messages - }); - }); + socket.on("message:append", data => { + self.setState({ + messages: self.state.messages.concat(data.messages) + .sort((a, b) => { + return new Date(a.createdAt) - new Date(b.createdAt); + }) + }); + }); - socket.on("gather:refresh", (data) => { - const gatherPool = this.state.gatherPool; - const type = data.type; - gatherPool[type] = data.gather; - self.setState({ - maps: data.maps, - gatherPool: gatherPool - }); - this.updateTitle(); - }); + socket.on("message:refresh", data => { + self.setState({ + messages: data.messages + }); + }); - socket.on("gather:archive:refresh", data => { - self.setState({ - archive: data.archive, - maps: data.maps, - servers: data.servers - }); - }); + socket.on("gather:refresh", (data) => { + const gatherPool = this.state.gatherPool; + const type = data.type; + gatherPool[type] = data.gather; + self.setState({ + maps: data.maps, + gatherPool: gatherPool + }); + this.updateTitle(); + }); - socket.on("connect", () => { - this.setState({ connectionState: "connected" }); - }); + socket.on("gather:archive:refresh", data => { + self.setState({ + archive: data.archive, + maps: data.maps, + servers: data.servers + }); + }); - socket.on("disconnect", () => { - this.setState({ connectionState: "disconnected" }); - }); + socket.on("connect", () => { + this.setState({ connectionState: "connected" }); + }); - socket.on("reconnecting", () => { - this.setState({ connectionState: "reconnecting" }); - }); + socket.on("disconnect", () => { + this.setState({ connectionState: "disconnected" }); + }); - socket.on("reconnect", () => { - this.setState({ connectionState: "connected" }); - }); + socket.on("reconnecting", () => { + this.setState({ connectionState: "reconnecting" }); + }); - socket.emit("users:refresh"); - socket.emit("message:refresh"); - socket.emit("gather:refresh"); - }, + socket.on("reconnect", () => { + this.setState({ connectionState: "connected" }); + }); - updateTitle() { - let gather = this.currentGather(); - if (gather && this.state.updateTitle) { - document.title = `NSL Gathers (${gather.gatherers.length}/${gather.teamSize * 2})`; - } else { - document.title = "NSL Gathers"; - } - }, + socket.emit("users:refresh"); + socket.emit("message:refresh"); + socket.emit("gather:refresh"); + } - reloadChatContainerHeight() { - let chatContainer = document.getElementById("chat-container"); - if (chatContainer) { - this.setState({ chatContainerHeight: chatContainer.clientHeight }); - } - }, + updateTitle = () => { + let gather = this.currentGather(); + if (gather && this.state.updateTitle) { + document.title = `NSL Gathers (${gather.gatherers.length}/${gather.teamSize * 2})`; + } else { + document.title = "NSL Gathers"; + } + } - toggleEventsPanel(event) { - let newState = event.target.checked; - this.setState({ showEventsPanel: newState }); - if (storageAvailable('localStorage')) { - localStorage.setItem("showEventsPanel", newState) - } - }, + reloadChatContainerHeight = () => { + let chatContainer = document.getElementById("chat-container"); + if (chatContainer) { + this.setState({ chatContainerHeight: chatContainer.clientHeight }); + } + } - toggleUpdateTitle(event) { - let newState = event.target.checked; - this.setState({ updateTitle: newState }); - if (storageAvailable('localStorage')) { - localStorage.setItem("updateTitle", newState) - } - this.updateTitle(); - }, + toggleEventsPanel = (event) => { + let newState = event.target.checked; + this.setState({ showEventsPanel: newState }); + if (storageAvailable('localStorage')) { + localStorage.setItem("showEventsPanel", newState) + } + } - thisGatherer(gatherType) { - if (gatherType === undefined) gatherType = this.state.currentGather; - let gather = this.state.gatherPool[gatherType]; - let user = this.state.user; - if (gather && user && gather.gatherers.length) { - return gather.gatherers - .filter(gatherer => gatherer.id === user.id) - .pop() || null; - } - return null; - }, + toggleUpdateTitle = (event) => { + let newState = event.target.checked; + this.setState({ updateTitle: newState }); + if (storageAvailable('localStorage')) { + localStorage.setItem("updateTitle", newState) + } + this.updateTitle(); + } - mountModal(options) { - this.setState({ modal: options }); - }, + thisGatherer = (gatherType) => { + if (gatherType === undefined) gatherType = this.state.currentGather; + let gather = this.state.gatherPool[gatherType]; + let user = this.state.user; + if (gather && user && gather.gatherers.length) { + return gather.gatherers + .filter(gatherer => gatherer.id === user.id) + .pop() || null; + } + return null; + } - closeModal() { - this.setState({ modal: null }); - }, + mountModal = (options) => { + this.setState({ modal: options }); + } - modal() { - const options = this.state.modal; - if (!options) return; - const Component = options.component; - return ( -
    - -
    - ); - }, + closeModal = () => { + this.setState({ modal: null }); + } - toggleMessageBox(e) { - e.preventDefault(); - this.setState({ - showMessageBox: !this.state.showMessageBox - }); - }, + modal = () => { + const options = this.state.modal; + if (!options) return; + const Comp = options.component; + return ( +
    + +
    + ); + } - toggleCollapseMenu(e) { - e.preventDefault(); - this.setState({ - collapseMenu: !this.state.collapseMenu - }); - }, + toggleMessageBox = (e) => { + e.preventDefault(); + this.setState({ + showMessageBox: !this.state.showMessageBox + }); + } - openProfileModal(e) { - e.preventDefault(); - this.mountModal({ - component: ProfileModal, - props: { - user: this.state.user, - socket: this.props.socket - } - }); - }, + toggleCollapseMenu = (e) => { + e.preventDefault(); + this.setState({ + collapseMenu: !this.state.collapseMenu + }); + } - onGatherSelected(gatherName) { - let gather = this.state.gatherPool[gatherName]; - if (gather === undefined) return; - this.setState({ - currentGather: gather.type - }); + openProfileModal = (e) => { + e.preventDefault(); + this.mountModal({ + component: ProfileModal, + props: { + user: this.state.user, + socket: this.props.socket + } + }); + } + + onGatherSelected = (gatherName) => { + let gather = this.state.gatherPool[gatherName]; + if (gather === undefined) return; + this.setState({ + currentGather: gather.type + }); setTimeout(this.updateTitle, 200); - }, + } - render() { - const socket = this.props.socket; + render = () => { + const socket = this.props.socket; - let eventsPanel; - if (this.state.showEventsPanel) { - eventsPanel = ; - } + let eventsPanel; + if (this.state.showEventsPanel) { + eventsPanel = ; + } - let chatroom, currentUser, profileLink; - if (this.state.user) { - profileLink = ( -
  • - - - -
  • - ); - chatroom = ; - currentUser = ( -
      - -
    - ); - } + let chatroom, currentUser, profileLink; + if (this.state.user) { + profileLink = ( +
  • + + + +
  • + ); + chatroom = ; + currentUser = ( +
      + +
    + ); + } - const user = this.state.user; - let username, avatar; - if (user) { - username = user.username; - avatar = user.avatar; - } + const user = this.state.user; + let username, avatar; + if (user) { + username = user.username; + avatar = user.avatar; + } - let appClass = ["skin-blue", "sidebar-mini", "fixed"]; - if (this.state.showMessageBox){ - appClass.push("control-sidebar-open"); - } - if (this.state.collapseMenu){ - appClass.push("sidebar-collapse"); - } + let appClass = ["skin-blue", "sidebar-mini", "fixed"]; + if (this.state.showMessageBox) { + appClass.push("control-sidebar-open"); + } + if (this.state.collapseMenu) { + appClass.push("sidebar-collapse"); + } - let connectionStatus; - const connectionState = this.state.connectionState; - if (connectionState === "connected") { - connectionStatus = Online; - } else if (connectionState === "reconnecting") { - connectionStatus = Reconnecting; - } else if (connectionState === "disconnected") { - connectionStatus = Disconnected; - } + let connectionStatus; + const connectionState = this.state.connectionState; + if (connectionState === "connected") { + connectionStatus = Online; + } else if (connectionState === "reconnecting") { + connectionStatus = Reconnecting; + } else if (connectionState === "disconnected") { + connectionStatus = Disconnected; + } - let adminPanel; - if (user && user.admin) adminPanel = ; + let adminPanel; + if (user && user.admin) adminPanel = ; - return ( -
    - {this.modal()} -
    - - NSL Gathers - NSL Gathers - - -
    - +
    +
    +
    +
    + + {eventsPanel} +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + ); + } +} -module.exports = App; +export { App } diff --git a/app/javascripts/components/menubar.js b/app/javascripts/components/menubar.js index 613d389..0725876 100644 --- a/app/javascripts/components/menubar.js +++ b/app/javascripts/components/menubar.js @@ -1,17 +1,20 @@ -const MenubarMixin = exports.MenubarMixin = { - getInitialState() { - return { - show: false - } - }, +var MenubarMixin = Base => class extends Base { - toggleShow() { - this.setState({ show: !this.state.show }); - }, + getInitialState() { + return { + show: false + } + } - componentClass() { - let componentClass = ["dropdown", "messages-menu"]; - if (this.state.show) componentClass.push("open"); - return componentClass.join(" "); - } + toggleShow = () => { + this.setState({ show: !this.state.show }); + } + + componentClass = () => { + let componentClass = ["dropdown", "messages-menu"]; + if (this.state.show) componentClass.push("open"); + return componentClass.join(" "); + } }; + +export { MenubarMixin } diff --git a/app/javascripts/components/message.js b/app/javascripts/components/message.js index 7a96ea4..e964518 100644 --- a/app/javascripts/components/message.js +++ b/app/javascripts/components/message.js @@ -1,490 +1,484 @@ -const React = require("react"); -const moment = require("moment"); -const ReactDOM = require("react-dom"); -const Ps = require("perfect-scrollbar"); -const ReactEmoji = require("react-emoji"); -const ReactAutolink = require("react-autolink"); +import React from "react"; +import ReactDOM from "react-dom"; +import { array, object } from "prop-types"; +import ReactEmoji from "react-emoji"; +import ReactAutolink from "react-autolink"; -const MessageBrowser = React.createClass({ - getInitialState() { - return { - browserState: "", - messages: [], - page: 0, - limit: 250, - search: "" - } - }, - handleNextPage(e) { - e.preventDefault(); - const page = this.state.page; - this.setState({ page: page + 1 }); - this.loadMessages(); - }, - handlePreviousPage(e) { - e.preventDefault(); - const page = this.state.page; - if (page < 1) return; - this.setState({ page: page - 1 }); - this.loadMessages(); - }, +class MessageBrowser extends React.Component { + state = { + browserState: "", + messages: [], + page: 0, + limit: 250, + search: "" + } - pageHandlers() { - let previous; - if (this.state.page > 0) { - previous = ( - Prev - ); - } - let next; - if (this.state.messages.length === this.state.limit) { - next = ( - Next - ); - } - return ( -
    - {previous} - - {this.state.page} - - {next} -
    - ); - }, - loadMessages() { - const limit = this.state.limit; - const page = this.state.page; - let data = { - limit: limit, - page: page - }; + handleNextPage = (e) => { + e.preventDefault(); + const page = this.state.page; + this.setState({ page: page + 1 }); + this.loadMessages(); + } - if (this.state.search.length) { - data.query = this.state.search; - } + handlePreviousPage = (e) => { + e.preventDefault(); + const page = this.state.page; + if (page < 1) return; + this.setState({ page: page - 1 }); + this.loadMessages(); + } - this.setState({ browserState: "Retrieving messages"}); - $.ajax({ - url: "/api/messages", - data: data - }) - .done(data => { - this.setState({ - messages: data.messages, - browserState: "" - }); - }) - .fail(error => { - console.error(error); - this.setState({ - browserState: `Unable to retrieve messages.` - }); - }) - }, + pageHandlers = () => { + let previous; + if (this.state.page > 0) { + previous = ( + Prev + ); + } + let next; + if (this.state.messages.length === this.state.limit) { + next = ( + Next + ); + } + return ( +
    + {previous} + + {this.state.page} + + {next} +
    + ); + } - componentDidMount() { - this.loadMessages(); - }, + loadMessages = () => { + const limit = this.state.limit; + const page = this.state.page; + let data = { + limit: limit, + page: page + }; - updateLimit(e) { - let newLimit = parseInt(e.target.value, 10); - if (isNaN(newLimit) || newLimit > 250) newLimit = 250; - this.setState({ limit: newLimit }); - }, + if (this.state.search.length) { + data.query = this.state.search; + } - updateSearch(e) { - this.setState({ search: e.target.value }); - }, + this.setState({ browserState: "Retrieving messages" }); + $.ajax({ + url: "/api/messages", + data: data + }) + .done(data => { + this.setState({ + messages: data.messages, + browserState: "" + }); + }) + .fail(error => { + console.error(error); + this.setState({ + browserState: `Unable to retrieve messages.` + }); + }) + } - render() { - let browserState; - if (this.state.browserState.length) { - browserState = ( -
    -
    {this.state.browserState}
    -
    - ); - } - const messages = this.state.messages.map(message => { - return ( - - {(new Date(message.createdAt)).toString()} - {message.author.username} - {message.content} - {message._id} - - ); - }); - return ( -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -

    Page Control

    - {this.pageHandlers()} -
    -
    -
    -
    - {browserState} -
    - - - - - - - - - - - {messages} - -
    DateAuthorMessageID
    -
    -
    - ); - } -}); + componentDidMount = () => { + this.loadMessages(); + } -const Chatroom = exports.Chatroom = React.createClass({ - propTypes: { - messages: React.PropTypes.array.isRequired, - socket: React.PropTypes.object.isRequired, - user: React.PropTypes.object.isRequired - }, + updateLimit = (e) => { + let newLimit = parseInt(e.target.value, 10); + if (isNaN(newLimit) || newLimit > 250) newLimit = 250; + this.setState({ limit: newLimit }); + } - getInitialState() { - return { - autoScroll: true - }; - }, + updateSearch = (e) => { + this.setState({ search: e.target.value }); + } - componentDidMount() { - let self = this; + render = () => { + let browserState; + if (this.state.browserState.length) { + browserState = ( +
    +
    {this.state.browserState}
    +
    + ); + } + const messages = this.state.messages.map(message => { + return ( + + {(new Date(message.createdAt)).toString()} + {message.author.username} + {message.content} + {message._id} + + ); + }); + return ( +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +

    Page Control

    + {this.pageHandlers()} +
    +
    +
    +
    + {browserState} +
    + + + + + + + + + + + {messages} + +
    DateAuthorMessageID
    +
    +
    + ); + } +} - this.scrollListener = _.debounce((event) => { - self.temporarilyDisableAutoScroll(event); - }, 300, { - leading: false, - trailing: true - }); +class Chatroom extends React.Component { + static propTypes = { + messages: array.isRequired, + socket: object.isRequired, + user: object.isRequired + } + state = { + autoScroll: true + } - let node = ReactDOM.findDOMNode(this.refs.messageContainer); - node.addEventListener('scroll', this.scrollListener); + componentDidMount = () => { + let self = this; - $(window).on("load", this.scrollToBottom); - }, + this.scrollListener = _.debounce((event) => { + self.temporarilyDisableAutoScroll(event); + }, 300, { + leading: false, + trailing: true + }); - componentWillUnmount() { - node.removeEventListener('scroll', this.scrollListener); - clearTimeout(this.disableScrollTimer); - }, + let node = ReactDOM.findDOMNode(this.refs.messageContainer); + node.addEventListener('scroll', this.scrollListener); - loadMoreMessages() { - const earliestMessage = this.props.messages[0]; - if (earliestMessage === undefined) return; - this.props.socket.emit("message:refresh", { - before: earliestMessage.createdAt - }); - }, + $(window).on("load", this.scrollToBottom); + } - sendMessage(message) { - this.props.socket.emit("newMessage", {message: message}); - }, + componentWillUnmount = () => { + node.removeEventListener('scroll', this.scrollListener); + clearTimeout(this.disableScrollTimer); + } - clearAutoScrollTimeout() { - if (this.disableScrollTimer) clearTimeout(this.disableScrollTimer); - }, + loadMoreMessages = () => { + const earliestMessage = this.props.messages[0]; + if (earliestMessage === undefined) return; + this.props.socket.emit("message:refresh", { + before: earliestMessage.createdAt + }); + } - temporarilyDisableAutoScroll(event) { - let self = this; - let node = event.target; - if (node) { - if (node.scrollHeight - node.scrollTop === node.clientHeight) { - this.setState({ autoScroll: true }); - this.clearAutoScrollTimeout(); - } - if (node.scrollHeight - node.scrollTop - node.clientHeight < 50) return; - } - this.setState({ autoScroll: false }); - this.clearAutoScrollTimeout(); - this.disableScrollTimer = setTimeout(() => { - self.setState({ - autoScroll: true - }) - }, 10000); - }, + sendMessage = (message) => { + this.props.socket.emit("newMessage", { message: message }); + } - componentDidUpdate(prevProps) { - if (prevProps.messages.length < this.props.messages.length) { - this.scrollToBottom(); - } - }, + clearAutoScrollTimeout = () => { + if (this.disableScrollTimer) clearTimeout(this.disableScrollTimer); + } - scrollToBottom() { - if (!this.state.autoScroll) return; - let node = ReactDOM.findDOMNode(this.refs.messageContainer); - node.scrollTop = node.scrollHeight; - }, + temporarilyDisableAutoScroll = (event) => { + let self = this; + let node = event.target; + if (node) { + if (node.scrollHeight - node.scrollTop === node.clientHeight) { + this.setState({ autoScroll: true }); + this.clearAutoScrollTimeout(); + } + if (node.scrollHeight - node.scrollTop - node.clientHeight < 50) return; + } + this.setState({ autoScroll: false }); + this.clearAutoScrollTimeout(); + this.disableScrollTimer = setTimeout(() => { + self.setState({ + autoScroll: true + }) + }, 10000); + } - render() { - const socket = this.props.socket; - const messages = this.props.messages.map(message => { - if (message) { - return - } - }); - return ( - + ); + } +} const imgurRegex = /^(https?:\/\/i\.imgur\.com\/\S*\.(jpg|png))$/i; -const ChatMessage = React.createClass({ - propTypes: { - user: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - message: React.PropTypes.object.isRequired - }, +class ChatMessage extends React.Component { + static propTypes = { + user: object.isRequired, + socket: object.isRequired, + message: object.isRequired + } - mixins: [ - ReactAutolink, - ReactEmoji - ], + state = { + createdAt: "" + } - getInitialState() { - return { - createdAt: "" - } - }, + autolink = ReactAutolink.autolink + emojify = ReactEmoji.emojify - messageContent: function () { - let self = this; - let message = self.props.message.content - if (message.match(imgurRegex)) { - return ( -
    - - - -
    - ); - } + messageContent = () => { + let self = this; + let message = self.props.message.content + if (message.match(imgurRegex)) { + return ( +
    + + + +
    + ); + } - return ( -

    - { - self.autolink(message, { - target: "_blank", - rel: "nofollow" - }).map((elem) => { - if (_.isString(elem)) { - return self.emojify(elem); - } else { - return elem; - } - }) - } -

    - ); - }, + return ( +

    + { + self.autolink(message, { + target: "_blank", + rel: "nofollow" + }).map((elem) => { + if (_.isString(elem)) { + return self.emojify(elem); + } else { + return elem; + } + }) + } +

    + ); + } - messageTime() { - let self = this; - let ts = new Date(self.props.message.createdAt); - let t = ts.toLocaleTimeString(undefined,{hour:"2-digit", minute:"2-digit"}); - let d = ts.toLocaleDateString(undefined,{month: "2-digit", day:"2-digit"}); - let r = ""; - return r.concat(d," ", t); - }, + messageTime = () => { + let self = this; + let ts = new Date(self.props.message.createdAt); + let t = ts.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit" }); + let d = ts.toLocaleDateString(undefined, { month: "2-digit", day: "2-digit" }); + let r = ""; + return r.concat(d, " ", t); + } - render() { - let deleteButton; - let user = this.props.user; - if (user && user.admin) { - deleteButton = ; - } - return ( -
  • - - User Avatar - -
    -
    - - {this.props.message.author.username} - - - - {this.messageTime()} - - {deleteButton} - -
    - {this.messageContent()} -
    -
  • - ); - } -}); + render = () => { + let deleteButton; + let user = this.props.user; + if (user && user.admin) { + deleteButton = ; + } + return ( +
  • + + User Avatar + +
    +
    + + {this.props.message.author.username} + + + + {this.messageTime()} + + {deleteButton} + +
    + {this.messageContent()} +
    +
  • + ); + } +} -const DeleteMessageButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired - }, +class DeleteMessageButton extends React.Component { + static propTypes = { + socket: object.isRequired + } - handleClick (e) { - e.preventDefault(); - this.props.socket.emit("message:delete", { - id: this.props.messageId - }); - }, + handleClick = (e) => { + e.preventDefault(); + this.props.socket.emit("message:delete", { + id: this.props.messageId + }); + } - render() { - return ( - - - - ); - } -}) + render = () => { + return ( + + + + ); + } +} -const MessageBar = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired - }, +class MessageBar extends React.Component { + static propTypes = { + socket: object.isRequired + } - sendMessage(content) { - this.props.socket.emit("message:new", { - content: content - }); - }, + state = { + statusMessage: null + } - getInitialState() { - return { - statusMessage: null - }; - }, - checkInputLength() { - const input = ReactDOM.findDOMNode(this.refs.content).value; - const currentStatusMessage = this.state.statusMessage; - if (input.length > 256) { - return this.setState({ - statusMessage: "Maximum of 256 characters will be saved" - }) - } - if (currentStatusMessage !== null) { - this.setState({ - statusMessage: null - }); - } - }, + sendMessage = (content) => { + this.props.socket.emit("message:new", { + content: content + }); + } - handleInputChange() { - // Noop, later assigned as debounced method in componentWillMount - }, + checkInputLength = () => { + const input = ReactDOM.findDOMNode(this.refs.content).value; + const currentStatusMessage = this.state.statusMessage; + if (input.length > 256) { + return this.setState({ + statusMessage: "Maximum of 256 characters will be saved" + }) + } + if (currentStatusMessage !== null) { + this.setState({ + statusMessage: null + }); + } + } - handleSubmit(e) { - e.preventDefault(); - let content = ReactDOM.findDOMNode(this.refs.content).value.trim(); - if (!content) return; - ReactDOM.findDOMNode(this.refs.content).value = ''; - this.sendMessage(content); - return; - }, + handleInputChange() { + // Noop, later assigned as debounced method in componentWillMount + } - componentWillMount() { - this.handleInputChange = _.debounce(this.checkInputLength, { - leading: false, - trailing: true - }); - }, + handleSubmit = (e) => { + e.preventDefault(); + let content = ReactDOM.findDOMNode(this.refs.content).value.trim(); + if (!content) return; + ReactDOM.findDOMNode(this.refs.content).value = ''; + this.sendMessage(content); + return; + } - render() { - let statusMessage; - if (this.state.statusMessage !== null) { - statusMessage =
    - {this.state.statusMessage} -
    ; - } - return ( + componentWillMount = () => { + this.handleInputChange = _.debounce(this.checkInputLength, { + leading: false, + trailing: true + }); + } -
    -
    - - - - -
    - {statusMessage} -
    - ); - } -}); + render = () => { + let statusMessage; + if (this.state.statusMessage !== null) { + statusMessage =
    + {this.state.statusMessage} +
    ; + } + return ( + +
    +
    + + + + +
    + {statusMessage} +
    + ); + } +} + +export { Chatroom } diff --git a/app/javascripts/components/news.js b/app/javascripts/components/news.js index 83549c3..c333431 100644 --- a/app/javascripts/components/news.js +++ b/app/javascripts/components/news.js @@ -1,112 +1,119 @@ -const $ = require("jquery"); -const React = require("react"); -const helper = require("javascripts/helper"); -const storageAvailable = helper.storageAvailable; -import {MenubarMixin} from "javascripts/components/menubar"; +import React from "react" +import $ from "jquery"; +import { MenubarMixin } from "./menubar"; +import { storageAvailable } from "../helper"; const READ_ARTICLES_STORAGE = "akuh098h209ufnw"; const HTML_ENTITY_REGEX = /&#\d+;/; -const News = exports.News = React.createClass({ - mixins: [MenubarMixin], - getInitialState() { - let readArticles = {}; - if (storageAvailable('localStorage')) { - const raw = localStorage.getItem(READ_ARTICLES_STORAGE) || {}; - let rawJson; - try { - rawJson = JSON.parse(raw); - } catch (e) { - rawJson = {}; - } - readArticles = rawJson; - } +class News extends MenubarMixin(React.Component) { - return { - posts: [], - readArticles: readArticles - }; - }, + constructor(props) { + super(props) - updatePosts(data) { - this.setState({ - posts: data.posts.slice(0,5).map(post => { - return { - id: post.id, - url: post.url, - title: post.title - } - }) - }); - }, + this.state = this.getInitialState(); + } - renderTitle(title) { - return title.replace(HTML_ENTITY_REGEX, match => { - return String.fromCharCode(match.slice(2, match.length - 1)) - }); - }, + getInitialState = () => { + let readArticles = {}; + if (storageAvailable('localStorage')) { + const raw = localStorage.getItem(READ_ARTICLES_STORAGE) || {}; + let rawJson; + try { + rawJson = JSON.parse(raw); + } catch (e) { + rawJson = {}; + } + readArticles = rawJson; + } - componentDidMount() { - $.getJSON("http://ns2news.org/api-json/get_recent_posts?callback=?") - .done(this.updatePosts); - }, + return Object.assign(super.getInitialState(), { + posts: [], + readArticles: readArticles + }); + } - markAsRead(post) { - const self = this; - return function (e) { - let readArticles = self.state.readArticles; - readArticles[post.id] = (new Date()).toJSON(); - self.setState({readArticles: readArticles}); + updatePosts = (data) => { + this.setState({ + posts: data.posts.slice(0, 5).map(post => { + return { + id: post.id, + url: post.url, + title: post.title + } + }) + }); + } - if (storageAvailable('localStorage')) { - localStorage.setItem(READ_ARTICLES_STORAGE, JSON.stringify(readArticles)); - } - } - }, + renderTitle = (title) => { + return title.replace(HTML_ENTITY_REGEX, match => { + return String.fromCharCode(match.slice(2, match.length - 1)) + }); + } - hasBeenRead(post) { - return (this.state.readArticles[post.id] !== undefined); - }, + componentDidMount = () => { + $.getJSON("http://ns2news.org/api-json/get_recent_posts?callback=?") + .done(this.updatePosts); + } - render() { - const articles = this.state.posts.map(post => { - let postClass = ""; - if (!this.hasBeenRead(post)) postClass += "unread"; - return ( -
  • - {this.renderTitle(post.title)} -
  • - ); - }); + markAsRead = (post) => { + const self = this; + return function (e) { + let readArticles = self.state.readArticles; + readArticles[post.id] = (new Date()).toJSON(); + self.setState({ readArticles: readArticles }); - const unreadArticles = this.state.posts.reduce((prev, post) => { - if (this.hasBeenRead(post)) { - return prev; - } else { - return prev + 1; - } - }, 0) + if (storageAvailable('localStorage')) { + localStorage.setItem(READ_ARTICLES_STORAGE, JSON.stringify(readArticles)); + } + } + } - let tag; - if (unreadArticles > 0) { - tag = {unreadArticles}; - } + hasBeenRead = (post) => { + return (this.state.readArticles[post.id] !== undefined); + } - return ( -
  • - - - {tag} - -
      -
    • NS2News.org
    • -
        - {articles} -
      -
    -
  • - ); - } -}); + render = () => { + const articles = this.state.posts.map(post => { + let postClass = ""; + if (!this.hasBeenRead(post)) postClass += "unread"; + return ( +
  • + {this.renderTitle(post.title)} +
  • + ); + }); + + const unreadArticles = this.state.posts.reduce((prev, post) => { + if (this.hasBeenRead(post)) { + return prev; + } else { + return prev + 1; + } + }, 0) + + let tag; + if (unreadArticles > 0) { + tag = {unreadArticles}; + } + + return ( +
  • + + + {tag} + +
      +
    • NS2News.org
    • +
        + {articles} +
      +
    +
  • + ); + } +} + +export { News } diff --git a/app/javascripts/components/settings.js b/app/javascripts/components/settings.js index 9bd0268..6630917 100644 --- a/app/javascripts/components/settings.js +++ b/app/javascripts/components/settings.js @@ -1,50 +1,53 @@ -const React = require("react"); +import React from "react"; +import { func, bool } from "prop-types"; -const SettingsPanel = exports.SettingsPanel = React.createClass({ - propTypes: { - toggleUpdateTitle: React.PropTypes.func.isRequired, - updateTitle: React.PropTypes.bool.isRequired, - toggleEventsPanel: React.PropTypes.func.isRequired, - showEventsPanel: React.PropTypes.bool.isRequired - }, +class SettingsPanel extends React.Component { + propTypes = { + toggleUpdateTitle: func.isRequired, + updateTitle: bool.isRequired, + toggleEventsPanel: func.isRequired, + showEventsPanel: bool.isRequired + } - render() { - return ( -
    -
    -
    -
    - -

    Settings

    -
    -
    -
    -
    +
    +
    + +
    +
    +
    +
    + ); + } +} + +export { SettingsPanel } diff --git a/app/javascripts/components/snowMachine.js b/app/javascripts/components/snowMachine.js index 60abee1..307b400 100644 --- a/app/javascripts/components/snowMachine.js +++ b/app/javascripts/components/snowMachine.js @@ -1,36 +1,34 @@ -const React = require("react"); +import React from "react"; -var SnowMachineMenu = React.createClass({ - getInitialState() { - return { - snowMachine: null - } - }, +class SnowMachineMenu extends React.Component { + state = { + snowMachine: null + } - componentDidMount() { - const snowMachine = new SnowMachine(); - snowMachine.start(); - this.setState({ snowMachine: snowMachine }); - }, + componentDidMount = () => { + const snowMachine = new SnowMachine(); + snowMachine.start(); + this.setState({ snowMachine: snowMachine }); + } - toggle() { - const snowMachine = this.state.snowMachine; - if (snowMachine.timer) { - snowMachine.stop(); - } else { - snowMachine.start(); - } - }, + toggle = () => { + const snowMachine = this.state.snowMachine; + if (snowMachine.timer) { + snowMachine.stop(); + } else { + snowMachine.start(); + } + } - render() { - return ( - + ); + } +} diff --git a/app/javascripts/components/sound.js b/app/javascripts/components/sound.js index 1ae424b..1365d3e 100644 --- a/app/javascripts/components/sound.js +++ b/app/javascripts/components/sound.js @@ -1,292 +1,293 @@ -const $ = require("jquery"); -const React = require("react"); -const Howl = require("howler").Howl; -const Howler = require("howler").Howler; -const helper = require("javascripts/helper"); -import {MenubarMixin} from "javascripts/components/menubar"; -const storageAvailable = helper.storageAvailable; +import $ from "jquery" +import React from "react"; +import { Howl, Howler } from "howler"; +import { storageAvailable } from "../helper"; +import { MenubarMixin } from "./menubar"; class SoundController { - constructor () { - if (Howl === undefined) { - throw new Error("Howl.js required to created sound controller"); - } + constructor() { + if (Howl === undefined) { + throw new Error("Howl.js required to created sound controller"); + } - this.MINIMUM_PLAY_INTERVAL = 20000; + this.MINIMUM_PLAY_INTERVAL = 20000; - this.playGatherMusic = _.throttle(() => { - this.gather.music.play(); - }, this.MINIMUM_PLAY_INTERVAL); + this.playGatherMusic = _.throttle(() => { + this.gather.music.play(); + }, this.MINIMUM_PLAY_INTERVAL); - this.isMuted = Howler._muted; - - let gatherMusic; - if (storageAvailable("localStorage")) { - let volume = localStorage.getItem("gatherVolume"); - if (volume !== undefined) Howler.volume(volume); - gatherMusic = localStorage.getItem("gatherMusic"); - } + this.isMuted = Howler._muted; - this.tunes = { - "classic": { - description: "Gathers Classic", - url: 'https://www.ensl.org/files/audio/gather-1.mp3' - }, - "nights": { - description: "Nights", - url: 'https://www.ensl.org/files/audio/nights.mp3' - }, - "robby": { - description: "Robby", - url: 'https://www.ensl.org/files/audio/robby.mp3' - }, - "america": { - description: "Infamous", - url: 'https://www.ensl.org/files/audio/america.mp3' - }, - "prommah": { - description: "Prommah", - url: 'https://www.ensl.org/files/audio/prommah.mp3' - }, - "turts": { - description: "Gorges Rock your Ass", - url: 'https://www.ensl.org/files/audio/turts.mp3' - }, - "skyice": { - description: "Skyice", - url: 'https://www.ensl.org/files/audio/skyice.mp3' - }, - "justwannahavefun": { - description: "Gorges just want to have fun", - url: 'https://www.ensl.org/files/audio/justwannahavefun.mp3' - }, - "eyeofthegorgie": { - description: "Eye of the Gorgie", - url: 'https://www.ensl.org/files/audio/eyeofthegorgie.mp3' - }, - "boondock": { - description: "Boondock Marines", - url: 'https://www.ensl.org/files/audio/boondock.mp3' - }, - "preclassic": { - description: "Old Gathers Classic", - url: 'https://www.ensl.org/files/audio/gather-5.mp3' - } - } + let gatherMusic; + if (storageAvailable("localStorage")) { + let volume = localStorage.getItem("gatherVolume"); + if (volume !== undefined) Howler.volume(volume); + gatherMusic = localStorage.getItem("gatherMusic"); + } - this.setupGatherMusic(gatherMusic); - } + this.tunes = { + "classic": { + description: "Gathers Classic", + url: 'https://www.ensl.org/files/audio/gather-1.mp3' + }, + "nights": { + description: "Nights", + url: 'https://www.ensl.org/files/audio/nights.mp3' + }, + "robby": { + description: "Robby", + url: 'https://www.ensl.org/files/audio/robby.mp3' + }, + "america": { + description: "Infamous", + url: 'https://www.ensl.org/files/audio/america.mp3' + }, + "prommah": { + description: "Prommah", + url: 'https://www.ensl.org/files/audio/prommah.mp3' + }, + "turts": { + description: "Gorges Rock your Ass", + url: 'https://www.ensl.org/files/audio/turts.mp3' + }, + "skyice": { + description: "Skyice", + url: 'https://www.ensl.org/files/audio/skyice.mp3' + }, + "justwannahavefun": { + description: "Gorges just want to have fun", + url: 'https://www.ensl.org/files/audio/justwannahavefun.mp3' + }, + "eyeofthegorgie": { + description: "Eye of the Gorgie", + url: 'https://www.ensl.org/files/audio/eyeofthegorgie.mp3' + }, + "boondock": { + description: "Boondock Marines", + url: 'https://www.ensl.org/files/audio/boondock.mp3' + }, + "preclassic": { + description: "Old Gathers Classic", + url: 'https://www.ensl.org/files/audio/gather-5.mp3' + } + } - mute() { - this.isMuted = true; - return Howler.mute(); - } + this.setupGatherMusic(gatherMusic); + } - unMute() { - this.isMuted = false; - return Howler.unmute(); - } + mute = () => { + this.isMuted = true; + return Howler.mute(); + } - getVolume() { - return Howler.volume(); - } + unMute = () => { + this.isMuted = false; + return Howler.unmute(); + } - setVolume(val) { - if (val === undefined || - typeof val !== 'number' || - Math.abs(val) > 1) return; - if (storageAvailable("localStorage")) { - localStorage.setItem("gatherVolume", val); - } - return Howler.volume(val); - } + getVolume = () => { + return Howler.volume(); + } - play(music) { - if (this.gather && this.gather.music) return this.gather.music.play(); - } + setVolume = (val) => { + if (val === undefined || + typeof val !== 'number' || + Math.abs(val) > 1) return; + if (storageAvailable("localStorage")) { + localStorage.setItem("gatherVolume", val); + } + return Howler.volume(val); + } - stop(music) { - if (this.gather && this.gather.music) return this.gather.music.stop(); - } + play = (music) => { + if (this.gather && this.gather.music) return this.gather.music.play(); + } - defaultGatherMusic() { - return "classic"; - } + stop = (music) => { + if (this.gather && this.gather.music) return this.gather.music.stop(); + } - setupGatherMusic (musicName) { - let self = this; - let gatherMusic = self.tunes[musicName]; + defaultGatherMusic() { + return "classic"; + } - if (!gatherMusic) { - musicName = this.defaultGatherMusic(); - gatherMusic = self.tunes[musicName]; - } + setupGatherMusic = (musicName) => { + let self = this; + let gatherMusic = self.tunes[musicName]; - if (self.gather && self.gather.name === musicName) return; + if (!gatherMusic) { + musicName = this.defaultGatherMusic(); + gatherMusic = self.tunes[musicName]; + } - // Stop if already playing - if (self.gather && self.gather.music) { - self.gather.music.stop(); - } + if (self.gather && self.gather.name === musicName) return; - let tune = self.tunes[musicName]; - self.gather = { - name: musicName, - description: tune.description, - url: tune.url, - music: new Howl({ - urls: [tune.url] - }) - }; - } + // Stop if already playing + if (self.gather && self.gather.music) { + self.gather.music.stop(); + } + + let tune = self.tunes[musicName]; + self.gather = { + name: musicName, + description: tune.description, + url: tune.url, + music: new Howl({ + urls: [tune.url] + }) + }; + } } -var MusicSelector = React.createClass({ - getInitialState() { - return { - music: this.selectedMusic() - } - }, +class MusicSelector extends React.Component { - selectedMusic() { - if (storageAvailable("localStorage")) { - return localStorage.getItem("gatherMusic") - || this.props.soundController.defaultGatherMusic(); - } else { - return this.props.soundController.defaultGatherMusic(); - } - }, + constructor(props) { + super(props) + this.state = { + music: this.selectedMusic() + } + } - setMusic(event) { - let name = event.target.value; - let soundController = this.props.soundController; - let selectedTune = soundController.tunes[name]; - if (selectedTune === undefined) return; - this.setState({ music: name }); - soundController.setupGatherMusic(name); - if (storageAvailable("localStorage")) { - localStorage.setItem("gatherMusic", name); - } - }, + selectedMusic = () => { + if (storageAvailable("localStorage")) { + return localStorage.getItem("gatherMusic") + || this.props.soundController.defaultGatherMusic(); + } else { + return this.props.soundController.defaultGatherMusic(); + } + } - render() { - let soundController = this.props.soundController; - let tunes = []; - for (var attr in soundController.tunes) { - let o = soundController.tunes[attr]; - o.id = attr; - tunes.push(o); - } - let options = tunes.map(tune => { - return ; - }); - return ( -
    - - -
    - ); - } -}) + setMusic = (event) => { + let name = event.target.value; + let soundController = this.props.soundController; + let selectedTune = soundController.tunes[name]; + if (selectedTune === undefined) return; + this.setState({ music: name }); + soundController.setupGatherMusic(name); + if (storageAvailable("localStorage")) { + localStorage.setItem("gatherMusic", name); + } + } -var SoundPanel = React.createClass({ - mixins: [MenubarMixin], + render = () => { + let soundController = this.props.soundController; + let tunes = []; + for (var attr in soundController.tunes) { + let o = soundController.tunes[attr]; + o.id = attr; + tunes.push(o); + } + let options = tunes.map(tune => { + return ; + }); + return ( +
    + + +
    + ); + } +} - componentDidMount() { - let soundController = this.props.soundController; - let scale = 10; +class SoundPanel extends MenubarMixin(React.Component) { - $('a#sound-dropdown').on('click', function (event) { - $(this).parent().toggleClass('open'); - }); + constructor(props) { + super(props) + this.state = this.getInitialState(); + } - $("#volume-slide").slider({ - min: 0, - max: scale, - step: 1 - }).on("slideStop", ({value}) => { - soundController.setVolume(value / scale); - }).slider('setValue', soundController.getVolume() * scale); - }, + componentDidMount = () => { + let soundController = this.props.soundController; + let scale = 10; - mute() { - this.props.soundController.mute(); - this.forceUpdate(); - }, + $('a#sound-dropdown').on('click', function (event) { + $(this).parent().toggleClass('open'); + }); - unMute() { - this.props.soundController.unMute(); - this.forceUpdate(); - }, + $("#volume-slide").slider({ + min: 0, + max: scale, + step: 1 + }).on("slideStop", ({ value }) => { + soundController.setVolume(value / scale); + }).slider('setValue', soundController.getVolume() * scale); + } - play() { - this.props.soundController.stop(); - this.props.soundController.play(); - }, + mute = () => { + this.props.soundController.mute(); + this.forceUpdate(); + } - stop() { - this.props.soundController.stop(); - }, + unMute = () => { + this.props.soundController.unMute(); + this.forceUpdate(); + } - render() { - let soundController = this.props.soundController; - let mutedIcon, mutedButton; - if (soundController.isMuted) { - mutedIcon = ; - mutedButton =
  • - - {mutedIcon} Muted + play = () => { + this.props.soundController.stop(); + this.props.soundController.play(); + } + + stop = () => { + this.props.soundController.stop(); + } + + render = () => { + let soundController = this.props.soundController; + let mutedIcon, mutedButton; + if (soundController.isMuted) { + mutedIcon = ; + mutedButton =
  • + + {mutedIcon} Muted -
  • ; - } else { - mutedIcon = ; - mutedButton =
  • - - {mutedIcon} Unmuted +
  • ; + } else { + mutedIcon = ; + mutedButton =
  • + + {mutedIcon} Unmuted -
  • ; - } - return ( -
  • - {mutedIcon} - +
  • + ); + } +} -module.exports = { - SoundController: SoundController, - SoundPanel: SoundPanel -}; +export { SoundController, SoundPanel } diff --git a/app/javascripts/components/user.js b/app/javascripts/components/user.js index 681ca34..acb0425 100644 --- a/app/javascripts/components/user.js +++ b/app/javascripts/components/user.js @@ -1,389 +1,387 @@ import { LifeformIcons } from "javascripts/components/gather"; -const React = require("react"); -const helper = require("javascripts/helper"); -const enslUrl = helper.enslUrl; -const modalId = helper.modalId; -const obsUrl = helper.observatoryUrl; -const Ps = require('perfect-scrollbar'); +import React from "react"; +import { object, number, func, array } from "prop-types"; +import { enslUrl, observatoryUrl as obsUrl } from "../helper"; -const DisconnectUserButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - id: React.PropTypes.number.isRequired - }, - getDefaultProps() { - return { - id: null - }; - }, +class DisconnectUserButton extends React.Component { + static propTypes = { + socket: object.isRequired, + id: number.isRequired + } + state = { + id: null + } - disconnectUser() { - this.props.socket.emit("users:disconnect", { - id: this.props.id - }); - }, + disconnectUser = () => { + this.props.socket.emit("users:disconnect", { + id: this.props.id + }); + } - render() { - return - } -}); + render = () => { + return + } +} -const UserModal = React.createClass({ - propTypes: { - user: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - currentUser: React.PropTypes.object.isRequired, - close: React.PropTypes.func.isRequired - }, +class UserModal extends React.Component { + static propTypes = { + user: object.isRequired, + socket: object.isRequired, + currentUser: object.isRequired, + close: func.isRequired + } - render() { - const currentUser = this.props.currentUser; - const user = this.props.user; - let hiveStats; - if (user.hive.id) { - hiveStats = [ - Hive Stats, - - ELO - {user.hive.skill} - , - - Play Time (Hours) - {Math.round(user.hive.playTime / 3600)} - , - - Marine Play Time (Hours) - {_.round(user.hive.marine_playtime / 3600, 1)} - , - - Alien Play Time (Hours) - {_.round(user.hive.alien_playtime / 3600, 1)} - , - - Commander Play Time (Hours) - {_.round(user.hive.commander_time / 3600, 1)} - , - - Player ID - {user.hive.pid} - - ] - } - let adminOptions; - if (currentUser.admin) { - adminOptions = ; - } + render = () => { + const currentUser = this.props.currentUser; + const user = this.props.user; + let hiveStats; + if (user.hive.id) { + hiveStats = [ + Hive Stats, + + ELO + {user.hive.skill} + , + + Play Time (Hours) + {Math.round(user.hive.playTime / 3600)} + , + + Marine Play Time (Hours) + {_.round(user.hive.marine_playtime / 3600, 1)} + , + + Alien Play Time (Hours) + {_.round(user.hive.alien_playtime / 3600, 1)} + , + + Commander Play Time (Hours) + {_.round(user.hive.commander_time / 3600, 1)} + , + + Player ID + {user.hive.pid} + + ] + } + let adminOptions; + if (currentUser.admin) { + adminOptions = ; + } - return ( -
    -
    -
    - -

    - {user.country}  + return ( +
    +
    +
    + +

    + {user.country}  {user.username} -

    -
    -
    -
    - User Avatar -
    - - - - - - - - - + + {hiveStats} + +
    Lifeforms
    Links - ENSL Profile  + + +
    +
    + User Avatar +
    + + + + + + + + + - - {hiveStats} - -
    Lifeforms
    Links + ENSL Profile  Observatory Profile -
    -
    -
    - {adminOptions} - -
    - - - ); - } -}) + className="btn btn-xs btn-primary" + target="_blank">Observatory Profile +
    +
    +
    + {adminOptions} + +
    +
    +
    + ); + } +} -const UserItem = React.createClass({ - propTypes: { - user: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - currentUser: React.PropTypes.object.isRequired, - mountModal: React.PropTypes.func.isRequired - }, +class UserItem extends React.Component { + static propTypes = { + user: object.isRequired, + socket: object.isRequired, + currentUser: object.isRequired, + mountModal: func.isRequired + } - openModal(e) { - e.preventDefault(); - this.props.mountModal({ - component: UserModal, - props: { - user: this.props.user, - currentUser: this.props.currentUser, - socket: this.props.socket - } - }); - }, + openModal = (e) => { + e.preventDefault(); + this.props.mountModal({ + component: UserModal, + props: { + user: this.props.user, + currentUser: this.props.currentUser, + socket: this.props.socket + } + }); + } - render() { - const user = this.props.user; - const currentUser = this.props.currentUser; - return ( -
  • - {user.username} -
  • - ); - } -}); + render = () => { + const user = this.props.user; + const currentUser = this.props.currentUser; + return ( +
  • + {user.username} +
  • + ); + } +} -const UserMenu = exports.UserMenu = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - users: React.PropTypes.array.isRequired, - mountModal: React.PropTypes.func.isRequired - }, +class UserMenu extends React.Component { + static propTypes = { + socket: object.isRequired, + users: array.isRequired, + mountModal: func.isRequired + } - componentDidMount() { + render = () => { + const users = this.props.users + .sort((a, b) => (a.username.toLowerCase() > b.username.toLowerCase()) ? 1 : -1) + .map(user => { + return + }); + return ( +
    +
      + {users} +
    +
    + ); + } +} - }, +class ProfileModal extends React.Component { + static propTypes = { + user: object.isRequired, + socket: object.isRequired, + close: func.isRequired + } - render() { - const users = this.props.users - .sort((a, b) => (a.username.toLowerCase() > b.username.toLowerCase()) ? 1 : -1) - .map(user => { - return - }); - return ( -
    -
      - {users} -
    -
    - ); - } -}); + constructor(props) { + super(props); + this.state = this.getInitialState(); + } -const ProfileModal = exports.ProfileModal = React.createClass({ - propTypes: { - user: React.PropTypes.object.isRequired, - socket: React.PropTypes.object.isRequired, - close: React.PropTypes.func.isRequired - }, + getInitialState = () => { + const user = this.props.user; + console.log(user.profile); + return { + abilities: { + skulk: user.profile.abilities.skulk, + lerk: user.profile.abilities.lerk, + gorge: user.profile.abilities.gorge, + fade: user.profile.abilities.fade, + onos: user.profile.abilities.onos, + commander: user.profile.abilities.commander + }, + skill: user.profile.skill + }; + } - getInitialState() { - const user = this.props.user; - console.log(user.profile); - return { - abilities: { - skulk: user.profile.abilities.skulk, - lerk: user.profile.abilities.lerk, - gorge: user.profile.abilities.gorge, - fade: user.profile.abilities.fade, - onos: user.profile.abilities.onos, - commander: user.profile.abilities.commander - }, - skill: user.profile.skill - }; - }, + handleUserUpdate = (e) => { + e.preventDefault(); + this.props.socket.emit("users:update:profile", { + id: this.props.user.id, + profile: { + abilities: this.state.abilities, + skill: this.state.skill + } + }); + this.props.close(); + } - handleUserUpdate(e) { - e.preventDefault(); - this.props.socket.emit("users:update:profile", { - id: this.props.user.id, - profile: { - abilities: this.state.abilities, - skill: this.state.skill - } - }); - this.props.close(); - }, + handleAbilityChange = (e) => { + let abilities = this.state.abilities; + abilities[e.target.name] = e.target.checked; + this.setState({ abilities: abilities }); + } - handleAbilityChange(e) { - let abilities = this.state.abilities; - abilities[e.target.name] = e.target.checked; - this.setState({ abilities: abilities }); - }, + handleSkillChange = (e) => { + this.setState({ skill: e.target.value }); + } - handleSkillChange(e) { - this.setState({ skill: e.target.value }); - }, + render = () => { + const user = this.props.user; + if (!user) return false; - render() { - const user = this.props.user; - if (!user) return false; + const abilities = this.state.abilities; - const abilities = this.state.abilities; + let abilitiesForm = []; + for (let lifeform in abilities) { + abilitiesForm.push( +
    + +
    + ); + } - let abilitiesForm = []; - for (let lifeform in abilities) { - abilitiesForm.push( -
    - -
    - ); - } + let skillLevel = user.profile.skill; + let skillLevels = _.uniq(["Low Skill", "Medium Skill", "High Skill", skillLevel]) + .filter(skill => { return typeof skill === 'string' }) + .map(skill => { return }); - let skillLevel = user.profile.skill; - let skillLevels = _.uniq(["Low Skill", "Medium Skill", "High Skill", skillLevel]) - .filter(skill => { return typeof skill === 'string' }) - .map(skill => { return }); - - return ( -
    -
    -
    - -

    Profile

    -
    -
    -
    -
    -
    - -

    - Try to give an accurate representation of your skill to raise - the quality of your gathers + return ( +

    +
    +
    + +

    Profile

    +
    +
    + +
    +
    + +

    + Try to give an accurate representation of your skill to raise + the quality of your gathers

    -
    -
    -
    -
    - {abilitiesForm} -

    - Specify which lifeforms you'd like to play in the gather +

    +
    +
    +
    + {abilitiesForm} +

    + Specify which lifeforms you'd like to play in the gather

    -
    -
    -

    - You will need to rejoin the gather to see your updated profile +

    +
    +

    + You will need to rejoin the gather to see your updated profile

    -
    - -
    - -
    -
    -
    - ); - } -}); +
    + +
    + +
    +
    +
    + ); + } +} -const CurrentUser = exports.CurrentUser = React.createClass({ - render() { - if (this.props.user) { - let adminOptions; - if (this.props.user.admin || this.props.user.moderator) { - adminOptions = ( -
  • - - Administration +class CurrentUser extends React.Component { + render = () => { + if (this.props.user) { + let adminOptions; + if (this.props.user.admin || this.props.user.moderator) { + adminOptions = ( +
  • + + Administration -
  • - ) - } - return ( -
  • - - {this.props.user.username}  User Avatar - - -
  • - ); - } else { - return false; - } - } -}); + + ) + } + return ( +
  • + + {this.props.user.username}  User Avatar + + +
  • + ); + } else { + return false; + } + } +} -var AssumeUserIdButton = exports.AssumeUserIdButton = React.createClass({ - propTypes: { - socket: React.PropTypes.object.isRequired, - gatherer: React.PropTypes.object.isRequired, - currentUser: React.PropTypes.object.isRequired, - }, +class AssumeUserIdButton extends React.Component { + static propTypes = { + socket: object.isRequired, + gatherer: object.isRequired, + currentUser: object.isRequired, + } - assumeId(e) { - e.preventDefault(); - if (this.props.gatherer) { - this.props.socket.emit("users:authorize", { - id: this.props.gatherer.id - }); - // Refresh Gather list - setTimeout(() => { - this.props.socket.emit("gather:refresh"); - }, 5000); - } - }, + assumeId = (e) => { + e.preventDefault(); + if (this.props.gatherer) { + this.props.socket.emit("users:authorize", { + id: this.props.gatherer.id + }); + // Refresh Gather list + setTimeout(() => { + this.props.socket.emit("gather:refresh"); + }, 5000); + } + } - render() { - let currentUser = this.props.currentUser; - let gatherer = this.props.gatherer; - if (currentUser && gatherer) { - return - } - } -}); + render = () => { + let currentUser = this.props.currentUser; + let gatherer = this.props.gatherer; + if (currentUser && gatherer) { + return + } + } +} + +export { UserMenu, ProfileModal, CurrentUser, AssumeUserIdButton } diff --git a/app/javascripts/helper.js b/app/javascripts/helper.js index 82d36d8..f9f52ff 100644 --- a/app/javascripts/helper.js +++ b/app/javascripts/helper.js @@ -4,81 +4,83 @@ // 2. Increments ID vote tally for every vote // 3. Sorts -const rankVotes = exports.rankVotes = function (votes, candidates) { - var initial = candidates.reduce(function (acc, candidate) { - acc[candidate.id] = 0; - return acc; - }, {}); +const rankVotes = function (votes, candidates) { + var initial = candidates.reduce(function (acc, candidate) { + acc[candidate.id] = 0; + return acc; + }, {}); - var scores = votes.reduce(function (acc, id) { - if (acc[id] !== undefined) { - acc[id]++; - } - return acc; - }, initial); + var scores = votes.reduce(function (acc, id) { + if (acc[id] !== undefined) { + acc[id]++; + } + return acc; + }, initial); - var rank = []; + var rank = []; - for (var id in scores) { - if (scores.hasOwnProperty(id)) { - rank.push({ - id: parseInt(id, 10), - count: scores[id] - }); - } - } + for (var id in scores) { + if (scores.hasOwnProperty(id)) { + rank.push({ + id: parseInt(id, 10), + count: scores[id] + }); + } + } - return rank.sort(function (a, b) { - if (b.count === a.count) { - return b.id - a.id; - } else { - return b.count - a.count; - } - }).map(function (tally) { - return tally.id - }).map(function (id) { - return candidates.reduce(function (acc, candidate) { - if (candidate.id === id) return candidate; - return acc; - }); - }); + return rank.sort(function (a, b) { + if (b.count === a.count) { + return b.id - a.id; + } else { + return b.count - a.count; + } + }).map(function (tally) { + return tally.id + }).map(function (id) { + return candidates.reduce(function (acc, candidate) { + if (candidate.id === id) return candidate; + return acc; + }); + }); }; -const enslUrl = exports.enslUrl = (gatherer) => { - return `https://www.ensl.org/users/${gatherer.id}` +const enslUrl = (gatherer) => { + return `https://www.ensl.org/users/${gatherer.id}` }; -const hiveUrl = exports.hiveUrl = (gatherer) => { - const hiveId = gatherer.user.hive.id; - if (hiveId) { - return `http://hive.naturalselection2.com/profile/${hiveId}`; - } else { - return null; - } +const hiveUrl = (gatherer) => { + const hiveId = gatherer.user.hive.id; + if (hiveId) { + return `http://hive.naturalselection2.com/profile/${hiveId}`; + } else { + return null; + } }; -const modalId = exports.modalId = (user) => { - return `user-modal-${user.id}`; +const modalId = (user) => { + return `user-modal-${user.id}`; }; -const storageAvailable = exports.storageAvailable = (type) => { - try { - var storage = window[type], - x = '__storage_test__'; - storage.setItem(x, x); - storage.removeItem(x); - return true; - } - catch (e) { - return false; - } +const storageAvailable = (type) => { + try { + var storage = window[type], + x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } + catch (e) { + return false; + } }; -const observatoryUrl = exports.observatoryUrl = (gatherer) => { - const steamId = gatherer.user.steam.id; - if (steamId) { - return `https://observatory.morrolan.ch/player?steam_id=STEAM_${steamId}`; - } else { - return null; - } +const observatoryUrl = (gatherer) => { + const steamId = gatherer.user.steam.id; + if (steamId) { + return `https://observatory.morrolan.ch/player?steam_id=STEAM_${steamId}`; + } else { + return null; + } }; + +export { enslUrl, hiveUrl, modalId, observatoryUrl, rankVotes, storageAvailable } diff --git a/bin/entry.sh b/bin/entry.sh new file mode 100644 index 0000000..3cbee5a --- /dev/null +++ b/bin/entry.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +cd /app + +if [ -f "/home/web/tmp/.updatePublic" ]; then + cp -r /home/web/tmp/public /app/public + rm -rf /home/web/tmp/public + rm /home/web/tmp/.updatePublic +fi + +node index.js diff --git a/brunch-config.js b/brunch-config.js index 66d7475..2d52878 100644 --- a/brunch-config.js +++ b/brunch-config.js @@ -34,7 +34,12 @@ exports.config = { // Configure your plugins plugins: { babel: { - presets: ["es2015", "react"], + presets: [ + ["@babel/preset-env", { + "bugfixes": true, + "shippedProposals": true + }], + "@babel/preset-react"], // Do not use ES6 compiler in vendor code ignore: [/vendor/] } @@ -46,16 +51,16 @@ exports.config = { // 'app.js': ['app'] // } // }, - + npm: { enabled: true, styles: { "bootstrap-solarized": ["bootstrap-solarized-dark.css"], "toastr": ["build/toastr.min.css"] }, - whitelist: ["react", "react-dom", "jquery", "lodash", + whitelist: ["react", "react-dom", "jquery", "lodash", "react-autolink", "react-dom", "react-emoji", "howler", - "bootstrap", "perfect-scrollbar", "moment", "toastr", + "bootstrap", "perfect-scrollbar", "moment", "toastr", "socket.io-client"], globals: { "_": "lodash", @@ -63,7 +68,5 @@ exports.config = { "$": "jquery", "toastr": "toastr" } - }, - - notifications: true + } }; diff --git a/config/express.js b/config/express.js index 6052175..c0842ed 100644 --- a/config/express.js +++ b/config/express.js @@ -19,7 +19,7 @@ module.exports = app => { }); // Enforce HTTPS in production if (env === 'production') { - app.use((req,res,next) => { + app.use((req, res, next) => { res.setHeader('Strict-Transport-Security', 'max-age=2592000; includeSubdomains'); // Enforce usage of HTTPS; max-age = 30 days next(); }); @@ -28,27 +28,27 @@ module.exports = app => { app.use(cookieParser()); app.use(favicon(path.join(__dirname, '../public/favicon.ico'))); - // Use winston on production - var log; - if (env !== 'development') { - log = { - stream: { - write: (message, encoding) => { - winston.info(message); - } - } - }; - } else { - log = 'dev'; - } + // // Use winston on production + // var log; + // if (env !== 'development') { + // log = { + // stream: { + // write: (message, encoding) => { + // winston.info(message); + // } + // } + // }; + // } else { + // log = 'dev'; + // } + + // if (env !== 'test') app.use(morgan(log)); - if (env !== 'test') app.use(morgan(log)); - var hbs = exphbs({ - defaultLayout: 'main', + defaultLayout: 'main', extname: '.hbs' }); - app.engine('.hbs', hbs); - app.set('view engine', '.hbs'); + app.engine('.hbs', hbs); + app.set('view engine', '.hbs'); }; diff --git a/db/index.js b/db/index.js index 3b2a3d5..4d6ec8b 100644 --- a/db/index.js +++ b/db/index.js @@ -6,25 +6,22 @@ var mongoose = require("mongoose"); var config = require(path.join(__dirname, "../config/config.js")); var connect = function () { - mongoose.connect(config.mongo.uri, { - server: { - socketOptions: { - keepAlive: 1, - connectTimeoutMS: 30000 - } - } - }); + mongoose.connect(config.mongo.uri, { + useNewUrlParser: true, + useUnifiedTopology: true + }).then( + () => winston.info("MongoDB: Connection established"), + error => winston.error(error) + ); }; connect(); -mongoose.connection.on("error", function (error) { - winston.error(error); -}); +mongoose.connection.on("error", (error) => winston.error(error)); +mongoose.connection.on("disconnected", () => winston.error("MongoDB: Was disconnected.")); +mongoose.connection.on("reconnectFailed", () => winston.error("MongoDB: Reconnect Failed!")); -mongoose.connection.on("disconnected", function () { - winston.error("MongoDB: Was disconnected."); -}); +mongoose.connection.on("reconnected", () => winston.info("MongoDB: Connection established")); // Load models require(path.join(__dirname, "/models/event")); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f51485c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3.8" +services: + production: + container_name: ensl_gather_production + build: + context: ./ + target: production + dockerfile: Dockerfile + depends_on: + - mongodb + command: ["/app/bin/entry.sh"] + user: web:web + environment: + - NODE_ENV=production + - PORT=$NODE_PORT + - "MONGOLAB_URI=mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@mongodb/${MONGODB_DATABASE}" + - RAILS_SECRET + - NEW_RELIC_LICENSE_KEY + - GATHER_STEAM_ACCOUNT + - GATHER_STEAM_PASSWORD + - GATHER_DISCORD_HOOK_ID + - GATHER_DISCORD_HOOK_TOKEN + - RANDOM_USER + - FIXED_USER + ports: + - "${NODE_PORT}:${NODE_PORT}" + volumes: + - "./public:/app/public" + init: true + mongodb: + image: "bitnami/mongodb:latest" + container_name: ensl_gather_mongodb + volumes: + - "./db/data:/bitnami/mongodb" + environment: + - MONGODB_USERNAME + - MONGODB_PASSWORD + - MONGODB_DATABASE diff --git a/lib/ensl/client.js b/lib/ensl/client.js index ee800d0..7ade984 100644 --- a/lib/ensl/client.js +++ b/lib/ensl/client.js @@ -7,118 +7,117 @@ var logger = require("winston"); var querystring = require('querystring'); var config = require(path.join(__dirname, "../../config/config")); const SECRET_TOKEN = config.secret_token; -var childProcess = require("child_process").exec; +const Marshal = require('marshal'); + const MAP_CATEGORY = 45; const SERVER_CATEGORY = 45; -function EnslClient (options) { - if (!(this instanceof EnslClient)) { - return new EnslClient(options); - } +function EnslClient(options) { + if (!(this instanceof EnslClient)) { + return new EnslClient(options); + } - this.baseUrl = config.ensl_url; + this.baseUrl = config.ensl_url; } EnslClient.prototype.getUserById = function (options, callback) { - var id = options.id; - var url = this.baseUrl + "api/v1/users/" + id; - return request({ - url: url, - json: true - }, callback); + var id = options.id; + var url = this.baseUrl + "api/v1/users/" + id; + return request({ + url: url, + json: true + }, callback); }; EnslClient.prototype.getTeamById = function (options, callback) { - const id = options.id; - const url = `${this.baseUrl}api/v1/teams/${id}`; - return request({ - url: url, - json: true - }, callback); + const id = options.id; + const url = `${this.baseUrl}api/v1/teams/${id}`; + return request({ + url: url, + json: true + }, callback); }; EnslClient.prototype.getServers = function (callback) { - const url = this.baseUrl + "api/v1/servers"; - return request({ - url: url, - json: true - }, (error, response, data) => { - if (error) return callback(error); - if (response.statusCode !== 200) return callback(new Error("Non-200 status code received")); - return callback(null, { - servers: data.servers.filter(function (server) { - return server.category_id === SERVER_CATEGORY; - }) - }); - }); + const url = this.baseUrl + "api/v1/servers"; + return request({ + url: url, + json: true + }, (error, response, data) => { + if (error) return callback(error); + if (response.statusCode !== 200) return callback(new Error("Non-200 status code received")); + return callback(null, { + servers: data.servers.filter(function (server) { + return server.category_id === SERVER_CATEGORY; + }) + }); + }); }; EnslClient.prototype.getMaps = function (callback) { - const url = this.baseUrl + "api/v1/maps"; - return request({ - url: url, - json: true - }, (error, response, data) => { - if (error) return callback(error); - if (response.statusCode !== 200) return callback(new Error("Non-200 status code received")); - return callback(null, { - maps: data.maps.filter(map => { - return map.category_id === MAP_CATEGORY; - }) - }); - }); + const url = this.baseUrl + "api/v1/maps"; + return request({ + url: url, + json: true + }, (error, response, data) => { + if (error) return callback(error); + if (response.statusCode !== 200) return callback(new Error("Non-200 status code received")); + return callback(null, { + maps: data.maps.filter(map => { + return map.category_id === MAP_CATEGORY; + }) + }); + }); }; EnslClient.prototype.getFullAvatarUri = function (url) { - return this.baseUrl + url.replace(/^\//, ""); + return this.baseUrl + url.replace(/^\//, ""); }; EnslClient.parseCookies = function (socket) { - let cookieString = socket.request.headers.cookie; - if (typeof cookieString !== 'string') return null; - let cookies = socket.request.headers.cookie.split(";") - .map(cookie => cookie.trim()) - .reduce((acc, cookie) => { - let values = cookie.split("="); - let attr = values[0]; - let val = values[1]; - if (attr && val) acc[attr] = val; - return acc; - }, {}) - return cookies; + let cookieString = socket.request.headers.cookie; + if (typeof cookieString !== 'string') return null; + let cookies = socket.request.headers.cookie.split(";") + .map(cookie => cookie.trim()) + .reduce((acc, cookie) => { + let values = cookie.split("="); + let attr = values[0]; + let val = values[1]; + if (attr && val) acc[attr] = val; + return acc; + }, {}) + return cookies; }; EnslClient.decodeSession = function (sessionCookie, callback) { - if (typeof sessionCookie !== 'string') { - return callback(new Error("Invalid cookie"), null); - } + if (typeof sessionCookie !== 'string') { + return callback(new Error("Invalid cookie"), null); + } - var session = sessionCookie.split("--"); - if (session.length !== 2) { - return callback(new Error("Invalid cookie: No signature provided"), null); - } + var session = sessionCookie.split("--"); + if (session.length !== 2) { + return callback(new Error("Invalid cookie: No signature provided"), null); + } - // Separate text and signature - var text = querystring.unescape(session[0]); - var signature = session[1]; + // Separate text and signature + var text = querystring.unescape(session[0]); + var signature = session[1]; - // Verify signature - if (crypto.createHmac("sha1", SECRET_TOKEN).update(text).digest('hex') !== signature) { - return callback(new Error("Invalid cookie signature"), null); - } + // Verify signature + if (crypto.createHmac("sha1", SECRET_TOKEN).update(text).digest('hex') !== signature) { + return callback(new Error("Invalid cookie signature"), null); + } - var cb = callback; - childProcess("ruby unmarshal.rb " + text, { - cwd: path.join(__dirname, "../../scripts") - }, function (err, stdout, stderr) { - var userId = parseInt(stdout, 10); - if (isNaN(userId)) { - return callback(new Error("Invalid cookie: User ID not found"), null); - } else { - return callback(null, userId); - } - }); + let railsSession = new Marshal(text, 'base64').toJSON(); + + if (isNaN(railsSession.user)) { + return callback(new Error("Invalid cookie: User ID not found"), null); + } else { + return callback(null, railsSession.user); + } }; + + module.exports = EnslClient; diff --git a/package-lock.json b/package-lock.json index 404dcc2..6e4a3f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,10 +12,162 @@ "grapheme-splitter": "^1.0.4" } }, + "@babel/cli": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.11.6.tgz", + "integrity": "sha512-+w7BZCvkewSmaRM6H4L2QM3RL90teqEIHDIFXAmrW33+0jhlymnDAEdqVeCZATvxhQuio1ifoGVlJJbIiH9Ffg==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -24,6 +176,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, "requires": { "browserslist": "^4.12.0", "invariant": "^2.2.4", @@ -31,18 +184,19 @@ } }, "@babel/core": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", - "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.4", + "@babel/generator": "^7.11.6", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.4", + "@babel/parser": "^7.11.5", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -51,12 +205,60 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/generator": { "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "dev": true, "requires": { "@babel/types": "^7.11.0", "jsesc": "^2.5.1", @@ -67,6 +269,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -75,15 +278,51 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.10.4", "@babel/types": "^7.10.4" } }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", + "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.11.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-compilation-targets": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, "requires": { "@babel/compat-data": "^7.10.4", "browserslist": "^4.12.0", @@ -96,6 +335,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-member-expression-to-functions": "^7.10.5", @@ -109,6 +349,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", @@ -119,6 +360,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/types": "^7.10.5", @@ -129,6 +371,7 @@ "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -137,6 +380,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.10.4", "@babel/template": "^7.10.4", @@ -147,6 +391,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -155,6 +400,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -163,6 +409,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, "requires": { "@babel/types": "^7.11.0" } @@ -171,6 +418,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -179,6 +427,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@babel/helper-replace-supers": "^7.10.4", @@ -193,6 +442,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, "requires": { "@babel/types": "^7.10.4" } @@ -200,12 +450,14 @@ "@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true }, "@babel/helper-regex": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, "requires": { "lodash": "^4.17.19" } @@ -214,6 +466,7 @@ "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", @@ -225,6 +478,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", @@ -236,6 +490,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, "requires": { "@babel/template": "^7.10.4", "@babel/types": "^7.10.4" @@ -245,6 +500,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, "requires": { "@babel/types": "^7.11.0" } @@ -253,6 +509,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, "requires": { "@babel/types": "^7.11.0" } @@ -260,12 +517,14 @@ "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true }, "@babel/helper-wrap-function": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/template": "^7.10.4", @@ -277,6 +536,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, "requires": { "@babel/template": "^7.10.4", "@babel/traverse": "^7.10.4", @@ -287,6 +547,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", @@ -296,12 +557,14 @@ "@babel/parser": { "version": "7.11.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", - "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", + "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-remap-async-to-generator": "^7.10.4", @@ -312,6 +575,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -321,6 +585,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" @@ -330,6 +595,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -339,6 +605,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" @@ -348,6 +615,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -357,6 +625,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" @@ -366,6 +635,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -375,6 +645,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", @@ -385,6 +656,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" @@ -394,6 +666,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", @@ -404,6 +677,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -413,6 +687,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -422,6 +697,7 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -430,6 +706,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -438,6 +715,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -446,6 +724,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -454,14 +733,25 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -470,6 +760,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -478,6 +769,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -486,6 +778,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -494,6 +787,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -502,6 +796,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -510,6 +805,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -518,6 +814,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -526,6 +823,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", @@ -536,6 +834,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -544,6 +843,7 @@ "version": "7.11.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -552,6 +852,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-define-map": "^7.10.4", @@ -567,6 +868,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -575,6 +877,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -583,6 +886,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -592,6 +896,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -600,6 +905,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -609,6 +915,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -617,6 +924,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -626,6 +934,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -634,6 +943,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -642,6 +952,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.10.5", "@babel/helper-plugin-utils": "^7.10.4", @@ -652,6 +963,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", @@ -663,6 +975,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", "@babel/helper-module-transforms": "^7.10.5", @@ -674,6 +987,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, "requires": { "@babel/helper-module-transforms": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -683,6 +997,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.10.4" } @@ -691,6 +1006,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -699,6 +1015,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-replace-supers": "^7.10.4" @@ -708,6 +1025,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -717,14 +1035,78 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", + "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.11.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-transform-regenerator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, "requires": { "regenerator-transform": "^0.14.2" } @@ -733,6 +1115,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -741,6 +1124,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -749,6 +1133,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" @@ -758,6 +1143,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/helper-regex": "^7.10.4" @@ -767,6 +1153,7 @@ "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" @@ -776,6 +1163,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -784,6 +1172,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -792,15 +1181,17 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "dev": true, "requires": { "@babel/compat-data": "^7.11.0", "@babel/helper-compilation-targets": "^7.10.4", @@ -864,18 +1255,32 @@ "@babel/plugin-transform-unicode-escapes": "^7.10.4", "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -884,10 +1289,26 @@ "esutils": "^2.0.2" } }, + "@babel/preset-react": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + } + }, "@babel/runtime": { "version": "7.11.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -896,6 +1317,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/parser": "^7.10.4", @@ -906,6 +1328,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.11.0", @@ -922,6 +1345,7 @@ "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -1257,6 +1681,15 @@ "defer-to-connect": "^2.0.0" } }, + "@types/bson": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.2.tgz", + "integrity": "sha512-+uWmsejEHfmSjyyM/LkrP0orfE2m5Mx9Xel4tXNeqi1ldK5XMQcDsFkBmLDtuyKUbxj2jGDo0H240fbCRJZo7Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/cacheable-request": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", @@ -1268,6 +1701,12 @@ "@types/responselike": "*" } }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1302,6 +1741,15 @@ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" }, + "@types/jquery": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.2.tgz", + "integrity": "sha512-+MFOdKF5Zr41t3y2wfzJvK1PrUK0KtPLAFwYownp/0nCoMIANDDu5aFSpWfb8S0ZajCSNeaBnMrBGxksXK5yeg==", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, "@types/js-yaml": { "version": "3.12.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.5.tgz", @@ -1320,10 +1768,80 @@ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, + "@types/mongodb": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.27.tgz", + "integrity": "sha512-1jxKDgdfJEOO9zp+lv43p8jOqRs02xPrdUTzAZIVK9tVEySfCEmktL2jEu9A3wOBEOs18yKzpVIKUh8b8ALk3w==", + "dev": true, + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/mongoose": { + "version": "5.7.36", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.7.36.tgz", + "integrity": "sha512-ggFXgvkHgCNlT35B9d/heDYfSqOSwTmQjkRoR32sObGV5Xjd0N0WWuYlLzqeCg94j4hYN/OZxZ1VNNLltX/IVQ==", + "dev": true, + "requires": { + "@types/mongodb": "*", + "@types/node": "*" + } + }, "@types/node": { - "version": "13.13.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz", - "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==" + "version": "12.12.67", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.67.tgz", + "integrity": "sha512-R48tgL2izApf+9rYNH+3RBMbRpPeW3N8f0I9HMhggeq4UXwBDqumJ14SDs4ctTMhG11pIOduZ4z3QWGOiMc9Vg==" + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/react": { + "version": "16.9.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.51.tgz", + "integrity": "sha512-lQa12IyO+DMlnSZ3+AGHRUiUcpK47aakMMoBG8f7HGxJT8Yfe+WE128HIXaHOHVPReAW0oDS3KAI0JI2DDe1PQ==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "16.9.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.8.tgz", + "integrity": "sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "dev": true, + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } }, "@types/responselike": { "version": "1.0.0", @@ -1338,6 +1856,33 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true + }, + "@types/socket.io-client": { + "version": "1.4.34", + "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.34.tgz", + "integrity": "sha512-Lzia5OTQFJZJ5R4HsEEldywiiqT9+W2rDbyHJiiTGqOcju89sCsQ8aUXDljY6Ls33wKZZGC0bfMhr/VpOyjtXg==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", + "dev": true + }, + "@types/winston": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", + "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", + "dev": true, + "requires": { + "winston": "*" + } + }, "@types/xml2js": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.5.tgz", @@ -1564,6 +2109,13 @@ "@types/node": "^13.7.0", "@yarnpkg/fslib": "^2.1.0", "tslib": "^1.13.0" + }, + "dependencies": { + "@types/node": { + "version": "13.13.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", + "integrity": "sha512-6ZMK4xRcF2XrPdKmPYQxZkdHKV18xKgUFVvhIgw2iwaaO6weleLPHLBGPZmLhjo+m1N+MZXRAoBEBCCVqgO2zQ==" + } } }, "@yarnpkg/shell": { @@ -1696,31 +2248,6 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", @@ -1786,6 +2313,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -1831,17 +2359,20 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-filter": { "version": "1.0.0", @@ -1861,7 +2392,8 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arraybuffer.slice": { "version": "0.0.7", @@ -1873,15 +2405,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1933,7 +2456,8 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "ast-types": { "version": "0.9.6", @@ -1963,7 +2487,8 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "available-typed-arrays": { "version": "1.0.2", @@ -1983,15 +2508,11 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, - "babel": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/babel/-/babel-6.0.15.tgz", - "integrity": "sha1-U3BL8kZWxGg0A0TNyCG+APcW5cU=" - }, "babel-brunch": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/babel-brunch/-/babel-brunch-7.0.1.tgz", "integrity": "sha512-OVbEsiD4Y6eceuP8jrntCzVE647dGhSZq+bsXVB2uFYV5yI5BCY9jhAY4QR057we4NZgc98xna7Vv/JzRzwZuA==", + "dev": true, "requires": { "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", @@ -1999,568 +2520,15 @@ "loggy": "^1.0.3" } }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, "requires": { "object.assign": "^4.1.0" } }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - }, - "dependencies": { - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - } - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-es2015": { - "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz", - "integrity": "sha1-l9zn7ykuGMubK3VF2AxZPCjZUX8=", - "requires": { - "babel-plugin-check-es2015-constants": "^6.3.13", - "babel-plugin-transform-es2015-arrow-functions": "^6.3.13", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.3.13", - "babel-plugin-transform-es2015-block-scoping": "^6.3.13", - "babel-plugin-transform-es2015-classes": "^6.3.13", - "babel-plugin-transform-es2015-computed-properties": "^6.3.13", - "babel-plugin-transform-es2015-destructuring": "^6.3.13", - "babel-plugin-transform-es2015-for-of": "^6.3.13", - "babel-plugin-transform-es2015-function-name": "^6.3.13", - "babel-plugin-transform-es2015-literals": "^6.3.13", - "babel-plugin-transform-es2015-modules-commonjs": "^6.3.13", - "babel-plugin-transform-es2015-object-super": "^6.3.13", - "babel-plugin-transform-es2015-parameters": "^6.3.13", - "babel-plugin-transform-es2015-shorthand-properties": "^6.3.13", - "babel-plugin-transform-es2015-spread": "^6.3.13", - "babel-plugin-transform-es2015-sticky-regex": "^6.3.13", - "babel-plugin-transform-es2015-template-literals": "^6.3.13", - "babel-plugin-transform-es2015-typeof-symbol": "^6.3.13", - "babel-plugin-transform-es2015-unicode-regex": "^6.3.13", - "babel-plugin-transform-regenerator": "^6.3.13" - } - }, - "babel-preset-react": { - "version": "6.3.13", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.3.13.tgz", - "integrity": "sha1-E9VeBqZfqqoHw5v2Op2DbgMhFvo=", - "requires": { - "babel-plugin-syntax-flow": "^6.3.13", - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-flow-strip-types": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.3.13", - "babel-plugin-transform-react-jsx": "^6.3.13", - "babel-plugin-transform-react-jsx-source": "^6.3.13" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -2575,6 +2543,7 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -2589,6 +2558,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -2597,6 +2567,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2605,6 +2576,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2613,6 +2585,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2621,11 +2594,6 @@ } } }, - "base62": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz", - "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==" - }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -2864,6 +2832,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -2881,6 +2850,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2989,14 +2959,15 @@ } }, "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "dev": true, "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "brunch": { @@ -3075,29 +3046,23 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "bufferview": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bufferview/-/bufferview-1.0.1.tgz", - "integrity": "sha1-ev10pF+Tf6QiodM4wIu/3HbNcl0=" - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytebuffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-4.1.0.tgz", - "integrity": "sha1-TFgmngUqseSx9/82T9+zzogpBqo=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", "requires": { - "bufferview": "~1", - "long": "~2 >=2.3.0" + "long": "~3" }, "dependencies": { "long": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", - "integrity": "sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" } } }, @@ -3110,6 +3075,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -3162,24 +3128,16 @@ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "caniuse-lite": { - "version": "1.0.30001117", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", - "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==" + "version": "1.0.30001146", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001146.tgz", + "integrity": "sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chai": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/chai/-/chai-3.1.0.tgz", @@ -3294,6 +3252,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -3305,6 +3264,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -3423,6 +3383,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -3451,11 +3412,6 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3469,55 +3425,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==" }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "commonjs-require-definition": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/commonjs-require-definition/-/commonjs-require-definition-0.6.3.tgz", @@ -3531,7 +3438,8 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true }, "component-inherit": { "version": "0.0.3", @@ -3581,6 +3489,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -3613,17 +3522,14 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true }, "core-js-compat": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, "requires": { "browserslist": "^4.8.5", "semver": "7.0.0" @@ -3632,7 +3538,8 @@ "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true } } }, @@ -3730,6 +3637,12 @@ "resolved": "https://registry.npmjs.org/css-brunch/-/css-brunch-1.7.0.tgz", "integrity": "sha1-JYwbA4qXCECvDGqOVYL2FAUClNo=" }, + "csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", + "dev": true + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -3764,7 +3677,8 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress-response": { "version": "6.0.0", @@ -3833,6 +3747,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -3842,6 +3757,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3850,6 +3766,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3858,6 +3775,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -4118,9 +4036,10 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.544", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.544.tgz", - "integrity": "sha512-jx6H7M1db76Q/dI3MadZC4qwNTvpiq8tdYEJswxexrIm5bH+LKRdg+VAteMF1tJJbBLrcuogE9N3nxT3Dp1gag==" + "version": "1.3.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.578.tgz", + "integrity": "sha512-z4gU6dA1CbBJsAErW5swTGAaU2TBzc2mPAonJb00zqW1rOraDo2zfBMDRvaz9cVic+0JEZiYbHWPw/fTaZlG2Q==", + "dev": true }, "elliptic": { "version": "6.5.3", @@ -4297,15 +4216,6 @@ "has-binary2": "~1.0.2" } }, - "envify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", - "integrity": "sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=", - "requires": { - "jstransform": "^11.0.3", - "through": "~2.3.4" - } - }, "es-abstract": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", @@ -4353,9 +4263,10 @@ } }, "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "dev": true }, "escape-goat": { "version": "2.1.1", @@ -4466,6 +4377,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -4480,6 +4392,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -4488,6 +4401,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -4496,6 +4410,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -4503,7 +4418,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -4641,6 +4557,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -4650,6 +4567,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -4680,6 +4598,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -4695,6 +4614,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -4703,6 +4623,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -4711,6 +4632,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -4719,6 +4641,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -4727,6 +4650,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -4836,33 +4760,6 @@ "reusify": "^1.0.4" } }, - "fbjs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz", - "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=", - "requires": { - "core-js": "^1.0.0", - "loose-envify": "^1.0.0", - "promise": "^7.0.3", - "ua-parser-js": "^0.7.9", - "whatwg-fetch": "^0.9.0" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - } - } - }, "fcache": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/fcache/-/fcache-0.3.0.tgz", @@ -4891,6 +4788,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -4902,6 +4800,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -4940,7 +4839,8 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", @@ -4986,6 +4886,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -5008,6 +4909,12 @@ "minipass": "^2.6.0" } }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5059,7 +4966,8 @@ "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true }, "get-stream": { "version": "4.1.0", @@ -5122,7 +5030,8 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -5200,7 +5109,8 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "globby": { "version": "10.0.2", @@ -5309,6 +5219,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5347,6 +5258,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -5357,6 +5269,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -5366,6 +5279,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -5583,6 +5497,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -5611,6 +5526,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -5619,6 +5535,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -5641,7 +5558,8 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-callable": { "version": "1.2.0", @@ -5660,6 +5578,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -5668,6 +5587,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -5688,6 +5608,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -5697,7 +5618,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -5724,7 +5646,8 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "2.1.1", @@ -5786,6 +5709,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -5794,6 +5718,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -5814,6 +5739,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -5876,7 +5802,8 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "is-wsl": { "version": "2.2.0", @@ -5904,7 +5831,8 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isomorphic-fetch": { "version": "2.2.1", @@ -5998,7 +5926,8 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, "json-buffer": { "version": "3.0.1", @@ -6036,6 +5965,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, "requires": { "minimist": "^1.2.5" } @@ -6051,33 +5981,6 @@ "verror": "1.10.0" } }, - "jstransform": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", - "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", - "requires": { - "base62": "^1.1.0", - "commoner": "^0.10.1", - "esprima-fb": "^15001.1.0-dev-harmony-fb", - "object-assign": "^2.0.0", - "source-map": "^0.4.2" - }, - "dependencies": { - "esprima-fb": { - "version": "15001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", - "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=" - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "jszip": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", @@ -6134,7 +6037,8 @@ "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, "latest-version": { "version": "5.1.0", @@ -6144,11 +6048,6 @@ "package-json": "^6.3.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -6160,12 +6059,14 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true }, "levenary": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, "requires": { "leven": "^3.1.0" } @@ -6470,11 +6371,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6519,16 +6415,26 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, "requires": { "object-visit": "^1.0.0" } }, + "marshal": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marshal/-/marshal-0.5.2.tgz", + "integrity": "sha512-f6zOFkXq8k8AJbACRR06s4RFCP19ugCFLn9fX4v01yinL634v8gzSf8mVVHrXFhn6GpMKXR0n8LU2wIUL+c32Q==", + "requires": { + "debug": "4.1.1" + } + }, "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -6575,6 +6481,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -6686,6 +6593,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -6695,6 +6603,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -6933,6 +6842,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -7091,9 +7001,10 @@ } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "dev": true }, "node.extend": { "version": "2.0.2", @@ -7776,6 +7687,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -7817,6 +7729,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -7827,6 +7740,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -7835,6 +7749,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7869,6 +7784,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, "requires": { "isobject": "^3.0.0" } @@ -7898,6 +7814,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -7977,11 +7894,6 @@ } } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -8280,13 +8192,21 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true, + "optional": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -8305,7 +8225,8 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-to-regexp": { "version": "2.2.1", @@ -8354,6 +8275,12 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -8382,7 +8309,8 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, "prelude-ls": { "version": "1.1.2", @@ -8410,11 +8338,6 @@ "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.4.tgz", "integrity": "sha512-dG2w7WtovUa4SiYTdWn9H8Bd4JNdei2djtkP/Bk9fXq81j5Q15ZPHYSwhUVvBRbp5zMkGtu0Yk62HuMcly0pRw==" }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -8482,31 +8405,6 @@ } } }, - "protobufjs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-4.1.3.tgz", - "integrity": "sha1-jjbRsCJsu2jWR+S0TCoUTzfyd54=", - "requires": { - "ascli": "~1", - "bytebuffer": "~4 >=4.1", - "glob": "^5.0.10", - "yargs": "^3.10.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -8633,11 +8531,6 @@ "escape-goat": "^2.0.0" } }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -8722,12 +8615,20 @@ } }, "react": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react/-/react-0.14.9.tgz", - "integrity": "sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE=", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { - "envify": "^3.0.0", - "fbjs": "^0.6.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } } }, "react-autolink": { @@ -8854,24 +8755,6 @@ "picomatch": "^2.2.1" } }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, "reduce-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", @@ -8881,12 +8764,14 @@ "regenerate": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, "requires": { "regenerate": "^1.4.0" } @@ -8894,12 +8779,14 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, "requires": { "@babel/runtime": "^7.8.4" } @@ -8917,6 +8804,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -8931,6 +8819,7 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -8959,12 +8848,14 @@ "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true }, "regjsparser": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -8972,24 +8863,28 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true } } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "1.1.3", @@ -9055,6 +8950,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -9072,7 +8968,8 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, "responselike": { "version": "2.0.0", @@ -9094,21 +8991,14 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -9153,6 +9043,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, "requires": { "ret": "~0.1.10" } @@ -9295,6 +9186,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -9306,6 +9198,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -9416,6 +9309,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -9431,6 +9325,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -9439,6 +9334,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -9447,6 +9343,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -9454,7 +9351,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -9462,6 +9360,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -9472,6 +9371,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -9480,6 +9380,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -9488,6 +9389,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -9496,6 +9398,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -9508,6 +9411,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -9516,6 +9420,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -10384,6 +10289,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -10411,7 +10317,8 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true }, "sparse-bitfield": { "version": "3.0.3", @@ -10431,6 +10338,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -10490,6 +10398,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -10499,6 +10408,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -10511,40 +10421,282 @@ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "steam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/steam/-/steam-1.4.1.tgz", - "integrity": "sha512-JBJaDNd2lz5a4q/VCBhf3n0L8WWB+A+VCLqWbNycRhembfJ759lBHueXLvibZBvii00rS1pQPPJ0hiea9B5oQg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/steam/-/steam-1.4.0.tgz", + "integrity": "sha1-vAPCvzZd298E2yd1NBPS3bg1sbE=", "requires": { "adm-zip": "^0.4", "buffer-crc32": "^0.2", "bytebuffer": "^5.0", "steam-crypto": "^0.0", - "steam-resources": "steam-resources@github:seishun/node-steam-resources#v1.2.0" + "steam-resources": "git+https://github.com/seishun/node-steam-resources.git#v1.0.0" }, "dependencies": { - "bytebuffer": { - "version": "5.0.1", - "bundled": true, - "requires": { - "long": "~3" - } - }, - "csv-parse": { - "version": "4.0.1", - "bundled": true - }, - "long": { - "version": "3.2.0", - "bundled": true - }, "steam-resources": { - "version": "1.2.0", - "from": "steam-resources@github:seishun/node-steam-resources#v1.2.0", + "version": "1.0.0", + "from": "git+https://github.com/seishun/node-steam-resources.git#v1.0.0", "bundled": true, "requires": { "bytebuffer": "^5.0", - "csv-parse": "^4.0.1", "protobufjs": "^4.1" + }, + "dependencies": { + "bytebuffer": { + "version": "5.0.0", + "bundled": true, + "requires": { + "long": "~3" + }, + "dependencies": { + "long": { + "version": "3.0.1", + "bundled": true + } + } + }, + "protobufjs": { + "version": "4.1.2", + "bundled": true, + "requires": { + "ascli": "~1", + "bytebuffer": "~4 >=4.1", + "glob": "^5.0.10", + "yargs": "^3.10.0" + }, + "dependencies": { + "ascli": { + "version": "1.0.0", + "bundled": true, + "requires": { + "colour": "^0.7.1", + "optjs": "^3.2.1-boom" + }, + "dependencies": { + "colour": { + "version": "0.7.1", + "bundled": true + }, + "optjs": { + "version": "3.2.1-boom", + "bundled": true + } + } + }, + "bytebuffer": { + "version": "4.1.0", + "bundled": true, + "requires": { + "bufferview": "~1", + "long": "~2 >=2.3.0" + }, + "dependencies": { + "bufferview": { + "version": "1.0.1", + "bundled": true + }, + "long": { + "version": "2.4.0", + "bundled": true + } + } + }, + "glob": { + "version": "5.0.15", + "bundled": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "bundled": true + } + } + }, + "inherits": { + "version": "2.0.1", + "bundled": true + }, + "minimatch": { + "version": "3.0.0", + "bundled": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "bundled": true, + "requires": { + "balanced-match": "^0.2.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "once": { + "version": "1.3.2", + "bundled": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "bundled": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "bundled": true + } + } + }, + "yargs": { + "version": "3.29.0", + "bundled": true, + "requires": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "bundled": true + }, + "cliui": { + "version": "3.0.3", + "bundled": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "wrap-ansi": "^1.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.1", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "bundled": true + } + } + }, + "wrap-ansi": { + "version": "1.0.0", + "bundled": true, + "requires": { + "string-width": "^1.0.1" + } + } + } + }, + "decamelize": { + "version": "1.1.1", + "bundled": true + }, + "os-locale": { + "version": "1.4.0", + "bundled": true, + "requires": { + "lcid": "^1.0.0" + }, + "dependencies": { + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "^1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "window-size": { + "version": "0.1.2", + "bundled": true + }, + "y18n": { + "version": "3.2.0", + "bundled": true + } + } + } + } + } } } } @@ -10960,6 +11112,59 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-brunch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser-brunch/-/terser-brunch-4.0.0.tgz", + "integrity": "sha512-bmT9+/7HHwmgCbfZ0IaX26em9d2SpyoxSiiO+xSHJU4EG0FLsk52M7bRcTF/xMaSPl9LXTVkqjgSEllFmcoUFg==", + "dev": true, + "requires": { + "anymatch": "^3", + "terser": "^4.4" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, "then-fs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", @@ -11051,12 +11256,14 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -11065,6 +11272,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -11080,6 +11288,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -11091,6 +11300,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -11235,73 +11445,6 @@ "integrity": "sha512-GXCYNwqoo0MbLARghYjxVBxDCnU0tLqN7IPLdHHbibCb1NI5zBkU2EPcy/GaVxc0BtTjqyGXJCINe6JMR2Dpow==", "optional": true }, - "uglify-js-brunch": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/uglify-js-brunch/-/uglify-js-brunch-2.10.0.tgz", - "integrity": "sha1-YM0PtlKIegLOarzRWI3lXcw0bwU=", - "requires": { - "uglify-js": "~2.6.1" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" - }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -11321,12 +11464,14 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" @@ -11335,17 +11480,20 @@ "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -11375,6 +11523,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -11384,6 +11533,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -11394,6 +11544,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -11403,10 +11554,18 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, "update-notifier": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", @@ -11484,7 +11643,8 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url": { "version": "0.11.0", @@ -11513,7 +11673,8 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "util": { "version": "0.12.3", @@ -11568,11 +11729,6 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" }, - "whatwg-fetch": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz", - "integrity": "sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA=" - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 9f6d8a5..a97585a 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,6 @@ "homepage": "https://github.com/cblanc/sws_gathers", "dependencies": { "async": "~1.4.0", - "babel": "~6.0.0", - "babel-brunch": "~7.0.0", - "babel-preset-es2015": "~6.3.13", - "babel-preset-react": "~6.3.13", "bootstrap": "~4.0.0", "bootstrap-solarized": "~1.0.2", "brunch": "~3.0.0", @@ -51,31 +47,45 @@ "javascript-state-machine": "~2.3.5", "jquery": "~3.5.0", "lodash": "~4.17.20", + "marshal": "^0.5.2", "moment": "~2.11.2", "mongoose": "~5.7.5", "morgan": "~1.9.1", "newrelic": "~5.13.1", "perfect-scrollbar": "~0.6.10", - "react": "~0.14.6", + "react": "^16.13.1", "react-autolink": "~0.2.1", "react-dom": "~16.0.1", "react-emoji": "~0.4.1", "request": "~2.88.0", "serve-favicon": "~2.4.5", + "snyk": "^1.316.1", "socket.io": "~2.1.1", "socket.io-client": "~2.1.1", - "steam": "~1.4.0", + "steam": "1.4.0", "steamidconvert": "~0.2.4", "toastr": "~2.1.4", - "uglify-js-brunch": ">= 2.0.1", - "winston": "~1.0.1", - "snyk": "^1.316.1" + "winston": "~1.0.1" }, "devDependencies": { + "@babel/cli": "^7.11.6", + "@babel/core": "^7.11.6", + "@babel/preset-env": "^7.11.5", + "@babel/preset-react": "^7.10.4", + "@types/jquery": "^3.5.2", + "@types/mongoose": "^5.7.36", + "@types/node": "^12.12.67", + "@types/react": "^16.9.51", + "@types/react-dom": "^16.9.8", + "@types/request": "^2.48.5", + "@types/socket.io-client": "^1.4.34", + "@types/winston": "^2.4.4", + "babel-brunch": "^7.0.1", "chai": "~3.1.0", "mocha": "~2.2.5", "nodemon": "~1.4.0", - "supertest": "~1.0.1" + "supertest": "~1.0.1", + "terser-brunch": "^4.0.0" }, "engines": { "node": "^10.13.0" diff --git a/scripts/unmarshal.rb b/scripts/unmarshal.rb deleted file mode 100644 index da20f4f..0000000 --- a/scripts/unmarshal.rb +++ /dev/null @@ -1,13 +0,0 @@ -# Reads in raw Rails 3 session store, returns user id - -require 'base64' - -session_store = ARGV[0] - -deserialised_store = Marshal.load(Base64.decode64(session_store)) - -user_id = deserialised_store['user'] - -STDOUT.write user_id - -exit 0 \ No newline at end of file