From 749485b16a477c05d9b2113e91c4f432012f6b83 Mon Sep 17 00:00:00 2001 From: Gareth Latty Date: Sat, 16 May 2020 15:53:43 +0100 Subject: [PATCH] Resolve #117: Move from Weightless to MWC. Resolve #132: Fix some issues with the Postgres backend. --- client/elm.json | 2 +- client/package-lock.json | 4631 +++++++++++------ client/package.json | 33 +- client/postcss.config.js | 7 + client/src/elm/MassiveDecks.elm | 5 +- client/src/elm/MassiveDecks/Card/Source.elm | 129 +- .../elm/MassiveDecks/Card/Source/BuiltIn.elm | 135 +- .../Card/Source/BuiltIn/Model.elm | 71 +- .../elm/MassiveDecks/Card/Source/Cardcast.elm | 54 +- .../elm/MassiveDecks/Card/Source/Custom.elm | 3 + .../src/elm/MassiveDecks/Card/Source/Fake.elm | 3 + .../elm/MassiveDecks/Card/Source/Methods.elm | 6 +- .../elm/MassiveDecks/Card/Source/Model.elm | 65 +- client/src/elm/MassiveDecks/Components.elm | 32 +- .../MassiveDecks/Components/Form/Message.elm | 22 +- .../src/elm/MassiveDecks/Components/Menu.elm | 117 +- .../MassiveDecks/Components/Menu/Model.elm | 54 + client/src/elm/MassiveDecks/Error.elm | 47 +- client/src/elm/MassiveDecks/Error/Overlay.elm | 29 +- client/src/elm/MassiveDecks/Game.elm | 232 +- client/src/elm/MassiveDecks/Game/Action.elm | 27 +- client/src/elm/MassiveDecks/Game/History.elm | 16 +- client/src/elm/MassiveDecks/Game/Messages.elm | 2 + client/src/elm/MassiveDecks/Game/Model.elm | 4 + .../elm/MassiveDecks/Game/Round/Playing.elm | 6 +- .../src/elm/MassiveDecks/Models/Decoders.elm | 59 +- .../src/elm/MassiveDecks/Models/Encoders.elm | 16 +- client/src/elm/MassiveDecks/Pages/Lobby.elm | 264 +- .../MassiveDecks/Pages/Lobby/Configure.elm | 179 +- .../Pages/Lobby/Configure/ConfigOption.elm | 141 +- .../Pages/Lobby/Configure/Decks.elm | 101 +- .../Pages/Lobby/Configure/Decks/Model.elm | 22 +- .../Pages/Lobby/Configure/Privacy.elm | 45 +- .../Pages/Lobby/Configure/Rules.elm | 19 +- .../Rules/HouseRules/ComedyWriter.elm | 16 +- .../Configure/Rules/HouseRules/Rando.elm | 16 +- .../Configure/Rules/HouseRules/Reboot.elm | 16 +- .../Pages/Lobby/Configure/TimeLimits.elm | 10 +- .../elm/MassiveDecks/Pages/Lobby/Invite.elm | 38 +- .../elm/MassiveDecks/Pages/Lobby/Messages.elm | 3 + .../elm/MassiveDecks/Pages/Lobby/Model.elm | 7 +- .../elm/MassiveDecks/Pages/Lobby/Spectate.elm | 31 +- client/src/elm/MassiveDecks/Pages/Start.elm | 168 +- .../MassiveDecks/Pages/Start/LobbyBrowser.elm | 24 +- client/src/elm/MassiveDecks/Pages/Unknown.elm | 4 +- client/src/elm/MassiveDecks/Ports.elm | 4 + client/src/elm/MassiveDecks/Requests/Api.elm | 2 +- .../elm/MassiveDecks/Requests/HttpData.elm | 40 +- client/src/elm/MassiveDecks/Settings.elm | 219 +- .../elm/MassiveDecks/Settings/Messages.elm | 5 +- client/src/elm/MassiveDecks/Strings.elm | 11 + .../elm/MassiveDecks/Strings/Languages.elm | 25 +- .../elm/MassiveDecks/Strings/Languages/En.elm | 41 +- .../elm/MassiveDecks/Strings/Languages/It.elm | 49 +- .../MassiveDecks/Strings/Languages/PtBR.elm | 51 +- .../elm/MassiveDecks/Util/Html/Attributes.elm | 20 +- .../src/elm/MassiveDecks/Util/Html/Events.elm | 12 + client/src/elm/MassiveDecks/Util/List.elm | 25 +- client/src/elm/MassiveDecks/Util/NeList.elm | 68 + client/src/elm/MassiveDecks/Util/Order.elm | 48 + client/src/elm/MassiveDecks/Version.elm | 2 +- client/src/elm/MassiveDecks/index.d.ts | 5 +- client/src/elm/Material/Attributes.elm | 24 + client/src/elm/Material/Button.elm | 47 + client/src/elm/Material/Card.elm | 9 + client/src/elm/Material/Fab.elm | 51 + client/src/elm/Material/IconButton.elm | 67 + client/src/elm/Material/LinearProgress.elm | 44 + client/src/elm/Material/ListView.elm | 89 + client/src/elm/Material/Menu.elm | 60 + client/src/elm/Material/Ripple.elm | 8 + client/src/elm/Material/Select.elm | 87 + client/src/elm/Material/Slider.elm | 56 + client/src/elm/Material/Switch.elm | 8 + client/src/elm/Material/Tabs.elm | 88 + client/src/elm/Material/TextArea.elm | 8 + client/src/elm/Material/TextField.elm | 96 + client/src/elm/Paper/Tooltip.elm | 43 + client/src/elm/Weightless.elm | 95 - client/src/elm/Weightless/Attributes.elm | 432 -- client/src/elm/Weightless/Internal.elm | 54 - client/src/elm/Weightless/ProgressBar.elm | 51 - client/src/elm/Weightless/Slider.elm | 54 - .../scss/{animation.scss => _animation.scss} | 0 client/src/scss/{cards.scss => _cards.scss} | 26 +- client/src/scss/{cast.scss => _cast.scss} | 0 client/src/scss/{colors.scss => _colors.scss} | 4 + client/src/scss/_error.scss | 76 + client/src/scss/{fonts.scss => _fonts.scss} | 8 +- client/src/scss/{game.scss => _game.scss} | 93 +- client/src/scss/_material.scss | 93 + .../scss/{settings.scss => _settings.scss} | 15 +- client/src/scss/card/variables.scss | 37 - .../scss/{card/size.scss => cards/_size.scss} | 34 +- .../sources.scss => cards/_sources.scss} | 2 +- client/src/scss/error.scss | 60 - .../scss/game/{history.scss => _history.scss} | 12 +- .../scss/game/{judging.scss => _judging.scss} | 13 +- .../scss/game/{playing.scss => _playing.scss} | 16 +- .../src/scss/game/{plays.scss => _plays.scss} | 0 client/src/scss/massive-decks.scss | 83 +- .../scss/pages/{lobby.scss => _lobby.scss} | 90 +- .../pages/{spectate.scss => _spectate.scss} | 11 +- .../scss/pages/{start.scss => _start.scss} | 52 +- .../{unknown-page.scss => _unknown-page.scss} | 0 .../lobby/{configure.scss => _configure.scss} | 68 +- .../pages/lobby/{invite.scss => _invite.scss} | 8 +- client/src/scss/pages/lobby/variables.scss | 2 - ...lobby-browser.scss => _lobby-browser.scss} | 0 client/src/scss/variables.scss | 1 - client/src/scss/weightless.scss | 80 - client/src/ts/confetti.ts | 23 + client/src/ts/massive-decks.ts | 13 +- client/src/ts/material.ts | 17 + client/src/ts/notification-manager.ts | 11 +- client/src/ts/paper.ts | 1 + client/src/ts/server-connection.ts | 18 +- client/src/ts/weightless.ts | 17 - client/webpack.config.js | 80 +- deployment/postgres/config.json5 | 20 +- package-lock.json | 4506 +++++++++++----- server/config.json5 | 21 +- server/decks/cah-base-en.deck.json5 | 694 +-- server/decks/cah-base-ptbr.deck.json5 | 795 +-- server/package-lock.json | 616 +-- server/package.json | 14 +- server/src/ts/action/actions.ts | 2 +- server/src/ts/action/authenticate.ts | 4 +- .../src/ts/action/game-action/czar/judge.ts | 6 +- .../src/ts/action/game-action/czar/reveal.ts | 4 +- .../src/ts/action/game-action/player/like.ts | 6 +- .../ts/action/game-action/player/take-back.ts | 2 +- server/src/ts/action/game-action/redraw.ts | 4 +- .../src/ts/action/game-action/set-presence.ts | 10 +- server/src/ts/action/privileged/configure.ts | 1 - server/src/ts/action/privileged/end-game.ts | 2 +- server/src/ts/action/privileged/kick.ts | 7 +- .../src/ts/action/privileged/set-privilege.ts | 2 +- server/src/ts/action/privileged/start-game.ts | 6 +- server/src/ts/action/set-user-role.ts | 4 +- server/src/ts/action/validation.validator.ts | 12 + server/src/ts/caches/postgres.ts | 40 +- server/src/ts/errors/authentication.ts | 2 +- server/src/ts/errors/game-state-error.ts | 2 +- server/src/ts/errors/lobby.ts | 2 +- server/src/ts/errors/registration.ts | 4 +- server/src/ts/errors/validation.ts | 2 +- server/src/ts/event.ts | 2 +- server/src/ts/events/game-event/game-ended.ts | 2 +- .../events/game-event/pause-state-changed.ts | 4 +- .../src/ts/events/game-event/play-revealed.ts | 2 +- .../ts/events/game-event/play-submitted.ts | 2 +- .../ts/events/game-event/play-taken-back.ts | 2 +- .../game-event/player-presence-changed.ts | 4 +- .../ts/events/game-event/round-finished.ts | 2 +- .../ts/events/game-event/stage-timer-done.ts | 2 +- .../src/ts/events/lobby-event/configured.ts | 2 +- .../events/lobby-event/connection-changed.ts | 4 +- .../events/lobby-event/error-encountered.ts | 2 +- .../ts/events/lobby-event/presence-changed.ts | 4 +- .../events/lobby-event/privilege-changed.ts | 2 +- server/src/ts/events/user-event/sync.ts | 2 +- server/src/ts/games/cards/source.ts | 16 + server/src/ts/games/cards/sources.ts | 9 +- server/src/ts/games/cards/sources/builtIn.ts | 65 +- server/src/ts/games/cards/sources/cardcast.ts | 2 + server/src/ts/games/game.ts | 8 +- server/src/ts/games/game/round.ts | 42 +- server/src/ts/games/player.ts | 4 +- server/src/ts/games/rules/rando.ts | 12 +- server/src/ts/index.ts | 8 +- server/src/ts/lobby/change.ts | 16 +- server/src/ts/logging.ts | 6 +- server/src/ts/socket-manager.ts | 103 +- server/src/ts/store.ts | 2 +- server/src/ts/store/in-memory.ts | 22 +- server/src/ts/store/postgres.ts | 26 +- server/src/ts/task.ts | 4 +- server/src/ts/task/start-game.ts | 1 - server/src/ts/task/tasks.ts | 4 +- server/src/ts/timeout.ts | 2 +- .../src/ts/timeout/round-stage-timer-done.ts | 8 +- server/src/ts/timeout/round-start.ts | 6 +- server/src/ts/timeout/user-disconnect.ts | 9 +- server/src/ts/user.ts | 10 +- server/src/ts/user/token.ts | 4 +- server/src/ts/util/postgres.ts | 15 +- server/tsconfig.json | 4 +- 188 files changed, 10533 insertions(+), 6776 deletions(-) create mode 100644 client/postcss.config.js create mode 100644 client/src/elm/MassiveDecks/Components/Menu/Model.elm create mode 100644 client/src/elm/MassiveDecks/Util/Html/Events.elm create mode 100644 client/src/elm/MassiveDecks/Util/NeList.elm create mode 100644 client/src/elm/MassiveDecks/Util/Order.elm create mode 100644 client/src/elm/Material/Attributes.elm create mode 100644 client/src/elm/Material/Button.elm create mode 100644 client/src/elm/Material/Card.elm create mode 100644 client/src/elm/Material/Fab.elm create mode 100644 client/src/elm/Material/IconButton.elm create mode 100644 client/src/elm/Material/LinearProgress.elm create mode 100644 client/src/elm/Material/ListView.elm create mode 100644 client/src/elm/Material/Menu.elm create mode 100644 client/src/elm/Material/Ripple.elm create mode 100644 client/src/elm/Material/Select.elm create mode 100644 client/src/elm/Material/Slider.elm create mode 100644 client/src/elm/Material/Switch.elm create mode 100644 client/src/elm/Material/Tabs.elm create mode 100644 client/src/elm/Material/TextArea.elm create mode 100644 client/src/elm/Material/TextField.elm create mode 100644 client/src/elm/Paper/Tooltip.elm delete mode 100644 client/src/elm/Weightless.elm delete mode 100644 client/src/elm/Weightless/Attributes.elm delete mode 100644 client/src/elm/Weightless/Internal.elm delete mode 100644 client/src/elm/Weightless/ProgressBar.elm delete mode 100644 client/src/elm/Weightless/Slider.elm rename client/src/scss/{animation.scss => _animation.scss} (100%) rename client/src/scss/{cards.scss => _cards.scss} (89%) rename client/src/scss/{cast.scss => _cast.scss} (100%) rename client/src/scss/{colors.scss => _colors.scss} (85%) create mode 100644 client/src/scss/_error.scss rename client/src/scss/{fonts.scss => _fonts.scss} (90%) rename client/src/scss/{game.scss => _game.scss} (71%) create mode 100644 client/src/scss/_material.scss rename client/src/scss/{settings.scss => _settings.scss} (83%) delete mode 100644 client/src/scss/card/variables.scss rename client/src/scss/{card/size.scss => cards/_size.scss} (67%) rename client/src/scss/{card/sources.scss => cards/_sources.scss} (73%) delete mode 100644 client/src/scss/error.scss rename client/src/scss/game/{history.scss => _history.scss} (77%) rename client/src/scss/game/{judging.scss => _judging.scss} (50%) rename client/src/scss/game/{playing.scss => _playing.scss} (78%) rename client/src/scss/game/{plays.scss => _plays.scss} (100%) rename client/src/scss/pages/{lobby.scss => _lobby.scss} (64%) rename client/src/scss/pages/{spectate.scss => _spectate.scss} (92%) rename client/src/scss/pages/{start.scss => _start.scss} (76%) rename client/src/scss/pages/{unknown-page.scss => _unknown-page.scss} (100%) rename client/src/scss/pages/lobby/{configure.scss => _configure.scss} (75%) rename client/src/scss/pages/lobby/{invite.scss => _invite.scss} (79%) delete mode 100644 client/src/scss/pages/lobby/variables.scss rename client/src/scss/pages/start/{lobby-browser.scss => _lobby-browser.scss} (100%) delete mode 100644 client/src/scss/variables.scss delete mode 100644 client/src/scss/weightless.scss create mode 100644 client/src/ts/confetti.ts create mode 100644 client/src/ts/material.ts create mode 100644 client/src/ts/paper.ts delete mode 100644 client/src/ts/weightless.ts diff --git a/client/elm.json b/client/elm.json index 8773667..c01e436 100644 --- a/client/elm.json +++ b/client/elm.json @@ -18,6 +18,7 @@ "elm/time": "1.0.0", "elm/url": "1.0.0", "elm-community/dict-extra": "2.4.0", + "elm-community/list-extra": "8.2.3", "elm-community/random-extra": "3.1.0", "fapian/elm-html-aria": "1.4.0", "lattyware/elm-fontawesome": "4.0.0", @@ -31,7 +32,6 @@ "elm/bytes": "1.0.8", "elm/file": "1.0.5", "elm/virtual-dom": "1.0.2", - "elm-community/list-extra": "8.2.3", "owanturist/elm-union-find": "1.0.0" } }, diff --git a/client/package-lock.json b/client/package-lock.json index be1785d..a57e967 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -4,11 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@a11y/focus-trap": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@a11y/focus-trap/-/focus-trap-1.0.5.tgz", - "integrity": "sha512-3JOd6g+BALysWS8LNf0qdB8ltR651H/RCLAvUmfS0LIHwHO579XfjZUIZbURYiAZrcbp1CBAq4QZ2YwKNQZ1hw==" - }, "@babel/runtime": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", @@ -29,16 +24,2145 @@ "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-free/-/5.13.0/fontawesome-free-5.13.0.tgz", "integrity": "sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg==" }, + "@material/animation": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-6.0.0.tgz", + "integrity": "sha512-BxlzXzQ5W2WtaEVV4/PqkTpKB5PfOUvPmr1EK8+xQ0ouMV4qiWuwBfnu7DgXF+cglpFP3T71uHVYmh6lMdi4vg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-6.0.0.tgz", + "integrity": "sha512-S3rT7B9xa9IfHXIvYXYqbo6YVu9FWbFqTt1tMUCniizTRlpmHu9b5pmQ20f6mm3K3wAFD+crqsrtie2Y8h8r5g==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/button": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-YJqwOB6Xr619nSuWGUmkJN/+bj5sV/AsDfaE28Mv3xjoFqPK19I5RsDI62uZCmODGQfgxkY768JziT49zY9LXg==", + "requires": { + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/card": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-6.0.0.tgz", + "integrity": "sha512-pqqy087rw9VgP180WxGgC/UmiIW4QTom8VWihSwo8dXmTKQgpY4KP4TvV9sBN/xVTCiW5RQ++j7oZKDQDlyobA==", + "requires": { + "@material/elevation": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/ripple": "^6.0.0", + "@material/rtl": "^6.0.0", + "@material/shape": "^6.0.0", + "@material/theme": "^6.0.0" + } + }, + "@material/checkbox": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-yI0C0ua5JJn6qezG71cNWJC6uBxIlyqCDv/3s+aE8j/pHYel2IAJw9wWXA33Xi1QzFpjY8+gAmvN6Go3jS8JDg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/density": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-yUZw5NSTp7Aj/6Qu5bqLmX23X1QWBfShAoKIwFFZMpLkgWQPy2+p+o9JqaPXN9U824/sDFDP9nofR5VosaNyVg==" + }, + "@material/dom": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-6.0.0.tgz", + "integrity": "sha512-9hvoi3MxR25dmyv15xJGRS+Ezlr0oD+Y6k4UyAbLpExFP2OakTZc8Xj0Fd7Nwav3I5aIXyC5jJ2gvhZcy1cI9A==", + "requires": { + "@material/feature-targeting": "^6.0.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-6.0.0.tgz", + "integrity": "sha512-9WNBu/MKTQX40Ev3ayq5V8Pf/E/DqUPRQO8F0YA99jRWuYScpX2zeJlpRe+wLI6zIxtfFcVvRW9D4O1s1Bmbdg==", + "requires": { + "@material/animation": "^6.0.0", + "@material/base": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/theme": "^6.0.0" + } + }, + "@material/fab": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MMunuvYq7CnVKpV4nIdevFo02Cbypx9QtyTUYQ/RncRRXSlt5myZBk90dBvInp2B5Tq9XcbkbyIK2WCvS8d1FQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/feature-targeting": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-6.0.0.tgz", + "integrity": "sha512-REj9VJnqkGwpngffc/iHGPt8WTF27QFPWDD8VBNXaP+MmnpIu7V5q5JMoozKzG5uk+hVryzam1i2PJHztizDXg==" + }, + "@material/floating-label": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-vQyePCoY+jNvXxCMcetl8lObJ9zZKzQv3TzQzKRQfrN0H8TKl9iw+VRhHc59YWQQXMpszXC52ju0NshKOsOR8w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/icon-button": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-7LWQ4rStg7xiLSQ1DUSOXmuS5oyLFWt4kuDiMeqraapluMFHwFZ9RwmmliE+KhhZGHpe/4VT+M+mR9ZlG507oQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/line-ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-E6UIHRy28LfNT71atMKTj9uXAR9l9HhMoWdtGIT0PtsTnm2deJfIqGefI+T7kA0UQm2vYhk2ICE3keN28C9GRw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/linear-progress": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-K/fBvBOECG/Adkuudj9juma5pJ/cRubtxF0c3rS7EQHo06rebNunbbHeqmXbRB1daWAA23avaxLO5NKjsvhNOQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/progress-indicator": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/list": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-7hdSglQRGOg4y8tGx6dega12VQp1B8/SbjIsJ5fLH9gvnvusJCNVexvBO4bAa6D4ul4eWv8buJgu517plbnthA==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/menu": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-//ZbJmt4qepOu+i8VmgLevYAm4TtGTs4Q6k7NsZTbcaLKPM61upszM5oZ/YnlNELWZ3CUFweY2tdQIn6AnFkjw==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/list": "7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/menu-surface": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-TGxf+gMy1JjBxJhVFydWYt9ikE4mrMwA1Ki0Ts3n/Og6GizYUk1nsV6QTPUVlzOgX4vHkKHIfSCh+3tf9VokHA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-base": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.15.0.tgz", + "integrity": "sha512-TlZQtwKMhU5e4GMQ3ZFwhJ2ANQJHTnPMRq6ZDEIG2vfoxx8JIWJ2f/yoI8MkoYUJ1Q6t5arBaBaI2Qr0JEstWw==", + "requires": { + "@material/base": "=7.0.0-canary.d92d8c93e.0", + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-button": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.15.0.tgz", + "integrity": "sha512-vwwT5I8b7mMAH4UzGZdfStbWx+/blhBlZ/wZM+CKbolwPuOeMLeTMMawhyRnLqMxedCPExQ1koYoABXNoUB4lQ==", + "requires": { + "@material/button": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-checkbox": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-checkbox/-/mwc-checkbox-0.15.0.tgz", + "integrity": "sha512-ssjko688R/qPAfn4E79hFMyHq91h2rHqrAtvt7rFZT8to0uOurnXNwFLyuzwruhMbPjDRSr5fVcJWqWBV/SN3Q==", + "requires": { + "@material/checkbox": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-fab": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-fab/-/mwc-fab-0.15.0.tgz", + "integrity": "sha512-VejrZQgwAwcV72xOBaROxl3GQVg4nqczaxEZAmhVCJ5DNW58vhd32xmfXAtcySjKEROZbyIo24e3EZp8di/1Xg==", + "requires": { + "@material/fab": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-floating-label": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.15.0.tgz", + "integrity": "sha512-yfNk/vK+5ujdw/1AP+K4hhgJTzm/lR2jZpNr4zEq9v9uEDT3D+Q1PQ7jUpwKGKr/bZSU4jFUKeyksafE79YCCA==", + "requires": { + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-icon": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.15.0.tgz", + "integrity": "sha512-jKTwh9pNYn/DgQ1jmh3J7cl8CpOz7/seqLs70mURs2pMlbv9DIQiiYYprADExko7aaOwig9+lGmKQlEyLeV6DQ==", + "requires": { + "@material/mwc-base": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-icon-button": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-icon-button/-/mwc-icon-button-0.15.0.tgz", + "integrity": "sha512-7Xw4uYdMSRWBmviMB0i1BoacX/cnlA3JKT2kKipnXlj1JP0Y8hwLebXn18m0z8TbDhwAQnXuKp6cWSZMgcVcWw==", + "requires": { + "@material/icon-button": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-line-ripple": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.15.0.tgz", + "integrity": "sha512-bP0NEdSefiqUubr7oG8DHSA60eosfBCtA7W5zTXPhPYtENaF+m3ULwp7TE2gPEyoPcbvzx7CLeIdQzbmQtNAMg==", + "requires": { + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-linear-progress": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.15.0.tgz", + "integrity": "sha512-poBT3NZTqNpRtNSpvOfriguuU1rEYD2sLbSTwYO5DZt/f3OELbZE8C1AUZP37CUnfVyw8pwXjAURti7v2GZIog==", + "requires": { + "@material/linear-progress": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-list": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-list/-/mwc-list-0.15.0.tgz", + "integrity": "sha512-LEjy+nnsL6r6RAqef/zgk9aRIClyOtXp2k73AncHJMFdYhjQfgVNJLl+RChlxTuyCafKclVD+ufQFphD+cPZBw==", + "requires": { + "@material/base": "=7.0.0-canary.d92d8c93e.0", + "@material/density": "=7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "=7.0.0-canary.d92d8c93e.0", + "@material/list": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-checkbox": "^0.15.0", + "@material/mwc-radio": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/rtl": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "@material/typography": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-menu": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-menu/-/mwc-menu-0.15.0.tgz", + "integrity": "sha512-LG3VpP34woRMrIJn40bkrEMuv8CXmFJ70GLFEMmNFYp8z53ftIxQ9oL3kz09q0mOwgyThZAKrXJbyluO43NMlg==", + "requires": { + "@material/menu": "=7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-list": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-notched-outline": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.15.0.tgz", + "integrity": "sha512-x24k5vfGlZM/vwBxGMhNB3DVvICnEaq6iKIC0U+I1Kdk7G4AOIwCatQlf9u3HchvsQd9wpU5OfrXjZLktCeGsA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/notched-outline": "=7.0.0-canary.d92d8c93e.0", + "@material/shape": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-radio": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-radio/-/mwc-radio-0.15.0.tgz", + "integrity": "sha512-SbemYU6ZvqUGTNi62yQ6p9GIOBH2WajQFebgEsSCaaxWNJqTQGCh3vw7Wbx+75ZTTjGY6VQL0oeXDKoz2cRwmA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/radio": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-ripple": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.15.0.tgz", + "integrity": "sha512-3elf4ysHoURfdoWRle/0zQ2l7OUSWE7Ah73B/PYr/DgHISmYYUjg2k/K5NSro9UcmshAVnppIujlcZN3GbQIyA==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-select": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-select/-/mwc-select-0.15.0.tgz", + "integrity": "sha512-leaGiXNWrUMpS4HO+YyjPuJfUKos2LRLT49WdueErt0MTx1nYhvWGxj80rOugi8q3/6zvs2wxZG3oWX/KruO8Q==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-floating-label": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-line-ripple": "^0.15.0", + "@material/mwc-menu": "^0.15.0", + "@material/mwc-notched-outline": "^0.15.0", + "@material/select": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-slider": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-slider/-/mwc-slider-0.15.0.tgz", + "integrity": "sha512-35858xrxTNSJkP8EfgGF+SJRHkYgjXlrMzwVFXYXqqIpVu50V8CJ10qI58/FRVhaB9bsK0D4lOLOlZPE5ReACA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/slider": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-switch": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-switch/-/mwc-switch-0.15.0.tgz", + "integrity": "sha512-z4bOJgm9PYACk6JtFCQWMHpfO3HQOALmnV4EUDrUL4628oGcIfa3VJPeINDAoNzjwIvjY5EtoGKWEBDJpFnrfw==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/switch": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab/-/mwc-tab-0.15.0.tgz", + "integrity": "sha512-Ir/RXhFmU+9XhSyOcAcAsQMJY/4h6ivxOmKxL+9h1WH77QNR4INN/DU7YikAkPiTqkqFwYMRQ40eUzOhZYMB+w==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/mwc-tab-indicator": "^0.15.0", + "@material/tab": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-bar": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-bar/-/mwc-tab-bar-0.15.0.tgz", + "integrity": "sha512-wCPJSzfaefbbcfMzp7l+F3IfdwThWDinJgImu2Lbtf6cVep60NqbzFIYO3HpIgwag7NthoY+E3lb2GsAEsKDSQ==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-tab": "^0.15.0", + "@material/mwc-tab-scroller": "^0.15.0", + "@material/tab-bar": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-indicator": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-indicator/-/mwc-tab-indicator-0.15.0.tgz", + "integrity": "sha512-dbzHgqcj3tdMAoupmHwWPnuog/vFVhPHHev/3D99hpd+r1e3Smx3D/AU6WmMWRRN9UqRs9b/ZM0BI4fv4+1Djg==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/tab-indicator": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-scroller": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-scroller/-/mwc-tab-scroller-0.15.0.tgz", + "integrity": "sha512-2LzNn5BKhwgMV4VHu0iEnEWlyHeho/49CI/2SpcW+6rKLnMbzEP2X5m5cyurzEslt4eyh82jzHxeY+Y8Bw6YKg==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/tab-scroller": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/mwc-textarea": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-textarea/-/mwc-textarea-0.15.0.tgz", + "integrity": "sha512-dftIcPm4ncGS76L84YZFflSqU69fM87ZW4P+GrP2s2pPTZlHtdxxRrMxGYCTbqSfzPddSNyM0LsWcdNSCHKJ1g==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-textfield": "^0.15.0", + "@material/textfield": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-textfield": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.15.0.tgz", + "integrity": "sha512-g3ncA1LQSPIVykllm/57Pyvuz1gUZj/BAKi8ia5T0wZWdvU96x4jCLK/2bUB9WDt2QWaQNap+1GI1MJ/mFekvA==", + "requires": { + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-floating-label": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-line-ripple": "^0.15.0", + "@material/mwc-notched-outline": "^0.15.0", + "@material/shape": "=7.0.0-canary.d92d8c93e.0", + "@material/textfield": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/notched-outline": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-/SA0gd/P4wlUpW6owAbotXfY+zKaznJXQhvn1LllXahL6txxpSZ0fIuIncSym0HTowR8oGtKk5lnkFcG+BAOgQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/progress-indicator": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ibwqKAKd8xJqN2SceGo7fsjwdy7E2yjmP8V3ASUqUnK+MXepKoxdjfj+pXBAuCwNy8ehx1b4HzYq7LA20PKWKw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/radio": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ldDuoAMGy0bDNmIiYIro/N4XdoFERgM+7sJ+eHSlXUvR9Tl/YDkkGHvjRmEcl9E2CwjI9Oa3tPlj5dkggIBMGA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/ripple": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-6.0.0.tgz", + "integrity": "sha512-z+ARpjBVkRZBhiX20aAxAMrgBcfpcCRqIcI/E3Esfyo7M+q/mm8t92ZumcahxWnOBJkHM55kkpUqHlfkYlfyZQ==", + "requires": { + "@material/animation": "^6.0.0", + "@material/base": "^6.0.0", + "@material/dom": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/theme": "^6.0.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-6.0.0.tgz", + "integrity": "sha512-/WkzlUm3qylWMqv7Lw7ColZ8DYvEvTXtevxxz7PKM1hT9FNlbO1/Qywvda4VUtXivEeynXEqeT1T/ZYHV9yDVw==" + }, + "@material/select": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-8rv3n8WvuMhkl7zkBJPfF3NOWvJiNFBEA26MuiPy5fMjSmavypYJtk1Dgu8zaQoEKzESoqYqUigjfDqSpyCX6Q==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "7.0.0-canary.d92d8c93e.0", + "@material/menu": "7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "7.0.0-canary.d92d8c93e.0", + "@material/notched-outline": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/shape": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-6.0.0.tgz", + "integrity": "sha512-tZT9GGWI3QcOtyfJ07Hc3noP2b5Bvx2npx/aj+k7gEIkE06mzr08dVnVOup8z8HbHWIenxRJgdeF5+lAfBE3vw==", + "requires": { + "@material/feature-targeting": "^6.0.0", + "@material/rtl": "^6.0.0" + } + }, + "@material/slider": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-oj+OcoGr1M4TQUNzAwBv56yKD0cHUvd/cxtGxjIuMCXby6fH1VrbY0FZu+t901Rtx6puEM9Tm2hkwvGRtmzs7w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/switch": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-wWgObFNBl5oSnUZ+I3jZydQFmuv+H1sgBwSxdDTw0MJG/snZYX5V8KastUbqyG/uzuXnAtUNnhHLlPEmLDW/QQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-RFfhibqHUJ5u+YK08a6RiRtFTXk7R/cLCNsEZVAD7uKOCEvPzkmQuwEhx3vt0kfgGZK2m8P5i14mX/RXj0tkpg==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/tab-indicator": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab-bar": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-pTcN2N/bUEBgZdleJSMZFCoatUjZS5+c4XWwQmuy7bU01lL77nG7B9aVQbEXvQt+qPs/fPqqAaf5BqSvpt66Eg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/tab": "7.0.0-canary.d92d8c93e.0", + "@material/tab-scroller": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/tab-indicator": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-XHVPNFaruXVTfF2mymc6r0bZVxHe8P5x9SM9y+XIL3E6XnQVVi5REItzhum07Ag5AyfEiSr2giW1RpXk36tiAA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab-scroller": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-RSUGprUXHe/8sIz8q7eA96xaWqcAa+adCIrcUQKQf1MOea6Ym5dwa6BBvH6wPoEtvr2dQTB4jRO9xEOlFsUiTg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/tab": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/textfield": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-z2BrgR/AVn4LqWVSpr/43oo3/w4Y2muX6c+lDf+z4Ve/DIJjJ3eUY6D4ABck5bVP6HzE9JWPWXyEAxb3olyzKg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "7.0.0-canary.d92d8c93e.0", + "@material/notched-outline": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/theme": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-6.0.0.tgz", + "integrity": "sha512-dViBx1lsidoQhVi/MYksTmDs8aUPj3mPVQIaBPtDRtqpIuWSwG7bCHoY8rG8FHRduPLpq3b1A4OwKHBd0RWVJw==", + "requires": { + "@material/feature-targeting": "^6.0.0" + } + }, + "@material/touch-target": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-md7J3xLYHej2k2yQy/T7SJRCf9nOKsn7J8ufWsamy6HvGXOCvZivFlf70eDbdz7wUQiG0H6kT5KywQtdP16uvQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/typography": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-R7oAH4hi8EASn3Vetl+ZYIZkYQ6Cq2zVEE5zb1Iy6ELtwEL63lcb2oXEkvnTTYrS/XkQA7o4bs/HUAM+ojWECA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@polymer/font-roboto": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz", + "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==" + }, + "@polymer/iron-flex-layout": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz", + "integrity": "sha512-7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==", + "requires": { + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/paper-styles": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.1.tgz", + "integrity": "sha512-y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g==", + "requires": { + "@polymer/font-roboto": "^3.0.1", + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/paper-tooltip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz", + "integrity": "sha512-yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==", + "requires": { + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/polymer": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.4.1.tgz", + "integrity": "sha512-KPWnhDZibtqKrUz7enIPOiO4ZQoJNOuLwqrhV2MXzIt3VVnUVJVG5ORz4Z2sgO+UZ+/UZnPD0jqY+jmw/+a9mQ==", + "requires": { + "@webcomponents/shadycss": "^1.9.1" + } + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", "dev": true }, + "@types/canvas-confetti": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.0.0.tgz", + "integrity": "sha512-Z3Eh7qlYdi9cvotmreZjqxaUSwpUYu/s2uzSvnGgktuHhpj8FHq6JSJLVYP3R4YNZN/d8nNOG5y2cKmautyDCQ==", + "dev": true + }, "@types/chrome": { - "version": "0.0.106", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.106.tgz", - "integrity": "sha512-sCQa+QJL/Kl+6ngU4xD1VjTFIkQDizOHN94zbb7byK9D3U79x/KXjqXyS7lHoa2q9xw3bWePb+giLhBKOILRuA==", + "version": "0.0.107", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.107.tgz", + "integrity": "sha512-7z/4YkJu4B8ROxZhbzIx5olbRJqzoDdAoMhSzcJlElsZzv2eTxsvxNkN/QFq0ClbAFNkFf07XVoTrWFHD12QyA==", "dev": true, "requires": { "@types/filesystem": "*", @@ -99,9 +2223,9 @@ "dev": true }, "@types/html-minifier-terser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz", - "integrity": "sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", "dev": true }, "@types/minimatch": { @@ -111,9 +2235,9 @@ "dev": true }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, "@types/q": { @@ -343,6 +2467,11 @@ "@xtuc/long": "4.2.2" } }, + "@webcomponents/shadycss": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.6.tgz", + "integrity": "sha512-5fFjvP0jQJZoXK6YzYeYcIDGJ5oEsdjr1L9VaYLw5yxNd4aRz4srMpwCwldeNG0A6Hvr9igbG7fCsBeiiCXd7A==" + }, "@webcomponents/webcomponentsjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.3.tgz", @@ -360,12 +2489,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -377,11 +2500,66 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "dev": true, + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -420,12 +2598,6 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -492,16 +2664,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -511,6 +2673,12 @@ "sprintf-js": "~1.0.2" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -529,12 +2697,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -580,33 +2742,23 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "dev": true, "requires": { - "object-assign": "^4.1.1", "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } } }, "assert-plus": { @@ -636,12 +2788,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1507,6 +3653,7 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -1522,57 +3669,6 @@ "request-promise": "^4.2.4", "tar": "^4.4.10", "unzip-stream": "^0.3.0" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" } }, "bluebird": { @@ -1582,9 +3678,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==", "dev": true }, "body-parser": { @@ -1729,21 +3825,43 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.1.0.tgz", + "integrity": "sha512-VYxo7cDCeYUoBZ0ZCy4UyEUCP3smyBd4DRQM5nrFS1jJjPJjX7rP3oLRpPoWfkhQfyJ0I9ZbHbKafrFD/SGlrg==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "browserify-zlib": { @@ -1914,24 +4032,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -1945,11 +4045,16 @@ } }, "caniuse-lite": { - "version": "1.0.30001048", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", - "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==", + "version": "1.0.30001055", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz", + "integrity": "sha512-MbwsBmKrBSKIWldfdIagO5OJWZclpJtS4h0Jrk/4HFrXJxTdVdH23Fd+xCiHriVGvYcWyW8mR/CPsYajlH8Iuw==", "dev": true }, + "canvas-confetti": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.2.0.tgz", + "integrity": "sha512-0B49O9CfLciAYz4hriu9pvWNGkCtVcpvyNFKWZI+JVWJM5nJTMg5MX3cFzatyeYcOL6bR1Jw3yhZKbgt03O8/Q==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2092,6 +4197,18 @@ "wrap-ansi": "^2.0.0" } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -2103,6 +4220,36 @@ "shallow-clone": "^3.0.0" } }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "closure-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/closure-webpack-plugin/-/closure-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-QW1V0oZPtrjSjGx6TkegvUlVSFzSzEWN8pXeckEti4WdkO+P+WWEGSkB4slTIf1kO9KFFWoi8yl6fZd03GPjqA==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "schema-utils": "1.x", + "unquoted-property-validator": "^1.0.2", + "webpack-sources": "1.x" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2198,6 +4345,15 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2234,6 +4390,30 @@ "schema-utils": "^2.6.1", "serialize-javascript": "^2.1.2", "webpack-sources": "^1.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } } }, "concat-map": { @@ -2266,12 +4446,6 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2366,6 +4540,14 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "create-hash": { @@ -2435,6 +4617,18 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -2519,6 +4713,30 @@ "postcss-value-parser": "^4.0.3", "schema-utils": "^2.6.6", "semver": "^6.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } } }, "css-prefers-color-scheme": { @@ -2680,21 +4898,22 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2704,16 +4923,6 @@ "assert-plus": "^1.0.0" } }, - "deasync": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.20.tgz", - "integrity": "sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ==", - "dev": true, - "requires": { - "bindings": "^1.5.0", - "node-addon-api": "^1.7.1" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2871,12 +5080,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2914,6 +5117,12 @@ "repeating": "^2.0.0" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", @@ -2929,6 +5138,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "dns-equal": { @@ -3070,9 +5287,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.427", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", - "integrity": "sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A==", + "version": "1.3.432", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.432.tgz", + "integrity": "sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw==", "dev": true }, "elliptic": { @@ -3088,6 +5305,14 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "elm": { @@ -3174,9 +5399,9 @@ } }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz", + "integrity": "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==", "dev": true }, "errno": { @@ -3227,6 +5452,38 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3283,9 +5540,9 @@ "dev": true }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.1.tgz", + "integrity": "sha512-MnI0l35oYL2C/c80rjJN7qu50MDx39yYE7y7oYck2YA3v+y7EaAenY8IU8AP4d1RWqE8VAKWFGSh3rfP87ll3g==", "dev": true }, "events": { @@ -3314,9 +5571,9 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -3469,6 +5726,23 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3603,6 +5877,15 @@ "websocket-driver": ">=0.5.1" } }, + "fibers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", + "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -3619,6 +5902,18 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -3638,6 +5933,16 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -3645,7 +5950,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "dev": true, + "optional": true }, "fill-range": { "version": "4.0.0", @@ -3858,566 +6164,14 @@ "dev": true }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "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": { "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "nan": "^2.12.1" } }, "function-bind": { @@ -4426,43 +6180,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -4584,17 +6307,56 @@ } } }, - "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "google-closure-compiler": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20200504.0.0.tgz", + "integrity": "sha512-No343xYZ/d5+f7VPBm1Vy6TjcUSpP3b0VYe3lww5M5bonEnyF6jwCuGhYfwtpCnM92ZSVcLqbJJA8SDf5DvSZA==", "dev": true, "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.12", - "minimatch": "~3.0.2" + "chalk": "2.x", + "google-closure-compiler-java": "^20200504.0.0", + "google-closure-compiler-js": "^20200504.0.0", + "google-closure-compiler-linux": "^20200504.0.0", + "google-closure-compiler-osx": "^20200504.0.0", + "google-closure-compiler-windows": "^20200504.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" } }, + "google-closure-compiler-java": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20200504.0.0.tgz", + "integrity": "sha512-7E5rg8dAfpzeTsGuWpwW/ZILVoItFAw4I9AjutY3ujZIadUnlQ6hKHasyvXCB2y1Vzlvf/vsbyjoNvPPZ6IeNA==", + "dev": true + }, + "google-closure-compiler-js": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20200504.0.0.tgz", + "integrity": "sha512-+03QX239BszaF/tpBYOT5JLR2yAwRoy5ObmwI1zeq9gq+zveD8w7mISWMY+I/3HYef7blN+aMKi78ulE3Mnyww==", + "dev": true + }, + "google-closure-compiler-linux": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20200504.0.0.tgz", + "integrity": "sha512-DljGPGILaebP6XdykflPwzwYrpi3lamfIx7FNjjhqM0ukHOBUyRfEW8E87sjSwCgvQFHqUn3CB39JhLEcf15UA==", + "dev": true, + "optional": true + }, + "google-closure-compiler-osx": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20200504.0.0.tgz", + "integrity": "sha512-isez2ZP42xLkIMd+HgD+DkazHfXNsmCwn6wC7LWlBG56vVM2NoBXTjNn+uPjLFJ0M+wzhlwIVhJnMF+qORH2Sw==", + "dev": true, + "optional": true + }, + "google-closure-compiler-windows": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20200504.0.0.tgz", + "integrity": "sha512-T5g2Slv6W/SO4RhAZcp6neWbZCQ8B0QXujvqLbx331r7uMxM7IaScHTNry6NTFFwReiY28COIqSuyEPuGmFjDg==", + "dev": true, + "optional": true + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -4667,12 +6429,6 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -4728,9 +6484,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } @@ -4842,6 +6598,18 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -4861,6 +6629,16 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -4935,9 +6713,9 @@ "dev": true }, "domutils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz", - "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.1.0.tgz", + "integrity": "sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==", "dev": true, "requires": { "dom-serializer": "^0.2.1", @@ -4974,12 +6752,6 @@ } } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, "http-proxy": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", @@ -5145,12 +6917,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", - "dev": true - }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -5553,9 +7319,9 @@ "dev": true }, "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -5579,12 +7345,6 @@ } } }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5827,16 +7587,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "lower-case": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", @@ -5887,12 +7637,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5946,24 +7690,6 @@ "readable-stream": "^2.0.1" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -6011,6 +7737,14 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "mime": { @@ -6040,12 +7774,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mini-svg-data-uri": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.1.3.tgz", - "integrity": "sha512-EeKOmdzekjdPe53/GdxmUpNgDQFkNeSte6XkJmOBt4BfWL6FQ9G9RtLNh+JMjFS3LhdpSICMIkZdznjiecASHQ==", - "dev": true - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6239,7 +7967,8 @@ "version": "2.14.1", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true + "dev": true, + "optional": true }, "nanomatch": { "version": "1.2.13", @@ -6272,6 +8001,12 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -6288,12 +8023,6 @@ "tslib": "^1.10.0" } }, - "node-addon-api": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz", - "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==", - "dev": true - }, "node-elm-compiler": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz", @@ -6312,34 +8041,6 @@ "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -6371,107 +8072,35 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } } } }, "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "version": "1.1.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", + "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==", "dev": true }, - "node-sass": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", - "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.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=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6533,18 +8162,6 @@ } } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -6637,6 +8254,12 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6773,16 +8396,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -7142,9 +8755,9 @@ "dev": true }, "postcss": { - "version": "7.0.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.28.tgz", - "integrity": "sha512-YU6nVhyWIsVtlNlnAj1fHTsUKW5qxm3KEgzq2Jj6KTEFOTK8QWR12eIDvrlWhiSTK8WIBFTBhOJV4DY6dUuEbw==", + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.29.tgz", + "integrity": "sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -7515,31 +9128,6 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "postcss-logical": { @@ -8228,12 +9816,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -8252,6 +9834,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + } } }, "pump": { @@ -8463,27 +10053,6 @@ "readable-stream": "^2.0.2" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - } - } - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -8517,6 +10086,12 @@ "safe-regex": "^1.1.0" } }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "dev": true + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -8677,6 +10252,12 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -8797,6 +10378,63 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -8809,6 +10447,30 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -8870,149 +10532,13 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "sass": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", "dev": true, "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "sass-inline-svg": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/sass-inline-svg/-/sass-inline-svg-1.2.3.tgz", - "integrity": "sha512-IyWanH7PGTVbiR3uSHEhdEL+dH1u7ptdbfiv57ahcDaBFXdHh8YlHt++6ZqxtU3zW9Cw97JJLSbyz+l/qQt9IQ==", - "dev": true, - "requires": { - "css-select": "^1.2.0", - "deasync": "^0.1.7", - "dom-serializer": "^0.1.0", - "htmlparser2": "^3.9.0", - "mini-svg-data-uri": "^1.0.0", - "object-assign": "^4.0.1", - "svgo": "^1.3.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { @@ -9026,22 +10552,6 @@ "neo-async": "^2.6.1", "schema-utils": "^2.6.1", "semver": "^6.3.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" }, "dependencies": { "ajv": { @@ -9055,26 +10565,46 @@ "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } } } @@ -9415,13 +10945,14 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" } }, "sockjs-client": { @@ -9700,15 +11231,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -9852,15 +11374,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, "style-loader": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", @@ -9871,6 +11384,18 @@ "schema-utils": "^2.6.6" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -9890,6 +11415,16 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -9954,14 +11489,45 @@ "dev": true }, "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "temp": { @@ -10014,14 +11580,14 @@ } }, "terser-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-gHAVFtJz1gQW5cu0btPtb+5Syo7K9hRj3b0lstgfglaBhbtcOCizsaPTnxOBGmF9iIgwsrSIiraBa2xzuWND7Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", "dev": true, "requires": { "cacache": "^15.0.3", "find-cache-dir": "^3.3.1", - "jest-worker": "^25.5.0", + "jest-worker": "^26.0.0", "p-limit": "^2.3.0", "schema-utils": "^2.6.6", "serialize-javascript": "^3.0.0", @@ -10030,6 +11596,18 @@ "webpack-sources": "^1.4.3" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "cacache": { "version": "15.0.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", @@ -10095,6 +11673,16 @@ "glob": "^7.1.3" } }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, "serialize-javascript": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", @@ -10233,31 +11821,16 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "dev": true }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, "ts-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.2.tgz", - "integrity": "sha512-DwpZFB67RoILQHx42dMjSgv2STpacsQu5X+GD/H9ocd8IhU0m8p3b/ZrIln2KmcucC6xep2PdEMEblpWT71euA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.3.tgz", + "integrity": "sha512-BXAHfPjm3J//20ibuI30M+xgLpdIng68p2H952QqbbmDk7SW72HV42k9Gop7rMxuHvrXWjazWhKuyr9D9kKe3A==", "dev": true, "requires": { "chalk": "^2.3.0", @@ -10313,10 +11886,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tty-browserify": { "version": "0.0.0", @@ -10339,6 +11911,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-fest": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", @@ -10367,171 +11945,6 @@ "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, - "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", - "dev": true, - "requires": { - "commander": "~2.20.3" - } - }, - "uglifyjs-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "uglify-js": "^3.6.0", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.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" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } - } - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -10586,6 +11999,12 @@ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true }, + "unquoted-property-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unquoted-property-validator/-/unquoted-property-validator-1.1.0.tgz", + "integrity": "sha512-ZWeQoYZ7HN8DCLeaowNv2GvZIXqJptKB1uUWd08ZYc1qAmJt8tXh9nck26aoYmhJtE3jCjDqdqEfUTqcJ0R7bw==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -10692,18 +12111,18 @@ "dev": true }, "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "2.0.1" }, "dependencies": { "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true } } @@ -10783,6 +12202,37 @@ "extsprintf": "^1.2.0" } }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -10840,6 +12290,12 @@ "webpack-sources": "^1.4.1" }, "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -10949,17 +12405,6 @@ "find-up": "^3.0.0" } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -11306,9 +12751,9 @@ } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -11319,69 +12764,57 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -11395,21 +12828,6 @@ "ms": "^2.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -11419,19 +12837,10 @@ "locate-path": "^3.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "is-absolute-url": { @@ -11446,21 +12855,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -11477,26 +12871,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -11512,34 +12886,30 @@ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -11559,6 +12929,28 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -11568,30 +12960,34 @@ "async-limiter": "~1.0.0" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -11621,13 +13017,11 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -11637,16 +13031,6 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "weightless": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/weightless/-/weightless-0.0.37.tgz", - "integrity": "sha512-WxzpPc2VlD/PFWwOxMhQ6dPOmM4ugepXn6D8Qo7vUNSWWRIANqBvkQlo4TsjYiEpM4rAXCBGvkwMpfpxad14mA==", - "requires": { - "@a11y/focus-trap": "~1.0.4", - "lit-element": "^2.2.1", - "lit-html": "^1.1.2" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -11662,15 +13046,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/client/package.json b/client/package.json index c922c07..1f2ab31 100644 --- a/client/package.json +++ b/client/package.json @@ -23,16 +23,32 @@ ], "dependencies": { "@fortawesome/fontawesome-free": "^5.12.1", + "@material/card": "^6.0.0", + "@material/mwc-button": "^0.15.0", + "@material/mwc-fab": "^0.15.0", + "@material/mwc-icon-button": "^0.15.0", + "@material/mwc-linear-progress": "^0.15.0", + "@material/mwc-menu": "^0.15.0", + "@material/mwc-select": "^0.15.0", + "@material/mwc-slider": "^0.15.0", + "@material/mwc-switch": "^0.15.0", + "@material/mwc-tab": "^0.15.0", + "@material/mwc-tab-bar": "^0.15.0", + "@material/mwc-textarea": "^0.15.0", + "@material/mwc-textfield": "^0.15.0", + "@polymer/paper-tooltip": "^3.0.1", "@webcomponents/webcomponentsjs": "^2.4.3", - "weightless": "0.0.37" + "canvas-confetti": "^1.2.0" }, "devDependencies": { - "@types/chrome": "^0.0.106", + "@types/canvas-confetti": "^1.0.0", + "@types/chrome": "^0.0.107", "@types/chromecast-caf-receiver": "^5.0.4", "@types/chromecast-caf-sender": "^1.0.3", "app-manifest-loader": "^2.4.1", "chromecast-device-emulator": "^1.2.7", "clean-webpack-plugin": "^3.0.0", + "closure-webpack-plugin": "^2.3.0", "compression-webpack-plugin": "^3.1.0", "css-hot-loader": "^1.4.4", "css-loader": "^3.5.3", @@ -41,24 +57,25 @@ "elm-hot-webpack-loader": "^1.1.6", "elm-webpack-loader": "^6.0.1", "extract-loader": "^5.0.1", + "fibers": "^5.0.0", "file-loader": "^6.0.0", + "google-closure-compiler": "^20200504.0.0", "html-loader": "^1.1.0", "html-webpack-plugin": "^4.3.0", - "node-sass": "^4.14.0", "postcss-import": "^12.0.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "prettier": "2.0.5", "prettier-plugin-elm": "^0.7.0", - "sass-inline-svg": "^1.2.3", + "resolve-url-loader": "^3.1.1", + "sass": "^1.26.5", "sass-loader": "^8.0.2", "style-loader": "^1.2.1", - "terser-webpack-plugin": "^3.0.0", - "ts-loader": "^7.0.2", + "terser-webpack-plugin": "^3.0.1", + "ts-loader": "^7.0.3", "typescript": "^3.8.3", - "uglifyjs-webpack-plugin": "^2.2.0", "webpack": "^4.43.0", "webpack-cli": "^3.3.11", - "webpack-dev-server": "^3.10.3" + "webpack-dev-server": "^3.11.0" } } diff --git a/client/postcss.config.js b/client/postcss.config.js new file mode 100644 index 0000000..80d2149 --- /dev/null +++ b/client/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + "postcss-import": {}, + "postcss-preset-env": {}, + cssnano: {}, + }, +}; diff --git a/client/src/elm/MassiveDecks.elm b/client/src/elm/MassiveDecks.elm index ede797c..841c340 100644 --- a/client/src/elm/MassiveDecks.elm +++ b/client/src/elm/MassiveDecks.elm @@ -15,6 +15,7 @@ import MassiveDecks.Error.Overlay as Overlay import MassiveDecks.Messages exposing (..) import MassiveDecks.Model exposing (..) import MassiveDecks.Models.Decoders as Decoders +import MassiveDecks.Models.MdError as MdError import MassiveDecks.Notifications as Notifications import MassiveDecks.Pages as Pages import MassiveDecks.Pages.Loading as Loading @@ -377,10 +378,10 @@ handleLobbyMsg baseModel lobbyMsg lobbyModel = Lobby.Stay newLobbyModel -> ( { model | page = Pages.Lobby newLobbyModel }, lobbyCmd ) - Lobby.AuthError gc authenticationError -> + Lobby.JoinError gc error -> let ( page, changePageCmd ) = - Start.initWithAuthError shared gc authenticationError + Start.initWithError shared gc error urlCommand = page |> .route |> Route.Start |> Route.url |> Navigation.pushUrl shared.key diff --git a/client/src/elm/MassiveDecks/Card/Source.elm b/client/src/elm/MassiveDecks/Card/Source.elm index 92b9bd2..01fb553 100644 --- a/client/src/elm/MassiveDecks/Card/Source.elm +++ b/client/src/elm/MassiveDecks/Card/Source.elm @@ -16,7 +16,6 @@ module MassiveDecks.Card.Source exposing import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE import MassiveDecks.Card.Source.BuiltIn as BuiltIn import MassiveDecks.Card.Source.Cardcast as Cardcast import MassiveDecks.Card.Source.Custom as Player @@ -29,8 +28,8 @@ import MassiveDecks.Pages.Lobby.Configure.Decks.Model exposing (DeckOrError) import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import Material.Select as Select +import Paper.Tooltip as Tooltip {-| The default source for an editor. @@ -61,24 +60,28 @@ externalAndEquals a b = {-| Get an general methods of the given type. -} -generalMethods : String -> Maybe (ExternalGeneralMethods msg) -generalMethods n = - case n of - "BuiltIn" -> - BuiltIn.generalMethods |> Just +generalMethods : General -> ExternalGeneralMethods msg +generalMethods source = + case source of + GBuiltIn -> + BuiltIn.generalMethods - "Cardcast" -> - Cardcast.generalMethods |> Just - - _ -> - Nothing + GCardcast -> + Cardcast.generalMethods {-| Get an empty source of the given type. -} -empty : Shared -> String -> Maybe External -empty shared n = - generalMethods n |> Maybe.map (\m -> m.empty shared) +empty : Shared -> General -> External +empty shared = + generalMethods >> (\m -> m.empty shared) + + +{-| Get the general source for the given specific source. +-} +generalMatching : External -> General +generalMatching source = + (externalMethods source |> .id) () {-| An empty source of the same general type as the given one. @@ -111,28 +114,46 @@ defaultDetails shared source = {-| A tooltip for a source. -} -tooltip : Shared -> Source -> Maybe ( String, Html msg ) -tooltip shared source = - case shared |> (methods source |> .tooltip) of - Just ( id, rendered ) -> - Just - ( id - , Wl.tooltip - (List.concat - [ [ WlA.anchor id - , WlA.fixed - , WlA.anchorOpenEvents [ "mouseover" ] - , WlA.anchorCloseEvents [ "mouseout" ] - ] - , WlA.anchorOrigin WlA.XRight WlA.YCenter - , WlA.transformOrigin WlA.XLeft WlA.YCenter - ] - ) - [ rendered ] - ) +tooltip : Shared -> Tooltip.Position -> Details -> Source -> Maybe ( String, Html msg ) +tooltip shared position details source = + let + ms = + methods source + in + ms.tooltip (generalTooltip shared position details) - Nothing -> - Nothing + +{-| A general tooltip for any source. +-} +generalTooltip : Shared -> Tooltip.Position -> Details -> String -> List (Html msg) -> Html msg +generalTooltip shared position details forId sourceSpecificContent = + let + lang l = + Html.p [ HtmlA.class "language" ] + [ Strings.DeckLanguage { language = l |> Lang.languageName } |> Lang.html shared + ] + + author a = + Html.p [ HtmlA.class "author" ] [ Strings.DeckAuthor { author = a } |> Lang.html shared ] + + translator t = + Html.p [ HtmlA.class "translator" ] [ Strings.DeckTranslator { translator = t } |> Lang.html shared ] + + generalContent = + [ details.language |> Maybe.andThen (\l -> Maybe.justIf (l /= Lang.currentLanguage shared) (lang l)) + , details.author |> Maybe.map author + , details.translator |> Maybe.map translator + ] + |> List.filterMap identity + in + [ Html.div [ HtmlA.class "source-tooltip" ] + ([ sourceSpecificContent + , generalContent + ] + |> List.concat + ) + ] + |> Tooltip.view position forId {-| The logo for a source. @@ -144,32 +165,38 @@ logo source = {-| An editor for any supported external source. -} -generalEditor : Shared -> List DeckOrError -> External -> (External -> msg) -> List (Html msg) -generalEditor shared existing currentValue update = +generalEditor : Shared -> List DeckOrError -> External -> (External -> msg) -> Maybe msg -> msg -> List (Html msg) +generalEditor shared existing currentValue update submit noOp = let enabledSources = [ shared.sources.builtIn |> Maybe.map (\_ -> BuiltIn.generalMethods) , Cardcast.generalMethods |> Maybe.justIf shared.sources.cardcast ] - toOption source = - Html.option [ HtmlA.value (source.id ()) ] - [ () |> source.name |> Lang.html shared - ] + toItem source = + { id = source.id () + , icon = source.logo () + , primary = [ () |> source.name |> Lang.html shared ] + , secondary = Nothing + , meta = Nothing + } in - [ Wl.select - [ HtmlA.id "source-selector" - , WlA.outlined - , HtmlE.onInput (empty shared >> Maybe.withDefault (default shared) >> update) - ] - (enabledSources |> List.filterMap (Maybe.map toOption)) - , editor shared existing currentValue update + [ Select.view shared + { label = Strings.DeckSource + , idToString = generalToString + , idFromString = generalFromString + , selected = currentValue |> generalMatching |> Just + , wrap = Maybe.map (empty shared) >> Maybe.withDefault (default shared) >> update + } + [ HtmlA.id "source-selector" ] + (enabledSources |> List.filterMap (Maybe.map toItem)) + , editor shared existing currentValue update submit noOp ] {-| An editor for the given source value. -} -editor : Shared -> List DeckOrError -> External -> (External -> msg) -> Html msg +editor : Shared -> List DeckOrError -> External -> (External -> msg) -> Maybe msg -> msg -> Html msg editor shared existing source = (externalMethods source |> .editor) shared existing diff --git a/client/src/elm/MassiveDecks/Card/Source/BuiltIn.elm b/client/src/elm/MassiveDecks/Card/Source/BuiltIn.elm index 6064a8a..c3f8a7e 100644 --- a/client/src/elm/MassiveDecks/Card/Source/BuiltIn.elm +++ b/client/src/elm/MassiveDecks/Card/Source/BuiltIn.elm @@ -3,27 +3,32 @@ module MassiveDecks.Card.Source.BuiltIn exposing , methods ) +import FontAwesome.Icon as Icon +import FontAwesome.Solid as Icon import Html as Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE import MassiveDecks.Card.Source.BuiltIn.Model exposing (..) import MassiveDecks.Card.Source.Methods as Source import MassiveDecks.Card.Source.Model as Source exposing (Source) import MassiveDecks.Components.Form.Message exposing (Message) +import MassiveDecks.Icon as Icon import MassiveDecks.Model exposing (..) -import MassiveDecks.Pages.Lobby.Configure.Decks.Model as Decks exposing (DeckOrError) +import MassiveDecks.Pages.Lobby.Configure.Decks.Model exposing (DeckOrError) import MassiveDecks.Strings as Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang exposing (sortClosestFirst) import MassiveDecks.Util.Html as Html -import Weightless as Wl -import Weightless.Attributes as WlA +import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList as NonEmptyList +import MassiveDecks.Util.Order as Order +import Material.Select as Select methods : Id -> Source.ExternalMethods msg methods given = - { name = name + { name = sourceName , logo = logo , empty = empty - , id = id + , id = sourceId , problems = problems given , defaultDetails = details given , tooltip = tooltip given @@ -34,10 +39,10 @@ methods given = generalMethods : Source.ExternalGeneralMethods msg generalMethods = - { name = name + { name = sourceName , logo = logo , empty = empty - , id = id + , id = sourceId } @@ -45,29 +50,31 @@ generalMethods = {- Private -} -id : () -> String -id _ = - "BuiltIn" +sourceId : () -> Source.General +sourceId _ = + Source.GBuiltIn -name : () -> MdString -name () = +sourceName : () -> MdString +sourceName () = Strings.BuiltIn empty : Shared -> Source.External empty shared = shared.sources.builtIn - |> Maybe.andThen (.decks >> List.head) + |> Maybe.map (.decks >> NonEmptyList.head) |> Maybe.map .id - |> Maybe.withDefault (Id "") + |> Maybe.withDefault (hardcoded "") |> Source.BuiltIn +{-| See if the id is equal to the given source. +-} equals : Id -> Source.External -> Bool -equals (Id given) source = +equals given source = case source of - Source.BuiltIn (Id other) -> + Source.BuiltIn other -> given == other _ -> @@ -79,27 +86,57 @@ problems _ () = [] -editor : Id -> Shared -> List DeckOrError -> (Source.External -> msg) -> Html msg -editor (Id selectedId) shared _ update = +editor : Id -> Shared -> List DeckOrError -> (Source.External -> msg) -> Maybe msg -> msg -> Html msg +editor selected shared existing update _ _ = case shared.sources.builtIn of Just { decks } -> let - deck deckInfo = - case deckInfo.id of - Id other -> - Html.option - [ HtmlA.selected (selectedId == other) - , HtmlA.value other - ] - [ Html.text deckInfo.name ] + deck { id, name, language, author, translator } = + let + lang = + if language /= Lang.currentLanguage shared then + language |> Lang.languageName |> Just + + else + Nothing + + matches d = + case d.source of + Source.BuiltIn other -> + other == id + + _ -> + False + + secondary = + [ lang |> Maybe.map (\l -> Strings.DeckLanguage { language = l } |> Lang.html shared) + , Strings.DeckAuthor { author = author } |> Lang.html shared |> Just + , translator |> Maybe.map (\t -> Strings.DeckTranslator { translator = t } |> Lang.html shared) + ] + |> List.filterMap identity + |> List.intersperse (Html.text ", ") + in + { id = id + , icon = Nothing + , primary = [ Html.text name ] + , secondary = Just secondary + , meta = Icon.check |> Icon.viewIcon |> Maybe.justIf (existing |> List.any matches) + } in Html.div [ HtmlA.class "primary" ] - [ Wl.select - [ HtmlA.id "built-in-selector" - , WlA.outlined - , Id >> Source.BuiltIn >> update |> HtmlE.onInput - ] - (decks |> List.map deck) + [ Select.view shared + { label = Strings.Deck + , idToString = toString + , idFromString = fromString shared.sources.builtIn + , selected = Just selected + , wrap = Maybe.withDefault (hardcoded "") >> Source.BuiltIn >> update + } + [ HtmlA.id "built-in-selector" ] + (decks + |> NonEmptyList.toList + |> List.sortWith (sortClosestFirst (Lang.currentLanguage shared) |> Order.map (.language >> Just)) + |> List.map deck + ) ] Nothing -> @@ -107,26 +144,32 @@ editor (Id selectedId) shared _ update = details : Id -> Shared -> Source.Details -details (Id given) shared = +details given shared = let - isSame deckInfo = - case deckInfo.id of - Id other -> - given == other + isSame { id } = + given == id + + info = + shared.sources.builtIn + |> Maybe.andThen (.decks >> NonEmptyList.toList >> List.filter isSame >> List.head) in - { name = - shared.sources.builtIn - |> Maybe.andThen (.decks >> List.filter isSame >> List.head >> Maybe.map .name) - |> Maybe.withDefault "" + { name = info |> Maybe.map .name |> Maybe.withDefault "" , url = Nothing + , author = info |> Maybe.map .author + , translator = info |> Maybe.andThen .translator + , language = info |> Maybe.map .language } -tooltip : Id -> Shared -> Maybe ( String, Html msg ) -tooltip (Id given) shared = - ( "builtin-" ++ given, Html.span [] [ details (Id given) shared |> .name |> Html.text ] ) |> Just +tooltip : Id -> (String -> List (Html msg) -> Html msg) -> Maybe ( String, Html msg ) +tooltip id renderTooltip = + let + forId = + "builtin-" ++ (id |> toString) + in + ( forId, renderTooltip forId [] ) |> Just logo : () -> Maybe (Html msg) logo () = - Nothing + Icon.massiveDecks |> Icon.viewIcon |> Just diff --git a/client/src/elm/MassiveDecks/Card/Source/BuiltIn/Model.elm b/client/src/elm/MassiveDecks/Card/Source/BuiltIn/Model.elm index 3a09861..2872267 100644 --- a/client/src/elm/MassiveDecks/Card/Source/BuiltIn/Model.elm +++ b/client/src/elm/MassiveDecks/Card/Source/BuiltIn/Model.elm @@ -1,8 +1,21 @@ -module MassiveDecks.Card.Source.BuiltIn.Model exposing (Id(..)) +module MassiveDecks.Card.Source.BuiltIn.Model exposing + ( Deck + , Id + , Info + , fromString + , hardcoded + , idDecoder + , toString + ) {-| Models for the built-in source. -} +import Json.Decode as Json +import List.Extra as List +import MassiveDecks.Strings.Languages.Model exposing (Language) +import MassiveDecks.Util.NeList as NonEmptyList exposing (NeList) + {-| The id for a built-in deck. -} @@ -10,8 +23,56 @@ type Id = Id String -{-| Create an id from a string. +{-| Information about the source from the server. -} -playCode : String -> Id -playCode string = - string |> Id +type alias Info = + { decks : NeList Deck } + + +{-| Information about a deck. +-} +type alias Deck = + { name : String + , id : Id + , language : Language + , author : String + , translator : Maybe String + } + + +{-| Get an id from a string. +-} +fromString : Maybe Info -> String -> Maybe Id +fromString builtInInfo stringId = + let + matching got deck = + case deck.id of + Id str -> + str == got + + internal { decks } = + decks |> NonEmptyList.toList |> List.find (matching stringId) |> Maybe.map .id + in + builtInInfo |> Maybe.andThen internal + + +{-| Allows you to hard-code an Id for a deck. This means that the client and server could end up out of sync if the id +doesn't actually exist. +-} +hardcoded : String -> Id +hardcoded = + Id + + +{-| A decoder for ids. +-} +idDecoder : Json.Decoder Id +idDecoder = + Json.string |> Json.map Id + + +{-| Convert an Id to it's string representation. +-} +toString : Id -> String +toString (Id str) = + str diff --git a/client/src/elm/MassiveDecks/Card/Source/Cardcast.elm b/client/src/elm/MassiveDecks/Card/Source/Cardcast.elm index 8ca7ea9..0898111 100644 --- a/client/src/elm/MassiveDecks/Card/Source/Cardcast.elm +++ b/client/src/elm/MassiveDecks/Card/Source/Cardcast.elm @@ -6,18 +6,18 @@ module MassiveDecks.Card.Source.Cardcast exposing import Html as Html exposing (Html) import Html.Attributes as HtmlA import Html.Events as HtmlE +import Json.Decode as Json import MassiveDecks.Card.Source.Cardcast.Model exposing (..) import MassiveDecks.Card.Source.Methods as Source import MassiveDecks.Card.Source.Model as Source exposing (Source) import MassiveDecks.Components.Form.Message as Message exposing (Message) import MassiveDecks.Model exposing (..) -import MassiveDecks.Pages.Lobby.Configure.Decks.Model as Decks exposing (DeckOrError) +import MassiveDecks.Pages.Lobby.Configure.Decks.Model exposing (DeckOrError) import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Maybe as Maybe +import Material.TextField as TextField import Url.Builder as Url -import Weightless as Wl -import Weightless.Attributes as WlA methods : PlayCode -> Source.ExternalMethods msg @@ -47,9 +47,9 @@ generalMethods = {- Private -} -id : () -> String +id : () -> Source.General id () = - "Cardcast" + Source.GCardcast name : () -> MdString @@ -58,7 +58,7 @@ name () = empty : Shared -> Source.External -empty shared = +empty _ = "" |> playCode |> Source.Cardcast @@ -81,23 +81,14 @@ problems (PlayCode pc) () = [] -editor : PlayCode -> Shared -> List DeckOrError -> (Source.External -> msg) -> Html msg -editor (PlayCode pc) shared existing update = +editor : PlayCode -> Shared -> List DeckOrError -> (Source.External -> msg) -> Maybe msg -> msg -> Html msg +editor (PlayCode pc) shared existing update submit noOp = let notAlreadyInGame potential = case potential of Source.Cardcast playCode -> let - notSameDeck deckOrError = - let - source = - case deckOrError of - Decks.D d -> - d.source - - Decks.E e -> - e.source - in + notSameDeck { source } = equals playCode source |> not in playCode |> Maybe.justIf (existing |> List.all notSameDeck) @@ -111,14 +102,16 @@ editor (PlayCode pc) shared existing update = Html.div [ HtmlA.class "primary" ] [ Html.datalist [ HtmlA.id "cardcast-recent-decks" ] (shared.settings.settings.recentDecks |> List.filterMap notAlreadyInGame |> List.map recentDeck) - , Wl.textField - [ HtmlA.value pc - , WlA.outlined - , WlA.list "cardcast-recent-decks" + , TextField.view shared + Strings.CardcastPlayCode + TextField.Text + pc + [ HtmlA.list "cardcast-recent-decks" , HtmlE.onInput (playCode >> Source.Cardcast >> update) - , Strings.CardcastPlayCode |> Lang.label shared + , HtmlE.keyCode + |> Json.map (\k -> submit |> Maybe.andThen (Maybe.justIf (k == 13)) |> Maybe.withDefault noOp) + |> HtmlE.on "keydown" ] - [ Html.span [ WlA.textFieldSlot WlA.BeforeText ] [ logoInternal ] ] ] @@ -126,12 +119,19 @@ details : PlayCode -> Shared -> Source.Details details (PlayCode pc) shared = { name = (() |> name |> Lang.string shared) ++ " " ++ pc , url = Just (Url.crossOrigin "https://www.cardcastgame.com" [ "browse", "deck", pc ] []) + , author = Nothing + , translator = Nothing + , language = Nothing } -tooltip : PlayCode -> Shared -> Maybe ( String, Html msg ) -tooltip (PlayCode pc) _ = - ( "cardcast-" ++ pc, Html.span [] [ logoInternal, Html.text pc ] ) |> Just +tooltip : PlayCode -> (String -> List (Html msg) -> Html msg) -> Maybe ( String, Html msg ) +tooltip (PlayCode pc) tooltipRender = + let + forId = + "cardcast-" ++ pc + in + ( forId, [ Html.p [ HtmlA.class "play-code" ] [ logoInternal, Html.text pc ] ] |> tooltipRender forId ) |> Just logo : () -> Maybe (Html msg) diff --git a/client/src/elm/MassiveDecks/Card/Source/Custom.elm b/client/src/elm/MassiveDecks/Card/Source/Custom.elm index be20e04..1be9982 100644 --- a/client/src/elm/MassiveDecks/Card/Source/Custom.elm +++ b/client/src/elm/MassiveDecks/Card/Source/Custom.elm @@ -14,6 +14,9 @@ methods = \shared -> { name = name shared , url = Nothing + , translator = Nothing + , author = Nothing + , language = Nothing } , tooltip = \_ -> Nothing } diff --git a/client/src/elm/MassiveDecks/Card/Source/Fake.elm b/client/src/elm/MassiveDecks/Card/Source/Fake.elm index c4f133a..f427e77 100644 --- a/client/src/elm/MassiveDecks/Card/Source/Fake.elm +++ b/client/src/elm/MassiveDecks/Card/Source/Fake.elm @@ -13,6 +13,9 @@ methods name = \_ -> { name = name |> Maybe.withDefault "" , url = Nothing + , author = Nothing + , translator = Nothing + , language = Nothing } , tooltip = \_ -> Nothing } diff --git a/client/src/elm/MassiveDecks/Card/Source/Methods.elm b/client/src/elm/MassiveDecks/Card/Source/Methods.elm index 0e39a6f..8a203c6 100644 --- a/client/src/elm/MassiveDecks/Card/Source/Methods.elm +++ b/client/src/elm/MassiveDecks/Card/Source/Methods.elm @@ -74,7 +74,7 @@ type alias ExternalGeneralMethods msg = -} type alias IsSpecific general msg = { general - | tooltip : Shared -> Maybe ( String, Html msg ) + | tooltip : (String -> List (Html msg) -> Html msg) -> Maybe ( String, Html msg ) , defaultDetails : Shared -> Details } @@ -83,7 +83,7 @@ type alias IsSpecific general msg = -} type alias IsSpecificExternal general msg = { general - | editor : Shared -> List DeckOrError -> (External -> msg) -> Html msg + | editor : Shared -> List DeckOrError -> (External -> msg) -> Maybe msg -> msg -> Html msg , equals : External -> Bool , problems : () -> List (Message msg) } @@ -94,5 +94,5 @@ type alias IsSpecificExternal general msg = type alias IsGeneralExternal rest = { rest | empty : Shared -> External - , id : () -> String + , id : () -> General } diff --git a/client/src/elm/MassiveDecks/Card/Source/Model.elm b/client/src/elm/MassiveDecks/Card/Source/Model.elm index 6547dcb..6fdf60b 100644 --- a/client/src/elm/MassiveDecks/Card/Source/Model.elm +++ b/client/src/elm/MassiveDecks/Card/Source/Model.elm @@ -1,16 +1,27 @@ module MassiveDecks.Card.Source.Model exposing - ( BuiltInDeck - , BuiltInInfo - , Details + ( Details , External(..) + , General(..) , Info , LoadFailureReason(..) , Source(..) , Summary + , generalDecoder + , generalFromString + , generalToString ) +import Json.Decode as Json import MassiveDecks.Card.Source.BuiltIn.Model as BuiltIn import MassiveDecks.Card.Source.Cardcast.Model as Cardcast +import MassiveDecks.Strings.Languages.Model exposing (Language) + + +{-| A representation of a source in general terms, not a specific deck. +-} +type General + = GBuiltIn + | GCardcast {-| Details on where game data came from. @@ -53,6 +64,9 @@ type alias Summary = type alias Details = { name : String , url : Maybe String + , author : Maybe String + , language : Maybe Language + , translator : Maybe String } @@ -66,14 +80,49 @@ type LoadFailureReason {-| Information about what sources are available from the server. -} type alias Info = - { builtIn : Maybe BuiltInInfo + { builtIn : Maybe BuiltIn.Info , cardcast : Bool } -type alias BuiltInInfo = - { decks : List BuiltInDeck } +{-| Get a string name from a general source. +-} +generalToString : General -> String +generalToString source = + case source of + GBuiltIn -> + "BuiltIn" + + GCardcast -> + "Cardcast" -type alias BuiltInDeck = - { name : String, id : BuiltIn.Id } +{-| Get a general source by a string name. +-} +generalFromString : String -> Maybe General +generalFromString sourceName = + case sourceName of + "BuiltIn" -> + Just GBuiltIn + + "Cardcast" -> + Just GCardcast + + _ -> + Nothing + + +{-| A Json decoder for general sources. +-} +generalDecoder : Json.Decoder General +generalDecoder = + let + internal name = + case generalFromString name of + Just general -> + Json.succeed general + + Nothing -> + Json.fail ("Unknown source '" ++ name ++ "'.") + in + Json.string |> Json.andThen internal diff --git a/client/src/elm/MassiveDecks/Components.elm b/client/src/elm/MassiveDecks/Components.elm index dd7a416..1f95611 100644 --- a/client/src/elm/MassiveDecks/Components.elm +++ b/client/src/elm/MassiveDecks/Components.elm @@ -1,19 +1,11 @@ -module MassiveDecks.Components exposing - ( floatingActionButton - , iconButton - , iconButtonStyled - , linkButton - ) +module MassiveDecks.Components exposing (linkButton) {-| Reusable interface elements. -} -import FontAwesome.Icon as Icon exposing (Icon) import Html exposing (Html) import Html.Attributes as HtmlA import Html.Attributes.Aria as Aria -import Weightless as Wl -import Weightless.Attributes as WlA {-| Something that looks like a link but is actually a button suitable for handling events on click. @@ -21,25 +13,3 @@ import Weightless.Attributes as WlA linkButton : List (Html.Attribute msg) -> List (Html msg) -> Html msg linkButton attrs contents = Html.span (HtmlA.class "link-button" :: Aria.role "button" :: HtmlA.tabindex 0 :: attrs) contents - - -{-| A button that is just an icon. --} -iconButton : List (Html.Attribute msg) -> Icon -> Html msg -iconButton attrs icon = - iconButtonStyled attrs ( [], icon ) - - -{-| A button that is just an icon with styles on the icon. --} -iconButtonStyled : List (Html.Attribute msg) -> ( List (Html.Attribute msg), Icon ) -> Html msg -iconButtonStyled attrs ( styles, icon ) = - Wl.button (List.concat [ [ WlA.fab, WlA.inverted, WlA.flat ], attrs ]) [ Icon.viewStyled styles icon ] - - -{-| A circular button designed to be the primary action on a page. -Only one of these should exist on screen at any time. --} -floatingActionButton : List (Html.Attribute msg) -> Icon -> Html msg -floatingActionButton attrs icon = - Wl.button (List.concat [ [ WlA.fab ], attrs ]) [ Icon.viewIcon icon ] diff --git a/client/src/elm/MassiveDecks/Components/Form/Message.elm b/client/src/elm/MassiveDecks/Components/Form/Message.elm index e0f4f7e..9fa885c 100644 --- a/client/src/elm/MassiveDecks/Components/Form/Message.elm +++ b/client/src/elm/MassiveDecks/Components/Form/Message.elm @@ -5,6 +5,7 @@ module MassiveDecks.Components.Form.Message exposing , error , errorWithFix , info + , infoWithFix , mdError , none , view @@ -16,12 +17,12 @@ import FontAwesome.Icon as Icon exposing (Icon) import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE -import MassiveDecks.Components as Components import MassiveDecks.Model exposing (..) import MassiveDecks.Models.MdError as MdError exposing (MdError) import MassiveDecks.Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.NeList as NeList exposing (NeList(..)) +import Material.IconButton as IconButton import Svg.Attributes as Svg @@ -56,6 +57,15 @@ info mdString = } +infoWithFix : MdString -> List (Fix msg) -> Message msg +infoWithFix mdString fixes = + Just + { severity = Info + , description = mdString + , fixes = fixes + } + + warning : MdString -> Message msg warning mdString = Just @@ -127,10 +137,4 @@ internalMessage shared { severity, description, fixes } = viewFix : Shared -> Fix msg -> Html msg viewFix shared { icon, description, action } = - Html.li [] - [ Components.iconButton - [ action |> HtmlE.onClick - , description |> Lang.title shared - ] - icon - ] + Html.li [] [ IconButton.view shared description (icon |> Icon.present |> NeList.just) (Just action) ] diff --git a/client/src/elm/MassiveDecks/Components/Menu.elm b/client/src/elm/MassiveDecks/Components/Menu.elm index 4d42531..8cc1ca3 100644 --- a/client/src/elm/MassiveDecks/Components/Menu.elm +++ b/client/src/elm/MassiveDecks/Components/Menu.elm @@ -1,49 +1,46 @@ module MassiveDecks.Components.Menu exposing - ( Item - , Menu - , Part(..) - , button + ( button , link + , open + , toggle , view ) -import FontAwesome.Attributes as Icon -import FontAwesome.Icon as Icon exposing (Icon) +import FontAwesome.Icon exposing (Icon) import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE +import Html.Attributes.Aria as HtmlA +import MassiveDecks.Components.Menu.Model exposing (..) import MassiveDecks.Model exposing (..) import MassiveDecks.Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Html as Html import MassiveDecks.Util.Html.Attributes as HtmlA -import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import Material.ListView as ListView +import Material.Menu as Menu -{-| A menu. +{-| Toggle the state of a menu. -} -type alias Menu msg = - List (Part msg) +toggle : State -> State +toggle state = + case state of + Open -> + Closed + + Closed -> + Open -{-| A part of a menu. +{-| Get an open state from a boolean indicating if the menu is open. -} -type Part msg - = Button Item (Maybe msg) - | Link Item (Maybe String) - | Separator - | Nothing +open : Bool -> State +open isOpen = + if isOpen then + Open - -{-| A menu item --} -type alias Item = - { icon : Icon - , text : MdString - , description : MdString - } + else + Closed {-| Convenience function for a menu button. @@ -62,28 +59,9 @@ link icon text description href = {-| Render a menu to Html. -} -view : - Shared - -> String - -> ( WlA.XOrigin, WlA.YOrigin ) - -> ( WlA.XOrigin, WlA.YOrigin ) - -> Menu msg - -> Html msg -view shared anchorId ( xAnchor, yAnchor ) ( xTransform, yTransform ) menu = - Wl.popover - (List.concat - [ [ WlA.anchor anchorId - , WlA.fixed - , WlA.anchorOpenEvents [ "click" ] - , HtmlA.id "game-menu" - , HtmlA.class "menu" - , WlA.disableFocusTrap - ] - , WlA.anchorOrigin xAnchor yAnchor - , WlA.transformOrigin xTransform yTransform - ] - ) - [ Wl.popoverCard [] [ Html.ul [] (menu |> List.map (menuItem shared)) ] ] +view : Shared -> msg -> State -> Corner -> Html msg -> Menu msg -> Html msg +view shared onClose state corner anchor menu = + Menu.view onClose state corner anchor (menu |> List.map (menuItem shared)) @@ -93,33 +71,26 @@ view shared anchorId ( xAnchor, yAnchor ) ( xTransform, yTransform ) menu = menuItem : Shared -> Part msg -> Html msg menuItem shared mi = case mi of - Button item action -> - Html.li [] - [ listItem shared item (Maybe.isJust action) (action |> Maybe.map HtmlE.onClick |> Maybe.withDefault HtmlA.nothing) - ] + Button { icon, text, description } action -> + ListView.viewItem (ListView.action action) + (Just icon) + Nothing + Nothing + [ text |> Lang.string shared |> Html.text ] - Link item href -> - Html.li [] - [ Html.blankA [ href |> Maybe.map HtmlA.href |> Maybe.withDefault HtmlA.nothing ] - [ listItem shared item (Maybe.isJust href) HtmlA.nothing ] + Link { icon, text, description } href -> + -- TODO: Deal with being disabled in a decent way. + Html.blankA [ href |> Maybe.map HtmlA.href |> Maybe.withDefault HtmlA.nothing ] + [ ListView.viewItem + ListView.Link + (Just icon) + Nothing + Nothing + [ text |> Lang.string shared |> Html.text ] ] Separator -> - Html.li [] [ Html.hr [] [] ] + Html.li [ HtmlA.attribute "divider" "divider", HtmlA.role "separator" ] [] - Nothing -> + Ignore -> Html.nothing - - -listItem : Shared -> Item -> Bool -> Html.Attribute msg -> Html msg -listItem shared { icon, text, description } enabled attr = - Wl.listItem - [ description |> Lang.title shared - , WlA.clickable |> Maybe.justIf enabled |> Maybe.withDefault WlA.disabled - , attr - ] - [ Icon.viewStyled [ WlA.listItemSlot WlA.BeforeItem, Icon.fw ] icon - - -- We have an icon already, so we don't want to enhance this. - , text |> Lang.string shared |> Html.text - ] diff --git a/client/src/elm/MassiveDecks/Components/Menu/Model.elm b/client/src/elm/MassiveDecks/Components/Menu/Model.elm new file mode 100644 index 0000000..db90dce --- /dev/null +++ b/client/src/elm/MassiveDecks/Components/Menu/Model.elm @@ -0,0 +1,54 @@ +module MassiveDecks.Components.Menu.Model exposing + ( Corner(..) + , Item + , Menu + , Part(..) + , State(..) + ) + +import FontAwesome.Icon exposing (Icon) +import MassiveDecks.Strings exposing (MdString) + + +{-| A menu. +-} +type alias Menu msg = + List (Part msg) + + +{-| A part of a menu. +-} +type Part msg + = Button Item (Maybe msg) + | Link Item (Maybe String) + | Separator + | Ignore + + +{-| A menu item +-} +type alias Item = + { icon : Icon + , text : MdString + , description : MdString + } + + +{-| The corner of the anchor element the menu should position itself at. +-} +type Corner + = TopLeft + | TopRight + | BottomLeft + | BottomRight + | TopStart + | TopEnd + | BottomStart + | BottomEnd + + +{-| If the menu is visible or not. +-} +type State + = Open + | Closed diff --git a/client/src/elm/MassiveDecks/Error.elm b/client/src/elm/MassiveDecks/Error.elm index e59bd79..013254a 100644 --- a/client/src/elm/MassiveDecks/Error.elm +++ b/client/src/elm/MassiveDecks/Error.elm @@ -16,8 +16,6 @@ import MassiveDecks.Strings.Languages.Model as Lang exposing (Language) import MassiveDecks.Util.Html as Html import MassiveDecks.Version exposing (version) import Url.Builder -import Weightless as Wl -import Weightless.Attributes as WlA {-| A view of an error. @@ -28,32 +26,31 @@ view shared route error = model = render error - report = + rawReport = model.details |> Maybe.map (body shared route model.description) - reportView = - report |> Maybe.map (viewReport shared) |> Maybe.withDefault [] + ( report, link ) = + rawReport |> Maybe.map (viewReport shared) |> Maybe.withDefault ( Html.nothing, Html.nothing ) in - Wl.expansion - [ WlA.name "errors" - , HtmlA.class "error" - , HtmlA.disabled (report == Nothing) - , WlA.noRipple (report == Nothing) + Html.div + [ HtmlA.class "error" ] + [ Html.div [ HtmlA.class "header" ] + [ Html.span [ HtmlA.class "title" ] [ Strings.Error |> Lang.html shared ] + , Html.span [ HtmlA.class "description" ] [ model.description |> Lang.html shared ] + , link + ] + , report ] - (Html.span [ HtmlA.class "title", WlA.expansionSlot WlA.ETitle ] [ Strings.Error |> Lang.html shared ] - :: Html.span [ HtmlA.class "description", WlA.expansionSlot WlA.EDescription ] [ model.description |> Lang.html shared ] - :: reportView - ) {-| A view of an MdError. -} viewSpecific : Shared -> MdError -> Html msg viewSpecific shared error = - Wl.expansion - [ WlA.name "errors", HtmlA.class "error", HtmlA.attribute "open" "open" ] - [ Html.span [ HtmlA.class "title", WlA.expansionSlot WlA.ETitle ] [ Strings.Error |> Lang.html shared ] - , Html.span [ WlA.expansionSlot WlA.EDescription ] [ error |> MdError.shortDescribe |> Lang.html shared ] + Html.div + [ HtmlA.class "error" ] + [ Html.span [ HtmlA.class "title" ] [ Strings.Error |> Lang.html shared ] + , Html.span [] [ error |> MdError.shortDescribe |> Lang.html shared ] , Html.p [] [ error |> MdError.describe |> Lang.html shared ] ] @@ -62,7 +59,7 @@ viewSpecific shared error = {- Private -} -viewReport : Shared -> String -> List (Html msg) +viewReport : Shared -> String -> ( Html msg, Html msg ) viewReport shared report = let github = @@ -77,15 +74,13 @@ viewReport shared report = ++ report url = - Url.Builder.crossOrigin github path [ Url.Builder.string "body" reportBody ] + Url.Builder.crossOrigin github path [ reportBody |> String.left 1950 |> Url.Builder.string "body" ] in - [ Html.div [ HtmlA.class "report" ] - [ Wl.textArea [ HtmlA.class "body", WlA.readonly, WlA.value report ] [] - , Html.span [ HtmlA.class "link" ] - [ Html.blankA [ HtmlA.href url ] [ Strings.ReportError |> Lang.html shared ] - ] + ( Html.textarea [ HtmlA.class "report", HtmlA.readonly True, HtmlA.value report ] [] + , Html.span [ HtmlA.class "link" ] + [ Html.blankA [ HtmlA.href url ] [ Strings.ReportError |> Lang.html shared ] ] - ] + ) body : Shared -> Route -> MdString -> String -> String diff --git a/client/src/elm/MassiveDecks/Error/Overlay.elm b/client/src/elm/MassiveDecks/Error/Overlay.elm index a8a1991..4c2ad89 100644 --- a/client/src/elm/MassiveDecks/Error/Overlay.elm +++ b/client/src/elm/MassiveDecks/Error/Overlay.elm @@ -1,10 +1,9 @@ module MassiveDecks.Error.Overlay exposing (init, update, view) +import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE -import MassiveDecks.Components as Components import MassiveDecks.Error as Error import MassiveDecks.Error.Messages exposing (..) import MassiveDecks.Error.Model as Error exposing (Error) @@ -13,7 +12,9 @@ import MassiveDecks.Model exposing (Shared) import MassiveDecks.Pages.Route exposing (Route) import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang -import Weightless as Wl +import MassiveDecks.Util.NeList as NeList exposing (NeList(..)) +import Material.Card as Card +import Material.IconButton as IconButton init : Error.Overlay @@ -29,20 +30,16 @@ view shared route model = else [ Html.div [ HtmlA.class "error-overlay" ] [ Html.div [ HtmlA.class "actions" ] - [ Components.iconButton - [ HtmlA.class "close" - , Clear |> Global.ErrorMsg |> HtmlE.onClick - , Strings.Close |> Lang.title shared - ] - Icon.times - , Components.iconButton - [ HtmlA.class "refresh" - , Global.Refresh |> HtmlE.onClick - , Strings.Refresh |> Lang.title shared - ] - Icon.redo + [ IconButton.view shared + Strings.Close + (Icon.times |> Icon.present |> NeList.just) + (Clear |> Global.ErrorMsg |> Just) + , IconButton.view shared + Strings.Refresh + (Icon.redo |> Icon.present |> NeList.just) + (Just Global.Refresh) ] - , Wl.card [ HtmlA.class "help" ] + , Card.view [ HtmlA.class "help" ] [ Html.h3 [] [ Lang.html shared Strings.ErrorHelpTitle ] , Html.p [] [ Lang.html shared Strings.ErrorHelp ] ] diff --git a/client/src/elm/MassiveDecks/Game.elm b/client/src/elm/MassiveDecks/Game.elm index 0d14691..cc952c6 100644 --- a/client/src/elm/MassiveDecks/Game.elm +++ b/client/src/elm/MassiveDecks/Game.elm @@ -9,7 +9,9 @@ module MassiveDecks.Game exposing ) import Browser.Dom as Dom +import Browser.Events as Browser import Dict exposing (Dict) +import FontAwesome.Attributes as Icon import FontAwesome.Icon as Icon exposing (Icon) import FontAwesome.Solid as Icon import Html exposing (Html) @@ -39,18 +41,23 @@ import MassiveDecks.Notifications as Notifications import MassiveDecks.Pages.Lobby.Actions as Actions import MassiveDecks.Pages.Lobby.Configure.Model exposing (Config) import MassiveDecks.Pages.Lobby.Events as Events exposing (Event) +import MassiveDecks.Pages.Lobby.Messages as Lobby import MassiveDecks.Pages.Lobby.Model as Lobby exposing (Lobby) +import MassiveDecks.Pages.Lobby.Route as Lobby +import MassiveDecks.Ports as Ports import MassiveDecks.Speech as Speech import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.User as User exposing (User) import MassiveDecks.Util.Html as Html import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList as NeList +import Material.Button as Button +import Material.Card as Card +import Material.IconButton as IconButton +import Material.LinearProgress as LinearProgress import Set exposing (Set) import Task -import Weightless as Wl -import Weightless.Attributes as WlA -import Weightless.ProgressBar as ProgressBar init : (Msg -> msg) -> Game -> List Card.Response -> Round.Pick -> ( Model, Cmd msg ) @@ -299,6 +306,12 @@ update wrap shared msg model = EnforceTimeLimit -> ( model, Actions.enforceTimeLimit (model.game.round |> Round.data |> .id) (model.game.round |> Round.stage) ) + ToggleHelp -> + ( { model | helpVisible = not model.helpVisible }, Cmd.none ) + + Confetti -> + ( { model | confetti = True }, Ports.startConfetti confettiId ) + NoOp -> ( model, Cmd.none ) @@ -308,37 +321,47 @@ subscriptions wrap anchor model = let ( startedAt, maybeLimitSeconds, timedOut ) = roundTimeDetails model.game - in - if timedOut || model.game.winner /= Nothing then - Sub.none - else - case maybeLimitSeconds of - Nothing -> + timerSub = + if timedOut || model.game.winner /= Nothing then Sub.none - Just limitSeconds -> - case model.time of - Just time -> - let - left = - timeLeft anchor startedAt time limitSeconds - in - if left < 0 then - Sub.none - - else if left > showProgressBarForLast then - Time.every 500 (UpdateTimer >> wrap) - - else - Time.animate (UpdateTimer >> wrap) - + else + case maybeLimitSeconds of Nothing -> - Time.animate (UpdateTimer >> wrap) + Sub.none + + Just limitSeconds -> + case model.time of + Just time -> + let + left = + timeLeft anchor startedAt time limitSeconds + in + if left < 0 then + Sub.none + + else if left > showProgressBarForLast then + Time.every 500 (UpdateTimer >> wrap) + + else + Time.animate (UpdateTimer >> wrap) + + Nothing -> + Time.animate (UpdateTimer >> wrap) + + confettiSub = + if model.game.winner /= Nothing && not model.confetti then + Browser.onAnimationFrame (Confetti |> wrap |> always) + + else + Sub.none + in + Sub.batch [ timerSub, confettiSub ] -view : (Msg -> msg) -> Shared -> Lobby.Auth -> Time.Anchor -> String -> Config -> Dict User.Id User -> Model -> Html msg -view wrap shared auth timeAnchor name config users model = +view : (Lobby.Msg -> msg) -> (Msg -> msg) -> Shared -> Lobby.Auth -> Time.Anchor -> String -> Config -> Dict User.Id User -> Model -> Html msg +view wrapLobby wrap shared auth timeAnchor name config users model = let overlay = if model.game.players |> Dict.get auth.claims.uid |> Maybe.map (\p -> p.presence == Player.Away) |> Maybe.withDefault False then @@ -357,7 +380,7 @@ view wrap shared auth timeAnchor name config users model = else case model.game.winner of Just winners -> - viewWinner shared users winners + viewWinner wrapLobby shared users auth.claims.uid winners Nothing -> viewRound wrap shared auth timeAnchor config users model @@ -687,7 +710,7 @@ applyGameEvent wrap wrapEvent auth shared gameEvent model = game = model.game in - ( { model | game = { game | winner = Just winner } }, Cmd.none ) + ( { model | game = { game | winner = Just winner }, confetti = False }, Cmd.none ) applyGameStarted : (Msg -> msg) -> Lobby -> Round.Playing -> List Card.Response -> ( Model, Cmd msg ) @@ -748,12 +771,34 @@ updateLikes plays uid player = |> Maybe.withDefault player -viewWinner : Shared -> Dict User.Id User -> Set User.Id -> List (Html msg) -viewWinner shared users winners = - [ Wl.card [ HtmlA.id "game-winner" ] +confettiId : String +confettiId = + "win-confetti-overlay" + + +viewWinner : (Lobby.Msg -> msg) -> Shared -> Dict User.Id User -> User.Id -> Set User.Id -> List (Html msg) +viewWinner wrapLobby shared users localUser winners = + let + configureNextGame = + if users |> Dict.get localUser |> Maybe.map (.privilege >> (==) User.Privileged) |> Maybe.withDefault False then + Button.view shared + Button.Raised + Strings.ConfigureNextGame + Strings.ConfigureNextGame + (Icon.cog |> Icon.viewIcon) + [ HtmlA.id "new-game-config" + , Lobby.Configure |> Just |> Lobby.ChangeSection |> wrapLobby |> HtmlE.onClick + ] + + else + Html.nothing + in + [ Card.view [ HtmlA.id "game-winner" ] [ Html.span [] [ Icon.trophy |> Icon.viewIcon ] , Html.ul [] (winners |> Set.toList |> List.map (viewWinnerListItem shared users)) ] + , configureNextGame + , Html.canvas [ HtmlA.id confettiId ] [] ] @@ -798,16 +843,16 @@ viewRound wrap shared auth timeAnchor config users model = renderedCall = call |> Call.viewFilled shared config Card.Front [] parts - - { bar, countdown } = - timer timeAnchor model in [ Html.div [ HtmlA.id "top-content" ] - [ bar |> Maybe.withDefault Html.nothing - , Html.div [ HtmlA.class "top-row" ] - [ minorActions wrap shared auth game instruction - , countdown |> Maybe.withDefault Html.nothing - ] + [ case instruction |> Maybe.andThen (Maybe.justIf model.helpVisible) of + Just i -> + Card.view [ HtmlA.class "help" ] [ Icon.questionCircle |> Icon.viewIcon, i |> Lang.html shared ] + + Nothing -> + Html.nothing + , timer timeAnchor model + , Html.div [ HtmlA.class "top-row" ] [ minorActions wrap shared auth game model.helpVisible ] ] , Html.div [ HtmlA.class "round" ] [ renderedCall, viewAction wrap shared action ] , content @@ -815,41 +860,27 @@ viewRound wrap shared auth timeAnchor config users model = -- TODO: Hide this when at top. Waiting on native elm scroll events, as currently we'd have to ping constantly. , Html.div [ HtmlA.class "scroll-top" ] - [ Wl.button - [ WlA.flat - , WlA.fab - , WlA.inverted - , ScrollToTop |> wrap |> HtmlE.onClick - ] - [ Icon.viewIcon Icon.arrowUp ] - ] + [ IconButton.view shared Strings.ScrollToTop (Icon.arrowUp |> Icon.present |> NeList.just) (ScrollToTop |> wrap |> Just) ] ] -help : Shared -> MdString -> Html msg -help shared instruction = +toggleHelp : (Msg -> msg) -> Shared -> Bool -> Html msg +toggleHelp wrap shared enabled = let - id = - "context-help-button" + extra = + if enabled then + [ Icon.slash |> Icon.present |> Icon.styled [ Icon.fw ] ] - helpContent = - [ Components.iconButton - [ HtmlA.id id, Strings.ViewHelpAction |> Lang.title shared ] - Icon.question - , Wl.popover - (List.concat - [ WlA.anchorOrigin WlA.XCenter WlA.YBottom - , WlA.transformOrigin WlA.XLeft WlA.YTop - , [ WlA.anchor id, WlA.fixed, WlA.anchorOpenEvents [ "click" ] ] - ] - ) - [ Wl.popoverCard [] [ instruction |> Lang.html shared ] ] - ] + else + [] + + icon = + Icon.question |> Icon.present |> Icon.styled [ Icon.fw ] |> NeList.just |> NeList.extend extra in - Html.div [ HtmlA.id "context-help" ] helpContent + IconButton.view shared Strings.ViewHelpAction icon (ToggleHelp |> wrap |> Just) -timer : Time.Anchor -> Model -> { bar : Maybe (Html msg), countdown : Maybe (Html msg) } +timer : Time.Anchor -> Model -> Html msg timer timeAnchor model = let ( startedAt, limit, timedOut ) = @@ -862,10 +893,10 @@ timer timeAnchor model = else Maybe.map2 (timeLeft timeAnchor startedAt) model.time limit in - left |> Maybe.map timerInternal |> Maybe.withDefault { bar = Nothing, countdown = Nothing } + left |> Maybe.andThen timerInternal |> Maybe.withDefault (Html.div [ HtmlA.id "timer" ] []) -timerInternal : Int -> { bar : Maybe (Html msg), countdown : Maybe (Html msg) } +timerInternal : Int -> Maybe (Html msg) timerInternal leftInt = let last = @@ -873,20 +904,18 @@ timerInternal leftInt = left = leftInt |> toFloat - - progressBar = - (1 - (last - left) / last) - |> timerProgressBar in - { bar = progressBar - , countdown = Just (Html.div [ HtmlA.id "time-left" ] [ max 0 left / 1000 |> ceiling |> String.fromInt |> Html.text ]) - } + (1 - (last - left) / last) |> timerProgressBar timerProgressBar : Float -> Maybe (Html msg) timerProgressBar proportion = if proportion < 1 then - ProgressBar.determinate (min 1 (max 0 proportion)) [ HtmlA.id "timer" ] |> Just + let + progress = + proportion |> max 0 |> LinearProgress.Progress + in + LinearProgress.view progress [ HtmlA.id "timer" ] |> Just else Nothing @@ -894,7 +923,7 @@ timerProgressBar proportion = showProgressBarForLast : Int showProgressBarForLast = - 20000 + 15000 timeLeft : Time.Anchor -> Time -> Time -> Int -> Int @@ -929,8 +958,8 @@ roundTimeDetails game = ( complete.startedAt, Nothing, False ) -minorActions : (Msg -> msg) -> Shared -> Lobby.Auth -> Game -> Maybe MdString -> Html msg -minorActions wrap shared auth game instruction = +minorActions : (Msg -> msg) -> Shared -> Lobby.Auth -> Game -> Bool -> Html msg +minorActions wrap shared auth game helpEnabled = let localPlayer = game.players |> Dict.get auth.claims.uid @@ -940,11 +969,10 @@ minorActions wrap shared auth game instruction = enforceTimeLimit = if timedOut && game.rules.timeLimits.mode == Rules.Soft then - Components.iconButton - [ Strings.EnforceTimeLimitAction |> Lang.title shared - , EnforceTimeLimit |> wrap |> HtmlE.onClick - ] - Icon.forward + IconButton.view shared + Strings.EnforceTimeLimitAction + (Icon.forward |> Icon.present |> NeList.just) + (EnforceTimeLimit |> wrap |> Just) |> Just else @@ -953,7 +981,7 @@ minorActions wrap shared auth game instruction = Html.div [ HtmlA.id "minor-actions" ] (List.filterMap identity [ Just (historyButton wrap shared) - , instruction |> Maybe.map (help shared) + , Just (toggleHelp wrap shared helpEnabled) , Maybe.map2 (\score -> \reboot -> rebootButton wrap shared score reboot) (localPlayer |> Maybe.map .score) game.rules.houseRules.reboot @@ -964,24 +992,26 @@ minorActions wrap shared auth game instruction = historyButton : (Msg -> msg) -> Shared -> Html msg historyButton wrap shared = - Components.iconButton - [ HtmlA.id "history-button" - , Strings.ViewGameHistoryAction |> Lang.title shared - , ToggleHistoryView |> wrap |> HtmlE.onClick - ] - Icon.history + IconButton.view shared + Strings.ViewGameHistoryAction + (Icon.history |> Icon.present |> NeList.just) + (ToggleHistoryView |> wrap |> Just) rebootButton : (Msg -> msg) -> Shared -> Int -> Rules.Reboot -> Html msg rebootButton wrap shared score reboot = - Components.iconButton - [ HtmlA.id "redraw" - , { cost = reboot.cost } |> Strings.HouseRuleRebootAction |> Lang.title shared - , WlA.disabled - |> Maybe.justIf (score < reboot.cost) - |> Maybe.withDefault (Redraw |> wrap |> HtmlE.onClick) - ] - Icon.random + let + action = + if score < reboot.cost then + Nothing + + else + Redraw |> wrap |> Just + in + IconButton.view shared + ({ cost = reboot.cost } |> Strings.HouseRuleRebootAction) + (Icon.random |> Icon.present |> NeList.just) + action viewAction : (Msg -> msg) -> Shared -> Maybe Action -> Html msg diff --git a/client/src/elm/MassiveDecks/Game/Action.elm b/client/src/elm/MassiveDecks/Game/Action.elm index 14dc39d..218e331 100644 --- a/client/src/elm/MassiveDecks/Game/Action.elm +++ b/client/src/elm/MassiveDecks/Game/Action.elm @@ -1,17 +1,14 @@ module MassiveDecks.Game.Action exposing (actions, view) -import FontAwesome.Icon exposing (Icon) +import FontAwesome.Icon as Icon exposing (Icon) import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE -import MassiveDecks.Components as Components import MassiveDecks.Game.Action.Model exposing (..) import MassiveDecks.Game.Messages as Game exposing (Msg) import MassiveDecks.Model exposing (..) import MassiveDecks.Strings as Strings exposing (MdString) -import MassiveDecks.Strings.Languages as Lang -import Weightless.Attributes as WlA +import Material.Fab as Fab actions : List Action @@ -23,14 +20,14 @@ actions = -} blocking : List (Html.Attribute msg) blocking = - [ HtmlA.class "important" ] + [ HtmlA.class "blocking" ] {-| Style for an action that doesn't block the game. -} normal : List (Html.Attribute msg) normal = - [ WlA.inverted, WlA.outlined ] + [ HtmlA.class "normal" ] view : (Msg -> msg) -> Shared -> Maybe Action -> Action -> Html msg @@ -53,16 +50,12 @@ view wrap shared visible action = Advance -> IconView Icon.forward blocking Strings.AdvanceRound Game.AdvanceRound in - Components.floatingActionButton - (List.concat - [ [ title |> Lang.title shared - , onClick |> wrap |> HtmlE.onClick - , HtmlA.classList [ ( "action", True ), ( "exited", visible /= Just action ) ] - ] - , attrs - ] - ) - icon + Fab.view shared + Fab.Normal + title + (icon |> Icon.present) + (onClick |> wrap |> Just) + (HtmlA.classList [ ( "action", True ), ( "exited", visible /= Just action ) ] :: attrs) type alias IconView msg = diff --git a/client/src/elm/MassiveDecks/Game/History.elm b/client/src/elm/MassiveDecks/Game/History.elm index 8f33108..32288b8 100644 --- a/client/src/elm/MassiveDecks/Game/History.elm +++ b/client/src/elm/MassiveDecks/Game/History.elm @@ -1,37 +1,35 @@ module MassiveDecks.Game.History exposing (view) import Dict exposing (Dict) +import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE import Html.Keyed as HtmlK import MassiveDecks.Card.Call as Call import MassiveDecks.Card.Model as Card import MassiveDecks.Card.Play as Play import MassiveDecks.Card.Response as Response -import MassiveDecks.Components as Components import MassiveDecks.Game.Messages exposing (Msg(..)) import MassiveDecks.Game.Round as Round import MassiveDecks.Game.Round.Plays as Plays import MassiveDecks.Model exposing (Shared) import MassiveDecks.Pages.Lobby.Configure.Model exposing (Config) import MassiveDecks.Strings as Strings -import MassiveDecks.Strings.Languages as Lang import MassiveDecks.User as User exposing (User) import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList as NeList +import Material.IconButton as IconButton view : (Msg -> msg) -> Shared -> Config -> Dict User.Id User -> String -> List Round.Complete -> List (Html msg) view wrap shared config users name history = [ Html.div [ HtmlA.id "top-content" ] [ Html.div [ HtmlA.id "minor-actions" ] - [ Components.iconButton - [ HtmlA.id "return-to-game-button" - , Strings.ViewGameHistoryAction |> Lang.title shared - , ToggleHistoryView |> wrap |> HtmlE.onClick - ] - Icon.arrowLeft + [ IconButton.view shared + Strings.ViewGameHistoryAction + (Icon.arrowLeft |> Icon.present |> NeList.just) + (ToggleHistoryView |> wrap |> Just) ] ] , Html.div [ HtmlA.id "history" ] diff --git a/client/src/elm/MassiveDecks/Game/Messages.elm b/client/src/elm/MassiveDecks/Game/Messages.elm index bee61c2..e4de3ad 100644 --- a/client/src/elm/MassiveDecks/Game/Messages.elm +++ b/client/src/elm/MassiveDecks/Game/Messages.elm @@ -26,5 +26,7 @@ type Msg | SetPresence Player.Presence | SetPlayerAway User.Id | UpdateTimer Time + | ToggleHelp | EnforceTimeLimit + | Confetti | NoOp diff --git a/client/src/elm/MassiveDecks/Game/Model.elm b/client/src/elm/MassiveDecks/Game/Model.elm index 8150849..fb1d8e6 100644 --- a/client/src/elm/MassiveDecks/Game/Model.elm +++ b/client/src/elm/MassiveDecks/Game/Model.elm @@ -31,6 +31,8 @@ type alias Model = , completeRound : Maybe Round.Complete , viewingHistory : Bool , time : Maybe Time + , helpVisible : Bool + , confetti : Bool } @@ -45,6 +47,8 @@ emptyModel game = , completeRound = Nothing , viewingHistory = False , time = Nothing + , helpVisible = False + , confetti = False } diff --git a/client/src/elm/MassiveDecks/Game/Round/Playing.elm b/client/src/elm/MassiveDecks/Game/Round/Playing.elm index 8e85ffd..307c4a6 100644 --- a/client/src/elm/MassiveDecks/Game/Round/Playing.elm +++ b/client/src/elm/MassiveDecks/Game/Round/Playing.elm @@ -8,11 +8,11 @@ import Html exposing (Html) import Html.Attributes as HtmlA import Html.Events as HtmlE import Html.Keyed as HtmlK +import List.Extra as List import MassiveDecks.Card as Card import MassiveDecks.Card.Call as Call import MassiveDecks.Card.Model as Card import MassiveDecks.Card.Response as Response -import MassiveDecks.Card.Source.Model as Source import MassiveDecks.Game.Action.Model as Action import MassiveDecks.Game.Messages as Game exposing (Msg) import MassiveDecks.Game.Model exposing (..) @@ -23,7 +23,6 @@ import MassiveDecks.Pages.Lobby.Configure.Model exposing (Config) import MassiveDecks.Pages.Lobby.Model as Lobby import MassiveDecks.Strings as Strings import MassiveDecks.User as User exposing (User) -import MassiveDecks.Util.List as List import MassiveDecks.Util.Random as Random import Random import Set exposing (Set) @@ -125,7 +124,6 @@ viewHandCard wrap shared config filled picked response = viewBackgroundPlay : Shared -> PlayStyles -> Int -> Set User.Id -> User.Id -> Html msg viewBackgroundPlay shared playStyles slots played for = let - -- TODO: Move to css variable --rotation when possible. cards = playStyles |> Dict.get for @@ -140,7 +138,7 @@ viewBackgroundPlay shared playStyles slots played for = viewBackgroundPlayCard : Shared -> CardStyle -> Html msg viewBackgroundPlayCard shared playStyle = Response.viewUnknown shared - [ "rotate(" ++ String.fromFloat playStyle.rotation ++ "turn)" |> HtmlA.style "transform" + [ "--rotation: " ++ String.fromFloat playStyle.rotation ++ "turn" |> HtmlA.attribute "style" , HtmlA.class "ignore-minimal-card-size" ] diff --git a/client/src/elm/MassiveDecks/Models/Decoders.elm b/client/src/elm/MassiveDecks/Models/Decoders.elm index 2d6e1fc..cc4a6a6 100644 --- a/client/src/elm/MassiveDecks/Models/Decoders.elm +++ b/client/src/elm/MassiveDecks/Models/Decoders.elm @@ -54,27 +54,40 @@ import MassiveDecks.Speech as Speech import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Strings.Languages.Model as Lang exposing (Language) import MassiveDecks.User as User exposing (User) +import MassiveDecks.Util.NeList as NonEmptyList import Set exposing (Set) sourceInfo : Json.Decoder Source.Info sourceInfo = + let + atLeastOne info = + if [ info.builtIn /= Nothing, info.cardcast ] |> List.any identity then + info |> Json.succeed + + else + Json.fail "Must have at least one source enabled." + in Json.succeed Source.Info |> Json.optional "builtIn" (builtInInfo |> Json.map Just) Nothing |> Json.optional "cardcast" Json.bool False + |> Json.andThen atLeastOne -builtInInfo : Json.Decoder Source.BuiltInInfo +builtInInfo : Json.Decoder BuiltIn.Info builtInInfo = - Json.succeed Source.BuiltInInfo - |> Json.required "decks" (Json.list builtInDeck) + Json.succeed BuiltIn.Info + |> Json.required "decks" (NonEmptyList.decoder builtInDeck) -builtInDeck : Json.Decoder Source.BuiltInDeck +builtInDeck : Json.Decoder BuiltIn.Deck builtInDeck = - Json.succeed Source.BuiltInDeck + Json.succeed BuiltIn.Deck |> Json.required "name" Json.string - |> Json.required "id" (Json.string |> Json.map BuiltIn.Id) + |> Json.required "id" BuiltIn.idDecoder + |> Json.required "language" language + |> Json.required "author" Json.string + |> Json.optional "translator" (Json.string |> Json.map Just) Nothing unknownValue : String -> String -> Json.Decoder a @@ -194,30 +207,27 @@ sourceByName name = Json.succeed Source.Custom _ -> - externalSourceByName name |> Json.map Source.Ex + Json.field "source" Source.generalDecoder |> Json.andThen externalSourceByGeneral |> Json.map Source.Ex externalSource : Json.Decoder Source.External externalSource = - Json.field "source" Json.string |> Json.andThen externalSourceByName + Json.field "source" Source.generalDecoder |> Json.andThen externalSourceByGeneral -externalSourceByName : String -> Json.Decoder Source.External -externalSourceByName name = - case name of - "BuiltIn" -> - Json.field "id" Json.string |> Json.map (BuiltIn.Id >> Source.BuiltIn) +externalSourceByGeneral : Source.General -> Json.Decoder Source.External +externalSourceByGeneral general = + case general of + Source.GBuiltIn -> + Json.field "id" BuiltIn.idDecoder |> Json.map Source.BuiltIn - "Cardcast" -> + Source.GCardcast -> Json.field "playCode" Json.string |> Json.map (Cardcast.playCode >> Source.Cardcast) - _ -> - unknownValue "source" name - -tokenValidity : Json.Decoder (Dict Lobby.Token Bool) +tokenValidity : Json.Decoder (List Lobby.Token) tokenValidity = - Json.dict Json.bool + Json.list lobbyToken lobbyToken : Json.Decoder Lobby.Token @@ -280,7 +290,7 @@ privacyConfig = deckOrError : Json.Decoder DeckConfig.DeckOrError deckOrError = - Json.oneOf [ Json.map DeckConfig.E deckError, Json.map DeckConfig.D deck ] + Json.oneOf [ deckError |> Json.map DeckConfig.errorToDeckOrError, deck |> Json.map DeckConfig.deckToDeckOrError ] deck : Json.Decoder DeckConfig.Deck @@ -307,9 +317,12 @@ summary = details : Json.Decoder Source.Details details = - Json.map2 Source.Details - (Json.field "name" Json.string) - (Json.maybe (Json.field "url" Json.string)) + Json.succeed Source.Details + |> Json.required "name" Json.string + |> Json.optional "url" (Json.string |> Json.map Just) Nothing + |> Json.optional "author" (Json.string |> Json.map Just) Nothing + |> Json.optional "language" (language |> Json.map Just) Nothing + |> Json.optional "translator" (Json.string |> Json.map Just) Nothing rules : Json.Decoder Rules diff --git a/client/src/elm/MassiveDecks/Models/Encoders.elm b/client/src/elm/MassiveDecks/Models/Encoders.elm index c13de75..2721ab0 100644 --- a/client/src/elm/MassiveDecks/Models/Encoders.elm +++ b/client/src/elm/MassiveDecks/Models/Encoders.elm @@ -135,13 +135,13 @@ decks d = deckOrError : Decks.DeckOrError -> Json.Value -deckOrError de = - case de of - Decks.D d -> - deck d +deckOrError d = + case d.result of + Ok s -> + deck { source = d.source, summary = s } - Decks.E e -> - deckError e + Err r -> + deckError { source = d.source, reason = r } deck : Decks.Deck -> Json.Value @@ -327,8 +327,8 @@ source s = Source.Cardcast (Cardcast.PlayCode playCode) -> Json.object [ ( "source", "Cardcast" |> Json.string ), ( "playCode", playCode |> Json.string ) ] - Source.BuiltIn (BuiltIn.Id id) -> - Json.object [ ( "source", "BuiltIn" |> Json.string ), ( "id", id |> Json.string ) ] + Source.BuiltIn id -> + Json.object [ ( "source", "BuiltIn" |> Json.string ), ( "id", id |> BuiltIn.toString |> Json.string ) ] language : Language -> Json.Value diff --git a/client/src/elm/MassiveDecks/Pages/Lobby.elm b/client/src/elm/MassiveDecks/Pages/Lobby.elm index cefd80e..4ac11bc 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby.elm @@ -24,8 +24,9 @@ import MassiveDecks.Animated as Animated exposing (Animated) import MassiveDecks.Card.Model as Card import MassiveDecks.Cast.Client as Cast import MassiveDecks.Cast.Model as Cast -import MassiveDecks.Components as Components +import MassiveDecks.Components.Form.Message as Message exposing (Message) import MassiveDecks.Components.Menu as Menu +import MassiveDecks.Components.Menu.Model as Menu import MassiveDecks.Error as MdError import MassiveDecks.Error.Model as Error exposing (Error) import MassiveDecks.Game as Game @@ -59,8 +60,10 @@ import MassiveDecks.User as User exposing (User) import MassiveDecks.Util.Html as Html import MassiveDecks.Util.Html.Attributes as HtmlA import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import MassiveDecks.Util.NeList as NeList +import Material.Button as Button +import Material.Card as Card +import Material.IconButton as IconButton changeRoute : Shared -> Route -> Model -> Route.Fork ( Model, Cmd msg ) @@ -97,6 +100,8 @@ initWithAuth shared r auth = , inviteDialogOpen = False , timeAnchor = Nothing , spectate = Spectate.init + , gameMenu = Menu.Closed + , userMenu = Nothing } , ServerConnection.connect auth.claims.gc auth.token ) @@ -157,20 +162,31 @@ update wrap shared msg model = applySync wrap shared model state hand play partialTimeAnchor Events.Configured { change } -> - ( applyConfigured change model - , shared - , Cmd.none - ) + ( applyConfigured change model, shared, Cmd.none ) Events.GameStarted { round, hand } -> let - ( g, cmd ) = + ( g, gameCmd ) = Game.applyGameStarted (GameMsg >> wrap) lobby round (hand |> Maybe.withDefault []) + + r = + model.route + + changeCmd = + if r.section == Just Configure then + { r | section = Nothing } + |> Route.Lobby + |> Route.url + |> Navigation.replaceUrl shared.key + |> Just + + else + Nothing + + cmd = + [ Just gameCmd, changeCmd ] |> List.filterMap identity |> Cmd.batch in - ( Stay { model | lobby = Just { lobby | game = Just g } } - , shared - , cmd - ) + ( Stay { model | lobby = Just { lobby | game = Just g } }, shared, cmd ) Events.Game gameEvent -> let @@ -294,8 +310,11 @@ update wrap shared msg model = ErrorReceived error -> case error of - MdError.Authentication reason -> - ( AuthError model.auth.claims.gc reason, shared, Cmd.none ) + MdError.Authentication _ -> + ( JoinError model.auth.claims.gc error, shared, Cmd.none ) + + MdError.LobbyNotFound _ -> + ( JoinError model.auth.claims.gc error, shared, Cmd.none ) MdError.ActionExecution (MdError.ConfigEditConflict _) -> let @@ -374,6 +393,28 @@ update wrap shared msg model = in ( Stay { model | route = newRoute }, shared, newRoute |> Route.Lobby |> Route.url |> Navigation.replaceUrl shared.key ) + SetGameMenuState newState -> + ( Stay { model | gameMenu = newState }, shared, Cmd.none ) + + SetUserMenuState id state -> + let + old = + model.userMenu + + new = + case state of + Menu.Open -> + Just id + + Menu.Closed -> + if old /= Just id then + old + + else + Nothing + in + ( Stay { model | userMenu = new }, shared, Cmd.none ) + NoOp -> ( Stay model, shared, Cmd.none ) @@ -389,7 +430,7 @@ view wrap wrapSettings changePage shared model = let viewContent _ auth timeAnchor lobby = lobby.game - |> Maybe.map (Game.view (GameMsg >> wrap) shared auth timeAnchor lobby.config.name lobby.config lobby.users) + |> Maybe.map (Game.view wrap (GameMsg >> wrap) shared auth timeAnchor lobby.config.name lobby.config lobby.users) |> Maybe.withDefault (Html.div [] [ Strings.GameNotStartedError |> Lang.html shared ]) in viewWithUsers wrap wrapSettings shared s viewContent model @@ -434,7 +475,7 @@ section r auth lobby = type alias ViewContent msg = - Bool -> Auth -> Time.Anchor -> Lobby -> Html msg + Message msg -> Auth -> Time.Anchor -> Lobby -> Html msg viewWithUsers : (Msg -> msg) -> (Settings.Msg -> msg) -> Shared -> Section -> ViewContent msg -> Model -> List (Html msg) @@ -459,7 +500,7 @@ viewWithUsers wrap wrapSettings shared s viewContent model = castButton = castAttrs - |> Maybe.map (viewCastButton wrap model.auth) + |> Maybe.map (viewCastButton wrap shared model.auth) |> Maybe.withDefault [] usersIcon = @@ -489,12 +530,11 @@ viewWithUsers wrap wrapSettings shared s viewContent model = (Html.div [ HtmlA.id "top-bar" ] [ Html.div [ HtmlA.class "left" ] (List.concat - [ [ Components.iconButtonStyled - [ HtmlE.onClick (usersShown |> not |> Settings.ChangeOpenUserList |> wrapSettings) - , Strings.ToggleUserList |> Lang.title shared - ] - ( [ Icon.lg ], usersIcon ) - , lobbyMenu wrap shared model.route s localUser localPlayer (maybeGame |> Maybe.map .game) + [ [ IconButton.view shared + Strings.ToggleUserList + (usersIcon |> Icon.present |> Icon.styled [ Icon.lg ] |> NeList.just) + (usersShown |> not |> Settings.ChangeOpenUserList |> wrapSettings |> Just) + , lobbyMenu wrap shared model.gameMenu model.route s localUser localPlayer (maybeGame |> Maybe.map .game) ] , castButton ] @@ -503,7 +543,7 @@ viewWithUsers wrap wrapSettings shared s viewContent model = ] :: HtmlK.ol [ HtmlA.class "notifications" ] notifications :: (model.lobby - |> Maybe.map2 (viewLobby wrap shared model.auth viewContent) model.timeAnchor + |> Maybe.map2 (viewLobby wrap shared model.auth model.userMenu viewContent) model.timeAnchor |> Maybe.withDefault [ Html.div [ HtmlA.class "loading" ] [ Icon.viewStyled [ Icon.spin, Icon.fa3x ] Icon.circleNotch ] @@ -519,8 +559,8 @@ viewWithUsers wrap wrapSettings shared s viewContent model = ] -viewLobby : (Msg -> msg) -> Shared -> Auth -> ViewContent msg -> Time.Anchor -> Lobby -> List (Html msg) -viewLobby wrap shared auth viewContent timeAnchor lobby = +viewLobby : (Msg -> msg) -> Shared -> Auth -> Maybe User.Id -> ViewContent msg -> Time.Anchor -> Lobby -> List (Html msg) +viewLobby wrap shared auth openUserMenu viewContent timeAnchor lobby = let game = lobby.game |> Maybe.map .game @@ -528,12 +568,24 @@ viewLobby wrap shared auth viewContent timeAnchor lobby = privileged = (lobby.users |> Dict.get auth.claims.uid |> Maybe.map .privilege) == Just User.Privileged - canEdit = - privileged && (game |> Maybe.map (.winner >> Maybe.isJust) |> Maybe.withDefault True) + configDisabledReason = + if not privileged then + Message.info Strings.ConfigurationDisabledIfNotPrivileged + + else if game |> Maybe.map (.winner >> Maybe.isNothing) |> Maybe.withDefault False then + Message.infoWithFix Strings.ConfigurationDisabledWhileInGame + [ { description = Strings.EndGame + , icon = Icon.stopCircle + , action = wrap EndGame + } + ] + + else + Message.none in [ Html.div [ HtmlA.id "lobby-content" ] - [ viewUsers wrap shared auth.claims.uid lobby.users game - , Html.div [ HtmlA.id "scroll-frame" ] [ viewContent canEdit auth timeAnchor lobby ] + [ viewUsers wrap shared auth.claims.uid lobby.users openUserMenu game + , Html.div [ HtmlA.id "scroll-frame" ] [ viewContent configDisabledReason auth timeAnchor lobby ] , lobby.errors |> viewErrors shared ] ] @@ -552,12 +604,9 @@ cardSizeToAttr cardSize = HtmlA.nothing -lobbyMenu : (Msg -> msg) -> Shared -> Route -> Section -> Maybe User -> Maybe Player -> Maybe Game -> Html msg -lobbyMenu wrap shared r s user player game = +lobbyMenu : (Msg -> msg) -> Shared -> Menu.State -> Route -> Section -> Maybe User -> Maybe Player -> Maybe Game -> Html msg +lobbyMenu wrap shared menuState r s user player game = let - id = - "lobby-menu-button" - lobbyMenuItems = [ Menu.button Icon.bullhorn Strings.InvitePlayers Strings.InvitePlayersDescription (ToggleInviteDialog |> wrap |> Just) ] @@ -609,11 +658,16 @@ lobbyMenu wrap shared r s user player game = separatedMenuItems = menuItems |> List.filterMap identity |> List.intersperse [ Menu.Separator ] |> List.concat in - Html.div [] - [ Components.iconButtonStyled [ HtmlA.id id, Strings.GameMenu |> Lang.title shared ] - ( [ Icon.lg ], Icon.bars ) - , Menu.view shared id ( WlA.XCenter, WlA.YBottom ) ( WlA.XLeft, WlA.YTop ) separatedMenuItems - ] + Menu.view shared + (Menu.Closed |> SetGameMenuState |> wrap) + menuState + Menu.BottomEnd + (IconButton.view shared + Strings.GameMenu + (Icon.bars |> Icon.present |> Icon.styled [ Icon.lg ] |> NeList.just) + (menuState |> Menu.toggle |> SetGameMenuState |> wrap |> Just) + ) + separatedMenuItems applyConfigured : Json.Patch -> Model -> Change @@ -749,18 +803,19 @@ viewNotification wrap shared users animationState notification = , Just "error" ) in - Wl.card + Card.view [ HtmlA.class "notification", animationState, class |> Maybe.map HtmlA.class |> Maybe.withDefault HtmlA.nothing ] [ Html.div [ HtmlA.class "content" ] [ Html.span [ HtmlA.class "icon" ] [ icon ] , Html.span [ HtmlA.class "message" ] [ message ] - , Wl.button - [ WlA.flat - , WlA.inverted - , notification |> Animated.Exit |> NotificationMsg |> wrap |> HtmlE.onClick + , Button.view shared + Button.Standard + Strings.Dismiss + Strings.Dismiss + Html.nothing + [ notification |> Animated.Exit |> NotificationMsg |> wrap |> HtmlE.onClick , HtmlA.class "action" ] - [ Strings.Dismiss |> Lang.html shared ] ] ] @@ -787,8 +842,8 @@ viewError shared error = error |> MdError.Game |> MdError.viewSpecific shared -viewUsers : (Msg -> msg) -> Shared -> User.Id -> Dict User.Id User -> Maybe Game -> Html msg -viewUsers wrap shared localUserId users game = +viewUsers : (Msg -> msg) -> Shared -> User.Id -> Dict User.Id User -> Maybe User.Id -> Maybe Game -> Html msg +viewUsers wrap shared localUserId users openUserMenu game = let localUserPrivilege = users |> Dict.get localUserId |> Maybe.map .privilege |> Maybe.withDefault User.Unprivileged @@ -797,24 +852,23 @@ viewUsers wrap shared localUserId users game = users |> Dict.toList |> List.partition (\( _, user ) -> user.presence == User.Joined) activeGroups = - active |> byRole |> List.map (viewRoleGroup wrap shared localUserId localUserPrivilege game) + active |> byRole |> List.map (viewRoleGroup wrap shared localUserId localUserPrivilege openUserMenu game) inactiveGroup = if List.isEmpty inactive then [] else - [ viewUserListGroup wrap shared localUserId localUserPrivilege game ( ( "left", Strings.Left ), inactive ) ] + [ viewUserListGroup wrap shared localUserId localUserPrivilege openUserMenu game ( ( "left", Strings.Left ), inactive ) ] groups = List.concat [ activeGroups, inactiveGroup ] in - Wl.card [ HtmlA.id "users" ] - [ Html.div [ HtmlA.class "collapsible" ] [ HtmlK.ol [] groups ] ] + Card.view [ HtmlA.id "users" ] [ Html.div [ HtmlA.class "collapsible" ] [ HtmlK.ol [] groups ] ] -viewRoleGroup : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe Game -> ( User.Role, List ( User.Id, User ) ) -> ( String, Html msg ) -viewRoleGroup wrap shared localUserId localUserPrivilege game ( role, users ) = +viewRoleGroup : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe User.Id -> Maybe Game -> ( User.Role, List ( User.Id, User ) ) -> ( String, Html msg ) +viewRoleGroup wrap shared localUserId localUserPrivilege openUserMenu game ( role, users ) = let idAndDescription = case role of @@ -824,15 +878,15 @@ viewRoleGroup wrap shared localUserId localUserPrivilege game ( role, users ) = User.Spectator -> ( "spectators", Strings.Spectators ) in - viewUserListGroup wrap shared localUserId localUserPrivilege game ( idAndDescription, users ) + viewUserListGroup wrap shared localUserId localUserPrivilege openUserMenu game ( idAndDescription, users ) -viewUserListGroup : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe Game -> ( ( String, MdString ), List ( User.Id, User ) ) -> ( String, Html msg ) -viewUserListGroup wrap shared localUserId localUserPrivilege game ( ( id, description ), users ) = +viewUserListGroup : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe User.Id -> Maybe Game -> ( ( String, MdString ), List ( User.Id, User ) ) -> ( String, Html msg ) +viewUserListGroup wrap shared localUserId localUserPrivilege openUserMenu game ( ( id, description ), users ) = ( id , Html.li [ HtmlA.class id ] [ Html.span [] [ description |> Lang.html shared ] - , HtmlK.ol [] (users |> List.map (viewUser wrap shared localUserId localUserPrivilege game)) + , HtmlK.ol [] (users |> List.map (viewUser wrap shared localUserId localUserPrivilege openUserMenu game)) ] ) @@ -849,15 +903,12 @@ byRole users = |> List.filter (\( _, us ) -> not (List.isEmpty us)) -viewUser : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe Game -> ( User.Id, User ) -> ( String, Html msg ) -viewUser wrap shared localUserId localUserPrivilege game ( userId, user ) = +viewUser : (Msg -> msg) -> Shared -> User.Id -> User.Privilege -> Maybe User.Id -> Maybe Game -> ( User.Id, User ) -> ( String, Html msg ) +viewUser wrap shared localUserId localUserPrivilege openUserMenu game ( userId, user ) = let ( secondary, score ) = userDetails shared game userId user - id = - "user-" ++ userId - player = game |> Maybe.map .players |> Maybe.andThen (Dict.get userId) @@ -914,10 +965,10 @@ viewUser wrap shared localUserId localUserPrivilege game ( userId, user ) = in let setAway = - if userId == localUserId then + if userId == localUserId && game /= Nothing then setPresenceMenuItem wrap player |> Just - else if not isAway then + else if not isAway && game /= Nothing then case localUserPrivilege of User.Privileged -> Menu.button Icon.userClock Strings.SetAway Strings.SetAway (userId |> SetAway |> wrap |> Just) |> Just @@ -946,27 +997,38 @@ viewUser wrap shared localUserId localUserPrivilege game ( userId, user ) = else [] - ( menu, clickable ) = + ( menu, attrs ) = if user.presence == User.Left || List.isEmpty menuItems then - ( Html.nothing, HtmlA.nothing ) + ( identity, [] ) else - ( menuItems |> Menu.view shared id ( WlA.XCenter, WlA.YBottom ) ( WlA.XCenter, WlA.YTop ) - , WlA.clickable + let + isOpen = + Just userId == openUserMenu + in + ( \c -> + Menu.view shared + (SetUserMenuState userId Menu.Closed |> wrap) + (isOpen |> Menu.open) + Menu.BottomRight + c + menuItems + , [ not isOpen |> Menu.open |> SetUserMenuState userId |> wrap |> HtmlE.onClick + , HtmlA.classList [ ( "active", isOpen ), ( "has-menu", True ) ] + ] ) in ( userId , Html.li [] - [ Wl.listItem - [ HtmlA.classList [ ( "you", localUserId == userId ), ( "away", isAway ) ] - , clickable - , HtmlA.id id + [ Html.div + (HtmlA.classList [ ( "user", True ), ( "you", localUserId == userId ), ( "away", isAway ) ] :: attrs) + [ Html.div [ HtmlA.class "about" ] + [ Html.div [ HtmlA.class "name", HtmlA.title user.name ] [ Html.text user.name ] + , Html.div [ HtmlA.class "state", HtmlA.class "compressed-terms" ] secondary + ] + , Html.span [ HtmlA.class "scores" ] score ] - [ Html.span [ HtmlA.class "user", HtmlA.title user.name ] [ Html.text user.name ] - , Html.div [ HtmlA.class "compressed-terms" ] secondary - , Html.span [ WlA.listItemSlot WlA.AfterItem ] score - ] - , menu + , Html.div [] [] |> menu ] ) @@ -994,33 +1056,33 @@ userDetails shared game userId user = game |> Maybe.map .round details = - [ Strings.Privileged |> Maybe.justIf (user.privilege == User.Privileged) - , Strings.Ai |> Maybe.justIf (user.control == User.Computer) - , round |> Maybe.andThen (\r -> Strings.Czar |> Maybe.justIf (Player.isCzar r userId)) - , Strings.Disconnected |> Maybe.justIf (user.connection == User.Disconnected && user.presence /= User.Left) - , Strings.Away |> Maybe.justIf ((player |> Maybe.map .presence) == Just Player.Away) + [ ( "privileged", Strings.Privileged ) |> Maybe.justIf (user.privilege == User.Privileged) + , ( "ai", Strings.Ai ) |> Maybe.justIf (user.control == User.Computer) + , round |> Maybe.andThen (\r -> ( "czar", Strings.Czar ) |> Maybe.justIf (Player.isCzar r userId)) + , ( "disconnected", Strings.Disconnected ) |> Maybe.justIf (user.connection == User.Disconnected && user.presence /= User.Left) + , ( "away", Strings.Away ) |> Maybe.justIf ((player |> Maybe.map .presence) == Just Player.Away) , playStateDetail round userId ] score = - player |> Maybe.map (\p -> Strings.Score { total = p.score }) + player |> Maybe.map (\p -> ( "score", Strings.Score { total = p.score } )) likes = - player |> Maybe.map (\p -> Strings.Likes { total = p.likes }) + player |> Maybe.map (\p -> ( "likes", Strings.Likes { total = p.likes } )) in ( viewDetails shared details, viewDetails shared [ score, likes ] ) -playStateDetail : Maybe Round -> User.Id -> Maybe MdString +playStateDetail : Maybe Round -> User.Id -> Maybe ( String, MdString ) playStateDetail round userId = case round of Just (Round.P p) -> case Player.playState p userId of Player.Playing -> - Just Strings.StillPlaying + Just ( "playing", Strings.StillPlaying ) Player.Played -> - Just Strings.Played + Just ( "played", Strings.Played ) Player.NotInRound -> Nothing @@ -1029,20 +1091,18 @@ playStateDetail round userId = Nothing -viewDetails : Shared -> List (Maybe MdString) -> List (Html msg) -viewDetails shared details = - details |> List.filterMap identity |> List.map (Lang.html shared) |> List.intersperse (Html.text " ") +viewDetails : Shared -> List (Maybe ( String, MdString )) -> List (Html msg) +viewDetails shared = + List.filterMap identity + >> List.map (\( cls, str ) -> Html.span [ HtmlA.class cls ] [ str |> Lang.html shared ]) -viewCastButton : (Msg -> msg) -> Auth -> List (Html.Attribute msg) -> List (Html msg) -viewCastButton wrap auth attrs = - [ Components.iconButtonStyled - (List.concat - [ [ HtmlA.class "cast-button" - , auth |> TryCast |> wrap |> HtmlE.onClick - ] - , attrs - ] - ) - ( [ Icon.lg ], Icon.chromecast ) +viewCastButton : (Msg -> msg) -> Shared -> Auth -> List (Html.Attribute msg) -> List (Html msg) +viewCastButton wrap shared auth attrs = + [ Html.div (HtmlA.class "cast-button" :: attrs) + [ IconButton.view shared + Strings.Cast + (Icon.chromecast |> Icon.present |> Icon.styled [ Icon.lg ] |> NeList.just) + (auth |> TryCast |> wrap |> Just) + ] ] diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure.elm index 004ecc8..0b0d99a 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure.elm @@ -15,9 +15,7 @@ import Json.Decode as Json import Json.Diff as Json import Json.Encode import Json.Patch as Json -import MassiveDecks.Card.Source.Cardcast.Model as Cardcast -import MassiveDecks.Card.Source.Model as Source exposing (Source) -import MassiveDecks.Components as Components +import MassiveDecks.Card.Source.Model exposing (Source) import MassiveDecks.Components.Form as Form import MassiveDecks.Components.Form.Message as Message exposing (Message) import MassiveDecks.Error.Model as Error exposing (Error) @@ -52,8 +50,13 @@ import MassiveDecks.Strings.Languages as Lang import MassiveDecks.User as User exposing (User) import MassiveDecks.Util.Html as Html import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import MassiveDecks.Util.NeList exposing (NeList(..)) +import Material.Attributes as Material +import Material.Button as Button +import Material.Card as Card +import Material.Fab as Fab +import Material.Tabs as Tabs +import Material.TextField as TextField init : Shared -> Model @@ -177,16 +180,19 @@ update shared msg model config = ( model, shared, Cmd.none ) -view : (Msg -> msg) -> (Lobby.Msg -> msg) -> Shared -> Maybe msg -> Bool -> Model -> GameCode -> Lobby -> Html msg -view wrap wrapLobby shared return canEdit model gameCode lobby = +view : (Msg -> msg) -> (Lobby.Msg -> msg) -> Shared -> Maybe msg -> Message msg -> Model -> GameCode -> Lobby -> Html msg +view wrap wrapLobby shared return disabledReason model gameCode lobby = let + canEdit = + disabledReason |> Maybe.isNothing + conflicts = if List.isEmpty model.conflicts then Html.nothing else Html.div [ HtmlA.id "merge-overlay" ] - [ Wl.card [] + [ Card.view [] [ model.conflicts |> viewMerge wrap shared model model.localConfig lobby.config (wrap NoOp) canEdit ] ] @@ -205,27 +211,37 @@ view wrap wrapLobby shared return canEdit model gameCode lobby = Privacy -> Privacy.All |> PrivacyId - returnButton msg = - Wl.card [] - [ Wl.button [ HtmlA.class "game-in-progress", HtmlE.onClick msg, Strings.ReturnViewToGameDescription |> Lang.title shared ] - [ Icon.play |> Icon.viewIcon - , Strings.ReturnViewToGame |> Lang.html shared - ] - ] + viewReturnButton msg = + Button.view shared + Button.Raised + Strings.ReturnViewToGame + Strings.ReturnViewToGameDescription + (Icon.arrowLeft |> Icon.viewIcon) + [ HtmlA.class "game-in-progress", HtmlE.onClick msg ] + + returnButton = + return |> Maybe.map viewReturnButton |> Maybe.withDefault (Html.div [] []) in Html.div [ HtmlA.class "configure" ] - [ return |> Maybe.map returnButton |> Maybe.withDefault Html.nothing - , Wl.card [] + [ Card.view [] [ Html.div [ HtmlA.class "title" ] [ Component.view (componentById NameId) wrap shared model model.localConfig lobby.config (wrap NoOp) canEdit ConfigOption.Local |> Maybe.withDefault Html.nothing , Html.div [ HtmlA.class "joining" ] [ Invite.button wrapLobby shared - , Strings.GameCode { code = GameCode.toString gameCode } |> Lang.html shared + , Html.label [ Lobby.ToggleInviteDialog |> wrapLobby |> HtmlE.onClick ] + [ Strings.GameCode { code = GameCode.toString gameCode } |> Lang.html shared ] ] ] - ] - , Wl.card [] - [ Wl.tabGroup [ WlA.align WlA.Center ] (tabs |> List.map (tab wrap shared model.tab)) + , disabledReason + |> Message.view shared + |> Maybe.withDefault Html.nothing + , Tabs.view shared + { selected = model.tab + , change = ChangeTab >> wrap + , ids = tabs + , tab = tab + , equals = (==) + } , Component.view (componentById tabComponent) wrap shared @@ -236,9 +252,7 @@ view wrap wrapLobby shared return canEdit model gameCode lobby = canEdit ConfigOption.Local |> Maybe.withDefault Html.nothing - ] - , Wl.card [] - [ startGameSegment wrap wrapLobby shared canEdit model lobby + , startGameSegment wrap wrapLobby shared canEdit model lobby returnButton ] , actions wrap shared (model.localConfig /= lobby.config) , conflicts @@ -270,19 +284,18 @@ applyChange change config model = actions wrap shared hasChanges = Html.div [ HtmlA.class "actions" ] - [ Components.floatingActionButton - [ Strings.SaveChanges |> Lang.title shared - , SaveChanges |> wrap |> HtmlE.onClick - , HtmlA.classList [ ( "action", True ), ( "important", True ), ( "exited", not hasChanges ) ] - ] - Icon.save - , Components.floatingActionButton - [ Strings.RevertChanges |> Lang.title shared - , RevertChanges |> wrap |> HtmlE.onClick - , HtmlA.classList [ ( "action", True ), ( "exited", not hasChanges ) ] - , WlA.inverted - ] - Icon.undo + [ Fab.view shared + Fab.Normal + Strings.SaveChanges + (Icon.save |> Icon.present) + (SaveChanges |> wrap |> Just) + [ HtmlA.classList [ ( "action", True ), ( "important", True ), ( "exited", not hasChanges ) ] ] + , Fab.view shared + Fab.Mini + Strings.RevertChanges + (Icon.undo |> Icon.present) + (RevertChanges |> wrap |> Just) + [ HtmlA.classList [ ( "action", True ), ( "exited", not hasChanges ), ( "normal", True ) ] ] ] @@ -329,8 +342,14 @@ viewConflict wrap shared model local config noOp canEdit conflict = ] +resolveButton : (Msg -> msg) -> Shared -> Id -> Config.Source -> MdString -> Html msg resolveButton wrap shared conflict source description = - Wl.button [ HtmlA.class "resolve", ResolveConflict source conflict |> wrap |> HtmlE.onClick ] [ description |> Lang.html shared ] + Button.view shared + Button.Raised + description + description + Html.nothing + [ HtmlA.class "resolve", ResolveConflict source conflict |> wrap |> HtmlE.onClick ] default : Config @@ -408,12 +427,12 @@ nameOption = \_ -> ConfigOption.TextField { placeholder = Strings.LobbyNameLabel - , inputType = Nothing + , inputType = TextField.Text , toString = Just , fromString = Just - , attrs = [ WlA.minLength 1, WlA.maxLength 100 ] + , attrs = [ Material.minLength 1, Material.maxLength 100 ] } - , extraEditor = \_ -> \_ -> \_ -> Nothing + , extraEditor = \_ -> \_ -> \_ -> \_ -> Nothing , set = ConfigOption.wrappedSetter NameChange , messages = \_ -> [] } @@ -436,8 +455,8 @@ mergeChange base local remote model = { model | localConfig = updated, conflicts = oldConflicts ++ newConflicts } -startGameSegment : (Msg -> msg) -> (Lobby.Msg -> msg) -> Shared -> Bool -> Model -> Lobby -> Html msg -startGameSegment wrap wrapLobby shared canEdit model lobby = +startGameSegment : (Msg -> msg) -> (Lobby.Msg -> msg) -> Shared -> Bool -> Model -> Lobby -> Html msg -> Html msg +startGameSegment wrap wrapLobby shared canEdit model lobby returnButton = let config = lobby.config @@ -447,15 +466,27 @@ startGameSegment wrap wrapLobby shared canEdit model lobby = startGameAttrs = if List.isEmpty startErrors && canEdit then - [ StartGame |> wrap |> HtmlE.onClick ] + StartGame |> wrap |> HtmlE.onClick else - [ WlA.disabled ] + HtmlA.disabled True in - Form.section shared - "start-game" - (Wl.button startGameAttrs [ Strings.StartGame |> Lang.html shared ]) - (startErrors |> Maybe.justIf canEdit |> Maybe.withDefault []) + Html.div [] + [ Form.section + shared + "start-game" + Html.nothing + (startErrors |> Maybe.justIf canEdit |> Maybe.withDefault []) + , Html.div [ HtmlA.class "button-spread" ] + [ returnButton + , Button.view shared + Button.Raised + Strings.StartGame + Strings.StartGame + (Icon.rocket |> Icon.viewIcon) + [ startGameAttrs ] + ] + ] startGameProblems : Shared -> (Msg -> msg) -> (Lobby.Msg -> msg) -> Dict User.Id User -> Model -> Config -> List (Message msg) @@ -496,7 +527,7 @@ startGameProblems shared wrap wrapLobby users model remote = summaries .responses requiredResponses = - (users |> Dict.values |> List.filter (\u -> u.role == User.Player) |> List.length) * 3 + (users |> Dict.values |> List.filter (\u -> u.role == User.Player) |> List.length) * 3 * 2 deckIssues = if noDecks then @@ -514,29 +545,37 @@ startGameProblems shared wrap wrapLobby users model remote = [ Strings.WaitForDecks |> Message.info |> Just ] else + let + diff = + requiredResponses - numberOfResponses + + old = + config.rules.houseRules.comedyWriter |> Maybe.map .number |> Maybe.withDefault 0 + + fixMsg = + diff + old |> Just |> ComedyWriter.SetNumber |> HouseRule.ComedyWriterMsg |> Rules.HouseRulesMsg |> RulesMsg |> wrap + in [ Strings.MissingCardType { cardType = Strings.Call } |> Message.error |> Maybe.justIf (summaries .calls < 1) - , Strings.MissingCardType { cardType = Strings.Response } - |> Message.error - |> Maybe.justIf (numberOfResponses < 1) - , Strings.NotEnoughCardsOfType { cardType = Strings.Response, needed = requiredResponses, have = numberOfResponses } - |> Message.error + , Message.errorWithFix + (Strings.NotEnoughCardsOfType { cardType = Strings.Response, needed = requiredResponses, have = numberOfResponses }) + [ Message.Fix (Strings.AddBlankCards { amount = diff }) Icon.plus fixMsg ] |> Maybe.justIf (numberOfResponses < requiredResponses) ] - playerCount = - users - |> Dict.values - |> List.filter (\user -> user.role == User.Player && user.presence == User.Joined) - |> List.length - humanPlayerCount = users |> Dict.values - |> List.filter (\user -> user.role == User.Player && user.presence == User.Joined && user.control == User.Human) + |> List.filter (\u -> u.role == User.Player && u.presence == User.Joined && u.control == User.Human) |> List.length + computerPlayers = + config.rules.houseRules.rando |> Maybe.map .number |> Maybe.withDefault 0 + + playerCount = + humanPlayerCount + computerPlayers + playerIssues = [ Message.errorWithFix Strings.NeedAtLeastThreePlayers @@ -614,18 +653,16 @@ startGameProblems shared wrap wrapLobby users model remote = [ deckIssues, playerIssues, aisNoWriteGoodIssues, configurationIssues ] |> List.concat |> List.filterMap identity -tabs : List Tab +tabs : NeList Tab tabs = - [ Decks, Rules, TimeLimits, Privacy ] + NeList Decks [ Rules, TimeLimits, Privacy ] -tab : (Msg -> msg) -> Shared -> Tab -> Tab -> Html msg -tab wrap shared currently target = - Wl.tab - ((target |> ChangeTab |> wrap |> always |> HtmlE.onCheck) - :: ([ WlA.checked ] |> Maybe.justIf (currently == target) |> Maybe.withDefault []) - ) - [ target |> tabName |> Lang.html shared ] +tab : Tab -> Tabs.TabModel +tab target = + { label = target |> tabName + , icon = Nothing + } tabName : Tab -> MdString diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/ConfigOption.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/ConfigOption.elm index e3df99e..3aaf48f 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/ConfigOption.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/ConfigOption.elm @@ -1,11 +1,14 @@ module MassiveDecks.Pages.Lobby.Configure.ConfigOption exposing ( ConfigOption + , IntBounds , PrimaryEditor(..) , RenderMode(..) , ViewArgs , intEditor , maybeEditor , noExtraEditor + , toMinMaxAttrs + , toValidator , view , wrappedSetter ) @@ -16,14 +19,13 @@ import Html.Events as HtmlE import MassiveDecks.Components.Form as Form import MassiveDecks.Components.Form.Message exposing (Message) import MassiveDecks.Model exposing (Shared) -import MassiveDecks.Pages.Lobby.Configure.Component.Validator exposing (Validator) +import MassiveDecks.Pages.Lobby.Configure.Component.Validator as Validator exposing (Validator) import MassiveDecks.Pages.Lobby.Configure.ConfigOption.Toggleable exposing (Toggleable) import MassiveDecks.Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang -import MassiveDecks.Util.Html.Attributes as HtmlA import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import Material.Switch as Material +import Material.TextField as TextField type alias Model model config = @@ -34,7 +36,7 @@ type alias ConfigOption model config iMsg msg = { id : String , toggleable : Toggleable config , primaryEditor : model -> PrimaryEditor config msg - , extraEditor : (iMsg -> msg) -> model -> config -> Maybe (Html msg) + , extraEditor : (iMsg -> msg) -> Shared -> model -> config -> Maybe (Html msg) , set : (iMsg -> msg) -> config -> msg , messages : (iMsg -> msg) -> List (Message msg) } @@ -43,7 +45,7 @@ type alias ConfigOption model config iMsg msg = type PrimaryEditor value msg = TextField { placeholder : MdString - , inputType : Maybe WlA.InputType + , inputType : TextField.Type , toString : value -> Maybe String , fromString : String -> Maybe value , attrs : List (Html.Attribute msg) @@ -55,7 +57,7 @@ intEditor : MdString -> List (Html.Attribute msg) -> PrimaryEditor Int msg intEditor placeholder attrs = TextField { placeholder = placeholder - , inputType = Just WlA.Number + , inputType = TextField.Number , toString = String.fromInt >> Just , fromString = String.toInt , attrs = attrs @@ -78,9 +80,9 @@ maybeEditor given = Label { text = text } -noExtraEditor : (iMsg -> msg) -> model -> config -> Maybe (Html msg) -noExtraEditor = - \_ -> \_ -> \_ -> Nothing +noExtraEditor : (iMsg -> msg) -> Shared -> model -> config -> Maybe (Html msg) +noExtraEditor _ _ _ _ = + Nothing wrappedSetter : (config -> iMsg) -> (iMsg -> msg) -> config -> msg @@ -144,6 +146,30 @@ view opt validator { wrap, shared, model, local, remote, noOp, canEdit, renderMo (errors ++ opt.messages wrap) +{-| Boundaries for an integer value. +-} +type alias IntBounds = + { min : Int + , max : Int + } + + +{-| Convert bounds to min/max HTML attributes. +-} +toMinMaxAttrs : IntBounds -> List (Html.Attribute msg) +toMinMaxAttrs { min, max } = + [ min |> String.fromInt |> HtmlA.min + , max |> String.fromInt |> HtmlA.max + ] + + +{-| Convert bounds to a validator. +-} +toValidator : IntBounds -> (Int -> iMsg) -> Validator Int iMsg msg +toValidator { min, max } = + Validator.between min max + + {- Private -} @@ -151,54 +177,73 @@ view opt validator { wrap, shared, model, local, remote, noOp, canEdit, renderMo viewContents : ConfigOption model config optionMsg msg -> (optionMsg -> msg) -> Shared -> model -> msg -> Bool -> Bool -> config -> List (Html msg) viewContents opt wrap shared model noOp canEdit readOnly config = let + ( switch, toggle, id ) = + case opt.toggleable of + Just { off, on } -> + let + i = + opt.id ++ "-swtich" + + t = + Maybe.justIf (config == off) on |> Maybe.withDefault off |> opt.set wrap + + s = + Material.view + [ HtmlA.checked (config /= off) + , if readOnly || not canEdit then + HtmlA.disabled True + + else + HtmlE.onCheck (\c -> Maybe.justIf c on |> Maybe.withDefault off |> opt.set wrap) + , HtmlA.id i + ] + in + ( Just s, t |> Maybe.justIf (not readOnly && canEdit), Just i ) + + Nothing -> + ( Nothing, Nothing, Nothing ) + primaryEditor = case opt.primaryEditor model of TextField { placeholder, inputType, toString, fromString, attrs } -> - Wl.textField - ([ HtmlA.class "primary" - , placeholder |> Lang.label shared - , WlA.outlined - , inputType |> Maybe.map WlA.type_ |> Maybe.withDefault HtmlA.nothing - , config |> toString |> Maybe.map WlA.value |> Maybe.withDefault HtmlA.nothing - , if readOnly then - WlA.readonly + let + toggleableAndOff = + opt.toggleable |> Maybe.map (.off >> (==) config) |> Maybe.withDefault False + in + TextField.view shared + placeholder + inputType + (config |> toString |> Maybe.withDefault "") + (List.filterMap identity + [ HtmlA.class "primary" |> Just + , if readOnly then + HtmlA.readonly True |> Just - else - fromString - >> Maybe.map (opt.set wrap) - >> Maybe.withDefault noOp - |> HtmlE.onInput - , opt.toggleable - |> Maybe.andThen (\t -> Maybe.justIf (t.off == config) WlA.disabled) - |> Maybe.withDefault HtmlA.nothing - , WlA.disabled |> Maybe.justIf (not canEdit) |> Maybe.withDefault HtmlA.nothing - ] + else + fromString + >> Maybe.map (opt.set wrap) + >> Maybe.withDefault noOp + |> HtmlE.onInput + |> Just + , HtmlA.disabled True |> Maybe.justIf toggleableAndOff + , toggle |> Maybe.andThen (Maybe.justIf toggleableAndOff) |> Maybe.map HtmlE.onClick + , True |> HtmlA.disabled |> Maybe.justIf (not canEdit) + ] ++ attrs ) - [] Label { text } -> - Html.label [ HtmlA.class "primary" ] [ text |> Lang.html shared ] - - switch = - case opt.toggleable of - Just { off, on } -> - Wl.switch - [ WlA.checked |> Maybe.justIf (config /= off) |> Maybe.withDefault HtmlA.nothing - , if readOnly then - WlA.disabled - - else - HtmlE.onCheck (\c -> Maybe.justIf c on |> Maybe.withDefault off |> opt.set wrap) - , WlA.disabled |> Maybe.justIf (not canEdit) |> Maybe.withDefault HtmlA.nothing - ] - |> Just - - Nothing -> - Nothing + Html.label + (List.filterMap identity + [ HtmlA.class "primary" |> Just + , toggle |> Maybe.map HtmlE.onClick + , id |> Maybe.map HtmlA.for + ] + ) + [ text |> Lang.html shared ] in [ switch , Just primaryEditor - , opt.extraEditor wrap model config + , opt.extraEditor wrap shared model config ] |> List.filterMap identity diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks.elm index d5d8a2e..bc64685 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks.elm @@ -30,9 +30,11 @@ import MassiveDecks.Settings as Settings import MassiveDecks.Strings as Strings import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Html as Html -import MassiveDecks.Util.Html.Attributes as HtmlA import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList exposing (NeList(..)) import MassiveDecks.Util.Result as Result +import Material.IconButton as IconButton +import Paper.Tooltip as Tooltip import Svg.Attributes as SvgA @@ -74,6 +76,9 @@ update shared msg model = Remove index -> ( model, shared, Actions.configure (removeDeck index) ) + NoOp -> + ( model, shared, Cmd.none ) + {-| View the editor/viewer for decks. -} @@ -83,8 +88,7 @@ view _ { wrap, shared, model, remote, canEdit } = hint = if canEdit then Components.linkButton - [ shared |> Lang.recommended |> Add |> wrap |> HtmlE.onClick - ] + [ shared |> Lang.recommended |> Add |> wrap |> HtmlE.onClick ] [ Strings.NoDecksHint |> Lang.html shared ] else @@ -138,7 +142,7 @@ view _ { wrap, shared, model, remote, canEdit } = addDeck : Source.External -> Json.Patch addDeck source = - [ Json.Add [ "decks", "-" ] (D (Deck source Nothing) |> Encoders.deckOrError) ] + [ Json.Add [ "decks", "-" ] (DeckOrError source (Ok Nothing) |> Encoders.deckOrError) ] removeDeck : Int -> Json.Patch @@ -175,21 +179,21 @@ all = getDeck : DeckOrError -> Maybe Deck getDeck deckOrError = - case deckOrError of - D deck -> - Just deck + case deckOrError.result of + Ok summary -> + Deck deckOrError.source summary |> Just - E _ -> + Err _ -> Nothing summaryFor : DeckOrError -> Maybe ( Source.External, Source.Summary ) summaryFor deckOrError = - case deckOrError of - D deck -> - deck.summary |> Maybe.map (\s -> ( deck.source, s )) + case deckOrError.result of + Ok summary -> + summary |> Maybe.map (\s -> ( deckOrError.source, s )) - E _ -> + Err _ -> Nothing @@ -199,33 +203,28 @@ addDeckWidget wrap shared existing deckToAdd = submit = deckToAdd |> submitDeckAction wrap existing in - Html.form - [ submit |> Result.map HtmlE.onSubmit |> Result.withDefault HtmlA.nothing ] - [ Form.section - shared - "add-deck" - (Html.div [ HtmlA.class "multipart" ] - (List.concat - [ Source.generalEditor shared existing deckToAdd (Update >> wrap) - , [ Components.floatingActionButton - [ HtmlA.type_ "submit" - , Result.isError submit |> HtmlA.disabled - , Strings.AddDeck |> Lang.title shared - ] - Icon.plus - ] - ] - ) + Form.section + shared + "add-deck" + (Html.div [ HtmlA.class "multipart" ] + (List.concat + [ Source.generalEditor shared existing deckToAdd (Update >> wrap) (submit |> Result.toMaybe) (NoOp |> wrap) + , [ IconButton.view shared + Strings.AddDeck + (NeList (Icon.plus |> Icon.present) []) + (submit |> Result.toMaybe) + ] + ] ) - (submit |> Result.error |> Maybe.withDefault []) - ] + ) + (submit |> Result.error |> Maybe.withDefault []) submitDeckAction : (Msg -> msg) -> List DeckOrError -> Source.External -> Result (List (Message msg)) msg submitDeckAction wrap existing deckToAdd = let potentialProblems = - if List.any (getSource >> Source.equals deckToAdd) existing then + if List.any (.source >> Source.equals deckToAdd) existing then [ Strings.DeckAlreadyAdded |> Message.info ] else @@ -238,26 +237,19 @@ submitDeckAction wrap existing deckToAdd = potentialProblems |> Result.Err -getSource : DeckOrError -> Source.External -getSource deckOrError = - case deckOrError of - D deck -> - deck.source - - E error -> - error.source - - viewDeck : (Msg -> msg) -> Shared -> Bool -> Int -> DeckOrError -> Html msg viewDeck wrap shared canEdit index deckOrError = let - ( deckSource, deckSummary, failureReason ) = - case deckOrError of - D { source, summary } -> - ( source, summary, Nothing ) + deckSource = + deckOrError.source - E { source, reason } -> - ( source, Nothing, Just reason ) + ( deckSummary, failureReason ) = + case deckOrError.result of + Ok summary -> + ( summary, Nothing ) + + Err reason -> + ( Nothing, Just reason ) ( attr, columns ) = case deckSummary of @@ -299,16 +291,15 @@ name : name wrap shared canEdit index source loading maybeError details = let removeButton = - Components.iconButton - [ index |> Remove |> wrap |> HtmlE.onClick - , Strings.RemoveDeck |> Lang.title shared - , HtmlA.class "remove-button" - ] - Icon.trash + IconButton.view + shared + Strings.RemoveDeck + (NeList (Icon.trash |> Icon.present) []) + (index |> Remove |> wrap |> Just) |> Maybe.justIf canEdit ( maybeId, tooltip ) = - source |> Source.Ex |> Source.tooltip shared |> Maybe.decompose + source |> Source.Ex |> Source.tooltip shared Tooltip.Right details |> Maybe.decompose attrs = maybeId |> Maybe.map (\id -> [ HtmlA.id id ]) |> Maybe.withDefault [] diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks/Model.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks/Model.elm index 3bab0f7..8e52138 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks/Model.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Decks/Model.elm @@ -1,12 +1,14 @@ module MassiveDecks.Pages.Lobby.Configure.Decks.Model exposing ( Config , Deck - , DeckOrError(..) + , DeckOrError , Error , GetSummary , Id(..) , Model , Msg(..) + , deckToDeckOrError + , errorToDeckOrError ) import MassiveDecks.Card.Source.Model as Source exposing (Source) @@ -36,9 +38,20 @@ type alias Error = {-| A deck or an error. -} -type DeckOrError - = D Deck - | E Error +type alias DeckOrError = + { source : Source.External + , result : Result Source.LoadFailureReason (Maybe Source.Summary) + } + + +deckToDeckOrError : Deck -> DeckOrError +deckToDeckOrError { source, summary } = + { source = source, result = Ok summary } + + +errorToDeckOrError : Error -> DeckOrError +errorToDeckOrError { source, reason } = + { source = source, result = Err reason } {-| The model for the editor for decks. @@ -60,3 +73,4 @@ type Msg = Update Source.External | Add Source.External | Remove Int + | NoOp diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Privacy.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Privacy.elm index 974e7f8..504a094 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Privacy.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Privacy.elm @@ -5,9 +5,8 @@ module MassiveDecks.Pages.Lobby.Configure.Privacy exposing , update ) +import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon -import Html.Events as HtmlE -import MassiveDecks.Components as Components import MassiveDecks.Components.Form.Message as Message import MassiveDecks.Pages.Lobby.Configure.Component as Component exposing (Component) import MassiveDecks.Pages.Lobby.Configure.Component.Validator as Validator @@ -15,9 +14,9 @@ import MassiveDecks.Pages.Lobby.Configure.ConfigOption as ConfigOption exposing import MassiveDecks.Pages.Lobby.Configure.ConfigOption.Toggleable as Toggleable import MassiveDecks.Pages.Lobby.Configure.Privacy.Model exposing (..) import MassiveDecks.Strings as Strings -import MassiveDecks.Util.Html.Attributes as HtmlA -import MassiveDecks.Util.Maybe as Maybe -import Weightless.Attributes as WlA +import MassiveDecks.Util.NeList as NeList exposing (NeList(..)) +import Material.IconButton as IconButton +import Material.TextField as TextField init : Model @@ -105,28 +104,38 @@ password = passwordOption : ConfigOption Model (Maybe String) Msg msg passwordOption = + let + visibility wrap shared model _ = + let + icon = + if model.passwordVisible then + Icon.eyeSlash + + else + Icon.eye + + action = + TogglePasswordVisibility |> wrap |> Just + in + Just (IconButton.view shared Strings.LobbyPassword (icon |> Icon.present |> NeList.just) action) + in { id = "game-password-option" , toggleable = Toggleable.maybe "" , primaryEditor = \model -> ConfigOption.TextField { placeholder = Strings.LobbyPassword - , inputType = WlA.Password |> Maybe.justIf (not model.passwordVisible) + , inputType = + if not model.passwordVisible then + TextField.Password + + else + TextField.Text , toString = identity , fromString = Just >> Just - , attrs = [ WlA.minLength 1 ] + , attrs = [] } - , extraEditor = - \wrap -> - \model -> - \value -> - Just - (Components.iconButton - [ TogglePasswordVisibility |> wrap |> HtmlE.onClick - , WlA.disabled |> Maybe.justIf (Maybe.isNothing value) |> Maybe.withDefault HtmlA.nothing - ] - (Icon.eyeSlash |> Maybe.justIf model.passwordVisible |> Maybe.withDefault Icon.eye) - ) + , extraEditor = visibility , set = ConfigOption.wrappedSetter PasswordChange , messages = \_ -> diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules.elm index 766e62e..6fe6e18 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules.elm @@ -13,7 +13,6 @@ import MassiveDecks.Pages.Lobby.Configure.Rules.HouseRules as HouseRules import MassiveDecks.Pages.Lobby.Configure.Rules.HouseRules.Model as HouseRules import MassiveDecks.Pages.Lobby.Configure.Rules.Model exposing (..) import MassiveDecks.Strings as Strings -import Weightless.Attributes as WlA init : Model @@ -81,13 +80,18 @@ gameRules = ] +handSizeLimits : ConfigOption.IntBounds +handSizeLimits = + ConfigOption.IntBounds 3 50 + + handSize : Component Int Model Id Msg msg handSize = Component.value HandSize (ConfigOption.view handSizeOption) (always False) - (Validator.between 3 50 HandSizeChange) + (ConfigOption.toValidator handSizeLimits HandSizeChange) handSizeOption : ConfigOption Model Int Msg msg @@ -95,20 +99,25 @@ handSizeOption = { id = "hand-size-option" , toggleable = Nothing , primaryEditor = - \_ -> ConfigOption.intEditor Strings.HandSize [ 3 |> WlA.min, 50 |> WlA.max ] + \_ -> ConfigOption.intEditor Strings.HandSize (ConfigOption.toMinMaxAttrs handSizeLimits) , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter HandSizeChange , messages = \_ -> [ Message.info Strings.HandSizeDescription ] } +scoreLimitBounds : ConfigOption.IntBounds +scoreLimitBounds = + ConfigOption.IntBounds 1 10000 + + scoreLimit : Component (Maybe Int) Model Id Msg msg scoreLimit = Component.value ScoreLimit (ConfigOption.view scoreLimitOption) (always False) - (Validator.optional (Validator.between 3 10000 (Just >> ScoreLimitChange))) + (Validator.optional (ConfigOption.toValidator scoreLimitBounds (Just >> ScoreLimitChange))) scoreLimitOption : ConfigOption Model (Maybe Int) Msg msg @@ -116,7 +125,7 @@ scoreLimitOption = { id = "score-limit-option" , toggleable = Toggleable.maybe 25 , primaryEditor = - \_ -> ConfigOption.maybeEditor (ConfigOption.intEditor Strings.ScoreLimit [ 3 |> WlA.min, 10000 |> WlA.max ]) + \_ -> ConfigOption.maybeEditor (ConfigOption.intEditor Strings.ScoreLimit (ConfigOption.toMinMaxAttrs scoreLimitBounds)) , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter ScoreLimitChange , messages = \_ -> [ Message.info Strings.ScoreLimitDescription ] diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/ComedyWriter.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/ComedyWriter.elm index 15ba11b..9f984fa 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/ComedyWriter.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/ComedyWriter.elm @@ -14,7 +14,6 @@ import MassiveDecks.Pages.Lobby.Configure.ConfigOption.Toggleable as Toggleable import MassiveDecks.Pages.Lobby.Configure.Rules.HouseRules.ComedyWriter.Model exposing (..) import MassiveDecks.Strings as Strings import MassiveDecks.Util.Maybe as Maybe -import Weightless.Attributes as WlA init : Model @@ -115,14 +114,9 @@ enabledOption = } -numberMin : Int -numberMin = - 1 - - -numberMax : Int -numberMax = - 99999 +numberBounds : ConfigOption.IntBounds +numberBounds = + ConfigOption.IntBounds 1 99999 number : Component (Maybe Int) Model Id Msg msg @@ -131,7 +125,7 @@ number = Number (ConfigOption.view numberOption) Maybe.isNothing - (Validator.optional (Validator.between numberMin numberMax (Just >> SetNumber))) + (Validator.optional (ConfigOption.toValidator numberBounds (Just >> SetNumber))) numberOption : ConfigOption Model (Maybe Int) Msg msg @@ -140,7 +134,7 @@ numberOption = , toggleable = Nothing , primaryEditor = \_ -> - ConfigOption.intEditor Strings.HouseRuleComedyWriterNumber [ WlA.min numberMin, WlA.max numberMax ] + ConfigOption.intEditor Strings.HouseRuleComedyWriterNumber (ConfigOption.toMinMaxAttrs numberBounds) |> ConfigOption.maybeEditor , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter SetNumber diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Rando.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Rando.elm index 2dadac7..2a5d586 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Rando.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Rando.elm @@ -14,7 +14,6 @@ import MassiveDecks.Pages.Lobby.Configure.ConfigOption.Toggleable as Toggleable import MassiveDecks.Pages.Lobby.Configure.Rules.HouseRules.Rando.Model exposing (..) import MassiveDecks.Strings as Strings import MassiveDecks.Util.Maybe as Maybe -import Weightless.Attributes as WlA init : Model @@ -102,14 +101,9 @@ enabledOption = } -numberMin : Int -numberMin = - 1 - - -numberMax : Int -numberMax = - 10 +numberBounds : ConfigOption.IntBounds +numberBounds = + ConfigOption.IntBounds 1 10 number : Component (Maybe Int) Model Id Msg msg @@ -118,7 +112,7 @@ number = Number (ConfigOption.view numberOption) Maybe.isNothing - (Validator.optional (Validator.between numberMin numberMax (Just >> SetNumber))) + (Validator.optional (ConfigOption.toValidator numberBounds (Just >> SetNumber))) numberOption : ConfigOption Model (Maybe Int) Msg msg @@ -127,7 +121,7 @@ numberOption = , toggleable = Toggleable.none , primaryEditor = \_ -> - ConfigOption.intEditor Strings.HouseRuleRandoCardrissianNumber [ WlA.min numberMin, WlA.max numberMax ] + ConfigOption.intEditor Strings.HouseRuleRandoCardrissianNumber (ConfigOption.toMinMaxAttrs numberBounds) |> ConfigOption.maybeEditor , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter SetNumber diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Reboot.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Reboot.elm index 40954a1..413ac19 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Reboot.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/Rules/HouseRules/Reboot.elm @@ -14,7 +14,6 @@ import MassiveDecks.Pages.Lobby.Configure.ConfigOption.Toggleable as Toggleable import MassiveDecks.Pages.Lobby.Configure.Rules.HouseRules.Reboot.Model exposing (..) import MassiveDecks.Strings as Strings import MassiveDecks.Util.Maybe as Maybe -import Weightless.Attributes as WlA init : Model @@ -100,14 +99,9 @@ enabledOption = } -costMin : Int -costMin = - 1 - - -costMax : Int -costMax = - 50 +costBounds : ConfigOption.IntBounds +costBounds = + ConfigOption.IntBounds 1 50 cost : Component (Maybe Int) Model Id Msg msg @@ -116,7 +110,7 @@ cost = Cost (ConfigOption.view costOption) Maybe.isNothing - (Validator.optional (Validator.between costMin costMax (Just >> SetCost))) + (Validator.optional (ConfigOption.toValidator costBounds (Just >> SetCost))) costOption : ConfigOption Model (Maybe Int) Msg msg @@ -125,7 +119,7 @@ costOption = , toggleable = Toggleable.none , primaryEditor = \_ -> - ConfigOption.intEditor Strings.HouseRuleRebootCost [ WlA.min costMin, WlA.max costMax ] + ConfigOption.intEditor Strings.HouseRuleRebootCost (ConfigOption.toMinMaxAttrs costBounds) |> ConfigOption.maybeEditor , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter SetCost diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/TimeLimits.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/TimeLimits.elm index 32fa80d..01e7646 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Configure/TimeLimits.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Configure/TimeLimits.elm @@ -14,7 +14,6 @@ import MassiveDecks.Pages.Lobby.Configure.ConfigOption as ConfigOption exposing import MassiveDecks.Pages.Lobby.Configure.TimeLimits.Model exposing (..) import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Util.Maybe as Maybe -import Weightless.Attributes as WlA init : Model @@ -101,13 +100,18 @@ modeOption = } +timeLimitBounds : ConfigOption.IntBounds +timeLimitBounds = + ConfigOption.IntBounds 0 900 + + timeLimit : Round.Stage -> MdString -> Bool -> Component (Maybe Int) Model Id Msg msg timeLimit stage description toggleable = Component.value (TimeLimit stage) (ConfigOption.view (timeLimitOption stage description toggleable)) (always False) - (Validator.optional (Validator.between 0 900 (\v -> TimeLimitChange stage (Just v)))) + (Validator.optional (ConfigOption.toValidator timeLimitBounds (\v -> TimeLimitChange stage (Just v)))) stageId : Round.Stage -> String @@ -135,7 +139,7 @@ timeLimitOption stage description toggleable = } |> Maybe.justIf toggleable , primaryEditor = - \_ -> ConfigOption.maybeEditor (ConfigOption.intEditor (Strings.TimeLimit { stage = stage |> Round.stageDescription }) [ WlA.min 0, WlA.max 900 ]) + \_ -> ConfigOption.maybeEditor (ConfigOption.intEditor (Strings.TimeLimit { stage = stage |> Round.stageDescription }) (ConfigOption.toMinMaxAttrs timeLimitBounds)) , extraEditor = ConfigOption.noExtraEditor , set = ConfigOption.wrappedSetter (TimeLimitChange stage) , messages = \_ -> [ Message.info description ] diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Invite.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Invite.elm index eda5838..2f78855 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Invite.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Invite.elm @@ -1,11 +1,10 @@ module MassiveDecks.Pages.Lobby.Invite exposing (button, dialog, overlay) +import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA import Html.Events as HtmlE -import Json.Decode -import MassiveDecks.Components as Components import MassiveDecks.Components.Form as Form import MassiveDecks.Components.Form.Message as Message import MassiveDecks.Model exposing (..) @@ -16,20 +15,19 @@ import MassiveDecks.Pages.Start.Route as Start import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Html as Html +import MassiveDecks.Util.Html.Events as HtmlE +import MassiveDecks.Util.NeList as NeList exposing (NeList(..)) +import Material.Card as Card +import Material.IconButton as IconButton import QRCode import Url exposing (Url) -import Weightless as Wl {-| A button to show the dialog. -} button : (Msg -> msg) -> Shared -> Html msg button wrap shared = - Components.iconButton - [ Lang.title shared Strings.Invite - , ToggleInviteDialog |> wrap |> HtmlE.onClick - ] - Icon.bullhorn + IconButton.view shared Strings.Invite (Icon.bullhorn |> Icon.present |> NeList.just) (ToggleInviteDialog |> wrap |> Just) {-| A dialog overlay that displays information on how to invite people to the game. @@ -45,15 +43,11 @@ dialog wrap shared gameCode password open = , HtmlA.classList [ ( "open", open ) ] , Lobby.ToggleInviteDialog |> wrap |> HtmlE.onClick ] - [ Components.iconButton - [ HtmlA.class "close" - , Lobby.ToggleInviteDialog - |> wrap - |> onClickNoPropegation - , Strings.Close |> Lang.title shared - ] - Icon.times - , Wl.card [ onClickNoPropegation (wrap NoOp) ] + [ IconButton.viewNoPropagation shared + Strings.Close + (Icon.times |> Icon.present |> NeList.just) + (Lobby.ToggleInviteDialog |> wrap |> Just) + , Card.view [ HtmlE.onClickNoPropagation (wrap NoOp) ] [ Strings.InviteExplanation { gameCode = GameCode.toString gameCode, password = password } |> Lang.html shared , Form.section shared "invite-link" @@ -65,7 +59,10 @@ dialog wrap shared gameCode password open = , HtmlA.id "invite-link-field" ] [] - , Components.iconButton [ "invite-link-field" |> Copy |> wrap |> HtmlE.onClick ] Icon.copy + , IconButton.view shared + Strings.Copy + (Icon.copy |> Icon.present |> NeList.just) + ("invite-link-field" |> Copy |> wrap |> Just) ] ) [ Message.info Strings.InviteLinkHelp ] @@ -92,11 +89,6 @@ overlay shared gameCode = {- Private -} -onClickNoPropegation : msg -> Html.Attribute msg -onClickNoPropegation msg = - HtmlE.stopPropagationOn "click" (Json.Decode.succeed ( msg, True )) - - qr : String -> Html msg qr lobbyUrl = lobbyUrl diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Messages.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Messages.elm index fc7c1a7..09fbab3 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Messages.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Messages.elm @@ -1,6 +1,7 @@ module MassiveDecks.Pages.Lobby.Messages exposing (Msg(..)) import MassiveDecks.Animated as Animated +import MassiveDecks.Components.Menu.Model as Menu import MassiveDecks.Game.Messages as Game import MassiveDecks.Game.Time as Time import MassiveDecks.Models.MdError exposing (MdError) @@ -29,5 +30,7 @@ type Msg | TryCast Auth | Copy String | ChangeSection (Maybe Section) + | SetGameMenuState Menu.State + | SetUserMenuState User.Id Menu.State | EndGame | NoOp diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Model.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Model.elm index d9cf46d..35d19b6 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Model.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Model.elm @@ -13,10 +13,11 @@ module MassiveDecks.Pages.Lobby.Model exposing import Dict exposing (Dict) import MassiveDecks.Animated exposing (Animated) +import MassiveDecks.Components.Menu.Model as Menu import MassiveDecks.Error.Model exposing (Error) import MassiveDecks.Game.Model as Game exposing (Game) import MassiveDecks.Game.Time as Time -import MassiveDecks.Models.MdError as MdError exposing (GameStateError, MdError) +import MassiveDecks.Models.MdError exposing (GameStateError, MdError) import MassiveDecks.Pages.Lobby.Configure.Model as Configure import MassiveDecks.Pages.Lobby.GameCode exposing (GameCode) import MassiveDecks.Pages.Lobby.Route exposing (..) @@ -29,7 +30,7 @@ to somewhere else with some payload. -} type Change = Stay Model - | AuthError GameCode MdError.AuthenticationError + | JoinError GameCode MdError | LeftGame GameCode User.LeaveReason | ConfigError Error @@ -46,6 +47,8 @@ type alias Model = , inviteDialogOpen : Bool , timeAnchor : Maybe Time.Anchor , spectate : Spectate.Model + , gameMenu : Menu.State + , userMenu : Maybe User.Id } diff --git a/client/src/elm/MassiveDecks/Pages/Lobby/Spectate.elm b/client/src/elm/MassiveDecks/Pages/Lobby/Spectate.elm index 6f190a1..be11340 100644 --- a/client/src/elm/MassiveDecks/Pages/Lobby/Spectate.elm +++ b/client/src/elm/MassiveDecks/Pages/Lobby/Spectate.elm @@ -10,8 +10,6 @@ import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE -import MassiveDecks.Components as Component import MassiveDecks.Model exposing (Shared) import MassiveDecks.Pages.Lobby.Actions as Actions import MassiveDecks.Pages.Lobby.GameCode as GameCode exposing (GameCode) @@ -27,6 +25,8 @@ import MassiveDecks.Pages.Start.Route as Start import MassiveDecks.Strings as Strings import MassiveDecks.Strings.Languages as Lang import MassiveDecks.User as User +import MassiveDecks.Util.NeList as NeList +import Material.IconButton as IconButton import QRCode import Url exposing (Url) @@ -96,21 +96,18 @@ viewSettings wrap changePage shared lobby = ( wrap BecomePlayer, Strings.BecomePlayerDescription ) in [ Html.div [ HtmlA.id "spectate-actions" ] - [ Component.iconButton - [ backAction |> HtmlE.onClick - , backDescription |> Lang.title shared - ] - Icon.arrowLeft - , Component.iconButton - [ { route | section = Just Lobby.Configure } |> Route.Lobby |> changePage |> HtmlE.onClick - , Strings.ViewConfgiurationDescription |> Lang.title shared - ] - Icon.cog - , Component.iconButton - [ ToggleAdvert |> wrap |> HtmlE.onClick - , Strings.ToggleAdvertDescription |> Lang.title shared - ] - advertiseIcon + [ IconButton.view shared + backDescription + (Icon.arrowLeft |> Icon.present |> NeList.just) + (Just backAction) + , IconButton.view shared + Strings.ViewConfgiurationDescription + (Icon.cog |> Icon.present |> NeList.just) + ({ route | section = Just Lobby.Configure } |> Route.Lobby |> changePage |> Just) + , IconButton.view shared + Strings.ToggleAdvertDescription + (advertiseIcon |> Icon.present |> NeList.just) + (ToggleAdvert |> wrap |> Just) ] ] diff --git a/client/src/elm/MassiveDecks/Pages/Start.elm b/client/src/elm/MassiveDecks/Pages/Start.elm index 08dd96d..a9cf14f 100644 --- a/client/src/elm/MassiveDecks/Pages/Start.elm +++ b/client/src/elm/MassiveDecks/Pages/Start.elm @@ -1,7 +1,7 @@ module MassiveDecks.Pages.Start exposing ( changeRoute , init - , initWithAuthError + , initWithError , route , update , view @@ -21,7 +21,6 @@ import MassiveDecks.Card.Model as Card import MassiveDecks.Card.Parts as Parts import MassiveDecks.Card.Response as Response import MassiveDecks.Card.Source.Model as Source -import MassiveDecks.Components as Components import MassiveDecks.Components.Form as Form import MassiveDecks.Components.Form.Message as Message exposing (Message) import MassiveDecks.Error as Error @@ -48,10 +47,14 @@ import MassiveDecks.Strings as Strings exposing (MdString) import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Html as Html import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList as NeList exposing (NeList(..)) import MassiveDecks.Version as Version +import Material.Button as Button +import Material.Card as Card +import Material.IconButton as IconButton +import Material.Tabs as Tabs +import Material.TextField as TextField import Svg.Attributes as SvgA -import Weightless as Wl -import Weightless.Attributes as WlA changeRoute : Route -> Model -> ( Model, Cmd Global.Msg ) @@ -93,8 +96,8 @@ init shared r = ) -initWithAuthError : Shared -> GameCode -> MdError.AuthenticationError -> ( Model, Cmd Global.Msg ) -initWithAuthError shared gameCode authenticationError = +initWithError : Shared -> GameCode -> MdError -> ( Model, Cmd Global.Msg ) +initWithError shared gameCode error = let ( model, cmd ) = init shared { section = Join (Just gameCode) } @@ -102,7 +105,7 @@ initWithAuthError shared gameCode authenticationError = jlr = model.joinLobbyRequest in - ( { model | joinLobbyRequest = { jlr | error = authenticationError |> MdError.Authentication |> Just } }, cmd ) + ( { model | joinLobbyRequest = { jlr | error = error |> Just } }, cmd ) route : Model -> Route @@ -191,6 +194,10 @@ update shared msg model = view : Shared -> Model -> List (Html Global.Msg) view shared model = + let + r = + model.route + in [ Html.div [ HtmlA.class "page start" ] [ overlay shared model.overlay , Html.header [ HtmlA.class "title-card" ] @@ -201,13 +208,14 @@ view shared model = ] ] ] - , Wl.card [] - [ Wl.tabGroup [ WlA.align WlA.Center ] - [ tab shared New model Icon.plus Strings.NewGame - , tab shared (Join model.gameCode) model Icon.signInAlt Strings.JoinPrivateGame - , tab shared Find model Icon.search Strings.FindPublicGame - , tab shared About model Icon.questionCircle Strings.AboutTheGame - ] + , Card.view [] + [ Tabs.view shared + { selected = r.section + , change = \s -> Route.Start { r | section = s } |> Global.ChangePage + , ids = NeList New [ Join model.gameCode, Find, About ] + , tab = tabFor + , equals = sectionsMatch + } , sectionContent shared model ] , Html.footer [ HtmlA.class "version-info" ] @@ -240,18 +248,32 @@ view shared model = {- Private -} +tabFor : Section -> Tabs.TabModel +tabFor section = + case section of + New -> + Tabs.TabModel Strings.NewGame (Just Icon.plus) + + Join _ -> + Tabs.TabModel Strings.JoinPrivateGame (Just Icon.signInAlt) + + Find -> + Tabs.TabModel Strings.FindPublicGame (Just Icon.search) + + About -> + Tabs.TabModel Strings.AboutTheGame (Just Icon.questionCircle) + + overlay : Shared -> Maybe MdString -> Html Global.Msg overlay shared content = case content of Just text -> Html.div [ HtmlA.id "overlay" ] - [ Components.iconButton - [ HtmlA.class "close" - , HideOverlay |> Global.StartMsg |> HtmlE.onClick - , Strings.Close |> Lang.title shared - ] - Icon.times - , Wl.card [] + [ IconButton.view shared + Strings.Close + (Icon.times |> Icon.present |> NeList.just) + (HideOverlay |> Global.StartMsg |> Just) + , Card.view [] [ text |> Lang.html shared ] ] @@ -306,24 +328,6 @@ gameCodeForRoute r = Nothing -tab : Shared -> Section -> Model -> Icon -> MdString -> Html Global.Msg -tab shared targetSection model icon title = - let - r = - model.route - in - Wl.tab - (List.concat - [ [ Route.Start { r | section = targetSection } |> Global.ChangePage |> HtmlE.onClick - ] - , [ WlA.checked ] |> Maybe.justIf (sectionsMatch r.section targetSection) |> Maybe.withDefault [] - ] - ) - [ Icon.viewIcon icon - , title |> Lang.html shared - ] - - sectionsMatch : Section -> Section -> Bool sectionsMatch first second = case first of @@ -381,17 +385,18 @@ newContent shared model = |> Maybe.withDefault Html.nothing in Html.div [ HtmlA.class "new-game start-tab" ] - [ error - , Html.div [ HtmlA.class "restrict" ] - (List.concat - [ nameField shared model Nothing - , [ Wl.button - [ buttonAttr - ] - [ buttonIcon, Strings.PlayGame |> Lang.html shared ] - ] - ] - ) + [ Html.div [ HtmlA.class "tab-content" ] + [ Html.h2 [] [ Strings.NewGame |> Lang.html shared ] + , Html.p [] [ Html.text "Start a new game of Massive Decks." ] + , error + , nameField shared model Nothing + , Button.view shared + Button.Raised + Strings.PlayGame + Strings.PlayGame + buttonIcon + [ buttonAttr ] + ] ] @@ -437,31 +442,35 @@ joinContent shared model = |> Maybe.withDefault [] in Html.div [ HtmlA.class "join-game start-tab" ] - [ error - , Html.div [ HtmlA.class "restrict" ] + [ Html.div [ HtmlA.class "tab-content" ] (List.concat - [ rejoinSection shared model - , nameField shared model nameError - , [ Form.section shared + [ [ Html.h2 [] [ Strings.JoinPrivateGame |> Lang.html shared ] + , Html.p [] [ Html.text "Join a game someone invited you to." ] + , error + ] + , rejoinSection shared model + , [ nameField shared model Nothing + , Form.section shared "game-code-input" - (Wl.textField + (TextField.view shared + Strings.GameCodeTerm + TextField.Text + (model.gameCode |> Maybe.map GameCode.toString |> Maybe.withDefault "") [ HtmlA.class "game-code-input" , GameCodeChanged >> Global.StartMsg |> HtmlE.onInput - , WlA.value (model.gameCode |> Maybe.map GameCode.toString |> Maybe.withDefault "") - , WlA.outlined - , Strings.GameCodeTerm |> Lang.label shared ] - [] ) [ Message.info Strings.GameCodeHowToAcquire , gameError |> Maybe.map Message.mdError |> Maybe.withDefault Message.none ] ] , maybePasswordField - , [ Wl.button - [ buttonAttr - ] - [ buttonIcon, Strings.PlayGame |> Lang.html shared ] + , [ Button.view shared + Button.Raised + Strings.PlayGame + Strings.PlayGame + buttonIcon + [ buttonAttr ] ] ] ) @@ -472,13 +481,11 @@ passwordField : Shared -> Maybe MdError -> String -> List (Html Global.Msg) passwordField shared error password = [ Form.section shared "password-input" - (Wl.textField - [ PasswordChanged >> Global.StartMsg |> HtmlE.onInput - , WlA.value password - , WlA.outlined - , Strings.LobbyPassword |> Lang.label shared - ] - [] + (TextField.view shared + Strings.LobbyPassword + TextField.Password + password + [ PasswordChanged >> Global.StartMsg |> HtmlE.onInput ] ) [ Message.info Strings.LobbyRequiresPassword , error |> Maybe.map (MdError.describe >> Message.error) |> Maybe.withDefault Message.none @@ -518,22 +525,17 @@ rejoinLobby shared result = Nothing -nameField : Shared -> Model -> Maybe MdError -> List (Html Global.Msg) +nameField : Shared -> Model -> Maybe MdError -> Html Global.Msg nameField shared model error = - [ Form.section shared + Form.section shared "name-input" - (Wl.textField - [ NameChanged - >> Global.StartMsg - |> HtmlE.onInput - , WlA.value model.name - , Strings.NameLabel |> Lang.label shared - , WlA.outlined - ] - [] + (TextField.view shared + Strings.NameLabel + TextField.Text + model.name + [ NameChanged >> Global.StartMsg |> HtmlE.onInput ] ) [ error |> Maybe.map (MdError.describe >> Message.error) |> Maybe.withDefault Message.none ] - ] aboutContent : Shared -> Html Global.Msg diff --git a/client/src/elm/MassiveDecks/Pages/Start/LobbyBrowser.elm b/client/src/elm/MassiveDecks/Pages/Start/LobbyBrowser.elm index 61b53cb..2f9769f 100644 --- a/client/src/elm/MassiveDecks/Pages/Start/LobbyBrowser.elm +++ b/client/src/elm/MassiveDecks/Pages/Start/LobbyBrowser.elm @@ -9,7 +9,6 @@ import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE import Html.Keyed as HtmlK import Http import MassiveDecks.Messages as Global @@ -30,8 +29,7 @@ import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Util.Html as Html import MassiveDecks.Util.List as List import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA +import Material.ListView as ListView {-| Set up the lobby browser. @@ -163,10 +161,15 @@ stateGroup shared ( state, lobbies ) = lobby : Shared -> Summary -> ( String, Html Global.Msg ) lobby shared data = ( data.gameCode |> GameCode.toString - , Wl.listItem - [ HtmlE.onClick (Route.Start { section = Start.Join (Just data.gameCode) } |> Global.ChangePage) - , WlA.clickable - ] + , ListView.viewItem + (ListView.Enabled (Route.Start { section = Start.Join (Just data.gameCode) } |> Global.ChangePage)) + Nothing + ([ Html.span [ HtmlA.class "lobby-game-code" ] + [ Strings.GameCode { code = GameCode.toString data.gameCode } |> Lang.html shared ] + ] + |> Just + ) + ([ Icon.viewStyled [ HtmlA.title "Join Game" ] Icon.signInAlt ] |> Just) [ Html.span [ HtmlA.class "lobby-name", Strings.LobbyRequiresPassword |> Lang.title shared ] [ Html.text data.name , Html.text " " @@ -175,12 +178,5 @@ lobby shared data = |> Maybe.justIf data.password |> Maybe.withDefault Html.nothing ] - , Html.span [ HtmlA.class "lobby-game-code" ] - [ Strings.GameCode { code = GameCode.toString data.gameCode } |> Lang.html shared ] - , Icon.viewStyled - [ HtmlA.title "Join Game" - , WlA.listItemSlot WlA.AfterItem - ] - Icon.signInAlt ] ) diff --git a/client/src/elm/MassiveDecks/Pages/Unknown.elm b/client/src/elm/MassiveDecks/Pages/Unknown.elm index 7e72115..b7a9faf 100644 --- a/client/src/elm/MassiveDecks/Pages/Unknown.elm +++ b/client/src/elm/MassiveDecks/Pages/Unknown.elm @@ -17,7 +17,7 @@ import MassiveDecks.Pages.Unknown.Model exposing (..) import MassiveDecks.Pages.Unknown.Route exposing (..) import MassiveDecks.Strings exposing (MdString(..)) import MassiveDecks.Strings.Languages as Lang -import Weightless +import Material.Card as Card changeRoute : Route -> Model -> ( Model, Cmd Msg ) @@ -38,7 +38,7 @@ route model = view : Shared -> Model -> List (Html Msg) view shared _ = [ Html.div [ HtmlA.class "page unknown-page" ] - [ Weightless.card [] + [ Card.view [] [ Html.h1 [] [ Icon.viewIcon Icon.exclamationCircle, Lang.html shared UnknownPageTitle ] , Html.p [] [ Html.a [ Route.url (Route.Start { section = Start.New }) |> HtmlA.href ] diff --git a/client/src/elm/MassiveDecks/Ports.elm b/client/src/elm/MassiveDecks/Ports.elm index d177ed5..1e59039 100644 --- a/client/src/elm/MassiveDecks/Ports.elm +++ b/client/src/elm/MassiveDecks/Ports.elm @@ -9,6 +9,7 @@ port module MassiveDecks.Ports exposing , serverSend , speechCommands , speechVoices + , startConfetti , storeSettings , tryCast ) @@ -50,3 +51,6 @@ port remoteControl : (Json.Value -> msg) -> Sub msg port languageChanged : String -> Cmd msg + + +port startConfetti : String -> Cmd msg diff --git a/client/src/elm/MassiveDecks/Requests/Api.elm b/client/src/elm/MassiveDecks/Requests/Api.elm index bcae42b..031615b 100644 --- a/client/src/elm/MassiveDecks/Requests/Api.elm +++ b/client/src/elm/MassiveDecks/Requests/Api.elm @@ -69,7 +69,7 @@ joinLobby msg gameCode registration = {-| Check if previously joined lobbies are still going. -} -checkAlive : (Request.Response Never (Dict Lobby.Token Bool) -> msg) -> List Lobby.Token -> Request msg +checkAlive : (Request.Response Never (List Lobby.Token) -> msg) -> List Lobby.Token -> Request msg checkAlive msg tokens = { method = "POST" , headers = [] diff --git a/client/src/elm/MassiveDecks/Requests/HttpData.elm b/client/src/elm/MassiveDecks/Requests/HttpData.elm index dda9f65..a9c1892 100644 --- a/client/src/elm/MassiveDecks/Requests/HttpData.elm +++ b/client/src/elm/MassiveDecks/Requests/HttpData.elm @@ -13,7 +13,6 @@ import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon import Html exposing (Html) import Html.Attributes as HtmlA -import Html.Events as HtmlE import MassiveDecks.Error as Error import MassiveDecks.Model exposing (Shared) import MassiveDecks.Pages.Route exposing (Route) @@ -21,10 +20,10 @@ import MassiveDecks.Requests.HttpData.Messages exposing (..) import MassiveDecks.Requests.HttpData.Model exposing (..) import MassiveDecks.Requests.Request as Request exposing (Request) import MassiveDecks.Strings as Strings exposing (MdString) -import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Maybe as Maybe +import MassiveDecks.Util.NeList exposing (NeList(..)) +import Material.IconButton as IconButton import Time -import Weightless as Wl -import Weightless.Attributes as WlA {-| Set up the empty HttpData and send a request to load the data. @@ -111,31 +110,16 @@ view shared route emptyContent viewResult model = {-| Show a refresh button for the data. -} refreshButton : Shared -> HttpData error result -> Html (Msg error result) -refreshButton shared model = +refreshButton shared { loading, data } = let - title = - [ Strings.Refresh |> Lang.title shared ] - - onClick = - if not model.loading then - [ HtmlE.onClick Pull ] + applyStyle = + if loading then + Icon.styled [ Icon.spin ] else - [] - - style = - [ WlA.flat - , WlA.fab - , WlA.inverted - ] - - spin = - if model.loading then - [ Icon.spin ] - - else - [] + identity in - Wl.button - (List.concat [ style, title, onClick ]) - [ Icon.viewStyled spin Icon.sync ] + IconButton.view shared + Strings.Refresh + (NeList (Icon.sync |> Icon.present |> applyStyle) []) + (Pull |> Maybe.justIf (not loading)) diff --git a/client/src/elm/MassiveDecks/Settings.elm b/client/src/elm/MassiveDecks/Settings.elm index 0a6471a..51ce7a9 100644 --- a/client/src/elm/MassiveDecks/Settings.elm +++ b/client/src/elm/MassiveDecks/Settings.elm @@ -15,13 +15,12 @@ import Dict.Extra as Dict import FontAwesome.Attributes as Icon import FontAwesome.Icon as Icon import FontAwesome.Solid as Icon -import Html exposing (Html) +import Html as Html exposing (Html) import Html.Attributes as HtmlA import Html.Events as HtmlE import Http import MassiveDecks.Card.Source as Source import MassiveDecks.Card.Source.Model as Source -import MassiveDecks.Components as Components import MassiveDecks.Components.Form as Form import MassiveDecks.Components.Form.Message as Message import MassiveDecks.Icon as Icon @@ -41,11 +40,12 @@ import MassiveDecks.Speech as Speech import MassiveDecks.Strings as Strings import MassiveDecks.Strings.Languages as Lang import MassiveDecks.Strings.Languages.Model as Lang exposing (Language) -import MassiveDecks.Util.Html.Attributes as HtmlA -import MassiveDecks.Util.Maybe as Maybe -import Weightless as Wl -import Weightless.Attributes as WlA -import Weightless.Slider as Slider +import MassiveDecks.Util.NeList exposing (NeList(..)) +import MassiveDecks.Util.Order as Order +import Material.IconButton as IconButton +import Material.Select as Select +import Material.Slider as Slider +import Material.Switch as Switch init : (Msg -> msg) -> Settings -> ( Model, Cmd msg ) @@ -115,7 +115,7 @@ update shared msg = let newTokens = model.settings.tokens - |> Dict.filter (\_ -> \t -> Dict.get t tokenValidity |> Maybe.withDefault True) + |> Dict.filter (\_ -> \t -> List.member t tokenValidity) in changeSettings (\s -> { s | tokens = newTokens }) model @@ -129,9 +129,9 @@ update shared msg = ChangeSpeech voice -> let newSpeechSettings = - model.settings.speech |> Speech.selectVoice voice + voice |> Maybe.map (\v -> model.settings.speech |> Speech.selectVoice v) in - changeSettings (\s -> { s | speech = newSpeechSettings }) model + changeSettings (\s -> { s | speech = newSpeechSettings |> Maybe.withDefault s.speech }) model ToggleAutoAdvance enabled -> changeSettings (\s -> { s | autoAdvance = Just enabled }) model @@ -167,15 +167,10 @@ view wrap shared = Icon.cog button = - Components.iconButtonStyled - [ HtmlA.id "settings-button" - , ToggleOpen |> wrap |> HtmlE.onClick - , Strings.SettingsTitle |> Lang.title shared - ] - ( [ Icon.lg ], icon ) + IconButton.view shared Strings.SettingsTitle (NeList (icon |> Icon.present |> Icon.styled [ Icon.lg ]) []) (ToggleOpen |> wrap |> Just) panel = - Wl.card [ HtmlA.classList [ ( "settings-panel", True ), ( "open", model.open ) ] ] + Html.div [ HtmlA.classList [ ( "settings-panel", True ), ( "mdc-card", True ), ( "open", model.open ) ] ] [ Html.h3 [] [ Strings.SettingsTitle |> Lang.html shared ] , Html.div [ HtmlA.class "body" ] (List.intersperse (Html.hr [] []) @@ -296,44 +291,30 @@ cardSize wrap shared = "card-size" (Html.div [ HtmlA.class "multipart" ] - [ Wl.slider - [ HtmlA.class "primary" - , Slider.step 1 - , Slider.min 1 - , Slider.max 3 - , Strings.CardSizeSetting |> Lang.string shared |> WlA.label - , WlA.outlined - , Slider.thumbLabel True - , String.toInt - >> Maybe.andThen cardSizeFromValue - >> Maybe.withDefault Full - >> ChangeCardSize - >> wrap - |> HtmlE.onInput - , settings.cardSize |> cardSizeToValue |> String.fromInt |> WlA.value - ] - [ Icon.viewStyled [ Slider.slot Slider.Before ] Icon.searchMinus - , [ settings.cardSize |> cardSizeThumb ] |> Html.span [ Slider.slot Slider.ThumbLabel ] - , Icon.viewStyled [ Slider.slot Slider.After ] Icon.searchPlus + [ Html.div + [ HtmlA.class "card-size-slider" ] + [ Icon.viewStyled [] Icon.minimalCardSize + , Slider.view + [ HtmlA.class "primary" + , Slider.step 1 + , Slider.min 1 + , Slider.max 3 + , Slider.pin + , Slider.markers + , cardSizeFromValue + >> Maybe.withDefault Full + >> ChangeCardSize + >> wrap + |> Slider.onChange + , settings.cardSize |> cardSizeToValue |> Slider.value + ] + , Icon.viewStyled [] Icon.callCard ] ] ) [ Message.info Strings.CardSizeExplanation ] -cardSizeThumb : CardSize -> Html msg -cardSizeThumb size = - case size of - Minimal -> - Icon.viewIcon Icon.minimalCardSize - - Square -> - Icon.viewIcon Icon.squareCardSize - - Full -> - Icon.viewIcon Icon.callCard - - autoAdvanceRound : (Msg -> msg) -> Shared -> Html msg autoAdvanceRound wrap shared = let @@ -344,11 +325,12 @@ autoAdvanceRound wrap shared = "auto-advance" (Html.div [ HtmlA.class "multipart" ] - [ Wl.switch + [ Switch.view [ HtmlE.onCheck (ToggleAutoAdvance >> wrap) , HtmlA.checked (settings.autoAdvance |> Maybe.withDefault False) + , HtmlA.id "auto-advance-enable" ] - , Html.label [] + , Html.label [ HtmlA.for "auto-advance-enable" ] [ Icon.viewIcon Icon.commentDots , Html.text " " , Strings.AutoAdvanceSetting |> Lang.html shared @@ -379,6 +361,12 @@ speechVoiceSelector wrap shared = else Message.none + + currentLanguage = + shared |> Lang.currentLanguage + + voiceSortOrder = + combinedOrder (NeList defaultFirst [ languageMatchFirst currentLanguage ]) in Html.div [] [ Form.section shared @@ -386,24 +374,31 @@ speechVoiceSelector wrap shared = (Html.div [] [ Html.div [ HtmlA.class "multipart" ] - [ Wl.switch + [ Switch.view [ HtmlE.onCheck (ToggleSpeech >> wrap) , HtmlA.disabled isDisabled , HtmlA.checked enabled + , HtmlA.id "speech-enable" ] - , Html.label [] + , Html.label [ HtmlA.for "speech-enable" ] [ Icon.viewIcon Icon.commentDots , Html.text " " , Strings.SpeechSetting |> Lang.html shared ] ] - , Wl.select - [ HtmlE.onInput (ChangeSpeech >> wrap) - , Strings.VoiceSetting |> Lang.string shared |> WlA.label - , WlA.outlined - , HtmlA.disabled (not enabled || isDisabled) + , Html.div [ HtmlA.class "children" ] + [ Select.view shared + { label = Strings.VoiceSetting + , idToString = identity + , idFromString = Just + , selected = selectedVoice + , wrap = ChangeSpeech >> wrap + } + [ HtmlA.disabled (not enabled || isDisabled) + , HtmlA.class "secondary" + ] + (voices |> List.sortWith voiceSortOrder |> List.map speechVoiceOption) ] - (voices |> List.sortWith defaultFirst |> List.map (speechVoiceOption selectedVoice)) ] ) [ Message.info Strings.SpeechExplanation @@ -414,7 +409,7 @@ speechVoiceSelector wrap shared = defaultFirst : Speech.Voice -> Speech.Voice -> Order defaultFirst a b = - if a.default && b.default then + if a.default == b.default then EQ else if a.default then @@ -424,19 +419,38 @@ defaultFirst a b = GT -speechVoiceOption : Maybe String -> Speech.Voice -> Html msg -speechVoiceOption selectedVoice voice = - let - selected = - if selectedVoice == Just voice.name then - [ WlA.selected ] +languageMatchFirst : Language -> Speech.Voice -> Speech.Voice -> Order +languageMatchFirst lang = + Lang.sortClosestFirst lang |> Order.map (.lang >> Lang.fromCode) - else - [] - in - Html.option - (HtmlA.value voice.name :: selected) - [ Html.text (voice.name ++ " (" ++ voice.lang ++ ")") ] + +combinedOrder : NeList (a -> a -> Order) -> a -> a -> Order +combinedOrder (NeList first rest) a b = + case rest of + [] -> + first a b + + next :: remaining -> + let + result = + first a b + in + case result of + EQ -> + combinedOrder (NeList next remaining) a b + + _ -> + result + + +speechVoiceOption : Speech.Voice -> Select.ItemModel String msg +speechVoiceOption voice = + { id = voice.name + , icon = Nothing + , primary = [ voice.name |> Html.text ] + , secondary = Nothing + , meta = Nothing + } notificationsSwitch : (Msg -> msg) -> Shared -> Html msg @@ -462,12 +476,13 @@ notificationsSwitch wrap shared = (Html.div [] [ Html.div [ HtmlA.class "multipart" ] - [ Wl.switch + [ Switch.view [ HtmlE.onCheck (ToggleNotifications >> wrap) , HtmlA.disabled unsupported , HtmlA.checked enabled + , HtmlA.id "notifications-enable" ] - , Html.label [] + , Html.label [ HtmlA.for "notifications-enable" ] [ Icon.viewIcon Icon.bell , Html.text " " , Strings.NotificationsSetting |> Lang.html shared @@ -479,12 +494,13 @@ notificationsSwitch wrap shared = "only-when-hidden" (Html.div [ HtmlA.class "multipart" ] - [ Wl.switch + [ Switch.view [ HtmlE.onCheck (ToggleOnlyWhenHidden >> wrap) , HtmlA.disabled visibilityDisabled , HtmlA.checked settings.requireNotVisible + , HtmlA.id "only-when-hidden-toggle" ] - , Html.label [] + , Html.label [ HtmlA.for "only-when-hidden-toggle" ] [ Icon.viewIcon Icon.eyeSlash , Html.text " " , Strings.NotificationOnlyWhenHiddenSetting |> Lang.html shared @@ -520,41 +536,42 @@ languageSelector wrap shared = Form.section shared "language" - (Wl.select - [ HtmlE.onInput (Lang.fromCode >> ChangeLang >> wrap) - , Strings.LanguageSetting |> Lang.string shared |> WlA.label - , WlA.outlined - ] - (Lang.languages |> List.map (languageOption selected)) + (Select.view shared + { label = Strings.LanguageSetting + , idToString = Lang.code + , idFromString = Lang.fromCode + , selected = Just selected + , wrap = ChangeLang >> wrap + } + [] + (Lang.languages |> List.map (languageOption shared selected)) ) [ Message.info Strings.MissingLanguage ] -languageOption : Language -> Language -> Html msg -languageOption currentLanguage language = +languageOption : Shared -> Language -> Language -> Select.ItemModel Language msg +languageOption shared currentLanguage language = let - autonym = - language |> Lang.autonym - nameInCurrentLanguage = - language |> Lang.languageName |> Lang.givenLanguageString currentLanguage + language + |> Lang.languageName + |> Lang.givenLanguageString currentLanguage - name = - if currentLanguage == language then - [ autonym |> Html.text ] + autonym = + if language /= currentLanguage then + language + |> Lang.autonym + |> (\n -> Just [ Strings.AutonymFormat { autonym = n } |> Lang.html shared ]) else - [ autonym |> Html.text - , Html.text " (" - , nameInCurrentLanguage |> Html.text - , Html.text ")" - ] + Nothing in - Html.option - [ WlA.selected |> Maybe.justIf (currentLanguage == language) |> Maybe.withDefault HtmlA.nothing - , language |> Lang.code |> HtmlA.value - ] - name + { id = language + , icon = Nothing + , primary = [ nameInCurrentLanguage |> Html.text ] + , secondary = autonym + , meta = Nothing + } ignore : (Msg -> msg) -> a -> msg diff --git a/client/src/elm/MassiveDecks/Settings/Messages.elm b/client/src/elm/MassiveDecks/Settings/Messages.elm index 9e998b3..80899e8 100644 --- a/client/src/elm/MassiveDecks/Settings/Messages.elm +++ b/client/src/elm/MassiveDecks/Settings/Messages.elm @@ -1,6 +1,5 @@ module MassiveDecks.Settings.Messages exposing (Msg(..)) -import Dict exposing (Dict) import MassiveDecks.Pages.Lobby.Model as Lobby import MassiveDecks.Settings.Model exposing (..) import MassiveDecks.Strings.Languages.Model exposing (Language) @@ -11,10 +10,10 @@ type Msg | ChangeCardSize CardSize | ChangeOpenUserList Bool | ToggleOpen - | RemoveInvalid (Dict Lobby.Token Bool) + | RemoveInvalid (List Lobby.Token) | ToggleSpeech Bool | ToggleAutoAdvance Bool - | ChangeSpeech String + | ChangeSpeech (Maybe String) | ToggleNotifications Bool | ToggleOnlyWhenHidden Bool | NoOp diff --git a/client/src/elm/MassiveDecks/Strings.elm b/client/src/elm/MassiveDecks/Strings.elm index 617cb36..0e4aabb 100644 --- a/client/src/elm/MassiveDecks/Strings.elm +++ b/client/src/elm/MassiveDecks/Strings.elm @@ -38,6 +38,8 @@ type MdString | RejoinGame { code : String } -- A description of the action of attempting to rejoin a game the user was previously in. | LobbyRequiresPassword -- An explanation that the given lobby requires a password to join. | YouWereKicked -- An explanation that the player was kicked from the lobby they were in. + | ScrollToTop -- A description of the action of scrolling to the top of a screen. + | Copy -- A description of the action of copying something (i.e: copy and paste). -- Rules | CardsAgainstHumanity -- The name of "Cards Against Humanity" (https://cardsagainsthumanity.com/). | Rules -- The title for a DESCRIPTION of the rules. @@ -80,6 +82,7 @@ type MdString | SettingsTitle -- The title for the settings panel. | LanguageSetting -- The label for the "Language" setting. | MissingLanguage -- A question asking if the user doesn't see the language they want. + | AutonymFormat { autonym : String } -- How to format the name for a language in that language (e.g: in brackets). | TranslationBeg -- A request for help translating the game. | CardSizeSetting -- The label for the "Card Size" setting. | CardSizeExplanation -- An explanation of what the card size does (changes the size of the card). @@ -113,6 +116,10 @@ type MdString | GameCodeSpecificDescription -- A short description of what a specific game code and how to use it. | GameCodeHowToAcquire -- A short description of how to get a game code. | Deck -- The name for a deck of cards. + | DeckSource -- The name for a source of decks of cards. + | DeckLanguage { language : MdString } -- A description of what language a deck is in. + | DeckAuthor { author : String } -- A description of who created the deck. + | DeckTranslator { translator : String } -- A description of who translated the deck. | StillPlaying -- A term for a person who is in a round, but has not yet submitted a play. | PlayingDescription -- A description of a person who is in a round, but has not yet submitted a play. | Played -- A term for a person who is in a round, and has submitted a play. @@ -197,6 +204,7 @@ type MdString | WaitForDecks -- A hint that the user has to wait for decks to load before starting the game. | MissingCardType { cardType : MdString } -- An error explaining that the user needs a deck with the given type of card (call/response). | NotEnoughCardsOfType { cardType : MdString, needed : Int, have : Int } -- An error explaining that the user needs to add more cards of the given type for the number of players. + | AddBlankCards { amount : Int } -- A description of the action of adding the given number of blank cards to the game. | AddDeck -- A description of the action of adding a deck to the game configuration. | RemoveDeck -- A description of the action of removing a deck from the game configuration. | SourceNotFound { source : MdString } -- An explanation that the deck didn't load because it doesn't exist on the source service. @@ -246,6 +254,9 @@ type MdString | ConflictDescription -- An explanation of what a conflict is. | YourChanges -- A title for a section showing changes tot he configuration by the user. | TheirChanges -- A title for a section showing changes to the configuration by someone else. + | ConfigurationDisabledWhileInGame -- A message explaining that the configuration can't be changed while the game is in-progress. + | ConfigurationDisabledIfNotPrivileged -- A message explaining that the configuration can't be changed if the user isn't privileged. + | ConfigureNextGame -- A description of the action of configuring the next game for the lobby after the current one finished. -- Game | SubmitPlay -- A description of the action of submitting the play for the czar to judge. | TakeBackPlay -- A description of the action of taking back a previously submitted play. diff --git a/client/src/elm/MassiveDecks/Strings/Languages.elm b/client/src/elm/MassiveDecks/Strings/Languages.elm index db0b695..461fbc5 100644 --- a/client/src/elm/MassiveDecks/Strings/Languages.elm +++ b/client/src/elm/MassiveDecks/Strings/Languages.elm @@ -13,6 +13,7 @@ module MassiveDecks.Strings.Languages exposing , languages , placeholder , recommended + , sortClosestFirst , string , title ) @@ -34,7 +35,7 @@ import MassiveDecks.Strings.Render as Render import MassiveDecks.Strings.Translation as Translation import MassiveDecks.Util.Maybe as Maybe import MassiveDecks.Util.String as String -import Weightless.Attributes as WlA +import Material.Attributes as Material {-| A list of all the languages enabled in the application, in the order they will be presented to the end-user. @@ -75,6 +76,24 @@ autonym language = languageName language |> givenLanguageString language +{-| A sort that gives the closest matches first. +Currently this just puts all exact matches first. +-} +sortClosestFirst : Language -> Maybe Language -> Maybe Language -> Order +sortClosestFirst target a b = + if a == b then + EQ + + else if a == Just target then + LT + + else if b == Just target then + GT + + else + EQ + + {-| The language the user is currently seeing the page in. -} currentLanguage : Shared -> Language @@ -144,11 +163,11 @@ alt shared = string shared >> String.capitalise >> HtmlA.alt -{-| Convenience for an Weightless `label` attribute from the given `MdString`. +{-| Convenience for a Material `label` attribute from the given `MdString`. -} label : Shared -> MdString -> Html.Attribute msg label shared = - string shared >> String.capitalise >> WlA.label + string shared >> String.capitalise >> Material.label {-| Get a deck to recommend to the user if they haven't added any. diff --git a/client/src/elm/MassiveDecks/Strings/Languages/En.elm b/client/src/elm/MassiveDecks/Strings/Languages/En.elm index 8ddae75..57bb832 100644 --- a/client/src/elm/MassiveDecks/Strings/Languages/En.elm +++ b/client/src/elm/MassiveDecks/Strings/Languages/En.elm @@ -15,7 +15,7 @@ pack = { code = "en" , name = English , translate = translate - , recommended = "cah-base-en" |> BuiltIn.Id |> Source.BuiltIn + , recommended = "cah-base-en" |> BuiltIn.hardcoded |> Source.BuiltIn } @@ -120,6 +120,12 @@ translate mdString = YouWereKicked -> [ Text "You were kicked from the game." ] + ScrollToTop -> + [ Text "Scroll to the top." ] + + Copy -> + [ Text "Copy" ] + -- Rules CardsAgainstHumanity -> [ Text "Cards Against Humanity" ] @@ -300,6 +306,9 @@ translate mdString = MissingLanguage -> [ Text "Don’t see your language? ", Ref TranslationBeg ] + AutonymFormat { autonym } -> + [ Text "(", Text autonym, Text ")" ] + TranslationBeg -> [ Text "Help translate " , Ref MassiveDecks @@ -404,6 +413,18 @@ translate mdString = Deck -> [ Text "Deck" ] + DeckSource -> + [ Ref Deck, Text " Source" ] + + DeckLanguage { language } -> + [ Text "in ", Ref language ] + + DeckAuthor { author } -> + [ Text "by ", Text author ] + + DeckTranslator { translator } -> + [ Text "translation by ", Text translator ] + StillPlaying -> [ Text "Playing" ] @@ -622,7 +643,7 @@ translate mdString = [ Text "End the game now." ] ReturnViewToGame -> - [ Text "Return" ] + [ Text "Return to game" ] ReturnViewToGameDescription -> [ Text "Return to the main game view." ] @@ -693,6 +714,13 @@ translate mdString = , Text "." ] + AddBlankCards { amount } -> + [ Text "Add " + , amount |> String.fromInt |> Text + , Text " blank " + , Ref (Plural { singular = Response, amount = Just amount }) + ] + AddDeck -> [ Text "Add deck." ] @@ -864,6 +892,15 @@ translate mdString = TheirChanges -> [ Text "Their Changes" ] + ConfigurationDisabledWhileInGame -> + [ Text "While the game in progress, you can't change the configuration." ] + + ConfigurationDisabledIfNotPrivileged -> + [ Text "You can't change the configuration of this game." ] + + ConfigureNextGame -> + [ Text "Configure Next Game" ] + -- Game SubmitPlay -> [ Text "Give these cards to the ", Ref Czar, Text " as your play for the round." ] diff --git a/client/src/elm/MassiveDecks/Strings/Languages/It.elm b/client/src/elm/MassiveDecks/Strings/Languages/It.elm index ac1ea67..8862335 100644 --- a/client/src/elm/MassiveDecks/Strings/Languages/It.elm +++ b/client/src/elm/MassiveDecks/Strings/Languages/It.elm @@ -13,7 +13,7 @@ pack = { code = "it" , name = Italian , translate = translate - , recommended = "cah-base-en" |> BuiltIn.Id |> Source.BuiltIn + , recommended = "cah-base-en" |> BuiltIn.hardcoded |> Source.BuiltIn } @@ -136,6 +136,14 @@ translate mdString = YouWereKicked -> [ Text "Sei stato espulso dal gioco." ] + -- TODO: Translate + ScrollToTop -> + [ Text "Scroll to the top." ] + + -- TODO: Translate + Copy -> + [ Text "Copy" ] + -- Rules CardsAgainstHumanity -> [ Text "Cards Against Humanity" ] @@ -316,6 +324,9 @@ translate mdString = MissingLanguage -> [ Text "Non vedi la tua lingua? ", Ref TranslationBeg ] + AutonymFormat { autonym } -> + [ Text "(", Text autonym, Text ")" ] + TranslationBeg -> [ Text "Aiuta a tradurre " , Ref MassiveDecks @@ -420,6 +431,22 @@ translate mdString = Deck -> [ Text "Mazzo" ] + -- TODO: Translate + DeckSource -> + [ Ref Deck, Text " Source" ] + + -- TODO: Translate + DeckLanguage { language } -> + [ Text "in ", Ref language ] + + -- TODO: Translate + DeckAuthor { author } -> + [ Text "by ", Text author ] + + -- TODO: Translate + DeckTranslator { translator } -> + [ Text "translation by ", Text translator ] + StillPlaying -> [ Text "Sta giocando" ] @@ -711,6 +738,14 @@ translate mdString = , Text "." ] + -- TODO: Translate + AddBlankCards { amount } -> + [ Text "Add " + , amount |> String.fromInt |> Text + , Text " blank " + , Ref (Plural { singular = Response, amount = Just amount }) + ] + AddDeck -> [ Text "Aggiungi mazzo." ] @@ -883,6 +918,18 @@ translate mdString = TheirChanges -> [ Text "Le sue modifiche" ] + -- TODO: Translate + ConfigurationDisabledWhileInGame -> + [ Text "While the game in progress, you can't change the configuration." ] + + -- TODO: Translate + ConfigurationDisabledIfNotPrivileged -> + [ Text "You can't change the configuration of this game." ] + + -- TODO: Translate + ConfigureNextGame -> + [ Text "Configure Next Game" ] + -- Game SubmitPlay -> [ Text "Dai queste carte al ", Ref Czar, Text " come giocata per il turno." ] diff --git a/client/src/elm/MassiveDecks/Strings/Languages/PtBR.elm b/client/src/elm/MassiveDecks/Strings/Languages/PtBR.elm index 2be8928..38108ff 100644 --- a/client/src/elm/MassiveDecks/Strings/Languages/PtBR.elm +++ b/client/src/elm/MassiveDecks/Strings/Languages/PtBR.elm @@ -11,10 +11,10 @@ import MassiveDecks.Strings.Translation as Translation exposing (Result(..)) pack : Translation.Pack pack = - { code = "ptBR" + { code = "pt-BR" , name = BrazilianPortuguese , translate = translate - , recommended = "cah-base-ptbr" |> BuiltIn.Id |> Source.BuiltIn + , recommended = "cah-base-ptbr" |> BuiltIn.hardcoded |> Source.BuiltIn } @@ -137,6 +137,14 @@ translate mdString = YouWereKicked -> [ Text "Você foi chutado do jogo." ] + -- TODO: Translate + ScrollToTop -> + [ Text "Scroll to the top." ] + + -- TODO: Translate + Copy -> + [ Text "Copy" ] + -- Rules CardsAgainstHumanity -> [ Text "Cartas Contra a Humanidade" ] @@ -317,6 +325,9 @@ translate mdString = MissingLanguage -> [ Text "Não vê seu idioma? ", Ref TranslationBeg ] + AutonymFormat { autonym } -> + [ Text "(", Text autonym, Text ")" ] + TranslationBeg -> [ Text "Ajudar a traduzir o " , Ref MassiveDecks @@ -420,6 +431,22 @@ translate mdString = Deck -> [ Text "Deck" ] + -- TODO: Translate + DeckSource -> + [ Ref Deck, Text " Source" ] + + -- TODO: Translate + DeckLanguage { language } -> + [ Text "in ", Ref language ] + + -- TODO: Translate + DeckAuthor { author } -> + [ Text "by ", Text author ] + + -- TODO: Translate + DeckTranslator { translator } -> + [ Text "translation by ", Text translator ] + StillPlaying -> [ Text "Jogando" ] @@ -709,6 +736,14 @@ translate mdString = , Text "." ] + -- TODO: Translate + AddBlankCards { amount } -> + [ Text "Add " + , amount |> String.fromInt |> Text + , Text " blank " + , Ref (Plural { singular = Response, amount = Just amount }) + ] + AddDeck -> [ Text "Adicionar deck." ] @@ -880,6 +915,18 @@ translate mdString = TheirChanges -> [ Text "Mudanças dele(a)" ] + -- TODO: Translate + ConfigurationDisabledWhileInGame -> + [ Text "While the game in progress, you can't change the configuration." ] + + -- TODO: Translate + ConfigurationDisabledIfNotPrivileged -> + [ Text "You can't change the configuration of this game." ] + + -- TODO: Translate + ConfigureNextGame -> + [ Text "Configure Next Game" ] + -- Game SubmitPlay -> [ Text "Dar essas cartas ao ", Ref Czar, Text " como sua jogada da partida." ] diff --git a/client/src/elm/MassiveDecks/Util/Html/Attributes.elm b/client/src/elm/MassiveDecks/Util/Html/Attributes.elm index 4dfda5f..e634fd6 100644 --- a/client/src/elm/MassiveDecks/Util/Html/Attributes.elm +++ b/client/src/elm/MassiveDecks/Util/Html/Attributes.elm @@ -1,4 +1,8 @@ -module MassiveDecks.Util.Html.Attributes exposing (nothing) +module MassiveDecks.Util.Html.Attributes exposing + ( fullWidth + , nothing + , slot + ) import Html exposing (Html) import Html.Attributes as HtmlA @@ -10,3 +14,17 @@ import Json.Encode as Json nothing : Html.Attribute msg nothing = Json.null |> HtmlA.property "" + + +{-| The slot attribute. +-} +slot : String -> Html.Attribute msg +slot = + HtmlA.attribute "slot" + + +{-| The full width attribute for material components. +-} +fullWidth : Html.Attribute msg +fullWidth = + True |> Json.bool |> HtmlA.property "fullwidth" diff --git a/client/src/elm/MassiveDecks/Util/Html/Events.elm b/client/src/elm/MassiveDecks/Util/Html/Events.elm new file mode 100644 index 0000000..7b58ba5 --- /dev/null +++ b/client/src/elm/MassiveDecks/Util/Html/Events.elm @@ -0,0 +1,12 @@ +module MassiveDecks.Util.Html.Events exposing (..) + +import Html +import Html.Events as HtmlE +import Json.Decode + + +{-| Same as onClick, but without propagating to other elements. +-} +onClickNoPropagation : msg -> Html.Attribute msg +onClickNoPropagation msg = + HtmlE.stopPropagationOn "click" (Json.Decode.succeed ( msg, True )) diff --git a/client/src/elm/MassiveDecks/Util/List.elm b/client/src/elm/MassiveDecks/Util/List.elm index b3bd9aa..dbfef4f 100644 --- a/client/src/elm/MassiveDecks/Util/List.elm +++ b/client/src/elm/MassiveDecks/Util/List.elm @@ -1,7 +1,5 @@ module MassiveDecks.Util.List exposing - ( any - , find - , map2Long + ( map2Long , mappedIntersperse , merge ) @@ -9,27 +7,6 @@ module MassiveDecks.Util.List exposing {-| Utility functions for lists. -} -import MassiveDecks.Util.Maybe as Maybe - - -{-| Returns `True` if any value in the list matches the given predicate. --} -any : (a -> Bool) -> List a -> Bool -any predicate list = - find predicate list /= Nothing - - -{-| Find the first element of the given list that fulfils the given predicate. --} -find : (a -> Bool) -> List a -> Maybe a -find predicate list = - case list of - head :: tail -> - Maybe.first [ Maybe.validate predicate head, find predicate tail ] - - [] -> - Nothing - {-| Map two items together, getting `Nothing`s when the shorter ends. Note that if longer is shorter, shorter will be cut off to match. diff --git a/client/src/elm/MassiveDecks/Util/NeList.elm b/client/src/elm/MassiveDecks/Util/NeList.elm new file mode 100644 index 0000000..71986f5 --- /dev/null +++ b/client/src/elm/MassiveDecks/Util/NeList.elm @@ -0,0 +1,68 @@ +module MassiveDecks.Util.NeList exposing + ( NeList(..) + , decoder + , extend + , fromList + , head + , just + , toList + ) + +{-| A module for a list that cannot be empty. +-} + +import Json.Decode as Json + + +{-| A list that cannot be empty. +-} +type NeList item + = NeList item (List item) + + +{-| A list of one item. +-} +just : item -> NeList item +just item = + NeList item [] + + +{-| Add all the new elements to the end of the list. +-} +extend : List item -> NeList item -> NeList item +extend new (NeList first rest) = + NeList first (rest ++ new) + + +{-| Get the first element of a non-empty list. +-} +head : NeList item -> item +head (NeList first _) = + first + + +{-| Convert to a normal list. +-} +toList : NeList item -> List item +toList (NeList first rest) = + first :: rest + + +{-| Convert from a normal list. +-} +fromList : List item -> Maybe (NeList item) +fromList items = + case items of + first :: rest -> + NeList first rest |> Just + + [] -> + Nothing + + +{-| A JSON decoder that fails if there are no values. +-} +decoder : Json.Decoder item -> Json.Decoder (NeList item) +decoder itemDecoder = + Json.list itemDecoder + |> Json.andThen (fromList >> Maybe.map Json.succeed >> Maybe.withDefault (Json.fail "Can't be empty.")) diff --git a/client/src/elm/MassiveDecks/Util/Order.elm b/client/src/elm/MassiveDecks/Util/Order.elm new file mode 100644 index 0000000..f61b80d --- /dev/null +++ b/client/src/elm/MassiveDecks/Util/Order.elm @@ -0,0 +1,48 @@ +module MassiveDecks.Util.Order exposing (..) + +{-| Utilities for dealing with ordering. +-} + + +{-| Map an ordering. +-} +map : (a -> b) -> (b -> b -> Order) -> a -> a -> Order +map f order a b = + order (f a) (f b) + + +{-| Map an ordering where the value might not exist. +-} +filterMap : (b -> Order) -> (a -> Maybe b) -> (b -> b -> Order) -> a -> a -> Order +filterMap againstNothing f order a b = + case f a of + Just x -> + case f b of + Just y -> + order x y + + Nothing -> + againstNothing x + + Nothing -> + case f b of + Just y -> + againstNothing y |> reverse + + Nothing -> + EQ + + +{-| Get the reversed order. +-} +reverse : Order -> Order +reverse o = + case o of + LT -> + GT + + EQ -> + EQ + + GT -> + LT diff --git a/client/src/elm/MassiveDecks/Version.elm b/client/src/elm/MassiveDecks/Version.elm index c22157f..a6e7023 100644 --- a/client/src/elm/MassiveDecks/Version.elm +++ b/client/src/elm/MassiveDecks/Version.elm @@ -8,4 +8,4 @@ module MassiveDecks.Version exposing (version) -} version : String version = - "dev" + "unknown-dev" diff --git a/client/src/elm/MassiveDecks/index.d.ts b/client/src/elm/MassiveDecks/index.d.ts index 41d5f65..51e33b1 100644 --- a/client/src/elm/MassiveDecks/index.d.ts +++ b/client/src/elm/MassiveDecks/index.d.ts @@ -1,7 +1,7 @@ import { Say, Voice } from "../../ts/speech"; import { State as NotificationState, - Command as NotificationCommand + Command as NotificationCommand, } from "../../ts/notification-manager"; type Token = string; @@ -61,7 +61,8 @@ export namespace Elm { serverSend: InboundPort; copyText: InboundPort; remoteControl: OutboundPort; - languageChanged: InboundPort + languageChanged: InboundPort; + startConfetti: InboundPort; }; } export function init(options: { diff --git a/client/src/elm/Material/Attributes.elm b/client/src/elm/Material/Attributes.elm new file mode 100644 index 0000000..e882ead --- /dev/null +++ b/client/src/elm/Material/Attributes.elm @@ -0,0 +1,24 @@ +module Material.Attributes exposing + ( label + , maxLength + , minLength + ) + +import Html +import Html.Attributes as HtmlA +import Json.Encode as Json + + +label : String -> Html.Attribute msg +label = + HtmlA.attribute "label" + + +minLength : Int -> Html.Attribute msg +minLength = + Json.int >> HtmlA.property "minLength" + + +maxLength : Int -> Html.Attribute msg +maxLength = + Json.int >> HtmlA.property "maxLength" diff --git a/client/src/elm/Material/Button.elm b/client/src/elm/Material/Button.elm new file mode 100644 index 0000000..5ed5e02 --- /dev/null +++ b/client/src/elm/Material/Button.elm @@ -0,0 +1,47 @@ +module Material.Button exposing + ( Type(..) + , view + ) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Html.Attributes as HtmlA + + +type Type + = Standard + | Outlined + | Raised + | Unelevated + + +view : Shared -> Type -> MdString -> MdString -> Html msg -> List (Html.Attribute msg) -> Html msg +view shared type_ label title icon attributes = + let + typeAttr = + case type_ of + Standard -> + [] + + Outlined -> + [ HtmlA.attribute "outlined" "" ] + + Raised -> + [ HtmlA.attribute "raised" "" ] + + Unelevated -> + [ HtmlA.attribute "unelevated" "" ] + + allAttrs = + List.concat + [ [ label |> Lang.label shared + , title |> Lang.title shared + ] + , typeAttr + , attributes + ] + in + Html.node "mwc-button" allAttrs [ Html.span [ HtmlA.slot "icon" ] [ icon ] ] diff --git a/client/src/elm/Material/Card.elm b/client/src/elm/Material/Card.elm new file mode 100644 index 0000000..d808699 --- /dev/null +++ b/client/src/elm/Material/Card.elm @@ -0,0 +1,9 @@ +module Material.Card exposing (view) + +import Html as HtmlA +import Html.Attributes as HtmlA + + +view : List (HtmlA.Attribute msg) -> List (HtmlA.Html msg) -> HtmlA.Html msg +view attributes = + HtmlA.div (HtmlA.class "mdc-card" :: attributes) diff --git a/client/src/elm/Material/Fab.elm b/client/src/elm/Material/Fab.elm new file mode 100644 index 0000000..4c8ba55 --- /dev/null +++ b/client/src/elm/Material/Fab.elm @@ -0,0 +1,51 @@ +module Material.Fab exposing + ( Type(..) + , view + ) + +import FontAwesome.Icon as Icon exposing (Icon) +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Html.Attributes as HtmlA + + +type Type + = Normal + | Extended + | Mini + + +view : Shared -> Type -> MdString -> Icon.Presentation id msg -> Maybe msg -> List (Html.Attribute msg) -> Html msg +view shared type_ title icon action attrs = + let + content = + case type_ of + Extended -> + [ title |> Lang.html shared ] + + _ -> + [] + + style = + case type_ of + Mini -> + [ HtmlA.attribute "mini" "" ] + + _ -> + [] + + onClick = + case action of + Just msg -> + msg |> HtmlE.onClick + + Nothing -> + HtmlA.disabled True + in + Html.node "mwc-fab" + (List.concat [ [ title |> Lang.title shared, onClick ], style, attrs ]) + ((icon |> Icon.styled [ HtmlA.slot "icon" ] |> Icon.view) :: content) diff --git a/client/src/elm/Material/IconButton.elm b/client/src/elm/Material/IconButton.elm new file mode 100644 index 0000000..4572e4f --- /dev/null +++ b/client/src/elm/Material/IconButton.elm @@ -0,0 +1,67 @@ +module Material.IconButton exposing + ( view + , viewNoPropagation + ) + +import FontAwesome.Icon as Icon exposing (Icon) +import FontAwesome.Layering as Icon +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Html.Events as HtmlE +import MassiveDecks.Util.NeList exposing (NeList(..)) + + +{-| View a button that displays as a simple icon. +-} +view : Shared -> MdString -> NeList (Icon.Presentation id msg) -> Maybe msg -> Html msg +view shared title icon action = + let + actionAttr = + case action of + Just msg -> + msg |> HtmlE.onClick + + Nothing -> + HtmlA.disabled True + in + viewInternal [ actionAttr ] shared title icon + + +{-| View a button that displays as a simple icon, and blocks clicks propagating to other elements. +-} +viewNoPropagation : Shared -> MdString -> NeList (Icon.Presentation id msg) -> Maybe msg -> Html msg +viewNoPropagation shared title icon action = + let + actionAttr = + case action of + Just msg -> + msg |> HtmlE.onClickNoPropagation + + Nothing -> + HtmlA.disabled True + in + viewInternal [ actionAttr ] shared title icon + + + +{- Private -} + + +viewInternal : List (Html.Attribute msg) -> Shared -> MdString -> NeList (Icon.Presentation id msg) -> Html msg +viewInternal actionAttr shared title (NeList first rest) = + let + renderedIcon = + case rest of + [] -> + first |> Icon.view + + _ -> + (first :: rest) |> List.map Icon.view |> Icon.layers [] + in + Html.node "mwc-icon-button" + ((title |> Lang.title shared) :: actionAttr) + [ renderedIcon ] diff --git a/client/src/elm/Material/LinearProgress.elm b/client/src/elm/Material/LinearProgress.elm new file mode 100644 index 0000000..ba642ee --- /dev/null +++ b/client/src/elm/Material/LinearProgress.elm @@ -0,0 +1,44 @@ +module Material.LinearProgress exposing + ( Progress(..) + , view + ) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import Json.Encode as Json + + +{-| What progress to display. +-} +type + Progress + -- An unknown amount of progress. + = Indeterminate + -- A float progress from 0 (no progress) to 1 (complete). + | Progress Float + -- Complete. + | Closed + + +{-| A progress bar. +-} +view : Progress -> List (Html.Attribute msg) -> Html msg +view p attributes = + Html.node "mwc-linear-progress" (progress p :: attributes) [] + + + +{- Private -} + + +progress : Progress -> Html.Attribute msg +progress p = + case p of + Indeterminate -> + True |> Json.bool |> HtmlA.property "indeterminate" + + Progress float -> + float |> Json.float |> HtmlA.property "progress" + + Closed -> + True |> Json.bool |> HtmlA.property "closed" diff --git a/client/src/elm/Material/ListView.elm b/client/src/elm/Material/ListView.elm new file mode 100644 index 0000000..e387405 --- /dev/null +++ b/client/src/elm/Material/ListView.elm @@ -0,0 +1,89 @@ +module Material.ListView exposing + ( Action(..) + , action + , interactive + , view + , viewItem + ) + +import FontAwesome.Icon as Icon exposing (Icon) +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import Json.Encode as Json +import MassiveDecks.Util.Html.Attributes as HtmlA + + +{-| A list. +-} +view : List (Html.Attribute msg) -> List (Html msg) -> Html msg +view attributes children = + Html.node "mwc-list" attributes children + + +{-| What happens when you interact with the item. +-} +type Action msg + = None + | Link + | Enabled msg + | Disabled + + +{-| A list item that is only sometimes enabled. +-} +interactive : msg -> Bool -> Action msg +interactive msg enabled = + if enabled then + Enabled msg + + else + Disabled + + +{-| An action from a maybe, if it is enabled. +-} +action : Maybe msg -> Action msg +action a = + case a of + Just msg -> + Enabled msg + + Nothing -> + Disabled + + +{-| An item within a list. +-} +viewItem : Action msg -> Maybe Icon -> Maybe (List (Html msg)) -> Maybe (List (Html msg)) -> List (Html msg) -> Html msg +viewItem action_ icon secondary meta children = + let + ( optionalAttrs, optionalSlots ) = + [ icon |> Maybe.map (\i -> ( HtmlA.attribute "graphic" "large", Icon.viewStyled [ HtmlA.slot "graphic" ] i )) + , meta |> Maybe.map (\m -> ( True |> Json.bool |> HtmlA.property "hasMeta", Html.span [ HtmlA.slot "meta" ] m )) + , secondary |> Maybe.map (\s -> ( True |> Json.bool |> HtmlA.property "twoline", Html.span [ HtmlA.slot "secondary" ] s )) + ] + |> List.filterMap identity + |> List.unzip + + actionAttr = + case action_ of + Enabled msg -> + msg |> HtmlE.onClick + + Disabled -> + HtmlA.disabled True + + Link -> + HtmlA.nothing + + None -> + True |> Json.bool |> HtmlA.property "noninteractive" + + attrs = + List.concat [ optionalAttrs, [ actionAttr ] ] + + slots = + List.concat [ optionalSlots, [ Html.span [] children ] ] + in + Html.node "mwc-list-item" attrs slots diff --git a/client/src/elm/Material/Menu.elm b/client/src/elm/Material/Menu.elm new file mode 100644 index 0000000..538160a --- /dev/null +++ b/client/src/elm/Material/Menu.elm @@ -0,0 +1,60 @@ +module Material.Menu exposing (view) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import Json.Decode +import Json.Encode as Json +import MassiveDecks.Components.Menu.Model exposing (..) + + +{-| View a pop-up menu. +-} +view : msg -> State -> Corner -> Html msg -> List (Html msg) -> Html msg +view onClose state corner anchor menuItems = + let + open = + case state of + Open -> + True + + Closed -> + False + + stringCorner = + case corner of + TopLeft -> + "TOP_LEFT" + + TopRight -> + "TOP_RIGHT" + + BottomLeft -> + "BOTTOM_LEFT" + + BottomRight -> + "BOTTOM_RIGHT" + + TopStart -> + "TOP_START" + + TopEnd -> + "TOP_END" + + BottomStart -> + "BOTTOM_START" + + BottomEnd -> + "BOTTOM_END" + in + Html.div [ HtmlA.class "menu-anchor" ] + [ anchor + , Html.node "mwc-menu" + [ True |> Json.bool |> HtmlA.property "activatable" + , open |> Json.bool |> HtmlA.property "open" + , stringCorner |> HtmlA.attribute "corner" + , HtmlA.class "menu" + , onClose |> Json.Decode.succeed |> HtmlE.on "closed" + ] + menuItems + ] diff --git a/client/src/elm/Material/Ripple.elm b/client/src/elm/Material/Ripple.elm new file mode 100644 index 0000000..a9faa0d --- /dev/null +++ b/client/src/elm/Material/Ripple.elm @@ -0,0 +1,8 @@ +module Material.Ripple exposing (view) + +import Html as HtmlA + + +view : List (HtmlA.Attribute msg) -> List (HtmlA.Html msg) -> HtmlA.Html msg +view = + HtmlA.node "mwc-ripple" diff --git a/client/src/elm/Material/Select.elm b/client/src/elm/Material/Select.elm new file mode 100644 index 0000000..2aae30d --- /dev/null +++ b/client/src/elm/Material/Select.elm @@ -0,0 +1,87 @@ +module Material.Select exposing + ( ItemModel + , Model + , view + ) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import Json.Decode as Json +import Json.Encode +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Html.Attributes as HtmlA + + +{-| A combo box. +-} +view : Shared -> Model id msg -> List (Html.Attribute msg) -> List (ItemModel id msg) -> Html msg +view shared model attrs items = + let + allAttrs = + List.concat + [ [ model.label |> Lang.label shared + , model.idFromString >> model.wrap |> onChange + , HtmlA.fullWidth + ] + , attrs + ] + in + Html.node "mwc-select" allAttrs (items |> List.map (viewItem model)) + + +{-| The things needed to render the select. +-} +type alias Model id msg = + { label : MdString + , idToString : id -> String + , idFromString : String -> Maybe id + , selected : Maybe id + , wrap : Maybe id -> msg + } + + +{-| The things needed to render a specific item in the select. +-} +type alias ItemModel id msg = + { id : id + , icon : Maybe (Html msg) + , primary : List (Html msg) + , secondary : Maybe (List (Html msg)) + , meta : Maybe (Html msg) + } + + + +{- Private -} + + +{-| An item within a list. +-} +viewItem : Model id msg -> ItemModel id msg -> Html msg +viewItem { idToString, selected } { id, icon, primary, secondary, meta } = + let + ( optionalAttrs, optionalSlots ) = + [ icon |> Maybe.map (\i -> ( HtmlA.attribute "graphic" "large", Html.span [ HtmlA.slot "graphic" ] [ i ] )) + , meta |> Maybe.map (\m -> ( True |> Json.Encode.bool |> HtmlA.property "hasMeta", Html.span [ HtmlA.slot "meta" ] [ m ] )) + , secondary |> Maybe.map (\s -> ( True |> Json.Encode.bool |> HtmlA.property "twoline", Html.span [ HtmlA.slot "secondary" ] s )) + ] + |> List.filterMap identity + |> List.unzip + + attrs = + List.concat [ optionalAttrs, [ id |> idToString |> HtmlA.value, selected == Just id |> HtmlA.selected ] ] + + slots = + List.concat [ primary, optionalSlots ] |> List.intersperse (Html.text " ") + in + Html.node "mwc-list-item" attrs slots + + +{-| An event for when the user changes the selection. +-} +onChange : (String -> msg) -> Html.Attribute msg +onChange wrap = + Json.at [ "target", "value" ] Json.string |> Json.map wrap |> HtmlE.on "change" diff --git a/client/src/elm/Material/Slider.elm b/client/src/elm/Material/Slider.elm new file mode 100644 index 0000000..fd838aa --- /dev/null +++ b/client/src/elm/Material/Slider.elm @@ -0,0 +1,56 @@ +module Material.Slider exposing + ( markers + , max + , min + , onChange + , pin + , step + , value + , view + ) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import Json.Decode +import Json.Encode as Json + + +view : List (Html.Attribute msg) -> Html msg +view attributes = + Html.node "mwc-slider" attributes [] + + +step : Int -> Html.Attribute msg +step = + Json.int >> HtmlA.property "step" + + +min : Int -> Html.Attribute msg +min = + Json.int >> HtmlA.property "min" + + +max : Int -> Html.Attribute msg +max = + Json.int >> HtmlA.property "max" + + +markers : Html.Attribute msg +markers = + True |> Json.bool |> HtmlA.property "markers" + + +pin : Html.Attribute msg +pin = + True |> Json.bool |> HtmlA.property "pin" + + +value : Int -> Html.Attribute msg +value = + Json.int >> HtmlA.property "value" + + +onChange : (Int -> msg) -> Html.Attribute msg +onChange wrap = + Json.Decode.at [ "target", "value" ] Json.Decode.int |> Json.Decode.map wrap |> HtmlE.on "change" diff --git a/client/src/elm/Material/Switch.elm b/client/src/elm/Material/Switch.elm new file mode 100644 index 0000000..eb05188 --- /dev/null +++ b/client/src/elm/Material/Switch.elm @@ -0,0 +1,8 @@ +module Material.Switch exposing (view) + +import Html exposing (Html) + + +view : List (Html.Attribute msg) -> Html msg +view attributes = + Html.node "mwc-switch" attributes [] diff --git a/client/src/elm/Material/Tabs.elm b/client/src/elm/Material/Tabs.elm new file mode 100644 index 0000000..8b6b5be --- /dev/null +++ b/client/src/elm/Material/Tabs.elm @@ -0,0 +1,88 @@ +module Material.Tabs exposing + ( Model + , TabModel + , view + ) + +import FontAwesome.Icon as Icon exposing (Icon) +import Html exposing (Html) +import Html.Attributes as HtmlA +import Html.Events as HtmlE +import Json.Decode +import Json.Encode +import List.Extra as List +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang +import MassiveDecks.Util.Html as Html +import MassiveDecks.Util.Html.Attributes as HtmlA +import MassiveDecks.Util.NeList as NonEmptyList exposing (NeList) + + +{-| A model for a bar of tabs. +-} +type alias Model id msg = + { selected : id + , change : id -> msg + , ids : NeList id + , tab : id -> TabModel + , equals : id -> id -> Bool + } + + +{-| A model for a tab. +-} +type alias TabModel = + { label : MdString + , icon : Maybe Icon + } + + +{-| View a bar of tabs. +-} +view : Shared -> Model id msg -> Html msg +view shared { selected, change, ids, tab, equals } = + let + idsList = + ids |> NonEmptyList.toList + + attrs = + [ idsList |> List.findIndex (equals selected) |> Maybe.withDefault 0 |> activeIndex + , ((\id -> List.getAt id idsList) >> (ids |> NonEmptyList.head |> Maybe.withDefault) >> change) |> onActivated + ] + + viewTab { label, icon } = + let + ( iconAttr, iconNode ) = + case icon of + Just i -> + ( hasImageIcon, Icon.viewStyled [ HtmlA.slot "icon" ] i ) + + Nothing -> + ( HtmlA.nothing, Html.nothing ) + in + Html.node "mwc-tab" [ label |> Lang.label shared, iconAttr ] [ iconNode ] + + tabs = + idsList |> List.map (tab >> viewTab) + in + Html.node "mwc-tab-bar" attrs tabs + + + +{- Private -} + + +activeIndex : Int -> Html.Attribute msg +activeIndex = + Json.Encode.int >> HtmlA.property "activeIndex" + + +hasImageIcon : Html.Attribute msg +hasImageIcon = + HtmlA.attribute "hasImageIcon" "hasImageIcon" + + +onActivated : (Int -> msg) -> Html.Attribute msg +onActivated wrap = + Json.Decode.int |> Json.Decode.map wrap |> Json.Decode.at [ "target", "activeIndex" ] |> HtmlE.on "MDCTabBar:activated" diff --git a/client/src/elm/Material/TextArea.elm b/client/src/elm/Material/TextArea.elm new file mode 100644 index 0000000..3fdc6e5 --- /dev/null +++ b/client/src/elm/Material/TextArea.elm @@ -0,0 +1,8 @@ +module Material.TextArea exposing (view) + +import Html + + +view : List (Html.Attribute msg) -> List (Html.Html msg) -> Html.Html msg +view = + Html.node "mwc-textarea" diff --git a/client/src/elm/Material/TextField.elm b/client/src/elm/Material/TextField.elm new file mode 100644 index 0000000..77db9d2 --- /dev/null +++ b/client/src/elm/Material/TextField.elm @@ -0,0 +1,96 @@ +module Material.TextField exposing + ( Type(..) + , view + ) + +import Html exposing (Html) +import Html.Attributes as HtmlA +import MassiveDecks.Model exposing (Shared) +import MassiveDecks.Strings exposing (MdString) +import MassiveDecks.Strings.Languages as Lang + + +{-| The type of field. +-} +type Type + = Text + | Search + | Tel + | Url + | Email + | Password + | Date + | Month + | Week + | Time + | DateTimeLocal + | Number + | Color + + +{-| A text field for the given type of data. +-} +view : Shared -> MdString -> Type -> String -> List (Html.Attribute msg) -> Html msg +view shared label t value attributes = + let + allAttrs = + List.concat + [ [ label |> Lang.label shared + , t |> type_ + , value |> HtmlA.value + ] + , attributes + ] + in + Html.node "mwc-textfield" allAttrs [] + + + +{- Private -} + + +type_ : Type -> Html.Attribute msg +type_ t = + let + stringType = + case t of + Text -> + "text" + + Search -> + "search" + + Tel -> + "tel" + + Url -> + "url" + + Email -> + "email" + + Password -> + "password" + + Date -> + "date" + + Month -> + "month" + + Week -> + "week" + + Time -> + "time" + + DateTimeLocal -> + "datetime-local" + + Number -> + "number" + + Color -> + "color" + in + stringType |> HtmlA.attribute "type" diff --git a/client/src/elm/Paper/Tooltip.elm b/client/src/elm/Paper/Tooltip.elm new file mode 100644 index 0000000..39cd126 --- /dev/null +++ b/client/src/elm/Paper/Tooltip.elm @@ -0,0 +1,43 @@ +module Paper.Tooltip exposing + ( Position(..) + , view + ) + +import Html +import Html.Attributes as HtmlA + + +view : Position -> String -> List (Html.Html msg) -> Html.Html msg +view pos for = + Html.node "paper-tooltip" [ position pos, HtmlA.attribute "for" for ] + + +type Position + = Top + | Right + | Bottom + | Left + + + +{- Private -} + + +position : Position -> Html.Attribute msg +position pos = + let + positionString = + case pos of + Top -> + "top" + + Right -> + "right" + + Bottom -> + "bottom" + + Left -> + "left" + in + HtmlA.attribute "position" positionString diff --git a/client/src/elm/Weightless.elm b/client/src/elm/Weightless.elm deleted file mode 100644 index 789212a..0000000 --- a/client/src/elm/Weightless.elm +++ /dev/null @@ -1,95 +0,0 @@ -module Weightless exposing - ( button - , card - , expansion - , listItem - , navigationBar - , popover - , popoverCard - , select - , slider - , switch - , tab - , tabGroup - , textArea - , textField - , tooltip - ) - -import Html exposing (Html) -import Weightless.Attributes as WlA - - -button : List (Html.Attribute msg) -> List (Html msg) -> Html msg -button = - Html.node "wl-button" - - -card : List (Html.Attribute msg) -> List (Html msg) -> Html msg -card = - Html.node "wl-card" - - -expansion : List (Html.Attribute msg) -> List (Html msg) -> Html msg -expansion attrs = - Html.node "wl-expansion" (WlA.icon "" :: attrs) - - -listItem : List (Html.Attribute msg) -> List (Html msg) -> Html msg -listItem = - Html.node "wl-list-item" - - -navigationBar : List (Html.Attribute msg) -> List (Html msg) -> Html msg -navigationBar = - Html.node "wl-nav" - - -popover : List (Html.Attribute msg) -> List (Html msg) -> Html msg -popover = - Html.node "wl-popover" - - -popoverCard : List (Html.Attribute msg) -> List (Html msg) -> Html msg -popoverCard = - Html.node "wl-popover-card" - - -select : List (Html.Attribute msg) -> List (Html msg) -> Html msg -select = - Html.node "wl-select" - - -slider : List (Html.Attribute msg) -> List (Html msg) -> Html msg -slider = - Html.node "wl-slider" - - -switch : List (Html.Attribute msg) -> Html msg -switch attrs = - Html.node "wl-switch" attrs [] - - -tab : List (Html.Attribute msg) -> List (Html msg) -> Html msg -tab = - Html.node "wl-tab" - - -tabGroup : List (Html.Attribute msg) -> List (Html msg) -> Html msg -tabGroup = - Html.node "wl-tab-group" - - -textArea : List (Html.Attribute msg) -> List (Html msg) -> Html msg -textArea = - Html.node "wl-textarea" - - -textField : List (Html.Attribute msg) -> List (Html msg) -> Html msg -textField = - Html.node "wl-textfield" - - -tooltip : List (Html.Attribute msg) -> List (Html msg) -> Html msg -tooltip = - Html.node "wl-tooltip" diff --git a/client/src/elm/Weightless/Attributes.elm b/client/src/elm/Weightless/Attributes.elm deleted file mode 100644 index e2d2f81..0000000 --- a/client/src/elm/Weightless/Attributes.elm +++ /dev/null @@ -1,432 +0,0 @@ -module Weightless.Attributes exposing - ( Alignment(..) - , ExpansionSlot(..) - , InputType(..) - , ListItemSlot(..) - , NavSlot(..) - , TextFieldSlot(..) - , XOrigin(..) - , YOrigin(..) - , active - , align - , anchor - , anchorCloseEvents - , anchorOpenEvents - , anchorOrigin - , checked - , clickable - , disableFocusTrap - , disabled - , expansionSlot - , fab - , filled - , fixed - , flat - , hoverable - , icon - , inverted - , label - , list - , listItemSlot - , max - , maxLength - , min - , minLength - , name - , navSlot - , noRipple - , outlined - , readonly - , selected - , step - , textFieldSlot - , transformOrigin - , type_ - , value - , vertical - ) - -import Html exposing (Html) -import Html.Attributes as HtmlA -import Json.Encode as Json - - -step : Int -> Html.Attribute msg -step = - numberAttr "step" - - -min : Int -> Html.Attribute msg -min = - numberAttr "min" - - -max : Int -> Html.Attribute msg -max = - numberAttr "max" - - -maxLength : Int -> Html.Attribute msg -maxLength = - numberAttr "maxLength" - - -minLength : Int -> Html.Attribute msg -minLength = - numberAttr "minLength" - - -anchorOpenEvents : List String -> Html.Attribute msg -anchorOpenEvents = - stringArrayProperty "anchorOpenEvents" - - -anchorCloseEvents : List String -> Html.Attribute msg -anchorCloseEvents = - stringArrayProperty "anchorCloseEvents" - - -anchor : String -> Html.Attribute msg -anchor id = - stringAttr "anchor" ("#" ++ id) - - -icon : String -> Html.Attribute msg -icon icon_name = - stringAttr "icon" icon_name - - -name : String -> Html.Attribute msg -name group = - stringAttr "name" group - - -type NavSlot - = Title - | Left - | Right - - -navSlot : NavSlot -> Html.Attribute msg -navSlot slot = - let - textSlot = - case slot of - Title -> - "title" - - Left -> - "left" - - Right -> - "right" - in - stringAttr "slot" textSlot - - -type ExpansionSlot - = ETitle - | EDescription - - -noRipple : Bool -> Html.Attribute msg -noRipple enabled = - HtmlA.property "noRipple" (Json.bool enabled) - - -expansionSlot : ExpansionSlot -> Html.Attribute msg -expansionSlot slot = - let - textSlot = - case slot of - ETitle -> - "title" - - EDescription -> - "description" - in - stringAttr "slot" textSlot - - -type ListItemSlot - = BeforeItem - | AfterItem - - -listItemSlot : ListItemSlot -> Html.Attribute msg -listItemSlot slot = - let - textSlot = - case slot of - BeforeItem -> - "before" - - AfterItem -> - "after" - in - stringAttr "slot" textSlot - - -type TextFieldSlot - = BeforeText - | AfterText - - -textFieldSlot : TextFieldSlot -> Html.Attribute msg -textFieldSlot slot = - let - textSlot = - case slot of - BeforeText -> - "before" - - AfterText -> - "after" - in - stringAttr "slot" textSlot - - -value : String -> Html.Attribute msg -value text = - stringAttr "value" text - - -type Alignment - = Start - | Center - | End - - -align : Alignment -> Html.Attribute msg -align alignment = - let - textAlignment = - case alignment of - Start -> - "start" - - Center -> - "center" - - End -> - "end" - in - stringAttr "align" textAlignment - - -list : String -> Html.Attribute msg -list datalistSelector = - stringAttr "list" datalistSelector - - -type InputType - = Password - | Email - | Number - | Color - | Date - | Search - | Tel - | File - - -type_ : InputType -> Html.Attribute msg -type_ inputType = - let - textInputType = - case inputType of - Password -> - "password" - - Email -> - "email" - - Number -> - "number" - - Color -> - "color" - - Date -> - "date" - - Search -> - "search" - - Tel -> - "tel" - - File -> - "file" - in - stringAttr "type" textInputType - - -label : String -> Html.Attribute msg -label text = - stringAttr "label" text - - -inverted : Html.Attribute msg -inverted = - presentAttribute "inverted" - - -vertical : Html.Attribute msg -vertical = - presentAttribute "vertical" - - -filled : Html.Attribute msg -filled = - presentAttribute "filled" - - -outlined : Html.Attribute msg -outlined = - presentAttribute "outlined" - - -flat : Html.Attribute msg -flat = - presentAttribute "flat" - - -fab : Html.Attribute msg -fab = - presentAttribute "fab" - - -hoverable : Html.Attribute msg -hoverable = - presentAttribute "hoverable" - - -disabled : Html.Attribute msg -disabled = - presentAttribute "disabled" - - -readonly : Html.Attribute msg -readonly = - presentAttribute "readonly" - - -active : Html.Attribute msg -active = - presentAttribute "active" - - -clickable : Html.Attribute msg -clickable = - presentAttribute "clickable" - - -checked : Html.Attribute msg -checked = - presentAttribute "checked" - - -fixed : Html.Attribute msg -fixed = - presentAttribute "fixed" - - -selected : Html.Attribute msg -selected = - presentAttribute "selected" - - -disableFocusTrap : Html.Attribute msg -disableFocusTrap = - presentAttribute "disablefocustrap" - - -type XOrigin - = XLeft - | XCenter - | XRight - - -type YOrigin - = YTop - | YCenter - | YBottom - - -anchorOrigin : XOrigin -> YOrigin -> List (Html.Attribute msg) -anchorOrigin = - origin "anchor" - - -transformOrigin : XOrigin -> YOrigin -> List (Html.Attribute msg) -transformOrigin = - origin "transform" - - - -{- Private -} - - -origin : String -> XOrigin -> YOrigin -> List (Html.Attribute msg) -origin prefix xOrigin yOrigin = - let - ( textXOrigin, textYOrigin ) = - textOrigin xOrigin yOrigin - in - [ stringAttr (prefix ++ "originx") textXOrigin - , stringAttr (prefix ++ "originy") textYOrigin - ] - - -textOrigin : XOrigin -> YOrigin -> ( String, String ) -textOrigin xOrigin yOrigin = - let - textXOrigin = - case xOrigin of - XLeft -> - "left" - - XCenter -> - "center" - - XRight -> - "right" - - textYOrigin = - case yOrigin of - YTop -> - "top" - - YCenter -> - "center" - - YBottom -> - "bottom" - in - ( textXOrigin, textYOrigin ) - - -presentAttribute : String -> Html.Attribute msg -presentAttribute attribute = - HtmlA.attribute attribute attribute - - -stringArrayProperty : String -> List String -> Html.Attribute msg -stringArrayProperty property values = - HtmlA.property property (values |> Json.list Json.string) - - -stringAttr : String -> String -> Html.Attribute msg -stringAttr attribute stringValue = - HtmlA.attribute attribute stringValue - - -numberAttr : String -> Int -> Html.Attribute msg -numberAttr attribute intValue = - intValue |> String.fromInt |> HtmlA.attribute attribute - - -numberProp : String -> Int -> Html.Attribute msg -numberProp property intValue = - intValue |> Json.int |> HtmlA.property property diff --git a/client/src/elm/Weightless/Internal.elm b/client/src/elm/Weightless/Internal.elm deleted file mode 100644 index cc7a90a..0000000 --- a/client/src/elm/Weightless/Internal.elm +++ /dev/null @@ -1,54 +0,0 @@ -module Weightless.Internal exposing - ( boolProp - , floatProp - , numberAttr - , numberProp - , presentAttribute - , stringArrayProperty - , stringAttr - , stringProp - ) - -import Html -import Html.Attributes as HtmlA -import Json.Encode as Json - - -presentAttribute : String -> Html.Attribute msg -presentAttribute attribute = - HtmlA.attribute attribute attribute - - -stringArrayProperty : String -> List String -> Html.Attribute msg -stringArrayProperty property values = - HtmlA.property property (values |> Json.list Json.string) - - -stringAttr : String -> String -> Html.Attribute msg -stringAttr attribute stringValue = - HtmlA.attribute attribute stringValue - - -numberAttr : String -> Int -> Html.Attribute msg -numberAttr attribute intValue = - intValue |> String.fromInt |> HtmlA.attribute attribute - - -numberProp : String -> Int -> Html.Attribute msg -numberProp property intValue = - intValue |> Json.int |> HtmlA.property property - - -floatProp : String -> Float -> Html.Attribute msg -floatProp property floatValue = - floatValue |> Json.float |> HtmlA.property property - - -boolProp : String -> Bool -> Html.Attribute msg -boolProp property boolValue = - boolValue |> Json.bool |> HtmlA.property property - - -stringProp : String -> String -> Html.Attribute msg -stringProp property stringValue = - stringValue |> Json.string |> HtmlA.property property diff --git a/client/src/elm/Weightless/ProgressBar.elm b/client/src/elm/Weightless/ProgressBar.elm deleted file mode 100644 index 40f376e..0000000 --- a/client/src/elm/Weightless/ProgressBar.elm +++ /dev/null @@ -1,51 +0,0 @@ -module Weightless.ProgressBar exposing - ( determinate - , indeterminate - ) - -import Html exposing (Html) -import Weightless.Internal as Internal - - -determinate : Float -> List (Html.Attribute msg) -> Html msg -determinate completion attrs = - progressBar ([ mode Determinate, value completion ] ++ attrs) [] - - -indeterminate : List (Html.Attribute msg) -> Html msg -indeterminate attrs = - progressBar attrs [] - - - -{- Private -} - - -type ProgressMode - = Indeterminate - | Determinate - - -progressBar : List (Html.Attribute msg) -> List (Html msg) -> Html msg -progressBar = - Html.node "wl-progress-bar" - - -mode : ProgressMode -> Html.Attribute msg -mode = - progressModeName >> Internal.stringProp "mode" - - -value : Float -> Html.Attribute msg -value = - Internal.floatProp "value" - - -progressModeName : ProgressMode -> String -progressModeName progressMode = - case progressMode of - Indeterminate -> - "indeterminate" - - Determinate -> - "determinate" diff --git a/client/src/elm/Weightless/Slider.elm b/client/src/elm/Weightless/Slider.elm deleted file mode 100644 index 23d6dce..0000000 --- a/client/src/elm/Weightless/Slider.elm +++ /dev/null @@ -1,54 +0,0 @@ -module Weightless.Slider exposing - ( Slot(..) - , max - , min - , slot - , step - , thumbLabel - ) - -import Html -import Weightless.Internal as Internal - - -type Slot - = Before - | After - | ThumbLabel - - -slot : Slot -> Html.Attribute msg -slot s = - let - textSlot = - case s of - Before -> - "before" - - After -> - "after" - - ThumbLabel -> - "thumb-label" - in - Internal.stringAttr "slot" textSlot - - -step : Int -> Html.Attribute msg -step = - Internal.numberProp "step" - - -min : Int -> Html.Attribute msg -min = - Internal.numberProp "min" - - -max : Int -> Html.Attribute msg -max = - Internal.numberProp "max" - - -thumbLabel : Bool -> Html.Attribute msg -thumbLabel = - Internal.boolProp "thumbLabel" diff --git a/client/src/scss/animation.scss b/client/src/scss/_animation.scss similarity index 100% rename from client/src/scss/animation.scss rename to client/src/scss/_animation.scss diff --git a/client/src/scss/cards.scss b/client/src/scss/_cards.scss similarity index 89% rename from client/src/scss/cards.scss rename to client/src/scss/_cards.scss index acc9503..718ec5c 100644 --- a/client/src/scss/cards.scss +++ b/client/src/scss/_cards.scss @@ -1,21 +1,25 @@ -@import "./card/variables"; -@import "./colors"; -@import "./fonts"; -@import "./card/sources"; -@import "./card/size"; +@use "_fonts"; +@use "cards/_size"; +@use "cards/_sources"; + +$call-color: #ffffff; +$call-background: #000000; + +$response-color: $call-background; +$response-background: $call-color; #game { - --card-aspect-ratio: #{$card-ratio}; - @include fluid-type(20rem, 64rem, 0.5rem, 0.8rem); + --card-aspect-ratio: #{size.$card-ratio}; + @include size.fluid-type(20rem, 64rem, 0.5rem, 0.8rem); } .game-card { - width: $card-width; - margin: $card-margin; + width: size.$card-width; + margin: size.$card-margin; perspective: 100vw; text-rendering: optimizeLegibility; - font-family: "Helvetica Neue", "Nimbus Sans L", sans-serif; + font-family: fonts.$card; font-weight: bold; p { @@ -71,7 +75,7 @@ position: relative; height: 0; width: 100%; - @include pad-to-aspect-ratio(var(--card-aspect-ratio)); + @include size.pad-to-aspect-ratio(var(--card-aspect-ratio)); & .side { position: absolute; diff --git a/client/src/scss/cast.scss b/client/src/scss/_cast.scss similarity index 100% rename from client/src/scss/cast.scss rename to client/src/scss/_cast.scss diff --git a/client/src/scss/colors.scss b/client/src/scss/_colors.scss similarity index 85% rename from client/src/scss/colors.scss rename to client/src/scss/_colors.scss index 1b907cf..31f5e3a 100644 --- a/client/src/scss/colors.scss +++ b/client/src/scss/_colors.scss @@ -1,3 +1,5 @@ +/// Single source of truth for colours in the application. + $primary: #42a5f5; $on-primary: #212121; $primary-light: #80d6ff; @@ -20,3 +22,5 @@ $background: #e2e2e2; $secondary-background: #cccccc; $transparent: rgba(#ffffff, 0); + +$card: #ffffff; diff --git a/client/src/scss/_error.scss b/client/src/scss/_error.scss new file mode 100644 index 0000000..eba1999 --- /dev/null +++ b/client/src/scss/_error.scss @@ -0,0 +1,76 @@ +@use "./colors"; + +.error-overlay { + z-index: 100; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + + background-color: transparentize(colors.$secondary-background, 0.6); + + display: flex; + flex-direction: column; + justify-content: center; + align-items: stretch; + + padding: 3em; + + .actions { + display: flex; + flex-direction: row; + justify-content: center; + } + + .help { + margin-bottom: 0.5em; + } + + .errors { + overflow-y: auto; + } +} + +.error { + color: #{colors.$on-error}; + background-color: #{colors.$error}; + + padding: 0.5em; + + display: flex; + flex-direction: column; + + .header { + display: flex; + align-items: center; + } + + .title > span { + white-space: nowrap; + font-weight: bold; + + .icon-prefix { + margin-right: 0.3em; + } + } + + .description { + margin-left: 0.5em; + white-space: normal; + flex-basis: 100%; + } + + .link { + display: block; + justify-content: flex-end; + white-space: nowrap; + } + + .report { + margin: 0.5em; + background-color: inherit; + color: inherit; + height: 10em; + } +} diff --git a/client/src/scss/fonts.scss b/client/src/scss/_fonts.scss similarity index 90% rename from client/src/scss/fonts.scss rename to client/src/scss/_fonts.scss index 70a1cd0..088e909 100644 --- a/client/src/scss/fonts.scss +++ b/client/src/scss/_fonts.scss @@ -1,10 +1,14 @@ +$general: "Roboto", sans-serif; +$card: "Helvetica Neue", "Nimbus Sans L", sans-serif; +$game-code: "Source Code Pro", monospace; + @font-face { font-family: "Nimbus Sans L"; font-style: normal; font-weight: 400; src: local("Nimbus Sans L"), local("NimbusSansL"), url("../../assets/fonts/nimbus-sans-l-regular.woff2") format("woff2"); - font-display: fallback; + font-display: swap; } @font-face { @@ -13,7 +17,7 @@ font-weight: 700; src: local("Nimbus Sans L Bold"), local("NimbusSansL-Bold"), url("../../assets/fonts/nimbus-sans-l-700.woff2") format("woff2"); - font-display: fallback; + font-display: swap; } @font-face { diff --git a/client/src/scss/game.scss b/client/src/scss/_game.scss similarity index 71% rename from client/src/scss/game.scss rename to client/src/scss/_game.scss index a57f31c..f35d02b 100644 --- a/client/src/scss/game.scss +++ b/client/src/scss/_game.scss @@ -1,11 +1,10 @@ -@import "./card/variables"; -@import "./colors"; -@import "~weightless/style/base/elevation"; -@import "./game/judging"; -@import "./game/playing"; -@import "./game/plays"; -@import "./game/history"; -@import "./pages/lobby/variables"; +@use "./_colors"; +@use "./cards"; +@use "cards/_size"; +@use "./game/_judging"; +@use "./game/_playing"; +@use "./game/_plays"; +@use "./game/_history"; // The main game area. #game { @@ -17,6 +16,8 @@ min-height: 100%; + //background: colors.$background url(../../assets/images/background.svg) repeat; + .action { position: fixed; bottom: 1em; @@ -45,57 +46,67 @@ } } +#new-game-config { + margin-right: 3em; + align-self: flex-end; +} + +#win-confetti-overlay { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + + height: 100%; + width: 100%; + + pointer-events: none; +} + #top-content { position: sticky; z-index: 3; top: 0; left: 0; right: 0; - --progress-bar-bg: #{$error}; - font-size: 5em; display: flex; flex-direction: column; align-items: stretch; - height: 0; - overflow: visible; #timer { flex-shrink: 0; - height: 0.2em; - } - - #time-left { - margin: 1rem; + height: 4px; + --mdc-linear-progress-buffer-color: #{colors.$error}; } .top-row { margin-top: -0.2em; + height: 2.5em; display: flex; justify-content: space-between; - align-items: flex-start; + align-items: center; + } + + .help { + display: flex; + flex-flow: row wrap; + align-items: center; + + font-size: 2em; + + > span { + margin-left: 1em; + flex-basis: 5em; + flex-grow: 1; + } } } #minor-actions { display: flex; flex-direction: row; - margin: 1rem; - - #context-help { - flex-grow: 0; - --card-padding: 0.5em; - font-size: 1.2rem; - - wl-popover-card { - min-width: 10em; - max-width: 20em; - } - } - - wl-button { - font-size: 1.2rem; - margin: 0; - } + margin: 0.5em 1em 0 1em; } // The button to scroll to the top of the game area. @@ -110,7 +121,7 @@ top: 0; bottom: 0; - wl-button { + mwc-icon-button { pointer-events: all; position: sticky; bottom: 0.5em; @@ -137,7 +148,7 @@ flex-direction: column; justify-content: center; align-items: center; - padding: 2em 0; + padding: 0; z-index: 2; } @@ -146,7 +157,7 @@ ol.card-set { &.picked { .side { - border-color: $primary; + border-color: colors.$primary; } } } @@ -163,7 +174,7 @@ ul.cards { margin-top: 0.5em; li { - min-width: $card-width; + min-width: size.$card-width; } } @@ -177,7 +188,7 @@ ol.card-set { padding: 0; li { - height: $card-overlap; + height: size.$card-overlap; overflow: visible; &:hover { @@ -185,7 +196,7 @@ ol.card-set { } &:last-child { - height: height($card-width, var(--card-aspect-ratio)); + height: size.height(size.$card-width, var(--card-aspect-ratio)); } } } diff --git a/client/src/scss/_material.scss b/client/src/scss/_material.scss new file mode 100644 index 0000000..354c7cc --- /dev/null +++ b/client/src/scss/_material.scss @@ -0,0 +1,93 @@ +@use "_colors"; +@use "_fonts"; + +@use "~@material/card"; +@include card.core-styles; + +/// Support styling for Material Web Components. + +:root { + --mdc-theme-primary: #{colors.$primary}; + --mdc-theme-on-primary: #{colors.$on-primary}; + + --mdc-theme-secondary: #{colors.$secondary}; + --mdc-theme-on-secondary: #{colors.$on-secondary}; + + --mdc-theme-surface: #{colors.$card}; + --mdc-theme-background: #{colors.$background}; + + --mdc-typography-font-family: #{fonts.$general}; + + --mdc-menu-item-height: 48px; + + --mdc-icon-size: 0.75em; + --mdc-icon-button-size: 1.5em; +} + +mwc-icon-button { + svg, + .fa-layers { + display: block !important; + width: 0.7em !important; + height: 0.7em !important; + } +} + +.mdc-card { + padding: 1em; +} + +mwc-select { + width: 100%; +} + +mwc-textfield { + width: 100%; +} + +mwc-fab { + line-height: 1; + + &:focus, + &::-moz-focus-inner { + outline: none; + border: 0; + } + + .svg-inline--fa { + margin-right: 0; + } + + display: inline-flex; + justify-content: center; + + transition: opacity 15ms linear 30ms, + transform 0.27s cubic-bezier(0, 0, 0.2, 1) 0ms; + + &.exited { + transition: opacity 15ms linear 0.15s, + transform 0.18s cubic-bezier(0.4, 0, 1, 1) 0ms; + + transform: scale(0); + opacity: 0; + } + + &.large { + --button-fab-size: 3em; + font-size: 1.2em; + } +} + +.menu-anchor { + position: relative; + + mwc-menu { + position: absolute; + right: 0; + top: 0; + } +} + +a > mwc-list-item { + height: 48px; +} diff --git a/client/src/scss/settings.scss b/client/src/scss/_settings.scss similarity index 83% rename from client/src/scss/settings.scss rename to client/src/scss/_settings.scss index 4269423..ab9af48 100644 --- a/client/src/scss/settings.scss +++ b/client/src/scss/_settings.scss @@ -1,4 +1,4 @@ -@import "colors"; +@use "_colors"; .start-settings { position: fixed; @@ -26,6 +26,8 @@ padding: 0 1em 1em 1em; border-radius: 0.5em; + color: colors.$on-primary; + .title { display: flex; align-items: center; @@ -59,3 +61,14 @@ margin: 0; } } + +.card-size-slider { + flex-grow: 1; + display: flex; + align-items: center; + gap: 1em; +} + +.secondary { + flex-grow: 1; +} diff --git a/client/src/scss/card/variables.scss b/client/src/scss/card/variables.scss deleted file mode 100644 index 5da332f..0000000 --- a/client/src/scss/card/variables.scss +++ /dev/null @@ -1,37 +0,0 @@ -$call-color: #ffffff; -$call-background: #000000; - -$response-color: $call-background; -$response-background: $call-color; - -$card-width: 18em; -$card-margin: 0.5em; -$card-overlap: 4em; - -$card-ratio: 5/7; -$card-compact-ratio: 1; - -@mixin pad-to-aspect-ratio($ratio) { - padding-top: #{calc(1 / #{$ratio} * 100%)}; -} - -@function height($width, $ratio) { - @return calc(#{$width} * 1 / #{$ratio}); -} - -@function strip-unit($value) { - @return $value / ($value * 0 + 1); -} - -@mixin fluid-type($min-vw, $max-vw, $min-font-size, $max-font-size) { - font-size: $min-font-size; - @media screen and (min-width: $min-vw) { - font-size: calc( - #{$min-font-size} + #{strip-unit($max-font-size - $min-font-size)} * - ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}) - ); - } - @media screen and (min-width: $max-vw) { - font-size: $max-font-size; - } -} diff --git a/client/src/scss/card/size.scss b/client/src/scss/cards/_size.scss similarity index 67% rename from client/src/scss/card/size.scss rename to client/src/scss/cards/_size.scss index 288224e..4c8d157 100644 --- a/client/src/scss/card/size.scss +++ b/client/src/scss/cards/_size.scss @@ -1,4 +1,34 @@ -@import "./variables"; +$card-width: 18em; +$card-margin: 0.5em; +$card-overlap: 4em; + +$card-ratio: 5/7; +$card-compact-ratio: 1; + +@mixin pad-to-aspect-ratio($ratio) { + padding-top: #{calc(1 / #{$ratio} * 100%)}; +} + +@function height($width, $ratio) { + @return calc(#{$width} * 1 / #{$ratio}); +} + +@function strip-unit($value) { + @return $value / ($value * 0 + 1); +} + +@mixin fluid-type($min-vw, $max-vw, $min-font-size, $max-font-size) { + font-size: $min-font-size; + @media screen and (min-width: $min-vw) { + font-size: calc( + #{$min-font-size} + #{strip-unit($max-font-size - $min-font-size)} * + ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}) + ); + } + @media screen and (min-width: $max-vw) { + font-size: $max-font-size; + } +} .minimal-card-size #game { --card-aspect-ratio: 0; @@ -36,7 +66,7 @@ } } - .info { + .card-info { display: none; } diff --git a/client/src/scss/card/sources.scss b/client/src/scss/cards/_sources.scss similarity index 73% rename from client/src/scss/card/sources.scss rename to client/src/scss/cards/_sources.scss index 696f9bd..34fb281 100644 --- a/client/src/scss/card/sources.scss +++ b/client/src/scss/cards/_sources.scss @@ -4,7 +4,7 @@ height: 1em; font-size: inherit; vertical-align: -0.125em; - background-image: url(../../assets/images/cardcast.png); + background-image: url(../../../assets/images/cardcast.png); background-size: contain; margin-right: 0.5em; } diff --git a/client/src/scss/error.scss b/client/src/scss/error.scss deleted file mode 100644 index 7aa1794..0000000 --- a/client/src/scss/error.scss +++ /dev/null @@ -1,60 +0,0 @@ -@import "./colors"; - -.error-overlay { - z-index: 100; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - - background-color: transparentize($secondary-background, 0.6); - - display: flex; - flex-direction: column; - justify-content: center; - align-items: stretch; - - padding: 3em; - - .actions { - display: flex; - flex-direction: row; - justify-content: center; - } - - .help { - margin-bottom: 0.5em; - } - - .errors { - overflow-y: auto; - } -} - -.error { - --expansion-color: #{$on-error}; - --expansion-header-description-color: #{$on-error}; - --expansion-bg: #{$error}; - - padding: 0.25em; - - .description { - white-space: normal; - flex-basis: 100%; - } - - .report { - .body { - margin: 0 1em; - --input-color: #{$on-error}; - } - - .link { - margin-top: 1em; - display: flex; - justify-content: flex-end; - width: 100%; - } - } -} diff --git a/client/src/scss/game/history.scss b/client/src/scss/game/_history.scss similarity index 77% rename from client/src/scss/game/history.scss rename to client/src/scss/game/_history.scss index d86e18f..0888523 100644 --- a/client/src/scss/game/history.scss +++ b/client/src/scss/game/_history.scss @@ -1,5 +1,5 @@ -@import "../colors"; -@import "../card/size"; +@use "../_colors"; +@use "../cards/_size"; #history { h2 { @@ -15,10 +15,10 @@ counter-reset: historic-round-number; .historic-round:nth-child(even) { - background-color: transparentize($primary-light, 0.6); + background-color: transparentize(colors.$primary-light, 0.6); } .historic-round:nth-child(odd) { - background-color: transparentize($secondary-light, 0.6); + background-color: transparentize(colors.$secondary-light, 0.6); } } @@ -42,8 +42,8 @@ } .historic-call { - flex-basis: $card-width; - min-width: $card-width; + flex-basis: size.$card-width; + min-width: size.$card-width; & > div { margin: 0.5em; diff --git a/client/src/scss/game/judging.scss b/client/src/scss/game/_judging.scss similarity index 50% rename from client/src/scss/game/judging.scss rename to client/src/scss/game/_judging.scss index 7023bec..a6b9b5e 100644 --- a/client/src/scss/game/judging.scss +++ b/client/src/scss/game/_judging.scss @@ -1,4 +1,4 @@ -@import "../colors"; +@use "../_colors"; .liked { .side::after { @@ -12,14 +12,7 @@ display: block; content: ""; opacity: 0.3; - //noinspection CssInvalidFunction - background: inline-svg( - "./assets/images/certificate-thumbs-up.svg", - ( - path: ( - fill: $primary - ) - ) - ); + background: colors.$primary; + mask-image: url("../../../assets/images/certificate-thumbs-up.svg"); } } diff --git a/client/src/scss/game/playing.scss b/client/src/scss/game/_playing.scss similarity index 78% rename from client/src/scss/game/playing.scss rename to client/src/scss/game/_playing.scss index 7818bfd..c1e492c 100644 --- a/client/src/scss/game/playing.scss +++ b/client/src/scss/game/_playing.scss @@ -1,4 +1,4 @@ -@import "../card/variables"; +@use "../cards/_size"; // A hand of cards. .hand { @@ -28,7 +28,7 @@ // Unknown plays for the round animated in at the top of the screen during the playing stage. .background-plays { - --card-aspect-ratio: #{$card-ratio}; + --card-aspect-ratio: #{size.$card-ratio}; position: absolute; top: 0; @@ -45,10 +45,11 @@ .play { position: relative; - transform: translateY(-$card-width * 4); + transform: translateY(size.$card-width * -4); transition: transform 500ms ease-in; - width: $card-width + $card-margin * 2; - margin-left: -0.5 * ($card-width + $card-margin * 2); + width: 0; + display: flex; + justify-content: center; .game-card { transform: rotate(0); @@ -56,9 +57,6 @@ transform-origin: center; position: absolute; - top: 0; - right: 0; - left: 0; } &.played { @@ -66,7 +64,7 @@ transition: transform 500ms ease-out; .game-card { - transform: rotate(var(--rotation)); + transform: rotate(var(--rotation, 0)); transition: transform 500ms ease-out; } } diff --git a/client/src/scss/game/plays.scss b/client/src/scss/game/_plays.scss similarity index 100% rename from client/src/scss/game/plays.scss rename to client/src/scss/game/_plays.scss diff --git a/client/src/scss/massive-decks.scss b/client/src/scss/massive-decks.scss index fd011bf..dcaa6ec 100644 --- a/client/src/scss/massive-decks.scss +++ b/client/src/scss/massive-decks.scss @@ -1,34 +1,40 @@ -@import "./colors"; -@import "./card/variables"; -@import "./fonts"; -@import "./animation.scss"; -@import "./variables.scss"; +@use "_colors"; +@use "_fonts"; +@use "_material"; + +@use "_game"; +@use "pages/_start"; +@use "pages/_lobby"; +@use "pages/_spectate"; +@use "pages/_unknown-page"; +@use "_settings"; +@use "_error"; + +@import "~@fortawesome/fontawesome-free/css/svg-with-js.min.css"; + +$min-page-width: 320px; .no-wrap { white-space: nowrap; } body { - color: $on-primary; - background: $background url(../../assets/images/background.svg) repeat; + color: colors.$on-primary; + background: colors.$background url(../../assets/images/background.svg) repeat; margin: 0; padding: 0; font-size: 18px; line-height: 1.2; - font-family: "Roboto", sans-serif; + font-family: fonts.$general; min-width: $min-page-width; } -#game { - background: $background url(../../assets/images/background.svg) repeat; -} - .game-code-input { - --input-font-family: "Source Code Pro", monospace; + --mdc-typography-font-family: #{fonts.$game-code}; } .game-code { - font-family: "Source Code Pro", monospace; + font-family: fonts.$game-code; .svg-inline--fa { margin-left: 0.3em; } @@ -39,7 +45,7 @@ body { } h1 { - font-family: "Helvetica Neue", "Nimbus Sans L", sans-serif; + font-family: fonts.$card; font-weight: 700; margin: 0.5em; } @@ -63,7 +69,11 @@ a, text-decoration: none; &:not(.tab) { - background: linear-gradient(to top, $secondary 50%, $transparent 50%) + background: linear-gradient( + to top, + colors.$secondary 50%, + colors.$transparent 50% + ) no-repeat 0 10%; background-size: 100% 200%; transition: background-position 0.3s cubic-bezier(0.64, 0.9, 0.8, 1); @@ -76,17 +86,17 @@ a, // A button that allows the user to perform the main action in the game for them at this moment. .action { - --button-fab-size: 4rem; font-size: 1.5rem; // A style for actions that the game is waiting on - high contrast to grab attention. - &.important { - --button-bg: #{$secondary}; - --button-color: #{$on-secondary}; - --button-bg-hover: #{$secondary-light}; - --button-color-hover: #{$on-secondary-light}; - --button-bg-active: #{$secondary-dark}; - --button-color-acitve: #{$on-secondary-dark}; + &.blocking { + --mdc-theme-secondary: #{colors.$secondary}; + --mdc-theme-on-secondary: #{colors.$on-secondary}; + } + + &.normal { + --mdc-theme-secondary: #{colors.$card}; + --mdc-theme-on-secondary: #{colors.$primary}; } } @@ -161,6 +171,8 @@ a, } .children { + display: flex; + flex-direction: column; font-size: 0.9em; margin-left: 0.5em; @@ -168,6 +180,10 @@ a, opacity: 0.6; } } + + mwc-button { + align-self: flex-end; + } } .segment { @@ -196,8 +212,8 @@ a, .inline-error { @include message; - color: $error; - background-color: lighten($error, 55%); + color: colors.$error; + background-color: lighten(colors.$error, 55%); border-radius: 0.5em; } @@ -215,7 +231,7 @@ a, li { display: inline-block; - wl-button { + mwc-icon-button { margin: 0; } } @@ -224,16 +240,3 @@ a, .remove-from-flow { position: absolute; } - -@import "./fonts"; -@import "./cards"; -@import "./error"; -@import "./settings"; -@import "./game"; -@import "./pages/start"; -@import "./pages/unknown-page"; -@import "./pages/spectate"; -@import "./pages/lobby"; -@import "./weightless"; - -@import "@fortawesome/fontawesome-free/css/svg-with-js.min.css"; diff --git a/client/src/scss/pages/lobby.scss b/client/src/scss/pages/_lobby.scss similarity index 64% rename from client/src/scss/pages/lobby.scss rename to client/src/scss/pages/_lobby.scss index 2a9f080..29f4994 100644 --- a/client/src/scss/pages/lobby.scss +++ b/client/src/scss/pages/_lobby.scss @@ -1,10 +1,11 @@ -@import "../colors"; -@import "../card/variables"; -@import "../game"; -@import "./lobby/configure"; -@import "./lobby/invite"; -@import "./lobby/variables"; -@import "~weightless/style/base/elevation"; +@use "../_colors"; +@use "../_cards"; +@use "../_game"; +@use "lobby/_configure"; +@use "lobby/_invite"; + +$top-bar-height: 4rem; +$users-width: 18rem; @keyframes fadeIn { from { @@ -32,8 +33,8 @@ justify-content: space-between; align-items: center; - color: $call-color; - background-color: $call-background; + color: cards.$call-color; + background-color: cards.$call-background; .left { display: flex; @@ -79,7 +80,7 @@ #users { font-size: 1rem; - overflow: auto; + overflow-y: auto; z-index: 2; @@ -97,18 +98,59 @@ transition: width 0.3s; - --list-item-padding: 0.5em; - --list-item-left-margin: 0.5em; + mwc-menu { + left: 0; + right: 0; + margin: auto; + } .collapsible { padding: 1em; } .user { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - max-width: $users-width - 8rem; + display: flex; + justify-content: space-between; + align-items: center; + + padding: 0.5em; + + &.has-menu { + &:hover { + background-color: colors.$background; + } + + &.active { + background-color: colors.$secondary-background; + } + } + + .about { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + min-width: 1em; + + .name { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + .scores { + display: flex; + flex-direction: column; + + .score { + color: colors.$secondary; + } + + .likes { + color: colors.$primary; + } + } } ol { @@ -150,7 +192,7 @@ } &.connected { - color: $secondary; + color: colors.$secondary; } } @@ -171,15 +213,15 @@ left: 0; bottom: 0; margin: 1em; - padding: 0; + padding: 0.5em; transform: translateY(100%); - --card-bg: #{$call-background}; - --card-color: #{$call-color}; + background-color: #{cards.$call-background}; + color: #{cards.$call-color}; &.error { - --card-bg: #{$error}; - --card-color: #{$on-error}; + background-color: #{colors.$error}; + color: #{colors.$on-error}; } &.entering { @@ -209,9 +251,5 @@ list-style: none; padding: 0; margin: 0; - - wl-list-item { - width: 100%; - } } } diff --git a/client/src/scss/pages/spectate.scss b/client/src/scss/pages/_spectate.scss similarity index 92% rename from client/src/scss/pages/spectate.scss rename to client/src/scss/pages/_spectate.scss index 8487346..4cd0518 100644 --- a/client/src/scss/pages/spectate.scss +++ b/client/src/scss/pages/_spectate.scss @@ -1,5 +1,6 @@ -@import "../colors"; -@import "../cards"; +@use "../_colors"; +@use "../_cards"; +@use "../cards/_size"; #loading { position: fixed; @@ -18,7 +19,7 @@ } #spectate { - --card-aspect-ratio: #{$card-ratio}; + --card-aspect-ratio: #{size.$card-ratio}; font-size: 1vmin; @@ -139,8 +140,8 @@ .game-code { font-size: 1.5em; - background-color: $primary-dark; - color: $on-primary-dark; + background-color: colors.$primary-dark; + color: colors.$on-primary-dark; } } diff --git a/client/src/scss/pages/start.scss b/client/src/scss/pages/_start.scss similarity index 76% rename from client/src/scss/pages/start.scss rename to client/src/scss/pages/_start.scss index f7812a4..523b9ea 100644 --- a/client/src/scss/pages/start.scss +++ b/client/src/scss/pages/_start.scss @@ -1,27 +1,21 @@ -@import "./start/lobby-browser"; -@import "../card/variables"; -@import "../colors"; +@use "./start/_lobby-browser"; +@use "../cards/_size"; +@use "../_colors"; .start { - @include fluid-type(20rem, 64rem, 0.8rem, 1rem); - --card-aspect-ratio: #{$card-ratio}; - padding: 0.5em 2em 2em 2em; + @include size.fluid-type(20rem, 64rem, 0.8rem, 1rem); + --card-aspect-ratio: #{size.$card-ratio}; + padding: 0.5em 0 0 0; display: flex; flex-direction: column; align-items: stretch; - min-width: min-content; - width: 60%; - - @media (max-width: 1280px) { - width: auto; - } - + max-width: 80em; margin: 0 auto; - nav { - display: flex; + &.page { + padding: 0; } #overlay { @@ -48,7 +42,7 @@ h1, .subtitle { - flex-basis: $card-width; + flex-basis: size.$card-width; font-size: 1em; } @@ -81,9 +75,31 @@ .start-tab { margin: 0.5em auto 0 auto; width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + } + + .tab-content { display: flex; flex-direction: column; align-items: stretch; + + flex-basis: 30em; + + padding: 0 2em 0 2em; + margin: 2em; + + border-left: 0.1em solid colors.$secondary-background; + border-right: 0.1em solid colors.$secondary-background; + + h2 { + margin: 0; + } + + mwc-button { + align-self: flex-end; + } } .restrict { @@ -92,12 +108,12 @@ width: 100%; display: flex; flex-direction: column; - align-items: stretch; + align-items: flex-end; } .example-card { float: right; - width: $card-width; + width: size.$card-width; margin: 0.5em; font-size: 0.7em; color: #666677; diff --git a/client/src/scss/pages/unknown-page.scss b/client/src/scss/pages/_unknown-page.scss similarity index 100% rename from client/src/scss/pages/unknown-page.scss rename to client/src/scss/pages/_unknown-page.scss diff --git a/client/src/scss/pages/lobby/configure.scss b/client/src/scss/pages/lobby/_configure.scss similarity index 75% rename from client/src/scss/pages/lobby/configure.scss rename to client/src/scss/pages/lobby/_configure.scss index 51f720a..6f82894 100644 --- a/client/src/scss/pages/lobby/configure.scss +++ b/client/src/scss/pages/lobby/_configure.scss @@ -1,13 +1,12 @@ -@import "../../colors"; -@import "../../card/variables"; +@use "../../_colors"; .configure { padding: 1em; height: 100%; - wl-card { - max-width: 30em; - margin: 1em auto; + .mdc-card { + max-width: 60em; + margin: auto; } .title { @@ -38,7 +37,7 @@ } .multipart { - wl-switch { + mdc-switch { margin-right: 0.5em; } } @@ -51,6 +50,7 @@ bottom: 0; margin: 1em; pointer-events: none; + gap: 0.5em; .action { pointer-events: all; @@ -77,7 +77,7 @@ } tr { - border-top: 1px solid $secondary-background; + border-top: 1px solid colors.$secondary-background; } .deck-row .name { @@ -103,10 +103,6 @@ margin-left: 0.5em; } - .remove-button { - margin: 0 0 0 0.1em; - } - .with-error { opacity: 0.5; flex-grow: 1; @@ -116,17 +112,15 @@ } } -#source-selector { - flex-basis: 7em; - flex-shrink: 1; - height: 100%; - margin-right: 0.5em; - --input-padding-top-bottom: 0.9em; +#add-deck .multipart { + .primary { + flex-shrink: 0; + } } -#built-in-selector { - height: 100%; - --input-padding-top-bottom: 0.9em; +#source-selector { + flex-shrink: 1; + flex-basis: 12em; } .house-rules { @@ -169,6 +163,12 @@ } } +.button-spread { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + #merge-overlay { position: fixed; top: 0; @@ -176,7 +176,7 @@ bottom: 0; left: 0; - background-color: transparentize($secondary-background, 0.6); + background-color: transparentize(colors.$secondary-background, 0.6); z-index: 5; @@ -202,9 +202,31 @@ } .locally-changed { - background-color: transparentize($primary-light, 0.9); + background-color: transparentize(colors.$primary-light, 0.9); } .validation-error { - background-color: transparentize($error, 0.9); + background-color: transparentize(colors.$error, 0.9); +} + +#add-deck mwc-icon-button { + margin: 0; +} + +.source-tooltip { + display: flex; + flex-direction: column; + align-items: flex-end; + + font-size: 1.5em; + + & p { + margin: 0; + } + + .author, + .translator, + .language { + font-size: 0.8em; + } } diff --git a/client/src/scss/pages/lobby/invite.scss b/client/src/scss/pages/lobby/_invite.scss similarity index 79% rename from client/src/scss/pages/lobby/invite.scss rename to client/src/scss/pages/lobby/_invite.scss index 73d1bd5..cde1ac7 100644 --- a/client/src/scss/pages/lobby/invite.scss +++ b/client/src/scss/pages/lobby/_invite.scss @@ -1,3 +1,5 @@ +@use "../../_colors"; + #invite-dialog { position: fixed; top: 0; @@ -14,7 +16,7 @@ overflow: hidden; - background-color: transparentize(#cccccc, 0.2); + background-color: transparentize(colors.$secondary-background, 0.2); display: flex; flex-direction: column; @@ -24,7 +26,7 @@ #invite-link-field { border: 0; - border-bottom: 2px solid #cccccc; + border-bottom: 2px solid colors.$secondary-background; flex-grow: 1; text-align: center; @@ -40,7 +42,7 @@ pointer-events: all; } - wl-card { + .mdc-card { display: flex; flex-direction: column; align-items: center; diff --git a/client/src/scss/pages/lobby/variables.scss b/client/src/scss/pages/lobby/variables.scss deleted file mode 100644 index e42e963..0000000 --- a/client/src/scss/pages/lobby/variables.scss +++ /dev/null @@ -1,2 +0,0 @@ -$top-bar-height: 4rem; -$users-width: 18rem; diff --git a/client/src/scss/pages/start/lobby-browser.scss b/client/src/scss/pages/start/_lobby-browser.scss similarity index 100% rename from client/src/scss/pages/start/lobby-browser.scss rename to client/src/scss/pages/start/_lobby-browser.scss diff --git a/client/src/scss/variables.scss b/client/src/scss/variables.scss deleted file mode 100644 index 53bb7b4..0000000 --- a/client/src/scss/variables.scss +++ /dev/null @@ -1 +0,0 @@ -$min-page-width: 320px; diff --git a/client/src/scss/weightless.scss b/client/src/scss/weightless.scss deleted file mode 100644 index fd2e826..0000000 --- a/client/src/scss/weightless.scss +++ /dev/null @@ -1,80 +0,0 @@ -@import "./colors"; -@import "./cards"; -@import "./fonts"; - -@function toHSL($color) { - @return #{hue($color) / 1deg}, #{saturation($color)}, #{lightness($color)}; -} - -body { - --primary-400: #{toHSL($primary-light)}; - --primary-500: #{toHSL($primary)}; - --primary-600: #{toHSL($primary-dark)}; - - --secondary-400: #{toHSL($secondary-light)}; - --secondary-500: #{toHSL($secondary)}; - --secondary-600: #{toHSL($secondary-dark)}; - - --font-family-serif: "Helvetica Neue", "Nimbus Sans L", sans-serif; - --font-family-sans: "Roboto", sans-serif; -} - -wl-card { - padding: 1em; -} - -wl-button { - transform-origin: center center; - margin: 0.5em; - - .svg-inline--fa { - margin-right: 0.4em; - } - - flex-shrink: 0; -} - -wl-select { - flex-shrink: 0; -} - -wl-tab { - --tab-padding: 1em; - - .svg-inline--fa { - margin-right: 0.25em; - } -} - -wl-button[fab] { - line-height: 1; - - &:focus, - &::-moz-focus-inner { - outline: none; - border: 0; - } - - .svg-inline--fa { - margin-right: 0; - } - - display: inline-flex; - justify-content: center; - - transition: opacity 15ms linear 30ms, - transform 0.27s cubic-bezier(0, 0, 0.2, 1) 0ms; - - &.exited { - transition: opacity 15ms linear 0.15s, - transform 0.18s cubic-bezier(0.4, 0, 1, 1) 0ms; - - transform: scale(0); - opacity: 0; - } - - &.large { - --button-fab-size: 3em; - font-size: 1.2em; - } -} diff --git a/client/src/ts/confetti.ts b/client/src/ts/confetti.ts new file mode 100644 index 0000000..59a916d --- /dev/null +++ b/client/src/ts/confetti.ts @@ -0,0 +1,23 @@ +import { InboundPort } from "../elm/MassiveDecks"; +import * as confetti from "canvas-confetti"; + +export function register(startConfetti: InboundPort) { + startConfetti.subscribe(ConfettiManager.start); +} + +class ConfettiManager { + public static async start(id: string) { + confetti.create(document.getElementById(id) as HTMLCanvasElement, { + resize: true, + useWorker: true, + // @ts-ignore + disableForReducedMotion: true, + })({ + origin: { x: 0.5, y: 1 }, + ticks: 400, + particleCount: 300, + startVelocity: 90, + spread: 55, + }); + } +} diff --git a/client/src/ts/massive-decks.ts b/client/src/ts/massive-decks.ts index 24e6b01..6b13713 100644 --- a/client/src/ts/massive-decks.ts +++ b/client/src/ts/massive-decks.ts @@ -1,10 +1,12 @@ -import "./weightless"; +import "./material"; +import "./paper"; import * as serverConnection from "./server-connection"; import * as speech from "./speech"; import * as notificationManager from "./notification-manager"; import * as settings from "./settings"; import * as copy from "./copy"; import * as language from "./language"; +import * as confetti from "./confetti"; export function load(remoteMode: boolean) { // This lets us chunk off our elm code separately, which is important so we can @@ -15,8 +17,8 @@ export function load(remoteMode: boolean) { flags: { ...settings.flags(), ...language.flags(), - remoteMode - } + remoteMode, + }, }); serverConnection.register(app.ports.serverRecv, app.ports.serverSend); @@ -29,14 +31,15 @@ export function load(remoteMode: boolean) { app.ports.notificationCommands ); language.register(app.ports.languageChanged); + confetti.register(app.ports.startConfetti); import(/* webpackChunkName: "cast-client" */ "./cast/client").then( - cast => { + (cast) => { cast.register(app.ports.tryCast, app.ports.castStatus); } ); } else { import(/* webpackChunkName: "cast-server" */ "./cast/server").then( - cast => { + (cast) => { cast.register(app.ports.remoteControl); } ); diff --git a/client/src/ts/material.ts b/client/src/ts/material.ts new file mode 100644 index 0000000..aff891e --- /dev/null +++ b/client/src/ts/material.ts @@ -0,0 +1,17 @@ +import "@webcomponents/webcomponentsjs/webcomponents-loader"; + +import "@material/mwc-button"; +import "@material/mwc-fab"; +import "@material/mwc-switch"; +import "@material/mwc-slider"; +import "@material/mwc-select"; +import "@material/mwc-tab"; +import "@material/mwc-tab-bar"; +import "@material/mwc-menu"; +import "@material/mwc-list"; +import "@material/mwc-list/mwc-list-item"; +import "@material/mwc-textarea"; +import "@material/mwc-textfield"; +import "@material/mwc-icon-button"; +import "@material/mwc-linear-progress"; +import "@material/mwc-ripple"; diff --git a/client/src/ts/notification-manager.ts b/client/src/ts/notification-manager.ts index 6ef10a8..f929a6d 100644 --- a/client/src/ts/notification-manager.ts +++ b/client/src/ts/notification-manager.ts @@ -62,7 +62,9 @@ export class NotificationManager { permission: "Notification" in window ? Notification.permission : "unsupported", visibility: - "visibilityState" in document ? document.visibilityState : "unsupported" + "visibilityState" in document + ? document.visibilityState + : "unsupported", }); document.addEventListener( @@ -87,26 +89,27 @@ export class NotificationManager { try { Notification.requestPermission().then(callback); } catch (e) { + // noinspection JSIgnoredPromiseFromCall Notification.requestPermission(callback); } } receivePermission(permission: NotificationPermission): void { this.out.send({ - permission + permission, }); } visibilityChange(): any { this.out.send({ - visibility: document.visibilityState === "visible" ? "visible" : "hidden" + visibility: document.visibilityState === "visible" ? "visible" : "hidden", }); } sendNotification(message: Message): void { const notification = new Notification(message.title, { body: message.body, - tag: "game-progress" + tag: "game-progress", }); setTimeout(notification.close.bind(notification), 4000); } diff --git a/client/src/ts/paper.ts b/client/src/ts/paper.ts new file mode 100644 index 0000000..c3de1fd --- /dev/null +++ b/client/src/ts/paper.ts @@ -0,0 +1 @@ +import "@polymer/paper-tooltip/paper-tooltip.js"; diff --git a/client/src/ts/server-connection.ts b/client/src/ts/server-connection.ts index 19a46ed..c66cb21 100644 --- a/client/src/ts/server-connection.ts +++ b/client/src/ts/server-connection.ts @@ -4,7 +4,7 @@ import { InboundPort, MessageCommand, OpenCommand, - OutboundPort + OutboundPort, } from "../elm/MassiveDecks"; export function register( @@ -53,7 +53,7 @@ class ServerConnection { ("//" + baseUrl.host + baseUrl.path + slash + ServerConnection.apiUrl); this.out = out; this.lobbyConnection = null; - inbound.subscribe(command => this.handleMessage(command)); + inbound.subscribe((command) => this.handleMessage(command)); } static baseFromHtml(baseElement: HTMLBaseElement): BaseUrl { @@ -61,7 +61,7 @@ class ServerConnection { return { protocol: url.protocol, host: url.host, - path: url.pathname + path: url.pathname, }; } @@ -72,7 +72,7 @@ class ServerConnection { return { protocol: url.protocol, host: url.host, - path: "" + path: "", }; } @@ -103,7 +103,7 @@ class LobbyConnection { static readonly oneMinute = LobbyConnection.oneSecond * 60; static readonly initialDelay = LobbyConnection.oneSecond / 2; - static readonly maxDelay = LobbyConnection.oneMinute * 10; + static readonly maxDelay = LobbyConnection.oneMinute; socket: WebSocket; delay: number = LobbyConnection.initialDelay; @@ -118,21 +118,21 @@ class LobbyConnection { open(parent: ServerConnection, url: string) { this.closed = false; const socket = new WebSocket(url); - socket.addEventListener("message", event => { + socket.addEventListener("message", (event) => { if (parent.lobbyConnection === this) { parent.out.send(event.data); } }); - socket.addEventListener("open", _ => { + socket.addEventListener("open", (_) => { this.delay = LobbyConnection.initialDelay; this.send( JSON.stringify({ action: "Authenticate", - token: this.token + token: this.token, }) ); }); - socket.addEventListener("close", _ => { + socket.addEventListener("close", (_) => { if (!this.closed) { setTimeout(() => { if (!this.closed) { diff --git a/client/src/ts/weightless.ts b/client/src/ts/weightless.ts deleted file mode 100644 index 88c3e42..0000000 --- a/client/src/ts/weightless.ts +++ /dev/null @@ -1,17 +0,0 @@ -import "@webcomponents/webcomponentsjs/webcomponents-loader"; -import "weightless/button"; -import "weightless/card"; -import "weightless/expansion"; -import "weightless/list-item"; -import "weightless/nav"; -import "weightless/popover"; -import "weightless/popover-card"; -import "weightless/select"; -import "weightless/slider"; -import "weightless/switch"; -import "weightless/tab"; -import "weightless/tab-group"; -import "weightless/textfield"; -import "weightless/textarea"; -import "weightless/tooltip"; -import "weightless/progress-bar"; diff --git a/client/webpack.config.js b/client/webpack.config.js index 0238a81..28dfbed 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -1,11 +1,11 @@ const webpack = require("webpack"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const TerserPlugin = require("terser-webpack-plugin"); -const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const path = require("path"); -const inliner = require("sass-inline-svg"); const CompressionPlugin = require("compression-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin"); +const sass = require("sass"); +const ClosurePlugin = require("closure-webpack-plugin"); module.exports = (env, argv) => { // WebStorm doesn't give any arguments, causing this to blow up without the check. @@ -33,31 +33,28 @@ module.exports = (env, argv) => { // Load CSS to inline styles. { loader: "css-loader", - options: { sourceMap: dev, importLoaders: 2 }, + options: { sourceMap: dev }, }, - // Transform CSS for compatibility. + // // Transform CSS for compatibility. + // { + // loader: "postcss-loader", + // options: { + // sourceMap: dev, + // }, + // }, + // Allow relative URLs. { - loader: "postcss-loader", - options: { - sourceMap: dev, - ident: "postcss", - plugins: (loader) => [ - require("postcss-import")({ root: loader.resourcePath }), - require("postcss-preset-env")(), - require("cssnano")(), - ], - }, + loader: "resolve-url-loader", + options: { sourceMap: dev }, }, // Load SASS to CSS. { loader: "sass-loader", options: { - sourceMap: dev, + implementation: sass, + sourceMap: true, sassOptions: { includePaths: ["node_modules"], - functions: { - "inline-svg": inliner("./", { encodingFormat: "uri" }), - }, }, }, }, @@ -258,47 +255,14 @@ module.exports = (env, argv) => { }, }), // Elm - we can do otherwise dangerous optimisation thanks to the purity. - new UglifyJsPlugin({ - test: /assets\/scripts\/massive-decks\..*\.js$/, - minify: (file, _) => { - const uglify = require("uglify-js"); - const { error, map, code, warnings } = uglify.minify(file, { - compress: { - pure_funcs: [ - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "A2", - "A3", - "A4", - "A5", - "A6", - "A7", - "A8", - "A9", - ], - pure_getters: true, - keep_fargs: false, - unsafe_comps: true, - unsafe: true, - }, - mangle: false, - }); - - if (error) { - return { error, map, code, warnings }; - } - - return uglify.minify(code, { - mangle: true, - }); + new ClosurePlugin( + { + mode: "STANDARD", + platform: "javascript", + test: /assets\/scripts\/massive-decks\..*\.js$/, }, - }), + {} + ), ], }, devServer: { diff --git a/deployment/postgres/config.json5 b/deployment/postgres/config.json5 index 267bc2c..28cf197 100644 --- a/deployment/postgres/config.json5 +++ b/deployment/postgres/config.json5 @@ -29,9 +29,7 @@ // Ids for decks in the order they will be presented to the user. // The game will look for these in the directory given by basePath above, and will expect them to have the // .deck.json5 extension. - decks: [ - "cah-base-en" - ] + decks: ["cah-base-en", "cah-base-ptbr"], }, // Allows players to load decks from Cardcast via their API. https://www.cardcastgame.com/ @@ -43,8 +41,8 @@ // The number of connections the server can make to Cardcast at one time. // Please remember this is a service provided by Cardcast, and you should make best efforts to ensure you don't // hit them too hard, including not setting this too high. - simultaneousConnections: 1 - } + simultaneousConnections: 1, + }, }, // Timeouts determine how long the server waits before taking certain actions. @@ -61,7 +59,7 @@ // How long to wait after everyone has played to begin the revealing phase. Having this as a non-zero value lets // the last person playing - finishedPlayingDelay: "PT2S" + finishedPlayingDelay: "PT2S", }, // Tasks are things that take some time to happen (e.g: requesting data from external card services). @@ -72,7 +70,7 @@ rateLimit: 20, // How often to process queued tasks. Setting this too high will result in games being slowed down a lot when the // rate limit is hit (an ISO 8601 duration). - processTickFrequency: "PT0.5S" + processTickFrequency: "PT0.5S", }, // How to store game data. @@ -88,10 +86,10 @@ keepAlive: false, }, - // How long to allow without any activity before garbage collecting the game. + // How long to allow without any activity before garbage collecting the game (an ISO 8601 duration). abandonedTime: "PT15M", // How often to delete abandoned/finished games (an ISO 8601 duration). - garbageCollectionFrequency: "PT5M" + garbageCollectionFrequency: "PT5M", }, // How to cache game data. @@ -108,7 +106,7 @@ }, // How old a cached value should be before we check to see if we should update it on a hit. - checkAfter: "PT5M" + checkAfter: "PT5M", }, // A file to touch when the server is started. If null, we won't touch any files. @@ -116,6 +114,6 @@ // This will be overwritten by the environment variable MD_TOUCH_ON_START, if set. // The version of Massive Decks. - version: "dev" + version: "dev", // This will be overwritten by the environment variable MD_VERSION, if set. } diff --git a/package-lock.json b/package-lock.json index 3552eaa..4e33484 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,24 @@ "version": "file:client", "requires": { "@fortawesome/fontawesome-free": "^5.12.1", + "@material/card": "^6.0.0", + "@material/mwc-button": "^0.15.0", + "@material/mwc-fab": "^0.15.0", + "@material/mwc-icon-button": "^0.15.0", + "@material/mwc-linear-progress": "^0.15.0", + "@material/mwc-menu": "^0.15.0", + "@material/mwc-select": "^0.15.0", + "@material/mwc-slider": "^0.15.0", + "@material/mwc-switch": "^0.15.0", + "@material/mwc-tab": "^0.15.0", + "@material/mwc-tab-bar": "^0.15.0", + "@material/mwc-textarea": "^0.15.0", + "@material/mwc-textfield": "^0.15.0", + "@polymer/paper-tooltip": "^3.0.1", "@webcomponents/webcomponentsjs": "^2.4.3", - "weightless": "0.0.37" + "canvas-confetti": "^1.2.0" }, "dependencies": { - "@a11y/focus-trap": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@a11y/focus-trap/-/focus-trap-1.0.5.tgz", - "integrity": "sha512-3JOd6g+BALysWS8LNf0qdB8ltR651H/RCLAvUmfS0LIHwHO579XfjZUIZbURYiAZrcbp1CBAq4QZ2YwKNQZ1hw==" - }, "@babel/runtime": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", @@ -35,15 +44,2143 @@ "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-free/-/5.13.0/fontawesome-free-5.13.0.tgz", "integrity": "sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg==" }, + "@material/animation": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-6.0.0.tgz", + "integrity": "sha512-BxlzXzQ5W2WtaEVV4/PqkTpKB5PfOUvPmr1EK8+xQ0ouMV4qiWuwBfnu7DgXF+cglpFP3T71uHVYmh6lMdi4vg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-6.0.0.tgz", + "integrity": "sha512-S3rT7B9xa9IfHXIvYXYqbo6YVu9FWbFqTt1tMUCniizTRlpmHu9b5pmQ20f6mm3K3wAFD+crqsrtie2Y8h8r5g==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/button": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-YJqwOB6Xr619nSuWGUmkJN/+bj5sV/AsDfaE28Mv3xjoFqPK19I5RsDI62uZCmODGQfgxkY768JziT49zY9LXg==", + "requires": { + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/card": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-6.0.0.tgz", + "integrity": "sha512-pqqy087rw9VgP180WxGgC/UmiIW4QTom8VWihSwo8dXmTKQgpY4KP4TvV9sBN/xVTCiW5RQ++j7oZKDQDlyobA==", + "requires": { + "@material/elevation": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/ripple": "^6.0.0", + "@material/rtl": "^6.0.0", + "@material/shape": "^6.0.0", + "@material/theme": "^6.0.0" + } + }, + "@material/checkbox": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-yI0C0ua5JJn6qezG71cNWJC6uBxIlyqCDv/3s+aE8j/pHYel2IAJw9wWXA33Xi1QzFpjY8+gAmvN6Go3jS8JDg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/density": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-yUZw5NSTp7Aj/6Qu5bqLmX23X1QWBfShAoKIwFFZMpLkgWQPy2+p+o9JqaPXN9U824/sDFDP9nofR5VosaNyVg==" + }, + "@material/dom": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-6.0.0.tgz", + "integrity": "sha512-9hvoi3MxR25dmyv15xJGRS+Ezlr0oD+Y6k4UyAbLpExFP2OakTZc8Xj0Fd7Nwav3I5aIXyC5jJ2gvhZcy1cI9A==", + "requires": { + "@material/feature-targeting": "^6.0.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-6.0.0.tgz", + "integrity": "sha512-9WNBu/MKTQX40Ev3ayq5V8Pf/E/DqUPRQO8F0YA99jRWuYScpX2zeJlpRe+wLI6zIxtfFcVvRW9D4O1s1Bmbdg==", + "requires": { + "@material/animation": "^6.0.0", + "@material/base": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/theme": "^6.0.0" + } + }, + "@material/fab": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MMunuvYq7CnVKpV4nIdevFo02Cbypx9QtyTUYQ/RncRRXSlt5myZBk90dBvInp2B5Tq9XcbkbyIK2WCvS8d1FQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/feature-targeting": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-6.0.0.tgz", + "integrity": "sha512-REj9VJnqkGwpngffc/iHGPt8WTF27QFPWDD8VBNXaP+MmnpIu7V5q5JMoozKzG5uk+hVryzam1i2PJHztizDXg==" + }, + "@material/floating-label": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-vQyePCoY+jNvXxCMcetl8lObJ9zZKzQv3TzQzKRQfrN0H8TKl9iw+VRhHc59YWQQXMpszXC52ju0NshKOsOR8w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/icon-button": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-7LWQ4rStg7xiLSQ1DUSOXmuS5oyLFWt4kuDiMeqraapluMFHwFZ9RwmmliE+KhhZGHpe/4VT+M+mR9ZlG507oQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/line-ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-E6UIHRy28LfNT71atMKTj9uXAR9l9HhMoWdtGIT0PtsTnm2deJfIqGefI+T7kA0UQm2vYhk2ICE3keN28C9GRw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/linear-progress": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-K/fBvBOECG/Adkuudj9juma5pJ/cRubtxF0c3rS7EQHo06rebNunbbHeqmXbRB1daWAA23avaxLO5NKjsvhNOQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/progress-indicator": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/list": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-7hdSglQRGOg4y8tGx6dega12VQp1B8/SbjIsJ5fLH9gvnvusJCNVexvBO4bAa6D4ul4eWv8buJgu517plbnthA==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/menu": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-//ZbJmt4qepOu+i8VmgLevYAm4TtGTs4Q6k7NsZTbcaLKPM61upszM5oZ/YnlNELWZ3CUFweY2tdQIn6AnFkjw==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/list": "7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/menu-surface": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-TGxf+gMy1JjBxJhVFydWYt9ikE4mrMwA1Ki0Ts3n/Og6GizYUk1nsV6QTPUVlzOgX4vHkKHIfSCh+3tf9VokHA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-base": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.15.0.tgz", + "integrity": "sha512-TlZQtwKMhU5e4GMQ3ZFwhJ2ANQJHTnPMRq6ZDEIG2vfoxx8JIWJ2f/yoI8MkoYUJ1Q6t5arBaBaI2Qr0JEstWw==", + "requires": { + "@material/base": "=7.0.0-canary.d92d8c93e.0", + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-button": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.15.0.tgz", + "integrity": "sha512-vwwT5I8b7mMAH4UzGZdfStbWx+/blhBlZ/wZM+CKbolwPuOeMLeTMMawhyRnLqMxedCPExQ1koYoABXNoUB4lQ==", + "requires": { + "@material/button": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-checkbox": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-checkbox/-/mwc-checkbox-0.15.0.tgz", + "integrity": "sha512-ssjko688R/qPAfn4E79hFMyHq91h2rHqrAtvt7rFZT8to0uOurnXNwFLyuzwruhMbPjDRSr5fVcJWqWBV/SN3Q==", + "requires": { + "@material/checkbox": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-fab": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-fab/-/mwc-fab-0.15.0.tgz", + "integrity": "sha512-VejrZQgwAwcV72xOBaROxl3GQVg4nqczaxEZAmhVCJ5DNW58vhd32xmfXAtcySjKEROZbyIo24e3EZp8di/1Xg==", + "requires": { + "@material/fab": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-floating-label": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.15.0.tgz", + "integrity": "sha512-yfNk/vK+5ujdw/1AP+K4hhgJTzm/lR2jZpNr4zEq9v9uEDT3D+Q1PQ7jUpwKGKr/bZSU4jFUKeyksafE79YCCA==", + "requires": { + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-icon": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.15.0.tgz", + "integrity": "sha512-jKTwh9pNYn/DgQ1jmh3J7cl8CpOz7/seqLs70mURs2pMlbv9DIQiiYYprADExko7aaOwig9+lGmKQlEyLeV6DQ==", + "requires": { + "@material/mwc-base": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-icon-button": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-icon-button/-/mwc-icon-button-0.15.0.tgz", + "integrity": "sha512-7Xw4uYdMSRWBmviMB0i1BoacX/cnlA3JKT2kKipnXlj1JP0Y8hwLebXn18m0z8TbDhwAQnXuKp6cWSZMgcVcWw==", + "requires": { + "@material/icon-button": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-line-ripple": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.15.0.tgz", + "integrity": "sha512-bP0NEdSefiqUubr7oG8DHSA60eosfBCtA7W5zTXPhPYtENaF+m3ULwp7TE2gPEyoPcbvzx7CLeIdQzbmQtNAMg==", + "requires": { + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-linear-progress": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.15.0.tgz", + "integrity": "sha512-poBT3NZTqNpRtNSpvOfriguuU1rEYD2sLbSTwYO5DZt/f3OELbZE8C1AUZP37CUnfVyw8pwXjAURti7v2GZIog==", + "requires": { + "@material/linear-progress": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-list": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-list/-/mwc-list-0.15.0.tgz", + "integrity": "sha512-LEjy+nnsL6r6RAqef/zgk9aRIClyOtXp2k73AncHJMFdYhjQfgVNJLl+RChlxTuyCafKclVD+ufQFphD+cPZBw==", + "requires": { + "@material/base": "=7.0.0-canary.d92d8c93e.0", + "@material/density": "=7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "=7.0.0-canary.d92d8c93e.0", + "@material/list": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-checkbox": "^0.15.0", + "@material/mwc-radio": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/rtl": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "@material/typography": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-menu": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-menu/-/mwc-menu-0.15.0.tgz", + "integrity": "sha512-LG3VpP34woRMrIJn40bkrEMuv8CXmFJ70GLFEMmNFYp8z53ftIxQ9oL3kz09q0mOwgyThZAKrXJbyluO43NMlg==", + "requires": { + "@material/menu": "=7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-list": "^0.15.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-notched-outline": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.15.0.tgz", + "integrity": "sha512-x24k5vfGlZM/vwBxGMhNB3DVvICnEaq6iKIC0U+I1Kdk7G4AOIwCatQlf9u3HchvsQd9wpU5OfrXjZLktCeGsA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/notched-outline": "=7.0.0-canary.d92d8c93e.0", + "@material/shape": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-radio": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-radio/-/mwc-radio-0.15.0.tgz", + "integrity": "sha512-SbemYU6ZvqUGTNi62yQ6p9GIOBH2WajQFebgEsSCaaxWNJqTQGCh3vw7Wbx+75ZTTjGY6VQL0oeXDKoz2cRwmA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/radio": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-ripple": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.15.0.tgz", + "integrity": "sha512-3elf4ysHoURfdoWRle/0zQ2l7OUSWE7Ah73B/PYr/DgHISmYYUjg2k/K5NSro9UcmshAVnppIujlcZN3GbQIyA==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/ripple": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-select": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-select/-/mwc-select-0.15.0.tgz", + "integrity": "sha512-leaGiXNWrUMpS4HO+YyjPuJfUKos2LRLT49WdueErt0MTx1nYhvWGxj80rOugi8q3/6zvs2wxZG3oWX/KruO8Q==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-floating-label": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-line-ripple": "^0.15.0", + "@material/mwc-menu": "^0.15.0", + "@material/mwc-notched-outline": "^0.15.0", + "@material/select": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/mwc-slider": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-slider/-/mwc-slider-0.15.0.tgz", + "integrity": "sha512-35858xrxTNSJkP8EfgGF+SJRHkYgjXlrMzwVFXYXqqIpVu50V8CJ10qI58/FRVhaB9bsK0D4lOLOlZPE5ReACA==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/slider": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-switch": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-switch/-/mwc-switch-0.15.0.tgz", + "integrity": "sha512-z4bOJgm9PYACk6JtFCQWMHpfO3HQOALmnV4EUDrUL4628oGcIfa3VJPeINDAoNzjwIvjY5EtoGKWEBDJpFnrfw==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/switch": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab/-/mwc-tab-0.15.0.tgz", + "integrity": "sha512-Ir/RXhFmU+9XhSyOcAcAsQMJY/4h6ivxOmKxL+9h1WH77QNR4INN/DU7YikAkPiTqkqFwYMRQ40eUzOhZYMB+w==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-ripple": "^0.15.0", + "@material/mwc-tab-indicator": "^0.15.0", + "@material/tab": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-bar": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-bar/-/mwc-tab-bar-0.15.0.tgz", + "integrity": "sha512-wCPJSzfaefbbcfMzp7l+F3IfdwThWDinJgImu2Lbtf6cVep60NqbzFIYO3HpIgwag7NthoY+E3lb2GsAEsKDSQ==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-tab": "^0.15.0", + "@material/mwc-tab-scroller": "^0.15.0", + "@material/tab-bar": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-indicator": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-indicator/-/mwc-tab-indicator-0.15.0.tgz", + "integrity": "sha512-dbzHgqcj3tdMAoupmHwWPnuog/vFVhPHHev/3D99hpd+r1e3Smx3D/AU6WmMWRRN9UqRs9b/ZM0BI4fv4+1Djg==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/tab-indicator": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-tab-scroller": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-tab-scroller/-/mwc-tab-scroller-0.15.0.tgz", + "integrity": "sha512-2LzNn5BKhwgMV4VHu0iEnEWlyHeho/49CI/2SpcW+6rKLnMbzEP2X5m5cyurzEslt4eyh82jzHxeY+Y8Bw6YKg==", + "requires": { + "@material/dom": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/tab-scroller": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/mwc-textarea": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-textarea/-/mwc-textarea-0.15.0.tgz", + "integrity": "sha512-dftIcPm4ncGS76L84YZFflSqU69fM87ZW4P+GrP2s2pPTZlHtdxxRrMxGYCTbqSfzPddSNyM0LsWcdNSCHKJ1g==", + "requires": { + "@material/mwc-base": "^0.15.0", + "@material/mwc-textfield": "^0.15.0", + "@material/textfield": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + } + }, + "@material/mwc-textfield": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.15.0.tgz", + "integrity": "sha512-g3ncA1LQSPIVykllm/57Pyvuz1gUZj/BAKi8ia5T0wZWdvU96x4jCLK/2bUB9WDt2QWaQNap+1GI1MJ/mFekvA==", + "requires": { + "@material/floating-label": "=7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "=7.0.0-canary.d92d8c93e.0", + "@material/mwc-base": "^0.15.0", + "@material/mwc-floating-label": "^0.15.0", + "@material/mwc-icon": "^0.15.0", + "@material/mwc-line-ripple": "^0.15.0", + "@material/mwc-notched-outline": "^0.15.0", + "@material/shape": "=7.0.0-canary.d92d8c93e.0", + "@material/textfield": "=7.0.0-canary.d92d8c93e.0", + "@material/theme": "=7.0.0-canary.d92d8c93e.0", + "lit-element": "^2.3.0", + "lit-html": "^1.1.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/notched-outline": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-/SA0gd/P4wlUpW6owAbotXfY+zKaznJXQhvn1LllXahL6txxpSZ0fIuIncSym0HTowR8oGtKk5lnkFcG+BAOgQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/progress-indicator": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ibwqKAKd8xJqN2SceGo7fsjwdy7E2yjmP8V3ASUqUnK+MXepKoxdjfj+pXBAuCwNy8ehx1b4HzYq7LA20PKWKw==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/radio": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ldDuoAMGy0bDNmIiYIro/N4XdoFERgM+7sJ+eHSlXUvR9Tl/YDkkGHvjRmEcl9E2CwjI9Oa3tPlj5dkggIBMGA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/touch-target": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/ripple": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-6.0.0.tgz", + "integrity": "sha512-z+ARpjBVkRZBhiX20aAxAMrgBcfpcCRqIcI/E3Esfyo7M+q/mm8t92ZumcahxWnOBJkHM55kkpUqHlfkYlfyZQ==", + "requires": { + "@material/animation": "^6.0.0", + "@material/base": "^6.0.0", + "@material/dom": "^6.0.0", + "@material/feature-targeting": "^6.0.0", + "@material/theme": "^6.0.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-6.0.0.tgz", + "integrity": "sha512-/WkzlUm3qylWMqv7Lw7ColZ8DYvEvTXtevxxz7PKM1hT9FNlbO1/Qywvda4VUtXivEeynXEqeT1T/ZYHV9yDVw==" + }, + "@material/select": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-8rv3n8WvuMhkl7zkBJPfF3NOWvJiNFBEA26MuiPy5fMjSmavypYJtk1Dgu8zaQoEKzESoqYqUigjfDqSpyCX6Q==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "7.0.0-canary.d92d8c93e.0", + "@material/menu": "7.0.0-canary.d92d8c93e.0", + "@material/menu-surface": "7.0.0-canary.d92d8c93e.0", + "@material/notched-outline": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/shape": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-6.0.0.tgz", + "integrity": "sha512-tZT9GGWI3QcOtyfJ07Hc3noP2b5Bvx2npx/aj+k7gEIkE06mzr08dVnVOup8z8HbHWIenxRJgdeF5+lAfBE3vw==", + "requires": { + "@material/feature-targeting": "^6.0.0", + "@material/rtl": "^6.0.0" + } + }, + "@material/slider": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-oj+OcoGr1M4TQUNzAwBv56yKD0cHUvd/cxtGxjIuMCXby6fH1VrbY0FZu+t901Rtx6puEM9Tm2hkwvGRtmzs7w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/switch": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-wWgObFNBl5oSnUZ+I3jZydQFmuv+H1sgBwSxdDTw0MJG/snZYX5V8KastUbqyG/uzuXnAtUNnhHLlPEmLDW/QQ==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/elevation": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/elevation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-RFfhibqHUJ5u+YK08a6RiRtFTXk7R/cLCNsEZVAD7uKOCEvPzkmQuwEhx3vt0kfgGZK2m8P5i14mX/RXj0tkpg==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/tab-indicator": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab-bar": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-pTcN2N/bUEBgZdleJSMZFCoatUjZS5+c4XWwQmuy7bU01lL77nG7B9aVQbEXvQt+qPs/fPqqAaf5BqSvpt66Eg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/tab": "7.0.0-canary.d92d8c93e.0", + "@material/tab-scroller": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/tab-indicator": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-XHVPNFaruXVTfF2mymc6r0bZVxHe8P5x9SM9y+XIL3E6XnQVVi5REItzhum07Ag5AyfEiSr2giW1RpXk36tiAA==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/tab-scroller": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-RSUGprUXHe/8sIz8q7eA96xaWqcAa+adCIrcUQKQf1MOea6Ym5dwa6BBvH6wPoEtvr2dQTB4jRO9xEOlFsUiTg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/tab": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/textfield": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-z2BrgR/AVn4LqWVSpr/43oo3/w4Y2muX6c+lDf+z4Ve/DIJjJ3eUY6D4ABck5bVP6HzE9JWPWXyEAxb3olyzKg==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/density": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/floating-label": "7.0.0-canary.d92d8c93e.0", + "@material/line-ripple": "7.0.0-canary.d92d8c93e.0", + "@material/notched-outline": "7.0.0-canary.d92d8c93e.0", + "@material/ripple": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0", + "@material/shape": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "@material/typography": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "@material/animation": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/dom": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/ripple": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw==", + "requires": { + "@material/animation": "7.0.0-canary.d92d8c93e.0", + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/dom": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0", + "tslib": "^1.9.3" + } + }, + "@material/rtl": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ==" + }, + "@material/shape": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/rtl": "7.0.0-canary.d92d8c93e.0" + } + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@material/theme": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-6.0.0.tgz", + "integrity": "sha512-dViBx1lsidoQhVi/MYksTmDs8aUPj3mPVQIaBPtDRtqpIuWSwG7bCHoY8rG8FHRduPLpq3b1A4OwKHBd0RWVJw==", + "requires": { + "@material/feature-targeting": "^6.0.0" + } + }, + "@material/touch-target": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-md7J3xLYHej2k2yQy/T7SJRCf9nOKsn7J8ufWsamy6HvGXOCvZivFlf70eDbdz7wUQiG0H6kT5KywQtdP16uvQ==", + "requires": { + "@material/base": "7.0.0-canary.d92d8c93e.0", + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/base": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + } + } + }, + "@material/typography": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-R7oAH4hi8EASn3Vetl+ZYIZkYQ6Cq2zVEE5zb1Iy6ELtwEL63lcb2oXEkvnTTYrS/XkQA7o4bs/HUAM+ojWECA==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", + "@material/theme": "7.0.0-canary.d92d8c93e.0" + }, + "dependencies": { + "@material/feature-targeting": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA==" + }, + "@material/theme": { + "version": "7.0.0-canary.d92d8c93e.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz", + "integrity": "sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ==", + "requires": { + "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0" + } + } + } + }, + "@polymer/font-roboto": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz", + "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==" + }, + "@polymer/iron-flex-layout": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz", + "integrity": "sha512-7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==", + "requires": { + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/paper-styles": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.1.tgz", + "integrity": "sha512-y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g==", + "requires": { + "@polymer/font-roboto": "^3.0.1", + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/paper-tooltip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz", + "integrity": "sha512-yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==", + "requires": { + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, + "@polymer/polymer": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.4.1.tgz", + "integrity": "sha512-KPWnhDZibtqKrUz7enIPOiO4ZQoJNOuLwqrhV2MXzIt3VVnUVJVG5ORz4Z2sgO+UZ+/UZnPD0jqY+jmw/+a9mQ==", + "requires": { + "@webcomponents/shadycss": "^1.9.1" + } + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" }, + "@types/canvas-confetti": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.0.0.tgz", + "integrity": "sha512-Z3Eh7qlYdi9cvotmreZjqxaUSwpUYu/s2uzSvnGgktuHhpj8FHq6JSJLVYP3R4YNZN/d8nNOG5y2cKmautyDCQ==" + }, "@types/chrome": { - "version": "0.0.106", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.106.tgz", - "integrity": "sha512-sCQa+QJL/Kl+6ngU4xD1VjTFIkQDizOHN94zbb7byK9D3U79x/KXjqXyS7lHoa2q9xw3bWePb+giLhBKOILRuA==", + "version": "0.0.107", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.107.tgz", + "integrity": "sha512-7z/4YkJu4B8ROxZhbzIx5olbRJqzoDdAoMhSzcJlElsZzv2eTxsvxNkN/QFq0ClbAFNkFf07XVoTrWFHD12QyA==", "requires": { "@types/filesystem": "*", "@types/har-format": "*" @@ -96,9 +2233,9 @@ "integrity": "sha512-iUxzm1meBm3stxUMzRqgOVHjj4Kgpgu5w9fm4X7kPRfSgVRzythsucEN7/jtOo8SQzm+HfcxWWzJS0mJDH/3DQ==" }, "@types/html-minifier-terser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz", - "integrity": "sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==" }, "@types/minimatch": { "version": "3.0.3", @@ -106,9 +2243,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" }, "@types/q": { "version": "1.5.2", @@ -313,6 +2450,11 @@ "@xtuc/long": "4.2.2" } }, + "@webcomponents/shadycss": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.6.tgz", + "integrity": "sha512-5fFjvP0jQJZoXK6YzYeYcIDGJ5oEsdjr1L9VaYLw5yxNd4aRz4srMpwCwldeNG0A6Hvr9igbG7fCsBeiiCXd7A==" + }, "@webcomponents/webcomponentsjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.3.tgz", @@ -328,11 +2470,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -343,9 +2480,58 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } }, "aggregate-error": { "version": "3.0.1", @@ -380,11 +2566,6 @@ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -443,15 +2624,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -460,6 +2632,11 @@ "sprintf-js": "~1.0.2" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -475,11 +2652,6 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -519,30 +2691,21 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "requires": { - "object-assign": "^4.1.1", "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } } }, "assert-plus": { @@ -568,11 +2731,6 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1368,52 +3526,6 @@ "request-promise": "^4.2.4", "tar": "^4.4.10", "unzip-stream": "^0.3.0" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" } }, "bluebird": { @@ -1422,9 +3534,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==" }, "body-parser": { "version": "1.19.0", @@ -1555,20 +3667,40 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.1.0.tgz", + "integrity": "sha512-VYxo7cDCeYUoBZ0ZCy4UyEUCP3smyBd4DRQM5nrFS1jJjPJjX7rP3oLRpPoWfkhQfyJ0I9ZbHbKafrFD/SGlrg==", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "browserify-zlib": { @@ -1721,22 +3853,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -1749,9 +3865,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001048", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", - "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==" + "version": "1.0.30001055", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz", + "integrity": "sha512-MbwsBmKrBSKIWldfdIagO5OJWZclpJtS4h0Jrk/4HFrXJxTdVdH23Fd+xCiHriVGvYcWyW8mR/CPsYajlH8Iuw==" + }, + "canvas-confetti": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.2.0.tgz", + "integrity": "sha512-0B49O9CfLciAYz4hriu9pvWNGkCtVcpvyNFKWZI+JVWJM5nJTMg5MX3cFzatyeYcOL6bR1Jw3yhZKbgt03O8/Q==" }, "caseless": { "version": "0.12.0", @@ -1880,6 +4001,16 @@ "wrap-ansi": "^2.0.0" } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -1890,6 +4021,33 @@ "shallow-clone": "^3.0.0" } }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "closure-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/closure-webpack-plugin/-/closure-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-QW1V0oZPtrjSjGx6TkegvUlVSFzSzEWN8pXeckEti4WdkO+P+WWEGSkB4slTIf1kO9KFFWoi8yl6fZd03GPjqA==", + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "schema-utils": "1.x", + "unquoted-property-validator": "^1.0.2", + "webpack-sources": "1.x" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1973,6 +4131,14 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2006,6 +4172,28 @@ "schema-utils": "^2.6.1", "serialize-javascript": "^2.1.2", "webpack-sources": "^1.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } } }, "concat-map": { @@ -2034,11 +4222,6 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2121,6 +4304,13 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "create-hash": { @@ -2185,6 +4375,17 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -2261,6 +4462,28 @@ "postcss-value-parser": "^4.0.3", "schema-utils": "^2.6.6", "semver": "^6.3.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } } }, "css-prefers-color-scheme": { @@ -2406,19 +4629,20 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2427,15 +4651,6 @@ "assert-plus": "^1.0.0" } }, - "deasync": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.20.tgz", - "integrity": "sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ==", - "requires": { - "bindings": "^1.5.0", - "node-addon-api": "^1.7.1" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2577,11 +4792,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2614,6 +4824,11 @@ "repeating": "^2.0.0" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", @@ -2627,6 +4842,13 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "dns-equal": { @@ -2752,9 +4974,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.427", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", - "integrity": "sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A==" + "version": "1.3.432", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.432.tgz", + "integrity": "sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw==" }, "elliptic": { "version": "6.5.2", @@ -2768,6 +4990,13 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "elm": { @@ -2844,9 +5073,9 @@ } }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz", + "integrity": "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==" }, "errno": { "version": "0.1.7", @@ -2892,6 +5121,35 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2940,9 +5198,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.1.tgz", + "integrity": "sha512-MnI0l35oYL2C/c80rjJN7qu50MDx39yYE7y7oYck2YA3v+y7EaAenY8IU8AP4d1RWqE8VAKWFGSh3rfP87ll3g==" }, "events": { "version": "3.1.0", @@ -2967,9 +5225,9 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", "requires": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -3109,6 +5367,21 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3229,6 +5502,14 @@ "websocket-driver": ">=0.5.1" } }, + "fibers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", + "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==", + "requires": { + "detect-libc": "^1.0.3" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -3243,6 +5524,17 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -3260,6 +5552,15 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -3455,60 +5756,16 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==" - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "^1.0.0" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -3618,16 +5875,36 @@ } } }, - "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "google-closure-compiler": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20200504.0.0.tgz", + "integrity": "sha512-No343xYZ/d5+f7VPBm1Vy6TjcUSpP3b0VYe3lww5M5bonEnyF6jwCuGhYfwtpCnM92ZSVcLqbJJA8SDf5DvSZA==", "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.12", - "minimatch": "~3.0.2" + "chalk": "2.x", + "google-closure-compiler-java": "^20200504.0.0", + "google-closure-compiler-js": "^20200504.0.0", + "google-closure-compiler-linux": "^20200504.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" } }, + "google-closure-compiler-java": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20200504.0.0.tgz", + "integrity": "sha512-7E5rg8dAfpzeTsGuWpwW/ZILVoItFAw4I9AjutY3ujZIadUnlQ6hKHasyvXCB2y1Vzlvf/vsbyjoNvPPZ6IeNA==" + }, + "google-closure-compiler-js": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20200504.0.0.tgz", + "integrity": "sha512-+03QX239BszaF/tpBYOT5JLR2yAwRoy5ObmwI1zeq9gq+zveD8w7mISWMY+I/3HYef7blN+aMKi78ulE3Mnyww==" + }, + "google-closure-compiler-linux": { + "version": "20200504.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20200504.0.0.tgz", + "integrity": "sha512-DljGPGILaebP6XdykflPwzwYrpi3lamfIx7FNjjhqM0ukHOBUyRfEW8E87sjSwCgvQFHqUn3CB39JhLEcf15UA==", + "optional": true + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -3691,11 +5968,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3746,9 +6018,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -3846,6 +6118,17 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -3863,6 +6146,15 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -3931,9 +6223,9 @@ "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" }, "domutils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz", - "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.1.0.tgz", + "integrity": "sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==", "requires": { "dom-serializer": "^0.2.1", "domelementtype": "^2.0.1", @@ -3966,11 +6258,6 @@ } } }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, "http-proxy": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", @@ -4117,11 +6404,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" - }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -4470,9 +6752,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" @@ -4493,11 +6775,6 @@ } } }, - "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4710,15 +6987,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "lower-case": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", @@ -4763,11 +7031,6 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -4815,23 +7078,6 @@ "readable-stream": "^2.0.1" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4874,6 +7120,13 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "mime": { @@ -4899,11 +7152,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "mini-svg-data-uri": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.1.3.tgz", - "integrity": "sha512-EeKOmdzekjdPe53/GdxmUpNgDQFkNeSte6XkJmOBt4BfWL6FQ9G9RtLNh+JMjFS3LhdpSICMIkZdznjiecASHQ==" - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -5105,6 +7353,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5119,11 +7372,6 @@ "tslib": "^1.10.0" } }, - "node-addon-api": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz", - "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==" - }, "node-elm-compiler": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz", @@ -5140,32 +7388,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -5196,96 +7418,30 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } } } }, "node-releases": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", - "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" - }, - "node-sass": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", - "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.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" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } + "version": "1.1.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", + "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==" }, "normalize-package-data": { "version": "2.5.0", @@ -5341,17 +7497,6 @@ } } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -5432,6 +7577,11 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -5552,15 +7702,6 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -5874,9 +8015,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.28.tgz", - "integrity": "sha512-YU6nVhyWIsVtlNlnAj1fHTsUKW5qxm3KEgzq2Jj6KTEFOTK8QWR12eIDvrlWhiSTK8WIBFTBhOJV4DY6dUuEbw==", + "version": "7.0.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.29.tgz", + "integrity": "sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -6209,29 +8350,6 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "postcss-logical": { @@ -6852,11 +8970,6 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -6873,6 +8986,13 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } } }, "pump": { @@ -7061,25 +9181,6 @@ "readable-stream": "^2.0.2" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - } - } - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -7109,6 +9210,11 @@ "safe-regex": "^1.1.0" } }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -7251,6 +9357,11 @@ "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -7359,6 +9470,58 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -7369,6 +9532,27 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -7422,136 +9606,12 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "sass": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "sass-inline-svg": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/sass-inline-svg/-/sass-inline-svg-1.2.3.tgz", - "integrity": "sha512-IyWanH7PGTVbiR3uSHEhdEL+dH1u7ptdbfiv57ahcDaBFXdHh8YlHt++6ZqxtU3zW9Cw97JJLSbyz+l/qQt9IQ==", - "requires": { - "css-select": "^1.2.0", - "deasync": "^0.1.7", - "dom-serializer": "^0.1.0", - "htmlparser2": "^3.9.0", - "mini-svg-data-uri": "^1.0.0", - "object-assign": "^4.0.1", - "svgo": "^1.3.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { @@ -7564,20 +9624,6 @@ "neo-async": "^2.6.1", "schema-utils": "^2.6.1", "semver": "^6.3.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" }, "dependencies": { "ajv": { @@ -7590,24 +9636,42 @@ "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "requires": { - "amdefine": ">=0.0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } } } @@ -7912,12 +9976,13 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" } }, "sockjs-client": { @@ -8166,14 +10231,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "requires": { - "readable-stream": "^2.0.1" - } - }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -8301,14 +10358,6 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, "style-loader": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", @@ -8318,6 +10367,17 @@ "schema-utils": "^2.6.6" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -8335,6 +10395,15 @@ "emojis-list": "^3.0.0", "json5": "^2.1.2" } + }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } } } }, @@ -8394,13 +10463,41 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "temp": { @@ -8448,13 +10545,13 @@ } }, "terser-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-gHAVFtJz1gQW5cu0btPtb+5Syo7K9hRj3b0lstgfglaBhbtcOCizsaPTnxOBGmF9iIgwsrSIiraBa2xzuWND7Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", "requires": { "cacache": "^15.0.3", "find-cache-dir": "^3.3.1", - "jest-worker": "^25.5.0", + "jest-worker": "^26.0.0", "p-limit": "^2.3.0", "schema-utils": "^2.6.6", "serialize-javascript": "^3.0.0", @@ -8463,6 +10560,17 @@ "webpack-sources": "^1.4.3" }, "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "cacache": { "version": "15.0.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", @@ -8522,6 +10630,15 @@ "glob": "^7.1.3" } }, + "schema-utils": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, "serialize-javascript": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", @@ -8644,28 +10761,15 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "requires": { - "glob": "^7.1.2" - } - }, "ts-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.2.tgz", - "integrity": "sha512-DwpZFB67RoILQHx42dMjSgv2STpacsQu5X+GD/H9ocd8IhU0m8p3b/ZrIln2KmcucC6xep2PdEMEblpWT71euA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.3.tgz", + "integrity": "sha512-BXAHfPjm3J//20ibuI30M+xgLpdIng68p2H952QqbbmDk7SW72HV42k9Gop7rMxuHvrXWjazWhKuyr9D9kKe3A==", "requires": { "chalk": "^2.3.0", "enhanced-resolve": "^4.0.0", @@ -8715,9 +10819,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tty-browserify": { "version": "0.0.0", @@ -8737,6 +10841,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-fest": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", @@ -8761,155 +10870,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, - "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", - "requires": { - "commander": "~2.20.3" - } - }, - "uglifyjs-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "uglify-js": "^3.6.0", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.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==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - } - } - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -8957,6 +10917,11 @@ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" }, + "unquoted-property-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unquoted-property-validator/-/unquoted-property-validator-1.1.0.tgz", + "integrity": "sha512-ZWeQoYZ7HN8DCLeaowNv2GvZIXqJptKB1uUWd08ZYc1qAmJt8tXh9nck26aoYmhJtE3jCjDqdqEfUTqcJ0R7bw==" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -9051,17 +11016,17 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { - "inherits": "2.0.3" + "inherits": "2.0.1" }, "dependencies": { "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" } } }, @@ -9130,6 +11095,34 @@ "extsprintf": "^1.2.0" } }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -9183,6 +11176,11 @@ "webpack-sources": "^1.4.1" }, "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -9282,16 +11280,6 @@ "find-up": "^3.0.0" } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -9602,9 +11590,9 @@ } }, "webpack-dev-server": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", - "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -9614,65 +11602,54 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -9685,20 +11662,6 @@ "ms": "^2.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -9707,18 +11670,10 @@ "locate-path": "^3.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "is-absolute-url": { "version": "3.0.3", @@ -9730,19 +11685,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -9757,24 +11699,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -9788,31 +11712,27 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" }, "dependencies": { "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -9830,6 +11750,26 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -9838,29 +11778,32 @@ "async-limiter": "~1.0.0" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -9887,12 +11830,10 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -9901,16 +11842,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, - "weightless": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/weightless/-/weightless-0.0.37.tgz", - "integrity": "sha512-WxzpPc2VlD/PFWwOxMhQ6dPOmM4ugepXn6D8Qo7vUNSWWRIANqBvkQlo4TsjYiEpM4rAXCBGvkwMpfpxad14mA==", - "requires": { - "@a11y/focus-trap": "~1.0.4", - "lit-element": "^2.2.1", - "lit-html": "^1.1.2" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -9924,14 +11855,6 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -10046,8 +11969,8 @@ "http-status-codes": "^1.3.2", "json5": "^2.1.3", "jsonwebtoken": "^8.5.1", - "moment": "^2.24.0", - "pg": "^8.0.3", + "moment": "^2.25.3", + "pg": "^8.1.0", "rfc6902": "^3.0.4", "source-map-support": "^0.5.19", "uuid": "^8.0.0", @@ -10078,169 +12001,6 @@ "js-tokens": "^4.0.0" } }, - "@material/animation": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-UNdA/ndQYssWv6jOqAHXL4QaeI3OfC3j/bGikFsJ17nrSoo10G3d8wQSebw+ZS2wqsXp6jOu0iMDId6acZoO5w==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/base": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-QE3rF3KP9HJet8Jpok9eFWK1F2n3JJKhP0qyjR+n1llgcoBtEIGShA8+wkixeCUS8rVgpWRNyppuqg8lft/WeQ==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/button": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-iPQlUT+ku4q2KWeMp+IQEp+ejVQY1dKubblLwi6yfOdhlTkPvnf983LD+Iols3OeFELzEYsPOiV8/Iv9O09ZaA==", - "requires": { - "@material/density": "6.0.0-canary.35a32aaea.0", - "@material/elevation": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/ripple": "6.0.0-canary.35a32aaea.0", - "@material/rtl": "6.0.0-canary.35a32aaea.0", - "@material/shape": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0", - "@material/touch-target": "6.0.0-canary.35a32aaea.0", - "@material/typography": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/density": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-r5g1abpF1qOWhSawbv6K7PfqYsGkb4zH+EEB4Cu4B8ztwCJermz1mgMF5GftvSHBovv5zLnHLu7/kVrE/VbL7g==" - }, - "@material/dom": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-QoOQhYwZZ0F+tE7Mci92p8zY4iDsDZxIHZgO191o0zEdGROM6vTB3VupUwBn+5IdSKzblvxNsO6BblfMNmYpsw==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/elevation": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-kyzt3apFhgnf204Fr8BoRadEeTw3YXtUbTpUDGN13B3xeaNaB39DfrxK9QKbXnkTY54r9jcHTd/h9SsGM814uw==", - "requires": { - "@material/animation": "6.0.0-canary.35a32aaea.0", - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/feature-targeting": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-qJbELPsZZ7D+SlRpz7LCpc3SKzsbE8a11PB8/RlpKqTk2h5+n+efy2J7Et2V2hJxwtR91D4JSN31tmNtxchMGA==" - }, - "@material/mwc-base": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.14.1.tgz", - "integrity": "sha512-9EHP5Q2tQntiu6K92mn5G5gakmcuituHmz0NPvzAW34RnrMV81UevwfLLZwUiy51pm52hd5/viLXVt/WlL6bDg==", - "requires": { - "@material/base": "=6.0.0-canary.35a32aaea.0", - "@material/dom": "=6.0.0-canary.35a32aaea.0", - "@material/ripple": "=6.0.0-canary.35a32aaea.0", - "lit-element": "^2.3.0", - "tslib": "^1.10.0" - } - }, - "@material/mwc-button": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.14.1.tgz", - "integrity": "sha512-yXJDWsg1fdVp0afbLvtf7VbeWNhePlzK5oYZIaFzP7dmCWW8GvLK+04h/7mYMMSZeRTCcNJuRlM3Yi0S8P2YEQ==", - "requires": { - "@material/button": "=6.0.0-canary.35a32aaea.0", - "@material/mwc-base": "^0.14.1", - "@material/mwc-icon": "^0.14.1", - "@material/mwc-ripple": "^0.14.1", - "lit-element": "^2.3.0", - "lit-html": "^1.1.2", - "tslib": "^1.10.0" - } - }, - "@material/mwc-icon": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.14.1.tgz", - "integrity": "sha512-vjhmww/v2M4YVuPq5NhzoxyMBuJi1+CEKnfgdptqP2VT3oxjZKggQYqm/TlTTzHcRxOxhqmbcgfji7qosnzgfw==", - "requires": { - "@material/mwc-base": "^0.14.1", - "lit-element": "^2.3.0", - "tslib": "^1.10.0" - } - }, - "@material/mwc-ripple": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.14.1.tgz", - "integrity": "sha512-UdGdkT4IlkQ7myWSeOj1RqXvneyrkjdBTXW0iswFySRRkbJ9f+g1771acKASdRG0fx7GvrWj6RPcBZzD5S9SmQ==", - "requires": { - "@material/dom": "=6.0.0-canary.35a32aaea.0", - "@material/mwc-base": "^0.14.1", - "@material/ripple": "=6.0.0-canary.35a32aaea.0", - "lit-element": "^2.3.0", - "lit-html": "^1.1.2", - "tslib": "^1.10.0" - } - }, - "@material/ripple": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-0ZogedoMGKgBZQ8pbHNb6gudWu6KjIRRP8kEJYT8h4EIUUVC6NypHwJVBz7l+UzHPaXVUWdSQnQclHmtP7LuYg==", - "requires": { - "@material/animation": "6.0.0-canary.35a32aaea.0", - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/dom": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0", - "tslib": "^1.9.3" - } - }, - "@material/rtl": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-G/xg1hIxLXb6+EA4Pb9TCkYsmxJRzrRhD7PoGb1SH/stLfyx6V8zyvWi9Te8VKCesZ9HZisB7VmN9+aI0NZnkQ==" - }, - "@material/shape": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-4QN2Ura9Z3sdYwbnqGDaz+Cqq97skkdf+K10Ps6HH4j1sAmiwALDWO15llIHlLNSNKHcrrQwJeIei+q6rPdzXw==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/rtl": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/theme": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-DXz4aBBWiI4F9R/LA2/SlP/faX7gQboPE4zMqHUFRX8pRotMRUwPUFMPDsNI4wUcHRTvL5TtN1CRT/BvEXFoTQ==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/touch-target": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-yIpuA4koRLwhohKjXmvImLquV+uPK2+1/VnBObZFOw+Bbusm5VUBDS/9TTwZSKA5ze9hHnJpY0SICypz6poENQ==", - "requires": { - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/typography": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-cK/gPHvEOLMwUd8Y5Q8RW6ubObPhmEaTQ6bnE42dWLJu/CR42yMJyjNVYYVwWrclH56+wB613bGwvSnFueMD3w==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0" - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -10314,11 +12074,12 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz", - "integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", + "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", "requires": { "@types/node": "*", + "@types/qs": "*", "@types/range-parser": "*" } }, @@ -10408,9 +12169,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" }, "@types/pg": { "version": "7.14.3", @@ -10427,9 +12188,9 @@ "integrity": "sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ==" }, "@types/qs": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz", - "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==" + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.2.tgz", + "integrity": "sha512-a9bDi4Z3zCZf4Lv1X/vwnvbbDYSNz59h3i3KdyuYYN+YrLjSeJD0dnphdULDfySvUv6Exy/O0K6wX/kQpnPQ+A==" }, "@types/range-parser": { "version": "1.2.3", @@ -10472,42 +12233,42 @@ "integrity": "sha512-c9F5iHE1b7QF7v+/ur/orN1gkphE363aPwLA5SZxpeSma6FJq4NpMwwLgcByVIdyF6wOgVTe9kM2nWRtKVzT0A==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", - "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", + "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", "requires": { - "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", - "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", - "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", + "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.30.0", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", - "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", @@ -10553,9 +12314,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==" }, "acorn-jsx": { "version": "5.2.0", @@ -10581,6 +12342,11 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -10600,6 +12366,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -10925,6 +12699,11 @@ "wrap-ansi": "^5.1.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -10944,6 +12723,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -11057,15 +12844,13 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -11230,21 +13015,21 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.0.0.tgz", + "integrity": "sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==", "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "espree": "^7.0.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -11257,22 +13042,52 @@ "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", + "levn": "^0.4.1", "lodash": "^4.17.14", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -11281,28 +13096,28 @@ "ms": "^2.1.1" } }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -11345,9 +13160,9 @@ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", "requires": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -11932,14 +13747,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -12166,27 +13973,14 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "lit-element": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.3.1.tgz", - "integrity": "sha512-tOcUAmeO3BzwiQ7FGWdsshNvC0HVHcTFYw/TLIImmKwXYoV0E7zCBASa8IJ7DiP4cen/Yoj454gS0qqTnIGsFA==", - "requires": { - "lit-html": "^1.1.1" - } - }, - "lit-html": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.2.1.tgz", - "integrity": "sha512-GSJHHXMGLZDzTRq59IUfL9FCdAlGfqNp/dEa7k7aBaaWD+JKaCjsAk9KYm2V12ItonVaYx2dprN66Zdm1AuBTQ==" - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -12340,9 +14134,9 @@ } }, "moment": { - "version": "2.25.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.1.tgz", - "integrity": "sha512-nRKMf9wDS4Fkyd0C9LXh2FFXinD+iwbJ5p/lh3CHitW9kZbRbJ8hCruiadiIXZVbeAqKZzqcTvHnK3mRhFjb6w==" + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", + "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" }, "ms": { "version": "2.0.0", @@ -12454,16 +14248,16 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "os-tmpdir": { @@ -12544,9 +14338,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.6", @@ -12559,14 +14353,14 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "pg": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.3.tgz", - "integrity": "sha512-fvcNXn4o/iq4jKq15Ix/e58q3jPSmzOp6/8C3CaHoSR/bsxdg+1FXfDRePdtE/zBb3++TytvOrS1hNef3WC/Kg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.1.0.tgz", + "integrity": "sha512-Jp+XSNTGYDztc2FgIbmBXeeYMR7kKjfgnl3R+ioO6rkcxDmaea+YPp/gaxe13PBnJAFYyEGl0ixpwPm2gb6eUw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-pool": "^3.1.1", + "pg-connection-string": "^2.2.2", + "pg-pool": "^3.2.0", "pg-protocol": "^1.2.2", "pg-types": "^2.1.0", "pgpass": "1.x", @@ -12581,9 +14375,9 @@ } }, "pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.2.2.tgz", + "integrity": "sha512-+hel4DGuSZCjCZwglAuyi+XlodHnKmrbyTw0hVWlmGN2o4AfJDkDo5obAFzblS5M5PFBMx0uDt5Y1QjlNC+tqg==" }, "pg-int8": { "version": "1.0.1", @@ -12591,9 +14385,9 @@ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, "pg-pool": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.1.1.tgz", - "integrity": "sha512-kYH6S0mcZF1TPg1F9boFee2JlCSm2oqnlR2Mz2Wgn1psQbEBNVeNTJCw2wCK48QsctwvGUzbxLMg/lYV6hL/3A==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.0.tgz", + "integrity": "sha512-7BLwDNDEfPFjE9vmZLcJPLFwuDAVGZ5lIZo2MeQfwYG7EPGfdNVis/dz6obI/yKqvQIx2sf6QBKXMLB+y/ftgA==" }, "pg-protocol": { "version": "1.2.2", @@ -12649,9 +14443,9 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "prepend-http": { "version": "2.0.0", @@ -12960,17 +14754,17 @@ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "signal-exit": { "version": "3.0.3", @@ -13047,16 +14841,6 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "string_decoder": { @@ -13068,25 +14852,18 @@ }, "dependencies": { "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -13118,6 +14895,11 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -13137,6 +14919,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -13211,9 +15001,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tsutils": { "version": "3.17.1", @@ -13224,11 +15014,11 @@ } }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { @@ -13286,6 +15076,46 @@ "tsconfig-loader": "^1.1.0", "typescript-json-schema": "^0.38.3", "yargs": "^13.2.4" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } } }, "undefsafe": { @@ -13427,9 +15257,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -13511,6 +15341,11 @@ "strip-ansi": "^5.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -13530,6 +15365,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -13607,6 +15450,11 @@ "yargs-parser": "^13.1.2" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -13626,6 +15474,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, diff --git a/server/config.json5 b/server/config.json5 index d207f44..f543af4 100644 --- a/server/config.json5 +++ b/server/config.json5 @@ -29,10 +29,7 @@ // Ids for decks in the order they will be presented to the user. // The game will look for these in the directory given by basePath above, and will expect them to have the // .deck.json5 extension. - decks: [ - "cah-base-en", - "cah-base-ptbr" - ] + decks: ["cah-base-en", "cah-base-ptbr"], }, // Allows players to load decks from Cardcast via their API. https://www.cardcastgame.com/ @@ -44,8 +41,8 @@ // The number of connections the server can make to Cardcast at one time. // Please remember this is a service provided by Cardcast, and you should make best efforts to ensure you don't // hit them too hard, including not setting this too high. - simultaneousConnections: 1 - } + simultaneousConnections: 1, + }, }, // Timeouts determine how long the server waits before taking certain actions. @@ -62,7 +59,7 @@ // How long to wait after everyone has played to begin the revealing phase. Having this as a non-zero value lets // the last person playing - finishedPlayingDelay: "PT2S" + finishedPlayingDelay: "PT2S", }, // Tasks are things that take some time to happen (e.g: requesting data from external card services). @@ -73,7 +70,7 @@ rateLimit: 20, // How often to process queued tasks. Setting this too high will result in games being slowed down a lot when the // rate limit is hit (an ISO 8601 duration). - processTickFrequency: "PT0.5S" + processTickFrequency: "PT0.5S", }, // How to store game data. @@ -92,10 +89,10 @@ // keepAlive: false, // }, - // How long to allow without any activity before garbage collecting the game. + // How long to allow without any activity before garbage collecting the game (an ISO 8601 duration). abandonedTime: "PT15M", // How often to delete abandoned/finished games (an ISO 8601 duration). - garbageCollectionFrequency: "PT5M" + garbageCollectionFrequency: "PT5M", }, // How to cache game data. @@ -115,7 +112,7 @@ // }, // How old a cached value should be before we check to see if we should update it on a hit. - checkAfter: "PT5M" + checkAfter: "PT5M", }, // A file to touch when the server is started. If null, we won't touch any files. @@ -123,6 +120,6 @@ // This will be overwritten by the environment variable MD_TOUCH_ON_START, if set. // The version of Massive Decks. - version: "dev" + version: "dev", // This will be overwritten by the environment variable MD_VERSION, if set. } diff --git a/server/decks/cah-base-en.deck.json5 b/server/decks/cah-base-en.deck.json5 index 7ab99f3..f20a069 100644 --- a/server/decks/cah-base-en.deck.json5 +++ b/server/decks/cah-base-en.deck.json5 @@ -2,47 +2,33 @@ // Used under a Creative Commons BY-NC-SA 2.0 license, https://creativecommons.org/licenses/by-nc-sa/2.0/ { name: "Cards Against Humanity", - "calls": [ + language: "en", + author: "Cards Against Humanity", + calls: [ [ [ "Hey Reddit! I’m ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Ask me anything." - ] + ["Ask me anything."], ], [ - [ - "Introducing X-treme Baseball!" - ], - [ - "It’s like baseball, but with ", - {}, - "!" - ] + ["Introducing X-treme Baseball!"], + ["It’s like baseball, but with ", {}, "!"], ], [ - [ - "What is Batman’s guilty pleasure?" - ], + ["What is Batman’s guilty pleasure?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "TSA guidelines now prohibit ", - {}, - " on airplanes." - ] + ".", + ], ], + [["TSA guidelines now prohibit ", {}, " on airplanes."]], [ [ "Next from J.K. Rowling: ", @@ -51,357 +37,255 @@ style: "Em", }, { - "transform": "Capitalize", - "style": "Em", + transform: "Capitalize", + style: "Em", }, - "." - ] + ".", + ], ], [ - [ - "That’s right, I killed ", - {}, - "." - ], - [ - "How, you ask?" - ], + ["That’s right, I killed ", {}, "."], + ["How, you ask?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "I’m sorry professor, but I couldn’t complete my homework because of ", {}, - "." - ] - ], - [ - [ - "And the Academy Award for ", - {}, - " goes to ", - {}, - "." - ] - ], - [ - [ - "Dude, do not go in that bathroom." + ".", ], - [ - "There’s ", - {}, - " in there." - ] ], + [["And the Academy Award for ", {}, " goes to ", {}, "."]], + [["Dude, do not go in that bathroom."], ["There’s ", {}, " in there."]], [ - [ - "How did I lose my virginity?" - ], + ["How did I lose my virginity?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "It’s a pity that kids these days are all getting involved with ", {}, - "." - ] + ".", + ], ], [ [ "Step 1: ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], [ "Step 2: ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Step 3: Profit." - ] + ["Step 3: Profit."], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Becha can’t have just one!" - ] - ], - [ - [ - "Kids, I don’t need drugs to get high. I’m high on ", - {}, - "." - ] - ], - [ - [ - "For my next trick, I will pull ", - {}, - " out of ", - {}, - "." - ] + ["Becha can’t have just one!"], ], + [["Kids, I don’t need drugs to get high. I’m high on ", {}, "."]], + [["For my next trick, I will pull ", {}, " out of ", {}, "."]], [ [ "While the United States raced the Soviet Union to the moon, the Mexican government funneled millions of pesos into research on ", {}, - "." - ] + ".", + ], ], [ [ "In the new Disney Channel Original Movie, Hannah Montana struggles with ", {}, - " for the first time." - ] + " for the first time.", + ], ], [ - [ - "What’s my secret power?" - ], + ["What’s my secret power?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "I’m going on a cleanse this week. Nothing but kale juice and ", {}, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, " + ", { - "transform": "Capitalize" - } + transform: "Capitalize", + }, ], [ " = ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "When Pharaoh remained unmoved, Moses called down a Plague of ", {}, - "." - ] + ".", + ], ], [ [ "Just once, I’d like to hear you say “Thanks, Mom. Thanks for ", {}, - ".”" - ] + ".”", + ], ], [ - [ - "Daddy, why is mommy crying?" - ], + ["Daddy, why is mommy crying?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "When I was tripping on acid, ", - {}, - " turned into ", - {}, - "." - ] - ], - [ - [ - "50% of all marriages end in ", - {}, - "." - ] + ".", + ], ], + [["When I was tripping on acid, ", {}, " turned into ", {}, "."]], + [["50% of all marriages end in ", {}, "."]], [ [ "My fellow Americans: Before this decade is out, we ", { text: "will", - style: "Em" + style: "Em", }, ", have ", {}, - " on the moon." - ] + " on the moon.", + ], ], [ [ "This season at Steppenwolf, Samuel Beckett’s classic existential play: ", { text: "Waiting for", - style: "Em" + style: "Em", }, { - style: "Em" + style: "Em", }, - "." - ] - ], - [ - [ - "Instead of coal, Santa now gives the bad children ", - {}, - "." - ] + ".", + ], ], + [["Instead of coal, Santa now gives the bad children ", {}, "."]], [ [ "Life for American Indians was forever changed when the White Man introduced them to ", {}, - "." - ] + ".", + ], ], [ [ - "What’s Teach for America using to inspire inner city students to succeed?" + "What’s Teach for America using to inspire inner city students to succeed?", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Maybe she’s born with it." + ".", ], - [ - "Maybe it’s ", - {}, - "." - ] ], + [["Maybe she’s born with it."], ["Maybe it’s ", {}, "."]], [ - [ - "What is George W. Bush thinking about right now?" - ], + ["What is George W. Bush thinking about right now?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "White people like ", - {}, - "." - ] + ".", + ], ], + [["White people like ", {}, "."]], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, " is a slippery slope that leads to ", {}, - "." - ] + ".", + ], ], [ - [ - "Why do I hurt all over?" - ], + ["Why do I hurt all over?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "A romantic, candlelit dinner would be incomplete without ", - {}, - "." - ] - ], - [ - [ - "Just saw this upsetting video! Please retweet!!" + ".", ], + ], + [["A romantic, candlelit dinner would be incomplete without ", {}, "."]], + [ + ["Just saw this upsetting video! Please retweet!!"], [ "#stop", { - "transform": "Capitalize" - } - ] + transform: "Capitalize", + }, + ], ], [ [ "Fun tip! When your man asks you to go down on him, try surprising him with ", {}, - " instead." - ] - ], - [ - [ - "The class field trip was completely ruined by ", - {}, - "." - ] - ], - [ - [ - "What’s a girl’s best friend?" + " instead.", ], + ], + [["The class field trip was completely ruined by ", {}, "."]], + [ + ["What’s a girl’s best friend?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Dear Abby, I’m having some trouble with ", {}, - " and would like your advice." - ] + " and would like your advice.", + ], ], [ [ @@ -409,229 +293,183 @@ {}, " had really been ", {}, - " all along." - ] + " all along.", + ], ], [ [ "When I am President of the United States, I will create the Department of ", {}, - "." - ] + ".", + ], ], [ - [ - "What are my parents hiding from me?" - ], + ["What are my parents hiding from me?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "What never fails to liven up the party?" - ], + ["What never fails to liven up the party?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "IF you like ", { - "transform": "UpperCase" + transform: "UpperCase", }, - "," + ",", ], - [ - "YOU MIGHT BE A REDNECK." - ] + ["YOU MIGHT BE A REDNECK."], ], [ + ["Make a haiku."], [ - "Make a haiku." + { + transform: "Capitalize", + }, + ",", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "," + ",", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "," + ".", ], - [ - { - "transform": "Capitalize" - }, - "." - ] ], [ - [ - "What made my first kiss so awkward?" - ], + ["What made my first kiss so awkward?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Hey guys, welcome to Chili’s! Would you like to start the night off right with ", {}, - "?" - ] - ], - [ - [ - "I got 99 problems but ", - {}, - " ain’t one." - ] + "?", + ], ], + [["I got 99 problems but ", {}, " ain’t one."]], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "It’s a trap!" - ] + ["It’s a trap!"], ], [ [ "Bravo’s new reality show features eight washed-up celebrities living with ", {}, - "." - ] + ".", + ], ], [ - [ - "What would grandma find disturbing, yet oddly charming?" - ], + ["What would grandma find disturbing, yet oddly charming?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "That was so metal." - ] + ["That was so metal."], ], + [["I never truly understood ", {}, " until I encountered ", {}, "."]], + [["During sex, I like to think about ", {}, "."]], [ - [ - "I never truly understood ", - {}, - " until I encountered ", - {}, - "." - ] - ], - [ - [ - "During sex, I like to think about ", - {}, - "." - ] - ], - [ - [ - "What ended my last relationship?" - ], + ["What ended my last relationship?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "What’s that sound?" - ], + ["What’s that sound?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Uh, hey guys, I know this was my idea, but I’m having serious doubts about ", {}, - "." - ] + ".", + ], ], [ - [ - "Why am I sticky?" - ], + ["Why am I sticky?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "I’m no doctor but I’m pretty sure what you’re suffering from is called “", {}, - ".”" - ] + ".”", + ], ], [ - [ - "What’s there a ton of in heaven?" - ], + ["What’s there a ton of in heaven?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "After four platinum albums and three Grammys, it’s time to get back to my roots, to what inspired me to make music in the first place: ", {}, - "." - ] + ".", + ], ], [ - [ - "What will always get you laid?" - ], + ["What will always get you laid?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ @@ -639,164 +477,108 @@ {}, " inside of ", {}, - "." + ".", ], - [ - "They were wrong." - ] - ], - [ - [ - "Lifetime® presents “", - {}, - ": the Story of ", - {}, - ".”" - ] + ["They were wrong."], ], + [["Lifetime® presents “", {}, ": the Story of ", {}, ".”"]], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - ": kid-tested, mother-approved." - ] + ": kid-tested, mother-approved.", + ], + ], + [ + ["Why can’t I sleep at night?"], + [ + { + transform: "Capitalize", + }, + ".", + ], + ], + [ + ["What’s that smell?"], + [ + { + transform: "Capitalize", + }, + ".", + ], ], [ [ - "Why can’t I sleep at night?" + "After eight years in the White House, how is Obama finally letting loose?", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "What’s that smell?" - ], - [ - { - "transform": "Capitalize" - }, - "." - ] + ["This is the way the world ends"], + ["This is the way the world ends"], + ["Not with a bang but with ", {}, "."], ], + [["Coming to Broadway this season, ", {}, ": The Musical."]], [ - [ - "After eight years in the White House, how is Obama finally letting loose?" - ], - [ - { - "transform": "Capitalize" - }, - "." - ] - ], - [ - [ - "This is the way the world ends" - ], - [ - "This is the way the world ends" - ], - [ - "Not with a bang but with ", - {}, - "." - ] - ], - [ - [ - "Coming to Broadway this season, ", - {}, - ": The Musical." - ] - ], - [ - [ - "Here is the church" - ], - [ - "Here is the steeple" - ], - [ - "Open the doors" - ], - [ - "And there is", - {}, - "." - ] - ], - [ - [ - "But before I kill you, Mr. Bond, I must show you ", - {}, - "." - ] + ["Here is the church"], + ["Here is the steeple"], + ["Open the doors"], + ["And there is", {}, "."], ], + [["But before I kill you, Mr. Bond, I must show you ", {}, "."]], [ [ "Studies show that lab rats navigate mazes 50% faster after being exposed to ", {}, - "." - ] + ".", + ], ], [ - [ - "What’s the next superhero/sidekick duo?" - ], + ["What’s the next superhero/sidekick duo?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, "/", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Next on ESPN2, the World Series of ", - {}, - "." - ] + ".", + ], ], + [["Next on ESPN2, the World Series of ", {}, "."]], [ [ "When I am a billionaire, I shall erect a 50-foot statue to commemorate ", {}, - "." - ] + ".", + ], ], [ [ "Military historians remember Alexander the Great for his brilliant use of ", {}, - " against the Persians." - ] + " against the Persians.", + ], ], [ - [ - "War!" - ], - [ - "What is it good for?" - ], + ["War!"], + ["What is it good for?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ] + ".", + ], + ], ], - "responses": [ + responses: [ "silence", "the illusion of choice ina late-stage capitalist society", "many bats", @@ -1296,6 +1078,6 @@ "fear itself", "Jews, gypsies, and homosexuals", "the milkman", - "Cards Against Humanity" - ] + "Cards Against Humanity", + ], } diff --git a/server/decks/cah-base-ptbr.deck.json5 b/server/decks/cah-base-ptbr.deck.json5 index 061c8e8..1e0c98d 100644 --- a/server/decks/cah-base-ptbr.deck.json5 +++ b/server/decks/cah-base-ptbr.deck.json5 @@ -1,65 +1,59 @@ { - "name": "Cartas Contra a Humanidade", - "calls": [ + name: "Cartas Contra a Humanidade", + language: "pt-BR", + author: "Cards Against Humanity", + translator: "Fittl3", + calls: [ [ - [ - "Faça um poema de três versos." - ], + ["Faça um poema de três versos."], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ], - [ - {}, - "." + ".", ], + [{}, "."], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, " + ", {}, " = ", {}, - "." - ] + ".", + ], ], [ [ "Globo Filmes apresenta ", { - "transform": "Capitalize" + transform: "Capitalize", }, ", a história de ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Sim, eu matei ", - {}, - "." - ], + ["Sim, eu matei ", {}, "."], [ "Como? ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ @@ -67,45 +61,29 @@ {}, " recheado com ", {}, - "." - ] - ], - [ - [ - "Nunca de fato entendi ", - {}, - ", até encontrar ", - {}, - "." - ] + ".", + ], ], + [["Nunca de fato entendi ", {}, ", até encontrar ", {}, "."]], [ [ "No próximo Tropa de Elite, Capitão Nascimento descobre que milicianos estavam usando ", {}, " para ", {}, - "." - ] - ], - [ - [ - "Em um mundo devastado por ", - {}, - ", nosso único consolo é ", - {}, - "." - ] + ".", + ], ], + [["Em um mundo devastado por ", {}, ", nosso único consolo é ", {}, "."]], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, " é uma ladeira escorregadia que leva direto para ", {}, - "." - ] + ".", + ], ], [ [ @@ -113,786 +91,591 @@ {}, " se transformou em ", {}, - "." - ] + ".", + ], ], [ [ "Passo 1: ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], [ "Passo 2: ", { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Passo 3: Lucrar." - ] + ["Passo 3: Lucrar."], ], + [["E para meu próximo número, tirarei ", {}, " de ", {}, "."]], + [["E o prêmio ", {}, " vai para ", {}, "."]], [ [ - "E para meu próximo número, tirarei ", - {}, - " de ", - {}, - "." - ] - ], - [ - [ - "E o prêmio ", - {}, - " vai para ", - {}, - "." - ] + { + transform: "Capitalize", + }, + ".", + ], + ["Véi, na boa..."], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Véi, na boa..." - ] + ["As mina pira véi."], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "As mina pira véi." - ] + ["Tô dentro!"], ], + [["Bebo pra esquecer ", {}, "."]], [ + ["O que você espera não achar em seu prato de comida chinesa?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "Tô dentro!" - ] - ], - [ - [ - "Bebo pra esquecer ", - {}, - "." - ] - ], - [ - [ - "O que você espera não achar em seu prato de comida chinesa?" - ], - [ - { - "transform": "Capitalize" - }, - "." - ] ], [ [ "Historiadores encontraram dezenas de cadernos de Picasso com esboços de ", {}, - "." - ] + ".", + ], + ], + [ + ["O que Dick Cheney prefere?"], + [ + { + transform: "Capitalize", + }, + ".", + ], ], [ [ - "O que Dick Cheney prefere?" + "O que os Estados Unidos jogaram, de avião, às crianças do afeganistão?", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "O que os Estados Unidos jogaram, de avião, às crianças do afeganistão?" + ".", ], - [ - { - "transform": "Capitalize" - }, - "." - ] ], [ [ "A medicina alternativa agora está explorando os poderes curativos de ", {}, - "." - ] + ".", + ], ], [ - [ - "O que vou deixar de fazer na quaresma?" - ], + ["O que vou deixar de fazer na quaresma?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Idosos tem cheiro de quê?" - ], + ["Idosos tem cheiro de quê?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "O que me causa gases incontroláveis?" - ], + ["O que me causa gases incontroláveis?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Guerra! Pra que serve?" - ], + ["Guerra! Pra que serve?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Buscando aumentar sua audiência, o Museu de História Natural abriu uma exposição interativa sobre ", {}, - "." - ] + ".", + ], ], [ [ "Quando eu for bilionário, mandarei fazer uma estátua de 15 metros de altura para celebrar ", {}, - "." - ] - ], - [ - [ - "A seguir, na ESPN2: Campeonato Mundial de ", - {}, - "." - ] - ], - [ - [ - "Qual é a próxima dupla de super-herói e ajudante?" + ".", ], + ], + [["A seguir, na ESPN2: Campeonato Mundial de ", {}, "."]], + [ + ["Qual é a próxima dupla de super-herói e ajudante?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Estudo mostra que ratos de laboratório atravessam labirintos 50% mais rápido depois de serem expostos à ", {}, - "." - ] - ], - [ - [ - "Mas antes de matá-lo, Sr. Bond, preciso te mostrar ", - {}, - "." - ] + ".", + ], ], + [["Mas antes de matá-lo, Sr. Bond, preciso te mostrar ", {}, "."]], [ [ "Antropólogos recentemente descobriram uma tribo primitiva que cultua ", {}, - "." - ] + ".", + ], ], [ [ "Chega à Broadway nesta temporada o musical ", { - "transform": "Capitalize", - "style": "Em" + transform: "Capitalize", + style: "Em", }, - "." - ] - ], - [ - [ - "Assim expira o mundo. Não com uma explosão, mas com ", - {}, - "." - ] - ], - [ - [ - "O que ajuda o Obama a relaxar depois do trabalho?" + ".", ], + ], + [["Assim expira o mundo. Não com uma explosão, mas com ", {}, "."]], + [ + ["O que ajuda o Obama a relaxar depois do trabalho?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Que cheiro é esse?" - ], + ["Que cheiro é esse?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Por que não consigo dormir à noite?" - ], + ["Por que não consigo dormir à noite?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - ":" + ":", ], - [ - "testado pelas crianças, aprovado pelas mães." - ] + ["testado pelas crianças, aprovado pelas mães."], ], [ - [ - "O que é tiro-e-queda para se conseguir sexo?" - ], + ["O que é tiro-e-queda para se conseguir sexo?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Não sei com que armas se lutará a terceira guerra mundial, mas a quarta será com ", {}, - "." - ] + ".", + ], ], [ - [ - "O que é que tem à vontade no céu?" - ], + ["O que é que tem à vontade no céu?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Qual o próximo brinde do McLanche Feliz?" - ], + ["Qual o próximo brinde do McLanche Feliz?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Por que minha pele está pegajosa?" - ], + ["Por que minha pele está pegajosa?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "É assim que eu espero morrer." - ] + ["É assim que eu espero morrer."], ], [ - [ - "Que som é esse?" - ], + ["Que som é esse?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "O que causou o fim da minha ultima relação?" - ], + ["O que causou o fim da minha ultima relação?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Durante o sexo, gosto de pensar em ", - {}, - "." - ] - ], - [ - [ - "O que é mais EMO?" + ".", ], + ], + [["Durante o sexo, gosto de pensar em ", {}, "."]], + [ + ["O que é mais EMO?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "O que é que vovó acharia perturbante, mas estranhamente charmoso?" - ], + ["O que é que vovó acharia perturbante, mas estranhamente charmoso?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Novo reality-show da MTV apresenta oito celebridades desgastadas morando com ", {}, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." + ".", ], - [ - "É uma armadilha!" - ] - ], - [ - [ - "Resolução da ANAC agora proíbe ", - {}, - " em aeronaves." - ] + ["É uma armadilha!"], ], + [["Resolução da ANAC agora proíbe ", {}, " em aeronaves."]], [ [ "É uma pena que as crianças hoje em dia estejam todas envolvidas em ", {}, - "." - ] + ".", + ], ], [ [ "Em 1000 anos, quando o dinheiro de papel for apenas uma lembrança distante, ", {}, - " será nossa moeda" - ] - ], - [ - [ - "CBF proíbe ", - {}, - " por proporcionar vantagem desleal aos jogadores." - ] - ], - [ - [ - "Qual é o prazer proibido do Batman?" + " será nossa moeda", ], + ], + [["CBF proíbe ", {}, " por proporcionar vantagem desleal aos jogadores."]], + [ + ["Qual é o prazer proibido do Batman?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Vem aí o novo livro de J. K. Rowling: ", { - "text": "Harry Potter e a Câmara de ", - "style": "Em" + text: "Harry Potter e a Câmara de ", + style: "Em", }, { - "transform": "Capitalize", - "style": "Em" + transform: "Capitalize", + style: "Em", }, - "." - ] + ".", + ], ], [ [ "Desculpe, professora, mas é que eu não pude terminar o dever de casa por causa de ", {}, - "." - ] + ".", + ], ], [ - [ - "O que eu trouxe do Paraguai?" - ], + ["O que eu trouxe do Paraguai?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "?" + "?", ], - [ - "Tem um app pra isso." - ] + ["Tem um app pra isso."], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - ". " + ". ", ], - [ - "Aposto que um só não te satisfaz!" - ] + ["Aposto que um só não te satisfaz!"], ], [ - [ - "Qual é meu anti-droga?" - ], + ["Qual é meu anti-droga?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Enquanto os Estados Unidos e a União Soviética competiam na corrida espacial, o governo brasileiro investia pesado em ", {}, - "." - ] + ".", + ], ], [ [ "No novo filme da Disney, Hanna Montana enfrenta ", {}, - " pela primeira vez." - ] + " pela primeira vez.", + ], ], [ - [ - "Qual é meu poder secreto?" - ], + ["Qual é meu poder secreto?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Qual é a dieta do momento?" - ], + ["Qual é a dieta do momento?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "O que o Vin Diesel teve no jantar?" - ], + ["O que o Vin Diesel teve no jantar?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Quando o faraó permaneceu imóvel, Moisés invocou a praga dos ", {}, - "." - ] + ".", + ], ], [ - [ - "Como estou mantendo minha atual relação amorosa?" - ], + ["Como estou mantendo minha atual relação amorosa?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ - [ - "Qual é o cúmulo da porquice?" - ], + ["Qual é o cúmulo da porquice?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Dizem que em Bangu 3 se troca dez maços de cigarro por ", - {}, - "." - ] - ], - [ - [ - "Depois do terremoto, o Sean Penn levou ", - {}, - " ao Haití." - ] + ".", + ], ], + [["Dizem que em Bangu 3 se troca dez maços de cigarro por ", {}, "."]], + [["Depois do terremoto, o Sean Penn levou ", {}, " ao Haití."]], [ [ "No próximo Natal o Papai Noel vai dar ", {}, - " pra criança que não se comportar." - ] + " pra criança que não se comportar.", + ], ], [ [ "A vida dos índios americanos mudou para sempre quando o homem branco lhes apresentou ", {}, - "." - ] + ".", + ], ], [ [ - "O que o Ministério da Educação está usando para inspirar os estudantes do interior a serem bem sucedidos?" + "O que o Ministério da Educação está usando para inspirar os estudantes do interior a serem bem sucedidos?", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Talvez ela tenha nascido assim." + ".", ], - [ - "Talvez seja ", - {}, - "." - ] ], + [["Talvez ela tenha nascido assim."], ["Talvez seja ", {}, "."]], + [["Em seus momentos finais, Michael Jackson pensou em ", {}, "."]], + [["Homem branco gosta de ", {}, "."]], + [ + ["Porque estou todo doído?"], + [ + { + transform: "Capitalize", + }, + ".", + ], + ], + [["Um jantar romântico à luz de velas seria incompleto sem ", {}, "."]], [ [ - "Em seus momentos finais, Michael Jackson pensou em ", - {}, - "." - ] - ], - [ - [ - "Homem branco gosta de ", - {}, - "." - ] - ], - [ - [ - "Porque estou todo doído?" + "O que eu levaria ao passado para convencer as pessoas de que sou um ser mágico poderoso?", ], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "Um jantar romântico à luz de velas seria incompleto sem ", - {}, - "." - ] - ], - [ - [ - "O que eu levaria ao passado para convencer as pessoas de que sou um ser mágico poderoso?" + ".", ], - [ - { - "transform": "Capitalize" - }, - "." - ] ], [ [ "Em breve, numa livraria perto de você, ", { - "transform": "Capitalize", - "style": "Em" + transform: "Capitalize", + style: "Em", }, - "." - ] - ], - [ - [ - "A excursão escolar foi um fiasco devido a ", - {}, - "." - ] - ], - [ - [ - "Qual é o melhor amigo de uma garota?" + ".", ], + ], + [["A excursão escolar foi um fiasco devido a ", {}, "."]], + [ + ["Qual é o melhor amigo de uma garota?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ "Doutor Drauzio, estou tendo problemas com ", {}, - " e gostaria de ouvir o seu conselho." - ] - ], - [ - [ - "Quando eu for presidente, criarei o Departamento de ", - {}, - "." - ] - ], - [ - [ - "O que meus pais estão escondendo de mim?" + " e gostaria de ouvir o seu conselho.", ], + ], + [["Quando eu for presidente, criarei o Departamento de ", {}, "."]], + [ + ["O que meus pais estão escondendo de mim?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] - ], - [ - [ - "O que é que nunca falha em deixar uma festa mais animada?" + ".", ], - [ - { - "transform": "Capitalize" - }, - "." - ] ], [ + ["O que é que nunca falha em deixar uma festa mais animada?"], [ - "O que é que fica melhor quando envelhece?" + { + transform: "Capitalize", + }, + ".", ], + ], + [ + ["O que é que fica melhor quando envelhece?"], [ { - "transform": "Capitalize" + transform: "Capitalize", }, - "." - ] + ".", + ], ], [ [ { - "transform": "Capitalize" + transform: "Capitalize", }, - ": bom até a última gota." - ] + ": bom até a última gota.", + ], ], - [ - [ - "Estou com 99 problemas, mas ", - {}, - " não é um deles." - ] - ] + [["Estou com 99 problemas, mas ", {}, " não é um deles."]], ], - "responses": [ + responses: [ "uma maldição cigana", "um momento de silêncio", "um festival da linguiça", @@ -1349,6 +1132,6 @@ "ter medo de si próprio", "Lady Gaga", "o entregador de leite", - "dizer o que pensa" - ] -} \ No newline at end of file + "dizer o que pensa", + ], +} diff --git a/server/package-lock.json b/server/package-lock.json index a290187..c2d07de 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -30,169 +30,6 @@ "js-tokens": "^4.0.0" } }, - "@material/animation": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-UNdA/ndQYssWv6jOqAHXL4QaeI3OfC3j/bGikFsJ17nrSoo10G3d8wQSebw+ZS2wqsXp6jOu0iMDId6acZoO5w==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/base": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-QE3rF3KP9HJet8Jpok9eFWK1F2n3JJKhP0qyjR+n1llgcoBtEIGShA8+wkixeCUS8rVgpWRNyppuqg8lft/WeQ==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/button": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-iPQlUT+ku4q2KWeMp+IQEp+ejVQY1dKubblLwi6yfOdhlTkPvnf983LD+Iols3OeFELzEYsPOiV8/Iv9O09ZaA==", - "requires": { - "@material/density": "6.0.0-canary.35a32aaea.0", - "@material/elevation": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/ripple": "6.0.0-canary.35a32aaea.0", - "@material/rtl": "6.0.0-canary.35a32aaea.0", - "@material/shape": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0", - "@material/touch-target": "6.0.0-canary.35a32aaea.0", - "@material/typography": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/density": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-r5g1abpF1qOWhSawbv6K7PfqYsGkb4zH+EEB4Cu4B8ztwCJermz1mgMF5GftvSHBovv5zLnHLu7/kVrE/VbL7g==" - }, - "@material/dom": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-QoOQhYwZZ0F+tE7Mci92p8zY4iDsDZxIHZgO191o0zEdGROM6vTB3VupUwBn+5IdSKzblvxNsO6BblfMNmYpsw==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@material/elevation": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-kyzt3apFhgnf204Fr8BoRadEeTw3YXtUbTpUDGN13B3xeaNaB39DfrxK9QKbXnkTY54r9jcHTd/h9SsGM814uw==", - "requires": { - "@material/animation": "6.0.0-canary.35a32aaea.0", - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/feature-targeting": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-qJbELPsZZ7D+SlRpz7LCpc3SKzsbE8a11PB8/RlpKqTk2h5+n+efy2J7Et2V2hJxwtR91D4JSN31tmNtxchMGA==" - }, - "@material/mwc-base": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.14.1.tgz", - "integrity": "sha512-9EHP5Q2tQntiu6K92mn5G5gakmcuituHmz0NPvzAW34RnrMV81UevwfLLZwUiy51pm52hd5/viLXVt/WlL6bDg==", - "requires": { - "@material/base": "=6.0.0-canary.35a32aaea.0", - "@material/dom": "=6.0.0-canary.35a32aaea.0", - "@material/ripple": "=6.0.0-canary.35a32aaea.0", - "lit-element": "^2.3.0", - "tslib": "^1.10.0" - } - }, - "@material/mwc-button": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.14.1.tgz", - "integrity": "sha512-yXJDWsg1fdVp0afbLvtf7VbeWNhePlzK5oYZIaFzP7dmCWW8GvLK+04h/7mYMMSZeRTCcNJuRlM3Yi0S8P2YEQ==", - "requires": { - "@material/button": "=6.0.0-canary.35a32aaea.0", - "@material/mwc-base": "^0.14.1", - "@material/mwc-icon": "^0.14.1", - "@material/mwc-ripple": "^0.14.1", - "lit-element": "^2.3.0", - "lit-html": "^1.1.2", - "tslib": "^1.10.0" - } - }, - "@material/mwc-icon": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.14.1.tgz", - "integrity": "sha512-vjhmww/v2M4YVuPq5NhzoxyMBuJi1+CEKnfgdptqP2VT3oxjZKggQYqm/TlTTzHcRxOxhqmbcgfji7qosnzgfw==", - "requires": { - "@material/mwc-base": "^0.14.1", - "lit-element": "^2.3.0", - "tslib": "^1.10.0" - } - }, - "@material/mwc-ripple": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.14.1.tgz", - "integrity": "sha512-UdGdkT4IlkQ7myWSeOj1RqXvneyrkjdBTXW0iswFySRRkbJ9f+g1771acKASdRG0fx7GvrWj6RPcBZzD5S9SmQ==", - "requires": { - "@material/dom": "=6.0.0-canary.35a32aaea.0", - "@material/mwc-base": "^0.14.1", - "@material/ripple": "=6.0.0-canary.35a32aaea.0", - "lit-element": "^2.3.0", - "lit-html": "^1.1.2", - "tslib": "^1.10.0" - } - }, - "@material/ripple": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-0ZogedoMGKgBZQ8pbHNb6gudWu6KjIRRP8kEJYT8h4EIUUVC6NypHwJVBz7l+UzHPaXVUWdSQnQclHmtP7LuYg==", - "requires": { - "@material/animation": "6.0.0-canary.35a32aaea.0", - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/dom": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0", - "tslib": "^1.9.3" - } - }, - "@material/rtl": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-G/xg1hIxLXb6+EA4Pb9TCkYsmxJRzrRhD7PoGb1SH/stLfyx6V8zyvWi9Te8VKCesZ9HZisB7VmN9+aI0NZnkQ==" - }, - "@material/shape": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-4QN2Ura9Z3sdYwbnqGDaz+Cqq97skkdf+K10Ps6HH4j1sAmiwALDWO15llIHlLNSNKHcrrQwJeIei+q6rPdzXw==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/rtl": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/theme": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-DXz4aBBWiI4F9R/LA2/SlP/faX7gQboPE4zMqHUFRX8pRotMRUwPUFMPDsNI4wUcHRTvL5TtN1CRT/BvEXFoTQ==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/touch-target": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-yIpuA4koRLwhohKjXmvImLquV+uPK2+1/VnBObZFOw+Bbusm5VUBDS/9TTwZSKA5ze9hHnJpY0SICypz6poENQ==", - "requires": { - "@material/base": "6.0.0-canary.35a32aaea.0", - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0" - } - }, - "@material/typography": { - "version": "6.0.0-canary.35a32aaea.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-6.0.0-canary.35a32aaea.0.tgz", - "integrity": "sha512-cK/gPHvEOLMwUd8Y5Q8RW6ubObPhmEaTQ6bnE42dWLJu/CR42yMJyjNVYYVwWrclH56+wB613bGwvSnFueMD3w==", - "requires": { - "@material/feature-targeting": "6.0.0-canary.35a32aaea.0", - "@material/theme": "6.0.0-canary.35a32aaea.0" - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -276,12 +113,13 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz", - "integrity": "sha512-578YH5Lt88AKoADy0b2jQGwJtrBxezXtVe/MBqWXKZpqx91SnC0pVkVCcxcytz3lWW+cHBYDi3Ysh0WXc+rAYw==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", + "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", "dev": true, "requires": { "@types/node": "*", + "@types/qs": "*", "@types/range-parser": "*" } }, @@ -383,9 +221,9 @@ "dev": true }, "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, "@types/pg": { @@ -405,9 +243,9 @@ "dev": true }, "@types/qs": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz", - "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.2.tgz", + "integrity": "sha512-a9bDi4Z3zCZf4Lv1X/vwnvbbDYSNz59h3i3KdyuYYN+YrLjSeJD0dnphdULDfySvUv6Exy/O0K6wX/kQpnPQ+A==", "dev": true }, "@types/range-parser": { @@ -457,45 +295,45 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", - "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", + "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", - "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", - "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", + "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.30.0", - "@typescript-eslint/typescript-estree": "2.30.0", + "@typescript-eslint/experimental-utils": "2.31.0", + "@typescript-eslint/typescript-estree": "2.31.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", - "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", "dev": true, "requires": { "debug": "^4.1.1", @@ -546,9 +384,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, "acorn-jsx": { @@ -577,6 +415,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -599,6 +443,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -954,6 +807,12 @@ "wrap-ansi": "^5.1.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -976,6 +835,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -1092,16 +960,14 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -1279,22 +1145,22 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.0.0.tgz", + "integrity": "sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", + "eslint-utils": "^2.0.0", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "espree": "^7.0.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -1307,22 +1173,56 @@ "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", + "levn": "^0.4.1", "lodash": "^4.17.14", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1332,14 +1232,11 @@ "ms": "^2.1.1" } }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "ms": { "version": "2.1.2", @@ -1347,17 +1244,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -1405,9 +1305,9 @@ "dev": true }, "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", + "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", "dev": true, "requires": { "acorn": "^7.1.1", @@ -2041,15 +1941,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -2298,28 +2189,15 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "lit-element": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.3.1.tgz", - "integrity": "sha512-tOcUAmeO3BzwiQ7FGWdsshNvC0HVHcTFYw/TLIImmKwXYoV0E7zCBASa8IJ7DiP4cen/Yoj454gS0qqTnIGsFA==", - "requires": { - "lit-html": "^1.1.1" - } - }, - "lit-html": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.2.1.tgz", - "integrity": "sha512-GSJHHXMGLZDzTRq59IUfL9FCdAlGfqNp/dEa7k7aBaaWD+JKaCjsAk9KYm2V12ItonVaYx2dprN66Zdm1AuBTQ==" - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2481,9 +2359,9 @@ } }, "moment": { - "version": "2.25.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.1.tgz", - "integrity": "sha512-nRKMf9wDS4Fkyd0C9LXh2FFXinD+iwbJ5p/lh3CHitW9kZbRbJ8hCruiadiIXZVbeAqKZzqcTvHnK3mRhFjb6w==" + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", + "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" }, "ms": { "version": "2.0.0", @@ -2606,17 +2484,17 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "os-tmpdir": { @@ -2707,9 +2585,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -2724,14 +2602,14 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "pg": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.3.tgz", - "integrity": "sha512-fvcNXn4o/iq4jKq15Ix/e58q3jPSmzOp6/8C3CaHoSR/bsxdg+1FXfDRePdtE/zBb3++TytvOrS1hNef3WC/Kg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.1.0.tgz", + "integrity": "sha512-Jp+XSNTGYDztc2FgIbmBXeeYMR7kKjfgnl3R+ioO6rkcxDmaea+YPp/gaxe13PBnJAFYyEGl0ixpwPm2gb6eUw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-pool": "^3.1.1", + "pg-connection-string": "^2.2.2", + "pg-pool": "^3.2.0", "pg-protocol": "^1.2.2", "pg-types": "^2.1.0", "pgpass": "1.x", @@ -2746,9 +2624,9 @@ } }, "pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.2.2.tgz", + "integrity": "sha512-+hel4DGuSZCjCZwglAuyi+XlodHnKmrbyTw0hVWlmGN2o4AfJDkDo5obAFzblS5M5PFBMx0uDt5Y1QjlNC+tqg==" }, "pg-int8": { "version": "1.0.1", @@ -2756,9 +2634,9 @@ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, "pg-pool": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.1.1.tgz", - "integrity": "sha512-kYH6S0mcZF1TPg1F9boFee2JlCSm2oqnlR2Mz2Wgn1psQbEBNVeNTJCw2wCK48QsctwvGUzbxLMg/lYV6hL/3A==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.0.tgz", + "integrity": "sha512-7BLwDNDEfPFjE9vmZLcJPLFwuDAVGZ5lIZo2MeQfwYG7EPGfdNVis/dz6obI/yKqvQIx2sf6QBKXMLB+y/ftgA==" }, "pg-protocol": { "version": "1.2.2", @@ -2815,9 +2693,9 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prepend-http": { @@ -3152,18 +3030,18 @@ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { @@ -3246,17 +3124,6 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "string_decoder": { @@ -3268,27 +3135,19 @@ }, "dependencies": { "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -3323,6 +3182,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -3345,6 +3210,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -3426,9 +3300,10 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", + "dev": true }, "tsutils": { "version": "3.17.1", @@ -3440,12 +3315,12 @@ } }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { @@ -3508,6 +3383,51 @@ "tsconfig-loader": "^1.1.0", "typescript-json-schema": "^0.38.3", "yargs": "^13.2.4" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "undefsafe": { @@ -3661,9 +3581,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -3750,6 +3670,12 @@ "strip-ansi": "^5.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -3772,6 +3698,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -3855,6 +3790,12 @@ "yargs-parser": "^13.1.2" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -3877,6 +3818,15 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, diff --git a/server/package.json b/server/package.json index 7002248..c800862 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "start": "node --es-module-specifier-resolution=node dist/index.js", "predev": "npm run build", "dev": "nodemon --es-module-specifier-resolution=node dist/index.js", + "predebug": "npm run build", "debug": "nodemon --inspect --es-module-specifier-resolution=node dist/index.js", "generate-json-validators": "bash generate-validators.sh", "generate-secret": "npm run prestart && node --es-module-specifier-resolution=node dist/secret.js" @@ -41,8 +42,8 @@ "http-status-codes": "^1.3.2", "json5": "^2.1.3", "jsonwebtoken": "^8.5.1", - "moment": "^2.24.0", - "pg": "^8.0.3", + "moment": "^2.25.3", + "pg": "^8.1.0", "rfc6902": "^3.0.4", "source-map-support": "^0.5.19", "uuid": "^8.0.0", @@ -51,7 +52,7 @@ }, "devDependencies": { "@types/express": "^4.17.6", - "@types/express-serve-static-core": "^4.17.5", + "@types/express-serve-static-core": "^4.17.7", "@types/express-winston": "^4.0.0", "@types/express-ws": "^3.0.0", "@types/generic-pool": "^3.1.9", @@ -60,12 +61,13 @@ "@types/json5": "0.0.30", "@types/jsonwebtoken": "^8.3.9", "@types/pg": "^7.14.3", + "@types/qs": "^6.9.2", "@types/source-map-support": "^0.5.1", "@types/uuid": "^7.0.3", "@types/wu": "^2.1.41", - "@typescript-eslint/eslint-plugin": "^2.30.0", - "@typescript-eslint/parser": "^2.30.0", - "eslint": "^6.8.0", + "@typescript-eslint/eslint-plugin": "^2.31.0", + "@typescript-eslint/parser": "^2.31.0", + "eslint": "^7.0.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-prettier": "^3.1.3", "nodemon": "^2.0.3", diff --git a/server/src/ts/action/actions.ts b/server/src/ts/action/actions.ts index d6ae1c7..a649335 100644 --- a/server/src/ts/action/actions.ts +++ b/server/src/ts/action/actions.ts @@ -61,7 +61,7 @@ export abstract class Group< } is(action: Action): action is Type { - return wu(this.childActions).some(child => child.is(action)); + return wu(this.childActions).some((child) => child.is(action)); } abstract limit( diff --git a/server/src/ts/action/authenticate.ts b/server/src/ts/action/authenticate.ts index 1236bf9..fa23fc2 100644 --- a/server/src/ts/action/authenticate.ts +++ b/server/src/ts/action/authenticate.ts @@ -44,7 +44,7 @@ export async function handle( if (claims.gc !== gameCode) { throw new Authentication.InvalidAuthenticationError("wrong game code"); } - await Change.apply(server, gameCode, lobby => { + await Change.apply(server, gameCode, (lobby) => { const user = lobby.users[claims.uid]; if (user === undefined) { throw new Authentication.InvalidAuthenticationError("no such user"); @@ -55,7 +55,7 @@ export async function handle( if (user.connection !== "Connected") { user.connection = "Connected"; return { - events: [Event.targetAll(ConnectionChanged.connected(claims.uid))] + events: [Event.targetAll(ConnectionChanged.connected(claims.uid))], }; } else { return {}; diff --git a/server/src/ts/action/game-action/czar/judge.ts b/server/src/ts/action/game-action/czar/judge.ts index 3fc38ea..e33c424 100644 --- a/server/src/ts/action/game-action/czar/judge.ts +++ b/server/src/ts/action/game-action/czar/judge.ts @@ -59,9 +59,9 @@ class JudgeAction extends Actions.Implementation< timeouts: [ { timeout: RoundStart.of(), - after: game.rules.timeLimits.complete * 1000 - } - ] + after: game.rules.timeLimits.complete * 1000, + }, + ], }; } else { return {}; diff --git a/server/src/ts/action/game-action/czar/reveal.ts b/server/src/ts/action/game-action/czar/reveal.ts index e1165dd..413fb24 100644 --- a/server/src/ts/action/game-action/czar/reveal.ts +++ b/server/src/ts/action/game-action/czar/reveal.ts @@ -32,7 +32,7 @@ class RevealAction extends Actions.Implementation< ) => { const lobbyRound = lobby.game.round; if (lobbyRound.verifyStage(action, "Revealing")) { - const play = lobbyRound.plays.find(play => play.id === action.play); + const play = lobbyRound.plays.find((play) => play.id === action.play); if (play === undefined) { throw new InvalidActionError("Given play doesn't exist."); } @@ -55,7 +55,7 @@ class RevealAction extends Actions.Implementation< return { lobby, events: [Event.targetAll(PlayRevealed.of(play.id, play.play))], - timeouts: timeouts + timeouts: timeouts, }; } else { return {}; diff --git a/server/src/ts/action/game-action/player/like.ts b/server/src/ts/action/game-action/player/like.ts index cfe1d58..3924bf7 100644 --- a/server/src/ts/action/game-action/player/like.ts +++ b/server/src/ts/action/game-action/player/like.ts @@ -33,15 +33,15 @@ class LikeActions extends Actions.Implementation< ) ) { const cRound = lobby.game.round; - const target = cRound.plays.find(p => p.id === action.play); + const target = cRound.plays.find((p) => p.id === action.play); if ( target !== undefined && target.playedBy !== auth.uid && - target.likes.find(id => id === auth.uid) === undefined + target.likes.find((id) => id === auth.uid) === undefined ) { target.likes.push(auth.uid); return { - lobby + lobby, }; } else { return {}; diff --git a/server/src/ts/action/game-action/player/take-back.ts b/server/src/ts/action/game-action/player/take-back.ts index c3e9d04..874d0e3 100644 --- a/server/src/ts/action/game-action/player/take-back.ts +++ b/server/src/ts/action/game-action/player/take-back.ts @@ -29,7 +29,7 @@ class TakeBackActions extends Actions.Implementation< ) => { if (lobby.game.round.verifyStage(action, "Playing")) { const plays = lobby.game.round.plays; - const playIndex = plays.findIndex(play => play.playedBy === auth.uid); + const playIndex = plays.findIndex((play) => play.playedBy === auth.uid); if (playIndex < 0) { throw new InvalidActionError("No play to take back."); } diff --git a/server/src/ts/action/game-action/redraw.ts b/server/src/ts/action/game-action/redraw.ts index 69d6168..df90df8 100644 --- a/server/src/ts/action/game-action/redraw.ts +++ b/server/src/ts/action/game-action/redraw.ts @@ -48,8 +48,8 @@ class RedrawActions extends Actions.Implementation< Event.additionally( HandRedrawn.of(auth.uid), new Map([[auth.uid, { hand: player.hand }]]) - ) - ] + ), + ], }; }; } diff --git a/server/src/ts/action/game-action/set-presence.ts b/server/src/ts/action/game-action/set-presence.ts index af659f5..5d0ba15 100644 --- a/server/src/ts/action/game-action/set-presence.ts +++ b/server/src/ts/action/game-action/set-presence.ts @@ -45,7 +45,7 @@ export const dealWithLostPlayer = ( Event.targetAll(PlayerPresenceChanged.away(playerId)), ...(invalidateRoundResult.events !== undefined ? invalidateRoundResult.events - : []) + : []), ], timeouts: [ ...(invalidateRoundResult.timeouts !== undefined @@ -53,8 +53,8 @@ export const dealWithLostPlayer = ( : []), ...(removeFromRoundResult.timeouts !== undefined ? removeFromRoundResult.timeouts - : []) - ] + : []), + ], }; }; @@ -91,9 +91,9 @@ class SetPresenceActions extends Actions.Implementation< lobby, events: [ Event.targetAll(PlayerPresenceChanged.back(playerId)), - ...(unpause.events !== undefined ? unpause.events : []) + ...(unpause.events !== undefined ? unpause.events : []), ], - timeouts: unpause.timeouts + timeouts: unpause.timeouts, }; } else { Util.assertNever(player.presence); diff --git a/server/src/ts/action/privileged/configure.ts b/server/src/ts/action/privileged/configure.ts index 1883a4d..131c691 100644 --- a/server/src/ts/action/privileged/configure.ts +++ b/server/src/ts/action/privileged/configure.ts @@ -6,7 +6,6 @@ import { ConfigEditConflictError } from "../../errors/action-execution-error"; import { InvalidActionError } from "../../errors/validation"; import * as Event from "../../event"; import * as Configured from "../../events/lobby-event/configured"; -import * as Sources from "../../games/cards/sources"; import * as Rules from "../../games/rules"; import * as HouseRules from "../../games/rules/houseRules"; import * as Rando from "../../games/rules/rando"; diff --git a/server/src/ts/action/privileged/end-game.ts b/server/src/ts/action/privileged/end-game.ts index afa74a6..bf59362 100644 --- a/server/src/ts/action/privileged/end-game.ts +++ b/server/src/ts/action/privileged/end-game.ts @@ -44,7 +44,7 @@ class EndGameActions extends Actions.Implementation< lobby.game.winner = winners; return { lobby, - events: [Event.targetAll(GameEnded.of(...winners))] + events: [Event.targetAll(GameEnded.of(...winners))], }; }; } diff --git a/server/src/ts/action/privileged/kick.ts b/server/src/ts/action/privileged/kick.ts index 03f3263..2921f74 100644 --- a/server/src/ts/action/privileged/kick.ts +++ b/server/src/ts/action/privileged/kick.ts @@ -34,8 +34,8 @@ export const removeUser = ( const allEvents = [ Event.targetAllAndPotentiallyClose( PresenceChanged.left(userId, leaveReason), - id => id === userId - ) + (id) => id === userId + ), ]; const allTimeouts: Timeout.After[] = []; @@ -69,8 +69,9 @@ export const removeUser = ( } return { + lobby, events: allEvents, - timeouts: allTimeouts + timeouts: allTimeouts, }; }; diff --git a/server/src/ts/action/privileged/set-privilege.ts b/server/src/ts/action/privileged/set-privilege.ts index 6494164..3ea2a81 100644 --- a/server/src/ts/action/privileged/set-privilege.ts +++ b/server/src/ts/action/privileged/set-privilege.ts @@ -41,7 +41,7 @@ class SetPrivilegeActions extends Actions.Implementation< user.privilege = privilege; return { lobby, - events: [Event.targetAll(PrivilegeChanged.of(action.user, privilege))] + events: [Event.targetAll(PrivilegeChanged.of(action.user, privilege))], }; } return {}; diff --git a/server/src/ts/action/privileged/start-game.ts b/server/src/ts/action/privileged/start-game.ts index 59e291c..618ba7e 100644 --- a/server/src/ts/action/privileged/start-game.ts +++ b/server/src/ts/action/privileged/start-game.ts @@ -25,9 +25,9 @@ class StartGameActions extends Actions.Implementation< tasks: [ new StartGameTask( auth.gc, - lobby.config.decks.map(s => s.source) - ) - ] + lobby.config.decks.map((s) => s.source) + ), + ], }); } diff --git a/server/src/ts/action/set-user-role.ts b/server/src/ts/action/set-user-role.ts index 774cac6..53d4b62 100644 --- a/server/src/ts/action/set-user-role.ts +++ b/server/src/ts/action/set-user-role.ts @@ -84,9 +84,9 @@ class SetUserRoleActions extends Actions.Implementation< UserRoleChanged.of(userId, action.role), additionalMap ), - ...allEvents + ...allEvents, ], - timeouts: allTimeouts + timeouts: allTimeouts, }; } else { return {}; diff --git a/server/src/ts/action/validation.validator.ts b/server/src/ts/action/validation.validator.ts index 6e6416b..c8213d7 100644 --- a/server/src/ts/action/validation.validator.ts +++ b/server/src/ts/action/validation.validator.ts @@ -266,10 +266,22 @@ export const Schema = { defaultProperties: [], description: "More information that can be looked up given a source.", properties: { + author: { + description: "The name of the author of the deck.", + type: "string", + }, + language: { + description: "The language tag for the language the deck is in.", + type: "string", + }, name: { description: "A name for the source.", type: "string", }, + translator: { + description: "The name of the translator of the deck.", + type: "string", + }, url: { description: "A link to more information about the source.", type: "string", diff --git a/server/src/ts/caches/postgres.ts b/server/src/ts/caches/postgres.ts index 82cdc57..ed4876b 100644 --- a/server/src/ts/caches/postgres.ts +++ b/server/src/ts/caches/postgres.ts @@ -7,6 +7,20 @@ import * as Postgres from "../util/postgres"; import * as Card from "../games/cards/card"; import * as uuid from "uuid"; +class To1 extends Postgres.Upgrade<0, 1> { + public readonly to = 1; + + public async apply(client: Pg.PoolClient): Promise<1> { + await client.query(` + ALTER TABLE mdcache.summaries ADD COLUMN author TEXT; + ALTER TABLE mdcache.summaries ADD COLUMN language TEXT; + ALTER TABLE mdcache.summaries ADD COLUMN translator TEXT; + `); + await client.query("UPDATE mdcache.meta SET version = $1;", [this.to]); + return this.to; + } +} + class To0 extends Postgres.Upgrade { public readonly to = 0; @@ -66,6 +80,9 @@ const upgrades: Postgres.Upgrades = (version) => { return new To0(version); case 0: + return new To1(version); + + case 1: return undefined; default: @@ -73,6 +90,9 @@ const upgrades: Postgres.Upgrades = (version) => { } }; +const nullToUndefined = (value: T | null): T | undefined => + value === null ? undefined : value; + /** * A PostgreSQL database backed cache. */ @@ -84,9 +104,7 @@ export class PostgresCache extends Cache.Cache { config: Config.PostgreSQLCache ): Promise { const pg = new Postgres.Postgres("mdcache", config.connection, upgrades); - await pg.ensureCurrent(); - return new PostgresCache(config, pg); } @@ -109,11 +127,11 @@ export class PostgresCache extends Cache.Cache { `, [source.id(), source.deckId()] ); - + const details = summary.details; await client.query( ` INSERT INTO mdcache.summaries - (source, deck, name, url, calls, responses, updated, tag) + (source, deck, name, url, author, language, translator, calls, responses, updated, tag) VALUES ( $1, $2, $3, $4, $5, $6, $7, $8 ); @@ -121,8 +139,11 @@ export class PostgresCache extends Cache.Cache { [ source.id(), source.deckId(), - summary.details.name, - summary.details.url, + details.name, + details.url, + details.author, + details.language, + details.translator, summary.calls, summary.responses, Date.now(), @@ -179,7 +200,7 @@ export class PostgresCache extends Cache.Cache { return await this.pg.withClient(async (client) => { const result = await client.query( ` - SELECT name, url, calls, responses, updated + SELECT name, url, author, language, translator, calls, responses, updated FROM mdcache.summaries WHERE source = $1 AND deck = $2 `, [source.id(), source.deckId()] @@ -190,7 +211,10 @@ export class PostgresCache extends Cache.Cache { cached: { details: { name: row["name"], - url: row["url"], + url: nullToUndefined(row["url"]), + author: nullToUndefined(row["author"]), + language: nullToUndefined(row["language"]), + translator: nullToUndefined(row["translator"]), }, calls: row["calls"], responses: row["responses"], diff --git a/server/src/ts/errors/authentication.ts b/server/src/ts/errors/authentication.ts index 06ee415..53dd95d 100644 --- a/server/src/ts/errors/authentication.ts +++ b/server/src/ts/errors/authentication.ts @@ -27,7 +27,7 @@ abstract class AuthenticationFailureError extends Errors.MassiveDecksError< public details = (): Details => ({ error: "AuthenticationFailure", - reason: this.reason + reason: this.reason, }); } diff --git a/server/src/ts/errors/game-state-error.ts b/server/src/ts/errors/game-state-error.ts index 81cd523..225c1cf 100644 --- a/server/src/ts/errors/game-state-error.ts +++ b/server/src/ts/errors/game-state-error.ts @@ -21,6 +21,6 @@ export class OutOfCardsError extends GameStateError { } public details = (): Errors.Details => ({ - error: "OutOfCards" + error: "OutOfCards", }); } diff --git a/server/src/ts/errors/lobby.ts b/server/src/ts/errors/lobby.ts index a688b59..89f03c4 100644 --- a/server/src/ts/errors/lobby.ts +++ b/server/src/ts/errors/lobby.ts @@ -25,7 +25,7 @@ export abstract class LobbyNotFoundError extends Errors.MassiveDecksError< public details: () => Details = () => ({ error: "LobbyNotFound", gameCode: this.gameCode, - reason: this.reason + reason: this.reason, }); } diff --git a/server/src/ts/errors/registration.ts b/server/src/ts/errors/registration.ts index 2311b6f..3b10903 100644 --- a/server/src/ts/errors/registration.ts +++ b/server/src/ts/errors/registration.ts @@ -25,7 +25,7 @@ abstract class RegistrationError extends Errors.MassiveDecksError< return { error: "Registration", reason: this.reason, - ...this.moreDetails() + ...this.moreDetails(), }; } } @@ -47,7 +47,7 @@ export class UsernameAlreadyInUseError extends RegistrationError< protected moreDetails(): UsernameDetails { return { - username: this.username + username: this.username, }; } } diff --git a/server/src/ts/errors/validation.ts b/server/src/ts/errors/validation.ts index 014e50d..85f1363 100644 --- a/server/src/ts/errors/validation.ts +++ b/server/src/ts/errors/validation.ts @@ -17,6 +17,6 @@ export class InvalidActionError extends Errors.MassiveDecksError
{ public details: () => Details = () => ({ error: "InvalidAction", - reason: this.reason + reason: this.reason, }); } diff --git a/server/src/ts/event.ts b/server/src/ts/event.ts index 2a61c8b..198f060 100644 --- a/server/src/ts/event.ts +++ b/server/src/ts/event.ts @@ -150,7 +150,7 @@ const sendHelper = ( const userSockets = sockets.get(gameCode, user); Logging.logger.debug("WebSocket send:", { user: user, - event: serializedEvent + event: serializedEvent, }); for (const socket of userSockets) { socket.send(serializedEvent); diff --git a/server/src/ts/events/game-event/game-ended.ts b/server/src/ts/events/game-event/game-ended.ts index 208e447..b6fa7cf 100644 --- a/server/src/ts/events/game-event/game-ended.ts +++ b/server/src/ts/events/game-event/game-ended.ts @@ -10,5 +10,5 @@ export interface GameEnded { export const of = (...winner: User.Id[]): GameEnded => ({ event: "GameEnded", - winner: winner.map(w => w.toString()) + winner: winner.map((w) => w.toString()), }); diff --git a/server/src/ts/events/game-event/pause-state-changed.ts b/server/src/ts/events/game-event/pause-state-changed.ts index 78e20bc..c87643b 100644 --- a/server/src/ts/events/game-event/pause-state-changed.ts +++ b/server/src/ts/events/game-event/pause-state-changed.ts @@ -11,7 +11,7 @@ export interface Paused { } export const paused: Paused = { - event: "Paused" + event: "Paused", }; /** @@ -22,5 +22,5 @@ export interface Continued { } export const continued: Continued = { - event: "Continued" + event: "Continued", }; diff --git a/server/src/ts/events/game-event/play-revealed.ts b/server/src/ts/events/game-event/play-revealed.ts index 9b0a129..2e9b6a3 100644 --- a/server/src/ts/events/game-event/play-revealed.ts +++ b/server/src/ts/events/game-event/play-revealed.ts @@ -12,5 +12,5 @@ export interface PlayRevealed { export const of = (id: Play.Id, play: Play.Play): PlayRevealed => ({ event: "PlayRevealed", id, - play + play, }); diff --git a/server/src/ts/events/game-event/play-submitted.ts b/server/src/ts/events/game-event/play-submitted.ts index 0f1f553..c36754c 100644 --- a/server/src/ts/events/game-event/play-submitted.ts +++ b/server/src/ts/events/game-event/play-submitted.ts @@ -10,5 +10,5 @@ export interface PlaySubmitted { export const of = (by: User.Id): PlaySubmitted => ({ event: "PlaySubmitted", - by + by, }); diff --git a/server/src/ts/events/game-event/play-taken-back.ts b/server/src/ts/events/game-event/play-taken-back.ts index 29b2ddf..73db111 100644 --- a/server/src/ts/events/game-event/play-taken-back.ts +++ b/server/src/ts/events/game-event/play-taken-back.ts @@ -10,5 +10,5 @@ export interface PlayTakenBack { export const of = (by: User.Id): PlayTakenBack => ({ event: "PlayTakenBack", - by + by, }); diff --git a/server/src/ts/events/game-event/player-presence-changed.ts b/server/src/ts/events/game-event/player-presence-changed.ts index b2a1400..5827718 100644 --- a/server/src/ts/events/game-event/player-presence-changed.ts +++ b/server/src/ts/events/game-event/player-presence-changed.ts @@ -18,7 +18,7 @@ export interface Away extends Base { export const away = (id: User.Id): Away => ({ event: "Away", - player: id + player: id, }); /** @@ -30,5 +30,5 @@ export interface Back extends Base { export const back = (id: User.Id): Back => ({ event: "Back", - player: id + player: id, }); diff --git a/server/src/ts/events/game-event/round-finished.ts b/server/src/ts/events/game-event/round-finished.ts index 9c426c0..c272827 100644 --- a/server/src/ts/events/game-event/round-finished.ts +++ b/server/src/ts/events/game-event/round-finished.ts @@ -15,5 +15,5 @@ export interface RoundFinished { export const of = (round: GameRound.Complete): RoundFinished => ({ event: "RoundFinished", winner: round.winner, - playDetails: round.playDetails() + playDetails: round.playDetails(), }); diff --git a/server/src/ts/events/game-event/stage-timer-done.ts b/server/src/ts/events/game-event/stage-timer-done.ts index 7acd531..d4eedae 100644 --- a/server/src/ts/events/game-event/stage-timer-done.ts +++ b/server/src/ts/events/game-event/stage-timer-done.ts @@ -12,5 +12,5 @@ export interface StageTimerDone { export const of = (roundId: Round.Id, stage: Round.Stage): StageTimerDone => ({ event: "StageTimerDone", round: roundId.toString(), - stage + stage, }); diff --git a/server/src/ts/events/lobby-event/configured.ts b/server/src/ts/events/lobby-event/configured.ts index 4540df7..5334022 100644 --- a/server/src/ts/events/lobby-event/configured.ts +++ b/server/src/ts/events/lobby-event/configured.ts @@ -13,5 +13,5 @@ export interface Configured { export const of = (change: Rfc6902.Patch): Configured => ({ event: "Configured", - change + change, }); diff --git a/server/src/ts/events/lobby-event/connection-changed.ts b/server/src/ts/events/lobby-event/connection-changed.ts index be11808..e8779c1 100644 --- a/server/src/ts/events/lobby-event/connection-changed.ts +++ b/server/src/ts/events/lobby-event/connection-changed.ts @@ -18,7 +18,7 @@ export interface Connected extends Base { export const connected = (user: User.Id): Connected => ({ event: "Connected", - user + user, }); /** @@ -30,5 +30,5 @@ export interface Disconnected extends Base { export const disconnected = (user: User.Id): Disconnected => ({ event: "Disconnected", - user + user, }); diff --git a/server/src/ts/events/lobby-event/error-encountered.ts b/server/src/ts/events/lobby-event/error-encountered.ts index bf35398..7188e89 100644 --- a/server/src/ts/events/lobby-event/error-encountered.ts +++ b/server/src/ts/events/lobby-event/error-encountered.ts @@ -11,5 +11,5 @@ export interface ErrorEncountered { export const of = (error: Errors.Details): ErrorEncountered => ({ event: "ErrorEncountered", - error + error, }); diff --git a/server/src/ts/events/lobby-event/presence-changed.ts b/server/src/ts/events/lobby-event/presence-changed.ts index 1acefed..79fc206 100644 --- a/server/src/ts/events/lobby-event/presence-changed.ts +++ b/server/src/ts/events/lobby-event/presence-changed.ts @@ -24,7 +24,7 @@ export const joined = (id: User.Id, user: User.User): Joined => ({ user: id, name: user.name, ...(user.privilege !== "Unprivileged" ? { privilege: user.privilege } : {}), - ...(user.control !== "Human" ? { control: user.control } : {}) + ...(user.control !== "Human" ? { control: user.control } : {}), }); export type LeaveReason = "Left" | "Kicked"; @@ -40,5 +40,5 @@ export interface Left extends Base { export const left = (user: User.Id, reason: LeaveReason): Left => ({ event: "Left", user, - ...(reason !== "Left" ? { reason } : {}) + ...(reason !== "Left" ? { reason } : {}), }); diff --git a/server/src/ts/events/lobby-event/privilege-changed.ts b/server/src/ts/events/lobby-event/privilege-changed.ts index c6b3867..7e6d071 100644 --- a/server/src/ts/events/lobby-event/privilege-changed.ts +++ b/server/src/ts/events/lobby-event/privilege-changed.ts @@ -15,5 +15,5 @@ export const of = ( ): PrivilegeChanged => ({ event: "PrivilegeChanged", user, - privilege + privilege, }); diff --git a/server/src/ts/events/user-event/sync.ts b/server/src/ts/events/user-event/sync.ts index 42f07b4..35a6d88 100644 --- a/server/src/ts/events/user-event/sync.ts +++ b/server/src/ts/events/user-event/sync.ts @@ -22,5 +22,5 @@ export const of = ( state, ...(hand !== undefined ? { hand } : {}), ...(play !== undefined ? { play } : {}), - gameTime: Date.now() + gameTime: Date.now(), }); diff --git a/server/src/ts/games/cards/source.ts b/server/src/ts/games/cards/source.ts index 9fa34ce..8576f18 100644 --- a/server/src/ts/games/cards/source.ts +++ b/server/src/ts/games/cards/source.ts @@ -26,6 +26,18 @@ export interface Details { * A link to more information about the source. */ url?: string; + /** + * The name of the author of the deck. + */ + author?: string; + /** + * The language tag for the language the deck is in. + */ + language?: string; + /** + * The name of the translator of the deck. + */ + translator?: string; } export interface Summary extends Cache.Tagged { @@ -232,6 +244,10 @@ export class CachedResolver extends Resolver { * Get resolvers for the given source type. */ export interface MetaResolver { + /** + * If the source should be cached. + */ + readonly cache: boolean; limitedResolver(source: S): LimitedResolver; resolver(source: S): Resolver; } diff --git a/server/src/ts/games/cards/sources.ts b/server/src/ts/games/cards/sources.ts index 0a84e37..584d743 100644 --- a/server/src/ts/games/cards/sources.ts +++ b/server/src/ts/games/cards/sources.ts @@ -91,10 +91,11 @@ export class Sources { cache: Cache, source: Source.External ): Source.Resolver { - return new Source.CachedResolver( - cache, - this.metaResolver(source).resolver(source) - ); + const metaResolver = this.metaResolver(source); + const resolver = metaResolver.resolver(source); + return metaResolver.cache + ? new Source.CachedResolver(cache, resolver) + : resolver; } /** diff --git a/server/src/ts/games/cards/sources/builtIn.ts b/server/src/ts/games/cards/sources/builtIn.ts index a084cc6..a9749e1 100644 --- a/server/src/ts/games/cards/sources/builtIn.ts +++ b/server/src/ts/games/cards/sources/builtIn.ts @@ -15,6 +15,9 @@ const extension = ".deck.json5"; interface BuiltInDeck { name: string; + language: string; + author: string; + translator?: string; calls: Part[][][]; responses: string[]; } @@ -28,7 +31,13 @@ export interface BuiltIn { } export interface ClientInfo { - decks: { name: string; id: string }[]; + decks: { + name: string; + language: string; + author: string; + translator?: string; + id: string; + }[]; } export class Resolver extends Source.Resolver { @@ -38,16 +47,22 @@ export class Resolver extends Source.Resolver { * Can be undefined because we want to error out later if the deck doesn't exist for nicer errors. */ private readonly storedSummary?: Source.Summary; + /** + * Can be undefined because we want to error out later if the deck doesn't exist for nicer errors. + */ + private readonly storedDeck?: BuiltInDeck; public constructor( config: Config.BuiltIn, source: BuiltIn, - summary?: Source.Summary + summary?: Source.Summary, + deck?: BuiltInDeck ) { super(); this.config = config; this.source = source; this.storedSummary = summary; + this.storedDeck = deck; } public id(): string { @@ -90,22 +105,15 @@ export class Resolver extends Source.Resolver { summary: Source.Summary; templates: Decks.Templates; }> => { - if (this.storedSummary === undefined) { + if (this.storedSummary === undefined || this.storedDeck === undefined) { throw new SourceNotFoundError(this.source); } try { - const rawDeck = JSON5.parse( - ( - await fs.readFile( - path.join(this.config.basePath, this.source.id + extension) - ) - ).toString() - ) as BuiltInDeck; return { summary: this.storedSummary, templates: { - calls: new Set(rawDeck.calls.map(this.call)), - responses: new Set(rawDeck.responses.map(this.response)), + calls: new Set(this.storedDeck.calls.map(this.call)), + responses: new Set(this.storedDeck.responses.map(this.response)), }, }; } catch (error) { @@ -129,13 +137,17 @@ export class Resolver extends Source.Resolver { export class MetaResolver implements Source.MetaResolver { private readonly config: Config.BuiltIn; private readonly summaries: Map; + private readonly decks: Map; + public readonly cache = false; public constructor( config: Config.BuiltIn, - summaries: Map + summaries: Map, + decks: Map ) { this.config = config; this.summaries = summaries; + this.decks = decks; } limitedResolver(source: BuiltIn): Source.LimitedResolver { @@ -144,21 +156,32 @@ export class MetaResolver implements Source.MetaResolver { resolver(source: BuiltIn): Resolver { const summary = this.summaries.get(source.id); - return new Resolver(this.config, source, summary); + const deck = this.decks.get(source.id); + return new Resolver(this.config, source, summary, deck); } public clientInfo(): ClientInfo { return { - decks: this.config.decks.map((id) => ({ - name: (this.summaries.get(id) as Source.Summary).details.name, - id, - })), + decks: this.config.decks.map((id) => { + const deck = this.decks.get(id); + if (deck === undefined) { + throw new Error(`Deck in configuration not found: '${id}'.`); + } + return { + name: deck.name, + author: deck.author, + language: deck.language, + translator: deck.translator, + id, + }; + }), }; } } export async function load(config: Config.BuiltIn): Promise { const summaries = new Map(); + const decks = new Map(); for (const id of config.decks) { const rawDeck = JSON5.parse( @@ -167,11 +190,15 @@ export async function load(config: Config.BuiltIn): Promise { summaries.set(id, { details: { name: rawDeck.name, + author: rawDeck.author, + translator: rawDeck.translator, + language: rawDeck.language, }, calls: rawDeck.calls.length, responses: rawDeck.responses.length, }); + decks.set(id, rawDeck); } - return new MetaResolver(config, summaries); + return new MetaResolver(config, summaries, decks); } diff --git a/server/src/ts/games/cards/sources/cardcast.ts b/server/src/ts/games/cards/sources/cardcast.ts index 04522e0..bc206d2 100644 --- a/server/src/ts/games/cards/sources/cardcast.ts +++ b/server/src/ts/games/cards/sources/cardcast.ts @@ -152,6 +152,7 @@ export class Resolver extends Source.Resolver { details: { name: summary.name, url: humanViewUrl(this.source.playCode), + author: summary.author.username, }, calls: Number.parseInt(summary.call_count, 10), responses: Number.parseInt(summary.response_count, 10), @@ -204,6 +205,7 @@ export class MetaResolver implements Source.MetaResolver { * We pool requests to cardcast to stop us hitting them too hard (on top of caching). */ private readonly connectionPool: genericPool.Pool; + public readonly cache = true; public constructor(config: Config.Cardcast) { const httpConfig: AxiosRequestConfig = { diff --git a/server/src/ts/games/game.ts b/server/src/ts/games/game.ts index 25bbb07..87da0c8 100644 --- a/server/src/ts/games/game.ts +++ b/server/src/ts/games/game.ts @@ -50,7 +50,8 @@ export class Game { decks: Decks.Decks, rules: Rules.Rules, paused = false, - history: PublicRound.Complete[] | undefined = undefined + history: PublicRound.Complete[] | undefined = undefined, + winner: User.Id[] | undefined = undefined ) { this.round = round; this.history = history === undefined ? [] : history; @@ -59,6 +60,7 @@ export class Game { this.decks = decks; this.rules = rules; this.paused = paused; + this.winner = winner; } public toJSON(): object { @@ -70,6 +72,7 @@ export class Game { rules: this.rules, paused: this.paused, history: this.history, + winner: this.winner, }; } @@ -84,7 +87,8 @@ export class Game { }, game.rules, game.paused, - game.history + game.history, + game.winner ); private static activePlayer( diff --git a/server/src/ts/games/game/round.ts b/server/src/ts/games/game/round.ts index 1535393..d5e483c 100644 --- a/server/src/ts/games/game/round.ts +++ b/server/src/ts/games/game/round.ts @@ -66,7 +66,7 @@ export class Complete extends Base<"Complete"> { public readonly czar: Card.Id; public get players(): Set { - return new Set(wu(this.plays).map(play => play.playedBy)); + return new Set(wu(this.plays).map((play) => play.playedBy)); } public readonly call: Card.Call; @@ -101,8 +101,8 @@ export class Complete extends Base<"Complete"> { call: this.call, winner: this.winner, plays: this.playsObj(), - playOrder: this.plays.map(play => play.playedBy), - startedAt: this.startedAt + playOrder: this.plays.map((play) => play.playedBy), + startedAt: this.startedAt, }; } @@ -111,7 +111,9 @@ export class Complete extends Base<"Complete"> { for (const roundPlay of this.plays) { obj[roundPlay.id] = { playedBy: roundPlay.playedBy, - ...(roundPlay.likes.length > 0 ? { likes: roundPlay.likes.length } : {}) + ...(roundPlay.likes.length > 0 + ? { likes: roundPlay.likes.length } + : {}), }; } return obj; @@ -122,7 +124,9 @@ export class Complete extends Base<"Complete"> { for (const roundPlay of this.plays) { obj[roundPlay.playedBy] = { play: roundPlay.play, - ...(roundPlay.likes.length > 0 ? { likes: roundPlay.likes.length } : {}) + ...(roundPlay.likes.length > 0 + ? { likes: roundPlay.likes.length } + : {}), }; } return obj; @@ -135,7 +139,7 @@ export class Complete extends Base<"Complete"> { czar: this.czar, call: this.call, plays: this.plays, - winner: this.winner + winner: this.winner, }; } } @@ -149,7 +153,7 @@ export class Judging extends Base<"Judging"> implements Timed { public readonly czar: Card.Id; public get players(): Set { - return new Set(wu(this.plays).map(play => play.playedBy)); + return new Set(wu(this.plays).map((play) => play.playedBy)); } public readonly call: Card.Call; @@ -188,7 +192,7 @@ export class Judging extends Base<"Judging"> implements Timed { call: this.call, plays: Array.from(this.revealedPlays()), ...(this.timedOut ? { timedOut: true } : {}), - startedAt: this.startedAt + startedAt: this.startedAt, }; } @@ -196,7 +200,7 @@ export class Judging extends Base<"Judging"> implements Timed { for (const roundPlay of this.plays) { yield { id: roundPlay.id, - play: roundPlay.play + play: roundPlay.play, }; } } @@ -208,7 +212,7 @@ export class Judging extends Base<"Judging"> implements Timed { czar: this.czar, call: this.call, plays: this.plays, - timedOut: this.timedOut + timedOut: this.timedOut, }; } } @@ -222,7 +226,7 @@ export class Revealing extends Base<"Revealing"> implements Timed { public readonly czar: Card.Id; public get players(): Set { - return new Set(wu(this.plays).map(play => play.playedBy)); + return new Set(wu(this.plays).map((play) => play.playedBy)); } public readonly call: Card.Call; @@ -265,14 +269,14 @@ export class Revealing extends Base<"Revealing"> implements Timed { call: this.call, plays: Array.from(this.potentiallyRevealedPlays()), ...(this.timedOut ? { timedOut: true } : {}), - startedAt: this.startedAt + startedAt: this.startedAt, }; } private *potentiallyRevealedPlays(): Iterable { for (const roundPlay of this.plays) { const potentiallyRevealed: Play.PotentiallyRevealed = { - id: roundPlay.id + id: roundPlay.id, }; if (roundPlay.revealed) { potentiallyRevealed.play = roundPlay.play; @@ -288,7 +292,7 @@ export class Revealing extends Base<"Revealing"> implements Timed { czar: this.czar, call: this.call, plays: this.plays, - timedOut: this.timedOut + timedOut: this.timedOut, }; } } @@ -333,13 +337,13 @@ export class Playing extends Base<"Playing"> implements Timed { public waitingFor(): Set | null { const done = new Set( - wu(this.players).filter(p => !this.hasPlayed().has(p)) + wu(this.players).filter((p) => !this.hasPlayed().has(p)) ); return done.size > 0 ? done : null; } private hasPlayed(): Set { - return new Set(wu(this.plays).map(play => play.playedBy)); + return new Set(wu(this.plays).map((play) => play.playedBy)); } public public(): PublicRound.Playing { @@ -349,9 +353,9 @@ export class Playing extends Base<"Playing"> implements Timed { czar: this.czar, players: Array.from(this.players), call: this.call, - played: this.plays.map(play => play.playedBy), + played: this.plays.map((play) => play.playedBy), ...(this.timedOut ? { timedOut: true } : {}), - startedAt: this.startedAt + startedAt: this.startedAt, }; } @@ -363,7 +367,7 @@ export class Playing extends Base<"Playing"> implements Timed { players: Array.from(this.players), call: this.call, plays: this.plays, - timedOut: this.timedOut + timedOut: this.timedOut, }; } } diff --git a/server/src/ts/games/player.ts b/server/src/ts/games/player.ts index 1f7eacd..ae4b6ec 100644 --- a/server/src/ts/games/player.ts +++ b/server/src/ts/games/player.ts @@ -49,13 +49,13 @@ export const initial = (hand: Hand): Player => ({ hand: hand, score: 0, likes: 0, - presence: "Active" + presence: "Active", }); export const censor = (player: Player): Public => ({ score: player.score, presence: player.presence, - likes: player.likes + likes: player.likes, }); /** diff --git a/server/src/ts/games/rules/rando.ts b/server/src/ts/games/rules/rando.ts index 292f3c5..63ae452 100644 --- a/server/src/ts/games/rules/rando.ts +++ b/server/src/ts/games/rules/rando.ts @@ -34,7 +34,7 @@ export const aiNames = new Set([ "Skynet", // Terminator "Project 2501", // GITS "SHODAN", // System Shock - "Mr. House" // Fallout: New Vegas + "Mr. House", // Fallout: New Vegas ]); /** @@ -59,7 +59,7 @@ export const create = (): Rando => ({ current: [], unused: [aiName] .concat(Util.shuffled(aiNames).slice(0, max - 1)) - .map(name => ({ name })) + .map((name) => ({ name })), }); /** @@ -91,12 +91,12 @@ export const createIfNeeded = ( if (isId(ai)) { return { user: ai, - events: [Event.targetAll(PresenceChanged.joined(ai, inLobby.users[ai]))] + events: [Event.targetAll(PresenceChanged.joined(ai, inLobby.users[ai]))], }; } else { - return Lobby.addUser(inLobby, ai, user => ({ + return Lobby.addUser(inLobby, ai, (user) => ({ ...user, - control: "Computer" + control: "Computer", })); } }; @@ -119,7 +119,7 @@ export function* change( const toAdd = want - have; const added = config.unused .splice(0, toAdd) - .map(ai => createIfNeeded(inLobby, ai)); + .map((ai) => createIfNeeded(inLobby, ai)); for (const { user, events } of added) { const userData = inLobby.users[user]; userData.presence = "Joined"; diff --git a/server/src/ts/index.ts b/server/src/ts/index.ts index 79b9034..5efe10a 100644 --- a/server/src/ts/index.ts +++ b/server/src/ts/index.ts @@ -101,7 +101,7 @@ async function main(): Promise { }); app.post("/api/alive", async (req, res) => { - const result: { [key: string]: boolean } = {}; + const result: string[] = []; for (const current of CheckAlive.validate(req.body).tokens) { try { const claims = Token.validate( @@ -109,9 +109,11 @@ async function main(): Promise { await state.store.id(), state.config.secret ); - result[current] = await state.store.exists(claims.gc); + if (await state.store.exists(claims.gc)) { + result.push(current); + } } catch (error) { - result[current] = false; + // Ignore. } } res.json(result); diff --git a/server/src/ts/lobby/change.ts b/server/src/ts/lobby/change.ts index f91191c..0a3853d 100644 --- a/server/src/ts/lobby/change.ts +++ b/server/src/ts/lobby/change.ts @@ -58,7 +58,7 @@ export function reduce( ...(lobbyUnchanged ? { lobby: currentLobby } : {}), ...(events.length > 0 ? { events } : {}), ...(timeouts.length > 0 ? { timeouts } : {}), - ...(tasks.length > 0 ? { tasks } : {}) + ...(tasks.length > 0 ? { tasks } : {}), }; } @@ -130,7 +130,7 @@ export async function applyAndReturn( try { const [tasks, returnValue] = await server.store.writeAndReturn( gameCode, - lobby => { + (lobby) => { const { change, returnValue } = handler(lobby); const result = internalApply(server, gameCode, lobby, change); if (result.events !== undefined) { @@ -140,9 +140,9 @@ export async function applyAndReturn( transaction: { lobby: result.lobby, timeouts: result.timeouts, - executedTimeout: timeoutId + executedTimeout: timeoutId, }, - result: [result.tasks, returnValue] + result: [result.tasks, returnValue], }; } ); @@ -155,11 +155,11 @@ export async function applyAndReturn( } catch (error) { // If we get an error we still want to kill the timeout and potentially // tell the user about the error. - await server.store.write(gameCode, lobby => { + await server.store.write(gameCode, (lobby) => { if (error instanceof GameStateError) { lobby.errors.push(error.details()); Event.send(server.socketManager, gameCode, lobby, [ - Event.targetAll(ErrorEncountered.of(error.details())) + Event.targetAll(ErrorEncountered.of(error.details())), ]); } return { lobby, executedTimeout: timeoutId }; @@ -184,9 +184,9 @@ export async function apply( await applyAndReturn( server, gameCode, - lobby => ({ + (lobby) => ({ change: handler(lobby), - returnValue: undefined + returnValue: undefined, }), timeoutId ); diff --git a/server/src/ts/logging.ts b/server/src/ts/logging.ts index 7ab6792..053eca5 100644 --- a/server/src/ts/logging.ts +++ b/server/src/ts/logging.ts @@ -1,12 +1,12 @@ import winston from "winston"; -const logFormat = winston.format.printf(info => { +const logFormat = winston.format.printf((info) => { const stringRest = JSON.stringify( { ...info, level: undefined, message: undefined, - splat: undefined + splat: undefined, }, null, 2 @@ -25,7 +25,7 @@ export const logger = winston.createLogger({ winston.format.timestamp(), winston.format.colorize(), logFormat - ) + ), }); const exceptionHandler = new winston.ExceptionHandler(logger); diff --git a/server/src/ts/socket-manager.ts b/server/src/ts/socket-manager.ts index b80e61d..3117a70 100644 --- a/server/src/ts/socket-manager.ts +++ b/server/src/ts/socket-manager.ts @@ -59,13 +59,15 @@ export class Sockets { public delete(gameCode: GameCode, id: User.Id, socket: WebSocket): boolean { const users = this.users(gameCode); const sockets = users.get(id); - const didDelete = sockets !== undefined ? sockets.delete(socket) : false; - if (didDelete && sockets !== undefined && sockets.size < 1) { - users.delete(id); - if (users.size < 1) { - this.sockets.delete(gameCode); + if (sockets !== undefined) { + sockets.delete(socket); + if (sockets.size < 1) { + users.delete(id); + if (users.size < 1) { + this.sockets.delete(gameCode); + } + return true; } - return true; } return false; } @@ -92,24 +94,28 @@ export class SocketManager { private readonly errorWSHandler = ( socket: WebSocket, fn: (data: WebSocket.Data) => Promise - ): ((data: WebSocket.Data) => Promise) => async data => { + ): ((data: WebSocket.Data) => Promise) => async (data) => { try { return await fn(data); } catch (error) { - const dataDescription = - typeof data === "string" ? data : `(${typeof data})`; - if (error instanceof MassiveDecksError) { - const details = error.details(); - Logging.logger.warn("WebSocket bad request:", { - data: dataDescription, - details, - errorMessage: error.message - }); - socket.send(JSON.stringify(details)); - } else { - Logging.logException("WebSocket error:", error, dataDescription); - socket.send(JSON.stringify({ error: "InternalServerError" })); - socket.close(); + try { + const dataDescription = + typeof data === "string" ? data : `(${typeof data})`; + if (error instanceof MassiveDecksError) { + const details = error.details(); + Logging.logger.warn("WebSocket bad request:", { + data: dataDescription, + details, + errorMessage: error.message, + }); + socket.send(JSON.stringify(details)); + } else { + Logging.logException("WebSocket error:", error, dataDescription); + socket.send(JSON.stringify({ error: "InternalServerError" })); + socket.close(); + } + } catch (error) { + Logging.logException("Error resolving WebSocket error:", error); } return; } @@ -120,7 +126,7 @@ export class SocketManager { let auth: Token.Claims | null = null; socket.on( "message", - this.errorWSHandler(socket, async data => { + this.errorWSHandler(socket, async (data) => { if (typeof data !== "string") { throw new InvalidActionError("Invalid message."); } @@ -130,7 +136,7 @@ export class SocketManager { auth = await Authenticate.handle(server, validated, gameCode); const uid = auth.uid; sockets.add(auth.gc, uid, socket); - await Change.apply(server, auth.gc, lobby => { + await Change.apply(server, auth.gc, (lobby) => { let hand = undefined; let play = undefined; if (lobby.game !== undefined) { @@ -139,10 +145,10 @@ export class SocketManager { hand = player.hand; } const potentialPlay = lobby.game.round.plays.find( - play => play.playedBy === uid + (play) => play.playedBy === uid ); if (potentialPlay !== undefined) { - play = potentialPlay.play.map(card => card.id); + play = potentialPlay.play.map((card) => card.id); } } @@ -154,46 +160,49 @@ export class SocketManager { Event.targetOnly( Sync.of(Lobby.censor(lobby), hand, play), uid - ) - ] + ), + ], }; }); Logging.logger.info("WebSocket connect:", { user: auth.uid, - authenticate: validated + authenticate: validated, }); } else { throw new NotAuthenticatedError(); } } else { const claims = auth; - await Change.apply(server, auth.gc, lobby => + await Change.apply(server, auth.gc, (lobby) => Action.handle(claims, lobby, validated, server) ); Logging.logger.info("WebSocket receive:", { user: auth.uid, - action: validated + action: validated, }); } }) ); - socket.on("close", async () => { - if (auth) { - const uid = auth.uid; - Logging.logger.info("WebSocket disconnect:", { user: auth.uid }); - if (sockets.delete(auth.gc, uid, socket)) { - await Change.apply(server, auth.gc, lobby => ({ - lobby, - timeouts: [ - { - timeout: UserDisconnect.of(uid), - after: server.config.timeouts.disconnectionGracePeriod - } - ] - })); - Logging.logger.info("User disconnect:", { user: auth.uid }); + socket.on( + "close", + this.errorWSHandler(socket, async () => { + if (auth) { + const uid = auth.uid; + Logging.logger.info("WebSocket disconnect:", { user: auth.uid }); + if (sockets.delete(auth.gc, uid, socket)) { + await Change.apply(server, auth.gc, (lobby) => ({ + lobby, + timeouts: [ + { + timeout: UserDisconnect.of(uid), + after: server.config.timeouts.disconnectionGracePeriod, + }, + ], + })); + Logging.logger.info("User disconnect:", { user: auth.uid }); + } } - } - }); + }) + ); } } diff --git a/server/src/ts/store.ts b/server/src/ts/store.ts index 1cb48c6..79c3008 100644 --- a/server/src/ts/store.ts +++ b/server/src/ts/store.ts @@ -84,7 +84,7 @@ export abstract class Store { ): Promise { await this.writeAndReturn(gameCode, (lobby: Lobby.Lobby) => ({ transaction: write(lobby), - result: undefined + result: undefined, })); } diff --git a/server/src/ts/store/in-memory.ts b/server/src/ts/store/in-memory.ts index 793e46a..ae6cbba 100644 --- a/server/src/ts/store/in-memory.ts +++ b/server/src/ts/store/in-memory.ts @@ -11,6 +11,7 @@ import * as Token from "../user/token"; declare module "wu" { // Fix incorrect types. + // noinspection JSUnusedGlobalSymbols interface WuIterable { // eslint-disable-next-line @typescript-eslint/no-explicit-any spreadMap(fn: (...x: any[]) => U): WuIterable; @@ -23,13 +24,18 @@ interface TimeoutMeta { after: number; } +interface LobbyMeta { + lobby: Lobby.Lobby; + lastWrite: number; +} + /** * A store where the data is stored in memory. */ export class InMemoryStore extends Store { public readonly config: ServerConfig.InMemory; private readonly _id: string; - private readonly lobbies: Map; + private readonly lobbies: Map; private readonly timeouts: Map; private nextLobby: number; @@ -50,7 +56,7 @@ export class InMemoryStore extends Store { public async *lobbySummaries(): AsyncIterableIterator { const publicSummaries = wu(this.lobbies.entries()) - .filter(([_, l]) => l.config.public) + .filter(([_, { lobby }]) => lobby.config.public) .spreadMap(Lobby.summary); for (const summary of publicSummaries) { yield summary; @@ -64,7 +70,7 @@ export class InMemoryStore extends Store { const lobby = Lobby.create(creation); const gameCode = GameCode.encode(this.nextLobby); this.nextLobby += 1; - this.lobbies.set(gameCode, lobby); + this.lobbies.set(gameCode, { lobby, lastWrite: Date.now() }); return { gameCode, token: Token.create( @@ -81,7 +87,7 @@ export class InMemoryStore extends Store { private async lobby(gameCode: GameCode.GameCode): Promise { const lobby = this.lobbies.get(gameCode.toUpperCase()); if (lobby !== undefined) { - return lobby; + return lobby.lobby; } else { const lobbyNumber = GameCode.decode(gameCode); if (lobbyNumber < this.nextLobby) { @@ -98,7 +104,10 @@ export class InMemoryStore extends Store { ): Promise { const { transaction, result } = write(await this.lobby(gameCode)); if (transaction.lobby !== undefined) { - this.lobbies.set(gameCode, transaction.lobby); + this.lobbies.set(gameCode, { + lobby: transaction.lobby, + lastWrite: Date.now(), + }); } if (transaction.timeouts !== undefined) { for (const timeout of transaction.timeouts) { @@ -117,8 +126,9 @@ export class InMemoryStore extends Store { public async garbageCollect(): Promise { const toRemove = new Set(); - for (const [gameCode, lobby] of this.lobbies.entries()) { + for (const [gameCode, { lobby, lastWrite }] of this.lobbies.entries()) { if ( + lastWrite + this.config.abandonedTime > Date.now() || wu(Object.values(lobby.users)).every( (u) => u.control === "Computer" || u.presence === "Left" ) diff --git a/server/src/ts/store/postgres.ts b/server/src/ts/store/postgres.ts index b3d673b..c3d07e7 100644 --- a/server/src/ts/store/postgres.ts +++ b/server/src/ts/store/postgres.ts @@ -9,6 +9,7 @@ import * as Store from "../store"; import * as Timeout from "../timeout"; import * as Token from "../user/token"; import * as Postgres from "../util/postgres"; +import * as Logging from "../logging"; class To0 extends Postgres.Upgrade { public readonly to = 0; @@ -22,7 +23,7 @@ class To0 extends Postgres.Upgrade { CREATE TABLE massivedecks.lobbies ( id SERIAL PRIMARY KEY, lobby JSONB NOT NULL, - last_access TIMESTAMP DEFAULT CURRENT_TIMESTAMP + last_access TIMESTAMP DEFAULT NOW() ); `); await client.query(` @@ -80,13 +81,14 @@ export class PostgresStore extends Store.Store { public static async create( config: Config.PostgreSQL ): Promise { - const pg = new Postgres.Postgres("mdcache", config.connection, upgrades); - + const pg = new Postgres.Postgres( + "massivedecks", + config.connection, + upgrades + ); await pg.ensureCurrent(); - return await pg.withClient(async (client) => { const rows = await client.query(`SELECT id FROM massivedecks.meta`); - return new PostgresStore(rows.rows[0]["id"], config, pg); }); } @@ -115,7 +117,7 @@ export class PostgresStore extends Store.Store { "SELECT EXISTS (SELECT id FROM massivedecks.lobbies WHERE id = $1)", [lobbyId] ) - ).rows[0] + ).rows[0].exists ); } @@ -134,8 +136,8 @@ export class PostgresStore extends Store.Store { const result = await client.query( ` DELETE FROM massivedecks.lobbies WHERE - (last_access + $1::interval) < CURRENT_TIMESTAMP OR - (SELECT bool_and(value->>'control' = 'Computer' OR value->>'Presence' = 'Left') FROM jsonb_each(lobby->'users')); + ((last_access + $1::interval ) < NOW()) OR + (SELECT bool_and(value->>'control' = 'Computer' OR value->>'presence' = 'Left') FROM jsonb_each(lobby->'users')); `, [`${this.config.abandonedTime} milliseconds`] ); @@ -144,7 +146,7 @@ export class PostgresStore extends Store.Store { } public async *lobbySummaries(): AsyncIterableIterator { - return this.pg.withClientIterator( + yield* this.pg.withClientIterator( PostgresStore.lobbySummariesInternal.bind(this) ); } @@ -193,14 +195,14 @@ export class PostgresStore extends Store.Store { } public async *timedOut(): AsyncIterableIterator { - return this.pg.withClientIterator(PostgresStore.timedOutInternal); + yield* this.pg.withClientIterator(PostgresStore.timedOutInternal); } private static async *timedOutInternal( client: Pg.PoolClient ): AsyncIterableIterator { const result = await client.query( - "SELECT * FROM massivedecks.timeouts WHERE after < $1", + "SELECT * FROM massivedecks.timeouts WHERE after < $1;", [Date.now()] ); for (const row of result.rows) { @@ -230,7 +232,7 @@ export class PostgresStore extends Store.Store { ); if (transaction.lobby) { await client.query( - "UPDATE massivedecks.lobbies SET lobby=$2, last_access=CURRENT_TIMESTAMP WHERE id = $1;", + "UPDATE massivedecks.lobbies SET lobby=$2, last_access=NOW() WHERE id = $1;", [lobbyId, transaction.lobby] ); } diff --git a/server/src/ts/task.ts b/server/src/ts/task.ts index 13b534e..828763d 100644 --- a/server/src/ts/task.ts +++ b/server/src/ts/task.ts @@ -33,12 +33,12 @@ export abstract class TaskBase implements Task { try { work = await this.begin(server); } catch (error) { - await Change.apply(server, this.gameCode, lobby => + await Change.apply(server, this.gameCode, (lobby) => this.resolveError(lobby, error, server) ); return; } - await Change.apply(server, this.gameCode, lobby => + await Change.apply(server, this.gameCode, (lobby) => this.resolve(lobby, work, server) ); } diff --git a/server/src/ts/task/start-game.ts b/server/src/ts/task/start-game.ts index a76630c..e2f08af 100644 --- a/server/src/ts/task/start-game.ts +++ b/server/src/ts/task/start-game.ts @@ -1,7 +1,6 @@ import wu from "wu"; import * as Decks from "../games/cards/decks"; import * as Source from "../games/cards/source"; -import * as Sources from "../games/cards/sources"; import { Game } from "../games/game"; import { Lobby } from "../lobby"; import { Change } from "../lobby/change"; diff --git a/server/src/ts/task/tasks.ts b/server/src/ts/task/tasks.ts index 07a8d5a..3dbbb7a 100644 --- a/server/src/ts/task/tasks.ts +++ b/server/src/ts/task/tasks.ts @@ -43,7 +43,7 @@ export class Queue { */ public async loadFromStore(server: ServerState): Promise { for await (const { gameCode } of server.store.lobbySummaries()) { - await server.store.read(gameCode, lobby => { + await server.store.read(gameCode, (lobby) => { for (const task of Queue.discover(gameCode, lobby)) { this.enqueue(server, task); } @@ -83,7 +83,7 @@ export class Queue { this.startedThisTick += 1; task .handle(server) - .catch(error => Logging.logException("Error processing task:", error)) + .catch((error) => Logging.logException("Error processing task:", error)) .then(() => Logging.logger.info("Task complete:", { task })); } } diff --git a/server/src/ts/timeout.ts b/server/src/ts/timeout.ts index bdc8f3f..d9d4f9f 100644 --- a/server/src/ts/timeout.ts +++ b/server/src/ts/timeout.ts @@ -57,7 +57,7 @@ export async function handle(server: ServerState): Promise { await Change.apply( server, lobby, - lobbyState => handler(server, timeout, lobby, lobbyState), + (lobbyState) => handler(server, timeout, lobby, lobbyState), id ); } diff --git a/server/src/ts/timeout/round-stage-timer-done.ts b/server/src/ts/timeout/round-stage-timer-done.ts index d0d2727..349eccd 100644 --- a/server/src/ts/timeout/round-stage-timer-done.ts +++ b/server/src/ts/timeout/round-stage-timer-done.ts @@ -60,9 +60,9 @@ export const ifEnabled = ( timeout: { timeout: "RoundStageTimerDone", round: round.id, - stage: round.stage + stage: round.stage, }, - after: afterSeconds * 1000 + after: afterSeconds * 1000, }; }; @@ -95,8 +95,8 @@ export const handle: Timeout.Handler = ( case "Soft": return { events: [ - Event.targetAll(StageTimerDone.of(timeout.round, timeout.stage)) - ] + Event.targetAll(StageTimerDone.of(timeout.round, timeout.stage)), + ], }; case "Hard": return Change.reduce(waitingFor, lobby as Lobby.WithActiveGame, (l, p) => diff --git a/server/src/ts/timeout/round-start.ts b/server/src/ts/timeout/round-start.ts index 7825ee5..a7f6727 100644 --- a/server/src/ts/timeout/round-start.ts +++ b/server/src/ts/timeout/round-start.ts @@ -11,7 +11,7 @@ export interface RoundStart { } export const of = (): RoundStart => ({ - timeout: "RoundStart" + timeout: "RoundStart", }); export const handle: Timeout.Handler = ( @@ -44,7 +44,7 @@ export const handle: Timeout.Handler = ( return { inLobby, - events + events, }; } } @@ -53,7 +53,7 @@ export const handle: Timeout.Handler = ( const result = lobbyGame.startNewRound(server, inLobby); return { lobby: inLobby, - ...result + ...result, }; } } diff --git a/server/src/ts/timeout/user-disconnect.ts b/server/src/ts/timeout/user-disconnect.ts index ccee942..08b2665 100644 --- a/server/src/ts/timeout/user-disconnect.ts +++ b/server/src/ts/timeout/user-disconnect.ts @@ -2,6 +2,7 @@ import * as Event from "../event"; import * as ConnectionChanged from "../events/lobby-event/connection-changed"; import * as Timeout from "../timeout"; import * as User from "../user"; +import wu from "wu"; /** * Indicates that the user should be marked as disconnected if they still are. @@ -13,7 +14,7 @@ export interface UserDisconnect { export const of = (user: User.Id): UserDisconnect => ({ timeout: "UserDisconnect", - user + user, }); export const handle: Timeout.Handler = ( @@ -23,8 +24,8 @@ export const handle: Timeout.Handler = ( lobby ) => { const id = timeout.user; - const socket = server.socketManager.sockets.get(gameCode, id); - if (socket === undefined) { + const sockets = server.socketManager.sockets.get(gameCode, id); + if (!wu(sockets).some(() => true)) { const userData = lobby.users[id]; if (userData === undefined) { throw new Error("Player not in lobby."); @@ -37,7 +38,7 @@ export const handle: Timeout.Handler = ( : []; return { lobby, - events + events, }; } } diff --git a/server/src/ts/user.ts b/server/src/ts/user.ts index 47d5242..d5a5390 100644 --- a/server/src/ts/user.ts +++ b/server/src/ts/user.ts @@ -62,13 +62,13 @@ export type Control = "Human" | "Computer"; /** * If the user is playing. */ -export const isPlaying: (user: User) => boolean = user => +export const isPlaying: (user: User) => boolean = (user) => user.role === "Player"; /** * If the user is spectating. */ -export const isSpectating: (user: User) => boolean = user => +export const isSpectating: (user: User) => boolean = (user) => user.role === "Spectator"; /** @@ -85,12 +85,12 @@ export const create = ( connection: "Connected", privilege: privilege, control: "Human", - role: "Player" + role: "Player", }); /** * Gives a version of the user with only publicly visible properties. */ -export const censor: (user: User) => Public = user => ({ - ...user +export const censor: (user: User) => Public = (user) => ({ + ...user, }); diff --git a/server/src/ts/user/token.ts b/server/src/ts/user/token.ts index f56c15a..7823d45 100644 --- a/server/src/ts/user/token.ts +++ b/server/src/ts/user/token.ts @@ -1,7 +1,7 @@ import jwt from "jsonwebtoken"; import { IncorrectIssuerError, - InvalidAuthenticationError + InvalidAuthenticationError, } from "../errors/authentication"; import { GameCode } from "../lobby/game-code"; import * as User from "../user"; @@ -48,7 +48,7 @@ export function validate(token: Token, issuer: string, secret: string): Claims { try { return jwt.verify(token, secret, { algorithms: ["HS256"], - issuer: issuer + issuer: issuer, }) as Claims; } catch (error) { if (error.hasOwnProperty("name") && error.name === "JsonWebTokenError") { diff --git a/server/src/ts/util/postgres.ts b/server/src/ts/util/postgres.ts index 7ef39b7..1d5a28c 100644 --- a/server/src/ts/util/postgres.ts +++ b/server/src/ts/util/postgres.ts @@ -1,4 +1,5 @@ import Pg from "pg"; +import * as Logging from "../logging"; /** * A version for the database. Undefined if none exists. @@ -32,14 +33,22 @@ export class Postgres { * Ensure the database is set up for the current version. */ public async ensureCurrent(): Promise { - await this.inTransaction(async client => { + await this.inTransaction(async (client) => { let version = await this.findVersion(client); while (true) { const upgrade = this.upgrades(version); if (upgrade === undefined) { return; } + const oldVersion = version; version = await upgrade.apply(client); + if (oldVersion == undefined) { + Logging.logger.info(`Created '${this.schema}' at '${version}'`); + } else { + Logging.logger.info( + `Upgraded '${this.schema}' from '${oldVersion}' to '${version}'.` + ); + } } }); } @@ -68,7 +77,7 @@ export class Postgres { ): AsyncIterableIterator { const client = await this.pool.connect(); try { - return await f(client); + yield* await f(client); } finally { client.release(); } @@ -82,7 +91,7 @@ export class Postgres { public async inTransaction( f: (client: Pg.PoolClient) => Promise ): Promise { - return await this.withClient(async client => { + return await this.withClient(async (client) => { await client.query("BEGIN;"); try { const result = await f(client); diff --git a/server/tsconfig.json b/server/tsconfig.json index 018041e..428097c 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,7 +1,5 @@ { - "include": [ - "./src/ts/**/*" - ], + "include": ["./src/ts/**/*"], "compilerOptions": { "target": "esnext", "module": "esnext",