diff --git a/.circleci/config.yml b/.circleci/config.yml index a03523696..19d8fc91a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -44,6 +44,7 @@ jobs: - run: patch -p1 < ./resources/macos/macPackager-patch.diff - run: patch -p1 < ./resources/macos/scheme-patch.diff - run: make build + - run: make lint - run: make test - persist_to_workspace: root: ~/simplenote diff --git a/.eslintrc.json b/.eslintrc.json index 5dd760c83..62e348895 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,5 @@ { - "parser": "babel-eslint", + "parser": "@typescript-eslint/parser", "env": { "browser": true, "es6": true, @@ -16,12 +16,19 @@ }, "extends": [ "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", "plugin:jest/recommended", "plugin:react/recommended", "prettier", "prettier/react" ], - "plugins": ["eslint-plugin-react", "jest", "prettier"], + "plugins": [ + "@typescript-eslint", + "eslint-plugin-react", + "jest", + "prettier", + "react-hooks" + ], "rules": { "eqeqeq": ["error", "always"], "no-console": "warn", @@ -39,12 +46,20 @@ "react/display-name": "warn", "react/no-deprecated": "warn", "react/no-string-refs": "warn", - "react/prop-types": "warn", + "react/prop-types": "off", "vars-on-top": "error" }, "settings": { "react": { "version": "detect" } - } + }, + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "rules": { + "no-unused-vars": "off" + } + } + ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 7ad92d5e2..473f63e97 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,14 +1,16 @@ { "version": "0.2.0", - "configurations": [{ - "name": "Debug Main Process", - "type": "node", - "request": "launch", - "cwd": "${workspaceRoot}", - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", - "windows": { - "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd" - }, - "args": ["."] - }] -} \ No newline at end of file + "configurations": [ + { + "name": "Debug Main Process", + "type": "node", + "request": "launch", + "cwd": "${workspaceRoot}", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", + "windows": { + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd" + }, + "args": ["."] + } + ] +} diff --git a/Makefile b/Makefile index 3c2d74da4..70b3ad2e4 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ RED=`tput setaf 1` RESET=`tput sgr0` SIMPLENOTE_JS := $(THIS_DIR)/dist/app.js -SIMPLENOTE_CHANGES_STD := `find "$(THIS_DIR)" -newer "$(SIMPLENOTE_JS)" \( -name "*.js" -o -name "*.jsx" -o -name "*.json" -o -name "*.scss" \) -type f -print -quit | grep -v .min. | wc -l` +SIMPLENOTE_CHANGES_STD := `find "$(THIS_DIR)" -newer "$(SIMPLENOTE_JS)" \( -name "*.js" -o -name "*.jsx" -o -name "*.json" -o -name "*.scss" -o -name "*.ts" -o -name "*.tsx" \) -type f -print -quit | grep -v .min. | wc -l` SIMPLENOTE_BRANCH = $(shell git --git-dir .git branch | sed -n -e 's/^\* \(.*\)/\1/p') @@ -53,7 +53,7 @@ start: rebuild-deps @NODE_ENV=$(NODE_ENV) DEV_SERVER=$(DEV_SERVER) npx electron . .PHONY: dev -dev: +dev: @npx misty .PHONY: dev-server @@ -63,8 +63,8 @@ dev-server: @NODE_ENV=$(NODE_ENV) npx webpack-dev-server --config ./webpack.config.js --content-base dist --host $(HOST) --port $(PORT) --hot .PHONY: test -test: - @npx jest +test: + @npx jest --config=./jest.config.js # Build web app @@ -84,37 +84,37 @@ endif # Build utils .PHONY: build-app -build-app: +build-app: @NODE_ENV=$(NODE_ENV) npx webpack $(if $(IS_PRODUCTION),-p) --config ./webpack.config.js -.PHONY: build-if-not-exists +.PHONY: build-if-not-exists build-if-not-exists: config.json @if [ -f $(SIMPLENOTE_JS) ]; then true; else make build; fi -.PHONY: build-if-changed +.PHONY: build-if-changed build-if-changed: build-if-not-exists @if [ $(SIMPLENOTE_CHANGES_STD) -eq 0 ]; then true; else make build; fi; # Build binaries only -.PHONY: osx +.PHONY: osx osx: config-release build-if-changed @npx electron-builder -m --dir -.PHONY: linux +.PHONY: linux linux: config-release build-if-changed @npx electron-builder -l --dir -.PHONY: win32 +.PHONY: win32 win32: config-release build-if-changed @npx electron-builder -w --dir -# Build installers -.PHONY: package +# Build installers +.PHONY: package package: build-if-changed -.PHONY: package-win32 +.PHONY: package-win32 package-win32: ifeq ($(IS_WINDOWS),true) @echo Building .appx as well @@ -124,7 +124,7 @@ else @npx electron-builder --win -p $(PUBLISH) endif -.PHONY: package-osx +.PHONY: package-osx package-osx: build-if-changed @npx electron-builder --mac "dmg" -p $(PUBLISH) @@ -134,7 +134,7 @@ package-linux: build-if-changed # NPM -.PHONY: +.PHONY: install: node_modules node_modules/%: @@ -153,7 +153,7 @@ ifeq (,$(wildcard $(THIS_DIR)$/config.json)) endif -# Utils +# Utils .PHONY: config-release config-release: config.json install @@ -163,8 +163,8 @@ rebuild-deps: .PHONY: format format: - @npx prettier --write {desktop,lib,sass}/{**/,*}.{js,json,jsx,sass} + @npx prettier --ignore-path .gitignore --write "**/*.{js,jsx,json,sass,ts,tsx}" .PHONY: lint lint: - @npx eslint --ext .js --ext .jsx lib \ No newline at end of file + @npx eslint --ignore-path .gitignore "**/*.{js,jsx,ts,tsx}" diff --git a/README.md b/README.md index 77be9d855..848109240 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,15 @@ _Note: Simplenote API features such as sharing and publishing will not work with - **`make package-win32`** - **`make package-linux`** +## Testing + +Unit tests are run with `npm test`. + +End-to-end tests are run with `npm run test-e2e`. +Note that the `Spectron` version corresponds with the version of `Electron` we are using and so at the time of writing this is pinned at version 6. +Use the corresponding API docs for `webdriver-io` which correspond to the `Specron` version. +At the time of writing you will want to refer to the [webdriver-io v4.13 API docs](http://v4.webdriver.io/v4.13/api.html). + ## Coding Guidelines Please adhere to the same guidelines as found in [wp-calypso](https://github.com/Automattic/wp-calypso/blob/master/docs/coding-guidelines.md). @@ -32,6 +41,7 @@ Please adhere to the same guidelines as found in [wp-calypso](https://github.com - [Electron](https://electronjs.org/) for wrapping the JavaScript application. ## Simplenote for Other Platforms + [simplenote-electron](https://github.com/Automattic/simplenote-electron) is the official Simplenote desktop app for Windows and Linux. For other platforms, see: diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 7a8f47abc..028568d86 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,58 @@ # Changelog +## [v1.14.0] + +### Enhancements +- Keep note open when transitioning to small screen in focus mode [#1763](https://github.com/Automattic/simplenote-electron/pull/1763) +- Added GenericName (description) field for app on Linux [#1761](https://github.com/Automattic/simplenote-electron/pull/1761) +- Allow width attribute on img tags [#1833](https://github.com/Automattic/simplenote-electron/pull/1833) + +### Fixes +- Makes settings scrollable on shorter smaller view ports [#1767](https://github.com/Automattic/simplenote-electron/pull/1767) +- After selecting a revision to restore ensure that choice is sync'd [#1774](https://github.com/Automattic/simplenote-electron/pull/1774) +- Added indication that publish url has been copied [#1743](https://github.com/Automattic/simplenote-electron/pull/1743) +- Disallow partial emails and user's own email from being adding to collaborators email field [#1735](https://github.com/Automattic/simplenote-electron/pull/1735) +- Fixed keyboard shortcut to toggle markdown preview [#1788](https://github.com/Automattic/simplenote-electron/pull/1788) +- Fixed an issue where typing a comma in the tag input would insert an empty tag [#1798](https://github.com/Automattic/simplenote-electron/pull/1798) +- When system theme is selected in Settings, changing the system theme is now immediately reflected in the app [#1801](https://github.com/Automattic/simplenote-electron/pull/1801) +- Show all checkboxes and search results in note list [#1814](https://github.com/Automattic/simplenote-electron/pull/1814) +- Fix ol numbering in markdown preview [#1823](https://github.com/Automattic/simplenote-electron/pull/1823) +- Prevents weird effects in live previews due to incomplete input [#1822](https://github.com/Automattic/simplenote-electron/pull/1822) +- Fixed a bug where searching for a tag containing non-alphanumeric characters erroneously returned no notes [#1828](https://github.com/Automattic/simplenote-electron/pull/1828) +- Properly close revision/history view when clicking outside of slider [#1837](https://github.com/Automattic/simplenote-electron/pull/1837) + +### Other Changes + +- Updated dependencies [#1759](https://github.com/Automattic/simplenote-electron/pull/1759) +- Applied prettier formatting to all files [#1780](https://github.com/Automattic/simplenote-electron/pull/1780) +- Delete unused tab restriction util [#1783](https://github.com/Automattic/simplenote-electron/pull/1783) +- Migrate TransitionDelayEnter to React hooks [#1784](https://github.com/Automattic/simplenote-electron/pull/1784) +- Added git hooks to run format, lints, and tests [#1790](https://github.com/Automattic/simplenote-electron/pull/1790) +- Added React Hooks ESLint Plugin [#1789](https://github.com/Automattic/simplenote-electron/pull/1789) +- Added end-to-end testing with Spectron [#1773](https://github.com/Automattic/simplenote-electron/pull/1773) +- Removed a workaround for indexing note pinned status [#1795](https://github.com/Automattic/simplenote-electron/pull/1795) +- Maintenance cleanups [#1796](https://github.com/Automattic/simplenote-electron/pull/1796), [#1797](https://github.com/Automattic/simplenote-electron/pull/1797), [#1808](https://github.com/Automattic/simplenote-electron/pull/1808), [#1809](https://github.com/Automattic/simplenote-electron/pull/1809), [#1810](https://github.com/Automattic/simplenote-electron/pull/1810), [#1811](https://github.com/Automattic/simplenote-electron/pull/1811) +- Updated dependencies [#1802](https://github.com/Automattic/simplenote-electron/pull/1802) +- Updated dependencies [#1821](https://github.com/Automattic/simplenote-electron/pull/1821) +- Fixed build warning [#1806](https://github.com/Automattic/simplenote-electron/pull/1806) +- Refactor how notes are filtered for better performance and maintainability [#1812](https://github.com/Automattic/simplenote-electron/pull/1812) + +## [v1.13.0] + +### Enhancements + +- Added matching tags to the notes list on search [#1648](https://github.com/Automattic/simplenote-electron/pull/1648) + +### Fixes + +- Revision selector is now usable without dragging the entire window [#1741](https://github.com/Automattic/simplenote-electron/pull/1741) +- Only display view settings when coming from the old web app [#1736](https://github.com/Automattic/simplenote-electron/pull/1736) +- Fixed a bug where initial "s" was getting removed from note titles in preview [#1748](https://github.com/Automattic/simplenote-electron/pull/1748) + +### Other Changes + +- Updated dependencies [#1738](https://github.com/Automattic/simplenote-electron/pull/1738) + ## [v1.12.0] ### Enhancements diff --git a/after_sign_hook.js b/after_sign_hook.js index a2d78ecab..35f11b942 100644 --- a/after_sign_hook.js +++ b/after_sign_hook.js @@ -9,7 +9,7 @@ module.exports = async function(params) { } if (!process.env.CIRCLE_TAG || process.env.CIRCLE_TAG.length === 0) { - console.log('Not on a tag. Skipping notarization'); + console.log('Not on a tag. Skipping notarization'); // eslint-disable-line no-console return; } @@ -27,7 +27,7 @@ module.exports = async function(params) { throw new Error(`Cannot find application at: ${appPath}`); } - console.log(`Notarizing ${appId} found at ${appPath}`); + console.log(`Notarizing ${appId} found at ${appPath}`); // eslint-disable-line no-console try { await electron_notarize.notarize({ @@ -38,8 +38,8 @@ module.exports = async function(params) { ascProvider: 'AutomatticInc', }); } catch (error) { - console.error(error); + console.error(error); // eslint-disable-line no-console } - console.log(`Done notarizing ${appId}`); + console.log(`Done notarizing ${appId}`); // eslint-disable-line no-console }; diff --git a/appveyor.yml b/appveyor.yml index 084bd9b7e..22a31f325 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,7 @@ environment: CSC_KEY_PASSWORD: secure: Sz53shy7P4kPzBKa9shHTw== GH_TOKEN: - secure: rgCznyrNnbERL0+MFoT/48TazSzqodduLapcquSs2D3hidBCwjbaOUkE9wXIi3WG + secure: YT95oZAVxC7cDNT/XzUpN8fDwfysXTKETux44ta/sfm7gAo/Wghm1ZWCElNqvAKx APPVEYOR_RDP_PASSWORD: secure: G+yYok+QzBzcrkdhtx+UC4vjyU0kSlWRQ+l+iooLV7o= CSC_LINK: .\resources\certificates\win.p12 @@ -17,7 +17,7 @@ configuration: - AppX-Testing install: - - ps: Install-Product node 10 + - ps: Install-Product node 11.15.0 - cinst make - npm ci - patch -p1 < ./resources/macos/macPackager-patch.diff @@ -75,4 +75,4 @@ cache: # RDP Debug mode # on_finish: -# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) \ No newline at end of file +# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) diff --git a/babel.config.js b/babel.config.js index e14941be6..1e0984cf1 100644 --- a/babel.config.js +++ b/babel.config.js @@ -10,6 +10,7 @@ module.exports = function(api) { }, ], '@babel/preset-react', + '@babel/typescript', ]; const plugins = [ '@babel/plugin-proposal-class-properties', @@ -17,6 +18,9 @@ module.exports = function(api) { '@babel/plugin-syntax-dynamic-import', ]; const env = { + development: { + compact: false, + }, test: { plugins: ['dynamic-import-node'], }, diff --git a/desktop/app.js b/desktop/app.js index b0d222e7d..5cf777986 100644 --- a/desktop/app.js +++ b/desktop/app.js @@ -73,7 +73,10 @@ module.exports = function main() { mainWindow.loadUrl(url); } - if (isDev || process.argv.includes('--devtools')) { + if ( + 'test' !== process.env.NODE_ENV && + (isDev || process.argv.includes('--devtools')) + ) { mainWindow.openDevTools({ mode: 'detach' }); } diff --git a/desktop/index.js b/desktop/index.js index 3f416f7db..0d533ec16 100644 --- a/desktop/index.js +++ b/desktop/index.js @@ -1 +1 @@ -var app = require('./app')(); +require('./app')(); diff --git a/desktop/updater/lib/Updater.js b/desktop/updater/lib/Updater.js index fe0ca5eb9..eac826cea 100644 --- a/desktop/updater/lib/Updater.js +++ b/desktop/updater/lib/Updater.js @@ -21,7 +21,7 @@ class Updater extends EventEmitter { ping() {} onDownloaded(event) { - console.log('Update downloaded'); + console.log('Update downloaded'); // eslint-disable-line no-console // electron-updater provides us with new version if (event.version) { @@ -32,11 +32,11 @@ class Updater extends EventEmitter { } onNotAvailable() { - console.log('Update is not available'); + console.log('Update is not available'); // eslint-disable-line no-console } onError(event) { - console.log('Update error', event); + console.log('Update error', event); // eslint-disable-line no-console } onConfirm() {} @@ -94,7 +94,7 @@ class Updater extends EventEmitter { let text = originalText; for (const key in macros) { - if (macros.hasOwnProperty(key)) { + if (Object.prototype.hasOwnProperty.call(macros, key)) { text = text.replace(new RegExp(`{${key}}`, 'ig'), macros[key]); } } diff --git a/desktop/updater/manual-updater/index.js b/desktop/updater/manual-updater/index.js index ad994e8cf..7aef6d237 100644 --- a/desktop/updater/manual-updater/index.js +++ b/desktop/updater/manual-updater/index.js @@ -41,7 +41,7 @@ class ManualUpdater extends Updater { if (releaseResp.status !== 200) { this.emit('error'); - console.log(releaseResp); + console.log(releaseResp); // eslint-disable-line no-console return; } @@ -58,7 +58,7 @@ class ManualUpdater extends Updater { if (configResp.status !== 200) { this.emit('error'); - console.log(configResp); + console.log(configResp); // eslint-disable-line no-console return; } @@ -66,6 +66,7 @@ class ManualUpdater extends Updater { const releaseConfig = yaml.safeLoad(configBody); if (semver.lt(app.getVersion(), releaseConfig.version)) { + // eslint-disable-next-line no-console console.log( 'New update is available, prompting user to update to', releaseConfig.version @@ -79,7 +80,7 @@ class ManualUpdater extends Updater { } } catch (err) { this.emit('error'); - console.log(err.message); + console.log(err.message); // eslint-disable-line no-console } } diff --git a/e2e/test.ts b/e2e/test.ts new file mode 100644 index 000000000..6025078ab --- /dev/null +++ b/e2e/test.ts @@ -0,0 +1,46 @@ +import 'regenerator-runtime/runtime'; +import path from 'path'; +import rimraf from 'rimraf'; +import { Application } from 'spectron'; + +const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); + +const app: Application = new Application({ + path: path.join(__dirname, '../node_modules/.bin/electron'), + args: [path.join(__dirname, '..')], +}); + +beforeAll(async () => { + await app.start(); + const userData = await app.electron.remote.app.getPath('userData'); + await app.stop(); + await new Promise(resolve => rimraf(userData, () => resolve())); + await app.start(); +}, 10000); + +afterAll(async () => app && app.isRunning() && (await app.stop())); + +describe('E2E', () => { + test('starts', async () => { + await app.client.waitUntilWindowLoaded(); + expect(app.isRunning()).toEqual(true); + }); + + test('logs in', async () => { + await app.client.waitUntilWindowLoaded(); + + app.client + .$('#login__field-username') + .setValue(process.env.TEST_USERNAME as string); + app.client + .$('#login__field-password') + .setValue(process.env.TEST_PASSWORD as string); + + await wait(500); + + app.client.$('#login__login-button').click(); + + await app.client.waitUntilWindowLoaded(); + await app.client.waitForExist('.note-list', 10000); + }, 20000); +}); diff --git a/electron-builder.json b/electron-builder.json index 1b8880b03..92798d4c4 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -5,11 +5,7 @@ "output": "release", "buildResources": "resources" }, - "files": [ - "desktop", - "dist", - "shared" - ], + "files": ["desktop", "dist", "shared"], "mac": { "icon": "./resources/images/app-icon.icns", "category": "public.app-category.social-networking", @@ -24,7 +20,8 @@ "icon": "./resources/images/dmg-icon.icns", "iconSize": 150, "background": "./resources/images/dmg-background.png", - "contents": [{ + "contents": [ + { "x": 480, "y": 240, "type": "link", @@ -40,12 +37,10 @@ "win": { "icon": "resources/images/simplenote.ico", "artifactName": "Simplenote-win-${version}-${arch}.${ext}", - "target": [{ + "target": [ + { "target": "nsis", - "arch": [ - "ia32", - "x64" - ] + "arch": ["ia32", "x64"] } ] }, @@ -60,31 +55,19 @@ "target": [ { "target": "AppImage", - "arch": [ - "x64", - "ia32" - ] + "arch": ["x64", "ia32"] }, { "target": "deb", - "arch": [ - "x64", - "ia32" - ] + "arch": ["x64", "ia32"] }, { "target": "rpm", - "arch": [ - "x64", - "ia32" - ] + "arch": ["x64", "ia32"] }, { "target": "tar.gz", - "arch": [ - "x64", - "ia32" - ] + "arch": ["x64", "ia32"] } ], "synopsis": "The simplest way to keep notes", @@ -93,6 +76,7 @@ "desktop": { "Name": "Simplenote", "Comment": "Simplenote for Linux", + "GenericName": "Note Taking Application", "Type": "Application", "Icon": "simplenote", "StartupNotify": "true", diff --git a/get-config.js b/get-config.js index 51e03caa5..0bd0c3497 100644 --- a/get-config.js +++ b/get-config.js @@ -18,6 +18,7 @@ function readConfig() { } return config; } catch (e) { + // eslint-disable-next-line no-console console.error( 'Could not read in the required configuration file.\n' + 'This file should exist as `config.json` inside the project root directory.\n' + diff --git a/jest.config.e2e.js b/jest.config.e2e.js new file mode 100644 index 000000000..20b714bcc --- /dev/null +++ b/jest.config.e2e.js @@ -0,0 +1,9 @@ +module.exports = { + globals: { + config: { + appVersion: 'foo', + }, + }, + roots: ['e2e'], + testRegex: '(/.*\\.[jt]sx?)|(test\\.[jt]sx?)$', +}; diff --git a/jest.config.js b/jest.config.js index 93e8fc8e2..6e3ed76db 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,10 +1,10 @@ module.exports = { - setupFilesAfterEnv: ['./setup-tests.js'], + setupFilesAfterEnv: ['/setup-tests.js'], globals: { config: { appVersion: 'foo', }, }, roots: ['desktop', 'lib'], - testRegex: '(/test/.*\\.jsx?)|(test\\.jsx?)$', + testRegex: '(/test/.*\\.[jt]sx?)|(test\\.[jt]sx?)$', }; diff --git a/lib/analytics/index.js b/lib/analytics/index.ts similarity index 100% rename from lib/analytics/index.js rename to lib/analytics/index.ts diff --git a/lib/analytics/test.js b/lib/analytics/test.ts similarity index 100% rename from lib/analytics/test.js rename to lib/analytics/test.ts diff --git a/lib/analytics/tracks.js b/lib/analytics/tracks.ts similarity index 100% rename from lib/analytics/tracks.js rename to lib/analytics/tracks.ts diff --git a/lib/app-layout/index.js b/lib/app-layout/index.tsx similarity index 80% rename from lib/app-layout/index.js rename to lib/app-layout/index.tsx index 329aedbe2..1327636bf 100644 --- a/lib/app-layout/index.js +++ b/lib/app-layout/index.tsx @@ -1,5 +1,4 @@ -import React, { Suspense } from 'react'; -import PropTypes from 'prop-types'; +import React, { FunctionComponent, Suspense } from 'react'; import classNames from 'classnames'; import { get } from 'lodash'; @@ -10,6 +9,8 @@ import SearchBar from '../search-bar'; import SimplenoteCompactLogo from '../icons/simplenote-compact'; import TransitionDelayEnter from '../components/transition-delay-enter'; +import { NoteEntity } from '../types'; + const NoteList = React.lazy(() => import(/* webpackChunkName: 'note-list' */ '../note-list') ); @@ -18,7 +19,22 @@ const NoteEditor = React.lazy(() => import(/* webpackChunkName: 'note-editor' */ '../note-editor') ); -export const AppLayout = ({ +type Props = { + isFocusMode: boolean; + isNavigationOpen: boolean; + isNoteInfoOpen: boolean; + isNoteOpen: boolean; + isSmallScreen: boolean; + note: NoteEntity; + noteBucket: object; + revisions: NoteEntity[]; + onNoteClosed: Function; + onNoteOpened: Function; + onUpdateContent: Function; + syncNote: Function; +}; + +export const AppLayout: FunctionComponent = ({ isFocusMode = false, isNavigationOpen, isNoteInfoOpen, @@ -86,19 +102,4 @@ export const AppLayout = ({ ); }; -AppLayout.propTypes = { - isFocusMode: PropTypes.bool, - isNavigationOpen: PropTypes.bool.isRequired, - isNoteInfoOpen: PropTypes.bool.isRequired, - isNoteOpen: PropTypes.bool.isRequired, - isSmallScreen: PropTypes.bool.isRequired, - note: PropTypes.object, - noteBucket: PropTypes.object.isRequired, - revisions: PropTypes.array, - onNoteClosed: PropTypes.func.isRequired, - onNoteOpened: PropTypes.func.isRequired, - onUpdateContent: PropTypes.func.isRequired, - syncNote: PropTypes.func.isRequired, -}; - export default AppLayout; diff --git a/lib/app-layout/style.scss b/lib/app-layout/style.scss index c51b3afdf..c3f6e5576 100644 --- a/lib/app-layout/style.scss +++ b/lib/app-layout/style.scss @@ -3,16 +3,27 @@ flex: 1 0 auto; width: 100%; - &.is-focus-mode.is-note-open { + &.is-focus-mode { .app-layout__source-column { overflow: hidden; opacity: $fade-alpha; width: 0; - transition: width .2s ease-in-out, opacity .2s ease-in-out; + transition: width 0.2s ease-in-out, opacity 0.2s ease-in-out; } .app-layout__note-column { border-left-width: 0px; - transition: border-left-width .2s; + transition: border-left-width 0.2s; + } + + @media only screen and (max-width: $single-column) { + .app-layout__source-column { + overflow: inherit; + opacity: 1; + width: inherit; + } + .app-layout__note-column { + transition: inherit; + } } } @@ -43,7 +54,7 @@ &.is-note-open { .app-layout__source-column { - transition: opacity .2s ease-in-out; + transition: opacity 0.2s ease-in-out; } @media only screen and (max-width: $single-column) { diff --git a/lib/app.test.js b/lib/app.test.js deleted file mode 100644 index df4a84fcf..000000000 --- a/lib/app.test.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; - -import App from './app'; - -describe('App', () => { - it('should render', () => { - const app = shallow(); - expect(app.exists()).toBe(true); - }); -}); diff --git a/lib/app.test.tsx b/lib/app.test.tsx new file mode 100644 index 000000000..199daa643 --- /dev/null +++ b/lib/app.test.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import App from './app'; + +window.matchMedia = jest.fn().mockImplementation(query => { + return { + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // deprecated + removeListener: jest.fn(), // deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + }; +}); + +describe('App', () => { + it('should render', () => { + const app = shallow(); + expect(app.exists()).toBe(true); + }); +}); diff --git a/lib/app.jsx b/lib/app.tsx similarity index 93% rename from lib/app.jsx rename to lib/app.tsx index 8f68ba854..0083a4447 100644 --- a/lib/app.jsx +++ b/lib/app.tsx @@ -33,8 +33,6 @@ import { import * as settingsActions from './state/settings/actions'; -import filterNotes from './utils/filter-notes'; - const ipc = getIpcRenderer(); const mapStateToProps = state => ({ @@ -123,6 +121,7 @@ export const App = connect( preferencesBucket: PropTypes.object.isRequired, resetAuth: PropTypes.func.isRequired, setAuthorized: PropTypes.func.isRequired, + systemTheme: PropTypes.string.isRequired, tagBucket: PropTypes.object.isRequired, }; @@ -208,7 +207,10 @@ export const App = connect( if (isSmallScreen !== prevProps.isSmallScreen) { this.setState({ - isNoteOpen: Boolean(!isSmallScreen && this.props.appState.note), + isNoteOpen: Boolean( + this.props.appState.note && + (settings.focusModeEnabled || !isSmallScreen) + ), }); } } @@ -311,16 +313,12 @@ export const App = connect( preferencesBucket: this.props.preferencesBucket, }); - getSystemColorMode = () => - window.matchMedia('(prefers-color-scheme: dark)').matches - ? 'dark' - : 'light'; - getTheme = () => { const { settings: { theme }, + systemTheme, } = this.props; - return 'system' === theme ? this.getSystemColorMode() : theme; + return 'system' === theme ? systemTheme : theme; }; initializeElectron = () => { @@ -334,7 +332,7 @@ export const App = connect( }); }; - onUpdateContent = (note, content) => { + onUpdateContent = (note, content, sync = false) => { if (!note) { return; } @@ -348,13 +346,11 @@ export const App = connect( }, }; - // update the bucket but don't force sync right away - // as this happens per keystroke when the user is editing - // a note. The NoteEditor will notify via props when - // it's time to sync via Simperium const { noteBucket } = this.props; - - noteBucket.update(note.id, updatedNote.data, {}, { sync: false }); + noteBucket.update(note.id, updatedNote.data, {}, { sync }); + if (sync) { + this.syncNote(note.id); + } }; syncNote = noteId => { @@ -363,13 +359,11 @@ export const App = connect( // gets the index of the note located before the currently selected one getPreviousNoteIndex = note => { - const filteredNotes = filterNotes(this.props.appState); - - const noteIndex = function(filteredNote) { - return note.id === filteredNote.id; - }; + const noteIndex = this.props.ui.filteredNotes.findIndex( + ({ id }) => note.id === id + ); - return Math.max(filteredNotes.findIndex(noteIndex) - 1, 0); + return Math.max(noteIndex - 1, 0); }; syncActivityHooks = data => { diff --git a/lib/auth/index.jsx b/lib/auth/index.tsx similarity index 99% rename from lib/auth/index.jsx rename to lib/auth/index.tsx index 84524b5a2..411236a4c 100644 --- a/lib/auth/index.jsx +++ b/lib/auth/index.tsx @@ -113,6 +113,7 @@ export class Auth extends Component { /> + ); +} + +ClipboardButton.propTypes = { + disbaled: PropTypes.bool, + text: PropTypes.string, +}; + +export default ClipboardButton; diff --git a/lib/components/dev-badge/index.jsx b/lib/components/dev-badge/index.tsx similarity index 100% rename from lib/components/dev-badge/index.jsx rename to lib/components/dev-badge/index.tsx diff --git a/lib/components/panel-title/index.jsx b/lib/components/panel-title/index.tsx similarity index 100% rename from lib/components/panel-title/index.jsx rename to lib/components/panel-title/index.tsx diff --git a/lib/components/progress-bar/index.jsx b/lib/components/progress-bar/index.tsx similarity index 100% rename from lib/components/progress-bar/index.jsx rename to lib/components/progress-bar/index.tsx diff --git a/lib/components/slider/index.jsx b/lib/components/slider/index.jsx deleted file mode 100644 index b33c6e987..000000000 --- a/lib/components/slider/index.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const Slider = ({ min, max, value, onChange }) => { - return ( - - ); -}; - -Slider.propTypes = { - onChange: PropTypes.func, - min: PropTypes.number, - max: PropTypes.number, - value: PropTypes.number, -}; - -export default Slider; diff --git a/lib/components/slider/index.tsx b/lib/components/slider/index.tsx new file mode 100644 index 000000000..c5dc92188 --- /dev/null +++ b/lib/components/slider/index.tsx @@ -0,0 +1,26 @@ +import React, { ChangeEventHandler, FunctionComponent } from 'react'; + +type Props = { + onChange: ChangeEventHandler; + min: number; + max: number; + value: number; +}; + +export const Slider: FunctionComponent = ({ + min, + max, + value, + onChange, +}) => ( + +); + +export default Slider; diff --git a/lib/components/spinner/index.jsx b/lib/components/spinner/index.tsx similarity index 100% rename from lib/components/spinner/index.jsx rename to lib/components/spinner/index.tsx diff --git a/lib/components/sync-status/get-note-titles.test.js b/lib/components/sync-status/get-note-titles.test.ts similarity index 100% rename from lib/components/sync-status/get-note-titles.test.js rename to lib/components/sync-status/get-note-titles.test.ts diff --git a/lib/components/sync-status/get-note-titles.js b/lib/components/sync-status/get-note-titles.ts similarity index 100% rename from lib/components/sync-status/get-note-titles.js rename to lib/components/sync-status/get-note-titles.ts diff --git a/lib/components/sync-status/index.jsx b/lib/components/sync-status/index.tsx similarity index 100% rename from lib/components/sync-status/index.jsx rename to lib/components/sync-status/index.tsx diff --git a/lib/components/sync-status/popover.jsx b/lib/components/sync-status/popover.tsx similarity index 100% rename from lib/components/sync-status/popover.jsx rename to lib/components/sync-status/popover.tsx diff --git a/lib/components/tab-panels/index.jsx b/lib/components/tab-panels/index.tsx similarity index 100% rename from lib/components/tab-panels/index.jsx rename to lib/components/tab-panels/index.tsx diff --git a/lib/components/tab-panels/style.scss b/lib/components/tab-panels/style.scss index 7f6300388..a641c53f0 100644 --- a/lib/components/tab-panels/style.scss +++ b/lib/components/tab-panels/style.scss @@ -27,12 +27,6 @@ height: 30.5em; overflow: auto; -webkit-overflow-scrolling: touch; - - // On small screens, the tab bar uses up too much space so it should - // move out of the way while scrolling. - @media only screen and (max-width: 720px) and (max-height: 640px) { - height: auto; - } } .tab-panels__column { @@ -40,4 +34,3 @@ margin: 0 auto; padding: 36px 10px 50px; } - diff --git a/lib/components/tag-chip/__snapshots__/test.jsx.snap b/lib/components/tag-chip/__snapshots__/test.tsx.snap similarity index 100% rename from lib/components/tag-chip/__snapshots__/test.jsx.snap rename to lib/components/tag-chip/__snapshots__/test.tsx.snap diff --git a/lib/components/tag-chip/index.jsx b/lib/components/tag-chip/index.tsx similarity index 100% rename from lib/components/tag-chip/index.jsx rename to lib/components/tag-chip/index.tsx diff --git a/lib/components/tag-chip/test.jsx b/lib/components/tag-chip/test.tsx similarity index 100% rename from lib/components/tag-chip/test.jsx rename to lib/components/tag-chip/test.tsx diff --git a/lib/components/transition-delay-enter/index.jsx b/lib/components/transition-delay-enter/index.jsx deleted file mode 100644 index 4c3e3675e..000000000 --- a/lib/components/transition-delay-enter/index.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { CSSTransition } from 'react-transition-group'; - -/** - * A wrapper to delay the mounting of children. - * - * Useful for progress bars and spinners, that should generally have about a - * 1000 ms delay before displaying to the user. - */ -class TransitionDelayEnter extends React.Component { - static propTypes = { - delay: PropTypes.number, - children: PropTypes.node.isRequired, - }; - - static defaultProps = { - delay: 1000, - }; - - state = { - shouldRender: false, - }; - - componentDidMount() { - this.timer = window.setTimeout(() => { - this.setState({ shouldRender: true }); - }, this.props.delay); - } - - componentWillUnmount() { - window.clearTimeout(this.timer); - } - - render() { - return ( - - {this.props.children} - - ); - } -} - -export default TransitionDelayEnter; diff --git a/lib/components/transition-delay-enter/index.tsx b/lib/components/transition-delay-enter/index.tsx new file mode 100644 index 000000000..ef80f9de5 --- /dev/null +++ b/lib/components/transition-delay-enter/index.tsx @@ -0,0 +1,40 @@ +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; +import { CSSTransition } from 'react-transition-group'; + +/** + * A wrapper to delay the mounting of children. + * + * Useful for progress bars and spinners, that should generally have about a + * 1000 ms delay before displaying to the user. + */ +const TransitionDelayEnter = ({ children, delay = 1000 }) => { + const [shouldRender, setShouldRender] = useState(false); + + useEffect(() => { + const timer = window.setTimeout(() => { + setShouldRender(true); + }, delay); + + return () => window.clearTimeout(timer); + }, []); + + return ( + + {children} + + ); +}; + +TransitionDelayEnter.propTypes = { + delay: PropTypes.number, + children: PropTypes.node.isRequired, +}; + +export default TransitionDelayEnter; diff --git a/lib/components/transition-fade-in-out/index.jsx b/lib/components/transition-fade-in-out/index.tsx similarity index 100% rename from lib/components/transition-fade-in-out/index.jsx rename to lib/components/transition-fade-in-out/index.tsx diff --git a/lib/context-menu.jsx b/lib/context-menu.jsx deleted file mode 100644 index ac3c1c417..000000000 --- a/lib/context-menu.jsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { isObject, pick } from 'lodash'; - -const toTemplateItem = ({ type: { displayName }, props }) => { - switch (displayName) { - case 'MenuItem': - return pick(props, ['label', 'type', 'role']); - - case 'MenuSeparator': - return { type: 'separator' }; - - default: - return null; - } -}; - -export class ContextMenu extends Component { - constructor(...args) { - super(...args); - - this.state = { - menu: this.buildMenu(this.props.children), - }; - } - - componentDidMount() { - this.startListening(); - } - - componentWillReceiveProps(nextProps) { - this.updateMenu(nextProps); - } - - componentWillUnmount() { - this.stopListening(); - } - - startListening = () => - window.addEventListener('contextmenu', this.triggerMenu); - - stopListening = () => - window.removeEventListener('contextmenu', this.triggerMenu); - - triggerMenu = event => { - const { currentWindow } = this.props; - const { menu } = this.state; - - event.preventDefault(); - - if ( - !event.target.closest( - 'textarea, input, [contenteditable="true"], div.note-detail-markdown' - ) - ) { - return; - } - - menu.popup({ window: currentWindow }); - }; - - buildMenu = children => { - const { Menu } = this.props; - const menuItems = React.Children.toArray(children); - const template = menuItems.map(toTemplateItem).filter(isObject); - - return Menu.buildFromTemplate(template); - }; - - updateMenu = ({ children }) => { - this.setState({ - menu: this.buildMenu(children), - }); - }; - - render() { - return null; - } -} - -export const MenuItem = () => null; -MenuItem.displayName = 'MenuItem'; - -MenuItem.propTypes = { - label: PropTypes.string, - role: PropTypes.string, - type: PropTypes.oneOf([ - 'normal', - 'separator', - 'submenu', - 'checkbox', - 'radio', - ]), -}; - -export const Separator = () => null; -Separator.displayName = 'MenuSeparator'; diff --git a/lib/controls/checkbox/index.jsx b/lib/controls/checkbox/index.tsx similarity index 61% rename from lib/controls/checkbox/index.jsx rename to lib/controls/checkbox/index.tsx index 5c7836c6b..f7cf2d3b2 100644 --- a/lib/controls/checkbox/index.jsx +++ b/lib/controls/checkbox/index.tsx @@ -1,7 +1,8 @@ import React from 'react'; import classNames from 'classnames'; +import PropTypes from 'prop-types'; -export default function CheckboxControl({ className, ...props }) { +function CheckboxControl({ className, ...props }) { return ( @@ -11,3 +12,9 @@ export default function CheckboxControl({ className, ...props }) { ); } + +CheckboxControl.propTypes = { + className: PropTypes.string.isRequired, +}; + +export default CheckboxControl; diff --git a/lib/controls/toggle/index.jsx b/lib/controls/toggle/index.tsx similarity index 70% rename from lib/controls/toggle/index.jsx rename to lib/controls/toggle/index.tsx index cd60b060b..1ead6660c 100644 --- a/lib/controls/toggle/index.jsx +++ b/lib/controls/toggle/index.tsx @@ -1,7 +1,8 @@ import React from 'react'; import classNames from 'classnames'; +import PropTypes from 'prop-types'; -export default function ToggleControl({ className, ...props }) { +function ToggleControl({ className, ...props }) { return ( @@ -13,3 +14,9 @@ export default function ToggleControl({ className, ...props }) { ); } + +ToggleControl.propTypes = { + className: PropTypes.string, +}; + +export default ToggleControl; diff --git a/lib/dialog-renderer/index.jsx b/lib/dialog-renderer/index.tsx similarity index 100% rename from lib/dialog-renderer/index.jsx rename to lib/dialog-renderer/index.tsx diff --git a/lib/dialog/index.jsx b/lib/dialog/index.tsx similarity index 100% rename from lib/dialog/index.jsx rename to lib/dialog/index.tsx diff --git a/lib/dialogs/about/index.jsx b/lib/dialogs/about/index.tsx similarity index 100% rename from lib/dialogs/about/index.jsx rename to lib/dialogs/about/index.tsx diff --git a/lib/dialogs/button-group/index.jsx b/lib/dialogs/button-group/index.tsx similarity index 100% rename from lib/dialogs/button-group/index.jsx rename to lib/dialogs/button-group/index.tsx diff --git a/lib/dialogs/import/dropzone/index.jsx b/lib/dialogs/import/dropzone/index.tsx similarity index 100% rename from lib/dialogs/import/dropzone/index.jsx rename to lib/dialogs/import/dropzone/index.tsx diff --git a/lib/dialogs/import/index.jsx b/lib/dialogs/import/index.tsx similarity index 100% rename from lib/dialogs/import/index.jsx rename to lib/dialogs/import/index.tsx diff --git a/lib/dialogs/import/source-importer/executor/index.jsx b/lib/dialogs/import/source-importer/executor/index.tsx similarity index 98% rename from lib/dialogs/import/source-importer/executor/index.jsx rename to lib/dialogs/import/source-importer/executor/index.tsx index 801966116..3b692b812 100644 --- a/lib/dialogs/import/source-importer/executor/index.jsx +++ b/lib/dialogs/import/source-importer/executor/index.tsx @@ -85,7 +85,6 @@ class ImportExecutor extends React.Component { }, 200); break; default: - console.log(`Unrecognized status event type "${type}"`); } }); return thisImporter; diff --git a/lib/dialogs/import/source-importer/index.jsx b/lib/dialogs/import/source-importer/index.tsx similarity index 100% rename from lib/dialogs/import/source-importer/index.jsx rename to lib/dialogs/import/source-importer/index.tsx diff --git a/lib/dialogs/import/source-importer/progress/bar.jsx b/lib/dialogs/import/source-importer/progress/bar.tsx similarity index 100% rename from lib/dialogs/import/source-importer/progress/bar.jsx rename to lib/dialogs/import/source-importer/progress/bar.tsx diff --git a/lib/dialogs/import/source-importer/progress/index.jsx b/lib/dialogs/import/source-importer/progress/index.tsx similarity index 100% rename from lib/dialogs/import/source-importer/progress/index.jsx rename to lib/dialogs/import/source-importer/progress/index.tsx diff --git a/lib/dialogs/import/source-importer/progress/text.jsx b/lib/dialogs/import/source-importer/progress/text.tsx similarity index 100% rename from lib/dialogs/import/source-importer/progress/text.jsx rename to lib/dialogs/import/source-importer/progress/text.tsx diff --git a/lib/dialogs/import/source-importer/utils/test-importer.js b/lib/dialogs/import/source-importer/utils/test-importer.ts similarity index 84% rename from lib/dialogs/import/source-importer/utils/test-importer.js rename to lib/dialogs/import/source-importer/utils/test-importer.ts index 8d071d225..008555925 100644 --- a/lib/dialogs/import/source-importer/utils/test-importer.js +++ b/lib/dialogs/import/source-importer/utils/test-importer.ts @@ -7,11 +7,11 @@ import { EventEmitter } from 'events'; class TestImporter extends EventEmitter { constructor(arg) { super(); - console.log(arg); + console.log(arg); // eslint-disable-line no-console } importNotes(files) { - console.log(files); + console.log(files); // eslint-disable-line no-console let count = 0; const counter = window.setInterval(() => { diff --git a/lib/dialogs/import/source-selector.jsx b/lib/dialogs/import/source-selector.tsx similarity index 100% rename from lib/dialogs/import/source-selector.jsx rename to lib/dialogs/import/source-selector.tsx diff --git a/lib/dialogs/import/sources.js b/lib/dialogs/import/sources.ts similarity index 100% rename from lib/dialogs/import/sources.js rename to lib/dialogs/import/sources.ts diff --git a/lib/dialogs/index.js b/lib/dialogs/index.ts similarity index 100% rename from lib/dialogs/index.js rename to lib/dialogs/index.ts diff --git a/lib/dialogs/radio-settings-group.jsx b/lib/dialogs/radio-settings-group.tsx similarity index 64% rename from lib/dialogs/radio-settings-group.jsx rename to lib/dialogs/radio-settings-group.tsx index f7cdbbae8..1c4cb861e 100644 --- a/lib/dialogs/radio-settings-group.jsx +++ b/lib/dialogs/radio-settings-group.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import CheckboxControl from '../controls/checkbox'; @@ -13,4 +14,11 @@ const RadioGroup = ({ groupSlug, slug, isEnabled, onChange }) => ( /> ); +RadioGroup.propTypes = { + groupSlug: PropTypes.string, + slug: PropTypes.string, + isEnabled: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired, +}; + export default RadioGroup; diff --git a/lib/dialogs/settings-group.jsx b/lib/dialogs/settings-group.tsx similarity index 91% rename from lib/dialogs/settings-group.jsx rename to lib/dialogs/settings-group.tsx index 0749c0a1c..0f750aaa6 100644 --- a/lib/dialogs/settings-group.jsx +++ b/lib/dialogs/settings-group.tsx @@ -64,8 +64,14 @@ export const SettingsGroup = ({ }; SettingsGroup.propTypes = { + activeSlug: PropTypes.string, + children: PropTypes.node, description: PropTypes.string, learnMoreURL: PropTypes.string, + onChange: PropTypes.func, + renderer: PropTypes.func, + slug: PropTypes.string, + title: PropTypes.string, }; export default SettingsGroup; diff --git a/lib/dialogs/settings/index.jsx b/lib/dialogs/settings/index.tsx similarity index 98% rename from lib/dialogs/settings/index.jsx rename to lib/dialogs/settings/index.tsx index 760b39cf5..75279c555 100644 --- a/lib/dialogs/settings/index.jsx +++ b/lib/dialogs/settings/index.tsx @@ -161,7 +161,4 @@ const mapDispatchToProps = dispatch => ({ }, }); -export default connect( - null, - mapDispatchToProps -)(SettingsDialog); +export default connect(null, mapDispatchToProps)(SettingsDialog); diff --git a/lib/dialogs/settings/panels/account.jsx b/lib/dialogs/settings/panels/account.tsx similarity index 91% rename from lib/dialogs/settings/panels/account.jsx rename to lib/dialogs/settings/panels/account.tsx index 92f713dea..418b073bd 100644 --- a/lib/dialogs/settings/panels/account.jsx +++ b/lib/dialogs/settings/panels/account.tsx @@ -1,12 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; - import PanelTitle from '../../../components/panel-title'; import SettingsGroup, { Item } from '../../settings-group'; import ToggleGroup from '../../toggle-settings-group'; import TopRightArrowIcon from '../../../icons/arrow-top-right'; - -import getConfig from '../../../../get-config'; import { viewExternalUrl } from '../../../utils/url-utils'; const AccountPanel = props => { @@ -18,8 +15,7 @@ const AccountPanel = props => { } = props; const onEditAccount = () => { - const source = getConfig().is_app_engine ? 'react' : 'electron'; - viewExternalUrl(`https://app.simplenote.com/settings?from=${source}`); + viewExternalUrl(`https://app.simplenote.com/settings/?from=react`); }; return ( diff --git a/lib/dialogs/settings/panels/display.jsx b/lib/dialogs/settings/panels/display.tsx similarity index 98% rename from lib/dialogs/settings/panels/display.jsx rename to lib/dialogs/settings/panels/display.tsx index 444173a87..16afed5c4 100644 --- a/lib/dialogs/settings/panels/display.jsx +++ b/lib/dialogs/settings/panels/display.tsx @@ -167,7 +167,4 @@ const mapDispatchToProps = dispatch => { }; }; -export default connect( - mapStateToProps, - mapDispatchToProps -)(DisplayPanel); +export default connect(mapStateToProps, mapDispatchToProps)(DisplayPanel); diff --git a/lib/dialogs/settings/panels/tools.jsx b/lib/dialogs/settings/panels/tools.tsx similarity index 94% rename from lib/dialogs/settings/panels/tools.jsx rename to lib/dialogs/settings/panels/tools.tsx index 658cdf427..55ac33fac 100644 --- a/lib/dialogs/settings/panels/tools.jsx +++ b/lib/dialogs/settings/panels/tools.tsx @@ -49,7 +49,4 @@ const mapDispatchToProps = dispatch => { }; }; -export default connect( - null, - mapDispatchToProps -)(ToolsPanel); +export default connect(null, mapDispatchToProps)(ToolsPanel); diff --git a/lib/dialogs/settings/style.scss b/lib/dialogs/settings/style.scss index 27183cf9f..1b8bfd748 100644 --- a/lib/dialogs/settings/style.scss +++ b/lib/dialogs/settings/style.scss @@ -45,10 +45,6 @@ border-bottom: none; } - .button-borderless { - padding-right: 0; - } - .settings-item-label { flex: 1 1 auto; align-items: center; diff --git a/lib/dialogs/share/index.jsx b/lib/dialogs/share/index.tsx similarity index 91% rename from lib/dialogs/share/index.jsx rename to lib/dialogs/share/index.tsx index 7cd9c0571..603903bcd 100644 --- a/lib/dialogs/share/index.jsx +++ b/lib/dialogs/share/index.tsx @@ -5,6 +5,7 @@ import { includes, isEmpty } from 'lodash'; import MD5 from 'md5.js'; import analytics from '../../analytics'; +import ClipboardButton from '../../components/clipboard-button'; import isEmailTag from '../../utils/is-email-tag'; import { updateNoteTags } from '../../state/domain/notes'; import Dialog from '../../dialog'; @@ -21,6 +22,7 @@ export class ShareDialog extends Component { noteBucket: PropTypes.object.isRequired, appState: PropTypes.object.isRequired, requestClose: PropTypes.func.isRequired, + settings: PropTypes.object.isRequired, tagBucket: PropTypes.object.isRequired, updateNoteTags: PropTypes.func.isRequired, }; @@ -33,18 +35,6 @@ export class ShareDialog extends Component { }); }; - copyPublishURL = () => { - this.publishUrlElement.select(); - - try { - document.execCommand('copy'); - } catch (err) { - return; - } - - this.copyUrlElement.focus(); - }; - getPublishURL = url => (isEmpty(url) ? undefined : `http://simp.ly/p/${url}`); onAddCollaborator = event => { @@ -55,7 +45,9 @@ export class ShareDialog extends Component { event.preventDefault(); this.collaboratorElement.value = ''; - if (collaborator !== '' && tags.indexOf(collaborator) === -1) { + const isSelf = this.props.settings.accountName === collaborator; + + if (collaborator !== '' && tags.indexOf(collaborator) === -1 && !isSelf) { this.props.updateNoteTags({ note, tags: [...tags, collaborator], @@ -116,12 +108,13 @@ export class ShareDialog extends Component { onSubmit={this.onAddCollaborator} > (this.collaboratorElement = e)} - type="email" - pattern="[^@]+@[^@]+" className="settings-item-text-input transparent-input" + // Regex to detect valid email + pattern="^[^@]+@.+" placeholder="email@example.com" + ref={e => (this.collaboratorElement = e)} spellCheck={false} + title="Please enter a valid email" />
+ {publishURL && }
@@ -223,6 +208,8 @@ export class ShareDialog extends Component { } export default connect( - null, + state => ({ + settings: state.settings, + }), { updateNoteTags } )(ShareDialog); diff --git a/lib/dialogs/toggle-settings-group.jsx b/lib/dialogs/toggle-settings-group.tsx similarity index 62% rename from lib/dialogs/toggle-settings-group.jsx rename to lib/dialogs/toggle-settings-group.tsx index c5d4dcf15..4f4ca89b0 100644 --- a/lib/dialogs/toggle-settings-group.jsx +++ b/lib/dialogs/toggle-settings-group.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import ToggleControl from '../controls/toggle'; @@ -12,4 +13,11 @@ const ToggleGroup = ({ groupSlug, slug, isEnabled, onChange }) => ( /> ); +ToggleGroup.propTypes = { + groupSlug: PropTypes.string, + slug: PropTypes.string, + isEnabled: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired, +}; + export default ToggleGroup; diff --git a/lib/editable-list/index.jsx b/lib/editable-list/index.tsx similarity index 99% rename from lib/editable-list/index.jsx rename to lib/editable-list/index.tsx index b2f87f121..0a687ca2c 100644 --- a/lib/editable-list/index.jsx +++ b/lib/editable-list/index.tsx @@ -9,6 +9,7 @@ export class EditableList extends Component { static displayName = 'EditableList'; static propTypes = { + className: PropTypes.string, editing: PropTypes.bool.isRequired, items: PropTypes.array.isRequired, renderItem: PropTypes.func.isRequired, diff --git a/lib/editor/checkbox-decorator.test.js b/lib/editor/checkbox-decorator.test.ts similarity index 100% rename from lib/editor/checkbox-decorator.test.js rename to lib/editor/checkbox-decorator.test.ts diff --git a/lib/editor/checkbox-decorator.js b/lib/editor/checkbox-decorator.ts similarity index 100% rename from lib/editor/checkbox-decorator.js rename to lib/editor/checkbox-decorator.ts diff --git a/lib/editor/checkbox-utils.test.js b/lib/editor/checkbox-utils.test.ts similarity index 100% rename from lib/editor/checkbox-utils.test.js rename to lib/editor/checkbox-utils.test.ts diff --git a/lib/editor/checkbox-utils.js b/lib/editor/checkbox-utils.ts similarity index 100% rename from lib/editor/checkbox-utils.js rename to lib/editor/checkbox-utils.ts diff --git a/lib/editor/css-class-wrapper.jsx b/lib/editor/css-class-wrapper.tsx similarity index 87% rename from lib/editor/css-class-wrapper.jsx rename to lib/editor/css-class-wrapper.tsx index 4b0838298..3d49124e2 100644 --- a/lib/editor/css-class-wrapper.jsx +++ b/lib/editor/css-class-wrapper.tsx @@ -6,6 +6,7 @@ export const CssClassWrapper = ({ children, className }) => ( ); CssClassWrapper.propTypes = { + children: PropTypes.node.isRequired, className: PropTypes.string.isRequired, }; diff --git a/lib/editor/insert-or-remove-checkboxes.test.js b/lib/editor/insert-or-remove-checkboxes.test.ts similarity index 100% rename from lib/editor/insert-or-remove-checkboxes.test.js rename to lib/editor/insert-or-remove-checkboxes.test.ts diff --git a/lib/editor/insert-or-remove-checkboxes.js b/lib/editor/insert-or-remove-checkboxes.ts similarity index 100% rename from lib/editor/insert-or-remove-checkboxes.js rename to lib/editor/insert-or-remove-checkboxes.ts diff --git a/lib/editor/matching-text-decorator.js b/lib/editor/matching-text-decorator.ts similarity index 100% rename from lib/editor/matching-text-decorator.js rename to lib/editor/matching-text-decorator.ts diff --git a/lib/editor/text-manipulation-helpers.js b/lib/editor/text-manipulation-helpers.ts similarity index 100% rename from lib/editor/text-manipulation-helpers.js rename to lib/editor/text-manipulation-helpers.ts diff --git a/lib/editor/utils.test.js b/lib/editor/utils.test.ts similarity index 100% rename from lib/editor/utils.test.js rename to lib/editor/utils.test.ts diff --git a/lib/editor/utils.js b/lib/editor/utils.ts similarity index 100% rename from lib/editor/utils.js rename to lib/editor/utils.ts diff --git a/lib/flux/action-map.js b/lib/flux/action-map.js deleted file mode 100644 index 0cafe6df2..000000000 --- a/lib/flux/action-map.js +++ /dev/null @@ -1,53 +0,0 @@ -export class ActionMap { - constructor({ namespace, initialState, handlers }) { - this.namespace = namespace; - this.initialState = initialState; - this.actionCreators = {}; - this.actionReducers = {}; - - namespace = namespace ? `${namespace}.` : ''; - - for (let name in handlers) { - if (Object.prototype.hasOwnProperty.call(handlers, name)) { - let handler = handlers[name]; - - if (typeof handler === 'function') { - this.actionCreators[name] = actionCreator.bind(`${namespace}${name}`); - this.actionReducers[`${namespace}${name}`] = handler; - } else { - this.actionCreators[name] = - handler.creator.bind(this) || - actionCreator.bind(`${namespace}${name}`); - this.actionReducers[`${namespace}${name}`] = handler.reducer; - } - } - } - } - - action(name, ...params) { - return this.actionCreators[name].apply(this, params); - } - - reducer(state, action) { - if (!state) { - if (typeof this.initialState === 'function') { - state = this.initialState(); - } else { - state = this.initialState; - } - } - - let fn = this.actionReducers[action.type]; - if (typeof fn === 'function') { - state = fn(state, action) || state; - } - - return state; - } -} - -export function actionCreator() { - return Object.assign({ type: this }, ...arguments); -} - -export default ActionMap; diff --git a/lib/flux/action-map.ts b/lib/flux/action-map.ts new file mode 100644 index 000000000..09782cd98 --- /dev/null +++ b/lib/flux/action-map.ts @@ -0,0 +1,81 @@ +import { Action, Reducer } from 'redux'; + +type ActionHandler = + | { creator: Function } + | ((state: State, ...args: any[]) => any); + +type ActionHandlers = { + [P in keyof Handlers]: ActionHandler; +}; + +type ActionCreators> = { + [P in keyof Handlers]: (...args: unknown[]) => Action; +}; + +export class ActionMap< + State, + Handlers extends ActionHandlers +> { + actionCreators: ActionCreators; + actionReducers: { [key: string]: Function }; + initialState: State; + namespace: string; + + constructor({ + namespace, + initialState, + handlers, + }: { + namespace: string; + initialState: State; + handlers: Handlers; + }) { + this.namespace = namespace; + this.initialState = initialState; + this.actionCreators = {} as ActionCreators; + this.actionReducers = {}; + + namespace = namespace ? `${namespace}.` : ''; + + (Object.getOwnPropertyNames(handlers) as (keyof Handlers)[]).forEach( + (name: T) => { + const handler = handlers[name]; + + if (typeof handler === 'function') { + this.actionCreators[name] = actionCreator.bind(`${namespace}${name}`); + this.actionReducers[`${namespace}${name}`] = handler as Reducer< + State, + any + >; + } else { + this.actionCreators[name] = + (handler as { creator: Function }).creator.bind(this) || + actionCreator.bind(`${namespace}${name}`); + } + } + ); + } + + action(name: T, ...params: unknown[]) { + return this.actionCreators[name].apply(this, params); + } + + reducer(state: State, action) { + if (!state) { + state = this.initialState; + } + + let fn = this.actionReducers[action.type]; + if (typeof fn === 'function') { + state = fn(state, action) || state; + } + + return state; + } +} + +export function actionCreator(...args: T) { + return Object.assign({ type: this }, ...args); +} + +export default ActionMap; diff --git a/lib/flux/app-state.js b/lib/flux/app-state.ts similarity index 76% rename from lib/flux/app-state.js rename to lib/flux/app-state.ts index 342960f70..9d67ec692 100644 --- a/lib/flux/app-state.js +++ b/lib/flux/app-state.ts @@ -5,9 +5,16 @@ import ActionMap from './action-map'; import filterNotes from '../utils/filter-notes'; import analytics from '../analytics'; +import { AppState, State } from '../state'; +import * as T from '../types'; + const debug = Debug('appState'); -const toggleSystemTag = (note, systemTag, shouldHaveTag) => { +const toggleSystemTag = ( + note: T.NoteEntity, + systemTag: T.SystemTag, + shouldHaveTag: boolean +) => { const { data: { systemTags = [] }, } = note; @@ -26,33 +33,33 @@ const toggleSystemTag = (note, systemTag, shouldHaveTag) => { : note; }; +const initialState: AppState = { + editorMode: 'edit', + filter: '', + selectedNoteId: null, + previousIndex: -1, + notes: null, + tags: [], + revision: null, + showTrash: false, + listTitle: 'All Notes', + showNavigation: false, + showNoteInfo: false, + isViewingRevisions: false, + editingTags: false, + dialogs: [], + nextDialogKey: 0, + shouldPrint: false, + searchFocus: false, + unsyncedNoteIds: [], // note bucket only + isOffline: true, // disconnected from Simperium server +}; + export const actionMap = new ActionMap({ namespace: 'App', - - initialState: { - editorMode: 'edit', - filter: '', - selectedNoteId: null, - previousIndex: -1, - notes: null, - tags: [], - revision: null, - showTrash: false, - listTitle: 'All Notes', - showNavigation: false, - showNoteInfo: false, - isViewingRevisions: false, - editingTags: false, - dialogs: [], - nextDialogKey: 0, - shouldPrint: false, - searchFocus: false, - unsyncedNoteIds: [], // note bucket only - isOffline: true, // disconnected from Simperium server - }, - + initialState, handlers: { - authChanged(state) { + authChanged(state: AppState) { return update(state, { notes: { $set: null }, tags: { $set: [] }, @@ -60,7 +67,7 @@ export const actionMap = new ActionMap({ }); }, - toggleNavigation(state) { + toggleNavigation(state: AppState) { if (state.showNavigation) { return update(state, { showNavigation: { $set: false }, @@ -87,7 +94,7 @@ export const actionMap = new ActionMap({ }, }, - showAllNotes(state) { + showAllNotes(state: AppState) { return update(state, { showNavigation: { $set: false }, editingTags: { $set: false }, @@ -100,7 +107,7 @@ export const actionMap = new ActionMap({ }); }, - selectTrash(state) { + selectTrash(state: AppState) { return update(state, { showNavigation: { $set: false }, editingTags: { $set: false }, @@ -114,7 +121,7 @@ export const actionMap = new ActionMap({ }, selectTagAndSelectFirstNote: { - creator({ tag }) { + creator({ tag }: { tag: T.TagEntity }) { return (dispatch, getState) => { dispatch(this.action('selectTag', { tag })); dispatch( @@ -126,7 +133,7 @@ export const actionMap = new ActionMap({ }, }, - selectTag(state, { tag }) { + selectTag(state: AppState, { tag }: { tag: T.TagEntity }) { return update(state, { showNavigation: { $set: false }, editingTags: { $set: false }, @@ -139,13 +146,13 @@ export const actionMap = new ActionMap({ }); }, - setEditorMode(state, { mode }) { + setEditorMode(state: AppState, { mode }: { mode: T.EditorMode }) { return update(state, { editorMode: { $set: mode }, }); }, - showDialog(state, { dialog }) { + showDialog(state: AppState, { dialog }) { const { type, multiple = false, title, ...dialogProps } = dialog; // If there should only be one instance of the dialog in the stack @@ -175,7 +182,7 @@ export const actionMap = new ActionMap({ return update(state, updateCommands); }, - closeDialog(state, { key }) { + closeDialog(state: AppState, { key }) { var dialogs = state.dialogs; for (let i = 0; i < dialogs.length; i++) { @@ -187,23 +194,28 @@ export const actionMap = new ActionMap({ } }, - editTags(state) { + editTags(state: AppState) { return update(state, { editingTags: { $set: !state.editingTags }, }); }, - search(state, { filter }) { + search(state: AppState, { filter }: { filter: string }) { return update(state, { filter: { $set: filter }, }); }, newNote: { - creator({ noteBucket, content = '' }) { - return (dispatch, getState) => { - const state = getState().appState; - const settings = getState().settings; + creator({ + noteBucket, + content = '', + }: { + noteBucket: T.Bucket; + content: string; + }) { + return (dispatch, getState: () => State) => { + const { appState: state, settings } = getState(); const timestamp = new Date().getTime() / 1000; if (state.showTrash) { @@ -224,9 +236,14 @@ export const actionMap = new ActionMap({ modificationDate: timestamp, shareURL: '', publishURL: '', - tags: [].concat(state.tag ? state.tag.data.name : []), + tags: ([] as T.TagName[]).concat( + state.tag ? state.tag.data.name : [] + ), }, (e, note) => { + if (e) { + return debug(`newNote: could not create note - ${e.message}`); + } dispatch( this.action('loadAndSelectNote', { noteBucket, @@ -240,11 +257,11 @@ export const actionMap = new ActionMap({ }, loadNotes: { - creator({ noteBucket }) { - return (dispatch, getState) => { + creator({ noteBucket }: { noteBucket: T.Bucket }) { + return (dispatch, getState: () => State) => { const settings = getState().settings; const { sortType, sortReversed } = settings; - var sortOrder; + var sortOrder: 'prev' | 'next'; debug('loadNotes'); if (sortType === 'alphabetical') { @@ -254,7 +271,7 @@ export const actionMap = new ActionMap({ } noteBucket.query(db => { - var notes = []; + var notes: T.NoteEntity[] = []; db .transaction('note') .objectStore('note') @@ -276,8 +293,10 @@ export const actionMap = new ActionMap({ }, }, - notesLoaded(state, { notes }) { - const [pinned, notPinned] = partition(notes, note => note.pinned); + notesLoaded(state: AppState, { notes }: { notes: T.NoteEntity[] }) { + const [pinned, notPinned] = partition(notes, note => + note.data.systemTags.includes('pinned') + ); const pinSortedNotes = [...pinned, ...notPinned]; let selectedNote = null; @@ -323,25 +342,25 @@ export const actionMap = new ActionMap({ }, }, - setRevision(state, { revision }) { + setRevision(state: AppState, { revision }) { return update(state, { revision: { $set: revision }, }); }, - setIsViewingRevisions(state, { isViewingRevisions }) { + setIsViewingRevisions(state: AppState, { isViewingRevisions }) { return update(state, { isViewingRevisions: { $set: isViewingRevisions }, }); }, - setShouldPrintNote(state, { shouldPrint = true }) { + setShouldPrintNote(state: AppState, { shouldPrint = true }) { return update(state, { shouldPrint: { $set: shouldPrint }, }); }, - setSearchFocus(state, { searchFocus = true }) { + setSearchFocus(state: AppState, { searchFocus = true }) { return update(state, { searchFocus: { $set: searchFocus }, }); @@ -377,16 +396,17 @@ export const actionMap = new ActionMap({ }, }, - selectNote(state, { note, hasRemoteUpdate }) { + selectNote(state: AppState, { note, hasRemoteUpdate }) { return update(state, { editingTags: { $set: false }, note: { $set: { ...note, hasRemoteUpdate } }, selectedNoteId: { $set: note.id }, + revision: { $set: null }, revisions: { $set: null }, }); }, - closeNote(state, { previousIndex = -1 }) { + closeNote(state: AppState, { previousIndex = -1 }) { return update(state, { note: { $set: null }, selectedNoteId: { $set: null }, @@ -396,7 +416,7 @@ export const actionMap = new ActionMap({ noteUpdatedRemotely: { creator({ noteBucket, noteId, data, remoteUpdateInfo = {} }) { - return (dispatch, getState) => { + return (dispatch, getState: () => State) => { const state = getState().appState; const { patch } = remoteUpdateInfo; @@ -428,13 +448,13 @@ export const actionMap = new ActionMap({ * from the server and merge them together. */ onNoteBeforeRemoteUpdate: { - creator({ noteId }) { - return (dispatch, getState) => { + creator({ noteId }: { noteId: T.EntityId }) { + return (dispatch, getState: () => State) => { const { appState: { selectedNoteId, note, notes }, } = getState(); - if ( selectedNoteId === noteId ) { + if (selectedNoteId === noteId) { return note.data; } @@ -450,7 +470,15 @@ export const actionMap = new ActionMap({ }, trashNote: { - creator({ noteBucket, note, previousIndex }) { + creator({ + noteBucket, + note, + previousIndex, + }: { + noteBucket: T.Bucket; + note: T.NoteEntity; + previousIndex: number; + }) { return dispatch => { if (note) { note.data.deleted = true; @@ -463,7 +491,15 @@ export const actionMap = new ActionMap({ }, restoreNote: { - creator({ noteBucket, note, previousIndex }) { + creator({ + noteBucket, + note, + previousIndex, + }: { + noteBucket: T.Bucket; + note: T.NoteEntity; + previousIndex: number; + }) { return dispatch => { if (note) { note.data.deleted = false; @@ -476,7 +512,15 @@ export const actionMap = new ActionMap({ }, deleteNoteForever: { - creator({ noteBucket, note, previousIndex }) { + creator({ + noteBucket, + note, + previousIndex, + }: { + noteBucket: T.Bucket; + note: T.NoteEntity; + previousIndex: number; + }) { return dispatch => { noteBucket.remove(note.id); @@ -487,7 +531,13 @@ export const actionMap = new ActionMap({ }, noteRevisions: { - creator({ noteBucket, note }) { + creator({ + noteBucket, + note, + }: { + noteBucket: T.Bucket; + note: T.NoteEntity; + }) { return dispatch => { noteBucket.getRevisions(note.id, (e, revisions) => { if (e) { @@ -501,8 +551,8 @@ export const actionMap = new ActionMap({ }, emptyTrash: { - creator({ noteBucket }) { - return (dispatch, getState) => { + creator({ noteBucket }: { noteBucket: T.Bucket }) { + return (dispatch, getState: () => State) => { const state = getState().appState; const [deleted, notes] = partition( state.notes, @@ -516,13 +566,13 @@ export const actionMap = new ActionMap({ }, }, - noteRevisionsLoaded(state, { revisions }) { + noteRevisionsLoaded(state: AppState, { revisions }) { return update(state, { revisions: { $set: revisions }, }); }, - toggleNoteInfo(state) { + toggleNoteInfo(state: AppState) { if (state.showNoteInfo) { return update(state, { showNoteInfo: { $set: false }, @@ -536,7 +586,10 @@ export const actionMap = new ActionMap({ }); }, - tagsLoaded(state, { tags, sortTagsAlpha }) { + tagsLoaded( + state: AppState, + { tags, sortTagsAlpha }: { tags: T.TagEntity[]; sortTagsAlpha: boolean } + ) { tags = tags.slice(); if (sortTagsAlpha) { // Sort tags alphabetically by 'name' value @@ -556,7 +609,13 @@ export const actionMap = new ActionMap({ }, loadPreferences: { - creator({ callback, preferencesBucket }) { + creator({ + callback, + preferencesBucket, + }: { + callback?: Function; + preferencesBucket: T.Bucket; + }) { return dispatch => { const objectKey = 'preferences-key'; @@ -592,7 +651,10 @@ export const actionMap = new ActionMap({ }, }, - preferencesLoaded(state, { analyticsEnabled }) { + preferencesLoaded( + state: AppState, + { analyticsEnabled }: { analyticsEnabled: boolean } + ) { return update(state, { preferences: { $set: { @@ -602,7 +664,18 @@ export const actionMap = new ActionMap({ }); }, - setPreference(state, { key, value, preferencesBucket }) { + setPreference( + state: AppState, + { + key, + value, + preferencesBucket, + }: { + key: K; + value: T.Preferences[K]; + preferencesBucket: T.Bucket; + } + ) { const objectKey = 'preferences-key'; preferencesBucket.get(objectKey, (e, preferences) => { @@ -614,8 +687,12 @@ export const actionMap = new ActionMap({ }, toggleShareAnalyticsPreference: { - creator({ preferencesBucket }) { - return (dispatch, getState) => { + creator({ + preferencesBucket, + }: { + preferencesBucket: T.Bucket; + }) { + return (dispatch, getState: () => State) => { const { appState: { preferences: { analyticsEnabled }, @@ -633,13 +710,19 @@ export const actionMap = new ActionMap({ }, }, - setUnsyncedNoteIds(state, { noteIds }) { + setUnsyncedNoteIds( + state: AppState, + { noteIds }: { noteIds: T.EntityId[] } + ) { return update(state, { unsyncedNoteIds: { $set: noteIds }, }); }, - setConnectionStatus(state, { isOffline }) { + setConnectionStatus( + state: AppState, + { isOffline }: { isOffline: boolean } + ) { return update(state, { isOffline: { $set: isOffline }, }); @@ -647,6 +730,4 @@ export const actionMap = new ActionMap({ }, }); -actionMap.indexCtr = 0; - export default actionMap; diff --git a/lib/flux/test.js b/lib/flux/test.ts similarity index 80% rename from lib/flux/test.js rename to lib/flux/test.ts index 512973307..9203526a9 100644 --- a/lib/flux/test.js +++ b/lib/flux/test.ts @@ -51,9 +51,9 @@ describe('appState action reducers', () => { it('should load the newest version of the selected note', () => { const oldState = { notes: [{}], - note: { id: 'foo', data: 'old' }, + note: { id: 'foo', data: { content: 'old', systemTags: [] } }, }; - const newNote = { id: 'foo', data: 'new' }; + const newNote = { id: 'foo', data: { content: 'new', systemTags: [] } }; const newNoteArray = [newNote]; const newState = notesLoaded(oldState, { notes: newNoteArray, @@ -70,8 +70,14 @@ describe('appState action reducers', () => { note: null, previousIndex: -1, }; - const firstNote = { id: 'foo', data: 'first' }; - const newNoteArray = [firstNote, {}]; + const firstNote = { + id: 'foo', + data: { content: 'first', systemTags: [] }, + }; + const newNoteArray = [ + firstNote, + { id: 'bar', data: { content: 'boo', systemTags: [] } }, + ]; const newState = notesLoaded(oldState, { notes: newNoteArray, }); @@ -85,8 +91,14 @@ describe('appState action reducers', () => { note: null, previousIndex: 1, }; - const previousIndexNote = { id: 'foo', data: 'previous' }; - const newNoteArray = [{}, previousIndexNote]; + const previousIndexNote = { + id: 'foo', + data: { content: 'previous', systemTags: [] }, + }; + const newNoteArray = [ + { id: 'bar', data: { content: 'boo', systemTags: [] } }, + previousIndexNote, + ]; const newState = notesLoaded(oldState, { notes: newNoteArray, }); diff --git a/lib/icon-button/index.js b/lib/icon-button/index.tsx similarity index 100% rename from lib/icon-button/index.js rename to lib/icon-button/index.tsx diff --git a/lib/icons/alert.jsx b/lib/icons/alert.tsx similarity index 100% rename from lib/icons/alert.jsx rename to lib/icons/alert.tsx diff --git a/lib/icons/arrow-down.jsx b/lib/icons/arrow-down.tsx similarity index 100% rename from lib/icons/arrow-down.jsx rename to lib/icons/arrow-down.tsx diff --git a/lib/icons/arrow-left.jsx b/lib/icons/arrow-left.tsx similarity index 100% rename from lib/icons/arrow-left.jsx rename to lib/icons/arrow-left.tsx diff --git a/lib/icons/arrow-top-right.jsx b/lib/icons/arrow-top-right.tsx similarity index 100% rename from lib/icons/arrow-top-right.jsx rename to lib/icons/arrow-top-right.tsx diff --git a/lib/icons/arrow.jsx b/lib/icons/arrow.tsx similarity index 100% rename from lib/icons/arrow.jsx rename to lib/icons/arrow.tsx diff --git a/lib/icons/back.jsx b/lib/icons/back.tsx similarity index 100% rename from lib/icons/back.jsx rename to lib/icons/back.tsx diff --git a/lib/icons/checkmark.jsx b/lib/icons/checkmark.tsx similarity index 100% rename from lib/icons/checkmark.jsx rename to lib/icons/checkmark.tsx diff --git a/lib/icons/circle.jsx b/lib/icons/circle.tsx similarity index 100% rename from lib/icons/circle.jsx rename to lib/icons/circle.tsx diff --git a/lib/icons/cross-outline-small.jsx b/lib/icons/cross-outline-small.tsx similarity index 100% rename from lib/icons/cross-outline-small.jsx rename to lib/icons/cross-outline-small.tsx diff --git a/lib/icons/cross-outline.jsx b/lib/icons/cross-outline.tsx similarity index 100% rename from lib/icons/cross-outline.jsx rename to lib/icons/cross-outline.tsx diff --git a/lib/icons/cross-small.jsx b/lib/icons/cross-small.tsx similarity index 100% rename from lib/icons/cross-small.jsx rename to lib/icons/cross-small.tsx diff --git a/lib/icons/cross.jsx b/lib/icons/cross.tsx similarity index 100% rename from lib/icons/cross.jsx rename to lib/icons/cross.tsx diff --git a/lib/icons/ellipsis.jsx b/lib/icons/ellipsis.tsx similarity index 100% rename from lib/icons/ellipsis.jsx rename to lib/icons/ellipsis.tsx diff --git a/lib/icons/feed.jsx b/lib/icons/feed.tsx similarity index 100% rename from lib/icons/feed.jsx rename to lib/icons/feed.tsx diff --git a/lib/icons/file.jsx b/lib/icons/file.tsx similarity index 100% rename from lib/icons/file.jsx rename to lib/icons/file.tsx diff --git a/lib/icons/info.jsx b/lib/icons/info.tsx similarity index 100% rename from lib/icons/info.jsx rename to lib/icons/info.tsx diff --git a/lib/icons/menu.jsx b/lib/icons/menu.tsx similarity index 100% rename from lib/icons/menu.jsx rename to lib/icons/menu.tsx diff --git a/lib/icons/new-note.jsx b/lib/icons/new-note.tsx similarity index 100% rename from lib/icons/new-note.jsx rename to lib/icons/new-note.tsx diff --git a/lib/icons/notes.jsx b/lib/icons/notes.tsx similarity index 100% rename from lib/icons/notes.jsx rename to lib/icons/notes.tsx diff --git a/lib/icons/plus.jsx b/lib/icons/plus.tsx similarity index 100% rename from lib/icons/plus.jsx rename to lib/icons/plus.tsx diff --git a/lib/icons/preview-stop.jsx b/lib/icons/preview-stop.tsx similarity index 100% rename from lib/icons/preview-stop.jsx rename to lib/icons/preview-stop.tsx diff --git a/lib/icons/preview.jsx b/lib/icons/preview.tsx similarity index 100% rename from lib/icons/preview.jsx rename to lib/icons/preview.tsx diff --git a/lib/icons/reorder.jsx b/lib/icons/reorder.tsx similarity index 100% rename from lib/icons/reorder.jsx rename to lib/icons/reorder.tsx diff --git a/lib/icons/revisions.jsx b/lib/icons/revisions.tsx similarity index 100% rename from lib/icons/revisions.jsx rename to lib/icons/revisions.tsx diff --git a/lib/icons/search-small.jsx b/lib/icons/search-small.tsx similarity index 100% rename from lib/icons/search-small.jsx rename to lib/icons/search-small.tsx diff --git a/lib/icons/settings.jsx b/lib/icons/settings.tsx similarity index 100% rename from lib/icons/settings.jsx rename to lib/icons/settings.tsx diff --git a/lib/icons/share.jsx b/lib/icons/share.tsx similarity index 100% rename from lib/icons/share.jsx rename to lib/icons/share.tsx diff --git a/lib/icons/sidebar.jsx b/lib/icons/sidebar.tsx similarity index 100% rename from lib/icons/sidebar.jsx rename to lib/icons/sidebar.tsx diff --git a/lib/icons/simplenote-compact.jsx b/lib/icons/simplenote-compact.tsx similarity index 100% rename from lib/icons/simplenote-compact.jsx rename to lib/icons/simplenote-compact.tsx diff --git a/lib/icons/simplenote.jsx b/lib/icons/simplenote.tsx similarity index 100% rename from lib/icons/simplenote.jsx rename to lib/icons/simplenote.tsx diff --git a/lib/icons/sync.jsx b/lib/icons/sync.tsx similarity index 100% rename from lib/icons/sync.jsx rename to lib/icons/sync.tsx diff --git a/lib/icons/tags.jsx b/lib/icons/tags.tsx similarity index 100% rename from lib/icons/tags.jsx rename to lib/icons/tags.tsx diff --git a/lib/icons/trash.jsx b/lib/icons/trash.tsx similarity index 100% rename from lib/icons/trash.jsx rename to lib/icons/trash.tsx diff --git a/lib/icons/wordpress.jsx b/lib/icons/wordpress.tsx similarity index 100% rename from lib/icons/wordpress.jsx rename to lib/icons/wordpress.tsx diff --git a/lib/navigation-bar/index.jsx b/lib/navigation-bar/index.tsx similarity index 100% rename from lib/navigation-bar/index.jsx rename to lib/navigation-bar/index.tsx diff --git a/lib/navigation-bar/item/index.jsx b/lib/navigation-bar/item/index.tsx similarity index 100% rename from lib/navigation-bar/item/index.jsx rename to lib/navigation-bar/item/index.tsx diff --git a/lib/note-content-editor.jsx b/lib/note-content-editor.tsx similarity index 99% rename from lib/note-content-editor.jsx rename to lib/note-content-editor.tsx index d20d1e4f1..7f442e85c 100644 --- a/lib/note-content-editor.jsx +++ b/lib/note-content-editor.tsx @@ -33,6 +33,7 @@ export default class NoteContentEditor extends Component { content: PropTypes.shape({ text: PropTypes.string.isRequired, hasRemoteUpdate: PropTypes.bool.isRequired, + version: PropTypes.string, }), filter: PropTypes.string.isRequired, noteId: PropTypes.string, diff --git a/lib/note-detail/index.jsx b/lib/note-detail/index.tsx similarity index 94% rename from lib/note-detail/index.jsx rename to lib/note-detail/index.tsx index f5ba5a9ec..1502ac4f6 100644 --- a/lib/note-detail/index.jsx +++ b/lib/note-detail/index.tsx @@ -2,8 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { get, debounce, noop } from 'lodash'; -import classNames from 'classnames'; - import analytics from '../analytics'; import appState from '../flux/app-state'; import { viewExternalUrl } from '../utils/url-utils'; @@ -21,7 +19,6 @@ export class NoteDetail extends Component { dialogs: PropTypes.array.isRequired, filter: PropTypes.string.isRequired, fontSize: PropTypes.number, - isViewingRevisions: PropTypes.bool.isRequired, onChangeContent: PropTypes.func.isRequired, syncNote: PropTypes.func.isRequired, onNotePrinted: PropTypes.func.isRequired, @@ -190,7 +187,6 @@ export class NoteDetail extends Component { note, filter, fontSize, - isViewingRevisions, previewingMarkdown, spellCheckEnabled, } = this.props; @@ -202,10 +198,6 @@ export class NoteDetail extends Component { }; const divStyle = { fontSize: `${fontSize}px` }; - const mainClasses = classNames('note-detail', { - 'is-viewing-revisions': isViewingRevisions, - }); - return (
{!note ? ( @@ -213,7 +205,7 @@ export class NoteDetail extends Component {
) : ( -
+
{previewingMarkdown && (
({ dialogs: state.dialogs, filter: state.filter, - isViewingRevisions: state.isViewingRevisions, shouldPrint: state.shouldPrint, showNoteInfo: state.showNoteInfo, spellCheckEnabled: settings.spellCheckEnabled, @@ -263,7 +254,4 @@ const mapDispatchToProps = { onNotePrinted: () => setShouldPrintNote({ shouldPrint: false }), }; -export default connect( - mapStateToProps, - mapDispatchToProps -)(NoteDetail); +export default connect(mapStateToProps, mapDispatchToProps)(NoteDetail); diff --git a/lib/note-detail/render-to-node.js b/lib/note-detail/render-to-node.ts similarity index 95% rename from lib/note-detail/render-to-node.js rename to lib/note-detail/render-to-node.ts index 46acfb5a0..1a40c7b21 100644 --- a/lib/note-detail/render-to-node.js +++ b/lib/note-detail/render-to-node.ts @@ -13,7 +13,7 @@ export const renderToNode = (node, content) => { .then(({ default: highlight }) => { codeElements.forEach(highlight.highlightBlock); }) - .catch(console.log); + .catch(); } }); }; diff --git a/lib/note-detail/style.scss b/lib/note-detail/style.scss index e859ffc97..2a45cd306 100644 --- a/lib/note-detail/style.scss +++ b/lib/note-detail/style.scss @@ -19,10 +19,6 @@ justify-content: center; transition: all 0.3s ease-in-out; - &.is-viewing-revisions { - padding-top: 51px; - } - div[data-contents] { padding-bottom: 20px; } diff --git a/lib/note-detail/toggle-task/constants.js b/lib/note-detail/toggle-task/constants.ts similarity index 72% rename from lib/note-detail/toggle-task/constants.js rename to lib/note-detail/toggle-task/constants.ts index 567ad6f05..2c4584ae7 100644 --- a/lib/note-detail/toggle-task/constants.js +++ b/lib/note-detail/toggle-task/constants.ts @@ -3,6 +3,6 @@ export const selectors = { markdownRoot: '[data-markdown-root]', }; -export const taskPrefixRegex = /^(\s*)(-[ \t]+\[[xX\s]?\])/g; +export const taskPrefixRegex = /^(\s*)(-[ \t]+\[[xX\s]?\])/gm; export const taskRegex = /^(\s*)(-[ \t]+\[[xX\s]?\])(.+)/gm; diff --git a/lib/note-detail/toggle-task/get-index-in-text.test.js b/lib/note-detail/toggle-task/get-index-in-text.test.ts similarity index 100% rename from lib/note-detail/toggle-task/get-index-in-text.test.js rename to lib/note-detail/toggle-task/get-index-in-text.test.ts diff --git a/lib/note-detail/toggle-task/get-index-in-text.js b/lib/note-detail/toggle-task/get-index-in-text.ts similarity index 100% rename from lib/note-detail/toggle-task/get-index-in-text.js rename to lib/note-detail/toggle-task/get-index-in-text.ts diff --git a/lib/note-detail/toggle-task/index.test.js b/lib/note-detail/toggle-task/index.test.ts similarity index 100% rename from lib/note-detail/toggle-task/index.test.js rename to lib/note-detail/toggle-task/index.test.ts diff --git a/lib/note-detail/toggle-task/index.js b/lib/note-detail/toggle-task/index.ts similarity index 100% rename from lib/note-detail/toggle-task/index.js rename to lib/note-detail/toggle-task/index.ts diff --git a/lib/note-editor/index.jsx b/lib/note-editor/index.tsx similarity index 90% rename from lib/note-editor/index.jsx rename to lib/note-editor/index.tsx index 6abdc9371..a1579a578 100644 --- a/lib/note-editor/index.jsx +++ b/lib/note-editor/index.tsx @@ -16,7 +16,6 @@ export class NoteEditor extends Component { isEditorActive: PropTypes.bool.isRequired, isSmallScreen: PropTypes.bool.isRequired, filter: PropTypes.string.isRequired, - markdownEnabled: PropTypes.bool.isRequired, note: PropTypes.object, noteBucket: PropTypes.object.isRequired, fontSize: PropTypes.number, @@ -44,13 +43,28 @@ export class NoteEditor extends Component { this.toggleShortcuts(false); } + markdownEnabled = () => { + const revision = this.props.revision || this.props.note; + return ( + revision && + revision.data && + revision.data.systemTags && + revision.data.systemTags.indexOf('markdown') !== -1 + ); + }; + handleShortcut = event => { const { ctrlKey, key, metaKey, shiftKey } = event; const cmdOrCtrl = ctrlKey || metaKey; // toggle editor mode - if (cmdOrCtrl && 'P' === key && this.props.markdownEnabled) { + if ( + cmdOrCtrl && + shiftKey && + 'p' === key.toLowerCase() && + this.markdownEnabled + ) { const prevEditorMode = this.props.editorMode; const nextEditorMode = prevEditorMode === 'edit' ? 'markdown' : 'edit'; @@ -118,12 +132,6 @@ export class NoteEditor extends Component { const tags = (revision && revision.data && revision.data.tags) || []; const isTrashed = !!(note && note.data.deleted); - const markdownEnabled = - revision && - revision.data && - revision.data.systemTags && - revision.data.systemTags.indexOf('markdown') !== -1; - return (
({ fontSize: settings.fontSize, editorMode: state.editorMode, isEditorActive: !state.showNavigation, - markdownEnabled: settings.markdownEnabled, revision: state.revision, }); @@ -168,7 +177,4 @@ const mapDispatchToProps = dispatch => ({ setEditorMode: args => dispatch(setEditorMode(args)), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(NoteEditor); +export default connect(mapStateToProps, mapDispatchToProps)(NoteEditor); diff --git a/lib/note-info/index.jsx b/lib/note-info/index.tsx similarity index 97% rename from lib/note-info/index.jsx rename to lib/note-info/index.tsx index 2a07263c3..263eded50 100644 --- a/lib/note-info/index.jsx +++ b/lib/note-info/index.tsx @@ -9,10 +9,11 @@ import CrossIcon from '../icons/cross'; import { connect } from 'react-redux'; import appState from '../flux/app-state'; import { setMarkdown } from '../state/settings/actions'; -import filterNotes from '../utils/filter-notes'; export class NoteInfo extends Component { static propTypes = { + isMarkdown: PropTypes.bool.isRequired, + isPinned: PropTypes.bool.isRequired, note: PropTypes.object, markdownEnabled: PropTypes.bool, onPinNote: PropTypes.func.isRequired, @@ -187,8 +188,7 @@ function characterCount(content) { const { markdownNote, pinNote, toggleNoteInfo } = appState.actionCreators; -const mapStateToProps = ({ appState: state }) => { - const filteredNotes = filterNotes(state); +const mapStateToProps = ({ appState: state, ui: { filteredNotes } }) => { const noteIndex = Math.max(state.previousIndex, 0); const note = state.note ? state.note : filteredNotes[noteIndex]; return { diff --git a/lib/note-list/decorators.js b/lib/note-list/decorators.js deleted file mode 100644 index a2db8d2e3..000000000 --- a/lib/note-list/decorators.js +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import replaceToArray from 'string-replace-to-array'; - -import Checkbox from '../components/checkbox'; -import { taskPrefixRegex } from '../note-detail/toggle-task/constants'; - -export const decorateWith = (decorators, text) => { - let output = text; - let i = 0; - - decorators.forEach(({ filter, replacer }) => { - output = replaceToArray(output, filter, replacer(i++)); - }); - - return output; -}; - -export const checkboxDecorator = { - filter: taskPrefixRegex, - replacer: key => match => { - const isChecked = /x/i.test(match); - return ; - }, -}; - -export const makeFilterDecorator = filter => ({ - filter, - replacer: key => match => { - if (match.length) { - return ( - - {match} - - ); - } - }, -}); diff --git a/lib/note-list/decorators.tsx b/lib/note-list/decorators.tsx new file mode 100644 index 000000000..c0204a976 --- /dev/null +++ b/lib/note-list/decorators.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { escapeRegExp } from 'lodash'; +import replaceToArray from 'string-replace-to-array'; + +import Checkbox from '../components/checkbox'; +import { withoutTags } from '../utils/filter-notes'; +import { taskPrefixRegex } from '../note-detail/toggle-task/constants'; + +export const decorateWith = (decorators, text) => + decorators + .reduce((output, { filter, replacer }) => { + const searchText = 'string' === typeof filter && withoutTags(filter); + const pattern = + searchText && searchText.length > 0 + ? new RegExp(escapeRegExp(searchText), 'g') + : filter; + + return replaceToArray(output, pattern, replacer); + }, text) + .map((chunk, key) => + chunk && 'string' !== typeof chunk + ? React.cloneElement(chunk, { key }) + : chunk + ); + +export const checkboxDecorator = { + filter: taskPrefixRegex, + replacer: match => { + const isChecked = /x/i.test(match); + return ; + }, +}; + +export const makeFilterDecorator = filter => ({ + filter, + replacer: match => { + if (match.length) { + return {match}; + } + }, +}); diff --git a/lib/note-list/get-note-title-and-preview.test.js b/lib/note-list/get-note-title-and-preview.test.ts similarity index 100% rename from lib/note-list/get-note-title-and-preview.test.js rename to lib/note-list/get-note-title-and-preview.test.ts diff --git a/lib/note-list/get-note-title-and-preview.js b/lib/note-list/get-note-title-and-preview.ts similarity index 100% rename from lib/note-list/get-note-title-and-preview.js rename to lib/note-list/get-note-title-and-preview.ts diff --git a/lib/note-list/index.jsx b/lib/note-list/index.tsx similarity index 78% rename from lib/note-list/index.jsx rename to lib/note-list/index.tsx index 679fa8811..581e98ab8 100644 --- a/lib/note-list/index.jsx +++ b/lib/note-list/index.tsx @@ -12,7 +12,7 @@ * row height calculations should be double-checked * against performance regressions. */ -import React, { Component, Fragment } from 'react'; +import React, { Component, Fragment, createRef } from 'react'; import PropTypes from 'prop-types'; import { AutoSizer, List } from 'react-virtualized'; import PublishIcon from '../icons/feed'; @@ -21,13 +21,13 @@ import { debounce, get, isEmpty } from 'lodash'; import { connect } from 'react-redux'; import appState from '../flux/app-state'; import { tracks } from '../analytics'; -import filterNotes from '../utils/filter-notes'; import getNoteTitleAndPreview from './get-note-title-and-preview'; import { decorateWith, checkboxDecorator, makeFilterDecorator, } from './decorators'; +import TagSuggestions, { getMatchingTags } from '../tag-suggestions'; AutoSizer.displayName = 'AutoSizer'; List.displayName = 'List'; @@ -70,6 +70,15 @@ const maxPreviewLines = { expanded: 4, }; +/** @type {Number} height of a single header in list rows */ +const HEADER_HEIGHT = 28; + +/** @type {Number} height of a single tag result row in list rows */ +const TAG_ROW_HEIGHT = 40; + +/** @type {Number} height of a the empty "No Notes" div in the notes list */ +const EMPTY_DIV_HEIGHT = 200; + /** * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. * @@ -98,11 +107,25 @@ const previewCache = new Map(); * @param {Function} f produces the row height * @returns {Number} row height for note in list */ -const rowHeightCache = f => (notes, { noteDisplay, width }) => ({ index }) => { +const rowHeightCache = f => ( + notes, + { noteDisplay, tagResultsFound, width } +) => ({ index }) => { const note = notes[index]; + + // handle special sections + switch (note) { + case 'notes-header': + return HEADER_HEIGHT; + case 'tag-suggestions': + return HEADER_HEIGHT + TAG_ROW_HEIGHT * tagResultsFound; + case 'no-notes': + return EMPTY_DIV_HEIGHT; + } + const { preview } = getNoteTitleAndPreview(note); - const key = notes[index].id; + const key = note.id; const cached = previewCache.get(key); if ('undefined' !== typeof cached) { @@ -133,6 +156,10 @@ const rowHeightCache = f => (notes, { noteDisplay, width }) => ({ index }) => { * @returns {Number} height of the row in the list */ const computeRowHeight = (width, noteDisplay, preview) => { + if ('condensed' === noteDisplay) { + return ROW_HEIGHT_BASE; + } + const lines = Math.ceil(getTextWidth(preview, width - 24) / (width - 24)); return ( ROW_HEIGHT_BASE + @@ -176,12 +203,35 @@ const renderNote = ( } ) => ({ index, rowIndex, key, style }) => { const note = notes['undefined' === typeof index ? rowIndex : index]; + + // handle special sections + switch (note) { + case 'notes-header': + return ( +
+ Notes +
+ ); + case 'tag-suggestions': + return ( +
+ +
+ ); + case 'no-notes': + return ( +
+ No Notes +
+ ); + } + const { title, preview } = getNoteTitleAndPreview(note); const isPublished = !isEmpty(note.data.publishURL); const classes = classNames('note-list-item', { 'note-list-item-selected': !isSmallScreen && selectedNoteId === note.id, - 'note-list-item-pinned': note.pinned, + 'note-list-item-pinned': note.data.systemTags.includes('pinned'), 'published-note': isPublished, }); @@ -196,12 +246,12 @@ const renderNote = (
@@ -222,12 +272,38 @@ const renderNote = ( ); }; +/** + * Modifies the filtered notes list to insert special sections. This + * allows us to handle tag suggestions and headers in the row renderer. + * + * @see renderNote + * + * @param {Object[]} notes list of filtered notes + * @param {String} filter search filter + * @param {Number} tagResultsFound number of tag matches to display + * @returns {Object[]} modified notes list + */ +const createCompositeNoteList = (notes, filter, tagResultsFound) => { + if (filter.length === 0 || tagResultsFound === 0) { + return notes; + } + + return [ + 'tag-suggestions', + 'notes-header', + ...(notes.length > 0 ? notes : ['no-notes']), + ]; +}; + export class NoteList extends Component { static displayName = 'NoteList'; + list = createRef(); + static propTypes = { closeNote: PropTypes.func.isRequired, filter: PropTypes.string.isRequired, + tagResultsFound: PropTypes.number.isRequired, isSmallScreen: PropTypes.bool.isRequired, notes: PropTypes.array.isRequired, selectedNoteId: PropTypes.any, @@ -245,7 +321,7 @@ export class NoteList extends Component { * performance hits due to row height computation */ this.recomputeHeights = debounce( - () => this.list && this.list.recomputeRowHeights(), + () => this.list.current && this.list.current.recomputeRowHeights(), TYPING_DEBOUNCE_DELAY, { maxWait: TYPING_DEBOUNCE_MAX } ); @@ -264,6 +340,7 @@ export class NoteList extends Component { } = this.props; if ( + prevProps.filter !== this.props.filter || prevProps.noteDisplay !== this.props.noteDisplay || prevProps.notes !== notes || prevProps.selectedNoteContent !== this.props.selectedNoteContent @@ -316,8 +393,6 @@ export class NoteList extends Component { return true; }; - refList = r => (this.list = r); - toggleShortcuts = doEnable => { if (doEnable) { window.addEventListener('keydown', this.handleShortcut, true); @@ -336,6 +411,7 @@ export class NoteList extends Component { onEmptyTrash, noteDisplay, showTrash, + tagResultsFound, notes, isSmallScreen, } = this.props; @@ -369,27 +445,30 @@ export class NoteList extends Component { return (
{isEmptyList ? ( - { hasLoaded ? 'No Notes' : 'Loading Notes'} + + {hasLoaded ? 'No Notes' : 'Loading Notes'} + ) : (
{({ height, width }) => ( @@ -403,7 +482,8 @@ export class NoteList extends Component { ); } - onPinNote = note => this.props.onPinNote(note, !note.pinned); + onPinNote = note => + this.props.onPinNote(note, !note.data.systemTags.includes('pinned')); } const { @@ -414,8 +494,13 @@ const { } = appState.actionCreators; const { recordEvent } = tracks; -const mapStateToProps = ({ appState: state, settings: { noteDisplay } }) => { - const filteredNotes = filterNotes(state); +const mapStateToProps = ({ + appState: state, + ui: { filteredNotes }, + settings: { noteDisplay }, +}) => { + const tagResultsFound = getMatchingTags(state.tags, state.filter).length; + const noteIndex = Math.max(state.previousIndex, 0); const selectedNote = state.note ? state.note : filteredNotes[noteIndex]; const selectedNoteId = get(selectedNote, 'id', state.selectedNoteId); @@ -429,6 +514,12 @@ const mapStateToProps = ({ appState: state, settings: { noteDisplay } }) => { const nextNote = filteredNotes[nextNoteId]; const prevNote = filteredNotes[prevNoteId]; + const compositeNoteList = createCompositeNoteList( + filteredNotes, + state.filter, + tagResultsFound + ); + /** * Although not used directly in the React component this value * is used to bust the cache when editing a note and the number @@ -457,12 +548,13 @@ const mapStateToProps = ({ appState: state, settings: { noteDisplay } }) => { hasLoaded: state.notes !== null, nextNote, noteDisplay, - notes: filteredNotes, + notes: compositeNoteList, prevNote, selectedNotePreview, selectedNoteContent: get(selectedNote, 'data.content'), selectedNoteId, showTrash: state.showTrash, + tagResultsFound, }; }; @@ -470,13 +562,19 @@ const mapDispatchToProps = (dispatch, { noteBucket }) => ({ closeNote: () => dispatch(closeNote()), onEmptyTrash: () => dispatch(emptyTrash({ noteBucket })), onSelectNote: noteId => { - dispatch(loadAndSelectNote({ noteBucket, noteId })); - recordEvent('list_note_opened'); + if (noteId) { + dispatch(loadAndSelectNote({ noteBucket, noteId })); + recordEvent('list_note_opened'); + } }, onPinNote: (note, pin) => dispatch(pinNote({ noteBucket, note, pin })), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(NoteList); +NoteList.propTypes = { + hasLoaded: PropTypes.bool.isRequired, + nextNote: PropTypes.object, + prevNote: PropTypes.object, + selectedNoteContent: PropTypes.string, +}; + +export default connect(mapStateToProps, mapDispatchToProps)(NoteList); diff --git a/lib/note-list/style.scss b/lib/note-list/style.scss index c4d17b844..b7cd7713a 100644 --- a/lib/note-list/style.scss +++ b/lib/note-list/style.scss @@ -44,6 +44,17 @@ text-align: center; } +.note-list-header { + width: 100%; + height: 28px; + font-size: 14px; + font-weight: 500; + line-height: normal; + color: $studio-gray-70; + background: rgba($studio-gray-5, 0.5); + padding: 5px 30px; +} + .note-list-item { cursor: pointer; display: flex; @@ -125,6 +136,6 @@ } .note-list-item-excerpt { - color: $studio-gray-80 + color: $studio-gray-80; } } diff --git a/lib/note-toolbar-container.js b/lib/note-toolbar-container.ts similarity index 60% rename from lib/note-toolbar-container.js rename to lib/note-toolbar-container.ts index df8315a4b..564b3e81d 100644 --- a/lib/note-toolbar-container.js +++ b/lib/note-toolbar-container.ts @@ -1,47 +1,31 @@ -import { Component, cloneElement } from 'react'; -import PropTypes from 'prop-types'; +import { Component, ReactElement, cloneElement } from 'react'; import { connect } from 'react-redux'; -import { get, includes } from 'lodash'; import analytics from './analytics'; import appState from './flux/app-state'; import { toggleFocusMode } from './state/settings/actions'; import DialogTypes from '../shared/dialog-types'; -import filterNotes from './utils/filter-notes'; - -export class NoteToolbarContainer extends Component { - static propTypes = { - closeNote: PropTypes.func.isRequired, - deleteNoteForever: PropTypes.func.isRequired, - editorMode: PropTypes.oneOf(['edit', 'markdown']), - noteBucket: PropTypes.object.isRequired, - noteRevisions: PropTypes.func.isRequired, - onNoteClosed: PropTypes.func.isRequired, - restoreNote: PropTypes.func.isRequired, - revisionOrNote: PropTypes.object, - setEditorMode: PropTypes.func.isRequired, - setIsViewingRevisions: PropTypes.func.isRequired, - shareNote: PropTypes.func.isRequired, - stateForFilterNotes: PropTypes.object.isRequired, - toggleFocusMode: PropTypes.func.isRequired, - toggleNoteInfo: PropTypes.func.isRequired, - toolbar: PropTypes.element.isRequired, - trashNote: PropTypes.func.isRequired, - }; - static defaultProps = { - editorMode: 'edit', - }; +import * as T from './types'; +import { State } from './state'; - // Gets the index of the note located before the currently selected one - getPreviousNoteIndex = note => { - const filteredNotes = filterNotes(this.props.stateForFilterNotes); +type ExternalProps = { + noteBucket: T.Bucket; + onNoteClosed: Function; + toolbar: ReactElement; +}; - const noteIndex = function(filteredNote) { - return note.id === filteredNote.id; - }; +type ConnectedProps = ReturnType & + ReturnType; + +type Props = ExternalProps & ConnectedProps; - return Math.max(filteredNotes.findIndex(noteIndex) - 1, 0); +export class NoteToolbarContainer extends Component { + // Gets the index of the note located before the currently selected one + getPreviousNoteIndex = (note: T.NoteEntity) => { + const noteIndex = this.props.notes.findIndex(({ id }) => note.id === id); + + return Math.max(noteIndex - 1, 0); }; onCloseNote = () => { @@ -49,7 +33,7 @@ export class NoteToolbarContainer extends Component { this.props.onNoteClosed(); }; - onTrashNote = note => { + onTrashNote = (note: T.NoteEntity) => { const { noteBucket } = this.props; const previousIndex = this.getPreviousNoteIndex(note); this.props.trashNote({ noteBucket, note, previousIndex }); @@ -57,14 +41,14 @@ export class NoteToolbarContainer extends Component { analytics.tracks.recordEvent('editor_note_deleted'); }; - onDeleteNoteForever = note => { + onDeleteNoteForever = (note: T.NoteEntity) => { const { noteBucket } = this.props; const previousIndex = this.getPreviousNoteIndex(note); this.props.deleteNoteForever({ noteBucket, note, previousIndex }); this.props.onNoteClosed(); }; - onRestoreNote = note => { + onRestoreNote = (note: T.NoteEntity) => { const { noteBucket } = this.props; const previousIndex = this.getPreviousNoteIndex(note); this.props.restoreNote({ noteBucket, note, previousIndex }); @@ -72,7 +56,7 @@ export class NoteToolbarContainer extends Component { analytics.tracks.recordEvent('editor_note_restored'); }; - onShowRevisions = note => { + onShowRevisions = (note: T.NoteEntity) => { const { noteBucket } = this.props; this.props.noteRevisions({ noteBucket, note }); analytics.tracks.recordEvent('editor_versions_accessed'); @@ -83,10 +67,16 @@ export class NoteToolbarContainer extends Component { analytics.tracks.recordEvent('editor_share_dialog_viewed'); }; - onSetEditorMode = mode => this.props.setEditorMode({ mode }); + onSetEditorMode = (mode: T.EditorMode) => this.props.setEditorMode({ mode }); render() { - const { toolbar } = this.props; + const { + editorMode, + isViewingRevisions, + toolbar, + revisionOrNote, + } = this.props; + const handlers = { onCloseNote: this.onCloseNote, onDeleteNoteForever: this.onDeleteNoteForever, @@ -99,24 +89,27 @@ export class NoteToolbarContainer extends Component { setIsViewingRevisions: this.props.setIsViewingRevisions, toggleFocusMode: this.props.toggleFocusMode, }; - const { editorMode, revisionOrNote } = this.props; - const systemTags = get(revisionOrNote, 'data.systemTags', []); - const markdownEnabled = includes(systemTags, 'markdown'); + if (isViewingRevisions) { + return null; + } + + const markdownEnabled = revisionOrNote + ? revisionOrNote.data.systemTags.includes('markdown') + : false; return cloneElement(toolbar, { ...handlers, editorMode, markdownEnabled }); } } -const mapStateToProps = ({ appState: state }) => ({ +const mapStateToProps = ({ + appState: state, + ui: { filteredNotes }, +}: State) => ({ + isViewingRevisions: state.isViewingRevisions, editorMode: state.editorMode, + notes: filteredNotes, revisionOrNote: state.revision || state.note, - stateForFilterNotes: { - filter: state.filter, - notes: state.notes, - showTrash: state.showTrash, - tag: state.tag, - }, }); const { @@ -137,7 +130,7 @@ const mapDispatchToProps = dispatch => ({ noteRevisions: args => dispatch(noteRevisions(args)), restoreNote: args => dispatch(restoreNote(args)), setEditorMode: args => dispatch(setEditorMode(args)), - setIsViewingRevisions: isViewingRevisions => { + setIsViewingRevisions: (isViewingRevisions: boolean) => { dispatch(setIsViewingRevisions({ isViewingRevisions })); }, shareNote: () => dispatch(showDialog({ dialog: DialogTypes.SHARE })), diff --git a/lib/note-toolbar/index.jsx b/lib/note-toolbar/index.tsx similarity index 100% rename from lib/note-toolbar/index.jsx rename to lib/note-toolbar/index.tsx diff --git a/lib/revision-selector/index.jsx b/lib/revision-selector/index.tsx similarity index 78% rename from lib/revision-selector/index.jsx rename to lib/revision-selector/index.tsx index 1693901bf..857324bbd 100644 --- a/lib/revision-selector/index.jsx +++ b/lib/revision-selector/index.tsx @@ -1,6 +1,5 @@ -import React, { Component } from 'react'; +import React, { CSSProperties, Component, ChangeEventHandler } from 'react'; import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; import onClickOutside from 'react-onclickoutside'; import format from 'date-fns/format'; import { orderBy } from 'lodash'; @@ -9,30 +8,38 @@ import Slider from '../components/slider'; import appState from '../flux/app-state'; import { updateNoteTags } from '../state/domain/notes'; -const sortedRevisions = revisions => orderBy(revisions, 'version', 'asc'); - -export class RevisionSelector extends Component { - static propTypes = { - isViewingRevisions: PropTypes.bool.isRequired, - note: PropTypes.object, - revisions: PropTypes.array.isRequired, - onUpdateContent: PropTypes.func.isRequired, - setRevision: PropTypes.func.isRequired, - resetIsViewingRevisions: PropTypes.func.isRequired, - cancelRevision: PropTypes.func.isRequired, - updateNoteTags: PropTypes.func.isRequired, - }; +import { NoteEntity } from '../types'; + +const sortedRevisions = (revisions: NoteEntity[]) => + orderBy(revisions, 'version', 'asc'); + +type Props = { + isViewingRevisions: boolean; + note: NoteEntity; + revisions: NoteEntity[]; + onUpdateContent: Function; + setRevision: Function; + resetIsViewingRevisions: Function; + cancelRevision: Function; + updateNoteTags: Function; +}; - constructor(...args) { - super(...args); +type State = { + revisions: NoteEntity[]; + selection: number; +}; + +export class RevisionSelector extends Component { + constructor(props: Props, ...args: unknown[]) { + super(props, ...args); this.state = { - revisions: sortedRevisions(this.props.revisions), + revisions: sortedRevisions(props.revisions), selection: Infinity, }; } - componentWillReceiveProps({ revisions: nextRevisions }) { + componentWillReceiveProps({ revisions: nextRevisions }: Props) { const { revisions: prevRevisions } = this.props; if (nextRevisions === prevRevisions) { @@ -44,7 +51,7 @@ export class RevisionSelector extends Component { }); } - componentDidUpdate({ revisions: prevRevisions }) { + componentDidUpdate({ revisions: prevRevisions }: Props) { const { revisions: nextRevisions } = this.props; if (prevRevisions !== nextRevisions) { @@ -76,7 +83,7 @@ export class RevisionSelector extends Component { data: { content, tags }, } = revision; - onUpdateContent(note, content); + onUpdateContent(note, content, true); this.props.updateNoteTags({ note, tags }); resetIsViewingRevisions(); } @@ -85,15 +92,15 @@ export class RevisionSelector extends Component { resetSelection = () => this.setState({ selection: Infinity }); - onSelectRevision = ({ target: { value } }) => { + onSelectRevision: ChangeEventHandler = ({ + target: { value }, + }) => { const { revisions } = this.state; const selection = parseInt(value, 10); const revision = revisions[selection]; - this.setState({ - selection, - }); + this.setState({ selection }); this.props.setRevision(revision); }; @@ -104,8 +111,12 @@ export class RevisionSelector extends Component { render() { const { isViewingRevisions } = this.props; - const { revisions, selection: rawSelection } = this.state; + if (!isViewingRevisions) { + return null; + } + + const { revisions, selection: rawSelection } = this.state; const min = 0; const max = Math.max(revisions.length - 1, 1); const selection = Math.min(rawSelection, max); @@ -118,7 +129,7 @@ export class RevisionSelector extends Component { 'MMM d, yyyy h:mm a' ); - const revisionButtonStyle = + const revisionButtonStyle: CSSProperties = selection === max ? { opacity: '0.5', pointerEvents: 'none' } : {}; const mainClasses = classNames('revision-selector', { diff --git a/lib/revision-selector/style.scss b/lib/revision-selector/style.scss index c44c54f49..e433184da 100644 --- a/lib/revision-selector/style.scss +++ b/lib/revision-selector/style.scss @@ -3,11 +3,7 @@ padding: 10px 20px 20px 20px; color: $studio-white; z-index: 1000; - position: absolute; height: 114px; - left: 0; - top: -114px; - right: 0; transition: all 0.3s ease-in-out; &.is-visible { diff --git a/lib/search-bar/index.jsx b/lib/search-bar/index.tsx similarity index 80% rename from lib/search-bar/index.jsx rename to lib/search-bar/index.tsx index b64b7ce08..2031445fa 100644 --- a/lib/search-bar/index.jsx +++ b/lib/search-bar/index.tsx @@ -1,7 +1,7 @@ /** * External dependencies */ -import React from 'react'; +import React, { FunctionComponent } from 'react'; import { connect } from 'react-redux'; /** @@ -18,7 +18,14 @@ import { withoutTags } from '../utils/filter-notes'; const { newNote, search, toggleNavigation } = appState.actionCreators; const { recordEvent } = tracks; -export const SearchBar = ({ +type Props = { + onNewNote: Function; + onToggleNavigation: Function; + query: string; + showTrash: boolean; +}; + +export const SearchBar: FunctionComponent = ({ onNewNote, onToggleNavigation, query, @@ -42,7 +49,7 @@ const mapStateToProps = ({ appState: state }) => ({ }); const mapDispatchToProps = (dispatch, { noteBucket, onNoteOpened }) => ({ - onNewNote: content => { + onNewNote: (content: string) => { dispatch(search({ filter: '' })); dispatch(newNote({ noteBucket, content })); onNoteOpened(); @@ -53,7 +60,4 @@ const mapDispatchToProps = (dispatch, { noteBucket, onNoteOpened }) => ({ SearchBar.displayName = 'SearchBar'; -export default connect( - mapStateToProps, - mapDispatchToProps -)(SearchBar); +export default connect(mapStateToProps, mapDispatchToProps)(SearchBar); diff --git a/lib/search-field/index.jsx b/lib/search-field/index.jsx deleted file mode 100644 index 71c658432..000000000 --- a/lib/search-field/index.jsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { debounce, isEmpty } from 'lodash'; -import SmallCrossIcon from '../icons/cross-small'; -import appState from '../flux/app-state'; -import { tracks } from '../analytics'; - -const { search, setSearchFocus } = appState.actionCreators; -const { recordEvent } = tracks; -const KEY_ESC = 27; -const SEARCH_DELAY = 500; - -export class SearchField extends Component { - static displayName = 'SearchField'; - - static propTypes = { - isTagSelected: PropTypes.bool.isRequired, - placeholder: PropTypes.string.isRequired, - searchFocus: PropTypes.bool.isRequired, - onSearch: PropTypes.func.isRequired, - onSearchFocused: PropTypes.func.isRequired, - }; - - state = { - query: '', - }; - - componentDidUpdate() { - const { searchFocus, onSearchFocused } = this.props; - - if (searchFocus && this.inputField) { - this.inputField.select(); - this.inputField.focus(); - onSearchFocused(); - } - } - - interceptEsc = event => { - if (KEY_ESC === event.keyCode) { - if (this.state.query === '') { - this.inputField.blur(); - } - this.clearQuery(); - } - }; - - storeInput = r => (this.inputField = r); - - debouncedSearch = debounce(query => this.props.onSearch(query), SEARCH_DELAY); - - update = ({ target: { value: query } }) => { - this.setState({ query }); - this.debouncedSearch(query); - }; - - clearQuery = () => { - this.setState({ query: '' }); - this.debouncedSearch(''); - this.debouncedSearch.flush(); - }; - - render() { - const { isTagSelected, placeholder } = this.props; - const { query } = this.state; - const hasQuery = query && query.length > 0; - - const screenReaderLabel = - 'Search ' + (isTagSelected ? 'notes with tag ' : '') + placeholder; - - return ( -
- - -
- ); - } -} - -const mapStateToProps = ({ appState: state }) => ({ - isTagSelected: !isEmpty(state.tag), - placeholder: state.listTitle, - searchFocus: state.searchFocus, -}); - -const mapDispatchToProps = dispatch => ({ - onSearch: filter => { - dispatch(search({ filter })); - recordEvent('list_notes_searched'); - }, - onSearchFocused: () => dispatch(setSearchFocus({ searchFocus: false })), -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(SearchField); diff --git a/lib/search-field/index.tsx b/lib/search-field/index.tsx new file mode 100644 index 000000000..bd6070016 --- /dev/null +++ b/lib/search-field/index.tsx @@ -0,0 +1,93 @@ +import React, { Component, createRef, FormEvent, KeyboardEvent } from 'react'; +import { connect } from 'react-redux'; +import SmallCrossIcon from '../icons/cross-small'; +import appState from '../flux/app-state'; +import { tracks } from '../analytics'; +import { State } from '../state'; + +const { search, setSearchFocus } = appState.actionCreators; +const { recordEvent } = tracks; +const KEY_ESC = 27; + +type ConnectedProps = ReturnType & + ReturnType; + +export class SearchField extends Component { + static displayName = 'SearchField'; + + inputField = createRef(); + + componentDidUpdate() { + const { searchFocus, onSearchFocused } = this.props; + + if (searchFocus && this.inputField.current) { + this.inputField.current.select(); + this.inputField.current.focus(); + onSearchFocused(); + } + } + + interceptEsc = (event: KeyboardEvent) => { + if (KEY_ESC === event.keyCode) { + if (this.props.filter === '' && this.inputField.current) { + this.inputField.current.blur(); + } + this.clearQuery(); + } + }; + + update = ({ + currentTarget: { value: filter }, + }: FormEvent) => { + this.props.onSearch(filter); + }; + + clearQuery = () => this.props.onSearch(''); + + render() { + const { filter, isTagSelected, placeholder } = this.props; + const hasQuery = filter.length > 0; + + const screenReaderLabel = + 'Search ' + (isTagSelected ? 'notes with tag ' : '') + placeholder; + + return ( +
+ + +
+ ); + } +} + +const mapStateToProps = ({ appState: state }: State) => ({ + filter: state.filter, + isTagSelected: !!state.tag, + placeholder: state.listTitle, + searchFocus: state.searchFocus, +}); + +const mapDispatchToProps = dispatch => ({ + onSearch: (filter: string) => { + dispatch(search({ filter })); + recordEvent('list_notes_searched'); + }, + onSearchFocused: () => dispatch(setSearchFocus({ searchFocus: false })), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(SearchField); diff --git a/lib/simperium/bucket-store.js b/lib/simperium/bucket-store.ts similarity index 100% rename from lib/simperium/bucket-store.js rename to lib/simperium/bucket-store.ts diff --git a/lib/simperium/ghost-store.js b/lib/simperium/ghost-store.ts similarity index 100% rename from lib/simperium/ghost-store.js rename to lib/simperium/ghost-store.ts diff --git a/lib/simperium/index.js b/lib/simperium/index.ts similarity index 100% rename from lib/simperium/index.js rename to lib/simperium/index.ts diff --git a/lib/simperium/local-queue-store.test.js b/lib/simperium/local-queue-store.test.ts similarity index 100% rename from lib/simperium/local-queue-store.test.js rename to lib/simperium/local-queue-store.test.ts diff --git a/lib/simperium/local-queue-store.js b/lib/simperium/local-queue-store.ts similarity index 100% rename from lib/simperium/local-queue-store.js rename to lib/simperium/local-queue-store.ts diff --git a/lib/simperium/store-provider.js b/lib/simperium/store-provider.ts similarity index 100% rename from lib/simperium/store-provider.js rename to lib/simperium/store-provider.ts diff --git a/lib/state/action-types.js b/lib/state/action-types.ts similarity index 67% rename from lib/state/action-types.js rename to lib/state/action-types.ts index 42552a6f3..0e712c1a1 100644 --- a/lib/state/action-types.js +++ b/lib/state/action-types.ts @@ -1,2 +1,3 @@ export const AUTH_SET = 'AUTH_SET'; +export const FILTER_NOTES = 'FILTER_NOTES'; export const TAG_DRAWER_TOGGLE = 'TAG_DRAWER_TOGGLE'; diff --git a/lib/state/actions.js b/lib/state/actions.ts similarity index 100% rename from lib/state/actions.js rename to lib/state/actions.ts diff --git a/lib/state/auth/actions.js b/lib/state/auth/actions.ts similarity index 100% rename from lib/state/auth/actions.js rename to lib/state/auth/actions.ts diff --git a/lib/state/auth/constants.js b/lib/state/auth/constants.ts similarity index 100% rename from lib/state/auth/constants.js rename to lib/state/auth/constants.ts diff --git a/lib/state/auth/reducer.js b/lib/state/auth/reducer.ts similarity index 100% rename from lib/state/auth/reducer.js rename to lib/state/auth/reducer.ts diff --git a/lib/state/auth/selectors.js b/lib/state/auth/selectors.ts similarity index 100% rename from lib/state/auth/selectors.js rename to lib/state/auth/selectors.ts diff --git a/lib/state/domain/buckets.js b/lib/state/domain/buckets.ts similarity index 100% rename from lib/state/domain/buckets.js rename to lib/state/domain/buckets.ts diff --git a/lib/state/domain/notes.js b/lib/state/domain/notes.ts similarity index 93% rename from lib/state/domain/notes.js rename to lib/state/domain/notes.ts index ff4624689..0ed3bc899 100644 --- a/lib/state/domain/notes.js +++ b/lib/state/domain/notes.ts @@ -1,5 +1,4 @@ import { noteBucket } from './buckets'; -import appState from '../../flux/app-state'; import isEmailTag from '../../utils/is-email-tag'; import { createTag } from './tags'; diff --git a/lib/state/domain/tags.js b/lib/state/domain/tags.ts similarity index 91% rename from lib/state/domain/tags.js rename to lib/state/domain/tags.ts index 0fdb53ba2..9e945364f 100644 --- a/lib/state/domain/tags.js +++ b/lib/state/domain/tags.ts @@ -49,7 +49,9 @@ export const renameTag = ({ tag, name: newName }) => (dispatch, getState) => { ...note, data: { ...note.data, - tags: note.data.tags.map(tag => (tag === tagName ? name : tag)), + tags: note.data.tags.map(noteTag => + noteTag === tagName ? name : noteTag + ), }, })) .forEach(note => noteBucket().update(note.id, note.data)); @@ -65,7 +67,7 @@ export const trashTag = ({ tag }) => (dispatch, getState) => { ...note, data: { ...note.data, - tags: note.data.tags.filter(tag => tag !== tagName), + tags: note.data.tags.filter(noteTag => noteTag !== tagName), }, })) .forEach(note => noteBucket().update(note.id, note.data)); diff --git a/lib/state/index.js b/lib/state/index.js deleted file mode 100644 index c0aa97982..000000000 --- a/lib/state/index.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Top-level of app state tree - * - * All data should flow through here - */ - -import { compose, createStore, combineReducers, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; -import persistState from 'redux-localstorage'; -import { omit } from 'lodash'; - -import appState from '../flux/app-state'; - -import auth from './auth/reducer'; -import settings from './settings/reducer'; -import ui from './ui/reducer'; - -export const reducers = combineReducers({ - appState: appState.reducer.bind(appState), - auth, - settings, - ui, -}); - -export const store = createStore( - reducers, - compose( - persistState('settings', { - key: 'simpleNote', - slicer: path => state => ({ - // Omit property from persisting - [path]: omit(state[path], 'focusModeEnabled'), - }), - }), - applyMiddleware(thunk) - ) -); - -export default store; diff --git a/lib/state/index.ts b/lib/state/index.ts new file mode 100644 index 000000000..3613aee07 --- /dev/null +++ b/lib/state/index.ts @@ -0,0 +1,75 @@ +/** + * Top-level of app state tree + * + * All data should flow through here + */ + +import { compose, createStore, combineReducers, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; +import persistState from 'redux-localstorage'; +import { omit } from 'lodash'; + +import appState from '../flux/app-state'; + +import uiMiddleware from './ui/middleware'; + +import auth from './auth/reducer'; +import settings from './settings/reducer'; +import ui from './ui/reducer'; + +import * as T from '../types'; + +export type AppState = { + dialogs: unknown[]; + editorMode: T.EditorMode; + editingTags: boolean; + filter: string; + isOffline: boolean; + isViewingRevisions: boolean; + listTitle: T.TranslatableString; + nextDialogKey: number; + note?: T.NoteEntity; + notes: T.NoteEntity[] | null; + preferences?: T.Preferences; + previousIndex: number; + revision: T.NoteEntity | null; + searchFocus: boolean; + selectedNoteId: T.EntityId | null; + shouldPrint: boolean; + showNavigation: boolean; + showNoteInfo: boolean; + showTrash: boolean; + tags: T.TagEntity[]; + tag?: T.TagEntity; + unsyncedNoteIds: T.EntityId[]; +}; + +export const reducers = combineReducers({ + appState: appState.reducer.bind(appState), + auth, + settings, + ui, +}); + +export type State = { + appState: AppState; + auth: ReturnType; + settings: ReturnType; + ui: ReturnType; +}; + +export const store = createStore( + reducers, + compose( + persistState('settings', { + key: 'simpleNote', + slicer: path => state => ({ + // Omit property from persisting + [path]: omit(state[path], 'focusModeEnabled'), + }), + }), + applyMiddleware(thunk, uiMiddleware) + ) +); + +export default store; diff --git a/lib/state/selectors.js b/lib/state/selectors.ts similarity index 100% rename from lib/state/selectors.js rename to lib/state/selectors.ts diff --git a/lib/state/settings/actions.js b/lib/state/settings/actions.ts similarity index 100% rename from lib/state/settings/actions.js rename to lib/state/settings/actions.ts diff --git a/lib/state/settings/reducer.js b/lib/state/settings/reducer.ts similarity index 100% rename from lib/state/settings/reducer.js rename to lib/state/settings/reducer.ts diff --git a/lib/state/ui/actions.js b/lib/state/ui/actions.js deleted file mode 100644 index af82c4b0c..000000000 --- a/lib/state/ui/actions.js +++ /dev/null @@ -1,6 +0,0 @@ -import { TAG_DRAWER_TOGGLE } from '../action-types'; - -export const toggleTagDrawer = show => ({ - type: TAG_DRAWER_TOGGLE, - show, -}); diff --git a/lib/state/ui/actions.ts b/lib/state/ui/actions.ts new file mode 100644 index 000000000..6dde3aabc --- /dev/null +++ b/lib/state/ui/actions.ts @@ -0,0 +1,11 @@ +import { FILTER_NOTES, TAG_DRAWER_TOGGLE } from '../action-types'; + +export const filterNotes = notes => ({ + type: FILTER_NOTES, + notes, +}); + +export const toggleTagDrawer = show => ({ + type: TAG_DRAWER_TOGGLE, + show, +}); diff --git a/lib/state/ui/middleware.ts b/lib/state/ui/middleware.ts new file mode 100644 index 000000000..b6fdee910 --- /dev/null +++ b/lib/state/ui/middleware.ts @@ -0,0 +1,45 @@ +import { AnyAction } from 'redux'; +import { filterNotes as filterAction } from './actions'; +import filterNotes from '../../utils/filter-notes'; + +let searchTimeout: NodeJS.Timeout; + +export default store => { + const updateNotes = () => + store.dispatch(filterAction(filterNotes(store.getState().appState))); + + return next => (action: AnyAction) => { + const result = next(action); + + switch (action.type) { + // on clicks re-filter "immediately" + case 'App.authChanged': + case 'App.deleteNoteForever': + case 'App.notesLoaded': + case 'App.restoreNote': + case 'App.selectTag': + case 'App.selectTrash': + case 'App.showAllNotes': + case 'App.tagsLoaded': + case 'App.trashNote': + clearTimeout(searchTimeout); + searchTimeout = setTimeout(updateNotes, 50); + break; + + // on updating the search field we should delay the update + // so we don't waste our CPU time and lose responsiveness + case 'App.noteUpdatedRemotely': + case 'App.search': + clearTimeout(searchTimeout); + if ('App.search' === action.type && !action.filter) { + // if we just cleared out the search bar then immediately update + updateNotes(); + } else { + searchTimeout = setTimeout(updateNotes, 500); + } + break; + } + + return result; + }; +}; diff --git a/lib/state/ui/reducer.js b/lib/state/ui/reducer.js deleted file mode 100644 index fea863bcd..000000000 --- a/lib/state/ui/reducer.js +++ /dev/null @@ -1,17 +0,0 @@ -import { difference, union } from 'lodash'; -import { combineReducers } from 'redux'; -import { TAG_DRAWER_TOGGLE } from '../action-types'; - -const defaultVisiblePanes = ['editor', 'noteList']; - -const visiblePanes = (state = defaultVisiblePanes, { type, show }) => { - if (TAG_DRAWER_TOGGLE === type) { - return show - ? union(state, ['tagDrawer']) - : difference(state, ['tagDrawer']); - } - - return state; -}; - -export default combineReducers({ visiblePanes }); diff --git a/lib/state/ui/reducer.ts b/lib/state/ui/reducer.ts new file mode 100644 index 000000000..14592a846 --- /dev/null +++ b/lib/state/ui/reducer.ts @@ -0,0 +1,25 @@ +import { difference, union } from 'lodash'; +import { combineReducers } from 'redux'; +import { FILTER_NOTES, TAG_DRAWER_TOGGLE } from '../action-types'; + +import * as T from '../../types'; + +const defaultVisiblePanes = ['editor', 'noteList']; +const emptyList: unknown[] = []; + +const filteredNotes = ( + state = emptyList as T.NoteEntity[], + { type, notes }: { type: string; notes: T.NoteEntity[] } +) => (FILTER_NOTES === type ? notes : state); + +const visiblePanes = (state = defaultVisiblePanes, { type, show }) => { + if (TAG_DRAWER_TOGGLE === type) { + return show + ? union(state, ['tagDrawer']) + : difference(state, ['tagDrawer']); + } + + return state; +}; + +export default combineReducers({ filteredNotes, visiblePanes }); diff --git a/lib/tag-email-tooltip/index.jsx b/lib/tag-email-tooltip/index.tsx similarity index 92% rename from lib/tag-email-tooltip/index.jsx rename to lib/tag-email-tooltip/index.tsx index 188fba49d..a50be5cda 100644 --- a/lib/tag-email-tooltip/index.jsx +++ b/lib/tag-email-tooltip/index.tsx @@ -28,7 +28,4 @@ EmailToolTip.propTypes = { openShareDialog: PropTypes.func.isRequired, }; -export default connect( - null, - mapDispatchToProps -)(EmailToolTip); +export default connect(null, mapDispatchToProps)(EmailToolTip); diff --git a/lib/tag-field/index.jsx b/lib/tag-field/index.tsx similarity index 98% rename from lib/tag-field/index.jsx rename to lib/tag-field/index.tsx index 3bcf2f631..e57ce7439 100644 --- a/lib/tag-field/index.jsx +++ b/lib/tag-field/index.tsx @@ -238,7 +238,4 @@ export class TagField extends Component { } } -export default connect( - null, - { updateNoteTags } -)(TagField); +export default connect(null, { updateNoteTags })(TagField); diff --git a/lib/tag-input/index.jsx b/lib/tag-input/index.tsx similarity index 96% rename from lib/tag-input/index.jsx rename to lib/tag-input/index.tsx index a35cf981d..80ac97716 100644 --- a/lib/tag-input/index.jsx +++ b/lib/tag-input/index.tsx @@ -5,6 +5,7 @@ import { get, identity, invoke, noop } from 'lodash'; const KEY_TAB = 9; const KEY_ENTER = 13; const KEY_RIGHT = 39; +const KEY_COMMA = 188; const startsWith = prefix => text => text @@ -101,6 +102,7 @@ export class TagInput extends Component { invoke( { [KEY_ENTER]: this.submitTag, + [KEY_COMMA]: this.submitTag, [KEY_TAB]: this.interceptTabPress, [KEY_RIGHT]: this.interceptRightArrow, }, @@ -149,9 +151,7 @@ export class TagInput extends Component { return; } - value.endsWith(',') && value.trim().length // commas should automatically insert non-zero tags - ? this.props.onSelect(value.slice(0, -1).trim()) - : this.props.onChange(value.trim(), this.focusInput); + this.props.onChange(value.trim(), this.focusInput); }; onCompositionEnd = e => { diff --git a/lib/tag-list/index.jsx b/lib/tag-list/index.tsx similarity index 97% rename from lib/tag-list/index.jsx rename to lib/tag-list/index.tsx index 16de11acd..d5bd7b071 100644 --- a/lib/tag-list/index.jsx +++ b/lib/tag-list/index.tsx @@ -111,7 +111,4 @@ const mapDispatchToProps = dispatch => ({ trashTag: arg => dispatch(trashTag(arg)), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(TagList); +export default connect(mapStateToProps, mapDispatchToProps)(TagList); diff --git a/lib/tag-list/input.jsx b/lib/tag-list/input.tsx similarity index 100% rename from lib/tag-list/input.jsx rename to lib/tag-list/input.tsx diff --git a/lib/tag-suggestions/index.tsx b/lib/tag-suggestions/index.tsx new file mode 100644 index 000000000..2d1b5c04f --- /dev/null +++ b/lib/tag-suggestions/index.tsx @@ -0,0 +1,120 @@ +import React, { Component, Fragment } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import appState from '../flux/app-state'; +import { tracks } from '../analytics'; + +const { search, setSearchFocus } = appState.actionCreators; +const { recordEvent } = tracks; + +export class TagSuggestions extends Component { + static displayName = 'TagSuggestions'; + + static propTypes = { + filteredTags: PropTypes.array.isRequired, + onSearch: PropTypes.func.isRequired, + query: PropTypes.string.isRequired, + }; + + updateSearch = filter => { + const { query, onSearch } = this.props; + + // replace last word in current query with requested tag match + let newQuery = query.trim().split(' '); + newQuery.splice(-1, 1, filter); + let querystring = newQuery.join(' '); + + // add a space at the end so the user can immediately start typing + querystring += ' '; + onSearch(querystring); + }; + + render() { + const { filteredTags } = this.props; + + return ( + + {filteredTags.length > 0 && ( +
+
Search by Tag
+
    + {filteredTags.map(tag => ( +
  • this.updateSearch(`tag:${tag.data.name}`)} + > +
    + tag:{tag.data.name} +
    +
  • + ))} +
+
+ )} +
+ ); + } +} + +const filterTags = (tags, query) => + query + ? tags + .filter(tag => { + // split on spaces and treat each "word" as a separate query + let queryWords = query.trim().split(' '); + + // we'll only suggest matches for the last word + // ...this is possibly naive if the user has moved back and is editing, + // but without knowing where the cursor is it's maybe the best we can do + let testQuery = queryWords[queryWords.length - 1]; + + // prefix tag ID with "tag:"; this allows us to match if the user typed the prefix + // n.b. doing it in this direction instead of stripping off any "tag:" prefix allows support + // of tags that contain the string "tag:" ¯\_(ツ)_/¯ + let testID = 'tag:' + tag.data.name; + + // exception: if the user typed "tag:" or some subset thereof, don't return all tags + if (['t', 'ta', 'tag', 'tag:'].includes(testQuery)) { + testID = tag.data.name; + } + + return ( + testID.search(new RegExp('(tag:)?' + testQuery, 'i')) !== -1 && + // discard exact matches -- if the user has already typed or clicked + // the full tag name, don't suggest it + !queryWords.includes(testID) + ); + }) + .slice(0, 5) + : tags; // don't bother filtering if we don't have a query to filter by + +let lastTags = null; +let lastQuery = null; +let lastMatches = []; +export const getMatchingTags = (tags, query) => { + if (lastTags === tags && lastQuery === query) { + return lastMatches; + } + + lastTags = tags; + lastQuery = query; + lastMatches = filterTags(tags, query); + return lastMatches; +}; + +const mapStateToProps = ({ appState: state }) => ({ + filteredTags: getMatchingTags(state.tags, state.filter), + query: state.filter, +}); + +const mapDispatchToProps = dispatch => ({ + onSearch: filter => { + dispatch(search({ filter })); + recordEvent('list_notes_searched'); + dispatch(setSearchFocus({ searchFocus: true })); + }, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(TagSuggestions); diff --git a/lib/tag-suggestions/style.scss b/lib/tag-suggestions/style.scss new file mode 100644 index 000000000..d478dbb7f --- /dev/null +++ b/lib/tag-suggestions/style.scss @@ -0,0 +1,40 @@ +.tag-suggestions { + overflow-x: hidden; + + .tag-suggestions-list { + list-style-type: none; + padding: 0; + margin: 0; + line-height: 40px; + + .tag-suggestion-row { + cursor: pointer; + position: relative; + padding: 0; + } + + .tag-suggestion { + margin-left: 30px; + border-bottom-style: solid; + border-bottom-width: 1px; + overflow-x: hidden; + text-overflow: ellipsis; + } + } + + .tag-suggestion-row:last-child .tag-suggestion { + border-bottom: none; + } +} + +.theme-light { + .tag-suggestion { + border-color: $studio-gray-5; + } +} + +.theme-dark { + .tag-suggestion { + border-color: $studio-gray-80; + } +} diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 000000000..bb98c23fa --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,66 @@ +/////////////////////////////////////// +// Simplenote Data Model +/////////////////////////////////////// + +export type EntityId = string; +export type SecondsEpoch = number; + +type Entity = { + id: EntityId; + data: T; + version: number; +}; + +export type TagName = string; +export type SystemTag = 'markdown' | 'pinned' | 'published' | 'shared'; + +export type Note = { + content: string; + creationDate: SecondsEpoch; + deleted: boolean; + modificationDate: SecondsEpoch; + publishURL?: string; + shareURL?: string; + systemTags: SystemTag[]; + tags: TagName[]; +}; + +export type NoteEntity = Entity; + +export type Tag = { + index: number; + name: TagName; +}; + +export type TagEntity = Entity; + +export type Preferences = { + analytics_enabled: boolean; +}; + +export type PreferencesEntity = Entity; + +export type Bucket = { + add( + data: T, + callback: (error: Error | null, data: Entity | null) => any + ): void; + get( + entityId: EntityId, + callback: (error: Error | null, data: Entity | null) => any + ): void; + getRevisions( + entityId: EntityId, + callback: (error: Error, revisions: Entity[]) => any + ): void; + query(fn: (db: IDBDatabase) => any): void; + remove(entityId: EntityId): void; + update(entityId: EntityId, data: T): void; +}; + +/////////////////////////////////////// +// Application Types +/////////////////////////////////////// + +export type EditorMode = 'edit' | 'markdown' | 'preview'; +export type TranslatableString = string; diff --git a/lib/utils/crypto-random-string.js b/lib/utils/crypto-random-string.ts similarity index 100% rename from lib/utils/crypto-random-string.js rename to lib/utils/crypto-random-string.ts diff --git a/lib/utils/electron.js b/lib/utils/electron.ts similarity index 100% rename from lib/utils/electron.js rename to lib/utils/electron.ts diff --git a/lib/utils/ensure-platform-support.js b/lib/utils/ensure-platform-support.tsx similarity index 75% rename from lib/utils/ensure-platform-support.js rename to lib/utils/ensure-platform-support.tsx index 3956ce211..481a21b14 100644 --- a/lib/utils/ensure-platform-support.js +++ b/lib/utils/ensure-platform-support.tsx @@ -1,10 +1,9 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { parse as parseCookie } from 'cookie'; import BootWarning from '../components/boot-warning'; -const hasLocalStorage = () => { +const hasLocalStorage = (): boolean => { try { localStorage.setItem('__localStorageSentinel__', 'present'); localStorage.removeItem('__localStorageSentinel__'); @@ -14,7 +13,7 @@ const hasLocalStorage = () => { } }; -const hasIndexedDB = () => { +const hasIndexedDB = (): boolean => { try { const opener = indexedDB.open('simplenote_sentinel'); if (!(opener instanceof IDBOpenDBRequest)) { @@ -29,30 +28,10 @@ const hasIndexedDB = () => { } }; -const hasCookies = () => { - try { - if (!navigator.cookieEnabled) { - return false; - } - - const cookie = document.cookie; - - const now = Date.now().toString(); - document.cookie = `__now=${now};`; - const parsed = parseCookie(document.cookie); - const didSet = parsed.__now === now; - document.cookie = cookie; - - return didSet; - } catch (e) { - return false; - } -}; - const deps = [ ['localStorage', hasLocalStorage()], ['indexedDB', hasIndexedDB()], -]; +] as const; const missingDeps = deps.filter(([, hasIt]) => !hasIt).map(([name]) => name); diff --git a/lib/utils/ensure-single-browser-tab-only.js b/lib/utils/ensure-single-browser-tab-only.js deleted file mode 100644 index 3a8c13e7d..000000000 --- a/lib/utils/ensure-single-browser-tab-only.js +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; - -import BootWarning from '../components/boot-warning'; - -const HEARTBEAT_DELAY = 1000; -const clientId = uuidv4(); -const emptyLock = [null, -Infinity]; -const foundElectron = window.process && window.process.type; - -if (!foundElectron && !/iPad|iPhone|iPod/.test(navigator.userAgent)) { - if ('lock-acquired' !== grabSessionLock()) { - ReactDOM.render( - - Simplenote cannot be opened simultaneously in more than one tab or - window per browser. - , - document.getElementById('root') - ); - throw new Error('Simplenote can only be opened in one tab'); - } - let keepGoing = true; - loop(() => { - if (!keepGoing) { - return false; - } - switch (grabSessionLock()) { - case 'lock-acquired': - return true; // keep updating the lock and look for other sessions which may have taken it - - default: - window.alert( - "We've detected another session running Simplenote, this may cause problems while editing notes. Please refresh the page." - ); - return false; // stop watching - the user can proceed at their own risk - } - }); - window.addEventListener('beforeunload', unload); - function unload() { - keepGoing = false; - const [lastClient] = - JSON.parse(localStorage.getItem('session-lock')) || emptyLock; - lastClient === clientId && localStorage.removeItem('session-lock'); - } -} - -function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (Math.random() * 16) | 0, - v = c == 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -} - -function loop(f, delay = HEARTBEAT_DELAY) { - f() && setTimeout(() => loop(f, delay), delay); -} - -function grabSessionLock() { - const [lastClient, lastBeat] = - JSON.parse(localStorage.getItem('session-lock')) || emptyLock; - const now = Date.now(); - // easy case - someone else clearly has the lock - // add some hysteresis to prevent fighting between sessions - if (lastClient !== clientId && now - lastBeat < HEARTBEAT_DELAY * 3) { - return 'lock-unavailable'; - } - // maybe nobody clearly has the lock, let's try and set it - localStorage.setItem('session-lock', JSON.stringify([clientId, now])); - - // hard case - localStorage is shared mutable state across sessions - const [thisClient, thisBeat] = - JSON.parse(localStorage.getItem('session-lock')) || emptyLock; - - // someone else set localStorage between the previous two lines of code - if (!(thisClient === clientId && thisBeat === now)) { - return 'lock-unavailable'; - } - - return 'lock-acquired'; -} diff --git a/lib/utils/export/export-notes.js b/lib/utils/export/export-notes.ts similarity index 97% rename from lib/utils/export/export-notes.js rename to lib/utils/export/export-notes.ts index c51a71dc6..12c51a368 100644 --- a/lib/utils/export/export-notes.js +++ b/lib/utils/export/export-notes.ts @@ -27,7 +27,7 @@ const mapNote = note => { creationDate: new Date(note.data.creationDate * 1000).toISOString(), lastModified: new Date(note.data.modificationDate * 1000).toISOString(), }, - get(note, 'pinned', false) && { pinned: true }, + note.data.systemTags.includes('pinned') && { pinned: true }, get(note, 'data.systemTags', []).includes('markdown') && { markdown: true }, tags.length && { tags }, get(note, 'data.systemTags', []).includes('published') && diff --git a/lib/utils/export/index.js b/lib/utils/export/index.ts similarity index 100% rename from lib/utils/export/index.js rename to lib/utils/export/index.ts diff --git a/lib/utils/export/to-zip.js b/lib/utils/export/to-zip.ts similarity index 100% rename from lib/utils/export/to-zip.js rename to lib/utils/export/to-zip.ts diff --git a/lib/utils/filter-notes.js b/lib/utils/filter-notes.ts similarity index 74% rename from lib/utils/filter-notes.js rename to lib/utils/filter-notes.ts index 64ead02ea..7425530cd 100644 --- a/lib/utils/filter-notes.js +++ b/lib/utils/filter-notes.ts @@ -1,14 +1,15 @@ /** * External dependencies */ -import { difference, escapeRegExp, get, overEvery } from 'lodash'; +import { difference, escapeRegExp, get } from 'lodash'; +import { NoteEntity, TagEntity } from '../types'; -const tagPattern = () => /(?:\btag:)([\w-]+)(?!\B)/g; +const tagPattern = () => /(?:\btag:)([^\s,]+)/g; -export const withoutTags = s => s.replace(tagPattern(), '').trim(); -export const filterHasText = filter => !!withoutTags(filter); +export const withoutTags = (s: string) => s.replace(tagPattern(), '').trim(); +export const filterHasText = (filter: string) => !!withoutTags(filter); -const getTerms = filterText => { +const getTerms = (filterText: string) => { if (!filterText) { return []; } @@ -43,7 +44,7 @@ const getTerms = filterText => { return [...literals, ...terms]; }; -export const searchPattern = filter => { +export const searchPattern = (filter: string) => { const terms = getTerms(withoutTags(filter)); if (!terms.length) { @@ -56,10 +57,10 @@ export const searchPattern = filter => { ); }; -const matchesTrashView = isViewingTrash => note => +const matchesTrashView = (isViewingTrash: boolean) => (note: NoteEntity) => isViewingTrash === !!get(note, 'data.deleted', false); -const makeMatchesTag = (tag, filter = '') => note => { +const makeMatchesTag = (tag: TagEntity, filter = '') => (note: NoteEntity) => { let filterTags = []; let match; const matcher = tagPattern(); @@ -81,7 +82,7 @@ const makeMatchesTag = (tag, filter = '') => note => { return missingTags.length === 0; }; -const makeMatchesSearch = (filter = '') => content => { +const makeMatchesSearch = (filter = '') => (content: string) => { if (!filter) { return true; } @@ -103,7 +104,10 @@ const emptyList = Object.freeze([]); * @TODO: Remove shadowing by renaming search functions * @TODO: Pre-index note title in domains/note */ -export default function filterNotes(state, notesArray = null) { +export default function filterNotes( + state, + notesArray: NoteEntity[] | null = null +) { const { filter, // {string} search query from input notes, // {[note]} list of all available notes @@ -114,23 +118,24 @@ export default function filterNotes(state, notesArray = null) { const notesToFilter = notesArray ? notesArray : notes; if (null === notesToFilter) { - return emptyList; // share the reference so the app doesn't re-render on shallow-compare + // share the reference so the app doesn't re-render on shallow-compare + return (emptyList as unknown) as NoteEntity[]; } // skip into some imperative code for performance-critical code - const titleMatches = []; - const otherMatches = []; + const titleMatches: NoteEntity[] = []; + const otherMatches: NoteEntity[] = []; // reuse these functions for each note const matchesTrash = matchesTrashView(showTrash); const matchesTag = makeMatchesTag(tag, filter); const matchesSearch = makeMatchesSearch(filter); - const matchesFilter = note => + const matchesFilter = (note: NoteEntity) => matchesTrash(note) && matchesTag(note) && matchesSearch(get(note, ['data', 'content'])); - notesToFilter.forEach( note => { + notesToFilter.forEach((note: NoteEntity) => { if (!matchesFilter(note)) { return; } @@ -144,7 +149,7 @@ export default function filterNotes(state, notesArray = null) { } else { otherMatches.push(note); } - } ); + }); return titleMatches.concat(otherMatches); } diff --git a/lib/utils/import/evernote/enml-to-markdown.js b/lib/utils/import/evernote/enml-to-markdown.ts similarity index 100% rename from lib/utils/import/evernote/enml-to-markdown.js rename to lib/utils/import/evernote/enml-to-markdown.ts diff --git a/lib/utils/import/evernote/index.js b/lib/utils/import/evernote/index.ts similarity index 100% rename from lib/utils/import/evernote/index.js rename to lib/utils/import/evernote/index.ts diff --git a/lib/utils/import/evernote/test.js b/lib/utils/import/evernote/test.ts similarity index 100% rename from lib/utils/import/evernote/test.js rename to lib/utils/import/evernote/test.ts diff --git a/lib/utils/import/evernote/test/enml-to-markdown.test.js b/lib/utils/import/evernote/test/enml-to-markdown.test.ts similarity index 73% rename from lib/utils/import/evernote/test/enml-to-markdown.test.js rename to lib/utils/import/evernote/test/enml-to-markdown.test.ts index 0b9b290f3..4bf373d28 100644 --- a/lib/utils/import/evernote/test/enml-to-markdown.test.js +++ b/lib/utils/import/evernote/test/enml-to-markdown.test.ts @@ -3,21 +3,25 @@ import path from 'path'; import enmlToMarkdown from '../enml-to-markdown'; describe('enmlToMarkdown', () => { - it('should render the correct Markdown', done => { - const testResult = result => { + it('should render the correct Markdown', () => { + return new Promise(done => { + const testResult = result => { + fs.readFile( + path.join(__dirname, './correct-markdown.txt'), + 'utf8', + (err, correctMarkdown) => { + expect(result).toBe(correctMarkdown.trim()); + done(); + } + ); + }; + fs.readFile( - path.join(__dirname, './correct-markdown.txt'), + path.join(__dirname, './mock-enml.txt'), 'utf8', - (err, correctMarkdown) => { - expect(result).toBe(correctMarkdown.trim()); - done(); - } + (err, enml) => testResult(enmlToMarkdown(enml)) ); - }; - - fs.readFile(path.join(__dirname, './mock-enml.txt'), 'utf8', (err, enml) => - testResult(enmlToMarkdown(enml)) - ); + }); }); it('should not escape Markdown characters', () => { diff --git a/lib/utils/import/index.js b/lib/utils/import/index.ts similarity index 99% rename from lib/utils/import/index.js rename to lib/utils/import/index.ts index 622fb842f..d60febe90 100644 --- a/lib/utils/import/index.js +++ b/lib/utils/import/index.ts @@ -79,7 +79,7 @@ class CoreImporter extends EventEmitter { // Add to note bucket with rate limiting return this.limiter .schedule(() => this.noteBucket.add.bind(this.noteBucket)(importedNote)) - .catch(console.log); + .catch(); }; importNotes = (notes = {}, options) => { diff --git a/lib/utils/import/simplenote/index.js b/lib/utils/import/simplenote/index.ts similarity index 100% rename from lib/utils/import/simplenote/index.js rename to lib/utils/import/simplenote/index.ts diff --git a/lib/utils/import/simplenote/test.js b/lib/utils/import/simplenote/test.ts similarity index 76% rename from lib/utils/import/simplenote/test.js rename to lib/utils/import/simplenote/test.ts index 0ce65815f..578d3f8b2 100644 --- a/lib/utils/import/simplenote/test.js +++ b/lib/utils/import/simplenote/test.ts @@ -29,19 +29,21 @@ describe('SimplenoteImporter', () => { ); }); - it('should call coreImporter.importNotes with all notes and options', done => { - const notes = { - activeNotes: [{}, {}], - trashedNotes: [{}], - }; - importer.on('status', () => { - const args = CoreImporter.mock.instances[0].importNotes.mock.calls[0]; - expect(args[0].activeNotes).toHaveLength(2); - expect(args[0].trashedNotes).toHaveLength(1); - expect(args[1].foo).toBe(true); - done(); + it('should call coreImporter.importNotes with all notes and options', () => { + return new Promise(done => { + const notes = { + activeNotes: [{}, {}], + trashedNotes: [{}], + }; + importer.on('status', () => { + const args = CoreImporter.mock.instances[0].importNotes.mock.calls[0]; + expect(args[0].activeNotes).toHaveLength(2); + expect(args[0].trashedNotes).toHaveLength(1); + expect(args[1].foo).toBe(true); + done(); + }); + importer.importNotes([new File([JSON.stringify(notes)], 'foo.json')]); }); - importer.importNotes([new File([JSON.stringify(notes)], 'foo.json')]); }); describe('convertModificationDates', () => { diff --git a/lib/utils/import/test.js b/lib/utils/import/test.ts similarity index 100% rename from lib/utils/import/test.js rename to lib/utils/import/test.ts diff --git a/lib/utils/import/text-files/index.js b/lib/utils/import/text-files/index.ts similarity index 100% rename from lib/utils/import/text-files/index.js rename to lib/utils/import/text-files/index.ts diff --git a/lib/utils/is-dev-config/index.js b/lib/utils/is-dev-config/index.ts similarity index 100% rename from lib/utils/is-dev-config/index.js rename to lib/utils/is-dev-config/index.ts diff --git a/lib/utils/is-dev-config/test.js b/lib/utils/is-dev-config/test.ts similarity index 100% rename from lib/utils/is-dev-config/test.js rename to lib/utils/is-dev-config/test.ts diff --git a/lib/utils/is-email-tag.js b/lib/utils/is-email-tag.ts similarity index 100% rename from lib/utils/is-email-tag.js rename to lib/utils/is-email-tag.ts diff --git a/lib/utils/note-utils.test.js b/lib/utils/note-utils.test.ts similarity index 100% rename from lib/utils/note-utils.test.js rename to lib/utils/note-utils.test.ts diff --git a/lib/utils/note-utils.js b/lib/utils/note-utils.ts similarity index 97% rename from lib/utils/note-utils.js rename to lib/utils/note-utils.ts index 86a23548e..a2718852d 100644 --- a/lib/utils/note-utils.js +++ b/lib/utils/note-utils.ts @@ -31,7 +31,7 @@ const removeMarkdownWithFix = inputString => { }; const getTitle = content => { - const titlePattern = new RegExp(`\s*([^\n]{1,${maxTitleChars}})`, 'g'); + const titlePattern = new RegExp(`\\s*([^\n]{1,${maxTitleChars}})`, 'g'); const titleMatch = titlePattern.exec(content); if (!titleMatch) { return 'New Note…'; diff --git a/lib/utils/render-note-to-html.js b/lib/utils/render-note-to-html.ts similarity index 92% rename from lib/utils/render-note-to-html.js rename to lib/utils/render-note-to-html.ts index ad0f8574c..e2c033203 100755 --- a/lib/utils/render-note-to-html.js +++ b/lib/utils/render-note-to-html.ts @@ -16,6 +16,7 @@ export const renderNoteToHtml = content => { markdownConverter.setFlavor('github'); markdownConverter.setOption('simpleLineBreaks', false); // override GFM markdownConverter.setOption('ghMentions', false); + markdownConverter.setOption('smoothLivePreview', true); return sanitizeHtml(markdownConverter.makeHtml(content)); } diff --git a/lib/utils/sanitize-html.js b/lib/utils/sanitize-html.ts similarity index 97% rename from lib/utils/sanitize-html.js rename to lib/utils/sanitize-html.ts index e6ff461db..d7f358f8f 100644 --- a/lib/utils/sanitize-html.js +++ b/lib/utils/sanitize-html.ts @@ -105,6 +105,7 @@ const isAllowedAttr = (tagName, attrName, value) => { case 'alt': case 'src': case 'title': + case 'width': return true; default: return false; @@ -134,6 +135,14 @@ const isAllowedAttr = (tagName, attrName, value) => { return false; } + case 'ol': + switch (attrName) { + case 'start': + return true; + default: + return false; + } + default: return false; } diff --git a/lib/utils/sync/activity-hooks.test.js b/lib/utils/sync/activity-hooks.test.js deleted file mode 100644 index fb7cfbd64..000000000 --- a/lib/utils/sync/activity-hooks.test.js +++ /dev/null @@ -1,40 +0,0 @@ -import activityHooks, { debounceWait } from './activity-hooks'; -import { times } from 'lodash'; - -describe('sync:activityHooks', () => { - const delay = debounceWait + 5; // wiggle room - let order, hooks; - - beforeEach(() => { - order = []; - hooks = { - onActive: jest.fn(() => order.push('active')), - onIdle: jest.fn(() => order.push('idle')), - }; - }); - - it('should call the appropriate hook when syncing becomes active/idle', done => { - const myActivityHooks = activityHooks('0:mockdata', hooks); - - times(3, myActivityHooks); - - window.setTimeout(() => { - expect(hooks.onActive).toHaveBeenCalledTimes(1); - expect(hooks.onIdle).toHaveBeenCalledTimes(1); - expect(order).toEqual(['active', 'idle']); - done(); - }, delay); - }); - - it('should ignore heartbeats', done => { - const myActivityHooks = activityHooks('h:1', hooks); - - times(3, myActivityHooks); - - window.setTimeout(() => { - expect(hooks.onActive).toHaveBeenCalledTimes(0); - expect(hooks.onIdle).toHaveBeenCalledTimes(0); - done(); - }, delay); - }); -}); diff --git a/lib/utils/sync/activity-hooks.test.ts b/lib/utils/sync/activity-hooks.test.ts new file mode 100644 index 000000000..d679bfaa5 --- /dev/null +++ b/lib/utils/sync/activity-hooks.test.ts @@ -0,0 +1,40 @@ +import activityHooks, { debounceWait } from './activity-hooks'; +import { times } from 'lodash'; + +describe('sync:activityHooks', () => { + const delay = debounceWait + 5; // wiggle room + let order, hooks; + + beforeEach(() => { + order = []; + hooks = { + onActive: jest.fn(() => order.push('active')), + onIdle: jest.fn(() => order.push('idle')), + }; + }); + + it('should call the appropriate hook when syncing becomes active/idle', () => { + return new Promise(done => { + const myActivityHooks = activityHooks('0:mockdata', hooks); + times(3, myActivityHooks); + window.setTimeout(() => { + expect(hooks.onActive).toHaveBeenCalledTimes(1); + expect(hooks.onIdle).toHaveBeenCalledTimes(1); + expect(order).toEqual(['active', 'idle']); + done(); + }, delay); + }); + }); + + it('should ignore heartbeats', () => { + return new Promise(done => { + const myActivityHooks = activityHooks('h:1', hooks); + times(3, myActivityHooks); + window.setTimeout(() => { + expect(hooks.onActive).toHaveBeenCalledTimes(0); + expect(hooks.onIdle).toHaveBeenCalledTimes(0); + done(); + }, delay); + }); + }); +}); diff --git a/lib/utils/sync/activity-hooks.js b/lib/utils/sync/activity-hooks.ts similarity index 100% rename from lib/utils/sync/activity-hooks.js rename to lib/utils/sync/activity-hooks.ts diff --git a/lib/utils/sync/get-unsynced-note-ids.js b/lib/utils/sync/get-unsynced-note-ids.ts similarity index 100% rename from lib/utils/sync/get-unsynced-note-ids.js rename to lib/utils/sync/get-unsynced-note-ids.ts diff --git a/lib/utils/sync/index.js b/lib/utils/sync/index.ts similarity index 100% rename from lib/utils/sync/index.js rename to lib/utils/sync/index.ts diff --git a/lib/utils/sync/last-synced-time.js b/lib/utils/sync/last-synced-time.ts similarity index 100% rename from lib/utils/sync/last-synced-time.js rename to lib/utils/sync/last-synced-time.ts diff --git a/lib/utils/sync/nudge-unsynced.test.js b/lib/utils/sync/nudge-unsynced.test.ts similarity index 100% rename from lib/utils/sync/nudge-unsynced.test.js rename to lib/utils/sync/nudge-unsynced.test.ts diff --git a/lib/utils/sync/nudge-unsynced.js b/lib/utils/sync/nudge-unsynced.ts similarity index 100% rename from lib/utils/sync/nudge-unsynced.js rename to lib/utils/sync/nudge-unsynced.ts diff --git a/lib/utils/test/is-email-tag.js b/lib/utils/test/is-email-tag.ts similarity index 100% rename from lib/utils/test/is-email-tag.js rename to lib/utils/test/is-email-tag.ts diff --git a/lib/utils/url-utils.js b/lib/utils/url-utils.ts similarity index 100% rename from lib/utils/url-utils.js rename to lib/utils/url-utils.ts diff --git a/lib/welcome-message.js b/lib/welcome-message.ts similarity index 100% rename from lib/welcome-message.js rename to lib/welcome-message.ts diff --git a/package-lock.json b/package-lock.json index c2fd2ddfc..eee27c63a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "simplenote", - "version": "1.12.0", + "version": "1.14.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -220,19 +220,19 @@ } }, "@babel/core": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", - "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", + "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.4", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.4", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.3", - "@babel/types": "^7.6.3", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.7", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.7", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -241,6 +241,92 @@ "source-map": "^0.5.0" }, "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -276,63 +362,255 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", - "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", - "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", + "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-explode-assignable-expression": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-react-jsx": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", - "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz", + "integrity": "sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA==", "dev": true, "requires": { - "@babel/types": "^7.7.0", + "@babel/types": "^7.7.4", "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-call-delegate": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", - "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", - "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz", + "integrity": "sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0" + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", - "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", + "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", "dev": true, "requires": { "@babel/helper-regex": "^7.4.4", @@ -340,24 +618,168 @@ } }, "@babel/helper-define-map": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", - "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/types": "^7.7.0", + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", - "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", + "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", "dev": true, "requires": { - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-function-name": { @@ -381,21 +803,47 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", - "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", - "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { @@ -408,26 +856,87 @@ } }, "@babel/helper-module-transforms": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", - "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", + "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.0", - "@babel/helper-simple-access": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0", + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", - "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { @@ -446,38 +955,256 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", - "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", + "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-wrap-function": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-wrap-function": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-replace-supers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", - "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helper-simple-access": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", - "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", "dev": true, "requires": { - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { @@ -490,26 +1217,214 @@ } }, "@babel/helper-wrap-function": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", - "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", + "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-function-name": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/helpers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", - "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", "dev": true, "requires": { - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/highlight": { @@ -530,163 +1445,203 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", - "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", + "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-remap-async-to-generator": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", + "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", - "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", + "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/plugin-syntax-dynamic-import": "^7.7.4" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", + "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/plugin-syntax-json-strings": "^7.7.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz", + "integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", - "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz", + "integrity": "sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", + "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", + "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", + "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", + "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz", + "integrity": "sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", - "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", + "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0" + "@babel/helper-remap-async-to-generator": "^7.7.4" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", - "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -694,277 +1649,408 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", - "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-define-map": "^7.7.0", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", - "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz", + "integrity": "sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", + "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", + "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", - "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.0", + "@babel/helper-function-name": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", + "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", + "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", - "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", + "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-simple-access": "^7.7.4", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", - "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", + "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.0", + "@babel/helper-hoist-variables": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", - "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", + "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-module-transforms": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", - "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", + "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.4" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", + "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-replace-supers": "^7.7.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz", + "integrity": "sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz", + "integrity": "sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", - "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz", + "integrity": "sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.7.0", + "@babel/helper-builder-react-jsx": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/plugin-syntax-jsx": "^7.7.4" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.7.4.tgz", + "integrity": "sha512-PWYjSfqrO273mc1pKCRTIJXyqfc9vWYBax88yIhQb+bpw3XChVC7VWS4VwRVs63wFHKxizvGSd00XEr+YB9Q2A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/plugin-syntax-jsx": "^7.7.4" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.7.4.tgz", + "integrity": "sha512-5ZU9FnPhqtHsOXxutRtXZAzoEJwDaP32QcobbMP1/qt7NYcsCNK8XgzJcJfoEr/ZnzVvUNInNjIW22Z6I8p9mg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/plugin-syntax-jsx": "^7.7.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", - "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", + "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", + "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", + "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -972,31 +2058,42 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", + "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-typescript": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz", + "integrity": "sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.7.4" + } + }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", - "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", + "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-create-regexp-features-plugin": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -1010,70 +2107,91 @@ }, "dependencies": { "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" } } }, "@babel/preset-env": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", - "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", + "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.3", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.3", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.7", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.7", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", + "core-js-compat": "^3.6.0", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.5.0" }, "dependencies": { + "@babel/helper-module-imports": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1083,16 +2201,26 @@ } }, "@babel/preset-react": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz", - "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.4.tgz", + "integrity": "sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.7.4", + "@babel/plugin-transform-react-jsx": "^7.7.4", + "@babel/plugin-transform-react-jsx-self": "^7.7.4", + "@babel/plugin-transform-react-jsx-source": "^7.7.4" + } + }, + "@babel/preset-typescript": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.7.tgz", + "integrity": "sha512-Apg0sCTovsSA+pEaI8efnA44b9x4X/7z4P8vsWMiN8rSUaM4y4+Shl5NMWnMl6njvt96+CEb6jwpXAKYAVCSQA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" + "@babel/plugin-transform-typescript": "^7.7.4" } }, "@babel/runtime": { @@ -1161,9 +2289,9 @@ } }, "@emotion/hash": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.3.tgz", - "integrity": "sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" }, "@hapi/address": { "version": "2.1.2", @@ -1256,6 +2384,29 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -1410,15 +2561,15 @@ } }, "@material-ui/core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.5.2.tgz", - "integrity": "sha512-yARw/hwavOXqljP+biDXHcmfbC63n8EkA8C10/tZt7KkBp7fs+7+z3BNR+ffotd8/uhirIC1jQWWKdLoUc34yA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.8.3.tgz", + "integrity": "sha512-ZJbfJQmkuZCSQTf0nzpfZwizmDdCq8ruZxnPNFnhoKDqgJpMvV8TJRi8vdI9ls1tMuTqxlhyhw8556fxOpWpFQ==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.5.2", - "@material-ui/system": "^4.5.2", + "@material-ui/styles": "^4.8.2", + "@material-ui/system": "^4.7.1", "@material-ui/types": "^4.1.1", - "@material-ui/utils": "^4.5.2", + "@material-ui/utils": "^4.7.1", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.2", "convert-css-length": "^2.0.1", @@ -1426,18 +2577,19 @@ "normalize-scroll-left": "^0.2.0", "popper.js": "^1.14.1", "prop-types": "^15.7.2", + "react-is": "^16.8.0", "react-transition-group": "^4.3.0" } }, "@material-ui/styles": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.6.0.tgz", - "integrity": "sha512-lqqh4UEMdIYcU1Yth4pQyMTah02uAkg3NOT3MirN9FUexdL8pNA6zCHigEgDSfwmvnXyxHhxTkphfy0DRfnt9w==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.8.2.tgz", + "integrity": "sha512-r5U+93pkpwQOmHTmwyn2sqTio6PHd873xvSHiKP6fdybAXXX6CZgVvh3W8saZNbYr/QXsS8OHmFv7sYJLt5Yfg==", "requires": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.7.1", + "@emotion/hash": "^0.7.4", "@material-ui/types": "^4.1.1", - "@material-ui/utils": "^4.5.2", + "@material-ui/utils": "^4.7.1", "clsx": "^1.0.2", "csstype": "^2.5.2", "hoist-non-react-statics": "^3.2.1", @@ -1453,12 +2605,12 @@ } }, "@material-ui/system": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.5.2.tgz", - "integrity": "sha512-h9RWvdM9XKlHHqwiuhyvWdobptQkHli+m2jJFs7i1AI/hmGsIc4reDmS7fInhETgt/Txx7uiAIznfRNIIVHmQw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.7.1.tgz", + "integrity": "sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.5.2", + "@material-ui/utils": "^4.7.1", "prop-types": "^15.7.2" } }, @@ -1471,13 +2623,13 @@ } }, "@material-ui/utils": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.5.2.tgz", - "integrity": "sha512-zhbNfHd1gLa8At6RPDG7uMZubHxbY+LtM6IkSfeWi6Lo4Ax80l62YaN1QmUpO1IvGCkn/j62tQX3yObiQZrJsQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz", + "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==", "requires": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", - "react-is": "^16.8.6" + "react-is": "^16.8.0" } }, "@paulcbetts/cld": { @@ -1489,6 +2641,31 @@ "nan": "^2.0.5", "rimraf": "^2.4.0", "underscore": "^1.6.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + } } }, "@paulcbetts/spellchecker": { @@ -1518,9 +2695,9 @@ } }, "@types/babel__generator": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", - "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -1537,14 +2714,53 @@ } }, "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, + "@types/classnames": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.9.tgz", + "integrity": "sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==", + "dev": true + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/electron": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", + "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", + "dev": true, + "requires": { + "electron": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -1562,6 +2778,16 @@ "@types/node": "*" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dev": true, + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1587,10 +2813,25 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "24.0.25", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.25.tgz", + "integrity": "sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g==", + "dev": true, + "requires": { + "jest-diff": "^24.3.0" + } + }, "@types/json-schema": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", - "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", "dev": true }, "@types/minimatch": { @@ -1605,20 +2846,74 @@ "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/react": { - "version": "16.9.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.11.tgz", - "integrity": "sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ==", + "version": "16.9.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", + "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" } }, + "@types/react-addons-update": { + "version": "0.14.20", + "resolved": "https://registry.npmjs.org/@types/react-addons-update/-/react-addons-update-0.14.20.tgz", + "integrity": "sha512-k25VHmbIoaSaSr0rqgANa/84IvJG8MRKiObMJ8FXnFE0QRU7S5fV95/Cr6Ttz7CZFla01Db/q7vX4Ei+SOuvIA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-dom": { + "version": "16.9.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.4.tgz", + "integrity": "sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-modal": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.10.1.tgz", + "integrity": "sha512-u8MTXPFxfsY2zsWfAwQIS315zwM716vO4WFjGiexKEOgappMjmKQaApmUoMH4SKijeEFIjxnaAyCyGJXyUIvdg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-onclickoutside": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@types/react-onclickoutside/-/react-onclickoutside-6.7.3.tgz", + "integrity": "sha512-ByQX2ns3KlOrOzJBVhQ2VZmQVV6w718TXFVAdCdHBeXMXr5QseQVN+BsOmLf2+KZGz7+Y4ov9jPxRDCDNJZMLg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-redux": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.5.tgz", + "integrity": "sha512-ZoNGQMDxh5ENY7PzU7MVonxDzS1l/EWiy8nUhDqxFqUZn4ovboCyvk4Djf68x6COb7vhGTKjyjxHxtFdAA5sUA==", + "dev": true, + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, "@types/react-transition-group": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz", @@ -1627,6 +2922,54 @@ "@types/react": "*" } }, + "@types/redux": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@types/redux/-/redux-3.6.0.tgz", + "integrity": "sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=", + "dev": true, + "requires": { + "redux": "*" + } + }, + "@types/redux-localstorage": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/redux-localstorage/-/redux-localstorage-1.0.8.tgz", + "integrity": "sha512-pt+w3Y2K4Xwx79exTFZO356buBCgCM6NnyMv/EmASWb03a81g/EMEhNgH6w9dOnhTs1Clnmf2ykaia0FWXjsbQ==", + "dev": true, + "requires": { + "redux": "^3.6.0" + }, + "dependencies": { + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + } + } + }, + "@types/rimraf": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.3.tgz", + "integrity": "sha512-dZfyfL/u9l/oi984hEXdmAjX3JHry7TLWw43u1HQ8HhPv6KtfxnrZ3T/bleJ0GEvnk9t5sM7eePkgMqz3yBcGg==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, "@types/semver": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.0.tgz", @@ -1638,6 +2981,15 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, + "@types/webdriverio": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/@types/webdriverio/-/webdriverio-4.13.3.tgz", + "integrity": "sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", @@ -1653,25 +3005,51 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.15.0.tgz", + "integrity": "sha512-XRJFznI5v4K1WvIrWmjFjBAdQWaUTz4xJEdqR7+wAFsv6Q9dP3mOlE6BMNT3pdlp9eF1+bC5m5LZTmLMqffCVw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.15.0", + "eslint-utils": "^1.4.3", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, "@typescript-eslint/experimental-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz", - "integrity": "sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.15.0.tgz", + "integrity": "sha512-Qkxu5zndY5hqlcQkmA88gfLvqQulMpX/TN91XC7OuXsRf4XG5xLGie0sbpX97o/oeccjeZYRMipIsjKk/tjDHA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.7.0", + "@typescript-eslint/typescript-estree": "2.15.0", "eslint-scope": "^5.0.0" } }, + "@typescript-eslint/parser": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.15.0.tgz", + "integrity": "sha512-6iSgQsqAYTaHw59t0tdjzZJluRAjswdGltzKEdLtcJOxR2UVTPHYvZRqkAVGCkaMVb6Fpa60NnuozNCvsSpA9g==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.15.0", + "@typescript-eslint/typescript-estree": "2.15.0", + "eslint-visitor-keys": "^1.1.0" + } + }, "@typescript-eslint/typescript-estree": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz", - "integrity": "sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz", + "integrity": "sha512-L6Pog+w3VZzXkAdyqA0VlwybF8WcwZX+mufso86CMxSdWmcizJ38lgBdpqTbc9bo92iyi0rOvmATKiwl+amjxg==", "dev": true, "requires": { "debug": "^4.1.1", - "glob": "^7.1.4", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash.unescape": "4.0.1", "semver": "^6.3.0", @@ -1691,6 +3069,12 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -2025,12 +3409,12 @@ "dev": true }, "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", "dev": true, "requires": { - "type-fest": "^0.5.2" + "type-fest": "^0.8.1" } }, "ansi-html": { @@ -2111,32 +3495,103 @@ "temp-file": "^3.1.3" }, "dependencies": { - "builder-util-runtime": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-6.1.0.tgz", - "integrity": "sha512-/1dvNkUNSlMQuIEMBGzJUS60tmDBBA6CYiWT5P9ZTIl2nskMX8VdEClTNTfknkCBQqZArgSTXfWrNmcbXEkbEg==", + "builder-util-runtime": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-6.1.0.tgz", + "integrity": "sha512-/1dvNkUNSlMQuIEMBGzJUS60tmDBBA6CYiWT5P9ZTIl2nskMX8VdEClTNTfknkCBQqZArgSTXfWrNmcbXEkbEg==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.6", + "debug": "^4.1.0", + "fs-extra-p": "^7.0.0", + "sax": "^1.2.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archiver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "bluebird-lst": "^1.0.6", - "debug": "^4.1.0", - "fs-extra-p": "^7.0.0", - "sax": "^1.2.4" + "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" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "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", @@ -2173,6 +3628,12 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -2238,14 +3699,75 @@ } }, "array.prototype.flat": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.2.tgz", - "integrity": "sha512-VXjh7lAL4KXKF2hY4FnEW9eRW6IhdvFW1sN/JwLbmECbCgACCnBHNyP3lFiYuttr0jxRN9Bsc5+G27dMseSWqQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.15.0", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "asap": { @@ -2360,33 +3882,45 @@ "dev": true }, "attr-accept": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", - "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", - "requires": { - "core-js": "^2.5.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.0.0.tgz", + "integrity": "sha512-I9SDP4Wvh2ItYYoafEg8hFpsBe96pfQ+eabceShXt3sw2fbIP96+Aoj9zZE0vkZNAkXXzHJATVRuWz+h9FxJxQ==" }, "autoprefixer": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", - "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", + "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", "dev": true, "requires": { - "browserslist": "^4.7.2", - "caniuse-lite": "^1.0.30001006", + "browserslist": "^4.8.0", + "caniuse-lite": "^1.0.30001012", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.21", + "postcss": "^7.0.23", "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.23.tgz", + "integrity": "sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ==", + "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" + } + } } }, "aws-sign2": { @@ -2647,6 +4181,16 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -2929,14 +4473,14 @@ } }, "browserslist": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", - "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.0.tgz", + "integrity": "sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001004", - "electron-to-chromium": "^1.3.295", - "node-releases": "^1.1.38" + "caniuse-lite": "^1.0.30001012", + "electron-to-chromium": "^1.3.317", + "node-releases": "^1.1.41" } }, "bser": { @@ -2949,14 +4493,13 @@ } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", "dev": true, "requires": { "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "ieee754": "^1.1.4" } }, "buffer-alloc": { @@ -2975,6 +4518,12 @@ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -3108,6 +4657,15 @@ "yallist": "^3.0.2" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3199,9 +4757,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001008", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", - "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "version": "1.0.30001015", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", + "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==", "dev": true }, "capture-exit": { @@ -3387,6 +4945,16 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -3492,6 +5060,29 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -3545,9 +5136,9 @@ } }, "concurrently": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz", - "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.2.tgz", + "integrity": "sha512-iUNVI6PzKO0RVXV9pHWM0khvEbELxf3XLIoChaV6hHyoIaJuxQWZiOwlNysnJX5khsfvIK66+OJqRdbYrdsR1g==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -3556,154 +5147,57 @@ "read-pkg": "^4.0.1", "rxjs": "^6.5.2", "spawn-command": "^0.0.2-1", - "supports-color": "^4.5.0", - "tree-kill": "^1.2.1", - "yargs": "^12.0.5" + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "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==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.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 - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.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" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "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.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "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.1" } }, "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.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -3819,6 +5313,31 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -3828,18 +5347,37 @@ "dev": true }, "core-js": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.6.tgz", - "integrity": "sha512-u4oM8SHwmDuh5mWZdDg9UwNVq5s1uqq6ZDLLIs07VY+VJU91i3h4f3K/pgFvtUQPGdeStrZ+odKyfyt4EnKHfA==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", + "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==" }, "core-js-compat": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.1.tgz", - "integrity": "sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.1.tgz", + "integrity": "sha512-2Tl1EuxZo94QS2VeH28Ebf5g3xbPZG/hj/N5HDDy4XMP/ImR0JIer/nggQRiMN91Q54JVkGbytf42wO29oXVHg==", "dev": true, "requires": { - "browserslist": "^4.7.2", - "semver": "^6.3.0" + "browserslist": "^4.8.2", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", + "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001015", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.42" + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, "core-util-is": { @@ -3877,6 +5415,25 @@ } } }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -3969,10 +5526,22 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "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-loader": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", - "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.1.tgz", + "integrity": "sha512-+ybmv7sVxxNEenQhkifQDvny/1iNQM7YooJbSfVUdQQvisyg1aKIqgGjCjoFSyVLJMp17z9rfZFQaR5HGHcMbw==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -3980,13 +5549,54 @@ "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.17", + "postcss": "^7.0.23", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.0", + "postcss-modules-scope": "^2.1.1", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.0", - "schema-utils": "^2.0.0" + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "schema-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", + "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "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" + } + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" } }, "css-select": { @@ -4001,6 +5611,12 @@ "nth-check": "~1.0.1" } }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, "css-vendor": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", @@ -4055,6 +5671,15 @@ "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==", + "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", @@ -4086,9 +5711,9 @@ } }, "date-fns": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.6.0.tgz", - "integrity": "sha512-F55YxqRdEfP/eYQmQjLN798v0AwLjmZ8nMBjdQvNwEE3N/zWVrlkkqT+9seBlPlsbkybG4JmWg3Ee3dIV9BcGQ==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.9.0.tgz", + "integrity": "sha512-khbFLu/MlzLjEzy9Gh8oY1hNt/Dvxw3J6Rbc28cVoYWQaC1S3YI4xwkF9ZWcjDLscbZlY9hISMr66RFzZagLsA==" }, "debug": { "version": "4.1.1", @@ -4141,6 +5766,12 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", + "dev": true + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -4225,11 +5856,34 @@ "rimraf": "^2.6.3" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -4238,6 +5892,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4296,6 +5955,12 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "dev-null": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", + "dev": true + }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -4458,13 +6123,13 @@ "dev": true }, "draft-js": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.2.tgz", - "integrity": "sha512-JU96XdAigQ4hAmyBMVXps6RQ8+dMhhNI1dDJPMP6OeHuSv+uwDzDg/7lxGQ1PEq+1Q6575jtvxDa7Aw3vy0WHA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.4.tgz", + "integrity": "sha512-BLZ59s0vkDj/zI8UPo9Nit/hPsl11ztDejxDCQlVbvEXJSWrTXqO6ZYgdw3hXLtuojq/URqq3wTrpnb3dvzvLA==", "requires": { "fbjs": "^1.0.0", "immutable": "~3.7.4", - "object-assign": "^4.1.0" + "object-assign": "^4.1.1" } }, "draft-js-multidecorators": { @@ -4693,6 +6358,16 @@ } } }, + "electron-chromedriver": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-4.0.0.tgz", + "integrity": "sha512-CeeAr4QVtsxkEpDWvFLzhdtgDVLQt32RBWjEJ4WxkIPNj0MX5D8gzli2djEPnnLUOX19vcBgs/CW7WBB/O3JIg==", + "dev": true, + "requires": { + "electron-download": "^4.1.0", + "extract-zip": "^1.6.5" + } + }, "electron-download": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", @@ -4978,9 +6653,9 @@ } }, "electron-to-chromium": { - "version": "1.3.306", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", - "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", "dev": true }, "electron-updater": { @@ -4996,6 +6671,13 @@ "lodash.isequal": "^4.5.0", "pako": "^1.0.10", "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "electron-window-state": { @@ -5008,9 +6690,9 @@ } }, "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -5092,89 +6774,326 @@ "dev": true }, "enzyme": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.10.0.tgz", - "integrity": "sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", "dev": true, "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", "has": "^1.0.3", - "html-element-map": "^1.0.0", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-regex": "^1.0.4", - "is-string": "^1.0.4", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", "is-subset": "^0.1.1", "lodash.escape": "^4.0.1", "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" + "string.prototype.trim": "^1.2.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "enzyme-adapter-react-16": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz", - "integrity": "sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz", + "integrity": "sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.12.1", - "enzyme-shallow-equal": "^1.0.0", + "enzyme-adapter-utils": "^1.13.0", + "enzyme-shallow-equal": "^1.0.1", "has": "^1.0.3", "object.assign": "^4.1.0", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "prop-types": "^15.7.2", - "react-is": "^16.10.2", + "react-is": "^16.12.0", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" }, "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } } } }, "enzyme-adapter-utils": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz", - "integrity": "sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz", + "integrity": "sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ==", "dev": true, "requires": { "airbnb-prop-types": "^2.15.0", - "function.prototype.name": "^1.1.1", + "function.prototype.name": "^1.1.2", "object.assign": "^4.1.0", - "object.fromentries": "^2.0.1", + "object.fromentries": "^2.0.2", "prop-types": "^15.7.2", - "semver": "^5.7.0" + "semver": "^5.7.1" }, "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } } } }, "enzyme-shallow-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz", - "integrity": "sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz", + "integrity": "sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==", "dev": true, "requires": { "has": "^1.0.3", - "object-is": "^1.0.1" + "object-is": "^1.0.2" } }, "errno": { @@ -5224,6 +7143,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", @@ -5256,9 +7204,9 @@ } }, "eslint": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", - "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5276,7 +7224,7 @@ "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -5289,7 +7237,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -5309,6 +7257,27 @@ "is-glob": "^4.0.1" } }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "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 + }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", @@ -5318,9 +7287,9 @@ } }, "eslint-config-prettier": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz", - "integrity": "sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", + "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -5334,39 +7303,46 @@ } } }, + "eslint-plugin-eslint-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz", + "integrity": "sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg==", + "dev": true + }, "eslint-plugin-jest": { - "version": "23.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.0.2.tgz", - "integrity": "sha512-fkxcvOJm0hC/jbJqYJjtuC9mvpTJqXd0Nixx7joVQvJoBQuXk/ws3+MtRYzD/4TcKSgvr21uuSLdwSxKJKC2cg==", + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.3.0.tgz", + "integrity": "sha512-GE6CR4ESJeu6Huw7vfZfaXHmX2R2kCFvf2X9OMcOxfP158yLKgLWz7PqLYTwRDACi84IhpmRxO8lK7GGwG05UQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" } }, "eslint-plugin-prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz", - "integrity": "sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", - "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.17.0.tgz", + "integrity": "sha512-ODB7yg6lxhBVMeiH1c7E95FLD4E/TwmFjltiU+ethv7KPdCwgiFuOZg9zNRHyufStTDLl/dEFqI2Q1VPmCd78A==", "dev": true, "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", + "eslint-plugin-eslint-plugin": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1", + "jsx-ast-utils": "^2.2.3", "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0", + "object.fromentries": "^2.0.1", "object.values": "^1.1.0", "prop-types": "^15.7.2", - "resolve": "^1.12.0" + "resolve": "^1.13.1" }, "dependencies": { "doctrine": { @@ -5377,9 +7353,24 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, + "eslint-plugin-react-hooks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz", + "integrity": "sha512-gLKCa52G4ee7uXzdLiorca7JIQZPPXRAQDXV83J4bUEeUuc5pIEyZYAZ45Xnxe5IuupxEqHS+hUhSLIimK1EMw==", + "dev": true + }, "eslint-scope": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", @@ -5659,6 +7650,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", @@ -5790,22 +7796,13 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fake-indexeddb": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-2.1.1.tgz", - "integrity": "sha512-di5PzbH6/gleD4qcpxT1IDtNNMTKuEs+C2KeJDP1e4mwP2L0UY+vPcTkCdIGq8IcaUUph6IkCrUZJvtpFUdhfg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-3.0.0.tgz", + "integrity": "sha512-VrnV9dJWlVWvd8hp9MMR+JS4RLC4ZmToSkuCg91ZwpYE5mSODb3n5VEaV62Hf3AusnbrPfwQhukU+rGZm5W8PQ==", "dev": true, "requires": { - "core-js": "^2.4.1", "realistic-structured-clone": "^2.0.1", "setimmediate": "^1.0.5" - }, - "dependencies": { - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", - "dev": true - } } }, "fast-deep-equal": { @@ -5863,9 +7860,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "promise": { "version": "7.3.1", @@ -6143,6 +8140,12 @@ "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -6760,6 +8763,31 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "function-bind": { @@ -6769,15 +8797,76 @@ "dev": true }, "function.prototype.name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", - "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", + "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1", - "functions-have-names": "^1.1.1", - "is-callable": "^1.1.4" + "es-abstract": "^1.17.0-next.1", + "functions-have-names": "^1.2.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "functional-red-black-tree": { @@ -7027,6 +9116,14 @@ } } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -7059,6 +9156,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "gridicons": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/gridicons/-/gridicons-3.3.1.tgz", @@ -7126,6 +9229,29 @@ "write-json-file": "^2.3.0" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -7241,9 +9367,25 @@ "dev": true }, "highlight.js": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.16.2.tgz", - "integrity": "sha512-feMUrVLZvjy0oC7FVJQcSQRqbBq9kwqnYE4+Kj9ZjbHh3g+BisiPgF49NyQbVLNdrL/qqZr3Ca9yOKwgn2i/tw==" + "version": "9.17.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.17.1.tgz", + "integrity": "sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw==", + "requires": { + "handlebars": "^4.5.3" + }, + "dependencies": { + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + } + } }, "hmac-drbg": { "version": "1.0.1", @@ -7257,9 +9399,9 @@ } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", "requires": { "react-is": "^16.7.0" } @@ -7292,9 +9434,9 @@ } }, "html-element-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.1.0.tgz", - "integrity": "sha512-iqiG3dTZmy+uUaTmHarTL+3/A2VW9ox/9uasKEZC+R/wAtUrTcRlXPSaPqsnWPfIu8wqn09jQNwMRqzL54jSYA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.2.0.tgz", + "integrity": "sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw==", "dev": true, "requires": { "array-filter": "^1.0.0" @@ -7477,6 +9619,167 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "husky": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.0.1.tgz", + "integrity": "sha512-x2wzNz3mra5rSYBPb9w59Bg3d5HnJZ+DBAALbMl/1K15Yv8zhcAxhrS792nMyjkxLsoPZtNpmnX+RqLtIKxpDQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "cosmiconfig": "^6.0.0", + "get-stdin": "^7.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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 + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true + }, + "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 + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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" + } + } + } + }, "hyphenate-style-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", @@ -7537,9 +9840,9 @@ } }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -7633,9 +9936,9 @@ "dev": true }, "inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", + "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -7647,7 +9950,7 @@ "lodash": "^4.17.15", "mute-stream": "0.0.8", "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "rxjs": "^6.5.3", "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" @@ -7700,9 +10003,9 @@ } }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7828,9 +10131,9 @@ } }, "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", "dev": true }, "is-buffer": { @@ -7988,9 +10291,9 @@ } }, "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", "dev": true }, "is-obj": { @@ -8082,9 +10385,9 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, "is-subset": { @@ -8192,6 +10495,14 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -8227,6 +10538,31 @@ "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "istanbul-reports": { @@ -8699,6 +11035,14 @@ "natural-compare": "^1.4.0", "pretty-format": "^24.9.0", "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "jest-util": { @@ -8936,9 +11280,9 @@ } }, "jss": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0.tgz", - "integrity": "sha512-TPpDFsiBjuERiL+dFDq8QCdiF9oDasPcNqCKLGCo/qED3fNYOQ8PX2lZhknyTiAt3tZrfOFbb0lbQ9lTjPZxsQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.3.tgz", + "integrity": "sha512-AcDvFdOk16If9qvC9KN3oFXsrkHWM9+TaPMpVB9orm3z+nq1Xw3ofHyflRe/mkSucRZnaQtlhZs1hdP3DR9uRw==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^2.6.5", @@ -8947,69 +11291,69 @@ } }, "jss-plugin-camel-case": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0.tgz", - "integrity": "sha512-yALDL00+pPR4FJh+k07A8FeDvfoPPuXU48HLy63enAubcVd3DnS+2rgqPXglHDGixIDVkCSXecl/l5GAMjzIbA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.3.tgz", + "integrity": "sha512-rild/oFKFkmRP7AoiX9D6bdDAUfmJv8c7sEBvFoi+JP31dn2W8nw4txMKGnV1LJKlFkYprdZt1X99Uvztl1hug==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-default-unit": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0.tgz", - "integrity": "sha512-sURozIOdCtGg9ap18erQ+ijndAfEGtTaetxfU3H4qwC18Bi+fdvjlY/ahKbuu0ASs7R/+WKCP7UaRZOjUDMcdQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.3.tgz", + "integrity": "sha512-n+XfVLPF9Qh7IOTdQ8M4oRpjpg6egjr/r0NNytubbCafMgCILJYIVrMTGgOTydH+uvak8onQY3f/F9hasPUx6g==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-global": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0.tgz", - "integrity": "sha512-80ofWKSQUo62bxLtRoTNe0kFPtHgUbAJeOeR36WEGgWIBEsXLyXOnD5KNnjPqG4heuEkz9eSLccjYST50JnI7Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.3.tgz", + "integrity": "sha512-kNotkAciJIXpIGYnmueaIifBne9rdq31O8Xq1nF7KMfKlskNRANTcEX5rVnsGKl2yubTMYfjKBFCeDgcQn6+gA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-nested": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0.tgz", - "integrity": "sha512-waxxwl/po1hN3azTyixKnr8ReEqUv5WK7WsO+5AWB0bFndML5Yqnt8ARZ90HEg8/P6WlqE/AB2413TkCRZE8bA==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.3.tgz", + "integrity": "sha512-OMucRs9YLvWlZ3Ew+VhdgNVMwSS2zZy/2vy+s/etvopnPUzDHgCnJwdY2Wx/SlhLGERJeKKufyih2seH+ui0iw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0", + "jss": "^10.0.3", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0.tgz", - "integrity": "sha512-41mf22CImjwNdtOG3r+cdC8+RhwNm616sjHx5YlqTwtSJLyLFinbQC/a4PIFk8xqf1qpFH1kEAIw+yx9HaqZ3g==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.3.tgz", + "integrity": "sha512-ufhvdCMnRcDa0tNHoZ12OcVNQQyE10yLMohxo/UIMarLV245rM6n9D19A12epjldRgyiS13SoSyLFCJEobprYg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-rule-value-function": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0.tgz", - "integrity": "sha512-Jw+BZ8JIw1f12V0SERqGlBT1JEPWax3vuZpMym54NAXpPb7R1LYHiCTIlaJUyqvIfEy3kiHMtgI+r2whGgRIxQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.3.tgz", + "integrity": "sha512-RWwIT2UBAIwf3f6DQtt5gyjxHMRJoeO9TQku+ueR8dBMakqSSe8vFwQNfjXEoe0W+Tez5HZCTkZKNMulv3Z+9A==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.0.0" + "jss": "^10.0.3" } }, "jss-plugin-vendor-prefixer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0.tgz", - "integrity": "sha512-qslqvL0MUbWuzXJWdUxpj6mdNUX8jr4FFTo3aZnAT65nmzWL7g8oTr9ZxmTXXgdp7ANhS1QWE7036/Q2isFBpw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.3.tgz", + "integrity": "sha512-zVs6e5z4tFRK/fJ5kuTLzXlTFQbLeFTVwk7lTZiYNufmZwKT0kSmnOJDUukcSe7JLGSRztjWhnHB/6voP174gw==", "requires": { "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.6", - "jss": "10.0.0" + "css-vendor": "^2.0.7", + "jss": "^10.0.3" } }, "jsx-ast-utils": { @@ -9074,6 +11418,15 @@ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==" }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -9111,10 +11464,11 @@ "immediate": "~3.0.5" } }, - "linear-layout-vector": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/linear-layout-vector/-/linear-layout-vector-0.0.1.tgz", - "integrity": "sha1-OYEU1zA7bsx/1rJzr3uEAdi6nHA=" + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true }, "load-json-file": { "version": "1.1.0", @@ -9188,6 +11542,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==", + "dev": true + }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", @@ -9497,9 +11857,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -9656,8 +12016,39 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9679,6 +12070,33 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } + } + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -9745,8 +12163,12 @@ "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "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", @@ -9828,6 +12250,15 @@ "path-is-absolute": "^1.0.0" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -9873,6 +12304,17 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -9915,12 +12357,20 @@ "dev": true }, "node-releases": { - "version": "1.1.40", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.40.tgz", - "integrity": "sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==", + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", + "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", "dev": true, "requires": { "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "node-sass": { @@ -10015,6 +12465,17 @@ "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "semver": { @@ -10120,6 +12581,12 @@ } } }, + "npm-install-package": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -10257,9 +12724,9 @@ "dev": true }, "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", "dev": true }, "object-keys": { @@ -10390,6 +12857,12 @@ } } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -10403,7 +12876,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -10790,6 +13262,15 @@ "find-up": "^3.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "plist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", @@ -10924,9 +13405,9 @@ } }, "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", "dev": true, "requires": { "postcss": "^7.0.6", @@ -10972,9 +13453,9 @@ "dev": true }, "prettier": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "prettier-linter-helpers": { @@ -11013,6 +13494,159 @@ "react-is": "^16.8.4" } }, + "pretty-quick": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-2.0.1.tgz", + "integrity": "sha512-y7bJt77XadjUr+P1uKqZxFWLddvj3SKY6EU4BuQtMxmmEFSMpbN132pUWdSG1g1mtUfO0noBvn7wBf0BVeomHg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "execa": "^2.1.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.4", + "multimatch": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "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": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "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" + } + } + } + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -11169,6 +13803,12 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -11292,9 +13932,9 @@ } }, "react": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", - "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -11340,23 +13980,34 @@ } }, "react-dom": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", - "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.17.0" + "scheduler": "^0.18.0" + }, + "dependencies": { + "scheduler": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-dropzone": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-10.1.10.tgz", - "integrity": "sha512-vcLBdkYo7wgZpw1o4cz7uk8/Mmm+sYHeiTfFSshA/EGthz/TjjrTOrKwvFHm3o1p1LPk+x+KbDDlw5OeIo6eYA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-10.2.1.tgz", + "integrity": "sha512-Me5nOu8hK9/Xyg5easpdfJ6SajwUquqYR/2YTdMotsCUgJ1pHIIwNsv0n+qcIno0tWR2V2rVQtj2r/hXYs2TnQ==", "requires": { - "attr-accept": "^1.1.3", - "file-selector": "^0.1.11", + "attr-accept": "^2.0.0", + "file-selector": "^0.1.12", "prop-types": "^15.7.2" } }, @@ -11402,9 +14053,9 @@ } }, "react-redux": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.1.tgz", - "integrity": "sha512-QsW0vcmVVdNQzEkrgzh2W3Ksvr8cqpAv5FhEk7tNEft+5pp7rXxAudTz3VOPawRkLIepItpkEIyLcN/VVXzjTg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.3.tgz", + "integrity": "sha512-uI1wca+ECG9RoVkWQFF4jDMqmaw0/qnvaSvOoL/GA4dNxf6LoV8sUAcNDvE5NWKs4hFpn0t6wswNQnY3f7HT3w==", "requires": { "@babel/runtime": "^7.5.5", "hoist-non-react-statics": "^3.3.0", @@ -11415,24 +14066,24 @@ } }, "react-tabs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.0.0.tgz", - "integrity": "sha512-z90cDIb+5V7MzjXFHq1VLxYiMH7dDQWan7mXSw6BWQtw+9pYAnq/fEDvsPaXNyevYitvLetdW87C61uu27JVMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.1.0.tgz", + "integrity": "sha512-9RKc77HCPsjQDVPyZEw37g3JPtg26oSQ9o4mtaVXjJuLedDX5+TQcE+MRNKR+4aO3GMAY4YslCePGG1//MQ3Jg==", "requires": { "classnames": "^2.2.0", "prop-types": "^15.5.0" } }, "react-test-renderer": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.11.0.tgz", - "integrity": "sha512-nh9gDl8R4ut+ZNNb2EeKO5VMvTKxwzurbSMuGBoKtjpjbg8JK/u3eVPVNi1h1Ue+eYK9oSzJjb+K3lzLxyA4ag==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", + "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", "react-is": "^16.8.6", - "scheduler": "^0.17.0" + "scheduler": "^0.18.0" } }, "react-transition-group": { @@ -11447,27 +14098,16 @@ } }, "react-virtualized": { - "version": "9.21.1", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.1.tgz", - "integrity": "sha512-E53vFjRRMCyUTEKuDLuGH1ld/9TFzjf/fFW816PE4HFXWZorESbSTYtiZz1oAjra0MminaUU1EnvUxoGuEFFPA==", + "version": "9.21.2", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.2.tgz", + "integrity": "sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA==", "requires": { "babel-runtime": "^6.26.0", "clsx": "^1.0.1", - "dom-helpers": "^2.4.0 || ^3.0.0", - "linear-layout-vector": "0.0.1", + "dom-helpers": "^5.0.0", "loose-envify": "^1.3.0", "prop-types": "^15.6.0", "react-lifecycles-compat": "^3.0.4" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - } } }, "read-config-file": { @@ -11613,9 +14253,9 @@ } }, "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -11684,18 +14324,81 @@ } }, "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { - "define-properties": "^1.1.2" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", "dev": true }, "regexpu-core": { @@ -11738,9 +14441,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", + "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11988,10 +14691,17 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "rgb2hex": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", + "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==", + "dev": true + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, "requires": { "glob": "^7.1.3" }, @@ -12000,6 +14710,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12061,6 +14772,21 @@ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", "dev": true }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, "rxjs": { "version": "5.5.12", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", @@ -12308,6 +15034,14 @@ "neo-async": "^2.6.1", "schema-utils": "^2.1.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "sax": { @@ -12316,9 +15050,10 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "scheduler": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", - "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -12355,6 +15090,11 @@ } } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -12371,9 +15111,15 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true }, "semver-diff": { "version": "2.1.0", @@ -12445,9 +15191,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "serve-index": { @@ -12611,13 +15357,13 @@ "dev": true }, "simperium": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/simperium/-/simperium-1.0.2.tgz", - "integrity": "sha512-FL0MmEfbGKXC+77Dye+5d1VwgdeBRatnS9n12uW14Q70sks7sPX/XwsEjEzoJ0QXK7hCW0Nf5Ewg+F4UOmaPeA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/simperium/-/simperium-1.0.3.tgz", + "integrity": "sha512-EA4PTNJxinmLJmjABYZNnLEmVFCLVNhqoEjbIV7nKURYQFi5wiZFBr9OHIy3un/RC4R5MhrTCxRM0OH6uf2omA==", "requires": { - "@babel/polyfill": "^7.6.0", + "@babel/polyfill": "7.7.0", "uuid": "3.3.3", - "websocket": "1.0.30" + "websocket": "1.0.31" } }, "single-line-log": { @@ -13008,6 +15754,30 @@ } } }, + "spectron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/spectron/-/spectron-6.0.0.tgz", + "integrity": "sha512-YQnQgdlpdPU572YhyX1hcDT40Q+5D0hkH4hM3jYy8HLHU1+6z4WTRQkjYdCBcYHE/3fHIQdPeaI+9DUzupQZtw==", + "dev": true, + "requires": { + "dev-null": "^0.1.1", + "electron-chromedriver": "~4.0.0", + "request": "^2.87.0", + "split": "^1.0.0", + "webdriverio": "^4.13.0" + }, + "dependencies": { + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + } + } + }, "speedometer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", @@ -13148,9 +15918,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "strict-uri-encode": { @@ -13207,14 +15977,76 @@ } }, "string.prototype.trim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", - "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", + "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "string.prototype.trimleft": { @@ -13268,6 +16100,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "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", @@ -13284,9 +16122,9 @@ "dev": true }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.2.tgz", + "integrity": "sha512-0Mpq1ZHFDCNq1F+6avNBgv+7q8V+mWRuzehxyJT+aKgzyN/yfKTwjYqaYwBgx+11UpQxL21zNQfzzlz+JcGURw==", "dev": true, "requires": { "loader-utils": "^1.2.3", @@ -13373,6 +16211,29 @@ } } }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, "temp-file": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", @@ -13427,9 +16288,9 @@ } }, "terser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", - "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", + "integrity": "sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ==", "dev": true, "requires": { "commander": "^2.20.0", @@ -13438,16 +16299,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "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", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -13630,6 +16491,11 @@ "setimmediate": "^1.0.4" } }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -13656,6 +16522,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -13819,6 +16691,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-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -13828,9 +16705,9 @@ } }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { @@ -13857,6 +16734,12 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz", + "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==", + "dev": true + }, "typeson": { "version": "5.13.0", "resolved": "https://registry.npmjs.org/typeson/-/typeson-5.13.0.tgz", @@ -13896,7 +16779,6 @@ "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, "requires": { "commander": "~2.19.0", "source-map": "~0.6.1" @@ -13905,8 +16787,7 @@ "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" } } }, @@ -14326,15 +17207,173 @@ "defaults": "^1.0.3" } }, + "wdio-dot-reporter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==", + "dev": true + }, + "webdriverio": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.4.tgz", + "integrity": "sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA==", + "dev": true, + "requires": { + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", + "css-value": "~0.0.1", + "deepmerge": "~2.0.1", + "ejs": "~2.5.6", + "gaze": "~1.1.2", + "glob": "~7.1.1", + "grapheme-splitter": "^1.0.2", + "inquirer": "~3.3.0", + "json-stringify-safe": "~5.0.1", + "mkdirp": "~0.5.1", + "npm-install-package": "~2.1.0", + "optimist": "~0.6.1", + "q": "~1.5.0", + "request": "^2.83.0", + "rgb2hex": "^0.1.9", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", + "url": "~0.11.0", + "wdio-dot-reporter": "~0.0.8", + "wgxpath": "~1.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": 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-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -14357,15 +17396,15 @@ "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "dev": true }, "eslint-scope": { @@ -14481,9 +17520,9 @@ } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", + "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -14501,7 +17540,7 @@ "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.4", + "loglevel": "^1.6.6", "opn": "^5.5.0", "p-retry": "^3.0.1", "portfinder": "^1.0.25", @@ -14578,6 +17617,12 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -14717,11 +17762,12 @@ } }, "websocket": { - "version": "1.0.30", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.30.tgz", - "integrity": "sha512-aO6klgaTdSMkhfl5VVJzD5fm+Srhh5jLYbS15+OiI1sN6h/RU/XW6WN9J1uVIpUKNmsTvT3Hs35XAFjn9NMfOw==", + "version": "1.0.31", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.31.tgz", + "integrity": "sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ==", "requires": { "debug": "^2.2.0", + "es5-ext": "^0.10.50", "nan": "^2.14.0", "typedarray-to-buffer": "^3.1.5", "yaeti": "^0.0.6" @@ -14754,6 +17800,12 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, + "wgxpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", + "dev": true + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -14796,6 +17848,12 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -14876,8 +17934,7 @@ "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, "worker-farm": { "version": "1.7.0", @@ -15022,6 +18079,15 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, + "yaml": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", + "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.3" + } + }, "yargs": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", @@ -15057,6 +18123,18 @@ "requires": { "fd-slicer": "~1.0.1" } + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } } } } diff --git a/package.json b/package.json index 386fe6b9a..e63c2f667 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,14 @@ "email": "support@simplenote.com" }, "productName": "Simplenote", - "version": "1.12.0", + "version": "1.14.0", "main": "desktop/index.js", "license": "GPL-2.0", "homepage": "https://simplenote.com", "scripts": { "dev": "make dev", "start": "make start NODE_ENV=development", + "test-e2e": "npx jest --config=./jest.config.e2e.js", "test": "make test", "lint": "make lint", "format": "make format", @@ -36,61 +37,93 @@ "singleQuote": true, "trailingComma": "es5" }, + "husky": { + "hooks": { + "pre-commit": "pretty-quick --staged" + } + }, "devDependencies": { "@adlk/misty": "0.2.0", - "@babel/core": "7.6.4", - "@babel/plugin-proposal-class-properties": "7.5.5", - "@babel/plugin-proposal-object-rest-spread": "7.6.2", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/preset-env": "7.6.3", - "@babel/preset-react": "7.6.3", - "autoprefixer": "9.7.1", + "@babel/core": "7.7.7", + "@babel/plugin-proposal-class-properties": "7.7.4", + "@babel/plugin-proposal-object-rest-spread": "7.7.7", + "@babel/plugin-syntax-dynamic-import": "7.7.4", + "@babel/preset-env": "7.7.7", + "@babel/preset-react": "7.7.4", + "@babel/preset-typescript": "7.7.7", + "@types/classnames": "2.2.9", + "@types/cookie": "0.3.3", + "@types/debug": "4.1.5", + "@types/electron": "1.6.10", + "@types/jest": "24.0.25", + "@types/lodash": "4.14.149", + "@types/react": "16.9.17", + "@types/react-addons-update": "0.14.20", + "@types/react-dom": "16.9.4", + "@types/react-modal": "3.10.1", + "@types/react-onclickoutside": "6.7.3", + "@types/react-redux": "7.1.5", + "@types/redux": "3.6.0", + "@types/redux-localstorage": "1.0.8", + "@types/rimraf": "2.0.3", + "@types/webdriverio": "4.13.3", + "@typescript-eslint/eslint-plugin": "2.15.0", + "@typescript-eslint/parser": "2.15.0", + "autoprefixer": "9.7.3", "babel-eslint": "10.0.3", + "babel-jest": "24.9.0", "babel-loader": "8.0.6", "babel-plugin-dynamic-import-node": "2.3.0", "babel-plugin-lodash": "3.3.4", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "classnames": "2.2.6", - "concurrently": "5.0.0", - "css-loader": "3.2.0", + "concurrently": "5.0.2", + "css-loader": "3.4.1", "debug": "4.1.1", "electron": "4.2.11", "electron-builder": "20.32.0", "electron-notarize": "0.1.1", "electron-rebuild": "1.8.6", - "enzyme": "3.10.0", - "enzyme-adapter-react-16": "1.15.1", - "eslint": "6.6.0", - "eslint-config-prettier": "6.5.0", - "eslint-plugin-jest": "23.0.2", - "eslint-plugin-prettier": "3.1.1", - "eslint-plugin-react": "7.16.0", - "fake-indexeddb": "2.1.1", + "enzyme": "3.11.0", + "enzyme-adapter-react-16": "1.15.2", + "eslint": "6.8.0", + "eslint-config-prettier": "6.9.0", + "eslint-plugin-jest": "23.3.0", + "eslint-plugin-prettier": "3.1.2", + "eslint-plugin-react": "7.17.0", + "eslint-plugin-react-hooks": "2.3.0", + "fake-indexeddb": "3.0.0", "hard-source-webpack-plugin": "0.13.1", "html-webpack-plugin": "3.2.0", + "husky": "4.0.1", "jest": "24.9.0", "jest-localstorage-mock": "2.4.0", - "mini-css-extract-plugin": "0.8.0", + "mini-css-extract-plugin": "0.9.0", "node-sass": "4.13.0", "postcss-loader": "3.0.0", - "prettier": "1.18.2", + "prettier": "1.19.1", + "pretty-quick": "2.0.1", "react-onclickoutside": "6.9.0", - "react-test-renderer": "16.11.0", + "react-test-renderer": "16.12.0", + "rimraf": "3.0.0", "sass-loader": "8.0.0", - "style-loader": "1.0.0", + "spectron": "6.0.0", + "style-loader": "1.1.2", + "typescript": "3.7.4", "wait-on": "3.3.0", - "webpack": "4.41.2", + "webpack": "4.41.5", "webpack-cli": "3.3.10", - "webpack-dev-server": "3.9.0" + "webpack-dev-server": "3.10.1" }, "dependencies": { "@automattic/color-studio": "2.2.0", - "@material-ui/core": "4.5.2", + "@material-ui/core": "4.8.3", "bottleneck": "2.19.5", + "clipboard": "2.0.4", "cookie": "0.4.0", - "core-js": "3.3.6", - "date-fns": "2.6.0", - "draft-js": "0.11.2", + "core-js": "3.6.2", + "date-fns": "2.9.0", + "draft-js": "0.11.4", "draft-js-multidecorators": "1.0.0", "draft-js-simpledecorator": "1.0.2", "electron-fetch": "1.3.0", @@ -101,7 +134,7 @@ "file-saver": "2.0.2", "focus-visible": "5.0.2", "gridicons": "3.3.1", - "highlight.js": "9.16.2", + "highlight.js": "9.17.1", "isemail": "3.2.0", "js-yaml": "3.13.1", "jszip": "3.2.2", @@ -111,26 +144,26 @@ "promise": "8.0.3", "prop-types": "15.7.2", "randombytes": "2.1.0", - "react": "16.11.0", + "react": "16.12.0", "react-addons-update": "15.6.2", - "react-dom": "16.11.0", - "react-dropzone": "10.1.10", + "react-dom": "16.12.0", + "react-dropzone": "10.2.1", "react-modal": "3.11.1", "react-overlays": "2.1.0", - "react-redux": "7.1.1", - "react-tabs": "3.0.0", + "react-redux": "7.1.3", + "react-tabs": "3.1.0", "react-transition-group": "4.3.0", - "react-virtualized": "9.21.1", - "redux": "4.0.4", + "react-virtualized": "9.21.2", + "redux": "4.0.5", "redux-localstorage": "0.4.1", "redux-thunk": "2.3.0", "regenerator-runtime": "0.13.3", "remove-markdown": "0.3.0", "sanitize-filename": "1.6.3", "sax": "1.2.4", - "semver": "6.3.0", + "semver": "7.1.1", "showdown": "1.9.1", - "simperium": "1.0.2", + "simperium": "1.0.3", "string-replace-to-array": "1.0.3", "turndown": "5.0.3", "unorm": "1.6.0", diff --git a/renovate.json b/renovate.json deleted file mode 100644 index f45d8f110..000000000 --- a/renovate.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "config:base" - ] -} diff --git a/scss/_components.scss b/scss/_components.scss index 1680351a8..272ba6145 100644 --- a/scss/_components.scss +++ b/scss/_components.scss @@ -40,3 +40,4 @@ @import 'tag-field/style'; @import 'tag-input/style'; @import 'tag-list/style'; +@import 'tag-suggestions/style'; diff --git a/scss/_general.scss b/scss/_general.scss index 51e598efb..7aed721c3 100644 --- a/scss/_general.scss +++ b/scss/_general.scss @@ -98,10 +98,6 @@ optgroup { .search-field { -webkit-app-region: no-drag; } - - .revision-selector { - -webkit-app-region: drag; - } } .login__draggable-area { diff --git a/scss/theme.scss b/scss/theme.scss index cda314ea2..6cb95e9fd 100644 --- a/scss/theme.scss +++ b/scss/theme.scss @@ -101,6 +101,11 @@ } } + .note-list-header { + color: $studio-gray-30; + background-color: rgba(50, 52, 54, 0.5); + } + .note-list-item { &.note-list-item-pinned .note-list-item-pinner { background: $studio-white; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..16dc89d8b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "allowJs": true, + "jsx": "react", + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "isolatedModules": true, + "esModuleInterop": true + }, + "include": ["lib/**/*"] +} diff --git a/webpack.config.js b/webpack.config.js index e2d7fddde..c4f8912ab 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -28,7 +28,7 @@ module.exports = () => { module: { rules: [ { - test: /\.jsx?$/, + test: /\.[jt]sx?$/, exclude: /node_modules\/core-js/, use: [ { @@ -67,7 +67,7 @@ module.exports = () => { ], }, resolve: { - extensions: ['.js', '.jsx', '.json', '.scss', '.css'], + extensions: ['.js', '.jsx', '.json', '.scss', '.css', '.ts', '.tsx'], modules: ['node_modules'], }, plugins: [